fixed
This commit is contained in:
@@ -14,6 +14,7 @@ use Illuminate\Support\Facades\DB;
|
|||||||
use Illuminate\Support\Facades\Schema;
|
use Illuminate\Support\Facades\Schema;
|
||||||
use Illuminate\Support\Str;
|
use Illuminate\Support\Str;
|
||||||
use Illuminate\Validation\Rule;
|
use Illuminate\Validation\Rule;
|
||||||
|
use Livewire\Attributes\On;
|
||||||
use Livewire\Attributes\Validate;
|
use Livewire\Attributes\Validate;
|
||||||
use Livewire\Component;
|
use Livewire\Component;
|
||||||
use Livewire\Features\SupportFileUploads\TemporaryUploadedFile;
|
use Livewire\Features\SupportFileUploads\TemporaryUploadedFile;
|
||||||
@@ -119,6 +120,16 @@ final class TicketShow extends Component
|
|||||||
$this->dispatch('helpdesk-reply-added');
|
$this->dispatch('helpdesk-reply-added');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Refresh ticket aggregates and the time-log modal after the timer component starts or stops.
|
||||||
|
*/
|
||||||
|
#[On('helpdesk-ticket-time-log-updated')]
|
||||||
|
public function refreshAfterTimeLogUpdate(): void
|
||||||
|
{
|
||||||
|
$this->ticket = $this->freshTicket($this->ticket);
|
||||||
|
}
|
||||||
|
|
||||||
public function applyCannedResponse(CannedResponseRenderer $renderer): void
|
public function applyCannedResponse(CannedResponseRenderer $renderer): void
|
||||||
{
|
{
|
||||||
$this->authorize('comment', $this->ticket);
|
$this->authorize('comment', $this->ticket);
|
||||||
|
|||||||
@@ -83,6 +83,7 @@ class TicketTimer extends Component
|
|||||||
$this->message = 'Timer started.';
|
$this->message = 'Timer started.';
|
||||||
|
|
||||||
$this->dispatch('timer-started');
|
$this->dispatch('timer-started');
|
||||||
|
$this->dispatch('helpdesk-ticket-time-log-updated');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -129,6 +130,7 @@ class TicketTimer extends Component
|
|||||||
$this->message = 'Timer ended and time was added to the ticket.';
|
$this->message = 'Timer ended and time was added to the ticket.';
|
||||||
|
|
||||||
$this->dispatch('timer-ended');
|
$this->dispatch('timer-ended');
|
||||||
|
$this->dispatch('helpdesk-ticket-time-log-updated');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -319,3 +319,14 @@ The create-ticket **Clear** action must only clear transient user-entered conten
|
|||||||
It must preserve configured routing defaults such as company, board, priority, category, project, team and due-date defaults.
|
It must preserve configured routing defaults such as company, board, priority, category, project, team and due-date defaults.
|
||||||
|
|
||||||
When a user selects a closed ticket status, the professional closure modal must open on the first interaction. A closure comment remains mandatory, and the user can choose whether the closure comment is public or internal.
|
When a user selects a closed ticket status, the professional closure modal must open on the first interaction. A closure comment remains mandatory, and the user can choose whether the closure comment is public or internal.
|
||||||
|
|
||||||
|
## Spellcheck and Rich Editor
|
||||||
|
|
||||||
|
The Helpdesk rich editor keeps its HTML controls for formatting, lists, links, quotes and pasted content. Browser-native spellcheck is enabled on the editable area, but the module deliberately does not ship a fake inline spellchecker because replacing the editor with a textarea removes the toolbar and breaks the workflow.
|
||||||
|
|
||||||
|
If a full inline spelling engine is required later, add it as a deliberate editor plugin integration with regression tests for formatting, Livewire body sync, ticket create, reply, clear, close modal, and attachment handling. Do not replace the rich editor with a plain textarea.
|
||||||
|
|
||||||
|
## Timer Log Refresh
|
||||||
|
|
||||||
|
The ticket timer dispatches `helpdesk-ticket-time-log-updated` after start and stop. The ticket detail Livewire component listens for that event and refreshes ticket aggregates so the time summary and log modal update without a page reload.
|
||||||
|
|
||||||
|
|||||||
@@ -66,13 +66,18 @@
|
|||||||
class="rounded-lg px-2 py-1 text-sm hover:bg-zinc-200 dark:hover:bg-zinc-800">Clear</button>
|
class="rounded-lg px-2 py-1 text-sm hover:bg-zinc-200 dark:hover:bg-zinc-800">Clear</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div x-ref="editor" contenteditable="true" spellcheck="true" lang="en-GB" autocorrect="on" autocomplete="on"
|
<div x-ref="editor" contenteditable="true" spellcheck="true" lang="en-GB" autocapitalize="sentences" autocorrect="on" autocomplete="on" inputmode="text"
|
||||||
@if ($editorDusk) data-dusk="{{ $editorDusk }}" dusk="{{ $editorDusk }}" @endif
|
@if ($editorDusk) data-dusk="{{ $editorDusk }}" dusk="{{ $editorDusk }}" @endif
|
||||||
x-on:input.debounce.150ms="sync" x-on:keyup="sync" x-on:paste="$nextTick(() => sync())" x-on:blur="sync"
|
x-on:input.debounce.150ms="sync" x-on:keyup="sync" x-on:paste="$nextTick(() => sync())" x-on:blur="sync"
|
||||||
class="prose prose-sm min-h-[{{ (int) $rows * 28 }}px] max-w-none bg-white p-4 text-sm text-zinc-900 outline-none dark:prose-invert dark:bg-zinc-950 dark:text-zinc-100"
|
class="prose prose-sm min-h-[{{ (int) $rows * 28 }}px] max-w-none bg-white p-4 text-sm text-zinc-900 outline-none dark:prose-invert dark:bg-zinc-950 dark:text-zinc-100"
|
||||||
data-placeholder="{{ $placeholder }}"></div>
|
data-placeholder="{{ $placeholder }}"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<p class="text-xs font-semibold text-zinc-500 dark:text-zinc-400">
|
||||||
|
Browser spellcheck is enabled for this rich editor. Use your browser or operating-system spelling menu for suggestions.
|
||||||
|
</p>
|
||||||
|
|
||||||
@if ($model)
|
@if ($model)
|
||||||
@error($model)
|
@error($model)
|
||||||
<div class="text-sm text-red-600">{{ $message }}</div>
|
<div class="text-sm text-red-600">{{ $message }}</div>
|
||||||
|
|||||||
@@ -184,3 +184,10 @@
|
|||||||
- Fixed close-ticket modal so selecting a closed status opens the professional closure prompt on the first interaction.
|
- Fixed close-ticket modal so selecting a closed status opens the professional closure prompt on the first interaction.
|
||||||
- Preserved the mandatory closure comment workflow and public/internal closure visibility behaviour.
|
- Preserved the mandatory closure comment workflow and public/internal closure visibility behaviour.
|
||||||
- Added regression coverage notes for rich editor, clear defaults and close-modal workflow.
|
- Added regression coverage notes for rich editor, clear defaults and close-modal workflow.
|
||||||
|
- version: 1.9.47
|
||||||
|
date: 2026-06-23
|
||||||
|
changes:
|
||||||
|
- Preserved the rich HTML editor controls while keeping browser-native spellcheck enabled.
|
||||||
|
- Documented that fake inline spellcheck must not replace the rich editor.
|
||||||
|
- Refreshed ticket time aggregates and the time-log modal after timer start and stop without requiring a page reload.
|
||||||
|
- Added regression coverage for timer refresh and spellcheck/editor boundary behaviour.
|
||||||
|
|||||||
@@ -22,5 +22,5 @@
|
|||||||
"Modules\\Helpdesk\\Providers\\HelpdeskServiceProvider"
|
"Modules\\Helpdesk\\Providers\\HelpdeskServiceProvider"
|
||||||
],
|
],
|
||||||
"files": [],
|
"files": [],
|
||||||
"version": "1.9.46"
|
"version": "1.9.47"
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user