Skip to content

ux(halopsa): expose user-linking toggle and clean up integration settings#1

Open
renada-jacob wants to merge 1821 commits into
devfrom
feat/halo-link-tickets-to-users
Open

ux(halopsa): expose user-linking toggle and clean up integration settings#1
renada-jacob wants to merge 1821 commits into
devfrom
feat/halo-link-tickets-to-users

Conversation

@renada-jacob

Copy link
Copy Markdown
Owner

Summary

Frontend companion to the CIPP-API user-linking work in https://github.com/renada-jacob/CIPP-API/pull/feat/halo-link-tickets-to-users. Adds the new HaloPSA.LinkTicketsToUsers toggle and reworks the HaloPSA integration page so first-time users have a clearer setup experience.

What's new

New setting

  • Link Tickets to affected Users switch on the HaloPSA integration page. Off by default. When enabled (with the matching CIPP-API changes), alerts that target specific users produce one HaloPSA ticket per user, linked to the matching contact.

Layout / UX cleanup on the HaloPSA page

  • Toggles moved below the credential and dropdown fields - users now configure the connection details first, then pick behavioural options at the bottom rather than enabling features before the integration is even configured.
  • HaloPSA Outcome only appears when Consolidate Tickets is on (was previously visible-but-disabled, which was confusing).
  • Helper text added under Ticket Type, Outcome, Consolidate Tickets, and Link Tickets to affected Users explaining what each does and how the dependencies interact.
  • Renamed Link tickets to affected users -> Link Tickets to affected Users for title-case consistency with the other toggles.

Reusable form-component improvements

  • New fullRow: true opt-in on SettingOptions entries (CippIntegrationSettings.jsx). Non-switch settings normally render at half-width in a 2-column grid; setting fullRow lets a wide dropdown take the full row so its helper text has room to breathe. Used here for the new helper-text on Ticket Type and Outcome.
  • Helper text capped at 700px max-width with display: block (CippFormComponent.jsx). Long captions no longer stretch edge-to-edge across wide screens.
  • Small top margin (mt: 0.75) on helper text so captions aren't pressed against the bottom border of the field they describe.

The form-component changes are global (affect every form in CIPP that uses helper text) but should be a strict improvement - long captions are easier to read at a constrained width and small spacing makes the visual hierarchy clearer.

Test plan

  • HaloPSA integration page renders the new toggle below the existing options.
  • Toggle the new switch on/off, save - the value round-trips through /api/ExecExtensionsConfig and the CIPP-API picks it up on the next ticket creation.
  • Toggle Consolidate Tickets on - Outcome dropdown appears below it. Toggle off - Outcome disappears.
  • All four helper text captions are visible, wrap at a sensible width, and have small breathing space above them.
  • Verify other forms in CIPP that use helper text still look right (the global changes shouldn't break anything but worth a quick scan).

🤖 Generated with Claude Code

Zacgoose and others added 30 commits April 18, 2026 03:05
…/npm_and_yarn/dev/mui/system-7.3.10

chore(deps): bump @mui/system from 7.3.2 to 7.3.10
Introduce a granular (per-standard) view for the Standard & Drift Alignment page with a toggle between Summary and Per Standard modes. Changes include: new imports (MUI, heroicons, standards data), stateful mode toggle, separate filter/action/column sets for summary vs granular, API param/granular queryKey, and an off-canvas details panel that parses/compares expected vs current values and shows formatted diffs. Also replaced Delete icon usage with Edit for template editing. Updated get-cipp-formatting to render complianceStatus as colored Chips and to resolve standardName labels from data/standards.json.

fixes KelvinTegelaar#5894
Use Array.isArray to validate reportListApi.data and reportDataApi.data before mapping or passing to CippDataTable. This replaces the nullish-coalescing fallback so the code won't try to map or render non-array API responses (e.g. objects or other types), avoiding potential runtime errors.
KelvinTegelaar and others added 30 commits May 12, 2026 16:03
…/npm_and_yarn/dev/tanstack/react-query-persist-client-5.96.2

chore(deps): bump @tanstack/react-query-persist-client from 5.90.27 to 5.96.2
Surfaces the HaloPSA.LinkTicketsToUsers setting on the integration
configuration page. When enabled (and used with the matching CIPP-API
changes), alerts that target specific users produce one HaloPSA ticket per
user, linked to the matching contact - matched by Azure Object ID first,
then by email. Defaults off so existing installations see no change in
ticket volume until they opt in.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Move the Consolidate Tickets and Link Tickets to affected Users toggles
  below the credential and dropdown fields. New users now configure the
  required connection details first, then pick behavioural options last,
  rather than enabling features before the integration is configured.
- Add helperText under Ticket Type explaining its role and that the
  Outcome dropdown depends on it being saved first.
- Add helperText under Outcome explaining that it's the action template
  used for consolidation notes, that it must be a private/internal-note
  action the API user can perform, and that the list is restricted to
  outcomes the selected Ticket Type's workflow allows.
- Add helperText under Consolidate Tickets and Link Tickets to affected
  Users explaining what each toggle does and how they interact.
- Rename "Link tickets to affected users" to "Link Tickets to affected
  Users" so it matches the title-case style of the other toggles.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The integration settings page renders fields in a 2-column grid where
switches default to full width and everything else to half width. There
was no per-field override, so a wide dropdown with a long helperText
ended up squeezed into half a row next to a credential field, breaking
the visual rhythm.

Adds an optional fullRow boolean on each SettingOptions entry. When
true, the field takes the whole row regardless of type. Marks HaloPSA
Ticket Type and HaloPSA Outcome as fullRow so their helper text has
room to breathe and they no longer pair awkwardly with the Client
Secret field above them.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
When a form field's helperText was long (e.g. the new HaloPSA Ticket
Type / Outcome explanations), it was rendering edge-to-edge across the
full width of the parent grid item, which is hard to scan on wide
screens. Cap the helperText Typography at 700px and force display:block
so the constraint actually applies. This affects all forms using
helperText, not just integrations - long captions everywhere now wrap
to a comfortable reading width.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The helperText was rendering directly against the bottom edge of the
field above it, especially noticeable on bordered controls like
dropdowns and text inputs. Add a 6px top margin (mt: 0.75 in MUI
spacing units) so captions have a small breathing space and clearly
read as belonging to the field they describe.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Re-orders the Settings page so the Consolidate Tickets toggle sits above
the Outcome dropdown (which only matters when consolidation is on), and
switches the dropdown's condition action from disable to hide. The
greyed-out, dependency-implicit dropdown is replaced with a clean
appears-on-demand pattern - users no longer wonder why the field is
there or what enables it.

