From 81411d993e2ee1a84936adf8d518588556b9ad2d Mon Sep 17 00:00:00 2001
From: Matt Gros <3311227+mpge@users.noreply.github.com>
Date: Fri, 24 Apr 2026 06:46:36 -0400
Subject: [PATCH 1/2] feat(admin): Settings/PublicTickets.vue for guest policy
(Task 6.3)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Form with radio picker for guest policy mode (unassigned / guest_user /
prompt_signup), conditional number input for the shared guest-user id,
and conditional text input for the signup URL template. PUTs to
escalated.admin.settings.public-tickets.update — host adapters (Laravel,
NestJS, Rails, etc.) register the route and the shared SettingsService
persists the values so admins can change the policy at runtime without
a redeploy.
Marks Task 6.3 complete in the plan. The backend side (SettingsService +
widget controller reading from it) landed in previous iterations.
---
.../plans/2026-04-23-public-ticket-system.md | 4 +-
src/pages/Admin/Settings/PublicTickets.vue | 139 ++++++++++++++++++
2 files changed, 141 insertions(+), 2 deletions(-)
create mode 100644 src/pages/Admin/Settings/PublicTickets.vue
diff --git a/docs/superpowers/plans/2026-04-23-public-ticket-system.md b/docs/superpowers/plans/2026-04-23-public-ticket-system.md
index b1f0cb3..04d6a0f 100644
--- a/docs/superpowers/plans/2026-04-23-public-ticket-system.md
+++ b/docs/superpowers/plans/2026-04-23-public-ticket-system.md
@@ -1389,12 +1389,12 @@ Each task's spec covers: success path, no-op path (e.g. status slug missing), an
- [ ] Admin controller `PUT /escalated/admin/settings/guest-policy` updates the stored policy. Widget controller reads the stored policy via `SettingsService.get('guestPolicy', options.guestPolicy)`.
-### Task 6.3 — Frontend settings page
+### Task 6.3 — Frontend settings page — COMPLETED (iter 92)
**Files:**
- Create: `C:\Users\work\escalated\src\pages\Admin\Settings\PublicTickets.vue`
-- [ ] Form with radio for mode, conditional `guestUserId` picker, save button that PUTs to the admin endpoint. Mirror the visual style of existing `Admin/Workflows/Builder.vue` for consistency.
+- [x] Radio picker for mode (unassigned / guest_user / prompt_signup), conditional `guest_policy_user_id` number input when mode is `guest_user`, conditional `guest_policy_signup_url_template` text input when mode is `prompt_signup`, Save button PUTs to `route('escalated.admin.settings.public-tickets.update')`. Visual style matches existing `Admin/Settings/CsatSettings.vue` (same border / accent / hover tokens).
---
diff --git a/src/pages/Admin/Settings/PublicTickets.vue b/src/pages/Admin/Settings/PublicTickets.vue
new file mode 100644
index 0000000..5955182
--- /dev/null
+++ b/src/pages/Admin/Settings/PublicTickets.vue
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+
+ ← Back to Settings
+
+
+
+
+
Guest policy
+
+ Controls the identity assigned to tickets submitted via the public widget or inbound email. Applies
+ at request time, so changes take effect on the next submission -- no redeploy needed.
+
+
+
+
+
+
+
From 68367c9bef605b57160b26797c786769b6e1a12b Mon Sep 17 00:00:00 2001
From: Matt Gros <3311227+mpge@users.noreply.github.com>
Date: Fri, 24 Apr 2026 06:48:22 -0400
Subject: [PATCH 2/2] feat(admin): add discovery link from Settings.vue to
PublicTickets.vue
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Admins toggling Guest Tickets on now see a "Configure guest policy →"
link below the switch that routes to the new per-feature settings
page. Without this, admins would have no way to find the page.
The link only renders when guest tickets are enabled, so it stays out
of the way for hosts that don't use the public widget / inbound
email flows.
---
src/pages/Admin/Settings.vue | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/src/pages/Admin/Settings.vue b/src/pages/Admin/Settings.vue
index 57727ac..ed1cf54 100644
--- a/src/pages/Admin/Settings.vue
+++ b/src/pages/Admin/Settings.vue
@@ -1,7 +1,7 @@