Repository navigation
Form Fields Design
Status: proposal - nothing built yet. This page sets out what I plan to build for issue #218, and why. It was written before any code so the approach can be checked first. @Dr4inder - please read it and say on the issue whether it matches what you asked for, especially the questions at the end. Nothing is built until you have.
The request, from issue #218 (raised by @Dr4inder):
"A small internal service desk may not need every field offered by the ticket and task forms. Even when the underlying modules remain useful, unnecessary selectors make routine work harder to scan."
The issue asks for three things, in the post and two follow-up comments. I have added a fourth, which the maintainer suggested while reading it.
| Part | What it does | Size |
|---|---|---|
| A. Built-in fields (the post) | Hide the ticket Department field, or fill it in from a default. Ask for the ticket Company only when the answer is not obvious. One Use external contractors switch hides the task's Contractor and Contact there pair | Large |
| B. Calmer task Work view (comment 1) | Checklists, Forms and Follow-ups with nothing in them shrink to a heading such as Checklists (0), and open with one click | Small |
| C. Portal questions in the main form (comment 2) | On the portal's New ticket page, the custom field questions move out of the side panel and into the main form, between the subject and the description | Small |
| D. Custom fields for chosen departments (addition) | A custom field can be limited to some departments, the same way it can already be limited to some ticket types - so HR tickets ask HR questions and Finance tickets ask Finance ones | Medium |
Each part is useful on its own and ships on its own. I suggest B and C first (small and well defined), then A, then D.
Three rules run through all four parts:
- Nothing changes on upgrade. Every new switch starts where today's behaviour is. An administrator opts in.
- Hiding is presentation, never deletion. A hidden field keeps its value. Saving an unrelated change never clears it. Switching it back on shows it again, exactly as it was.
- Hiding is not access control. Permissions, company boundaries and the REST API stay as they are.
The risk with "configurable form fields" is a general form builder bolted beside the existing settings, which then disagrees with them. This design avoids that by only adding switches where FreeITSM already has the matching machinery:
-
Per-company settings already exist.
tenantSetting()(inincludes/tenant_settings.php) answers "what does this company say, or else what does the install say". The category, category-at-close and resolution-code switches on Tickets -> Settings -> Categories already use it, with a per-company table of Follow default / On / Off. Part A copies that screen and that storage. - Hidden fields are already handled at closure. The Mandatory fields rule already skips a field the ticket cannot show (category, resolution code, team). Part A adds Department to that list.
-
Saves are already patch-style. Saving a ticket or a task only writes the fields the request sends (
TicketsService::updateTicket(),TasksService::saveTask()), so a hidden control cannot null its value by being absent. Rule 2 holds by construction, and the tests will prove it. - Custom fields can already be limited to ticket types. Part D adds departments as a second, identical limit.
So this is four small extensions of existing parts, not a new system.
- Tickets -> Settings -> Fields - the existing Custom fields tab, renamed, with a new Built-in fields panel above the custom field list. One place for "what this form asks".
- Tasks -> Settings -> General - the Use external contractors switch.
Both use the install-wide default + per-company override pattern from the Categories tab: a default row of switches, then a table with one row per company (Follow default / On / Off). On a single-company install the table is not shown, so it is just a switch.
Settings, per company:
| Setting | Choices | Default |
|---|---|---|
| Show the Department field | On / Off | On |
| Department for new tickets | None / any active department | None |
Where "Off" hides it. Every place the field appears, so no gap is left:
- the New ticket form;
- the ticket panel, the ticket workspace and the collapsed header's Dept line;
- the right-click Department menu, the bulk Department button and drag-and-drop onto a department folder;
- the Department column in the ticket table's column picker;
- the phone view, which shares the same code.
A ticket that already has a department keeps it. The value stays in the database, in reports, in the email merge field [department_name], in workflow conditions and in history.
What a department still does while hidden. This is the important part, and the reason Department needs more care than the other fields:
| Department drives | With the field hidden |
|---|---|
| Which tickets each team sees | Unchanged. A ticket with no department is visible to every team, as today - hiding the field only means more tickets have none |
| SLA notification rules per department | Unchanged. A ticket with no department matches only the default rules, as today |
| Notify department teams | A ticket with no department notifies no department teams, as today |
| Confidential departments | Unchanged. A workflow or the default department can still put a ticket in one |
Workflows (set_ticket_department, conditions) |
Unchanged. A workflow may still set or test the department |
So the honest summary on the settings screen is: "Hiding Department only removes the field from the screen. Tickets with no department are seen by every team. To keep team visibility working, choose a department for new tickets, or let a workflow set it."
The default department. Applied once, when a ticket is created with no department, on every channel that can create one: the New ticket form, the portal, email, chat, the REST API, and catalogue approvals. It is never applied to existing tickets, and never on edit. A department set by the request itself, or by a workflow that runs after creation, wins. (Today email and portal tickets are always created with no department, so this is the only way to give them one without a workflow.)
Checks when saving the setting:
- The default must be an active department. Deactivating or deleting a department that is someone's default is warned about on the Departments tab, and the default is cleared, never left pointing at nothing.
- If Mandatory fields requires Department at closure and the field is hidden with no default, the save is allowed but the panel says so plainly: "Department is required at closure, but hidden for Acme with no default. The closure rule will skip Department for Acme's tickets." That matches how hidden categories already behave, rather than letting a hidden field trap every ticket.
Mandatory fields. MandatoryFieldsService::fieldAvailable() gains a Department case: the field counts as available only when it is shown for the ticket's company. Today Department falls through to "always available", which would trap tickets the moment the field could be hidden.
FreeITSM already gets most of this right. The Company row on New ticket appears only in the all-companies view, when the analyst can reach more than one company. Inside one company it is never asked. I propose no new setting, and instead fixing three gaps found while reading the code:
- The server does not enforce the choice. In the all-companies view, a create request with no company falls back to the session's company, or the first one the analyst can reach. Only the browser stops that. The server will refuse it: "Choose which company this ticket is for." This is the request's "never silently choose the first company".
- One reachable company is not ambiguous. An analyst in the all-companies view who can reach just one company is not asked, and the ticket goes to that company. The server will make that explicit, rather than relying on the same fallback.
- The mailbox list follows the wrong company. It loads for the active company, not the one chosen on the form. It will follow the chosen one.
An optional preference (see question 3): My company for new tickets, under System -> Preferences. In the all-companies view it pre-selects that company, and the row stays visible so you can see where the ticket is going. I would rather pre-select than hide, because a wrong company is a data-protection mistake that is easy to make and hard to notice.
Setting: Use external contractors, Tasks -> Settings -> General, per company, default On.
When off:
- The Contractor and Contact there pair disappears from the task panel, together and with no gap. The assigned analyst stays.
- The same applies to the task opened inside a ticket and on a phone, which share the same code.
- The sidebar Contractor filter is hidden.
- A task that already has a contractor still shows it, read-only, with a note: "Contractors are switched off. This one stays recorded." Hiding it completely would leave a value nobody can see but which still counts, for example in the board chip or in Projects. Saving anything else on the task never touches it. See question 4.
Not changed:
- Projects. A contractor can be a project member, and the AI assistant can assign one. That is a Projects feature and stays as it is.
- The REST API. It still reads and writes contractors. As the request says, a UI tidiness setting is not an API restriction.
- Module availability (#217). This is not a #217 feature switch, because nothing is refused - only hidden. Switching the Contracts module off already removes contractor choosing entirely, since contractors are Contracts suppliers.
| # | Criterion | How |
|---|---|---|
| 1 | Configurable without disabling a module | Department and contractor switches, per company |
| 2 | Company omitted only when safely determined | Already true in a single company. All-companies is enforced on the server (2.3) |
| 3 | Department omitted without hidden-required failures or routing changes | The Mandatory fields case, the save warning, and routing unchanged (2.2) |
| 4 | One contractor switch, assignee stays | 2.4 |
| 5 | Hidden values survive edits and re-enabling | Patch-style saves, proved by tests |
| 6 | Consistent everywhere, no gaps | The lists in 2.2 and 2.4 |
| 7 | Permissions kept; invalid defaults explained | Inactive or deleted defaults refused and warned about; mandatory conflict stated |
| 8 | Verification | Section 7 |
When a task's Work view opens, each of Checklists, Forms and Follow-ups is drawn in one of three states:
| State | Shown as |
|---|---|
| Loading | The heading with a small spinner. Never "(0)" |
| Could not load | The heading, open, with "Could not load checklists" and a Retry button. Never "(0)", never hidden |
| Loaded | Has records: open, as today. None: Checklists (0), collapsed |
Today, a section that fails to load simply disappears, which hides the failure. Part B makes that visible - a small fix in its own right.
"Empty" means no records at all. A completed checklist, a submitted form or a closed follow-up counts as a record, so its section stays open.
The heading is a button with a chevron and aria-expanded, reusing the subtask disclosure already on the task cards. It works by click, Enter and Space. Opening it shows exactly the controls shown today (attach a checklist, add a form, create or link a follow-up), with the same permission checks.
- Your choice sticks while the task is open. Open an empty section, and it stays open through every redraw of that task - adding a checklist step, a form saved in another tab, completing a subtask, changing the project. Each redraw keeps the open/closed state for that task, the same way the inline forms already keep which ones are open.
- Adding the first item keeps it open, so you can see what you added.
- Follow up from a failed checklist step (or a form) opens Follow-ups, scrolls to it and puts the cursor in the title box, as it does now - but now also when the section was collapsed.
- Half-typed text survives. Some redraws today rebuild the follow-up and checklist-note boxes, which loses what you were typing. Those redraws will carry the typed text across.
A user preference: Collapse empty work sections, under System -> Preferences -> Tasks, default off, so the Work view looks as it does today until you choose otherwise. It is a personal taste - some people want to see every button - so it belongs to each person, not to the install. See question 5.
It applies everywhere the Work view is drawn: the Work tab, the wide column, the side panel, and a task opened inside a ticket.
A new setting, Where the portal asks custom field questions: Side panel / Main form, default Side panel. It goes on Tickets -> Settings -> Fields, beside the existing Where requesters see their answers setting, because both are about custom fields on the portal. It is install-wide, like every other portal setting - see question 6.
With Main form, the New ticket page reads top to bottom:
Subject -> Request type (when it matters) -> Custom field questions -> Description
- The type picker moves with the questions, because it decides which ones are asked. It still only appears when choosing a type matters, as today.
- The questions keep their order, labels, hints and required markers. They use the same renderer, so validation and storage are unchanged.
- Changing the type keeps any answers that still apply, as it does now.
- The side panel keeps everything else: mailbox, category, priority, the Confidential toggle, equipment, attachments, and Submit.
Today the page is built so that it never scrolls. The description editor stretches to fill whatever height is left, and only the side panel scrolls. That is why the questions live in the side panel: in the main column they would be squeezed by the editor.
With Main form, the main column scrolls instead. The description editor gets a fixed, comfortable height (about 300px, the same idea as the ticket note box) rather than filling the space. So several questions, long answers and error messages all stay readable. On a phone the page is already one column, and the editor's Full screen button still works.
With Side panel, the page is exactly as it is today.
The custom field dialog already has Which ticket types: All / Only these. It gets a second, matching choice: Which departments: All / Only these, with a tick list of departments.
A field appears on a ticket when both match: its type is one of the field's types, and its department is one of the field's departments. A field set to All departments behaves exactly as today, which is every existing field.
A department-limited field can only appear once the ticket has that department, and on several channels it has none at the start:
| Channel | Department at creation |
|---|---|
| Analyst New ticket form | Chosen on the form - the questions update when you pick one |
| REST API, workflows, catalogue approvals | Whatever they set |
| Portal, email, chat | None (unless Part A's default department supplies one) |
So:
- On the portal, a department-limited question is never asked, because the requester does not choose a department. The settings screen says so when you tick Ask the requester on a department-limited field. Ticket type is the right way to ask the requester different questions - for example a New starter type asking the HR questions.
- For analysts the field appears as soon as the ticket is put into the department - by hand, by a workflow, or by the default department. Moving a ticket to another department hides that department's fields and shows the new ones. Values are hidden, never deleted, exactly like changing the type today, and moving it back brings them back.
- Required on create applies only where a department is chosen at creation: the analyst form and the REST API.
- Required at closure applies when the ticket is in one of the field's departments when it closes.
- A new table,
ticket_field_departments(field_id,department_id), besideticket_field_types, plus anall_departmentscolumn onticket_fields, default 1. Database Verification creates both. -
TicketFieldsService::fieldsFor()gains the department, so every place that asks which fields a ticket has - New ticket, the panel, the workspace, the REST API, the closure rule and the case report - keeps one answer. - The ticket panel reloads its custom fields after a department change, as it already does after a type change.
- If a department is deleted, a field limited to only that department is left limited to nothing. The custom fields list flags it so it can be fixed.
- A general form or page designer. The request says so explicitly.
- Hiding other built-in fields (priority, type, category...). Category, category at close and resolution code already have their own switches. Others can follow the same pattern later if asked for.
- Making departments per company. They are shared by every company today, and changing that touches teams, SLAs and routing. It deserves its own design.
- Any change to who can see or do what.
- Part A: create a ticket on every channel with Department hidden, with and without a default. Edit an existing ticket that has a hidden department, and check the department is still there. Close a ticket with Department required and hidden. Check the all-companies view refuses a create with no company. Check a task with a contractor survives an unrelated save with contractors switched off. Switch everything back on and check every value reappears.
- Part B: each section loaded empty, loaded with records, failed to load and slow to load. Open a section, then trigger each kind of redraw and check it stays open. Follow up from a failed step with Follow-ups collapsed. The same in a task opened inside a ticket.
- Part C: both placements on desktop and phone, with several required questions and a validation error.
- Part D: fields limited by type only, by department only, and by both. A department change in the panel. The portal never asking a department-limited question.
- Default department on every channel. Should the default department apply to email, portal and chat tickets too (my proposal), or only to tickets raised on the New ticket form?
- Department hidden with no default. Is "tickets with no department are seen by every team" acceptable, with the warning on the settings screen? Or should hiding Department require a default?
- Company preference. Is a My company for new tickets preference, which pre-selects but keeps the row visible, enough? Or do you need the row hidden entirely when a default exists?
- An existing contractor with contractors switched off. Read-only and visible (my proposal), or hidden completely?
- Collapse empty sections. A personal preference, default off (my proposal)? Or an install-wide default that each person can override?
- Portal placement per company. Install-wide like the other portal settings (my proposal), or per company?
- Part D. Does limiting custom fields by department fit how you use departments, given that portal and email tickets have no department to start with?
- Order. B and C first, then A, then D. Does that suit you?
See also: Custom ticket fields Β· Tickets settings - developer guide Β· Multi-tenancy settings Β· Task work view Β· Self-service portal Β· Module availability - design (#217)
FreeITSM β an open-source IT Service Management platform Β· github.com/edmozley/freeitsm Β· MIT licence
- Installation
- β° Scheduled tasks (cron jobs)
-
Architecture
- β³ π§Ή Root folder tidy (URL routing)
- β³ π Database Integrity (FKs & constraints)
- β³ π οΈ Database Verification β Developer Guide
- β³ π§© Service Layer (UI + API share code)
- β³ πͺ€ Code traps (the TRAP: comments)
- β³ π Commenting for the Engineering wiki
- β³ π οΈ Engineering wiki scanner - Developer Guide
- β³ π Service-Layer progress
- π€ Contributing (read before a pull request)
- π§ͺ Developer tests
- AI Providers
- Internationalisation (i18n)
- Timezones & Time Handling
- π Date & Time Formats
- π± Currencies
- π§ The sidebar (optional module rail)
- π§© Preference templates
- π Display order (modules, Watchtower cards) β Developer Guide
- Theming & Dark Mode
- ποΈ Recent β getting back to what you were doing
- β¨οΈ Command palette (βK)
- π Searching inside tickets
- π Attached documents
-
MobileβFriendly
- β³ π« Mobile: Tickets
- β³ π» Mobile: Assets
- β³ π Mobile: Calendar
- β³ π Mobile: Knowledge
- β³ π¦ Mobile: Service Status
- β³ πΌ Mobile: Watchtower
- β³ π§© Mobile: Problem Management
- β³ π Mobile: Change Management
- β³ πΏ Mobile: Software
- β³ β Mobile: Tasks
- β³ π Mobile: Forms
- β³ π Mobile: Contracts
- β³ π Mobile: Domains
- β³ π Mobile: People
- β³ π Mobile: Projects
- β³ ποΈ Mobile: Files
- β³ π Mobile: LMS
- β³ πΊοΈ Mobile: CMDB
- β³ πΊοΈ Mobile: Network Mapper
- β³ π§ Mobile: Process Mapper
- β³ βοΈ Mobile: Workflow
- β³ π₯οΈ Mobile: System
- β³ π Mobile: Reporting
- β³ π Mobile: System Wiki
- β³ π Mobile: Self-Service Portal
- β³ π§° Mobile: Techniques & Tricks
-
Security
- Layer 1 β which modules you can enter
- β³ π§© Module Access Control
- β³ π οΈ Module Access β Developer Guide
- β³ π Switching modules off
- β³ π οΈ Module availability β Developer Guide
- β³ π Module availability β design (#217)
- Layer 2 β what you can administer
- β³ π Roles & Permissions
- β³ π οΈ Roles β Developer Guide
- β³ π€ Why capabilities are constants
- Layer 3 β the System module
- β³ π Admin Access Control
- Hardening
- β³ π Security review response 2026-08
- β³ π‘οΈ Security hardening 2026-08
- β³ π οΈ Security hardening 2026-08 β Developer Guide
- β³ π‘οΈ Round three β plain English
- β³ π οΈ Round three β Developer Guide
- β³ π‘οΈ CSRF protection (S4) β Developer Guide
- Single Sign-On (SSO)
- ποΈ LDAP & Active Directory
- π CardDAV contact sync
- Browser Extension
- API Reference
-
π REST API β how it works
- β³ π Proposal: custom fields, inventory import and change evidence (#194)
- β³ π οΈ Custom fields, evidence + inventory - review (#195-#197)
- β³ π οΈ Long forms in a task's Work view - review (#198)
- β³ π« REST API: Tickets
- β³ π» REST API: Assets
- β³ π΄ REST API: Problems
- β³ π REST API: Changes
- β³ π REST API: Knowledge
- β³ β REST API: Tasks
- β³ ποΈ REST API: CMDB
- β³ π REST API: Contracts
- β³ ποΈ REST API: Calendar
- β³ πΏ REST API: Software
- β³ π REST API: Domains
- β³ π¦ REST API: Service Status
- β³ βοΈ REST API: Morning Checks
- β³ π REST API: Forms
- β³ βοΈ REST API: Workflow
- β³ π·οΈ REST API: Cost centres
- β³ π§βπΌ REST API: Analysts
- β³ πΊοΈ REST API: Network Mapper
- β³ π§ Using the API docs page
- β³ π OpenAPI specification
- β³ β OpenAPI: kept correct
- β³ π οΈ Maintaining the catalogue
- Watchtower
-
Tickets
- β³ π οΈ Inbox.js map β Developer Guide
- β³ π οΈ Floating windows & the file viewer β Developer Guide
- β³ π οΈ Tickets settings β Developer Guide
- β³ π Simpler ticket and task forms - design (#218)
- β³ ποΈ The ticket workspace
- β³ π The ticket table
- β³ π Rota copy and paste β Developer Deep Dive
- β³ β Checklists & SOPs
- β³ βοΈ Mandatory fields
- β³ π§Ύ Custom ticket fields
- β³ π·οΈ Ticket categories
- β³ π₯ Assigning tickets to a team, and escalation
- β³ π’ One board across every company
- β³ Mailbox Authentication
- β³ π€ Email send log
- β³ π Attachment size limits and large emails
- β³ Basic IMAP mailboxes
- β³ Email rendering & images
- β³ SLA Management
- β³ WhatsApp channel
-
β³
βοΈ Telegram channel - β³ β CSAT company scope and filters β Developer Guide
- β³ π₯ Microsoft Teams channel
- β³ π¨οΈ Mattermost channel
- β³ π¬ Web chat channel
- β³ π£ Slack channel
- β³ π Linking tickets
- β³ β Record previews
- β³ π Ticket notes: internal or shared
- β³ ποΈ Canned responses
- β³ βοΈ Limiting replies to particular senders
- β³ π¨ Telling the analyst a ticket is theirs
- β³ βοΈ Email signatures
- β³ π The public web address
- β³ π’ Ticket numbering
- β³ π Raising a ticket for someone else
- β³ π Merging tickets
- β³ π Confidential tickets
- β³ π₯ Portal managers
- β³ π Who has seen a ticket
- β³ π Reading long tickets
- β³ β Splitting tickets
- β³ β Selecting several tickets
- β³ ποΈ The folder pane
- β³ π½ Just my tickets, or no closed ones
- β³ π οΈ Snoozing tickets β Developer Guide
- β³ π₯ Collision detection
- β³ β±οΈ Time tracking
- β³ π Case reports - a ticket and its work as one PDF
- β³ π Scheduled work in your own calendar
- Problem Management
- Tasks
- π Projects
-
Assets
- β³ π’ Moving an asset between companies
- β³ π Shared asset locations
- β³ π§βπΌ Assigning assets to analysts
- β³ π Warranty and lease alerts
- β³ π Leases
- β³ π Saved table views
- β³ π¨οΈ Recording anything, and importing it
- β³ π§© Asset type layouts
- β³ π Inventory freshness
- β³ π Linked configuration item
- β³ π Connected assets
- β³ π Asset review
- β³ π·οΈ QR asset labels
- β³ π Who holds what, and handover documents
- β³ π₯οΈ The inventory agent (PowerShell)
- β³ ποΈ Proxmox VE servers
- β³ βοΈ VMware Cloud Director servers
- β³ πͺ Hyper-V and Failover Clusters
- β³ π Linking equipment to tickets
- β³ βοΈ Follow-up tasks on a ticket
- Knowledge
- Change Management
- Calendar
- Morning Checks
- Reporting
- Software
-
Forms
- β³ π¨ The form designer β Developer Guide
- β³ π Layout & the grid β Developer Guide
- β³ ποΈ Collections β grouping submissions
- β³ π Submissions as PDFs
- β³ β‘ What happens next β a form's own actions
- β³ π οΈ Sections & conditional logic β Developer Guide
- β³ π οΈ Lookup fields β Developer Guide
- β³ π‘οΈ Catalogue request approvals
- People
- Starters & leavers
- Domains
- ποΈ Files
- Contracts
- Service Status
- π Notifications
- π¨ War Room
- Self-Service Portal
- LMS
- Process Mapper
- CMDB
- Network Mapper
- Workflows
- Issue trackers (Jira, Azure DevOps)
- π‘ Zabbix (monitoring)
- π¬ Microsoft Teams alerts
- π 3CX (phone system)
-
System
- β³ π οΈ Preferences β Developer Guide
- β³ π Finding people in the Analysts list
- β³ πͺ When an analyst leaves
- β³ π οΈ System β Branding β Developer Guide
- β³ π©Ί Page health (D019) β Developer Guide
- β³ β Feature Bingo
- β³ π·οΈ Cost centres
- β³ π· Photo Album
- β³ Demo Data
- β³ π οΈ Demo Data β Developer Guide
-
Overview
- β³ π Progress tracker
- β³ Concepts & vocabulary
- β³ Email routing & mailboxes
- β³ Settings: global vs per-company
- β³ Users & self-service
- β³ Staff cross-company access
- β³ π’ One board across every company
- β³ Worked examples
- β³ Pitfalls & gotchas
- β³ Scope: what it's for
- β³ π οΈ Developer Guide (make a module multi-company)
- β³ ποΈ Case study: CMDB (a linked graph)
- β³ π§ͺ Test harness (prove it's isolated)
- What this is
-
π Bugs resolved
- β³ π« #227 A mailbox could not be deleted
- β³ π« #226 A picture on a note could not be closed
- β³ π» #222 The Assets page never loaded in 4.3.0
- β³ βοΈ #214 A "contains" condition did not match capitals
- β³ βοΈ #216 A workflow email from a chosen mailbox always failed
- β³ π³ The Docker image was missing PHP extensions
- β³ π A failed DNS lookup read as a missing record
- β³ π A link could change data
- β³ π Access outlived its removal
- β³ π Knowledge articles could run scripts
- β³ π Knowledge writes ignored permissions
- β³ π Company boundaries (Oct 2026)
- β³ π Smaller gaps (Oct 2026)
- β³ π Escaped text could leave its attribute
- β³ π Task descriptions were not cleaned
- β³ π Task documents ignored company scope
- β³ π Repeating tasks ignored company scope
- β³ π¬ #183 Mailbox checks overlapped
- β³ π #188 Transfer lock shown off when unknown
- β³ β #184 Subtask names and Overdue
- β³ π§© #186 Teams: the buttons did nothing
- β³ π Text in a change could run script
- β³ π AI settings changed without the AI permission
- β³ πͺ #178 Deleting an analyst failed
- β³ π« A team with no departments showed 0 tickets
- β³ π Projects: adding a phase did nothing on Save
- β³ π Leavers could still sign in
- β³ πΌοΈ Logo and courses broke on Apache with PHP-FPM
- β³ π’ Chat tickets ignored your ticket numbering
- β³ π Dates shown as a dash, or in server time
- β³ π Assets β Users showed people from other companies
- β³ π Restricted analysts could read other modules' data
- β³ πΌοΈ Replies with a picture in the thread failed to send
- β³ π Reply attachments never reached the customer
- β³ π οΈ Outbound email attachments β Developer Guide
- β³ π A global SSO provider was missing from the portal
- β³ π Behind a proxy, the SSO redirect said http
- β³ βοΈ The portal tagline moved when you saved it
- β³ π¨ The portal settings screen forgot what you saved
- β³ π‘οΈ The approvals inbox said "Error" and nothing else
- β³ π A table's answers were missing from the PDF
- β³ β A single-select column let you tick every option
- β³ π The portal ignored a form's field widths
- β³ π The tasks board stopped taking clicks
- β³ ποΈ #121 The index list is out of date after upgrading
- β³ π #133 The calendar subscription was empty
- β³ π #131 Tasks always reopened on the board
- β³ π₯ #129 Every page returned HTTP 500 after upgrading
- β³ π³ #127 A PHP warning above the System page
- β³ π #126 Notes stamped with the server's clock
- β³ π Storing every date in UTC
- β³ πͺ The portal was down for everyone signed in
- β³ βοΈ #120 Workflow notes could never be written
- β³ βοΈ #123 Three errors when running Database Verification
- β³ π #122 The description box was a stub in the corner
- β³ π£ Demo data deleted real accounts
- β³ π #117 Sign-in redirected to the wrong address
- β³ π¨ #108 The priority dot was invisible
- β³ β±οΈ #116 Time logged from the right-click menu
- β³ π #114 API keys refused by our own guard
- β³ ποΈ #110 Assigning a task told nobody
- β³ πͺ #107 Signed out while still working
- β³ π #103 "Share with Requester" reached nobody
- β³ π #102 Search found nothing for hyphens
- β³ πͺ #101 Source code editor opened behind
- β³ βοΈ #88 Subtasks could not be ticked off
- β³ π» #84 Asset deep link selected nothing
- β³ π« #79 A new ticket arrived with no status
- β³ π§ #79 A ticket from email did not say so
- β³ π #78 Bell opened to nothing
- β³ π¬ #77 Mail only collected from Inbox
- β³ π #74 The default password could not be changed
- β³ π¦ #70 Renaming an impact level
- β³ π€ #67 App-only mailboxes could not send
- β³ π #45 Verify only ever worked for Microsoft
- β³ π #45 IMAP reported as not authenticated
- β³ βοΈ An email template stopped escaping itself
- β³ π The portal dashboard showed the wrong time
- β³ π’ The folder said 99 and the list showed 96