diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index cad1c9fb15..771ef7be9d 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -191,7 +191,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
"color" = COLOR_WEBHOOK_POOR
)
)
-
+
GLOB.ahelp_tickets.active_tickets += src
/datum/admin_help/Destroy()
@@ -428,6 +428,9 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
//Show the ticket panel
/datum/admin_help/proc/TicketPanel()
+ tgui_interact(usr.client.mob)
+
+/datum/admin_help/proc/TicketPanelLegacy()
var/list/dat = list("
Ticket #[id]")
var/ref_src = "\ref[src]"
dat += "Admin Help Ticket #[id]: [LinkedReplyName(ref_src)]
"
@@ -468,6 +471,62 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
log_admin(msg)
TicketPanel() //we have to be here to do this
+/datum/admin_help/tgui_fallback()
+ TicketPanelLegacy()
+
+/datum/admin_help/tgui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "AdminTicketPanel", "Ticket #[id] - [LinkedReplyName("\ref[src]")]")
+ ui.open()
+
+/datum/admin_help/tgui_state(mob/user)
+ return GLOB.tgui_admin_state
+
+/datum/admin_help/tgui_data(mob/user)
+ var/list/data = list()
+
+ data["id"] = id
+
+ var/ref_src = "\ref[src]"
+ data["title"] = name
+ data["name"] = LinkedReplyName(ref_src)
+
+ switch(state)
+ if(AHELP_ACTIVE)
+ data["state"] = "open"
+ if(AHELP_RESOLVED)
+ data["state"] = "resolved"
+ if(AHELP_CLOSED)
+ data["state"] = "closed"
+ else
+ data["state"] = "unknown"
+
+ data["opened_at"] = (world.time - opened_at)
+ data["closed_at"] = (world.time - closed_at)
+ data["opened_at_date"] = gameTimestamp(wtime = opened_at)
+ data["closed_at_date"] = gameTimestamp(wtime = closed_at)
+
+ data["actions"] = FullMonty(ref_src)
+
+ data["log"] = _interactions
+
+ return data
+
+/datum/admin_help/tgui_act(action, params)
+ if(..())
+ return
+ switch(action)
+ if("retitle")
+ Retitle()
+ . = TRUE
+ if("reopen")
+ Reopen()
+ . = TRUE
+ if("legacy")
+ TicketPanelLegacy()
+ . = TRUE
+
//Forwarded action from admin/Topic
/datum/admin_help/proc/Action(action)
testing("Ahelp action: [action]")
diff --git a/tgui/packages/tgui/interfaces/AdminTicketPanel.tsx b/tgui/packages/tgui/interfaces/AdminTicketPanel.tsx
new file mode 100644
index 0000000000..4767a8e25b
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/AdminTicketPanel.tsx
@@ -0,0 +1,67 @@
+import { useBackend } from '../backend';
+import { Box, Button, LabeledList, Section } from '../components';
+import { Window } from '../layouts';
+
+enum State {
+ 'open' = 'Open',
+ 'resolved' = 'Resolved',
+ 'closed' = 'Closed',
+ 'unknown' = 'Unknown',
+}
+
+type Data = {
+ id: number;
+ title: string;
+ name: string;
+ state: State;
+ opened_at: number;
+ closed_at: number;
+ opened_at_date: string;
+ closed_at_date: string;
+ actions: string;
+ log: string[];
+};
+
+export const AdminTicketPanel = (props, context) => {
+ const { act, data } = useBackend(context);
+ const { id, title, name, state, opened_at, closed_at, opened_at_date, closed_at_date, actions, log } = data;
+ return (
+
+
+
+
+
+
+ );
+};