@rubytech/create-maxy-code 0.1.344 → 0.1.346
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +4 -2
- package/payload/platform/plugins/docs/references/calendar-booking.md +3 -1
- package/payload/server/public/assets/{AdminLoginScreens-CZqsFfP0.js → AdminLoginScreens-CpE_Nf5z.js} +1 -1
- package/payload/server/public/assets/{AdminShell-DnhBRZv5.js → AdminShell-D3N3Aq04.js} +1 -1
- package/payload/server/public/assets/{Checkbox-D0FwyuVg.js → Checkbox-DQGuYIRH.js} +1 -1
- package/payload/server/public/assets/{OperatorConversations-BG9GrxQU.css → OperatorConversations-DLfQEw1r.css} +1 -1
- package/payload/server/public/assets/{admin-CCzmqd1F.js → admin-BU0dY3_T.js} +1 -1
- package/payload/server/public/assets/{browser-kmrJq69n.js → browser-B5ytGJAE.js} +1 -1
- package/payload/server/public/assets/calendar-CgVgCBhg.js +1 -0
- package/payload/server/public/assets/chat-cxTK--65.js +1 -0
- package/payload/server/public/assets/{data-CZKWSjEH.js → data-BVPOzSZ7.js} +1 -1
- package/payload/server/public/assets/{graph-BxErrIf_.js → graph-D0fPx1nX.js} +1 -1
- package/payload/server/public/assets/{graph-labels-Ch5_g_JF.js → graph-labels-C4dkheQ8.js} +1 -1
- package/payload/server/public/assets/{operator-CdlBsCdn.js → operator-DyrF6PQi.js} +1 -1
- package/payload/server/public/assets/{page-DzsVxvM6.js → page-BPIaNNW1.js} +1 -1
- package/payload/server/public/assets/{public-BzVhn2va.js → public-BrIaS6m3.js} +1 -1
- package/payload/server/public/browser.html +4 -4
- package/payload/server/public/calendar.html +4 -4
- package/payload/server/public/chat.html +5 -5
- package/payload/server/public/data.html +4 -4
- package/payload/server/public/graph.html +6 -6
- package/payload/server/public/index.html +6 -6
- package/payload/server/public/operator.html +7 -7
- package/payload/server/public/public.html +5 -5
- package/payload/server/server.js +108 -4
- package/payload/server/public/assets/calendar-BWf5qrIH.js +0 -1
- package/payload/server/public/assets/chat-C2e06_q0.js +0 -1
- /package/payload/server/public/assets/{OperatorConversations-dt0q8mjv.js → OperatorConversations-g7aAQCDn.js} +0 -0
package/payload/server/server.js
CHANGED
|
@@ -17582,6 +17582,22 @@ var browser_default = app42;
|
|
|
17582
17582
|
|
|
17583
17583
|
// server/routes/admin/calendar.ts
|
|
17584
17584
|
var app43 = new Hono();
|
|
17585
|
+
function normalizeAttendees(raw) {
|
|
17586
|
+
if (!Array.isArray(raw)) return [];
|
|
17587
|
+
return raw.map((a) => {
|
|
17588
|
+
const rec = a ?? {};
|
|
17589
|
+
return {
|
|
17590
|
+
name: typeof rec.name === "string" ? rec.name : null,
|
|
17591
|
+
email: typeof rec.email === "string" ? rec.email : null
|
|
17592
|
+
};
|
|
17593
|
+
});
|
|
17594
|
+
}
|
|
17595
|
+
var EDITABLE_FIELDS = ["title", "startsAt", "endsAt", "location"];
|
|
17596
|
+
var MEETING_RETURN = `RETURN elementId(m) AS id, m.title AS title,
|
|
17597
|
+
toString(m.startsAt) AS startsAt, toString(m.endsAt) AS endsAt,
|
|
17598
|
+
m.location AS location, coalesce(m.isAllDay, false) AS isAllDay,
|
|
17599
|
+
'meeting' AS kind, m.uid AS uid,
|
|
17600
|
+
[(p:Person)-[:ATTENDED]->(m) | {name: coalesce(p.displayName, p.email), email: p.email}] AS attendees`;
|
|
17585
17601
|
app43.get("/meetings", requireAdminSession, async (c) => {
|
|
17586
17602
|
const cacheKey = c.var.cacheKey;
|
|
17587
17603
|
const accountId = getAccountIdForSession(cacheKey);
|
|
@@ -17601,7 +17617,8 @@ app43.get("/meetings", requireAdminSession, async (c) => {
|
|
|
17601
17617
|
RETURN elementId(m) AS id, m.title AS title,
|
|
17602
17618
|
toString(m.startsAt) AS startsAt, toString(m.endsAt) AS endsAt,
|
|
17603
17619
|
m.location AS location, coalesce(m.isAllDay, false) AS isAllDay,
|
|
17604
|
-
'meeting' AS kind
|
|
17620
|
+
'meeting' AS kind,
|
|
17621
|
+
[(p:Person)-[:ATTENDED]->(m) | {name: coalesce(p.displayName, p.email), email: p.email}] AS attendees
|
|
17605
17622
|
UNION
|
|
17606
17623
|
MATCH (e:Event {accountId: $accountId})
|
|
17607
17624
|
WHERE e.actionPlugin IS NULL
|
|
@@ -17611,7 +17628,8 @@ app43.get("/meetings", requireAdminSession, async (c) => {
|
|
|
17611
17628
|
toString(datetime(e.startDate)) AS startsAt,
|
|
17612
17629
|
CASE WHEN e.endDate IS NULL THEN null ELSE toString(datetime(e.endDate)) END AS endsAt,
|
|
17613
17630
|
e.location AS location, false AS isAllDay,
|
|
17614
|
-
'event' AS kind
|
|
17631
|
+
'event' AS kind,
|
|
17632
|
+
[] AS attendees
|
|
17615
17633
|
UNION
|
|
17616
17634
|
MATCH (t:Task {accountId: $accountId})
|
|
17617
17635
|
WHERE t.dueDate IS NOT NULL
|
|
@@ -17620,7 +17638,8 @@ app43.get("/meetings", requireAdminSession, async (c) => {
|
|
|
17620
17638
|
RETURN elementId(t) AS id, t.name AS title,
|
|
17621
17639
|
toString(datetime(t.dueDate)) AS startsAt, null AS endsAt,
|
|
17622
17640
|
null AS location, true AS isAllDay,
|
|
17623
|
-
'task' AS kind
|
|
17641
|
+
'task' AS kind,
|
|
17642
|
+
[] AS attendees`,
|
|
17624
17643
|
{ accountId, from, to }
|
|
17625
17644
|
);
|
|
17626
17645
|
const meetings = res.records.map((r) => ({
|
|
@@ -17630,7 +17649,8 @@ app43.get("/meetings", requireAdminSession, async (c) => {
|
|
|
17630
17649
|
endsAt: r.get("endsAt"),
|
|
17631
17650
|
location: r.get("location"),
|
|
17632
17651
|
isAllDay: r.get("isAllDay"),
|
|
17633
|
-
kind: r.get("kind")
|
|
17652
|
+
kind: r.get("kind"),
|
|
17653
|
+
attendees: normalizeAttendees(r.get("attendees"))
|
|
17634
17654
|
})).sort((a, b) => new Date(a.startsAt).getTime() - new Date(b.startsAt).getTime());
|
|
17635
17655
|
const counts = { meeting: 0, event: 0, task: 0 };
|
|
17636
17656
|
for (const m of meetings) counts[m.kind]++;
|
|
@@ -17646,6 +17666,90 @@ app43.get("/meetings", requireAdminSession, async (c) => {
|
|
|
17646
17666
|
await session.close();
|
|
17647
17667
|
}
|
|
17648
17668
|
});
|
|
17669
|
+
app43.patch("/meetings/:id", requireAdminSession, async (c) => {
|
|
17670
|
+
const cacheKey = c.var.cacheKey;
|
|
17671
|
+
const accountId = getAccountIdForSession(cacheKey);
|
|
17672
|
+
if (!accountId) {
|
|
17673
|
+
console.error('[calendar] op=admin-edit auth-rejected reason="no account for session"');
|
|
17674
|
+
return c.json({ error: "Account not found for session" }, 401);
|
|
17675
|
+
}
|
|
17676
|
+
const id = c.req.param("id");
|
|
17677
|
+
const body = await safeJson(c) ?? {};
|
|
17678
|
+
const fields = EDITABLE_FIELDS.filter((f) => f in body);
|
|
17679
|
+
if (fields.length === 0) {
|
|
17680
|
+
return c.json({ error: "No editable field supplied (title, startsAt, endsAt, location)" }, 400);
|
|
17681
|
+
}
|
|
17682
|
+
const setClauses = fields.map(
|
|
17683
|
+
(f) => f === "startsAt" || f === "endsAt" ? `m.${f} = datetime($${f})` : `m.${f} = $${f}`
|
|
17684
|
+
);
|
|
17685
|
+
setClauses.push("m.updatedAt = datetime()");
|
|
17686
|
+
const params = { accountId, id };
|
|
17687
|
+
for (const f of fields) params[f] = body[f];
|
|
17688
|
+
const session = getSession();
|
|
17689
|
+
try {
|
|
17690
|
+
const res = await session.run(
|
|
17691
|
+
`MATCH (m:Meeting {accountId: $accountId})
|
|
17692
|
+
WHERE elementId(m) = $id
|
|
17693
|
+
SET ${setClauses.join(", ")}
|
|
17694
|
+
${MEETING_RETURN}`,
|
|
17695
|
+
params
|
|
17696
|
+
);
|
|
17697
|
+
if (res.records.length === 0) {
|
|
17698
|
+
console.warn(`[calendar-edit] account=${accountId.slice(0, 8)} uid=absent fields=${fields.join(",")} found=0`);
|
|
17699
|
+
return c.json({ error: "Meeting not found for this account" }, 404);
|
|
17700
|
+
}
|
|
17701
|
+
const r = res.records[0];
|
|
17702
|
+
const uid = r.get("uid");
|
|
17703
|
+
console.log(`[calendar-edit] account=${accountId.slice(0, 8)} uid=${uid ?? "absent"} fields=${fields.join(",")}`);
|
|
17704
|
+
const meeting = {
|
|
17705
|
+
meetingId: r.get("id"),
|
|
17706
|
+
title: r.get("title"),
|
|
17707
|
+
startsAt: r.get("startsAt"),
|
|
17708
|
+
endsAt: r.get("endsAt"),
|
|
17709
|
+
location: r.get("location"),
|
|
17710
|
+
isAllDay: r.get("isAllDay"),
|
|
17711
|
+
kind: "meeting",
|
|
17712
|
+
attendees: normalizeAttendees(r.get("attendees"))
|
|
17713
|
+
};
|
|
17714
|
+
return c.json({ meeting });
|
|
17715
|
+
} catch (err) {
|
|
17716
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
17717
|
+
console.error(`[calendar-edit] op=fail err="${message}"`);
|
|
17718
|
+
return c.json({ error: `Edit failed: ${message}` }, 503);
|
|
17719
|
+
} finally {
|
|
17720
|
+
await session.close();
|
|
17721
|
+
}
|
|
17722
|
+
});
|
|
17723
|
+
app43.delete("/meetings/:id", requireAdminSession, async (c) => {
|
|
17724
|
+
const cacheKey = c.var.cacheKey;
|
|
17725
|
+
const accountId = getAccountIdForSession(cacheKey);
|
|
17726
|
+
if (!accountId) {
|
|
17727
|
+
console.error('[calendar] op=admin-delete auth-rejected reason="no account for session"');
|
|
17728
|
+
return c.json({ error: "Account not found for session" }, 401);
|
|
17729
|
+
}
|
|
17730
|
+
const id = c.req.param("id");
|
|
17731
|
+
const session = getSession();
|
|
17732
|
+
try {
|
|
17733
|
+
const res = await session.run(
|
|
17734
|
+
`MATCH (m:Meeting {accountId: $accountId})
|
|
17735
|
+
WHERE elementId(m) = $id
|
|
17736
|
+
WITH m, m.uid AS uid
|
|
17737
|
+
DETACH DELETE m
|
|
17738
|
+
RETURN uid`,
|
|
17739
|
+
{ accountId, id }
|
|
17740
|
+
);
|
|
17741
|
+
const found = res.records.length > 0;
|
|
17742
|
+
const uid = found ? res.records[0].get("uid") : null;
|
|
17743
|
+
console.log(`[calendar-delete] account=${accountId.slice(0, 8)} uid=${uid ?? "absent"} found=${found ? 1 : 0}`);
|
|
17744
|
+
return c.json({ found });
|
|
17745
|
+
} catch (err) {
|
|
17746
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
17747
|
+
console.error(`[calendar-delete] op=fail err="${message}"`);
|
|
17748
|
+
return c.json({ error: `Delete failed: ${message}` }, 503);
|
|
17749
|
+
} finally {
|
|
17750
|
+
await session.close();
|
|
17751
|
+
}
|
|
17752
|
+
});
|
|
17649
17753
|
var calendar_default = app43;
|
|
17650
17754
|
|
|
17651
17755
|
// server/routes/admin/index.ts
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{o as e}from"./chunk-CAM3fms7.js";import{A as t,B as n,C as r,I as i,R as a,U as o,V as s,v as c}from"./OperatorConversations-dt0q8mjv.js";import{g as l,t as u}from"./AdminShell-DnhBRZv5.js";var d=a(`calendar`,[[`path`,{d:`M8 2v4`,key:`1cmpym`}],[`path`,{d:`M16 2v4`,key:`4m81vk`}],[`rect`,{width:`18`,height:`18`,x:`3`,y:`4`,rx:`2`,key:`1hopcy`}],[`path`,{d:`M3 10h18`,key:`8toen8`}]]),f=a(`chevron-right`,[[`path`,{d:`m9 18 6-6-6-6`,key:`mthhwq`}]]),p=s(),m=e(o(),1);function h(e){return new Date(e.getFullYear(),e.getMonth(),e.getDate())}function g(e,t){let n=new Date(e);return n.setDate(n.getDate()+t),n}function _(e){let t=h(e),n=t.getDay();return g(t,n===0?-6:1-n)}function v(e){let t=_(e);return Array.from({length:7},(e,n)=>g(t,n))}function y(e){let t=_(new Date(e.getFullYear(),e.getMonth(),1));return Array.from({length:42},(e,n)=>g(t,n))}function b(){return Array.from({length:24},(e,t)=>t)}function x(e){let t=e.getFullYear();return Array.from({length:12},(e,n)=>new Date(t,n,1))}function S(e,t){switch(e){case`day`:{let e=h(t);return{from:e,to:g(e,1)}}case`week`:{let e=_(t);return{from:e,to:g(e,7)}}case`month`:{let e=_(new Date(t.getFullYear(),t.getMonth(),1));return{from:e,to:g(e,42)}}case`year`:return{from:new Date(t.getFullYear(),0,1),to:new Date(t.getFullYear()+1,0,1)}}}function C(e,t,n){switch(e){case`day`:return g(t,n);case`week`:return g(t,n*7);case`month`:return new Date(t.getFullYear(),t.getMonth()+n,1);case`year`:return new Date(t.getFullYear()+n,t.getMonth(),1)}}function w(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate()}var T=r(),E=[`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`,`Sun`],D=3;function O(e){return e.toLocaleTimeString([],{hour:`numeric`,minute:`2-digit`})}function k({anchor:e,meetings:t}){let n=y(e),r=e.getMonth(),i=new Date;return(0,T.jsxs)(`div`,{className:`cal-month`,children:[(0,T.jsx)(`div`,{className:`cal-weekday-row`,children:E.map(e=>(0,T.jsx)(`div`,{className:`cal-weekday`,children:e},e))}),(0,T.jsx)(`div`,{className:`cal-month-grid`,children:n.map(e=>{let n=t.filter(t=>w(new Date(t.startsAt),e)).sort((e,t)=>e.startsAt.localeCompare(t.startsAt)),a=e.getMonth()!==r,o=w(e,i);return(0,T.jsxs)(`div`,{className:`cal-cell${a?` cal-cell-out`:``}${o?` cal-cell-today`:``}`,children:[(0,T.jsx)(`div`,{className:`cal-cell-num`,children:e.getDate()}),n.slice(0,D).map(e=>(0,T.jsxs)(`div`,{className:`cal-chip`,title:e.title??`Untitled`,children:[!e.isAllDay&&(0,T.jsx)(`span`,{className:`cal-chip-time`,children:O(new Date(e.startsAt))}),e.title??`Untitled`]},e.meetingId)),n.length>D&&(0,T.jsxs)(`div`,{className:`cal-more`,children:[`+`,n.length-D,` more`]})]},e.toISOString())})})]})}var A=1440,j=1.8;function M(e){return e.getHours()*60+e.getMinutes()}function N(e){return e.toLocaleTimeString([],{hour:`numeric`,minute:`2-digit`})}function P({day:e,meetings:t,hourHeight:n}){let r=n*24,i=t.filter(t=>!t.isAllDay&&w(new Date(t.startsAt),e));return(0,T.jsx)(`div`,{className:`cal-day-col`,children:(0,T.jsxs)(`div`,{className:`cal-hours`,style:{height:`${r}px`},children:[Array.from({length:24},(e,t)=>(0,T.jsx)(`div`,{className:`cal-hour-line`,style:{top:`${t*n}px`}},t)),i.map(t=>{let n=new Date(t.startsAt),r=t.endsAt?new Date(t.endsAt):new Date(n.getTime()+30*6e4),i=M(n),a=w(r,e)?M(r):A,o=i/A*100,s=Math.max((a-i)/A*100,j);return(0,T.jsxs)(`div`,{className:`cal-event`,style:{top:`${o}%`,height:`${s}%`},title:t.title??`Untitled`,children:[(0,T.jsx)(`span`,{className:`cal-event-time`,children:N(n)}),(0,T.jsx)(`span`,{className:`cal-event-title`,children:t.title??`Untitled`})]},t.meetingId)})]})})}var F=44;function I(e){let t=new Date;return t.setHours(e,0,0,0),t.toLocaleTimeString([],{hour:`numeric`})}function L({anchor:e,meetings:t}){let n=v(e),r=new Date;return(0,T.jsxs)(`div`,{className:`cal-timed`,children:[(0,T.jsxs)(`div`,{className:`cal-day-headrow`,children:[(0,T.jsx)(`div`,{className:`cal-timed-gutter`}),n.map(e=>(0,T.jsxs)(`div`,{className:`cal-day-head${w(e,r)?` cal-day-head-today`:``}`,children:[(0,T.jsx)(`span`,{className:`cal-day-head-name`,children:e.toLocaleDateString([],{weekday:`short`})}),(0,T.jsx)(`span`,{className:`cal-day-head-num`,children:e.getDate()})]},e.toISOString()))]}),(0,T.jsxs)(`div`,{className:`cal-allday-band`,children:[(0,T.jsx)(`div`,{className:`cal-timed-gutter`,children:`All-day`}),n.map(e=>(0,T.jsx)(`div`,{className:`cal-allday-cell`,children:t.filter(t=>t.isAllDay&&w(new Date(t.startsAt),e)).map(e=>(0,T.jsx)(`div`,{className:`cal-allday-chip`,title:e.title??`Untitled`,children:e.title??`Untitled`},e.meetingId))},e.toISOString()))]}),(0,T.jsxs)(`div`,{className:`cal-timed-cols`,children:[(0,T.jsx)(`div`,{className:`cal-timed-gutter`,children:b().map(e=>(0,T.jsx)(`div`,{className:`cal-hour-label`,style:{height:`${F}px`},children:e===0?``:I(e)},e))}),n.map(e=>(0,T.jsx)(P,{day:e,meetings:t,hourHeight:F},e.toISOString()))]})]})}var R=52;function z(e){let t=new Date;return t.setHours(e,0,0,0),t.toLocaleTimeString([],{hour:`numeric`})}function B({anchor:e,meetings:t}){let n=t.filter(t=>t.isAllDay&&w(new Date(t.startsAt),e));return(0,T.jsxs)(`div`,{className:`cal-timed cal-timed-single`,children:[(0,T.jsxs)(`div`,{className:`cal-allday-band`,children:[(0,T.jsx)(`div`,{className:`cal-timed-gutter`,children:`All-day`}),(0,T.jsx)(`div`,{className:`cal-allday-cell`,children:n.map(e=>(0,T.jsx)(`div`,{className:`cal-allday-chip`,title:e.title??`Untitled`,children:e.title??`Untitled`},e.meetingId))})]}),(0,T.jsxs)(`div`,{className:`cal-timed-cols`,children:[(0,T.jsx)(`div`,{className:`cal-timed-gutter`,children:b().map(e=>(0,T.jsx)(`div`,{className:`cal-hour-label`,style:{height:`${R}px`},children:e===0?``:z(e)},e))}),(0,T.jsx)(P,{day:e,meetings:t,hourHeight:R})]})]})}var V=[`M`,`T`,`W`,`T`,`F`,`S`,`S`];function H(e){return`${e.getFullYear()}-${e.getMonth()}-${e.getDate()}`}function U({anchor:e,meetings:t,onPickMonth:n}){let r=new Date,i=new Set(t.map(e=>H(new Date(e.startsAt))));return(0,T.jsx)(`div`,{className:`cal-year`,children:(0,T.jsx)(`div`,{className:`cal-year-grid`,children:x(e).map(e=>{let t=y(e),a=e.getMonth();return(0,T.jsxs)(`button`,{type:`button`,className:`cal-mini`,onClick:()=>n(e),title:e.toLocaleDateString([],{month:`long`,year:`numeric`}),children:[(0,T.jsx)(`div`,{className:`cal-mini-title`,children:e.toLocaleDateString([],{month:`long`})}),(0,T.jsx)(`div`,{className:`cal-mini-weekrow`,children:V.map((e,t)=>(0,T.jsx)(`span`,{className:`cal-mini-weekday`,children:e},t))}),(0,T.jsx)(`div`,{className:`cal-mini-grid`,children:t.map(e=>{let t=e.getMonth()!==a,n=w(e,r),o=!t&&i.has(H(e));return(0,T.jsxs)(`span`,{className:`cal-mini-day${t?` cal-mini-day-out`:``}${n?` cal-mini-day-today`:``}`,children:[e.getDate(),o&&(0,T.jsx)(`span`,{className:`cal-mini-dot`})]},e.toISOString())})})]},a)})})})}var W=`maxy-admin-session-key`,G=[`day`,`week`,`month`,`year`];function K(e,t){switch(e){case`day`:return t.toLocaleDateString([],{weekday:`long`,day:`numeric`,month:`long`,year:`numeric`});case`week`:{let{from:e,to:n}=S(`week`,t),r=new Date(n.getTime()-1);return`${e.toLocaleDateString([],{day:`numeric`,month:`short`})} – ${r.toLocaleDateString([],{day:`numeric`,month:`short`,year:`numeric`})}`}case`month`:return t.toLocaleDateString([],{month:`long`,year:`numeric`});case`year`:return String(t.getFullYear())}}function q(){let[e,n]=(0,m.useState)(null),[r,i]=(0,m.useState)(!1),[a,o]=(0,m.useState)(void 0),[s,d]=(0,m.useState)(null),[f,p]=(0,m.useState)(void 0),[h,g]=(0,m.useState)(null),[_,v]=(0,m.useState)(null);(0,m.useEffect)(()=>{let e=!1,t=null;try{t=sessionStorage.getItem(W)}catch{}if(!t){i(!0);return}return fetch(`/api/admin/session?session_key=${encodeURIComponent(t)}`).then(async r=>{if(!e){if(r.status===401){try{sessionStorage.removeItem(W)}catch{}window.location.href=`/`;return}if(r.ok)try{let e=await r.json();typeof e.businessName==`string`&&o(e.businessName),e.sessionId!==void 0&&d(e.sessionId??null),v(e.role??null),p(e.userName===void 0?null:e.userName),g(e.avatar??null)}catch{}n(t),i(!0)}}).catch(()=>{e||(n(t),i(!0))}),()=>{e=!0}},[]);let y=(0,m.useCallback)(()=>{try{sessionStorage.removeItem(W)}catch{}window.location.href=`/`},[]),[b,x]=(0,m.useState)(!1),S=(0,m.useCallback)(async()=>{x(!0);try{let e=await l();if(e){try{sessionStorage.removeItem(W)}catch{}window.location.href=`/`}return e}finally{x(!1)}},[]);return r?e?(0,T.jsx)(c,{cacheKey:e,surface:`calendar`,onSessionExpired:({code:e,path:t})=>{console.warn(`[admin-auth] outcome=session-expired-redirect code=${e} path=${t} surface=calendar`);try{sessionStorage.removeItem(W)}catch{}window.location.href=`/`},children:(0,T.jsx)(u,{cacheKey:e,businessName:a,sessionId:s,onLogout:y,onDisconnect:S,disconnecting:b,userName:f,userAvatar:h,role:_,children:(0,T.jsx)(J,{cacheKey:e})})}):(0,T.jsx)(`div`,{className:`cal-page`,children:(0,T.jsxs)(`div`,{className:`cal-empty`,children:[(0,T.jsx)(`p`,{children:`You are not signed in.`}),(0,T.jsxs)(`p`,{children:[`Open the `,(0,T.jsx)(`a`,{href:`/`,className:`cal-link`,children:`main admin page`}),` and log in, then return here.`]})]})}):(0,T.jsx)(`div`,{className:`cal-page`,children:(0,T.jsxs)(`div`,{className:`cal-loading`,children:[(0,T.jsx)(t,{size:18,className:`spin`}),` Loading…`]})})}function J({cacheKey:e}){let{adminFetch:r,sessionRefetchNonce:a}=n({initialCacheKey:e,surface:`calendar`}),[o,s]=(0,m.useState)(`month`),[c,l]=(0,m.useState)(()=>new Date),[u,p]=(0,m.useState)([]),[h,g]=(0,m.useState)(!1),[_,v]=(0,m.useState)(null);(0,m.useEffect)(()=>{let e=!1,{from:t,to:n}=S(o,c);return g(!0),v(null),r(`/api/admin/calendar/meetings?from=${encodeURIComponent(t.toISOString())}&to=${encodeURIComponent(n.toISOString())}`).then(async t=>{if(e)return;if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();p(Array.isArray(n.meetings)?n.meetings:[])}).catch(t=>{e||(v(t instanceof Error?t.message:`Failed to load`),p([]))}).finally(()=>{e||g(!1)}),()=>{e=!0}},[o,c,a,r]);let y=(0,m.useCallback)(()=>l(new Date),[]),b=(0,m.useCallback)(()=>l(e=>C(o,e,-1)),[o]),x=(0,m.useCallback)(()=>l(e=>C(o,e,1)),[o]),w=(0,m.useCallback)(e=>{l(e),s(`month`)},[]);return(0,T.jsxs)(`div`,{className:`cal-page`,children:[(0,T.jsxs)(`header`,{className:`cal-header`,children:[(0,T.jsxs)(`div`,{className:`cal-title`,children:[(0,T.jsx)(d,{size:20}),` Calendar`]}),(0,T.jsxs)(`div`,{className:`cal-nav`,children:[(0,T.jsx)(`button`,{type:`button`,className:`cal-today-btn`,onClick:y,children:`Today`}),(0,T.jsx)(`button`,{type:`button`,className:`cal-nav-btn`,onClick:b,"aria-label":`Previous`,children:(0,T.jsx)(i,{size:18})}),(0,T.jsx)(`button`,{type:`button`,className:`cal-nav-btn`,onClick:x,"aria-label":`Next`,children:(0,T.jsx)(f,{size:18})}),(0,T.jsx)(`span`,{className:`cal-range-label`,children:K(o,c)}),h&&(0,T.jsx)(t,{size:16,className:`spin`})]}),(0,T.jsx)(`div`,{className:`cal-views`,children:G.map(e=>(0,T.jsx)(`button`,{type:`button`,className:`cal-view-btn${e===o?` cal-view-btn-active`:``}`,onClick:()=>s(e),children:e.charAt(0).toUpperCase()+e.slice(1)},e))})]}),(0,T.jsxs)(`div`,{className:`cal-body`,children:[_&&(0,T.jsxs)(`div`,{className:`cal-error`,children:[`Could not load the calendar: `,_]}),o===`day`&&(0,T.jsx)(B,{anchor:c,meetings:u}),o===`week`&&(0,T.jsx)(L,{anchor:c,meetings:u}),o===`month`&&(0,T.jsx)(k,{anchor:c,meetings:u}),o===`year`&&(0,T.jsx)(U,{anchor:c,meetings:u,onPickMonth:w})]})]})}(0,p.createRoot)(document.getElementById(`root`)).render((0,T.jsx)(q,{}));
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as e,V as t}from"./OperatorConversations-dt0q8mjv.js";import"./admin-types-Dg11L4MQ.js";import"./AdminShell-DnhBRZv5.js";import{n}from"./page-DzsVxvM6.js";var r=t(),i=e();(0,r.createRoot)(document.getElementById(`root`)).render((0,i.jsx)(n,{}));
|
|
File without changes
|