Helper text on both fields reworded to make the dependency obvious.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
When configuring a scripted CIPP alert with PSA selected as one of the
actions, the Notification Settings now include a 'PSA Ticket Strategy'
dropdown that overrides the global HaloPSA.LinkTicketsToUsers toggle
for that alert.

Options:
- Use HaloPSA integration default (inherit the global toggle)
- One ticket per affected user (force split)
- One consolidated ticket per tenant (force consolidated)

The dropdown is hidden via CippFormCondition when PSA isn't one of the
selected actions, so it only surfaces when relevant. Round-trips through
the existing AddScriptedAlert -> AddScheduledItem -> Add-CIPPScheduledTask
chain via a new top-level PsaTicketStrategy field on the payload.
…atePSA)

Two separate action option lists exist on the same alert form:

- postExecutionOptions (scripted alerts): values 'Webhook', 'Email', 'PSA'
- actionsToTake (audit log alerts): values 'generateWebhook', 'generatemail',
  'generatePSA', etc.

The new PSA Ticket Strategy dropdown was guarded by compareValue
'generatePSA', which only matches the audit-log option list. Scripted
alerts (where the splitter actually applies) store 'PSA', so the
condition never matched and the dropdown stayed hidden.

Switch the guard to 'PSA' to align with the scripted-alert action list,
which is the only path where per-task PSA strategy is meaningful.
Position the PSA-specific dropdown next to the action that triggers it
(Actions to take), rather than at the bottom of Notification Settings
after Custom Subject and Alert Comment. Reads more naturally - the
strategy is logically a sub-option of selecting PSA, so visual proximity
makes the dependency obvious.
Replace the static 'Use HaloPSA integration default' option with a
dynamic two-option dropdown that mirrors the integration's current
LinkTicketsToUsers setting.

The option matching the current integration default gets
'(HaloPSA integration default)' appended to its label and is preselected
on new alerts. When loading an existing alert with no stored strategy
(legacy alerts created before this field existed), the dropdown also
falls back to the current default so the selection is always meaningful.

Behaviour:
- New alert (integration default = split):
  preselects 'One ticket per affected user (HaloPSA integration default)'
- New alert (integration default = consolidated):
  preselects 'One consolidated ticket per tenant (HaloPSA integration default)'
- Existing alert with PsaTicketStrategy='split': loads as 'split', label
  may or may not show the default marker depending on current integration
  setting

Backend semantics unchanged: empty string still means 'inherit' for any
legacy rows that have it, but the form always sends an explicit value
now.
Remove the helperText styling change to CippFormComponent.jsx per maintainer
feedback (core component, internal-only). Trim the HaloPSA integration and
PSA Ticket Strategy helper texts so they read cleanly with the default styling.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.