# Changelog All notable changes to this project are documented in this file. Format loosely follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). ## [1.1.0] - 2026-07-22 ### Added - **In-app notifications** — a bell in the top bar backed by Laravel's database notification channel, alongside existing e-mail notifications (same per-trigger toggle drives both; ticket links now correctly point into the recipient's own area instead of always linking to the client view). - **Drag-and-drop attachments** on every upload form (ticket creation, replies, internal notes), plus inline image thumbnails in the message thread instead of a plain download link. - **Customer satisfaction (CSAT)** rating — clients rate a closed ticket 1–5 stars with an optional comment; shown read-only to operators, surfaced as a KPI on the stats dashboard, and linked from the "ticket closed" e-mail. - **Saved queue views** — operators can save/apply/delete named filter+sort+ column presets in the ticket queue and mark one as their default. - **Full-text search** — MySQL/MariaDB `FULLTEXT` search (portable `LIKE` fallback on sqlite) across ticket subject/body and reply message bodies, now also available on the client's own ticket list (previously operator-only, and previously subject/number/name/email only). - **Stats CSV export** — exports the currently filtered ticket set from the operator stats dashboard. - **BookStack knowledge-base integration**, optional and off by default — suggests relevant articles by category/subcategory while creating a ticket, and in a separate sidebar on an existing ticket for operators (with a copy-link button). Configurable from Admin > Konfiguracja: connection + API token (encrypted), optional SSL-verification bypass for self-signed instances, page/book search-type filter, and two independent per-shelf allow-lists (nothing is ever searched until specific shelves are opted in, separately for ticket-creation suggestions vs. the operator sidebar) with a manual refresh button for the shelf list. ### Changed - Closed tickets are no longer shown in the "Moje zgłoszenia" / "Nieprzypisane" / per-team queue tabs — they now only ever appear under "Zamknięte", matching how the "Otwarte" tab already worked. - The operator ticket-view sidebar is ~50% wider (to fit the BookStack suggestions panel); the page itself grew to match, so the ticket content/thread column keeps its previous width. - The "Resetuj" work-timer button sits below the "Zgłoszenie zamknięte — zliczanie wstrzymane" notice instead of beside it. ### Fixed - `TicketService::setStatus()` now checks a status's `stage` (via `Status::stageFor()`) rather than the literal key `'closed'` to decide whether to fire the "ticket closed" notification/stop the timer — correct even if an admin renames or replaces which key maps to the closed stage. ## [1.0.2] - 2026-07-22 - Fixed `.gitea/workflows/build.yml`: registry login was failing with `unauthorized` because Gitea's auto-injected `secrets.GITHUB_TOKEN` isn't granted push access to its own container registry on this instance. Now uses a dedicated `REGISTRY_TOKEN` secret (a Gitea access token with `write:package`/`read:package` scope), and the workflow fails fast with a clear `::error::` message before attempting login if that secret isn't configured, instead of surfacing Docker's opaque `unauthorized` error. - Fixed: opening or manually resuming a **closed** ticket no longer starts its work timer, and closing a ticket (via the status dropdown, a reply "quick action" transition, the REST API, or merge) now checkpoints and stops any running timer. Time tracking only ever accrues while a ticket is open. - Fixed: the login form accepted an empty username/password, submitting them straight to the auth provider. The form fields are now `required` (blocks submission client-side) and `Login::submit()` also rejects blank/ whitespace-only credentials server-side before attempting authentication, showing "Podaj nazwę użytkownika i hasło." instead. - Fixed: closing a ticket sent two separate notification e-mails (`status_changed` and `ticket_closed`) for the same event. Closing now only fires `ticket_closed`; every other status transition still fires `status_changed` as before. ## [1.0.1] - 2026-07-22 Documentation and deployment/CI overhaul — no application behavior changes. - Added project docs: `TESTING.md`, `CONTRIBUTING.md`, `ARCHITECTURE.md`, `SECURITY.md`, `CLAUDE.md`; removed the unmaintained stock Laravel `src/README.md`. - Added `.gitea/workflows/build.yml`: Gitea Actions now builds and pushes the `servicedesk` image to the Gitea container registry whenever `Dockerfile` changes on `main`. - `compose.yaml` now pulls `image: gitea.kzbikowski.pl/kzbkowski/servicedesk:${IMAGE_TAG:-latest}` instead of building locally; `mariadb` pinned to `mariadb:12.3`; added a `mariadb` healthcheck and `depends_on: condition: service_healthy` for `servicedesk`. - Added tracked templates `compose.yaml.example` and `.env.example` (root) for the previously-untracked `compose.yaml`/`.env`. - Documented the new pull-based deploy flow and one-time registry login in `install.md`. ## [1.0.0] - 2026-07-21 Initial release. - Ticketing core: categories/subcategories with per-subcategory custom fields, statuses, priorities, teams, attachments, message threads (public replies + internal notes), history log, merge/delete. - SLA rules per priority with a scheduled breach check (`tickets:check-sla-breaches`, every 15 minutes). - Response templates, quick actions, and per-event HTML email templates/ notification toggles. - Operator statistics dashboard (`/operator/stats`) with KPI tiles and breakdowns. - Branding/config panel: company identity, LDAP connection + user sync, SMTP, attachment limits, session lifetime, timezone. - LDAP authentication (LdapRecord) with local-account fallback. - REST API (`/api/v1/...`) via Sanctum, ability-scoped (`tickets:read`, `tickets:write`, `dictionaries:read`, `users:read`), with Swagger docs at `/admin/api-docs`. - Installable PWA manifest/icons for the client-facing area.