@datatechsolutions/ui 3.6.1 → 3.7.0
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/dist/astrlabe/graph-node.js +8 -5
- package/dist/astrlabe/graph-node.mjs +4 -1
- package/dist/astrlabe/index.js +115 -114
- package/dist/astrlabe/index.mjs +7 -6
- package/dist/astrlabe/workflow-canvas.js +7 -6
- package/dist/astrlabe/workflow-canvas.mjs +6 -5
- package/dist/{chunk-3Z66NXEB.mjs → chunk-2OPBUVTQ.mjs} +3 -3
- package/dist/{chunk-3Z66NXEB.mjs.map → chunk-2OPBUVTQ.mjs.map} +1 -1
- package/dist/{chunk-4JDJRGAB.mjs → chunk-34XRH2FX.mjs} +5 -4
- package/dist/chunk-34XRH2FX.mjs.map +1 -0
- package/dist/{chunk-KEWRLEYV.js → chunk-3JZGRXSG.js} +4 -4
- package/dist/{chunk-KEWRLEYV.js.map → chunk-3JZGRXSG.js.map} +1 -1
- package/dist/{chunk-JQYDJ75Q.mjs → chunk-3VYD7QL2.mjs} +3 -3
- package/dist/{chunk-JQYDJ75Q.mjs.map → chunk-3VYD7QL2.mjs.map} +1 -1
- package/dist/{chunk-MRRFDIUQ.mjs → chunk-4JRMXHPU.mjs} +5 -4
- package/dist/chunk-4JRMXHPU.mjs.map +1 -0
- package/dist/{chunk-4OFG6POC.mjs → chunk-5LCWQKGQ.mjs} +207 -1128
- package/dist/chunk-5LCWQKGQ.mjs.map +1 -0
- package/dist/{chunk-W5YCZOXO.js → chunk-7YK4WXHO.js} +79 -78
- package/dist/chunk-7YK4WXHO.js.map +1 -0
- package/dist/{chunk-YOJIPZ72.js → chunk-BBLBSDPN.js} +9 -9
- package/dist/{chunk-YOJIPZ72.js.map → chunk-BBLBSDPN.js.map} +1 -1
- package/dist/chunk-BHOT22QL.js +998 -0
- package/dist/chunk-BHOT22QL.js.map +1 -0
- package/dist/{chunk-MQNXKBFP.mjs → chunk-C4AJWDFB.mjs} +7 -6
- package/dist/chunk-C4AJWDFB.mjs.map +1 -0
- package/dist/{chunk-UOABOFKO.mjs → chunk-CBFK4W4C.mjs} +3 -3
- package/dist/{chunk-UOABOFKO.mjs.map → chunk-CBFK4W4C.mjs.map} +1 -1
- package/dist/{chunk-P5F257N3.js → chunk-CVZXZK2X.js} +35 -34
- package/dist/chunk-CVZXZK2X.js.map +1 -0
- package/dist/{chunk-IHHGT3LP.mjs → chunk-CYAAL3BY.mjs} +6 -5
- package/dist/chunk-CYAAL3BY.mjs.map +1 -0
- package/dist/{chunk-LVK7VXW7.js → chunk-DMPBNWJB.js} +37 -36
- package/dist/chunk-DMPBNWJB.js.map +1 -0
- package/dist/{chunk-ESLKQJQS.mjs → chunk-DXLATMGD.mjs} +6 -5
- package/dist/chunk-DXLATMGD.mjs.map +1 -0
- package/dist/{chunk-P4YYEM4B.js → chunk-EZQ2D47U.js} +7 -10
- package/dist/chunk-EZQ2D47U.js.map +1 -0
- package/dist/{chunk-6ZMTJSQF.js → chunk-FUHNEP3Y.js} +164 -163
- package/dist/chunk-FUHNEP3Y.js.map +1 -0
- package/dist/{chunk-YTE6WCBX.js → chunk-JHN2OUWG.js} +64 -63
- package/dist/chunk-JHN2OUWG.js.map +1 -0
- package/dist/{chunk-AMYQSPQC.js → chunk-JLECJI7S.js} +18 -17
- package/dist/chunk-JLECJI7S.js.map +1 -0
- package/dist/{chunk-DRORQGN2.js → chunk-KMNWPC64.js} +40 -39
- package/dist/chunk-KMNWPC64.js.map +1 -0
- package/dist/{chunk-VUAGVZJM.mjs → chunk-NJ6HH4QP.mjs} +6 -5
- package/dist/chunk-NJ6HH4QP.mjs.map +1 -0
- package/dist/{chunk-OZNTQROP.mjs → chunk-PLTLRL2V.mjs} +7 -10
- package/dist/chunk-PLTLRL2V.mjs.map +1 -0
- package/dist/{chunk-5ZAZ2C7A.mjs → chunk-PMMP76MV.mjs} +7 -6
- package/dist/chunk-PMMP76MV.mjs.map +1 -0
- package/dist/{chunk-NJZIE4EH.js → chunk-QF6WL7XU.js} +6 -5
- package/dist/chunk-QF6WL7XU.js.map +1 -0
- package/dist/{chunk-QRNFTG6A.js → chunk-QGLGQXJE.js} +4 -4
- package/dist/{chunk-QRNFTG6A.js.map → chunk-QGLGQXJE.js.map} +1 -1
- package/dist/{chunk-GCYYGSHU.js → chunk-R4EKPXX3.js} +564 -1525
- package/dist/chunk-R4EKPXX3.js.map +1 -0
- package/dist/{chunk-SQZGQOKU.js → chunk-RWYG7QHP.js} +119 -132
- package/dist/chunk-RWYG7QHP.js.map +1 -0
- package/dist/{chunk-WBEZATIB.js → chunk-RZ3NDH5S.js} +13 -13
- package/dist/{chunk-WBEZATIB.js.map → chunk-RZ3NDH5S.js.map} +1 -1
- package/dist/{chunk-HGWVJ3VB.mjs → chunk-SJVKID3E.mjs} +4 -3
- package/dist/chunk-SJVKID3E.mjs.map +1 -0
- package/dist/{chunk-7LILNZMR.mjs → chunk-TJEZL72T.mjs} +4 -3
- package/dist/chunk-TJEZL72T.mjs.map +1 -0
- package/dist/{chunk-MUOTTGCX.js → chunk-UDYEUTJC.js} +31 -30
- package/dist/chunk-UDYEUTJC.js.map +1 -0
- package/dist/{chunk-UGJZ3M4Q.js → chunk-VDLMWOQM.js} +55 -54
- package/dist/chunk-VDLMWOQM.js.map +1 -0
- package/dist/{chunk-KDFBN2L2.mjs → chunk-VZIUQE7B.mjs} +24 -37
- package/dist/chunk-VZIUQE7B.mjs.map +1 -0
- package/dist/chunk-WR55H7DH.mjs +934 -0
- package/dist/chunk-WR55H7DH.mjs.map +1 -0
- package/dist/{chunk-ZYVDDSAC.mjs → chunk-YRXDETBK.mjs} +6 -6
- package/dist/{chunk-ZYVDDSAC.mjs.map → chunk-YRXDETBK.mjs.map} +1 -1
- package/dist/{chunk-VDLAZR7S.mjs → chunk-ZYRL3WER.mjs} +5 -4
- package/dist/chunk-ZYRL3WER.mjs.map +1 -0
- package/dist/index.js +826 -825
- package/dist/index.mjs +4 -3
- package/dist/platform/admin/index.js +13 -12
- package/dist/platform/admin/index.mjs +7 -6
- package/dist/platform/agents-workspace.js +10 -9
- package/dist/platform/agents-workspace.mjs +9 -8
- package/dist/platform/app-shell.js +6 -5
- package/dist/platform/app-shell.mjs +5 -4
- package/dist/platform/auth/index.js +30 -29
- package/dist/platform/auth/index.mjs +7 -6
- package/dist/platform/billing/index.js +6 -5
- package/dist/platform/billing/index.mjs +5 -4
- package/dist/platform/impersonation/index.js +6 -5
- package/dist/platform/impersonation/index.mjs +5 -4
- package/dist/platform/index.d.mts +1 -1
- package/dist/platform/index.d.ts +1 -1
- package/dist/platform/index.js +87 -93
- package/dist/platform/index.js.map +1 -1
- package/dist/platform/index.mjs +23 -29
- package/dist/platform/index.mjs.map +1 -1
- package/dist/platform/pages/index.d.mts +86 -1
- package/dist/platform/pages/index.d.ts +86 -1
- package/dist/platform/pages/index.js +868 -209
- package/dist/platform/pages/index.js.map +1 -1
- package/dist/platform/pages/index.mjs +670 -12
- package/dist/platform/pages/index.mjs.map +1 -1
- package/dist/platform/settings/index.js +10 -9
- package/dist/platform/settings/index.mjs +9 -8
- package/dist/platform/workflow-canvas-shell.js +8 -7
- package/dist/platform/workflow-canvas-shell.mjs +7 -6
- package/package.json +1 -1
- package/dist/chunk-4JDJRGAB.mjs.map +0 -1
- package/dist/chunk-4OFG6POC.mjs.map +0 -1
- package/dist/chunk-5ZAZ2C7A.mjs.map +0 -1
- package/dist/chunk-6ZMTJSQF.js.map +0 -1
- package/dist/chunk-7LILNZMR.mjs.map +0 -1
- package/dist/chunk-AMYQSPQC.js.map +0 -1
- package/dist/chunk-DRORQGN2.js.map +0 -1
- package/dist/chunk-ESLKQJQS.mjs.map +0 -1
- package/dist/chunk-GCYYGSHU.js.map +0 -1
- package/dist/chunk-HGWVJ3VB.mjs.map +0 -1
- package/dist/chunk-IHHGT3LP.mjs.map +0 -1
- package/dist/chunk-KDFBN2L2.mjs.map +0 -1
- package/dist/chunk-LVK7VXW7.js.map +0 -1
- package/dist/chunk-MQNXKBFP.mjs.map +0 -1
- package/dist/chunk-MRRFDIUQ.mjs.map +0 -1
- package/dist/chunk-MUOTTGCX.js.map +0 -1
- package/dist/chunk-NJZIE4EH.js.map +0 -1
- package/dist/chunk-OZNTQROP.mjs.map +0 -1
- package/dist/chunk-P4YYEM4B.js.map +0 -1
- package/dist/chunk-P5F257N3.js.map +0 -1
- package/dist/chunk-SQZGQOKU.js.map +0 -1
- package/dist/chunk-UGJZ3M4Q.js.map +0 -1
- package/dist/chunk-VDLAZR7S.mjs.map +0 -1
- package/dist/chunk-VUAGVZJM.mjs.map +0 -1
- package/dist/chunk-W5YCZOXO.js.map +0 -1
- package/dist/chunk-YTE6WCBX.js.map +0 -1
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
5
|
-
var
|
|
6
|
-
var chunkUZ3CMNUJ_js = require('./chunk-UZ3CMNUJ.js');
|
|
4
|
+
var chunkQGLGQXJE_js = require('./chunk-QGLGQXJE.js');
|
|
5
|
+
var chunkR4EKPXX3_js = require('./chunk-R4EKPXX3.js');
|
|
7
6
|
var chunkYXN2K77G_js = require('./chunk-YXN2K77G.js');
|
|
7
|
+
var chunkBHOT22QL_js = require('./chunk-BHOT22QL.js');
|
|
8
|
+
var chunkUZ3CMNUJ_js = require('./chunk-UZ3CMNUJ.js');
|
|
8
9
|
var react = require('react');
|
|
9
10
|
var outline = require('@heroicons/react/24/outline');
|
|
10
11
|
var jsxRuntime = require('react/jsx-runtime');
|
|
@@ -87,7 +88,7 @@ function AdminUserList({ client, onUserSelect }) {
|
|
|
87
88
|
};
|
|
88
89
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
89
90
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
90
|
-
|
|
91
|
+
chunkR4EKPXX3_js.SectionCard,
|
|
91
92
|
{
|
|
92
93
|
header: {
|
|
93
94
|
icon: /* @__PURE__ */ jsxRuntime.jsx(outline.UsersIcon, { className: "h-5 w-5 text-white" }),
|
|
@@ -98,7 +99,7 @@ function AdminUserList({ client, onUserSelect }) {
|
|
|
98
99
|
padded: false,
|
|
99
100
|
children: [
|
|
100
101
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-b border-gray-200/60 p-4 dark:border-white/10", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
101
|
-
|
|
102
|
+
chunkR4EKPXX3_js.SearchInput,
|
|
102
103
|
{
|
|
103
104
|
value: search,
|
|
104
105
|
onChange: (event) => handleSearch(event.target.value),
|
|
@@ -106,10 +107,10 @@ function AdminUserList({ client, onUserSelect }) {
|
|
|
106
107
|
}
|
|
107
108
|
) }),
|
|
108
109
|
isLoading ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-center gap-2 p-8 text-sm text-gray-500 dark:text-gray-400", children: [
|
|
109
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
110
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.InlineSpinner, {}),
|
|
110
111
|
/* @__PURE__ */ jsxRuntime.jsx("span", { children: t("admin.users.loading") })
|
|
111
112
|
] }) : users.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "p-4 sm:p-6", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
112
|
-
|
|
113
|
+
chunkR4EKPXX3_js.EmptyState,
|
|
113
114
|
{
|
|
114
115
|
message: t("admin.users.emptyMessage"),
|
|
115
116
|
description: t("admin.users.emptyDescription"),
|
|
@@ -134,7 +135,7 @@ function AdminUserList({ client, onUserSelect }) {
|
|
|
134
135
|
children: [
|
|
135
136
|
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
|
|
136
137
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
137
|
-
|
|
138
|
+
chunkR4EKPXX3_js.Avatar,
|
|
138
139
|
{
|
|
139
140
|
src: user.image ?? void 0,
|
|
140
141
|
initials: (user.name ?? user.email).slice(0, 2).toUpperCase(),
|
|
@@ -146,9 +147,9 @@ function AdminUserList({ client, onUserSelect }) {
|
|
|
146
147
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "truncate text-xs text-gray-500 dark:text-gray-400", children: user.email })
|
|
147
148
|
] })
|
|
148
149
|
] }) }),
|
|
149
|
-
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
150
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsxRuntime.jsx(chunkBHOT22QL_js.Badge, { color: roleBadgeColor(user.role), children: user.role }) }),
|
|
150
151
|
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
151
|
-
|
|
152
|
+
chunkR4EKPXX3_js.StatusBadge,
|
|
152
153
|
{
|
|
153
154
|
status: user.status === "active" ? "active" : "inactive",
|
|
154
155
|
label: user.status,
|
|
@@ -161,7 +162,7 @@ function AdminUserList({ client, onUserSelect }) {
|
|
|
161
162
|
] }) }),
|
|
162
163
|
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "hidden px-4 py-3 text-gray-500 dark:text-gray-400 md:table-cell", children: user.lastLoginAt ? format.relativeTime(new Date(user.lastLoginAt)) : t("admin.users.neverLoggedIn") }),
|
|
163
164
|
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-3 text-right", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
164
|
-
|
|
165
|
+
chunkBHOT22QL_js.Button,
|
|
165
166
|
{
|
|
166
167
|
size: "sm",
|
|
167
168
|
color: "ios-glass-red",
|
|
@@ -181,7 +182,7 @@ function AdminUserList({ client, onUserSelect }) {
|
|
|
181
182
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-gray-500 dark:text-gray-400", children: t("admin.users.pagination", { current: currentPage, total: totalPages, count: total }) }),
|
|
182
183
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-2", children: [
|
|
183
184
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
184
|
-
|
|
185
|
+
chunkBHOT22QL_js.Button,
|
|
185
186
|
{
|
|
186
187
|
size: "sm",
|
|
187
188
|
outline: true,
|
|
@@ -191,7 +192,7 @@ function AdminUserList({ client, onUserSelect }) {
|
|
|
191
192
|
}
|
|
192
193
|
),
|
|
193
194
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
194
|
-
|
|
195
|
+
chunkBHOT22QL_js.Button,
|
|
195
196
|
{
|
|
196
197
|
size: "sm",
|
|
197
198
|
outline: true,
|
|
@@ -207,7 +208,7 @@ function AdminUserList({ client, onUserSelect }) {
|
|
|
207
208
|
}
|
|
208
209
|
),
|
|
209
210
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
210
|
-
|
|
211
|
+
chunkR4EKPXX3_js.DynamicIslandConfirm,
|
|
211
212
|
{
|
|
212
213
|
open: deleteTarget !== null,
|
|
213
214
|
onClose: handleDeleteCancel,
|
|
@@ -274,7 +275,7 @@ function AdminUserForm({
|
|
|
274
275
|
}
|
|
275
276
|
}, [email, name, password, selectedRole, onSubmit, onClose, resetForm, t]);
|
|
276
277
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
277
|
-
|
|
278
|
+
chunkR4EKPXX3_js.GlassModal,
|
|
278
279
|
{
|
|
279
280
|
open,
|
|
280
281
|
onClose: handleClose,
|
|
@@ -292,7 +293,7 @@ function AdminUserForm({
|
|
|
292
293
|
className: "space-y-4 p-4 sm:p-6",
|
|
293
294
|
children: [
|
|
294
295
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
295
|
-
|
|
296
|
+
chunkR4EKPXX3_js.Input,
|
|
296
297
|
{
|
|
297
298
|
label: t("admin.userForm.emailLabel"),
|
|
298
299
|
type: "email",
|
|
@@ -305,7 +306,7 @@ function AdminUserForm({
|
|
|
305
306
|
}
|
|
306
307
|
),
|
|
307
308
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
308
|
-
|
|
309
|
+
chunkR4EKPXX3_js.Input,
|
|
309
310
|
{
|
|
310
311
|
label: t("admin.userForm.nameLabel"),
|
|
311
312
|
value: name,
|
|
@@ -316,7 +317,7 @@ function AdminUserForm({
|
|
|
316
317
|
}
|
|
317
318
|
),
|
|
318
319
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
319
|
-
|
|
320
|
+
chunkR4EKPXX3_js.PasswordInput,
|
|
320
321
|
{
|
|
321
322
|
label: t("admin.userForm.passwordLabel"),
|
|
322
323
|
value: password,
|
|
@@ -326,7 +327,7 @@ function AdminUserForm({
|
|
|
326
327
|
autoComplete: "new-password"
|
|
327
328
|
}
|
|
328
329
|
),
|
|
329
|
-
password && /* @__PURE__ */ jsxRuntime.jsx(
|
|
330
|
+
password && /* @__PURE__ */ jsxRuntime.jsx(chunkQGLGQXJE_js.PasswordStrengthMeter, { password }),
|
|
330
331
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
331
332
|
/* @__PURE__ */ jsxRuntime.jsx("label", { className: "mb-1.5 block text-sm font-medium text-gray-900 dark:text-white", children: t("admin.userForm.roleLabel") }),
|
|
332
333
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-3 gap-2 sm:grid-cols-4", children: roles.map((role) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -346,7 +347,7 @@ function AdminUserForm({
|
|
|
346
347
|
error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-red-600 dark:text-red-400", role: "alert", children: error }),
|
|
347
348
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-3 pt-2", children: [
|
|
348
349
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
349
|
-
|
|
350
|
+
chunkBHOT22QL_js.Button,
|
|
350
351
|
{
|
|
351
352
|
type: "button",
|
|
352
353
|
outline: true,
|
|
@@ -357,7 +358,7 @@ function AdminUserForm({
|
|
|
357
358
|
}
|
|
358
359
|
),
|
|
359
360
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
360
|
-
|
|
361
|
+
chunkBHOT22QL_js.Button,
|
|
361
362
|
{
|
|
362
363
|
type: "submit",
|
|
363
364
|
color: "ios-glass-blue",
|
|
@@ -437,7 +438,7 @@ function AdminOrganizationList({ client, onOrganizationSelect }) {
|
|
|
437
438
|
}, []);
|
|
438
439
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
439
440
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
440
|
-
|
|
441
|
+
chunkR4EKPXX3_js.SectionCard,
|
|
441
442
|
{
|
|
442
443
|
header: {
|
|
443
444
|
icon: /* @__PURE__ */ jsxRuntime.jsx(outline.BuildingOffice2Icon, { className: "h-5 w-5 text-white" }),
|
|
@@ -448,7 +449,7 @@ function AdminOrganizationList({ client, onOrganizationSelect }) {
|
|
|
448
449
|
padded: false,
|
|
449
450
|
children: [
|
|
450
451
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-b border-gray-200/60 p-4 dark:border-white/10", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
451
|
-
|
|
452
|
+
chunkR4EKPXX3_js.SearchInput,
|
|
452
453
|
{
|
|
453
454
|
value: search,
|
|
454
455
|
onChange: (event) => setSearch(event.target.value),
|
|
@@ -456,10 +457,10 @@ function AdminOrganizationList({ client, onOrganizationSelect }) {
|
|
|
456
457
|
}
|
|
457
458
|
) }),
|
|
458
459
|
isLoading ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-center gap-2 p-8 text-sm text-gray-500 dark:text-gray-400", children: [
|
|
459
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
460
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.InlineSpinner, {}),
|
|
460
461
|
/* @__PURE__ */ jsxRuntime.jsx("span", { children: t("admin.organizations.loading") })
|
|
461
462
|
] }) : filteredOrganizations.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "p-4 sm:p-6", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
462
|
-
|
|
463
|
+
chunkR4EKPXX3_js.EmptyState,
|
|
463
464
|
{
|
|
464
465
|
message: t("admin.organizations.emptyMessage"),
|
|
465
466
|
description: t("admin.organizations.emptyDescription"),
|
|
@@ -486,7 +487,7 @@ function AdminOrganizationList({ client, onOrganizationSelect }) {
|
|
|
486
487
|
] }),
|
|
487
488
|
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "hidden px-4 py-3 text-gray-500 dark:text-gray-400 sm:table-cell", children: organization.displayName ?? "\u2014" }),
|
|
488
489
|
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
489
|
-
|
|
490
|
+
chunkR4EKPXX3_js.StatusBadge,
|
|
490
491
|
{
|
|
491
492
|
status: organization.enabled ? "active" : "inactive",
|
|
492
493
|
label: organization.enabled ? t("admin.organizations.statusEnabled") : t("admin.organizations.statusDisabled"),
|
|
@@ -499,7 +500,7 @@ function AdminOrganizationList({ client, onOrganizationSelect }) {
|
|
|
499
500
|
day: "numeric"
|
|
500
501
|
}) }),
|
|
501
502
|
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-3 text-right", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
502
|
-
|
|
503
|
+
chunkBHOT22QL_js.Button,
|
|
503
504
|
{
|
|
504
505
|
size: "sm",
|
|
505
506
|
color: "ios-glass-red",
|
|
@@ -519,7 +520,7 @@ function AdminOrganizationList({ client, onOrganizationSelect }) {
|
|
|
519
520
|
}
|
|
520
521
|
),
|
|
521
522
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
522
|
-
|
|
523
|
+
chunkR4EKPXX3_js.DynamicIslandConfirm,
|
|
523
524
|
{
|
|
524
525
|
open: deleteTarget !== null,
|
|
525
526
|
onClose: handleDeleteCancel,
|
|
@@ -599,7 +600,7 @@ function AdminOrganizationForm({
|
|
|
599
600
|
}
|
|
600
601
|
}, [name, displayName, description, isEditing, onSubmit, onClose, t]);
|
|
601
602
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
602
|
-
|
|
603
|
+
chunkR4EKPXX3_js.GlassModal,
|
|
603
604
|
{
|
|
604
605
|
open,
|
|
605
606
|
onClose: handleClose,
|
|
@@ -617,7 +618,7 @@ function AdminOrganizationForm({
|
|
|
617
618
|
className: "space-y-4 p-4 sm:p-6",
|
|
618
619
|
children: [
|
|
619
620
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
620
|
-
|
|
621
|
+
chunkR4EKPXX3_js.Input,
|
|
621
622
|
{
|
|
622
623
|
label: t("admin.organizationForm.nameLabel"),
|
|
623
624
|
value: name,
|
|
@@ -628,7 +629,7 @@ function AdminOrganizationForm({
|
|
|
628
629
|
}
|
|
629
630
|
),
|
|
630
631
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
631
|
-
|
|
632
|
+
chunkR4EKPXX3_js.Input,
|
|
632
633
|
{
|
|
633
634
|
label: t("admin.organizationForm.displayNameLabel"),
|
|
634
635
|
value: displayName,
|
|
@@ -638,7 +639,7 @@ function AdminOrganizationForm({
|
|
|
638
639
|
}
|
|
639
640
|
),
|
|
640
641
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
641
|
-
|
|
642
|
+
chunkR4EKPXX3_js.Input,
|
|
642
643
|
{
|
|
643
644
|
label: t("admin.organizationForm.descriptionLabel"),
|
|
644
645
|
value: description,
|
|
@@ -650,7 +651,7 @@ function AdminOrganizationForm({
|
|
|
650
651
|
error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-red-600 dark:text-red-400", role: "alert", children: error }),
|
|
651
652
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-3 pt-2", children: [
|
|
652
653
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
653
|
-
|
|
654
|
+
chunkBHOT22QL_js.Button,
|
|
654
655
|
{
|
|
655
656
|
type: "button",
|
|
656
657
|
outline: true,
|
|
@@ -661,7 +662,7 @@ function AdminOrganizationForm({
|
|
|
661
662
|
}
|
|
662
663
|
),
|
|
663
664
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
664
|
-
|
|
665
|
+
chunkBHOT22QL_js.Button,
|
|
665
666
|
{
|
|
666
667
|
type: "submit",
|
|
667
668
|
color: "ios-glass-blue",
|
|
@@ -818,14 +819,14 @@ function AdminPermissionList({ client }) {
|
|
|
818
819
|
}, []);
|
|
819
820
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
820
821
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
821
|
-
|
|
822
|
+
chunkR4EKPXX3_js.SectionCard,
|
|
822
823
|
{
|
|
823
824
|
header: {
|
|
824
825
|
icon: /* @__PURE__ */ jsxRuntime.jsx(outline.KeyIcon, { className: "h-5 w-5 text-white" }),
|
|
825
826
|
title: t("admin.permissions.title"),
|
|
826
827
|
subtitle: t("admin.permissions.subtitle"),
|
|
827
828
|
gradient: "from-violet-500 via-purple-500 to-pink-500",
|
|
828
|
-
rightContent: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
829
|
+
rightContent: /* @__PURE__ */ jsxRuntime.jsxs(chunkBHOT22QL_js.Button, { size: "sm", color: "ios-glass-blue", onClick: handleOpenCreate, children: [
|
|
829
830
|
/* @__PURE__ */ jsxRuntime.jsx(outline.PlusIcon, { className: "mr-1 h-3.5 w-3.5" }),
|
|
830
831
|
t("admin.permissions.createButton")
|
|
831
832
|
] })
|
|
@@ -833,7 +834,7 @@ function AdminPermissionList({ client }) {
|
|
|
833
834
|
padded: false,
|
|
834
835
|
children: [
|
|
835
836
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-b border-gray-200/60 p-4 dark:border-white/10", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
836
|
-
|
|
837
|
+
chunkR4EKPXX3_js.SearchInput,
|
|
837
838
|
{
|
|
838
839
|
value: search,
|
|
839
840
|
onChange: (event) => setSearch(event.target.value),
|
|
@@ -841,10 +842,10 @@ function AdminPermissionList({ client }) {
|
|
|
841
842
|
}
|
|
842
843
|
) }),
|
|
843
844
|
isLoading ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-center gap-2 p-8 text-sm text-gray-500 dark:text-gray-400", children: [
|
|
844
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
845
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.InlineSpinner, {}),
|
|
845
846
|
/* @__PURE__ */ jsxRuntime.jsx("span", { children: t("admin.permissions.loading") })
|
|
846
847
|
] }) : filteredPermissions.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "p-4 sm:p-6", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
847
|
-
|
|
848
|
+
chunkR4EKPXX3_js.EmptyState,
|
|
848
849
|
{
|
|
849
850
|
message: t("admin.permissions.emptyMessage"),
|
|
850
851
|
description: t("admin.permissions.emptyDescription"),
|
|
@@ -868,8 +869,8 @@ function AdminPermissionList({ client }) {
|
|
|
868
869
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-medium text-gray-900 dark:text-white", children: permission.name }),
|
|
869
870
|
permission.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-0.5 truncate text-xs text-gray-500 dark:text-gray-400", children: permission.description })
|
|
870
871
|
] }) }),
|
|
871
|
-
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "hidden px-4 py-3 sm:table-cell", children: permission.resource ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
872
|
-
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "hidden px-4 py-3 sm:table-cell", children: permission.action ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
872
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "hidden px-4 py-3 sm:table-cell", children: permission.resource ? /* @__PURE__ */ jsxRuntime.jsx(chunkBHOT22QL_js.Badge, { color: "blue", children: permission.resource }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-gray-400 dark:text-gray-500", children: "\u2014" }) }),
|
|
873
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "hidden px-4 py-3 sm:table-cell", children: permission.action ? /* @__PURE__ */ jsxRuntime.jsx(chunkBHOT22QL_js.Badge, { color: "amber", children: permission.action }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-gray-400 dark:text-gray-500", children: "\u2014" }) }),
|
|
873
874
|
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "hidden px-4 py-3 text-gray-500 dark:text-gray-400 md:table-cell", children: format.dateTime(new Date(permission.createdAt), {
|
|
874
875
|
year: "numeric",
|
|
875
876
|
month: "short",
|
|
@@ -877,7 +878,7 @@ function AdminPermissionList({ client }) {
|
|
|
877
878
|
}) }),
|
|
878
879
|
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-4 py-3 text-right", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-1", children: [
|
|
879
880
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
880
|
-
|
|
881
|
+
chunkBHOT22QL_js.Button,
|
|
881
882
|
{
|
|
882
883
|
size: "sm",
|
|
883
884
|
outline: true,
|
|
@@ -886,7 +887,7 @@ function AdminPermissionList({ client }) {
|
|
|
886
887
|
}
|
|
887
888
|
),
|
|
888
889
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
889
|
-
|
|
890
|
+
chunkBHOT22QL_js.Button,
|
|
890
891
|
{
|
|
891
892
|
size: "sm",
|
|
892
893
|
color: "ios-glass-red",
|
|
@@ -901,7 +902,7 @@ function AdminPermissionList({ client }) {
|
|
|
901
902
|
}
|
|
902
903
|
),
|
|
903
904
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
904
|
-
|
|
905
|
+
chunkR4EKPXX3_js.Sheet,
|
|
905
906
|
{
|
|
906
907
|
open: isFormOpen,
|
|
907
908
|
onClose: handleCloseForm,
|
|
@@ -910,7 +911,7 @@ function AdminPermissionList({ client }) {
|
|
|
910
911
|
size: "md",
|
|
911
912
|
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4 p-4 sm:p-6", children: [
|
|
912
913
|
!editingPermission && /* @__PURE__ */ jsxRuntime.jsx(
|
|
913
|
-
|
|
914
|
+
chunkR4EKPXX3_js.Input,
|
|
914
915
|
{
|
|
915
916
|
label: t("admin.permissions.formIdLabel"),
|
|
916
917
|
value: formId,
|
|
@@ -921,7 +922,7 @@ function AdminPermissionList({ client }) {
|
|
|
921
922
|
}
|
|
922
923
|
),
|
|
923
924
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
924
|
-
|
|
925
|
+
chunkR4EKPXX3_js.Input,
|
|
925
926
|
{
|
|
926
927
|
label: t("admin.permissions.formNameLabel"),
|
|
927
928
|
value: formName,
|
|
@@ -932,7 +933,7 @@ function AdminPermissionList({ client }) {
|
|
|
932
933
|
}
|
|
933
934
|
),
|
|
934
935
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
935
|
-
|
|
936
|
+
chunkR4EKPXX3_js.Input,
|
|
936
937
|
{
|
|
937
938
|
label: t("admin.permissions.formDescriptionLabel"),
|
|
938
939
|
value: formDescription,
|
|
@@ -943,7 +944,7 @@ function AdminPermissionList({ client }) {
|
|
|
943
944
|
),
|
|
944
945
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-3", children: [
|
|
945
946
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
946
|
-
|
|
947
|
+
chunkR4EKPXX3_js.Input,
|
|
947
948
|
{
|
|
948
949
|
label: t("admin.permissions.formResourceLabel"),
|
|
949
950
|
value: formResource,
|
|
@@ -953,7 +954,7 @@ function AdminPermissionList({ client }) {
|
|
|
953
954
|
}
|
|
954
955
|
),
|
|
955
956
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
956
|
-
|
|
957
|
+
chunkR4EKPXX3_js.Input,
|
|
957
958
|
{
|
|
958
959
|
label: t("admin.permissions.formActionLabel"),
|
|
959
960
|
value: formAction,
|
|
@@ -966,7 +967,7 @@ function AdminPermissionList({ client }) {
|
|
|
966
967
|
formError && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-red-600 dark:text-red-400", role: "alert", children: formError }),
|
|
967
968
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-3", children: [
|
|
968
969
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
969
|
-
|
|
970
|
+
chunkBHOT22QL_js.Button,
|
|
970
971
|
{
|
|
971
972
|
outline: true,
|
|
972
973
|
onClick: handleCloseForm,
|
|
@@ -976,7 +977,7 @@ function AdminPermissionList({ client }) {
|
|
|
976
977
|
}
|
|
977
978
|
),
|
|
978
979
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
979
|
-
|
|
980
|
+
chunkBHOT22QL_js.Button,
|
|
980
981
|
{
|
|
981
982
|
color: "ios-glass-blue",
|
|
982
983
|
onClick: handleSubmitForm,
|
|
@@ -991,7 +992,7 @@ function AdminPermissionList({ client }) {
|
|
|
991
992
|
}
|
|
992
993
|
),
|
|
993
994
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
994
|
-
|
|
995
|
+
chunkR4EKPXX3_js.DynamicIslandConfirm,
|
|
995
996
|
{
|
|
996
997
|
open: deleteTarget !== null,
|
|
997
998
|
onClose: handleDeleteCancel,
|
|
@@ -1011,5 +1012,5 @@ exports.AdminOrganizationList = AdminOrganizationList;
|
|
|
1011
1012
|
exports.AdminPermissionList = AdminPermissionList;
|
|
1012
1013
|
exports.AdminUserForm = AdminUserForm;
|
|
1013
1014
|
exports.AdminUserList = AdminUserList;
|
|
1014
|
-
//# sourceMappingURL=chunk-
|
|
1015
|
-
//# sourceMappingURL=chunk-
|
|
1015
|
+
//# sourceMappingURL=chunk-VDLMWOQM.js.map
|
|
1016
|
+
//# sourceMappingURL=chunk-VDLMWOQM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/platform/admin/admin-user-list.tsx","../src/platform/admin/admin-user-form.tsx","../src/platform/admin/admin-organization-list.tsx","../src/platform/admin/admin-organization-form.tsx","../src/platform/admin/admin-permission-list.tsx"],"names":["useTranslations","useFormatter","useState","useCallback","useEffect","triggerHaptic","jsxs","Fragment","SectionCard","jsx","UsersIcon","SearchInput","InlineSpinner","EmptyState","Avatar","Badge","StatusBadge","ShieldCheckIcon","KeyIcon","Button","TrashIcon","DynamicIslandConfirm","GlassModal","UserPlusIcon","Input","PasswordInput","PasswordStrengthMeter","BuildingOffice2Icon","PlusIcon","PencilSquareIcon","Sheet"],"mappings":"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","file":"chunk-VDLMWOQM.js","sourcesContent":["import { useState, useEffect, useCallback } from 'react'\nimport { useTranslations, useFormatter } from '@ui/lib/i18n-context'\nimport {\n SectionCard,\n Button,\n SearchInput,\n Badge,\n StatusBadge,\n EmptyState,\n InlineSpinner,\n DynamicIslandConfirm,\n Avatar,\n triggerHaptic,\n} from '@ui/index'\nimport {\n UsersIcon,\n PlusIcon,\n TrashIcon,\n KeyIcon,\n ShieldCheckIcon,\n} from '@heroicons/react/24/outline'\n\nexport type { AdminUserListProps } from '@datatechsolutions/shared-domain'\nimport type { AdminUserListProps, AdminUserSummary } from '@datatechsolutions/shared-domain'\n\nconst PAGE_SIZE = 20\n\nexport function AdminUserList({ client, onUserSelect }: AdminUserListProps) {\n const t = useTranslations('windsock')\n const format = useFormatter()\n\n const [users, setUsers] = useState<AdminUserSummary[]>([])\n const [total, setTotal] = useState(0)\n const [isLoading, setIsLoading] = useState(true)\n const [search, setSearch] = useState('')\n const [offset, setOffset] = useState(0)\n const [deleteTarget, setDeleteTarget] = useState<AdminUserSummary | null>(null)\n const [isDeletingUser, setIsDeletingUser] = useState(false)\n\n const fetchUsers = useCallback(async (searchQuery: string, pageOffset: number) => {\n setIsLoading(true)\n try {\n const result = await client.listUsers({\n search: searchQuery || undefined,\n limit: PAGE_SIZE,\n offset: pageOffset,\n })\n setUsers(result.items)\n setTotal(result.total)\n } catch {\n // Fail gracefully — show empty state\n } finally {\n setIsLoading(false)\n }\n }, [client])\n\n useEffect(() => {\n fetchUsers(search, offset)\n }, [fetchUsers, search, offset])\n\n const handleSearch = useCallback((value: string) => {\n setSearch(value)\n setOffset(0)\n }, [])\n\n const handleNextPage = useCallback(() => {\n triggerHaptic('light')\n setOffset((previous) => previous + PAGE_SIZE)\n }, [])\n\n const handlePreviousPage = useCallback(() => {\n triggerHaptic('light')\n setOffset((previous) => Math.max(0, previous - PAGE_SIZE))\n }, [])\n\n const handleDeleteRequest = useCallback((user: AdminUserSummary) => {\n triggerHaptic('warning')\n setDeleteTarget(user)\n }, [])\n\n const handleDeleteConfirm = useCallback(async () => {\n if (!deleteTarget) return\n setIsDeletingUser(true)\n triggerHaptic('medium')\n try {\n await client.deleteUser(deleteTarget.id)\n setDeleteTarget(null)\n triggerHaptic('success')\n fetchUsers(search, offset)\n } catch {\n triggerHaptic('error')\n } finally {\n setIsDeletingUser(false)\n }\n }, [deleteTarget, client, fetchUsers, search, offset])\n\n const handleDeleteCancel = useCallback(() => {\n triggerHaptic('light')\n setDeleteTarget(null)\n }, [])\n\n const handleUserClick = useCallback((user: AdminUserSummary) => {\n triggerHaptic('light')\n onUserSelect?.(user)\n }, [onUserSelect])\n\n const totalPages = Math.ceil(total / PAGE_SIZE)\n const currentPage = Math.floor(offset / PAGE_SIZE) + 1\n\n const roleBadgeColor = (role: string) => {\n if (role === 'owner' || role === 'super_admin') return 'purple' as const\n if (role === 'admin') return 'blue' as const\n if (role === 'manager') return 'amber' as const\n return 'zinc' as const\n }\n\n return (\n <>\n <SectionCard\n header={{\n icon: <UsersIcon className=\"h-5 w-5 text-white\" />,\n title: t('admin.users.title'),\n subtitle: t('admin.users.subtitle'),\n gradient: 'from-blue-500 via-indigo-500 to-violet-500',\n }}\n padded={false}\n >\n {/* Search + filters */}\n <div className=\"border-b border-gray-200/60 p-4 dark:border-white/10\">\n <SearchInput\n value={search}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => handleSearch(event.target.value)}\n placeholder={t('admin.users.searchPlaceholder')}\n />\n </div>\n\n {/* Content */}\n {isLoading ? (\n <div className=\"flex items-center justify-center gap-2 p-8 text-sm text-gray-500 dark:text-gray-400\">\n <InlineSpinner />\n <span>{t('admin.users.loading')}</span>\n </div>\n ) : users.length === 0 ? (\n <div className=\"p-4 sm:p-6\">\n <EmptyState\n message={t('admin.users.emptyMessage')}\n description={t('admin.users.emptyDescription')}\n icon={UsersIcon}\n variant=\"card\"\n />\n </div>\n ) : (\n <>\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-gray-200/60 dark:border-white/10\">\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-gray-500 dark:text-gray-400\">\n {t('admin.users.columnUser')}\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-gray-500 dark:text-gray-400\">\n {t('admin.users.columnRole')}\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-gray-500 dark:text-gray-400\">\n {t('admin.users.columnStatus')}\n </th>\n <th className=\"hidden px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-gray-500 dark:text-gray-400 sm:table-cell\">\n {t('admin.users.columnSecurity')}\n </th>\n <th className=\"hidden px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-gray-500 dark:text-gray-400 md:table-cell\">\n {t('admin.users.columnLastLogin')}\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium uppercase tracking-wide text-gray-500 dark:text-gray-400\">\n {t('admin.users.columnActions')}\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-gray-200/60 dark:divide-white/10\">\n {users.map((user) => (\n <tr\n key={user.id}\n className=\"cursor-pointer transition-colors hover:bg-white/40 dark:hover:bg-white/5\"\n onClick={() => handleUserClick(user)}\n >\n <td className=\"px-4 py-3\">\n <div className=\"flex items-center gap-3\">\n <Avatar\n src={user.image ?? undefined}\n initials={(user.name ?? user.email).slice(0, 2).toUpperCase()}\n alt={user.name ?? user.email}\n />\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-medium text-gray-900 dark:text-white\">\n {user.name ?? user.email}\n </p>\n <p className=\"truncate text-xs text-gray-500 dark:text-gray-400\">\n {user.email}\n </p>\n </div>\n </div>\n </td>\n <td className=\"px-4 py-3\">\n <Badge color={roleBadgeColor(user.role)}>{user.role}</Badge>\n </td>\n <td className=\"px-4 py-3\">\n <StatusBadge\n status={user.status === 'active' ? 'active' : 'inactive'}\n label={user.status}\n size=\"sm\"\n />\n </td>\n <td className=\"hidden px-4 py-3 sm:table-cell\">\n <div className=\"flex items-center gap-2\">\n {user.mfaEnabled && (\n <span title={t('admin.users.mfaEnabled')}>\n <ShieldCheckIcon className=\"h-4 w-4 text-emerald-500\" />\n </span>\n )}\n {user.emailVerified && (\n <span title={t('admin.users.emailVerified')}>\n <KeyIcon className=\"h-4 w-4 text-blue-500\" />\n </span>\n )}\n </div>\n </td>\n <td className=\"hidden px-4 py-3 text-gray-500 dark:text-gray-400 md:table-cell\">\n {user.lastLoginAt\n ? format.relativeTime(new Date(user.lastLoginAt))\n : t('admin.users.neverLoggedIn')}\n </td>\n <td className=\"px-4 py-3 text-right\">\n <Button\n size=\"sm\"\n color=\"ios-glass-red\"\n onClick={(event: React.MouseEvent) => {\n event.stopPropagation()\n handleDeleteRequest(user)\n }}\n >\n <TrashIcon className=\"h-3.5 w-3.5\" />\n </Button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n {/* Pagination */}\n {totalPages > 1 && (\n <div className=\"flex items-center justify-between border-t border-gray-200/60 px-4 py-3 dark:border-white/10\">\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">\n {t('admin.users.pagination', { current: currentPage, total: totalPages, count: total })}\n </p>\n <div className=\"flex gap-2\">\n <Button\n size=\"sm\"\n outline\n onClick={handlePreviousPage}\n disabled={offset === 0}\n >\n {t('admin.users.previousPage')}\n </Button>\n <Button\n size=\"sm\"\n outline\n onClick={handleNextPage}\n disabled={offset + PAGE_SIZE >= total}\n >\n {t('admin.users.nextPage')}\n </Button>\n </div>\n </div>\n )}\n </>\n )}\n </SectionCard>\n\n {/* Delete confirmation */}\n <DynamicIslandConfirm\n open={deleteTarget !== null}\n onClose={handleDeleteCancel}\n onConfirm={handleDeleteConfirm}\n title={t('admin.users.deleteConfirmTitle', { name: deleteTarget?.name ?? deleteTarget?.email ?? '' })}\n icon={<TrashIcon className=\"h-5 w-5 text-white\" />}\n iconBackground=\"bg-ios-red\"\n confirmLabel={t('admin.users.deleteConfirmButton')}\n cancelLabel={t('admin.users.deleteCancelButton')}\n />\n </>\n )\n}\n","import { useState, useCallback } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n GlassModal,\n Input,\n PasswordInput,\n Button,\n triggerHaptic,\n} from '@ui/index'\nimport { UserPlusIcon } from '@heroicons/react/24/outline'\nimport { PasswordStrengthMeter } from '../auth/components'\n\nexport type { AdminUserFormProps } from '@datatechsolutions/shared-domain'\nimport type { AdminUserFormProps, AdminCreateUserInput } from '@datatechsolutions/shared-domain'\nimport type { AppRole } from '@datatechsolutions/shared-domain'\n\nconst DEFAULT_ROLES: AppRole[] = ['viewer', 'member', 'operator', 'analyst', 'manager', 'admin', 'owner']\n\nexport function AdminUserForm({\n open,\n onClose,\n onSubmit,\n roles = DEFAULT_ROLES,\n}: AdminUserFormProps) {\n const t = useTranslations('windsock')\n\n const [email, setEmail] = useState('')\n const [name, setName] = useState('')\n const [password, setPassword] = useState('')\n const [selectedRole, setSelectedRole] = useState<AppRole>('viewer')\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const resetForm = useCallback(() => {\n setEmail('')\n setName('')\n setPassword('')\n setSelectedRole('viewer')\n setError(null)\n }, [])\n\n const handleClose = useCallback(() => {\n resetForm()\n onClose()\n }, [resetForm, onClose])\n\n const handleSubmit = useCallback(async () => {\n if (!email.trim()) {\n setError(t('admin.userForm.errorEmailRequired'))\n triggerHaptic('error')\n return\n }\n\n setError(null)\n setIsSubmitting(true)\n triggerHaptic('light')\n\n try {\n const data: AdminCreateUserInput = {\n email: email.trim().toLowerCase(),\n name: name.trim() || undefined,\n password: password || undefined,\n role: selectedRole,\n }\n\n await onSubmit(data)\n triggerHaptic('success')\n resetForm()\n onClose()\n } catch {\n setError(t('admin.userForm.errorCreateFailed'))\n triggerHaptic('error')\n } finally {\n setIsSubmitting(false)\n }\n }, [email, name, password, selectedRole, onSubmit, onClose, resetForm, t])\n\n return (\n <GlassModal\n open={open}\n onClose={handleClose}\n title={t('admin.userForm.title')}\n subtitle={t('admin.userForm.subtitle')}\n icon={<UserPlusIcon className=\"h-5 w-5 text-white\" />}\n maxWidth=\"md\"\n >\n <form\n onSubmit={(event) => {\n event.preventDefault()\n handleSubmit()\n }}\n className=\"space-y-4 p-4 sm:p-6\"\n >\n <Input\n label={t('admin.userForm.emailLabel')}\n type=\"email\"\n value={email}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setEmail(event.target.value)}\n placeholder={t('admin.userForm.emailPlaceholder')}\n disabled={isSubmitting}\n autoComplete=\"email\"\n autoFocus\n />\n\n <Input\n label={t('admin.userForm.nameLabel')}\n value={name}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setName(event.target.value)}\n placeholder={t('admin.userForm.namePlaceholder')}\n disabled={isSubmitting}\n autoComplete=\"name\"\n />\n\n <PasswordInput\n label={t('admin.userForm.passwordLabel')}\n value={password}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setPassword(event.target.value)}\n placeholder={t('admin.userForm.passwordPlaceholder')}\n disabled={isSubmitting}\n autoComplete=\"new-password\"\n />\n {password && <PasswordStrengthMeter password={password} />}\n\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-gray-900 dark:text-white\">\n {t('admin.userForm.roleLabel')}\n </label>\n <div className=\"grid grid-cols-3 gap-2 sm:grid-cols-4\">\n {roles.map((role) => (\n <button\n key={role}\n type=\"button\"\n onClick={() => {\n setSelectedRole(role)\n triggerHaptic('light')\n }}\n className={`rounded-xl border px-2 py-2 text-xs font-semibold backdrop-blur-xl transition ${\n selectedRole === role\n ? 'border-indigo-400/80 bg-gradient-to-br from-indigo-100/85 via-white/80 to-sky-100/75 text-slate-900 dark:border-indigo-300/70 dark:bg-[linear-gradient(140deg,rgba(99,102,241,0.32)_0%,rgba(30,41,59,0.72)_100%)] dark:text-indigo-100'\n : 'border-white/55 bg-gradient-to-br from-white/82 via-white/66 to-slate-100/62 text-slate-700 hover:from-white/92 hover:to-sky-100/72 dark:border-white/15 dark:bg-[linear-gradient(140deg,rgba(30,41,59,0.72)_0%,rgba(15,23,42,0.62)_100%)] dark:text-slate-100 dark:hover:bg-[linear-gradient(140deg,rgba(51,65,85,0.76)_0%,rgba(30,41,59,0.68)_100%)]'\n }`}\n >\n {role}\n </button>\n ))}\n </div>\n </div>\n\n {error && (\n <p className=\"text-sm text-red-600 dark:text-red-400\" role=\"alert\">{error}</p>\n )}\n\n <div className=\"flex gap-3 pt-2\">\n <Button\n type=\"button\"\n outline\n onClick={handleClose}\n disabled={isSubmitting}\n className=\"flex-1\"\n >\n {t('admin.userForm.cancelButton')}\n </Button>\n <Button\n type=\"submit\"\n color=\"ios-glass-blue\"\n loading={isSubmitting}\n disabled={isSubmitting || !email.trim()}\n className=\"flex-1\"\n >\n {t('admin.userForm.createButton')}\n </Button>\n </div>\n </form>\n </GlassModal>\n )\n}\n","import { useState, useEffect, useCallback } from 'react'\nimport { useTranslations, useFormatter } from '@ui/lib/i18n-context'\nimport {\n SectionCard,\n Button,\n SearchInput,\n StatusBadge,\n EmptyState,\n InlineSpinner,\n DynamicIslandConfirm,\n triggerHaptic,\n} from '@ui/index'\nimport {\n BuildingOffice2Icon,\n TrashIcon,\n} from '@heroicons/react/24/outline'\nimport type { AuthOrganization } from '@datatechsolutions/shared-domain'\n\nexport type { AdminOrganizationListProps } from '@datatechsolutions/shared-domain'\nimport type { AdminOrganizationListProps } from '@datatechsolutions/shared-domain'\n\nexport function AdminOrganizationList({ client, onOrganizationSelect }: AdminOrganizationListProps) {\n const t = useTranslations('windsock')\n const format = useFormatter()\n\n const [organizations, setOrganizations] = useState<AuthOrganization[]>([])\n const [filteredOrganizations, setFilteredOrganizations] = useState<AuthOrganization[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [search, setSearch] = useState('')\n const [deleteTarget, setDeleteTarget] = useState<AuthOrganization | null>(null)\n const [isDeleting, setIsDeleting] = useState(false)\n\n const fetchOrganizations = useCallback(async () => {\n setIsLoading(true)\n try {\n const result = await client.listOrganizations()\n setOrganizations(result)\n } catch {\n // Fail gracefully\n } finally {\n setIsLoading(false)\n }\n }, [client])\n\n useEffect(() => {\n fetchOrganizations()\n }, [fetchOrganizations])\n\n useEffect(() => {\n if (!search.trim()) {\n setFilteredOrganizations(organizations)\n return\n }\n const query = search.toLowerCase()\n setFilteredOrganizations(\n organizations.filter((organization) =>\n organization.name.toLowerCase().includes(query) ||\n organization.displayName?.toLowerCase().includes(query) ||\n organization.description?.toLowerCase().includes(query),\n ),\n )\n }, [organizations, search])\n\n const handleOrganizationClick = useCallback((organization: AuthOrganization) => {\n triggerHaptic('light')\n onOrganizationSelect?.(organization)\n }, [onOrganizationSelect])\n\n const handleDeleteRequest = useCallback((organization: AuthOrganization) => {\n triggerHaptic('warning')\n setDeleteTarget(organization)\n }, [])\n\n const handleDeleteConfirm = useCallback(async () => {\n if (!deleteTarget) return\n setIsDeleting(true)\n triggerHaptic('medium')\n try {\n await client.deleteOrganization(deleteTarget.id)\n setDeleteTarget(null)\n triggerHaptic('success')\n fetchOrganizations()\n } catch {\n triggerHaptic('error')\n } finally {\n setIsDeleting(false)\n }\n }, [deleteTarget, client, fetchOrganizations])\n\n const handleDeleteCancel = useCallback(() => {\n triggerHaptic('light')\n setDeleteTarget(null)\n }, [])\n\n return (\n <>\n <SectionCard\n header={{\n icon: <BuildingOffice2Icon className=\"h-5 w-5 text-white\" />,\n title: t('admin.organizations.title'),\n subtitle: t('admin.organizations.subtitle'),\n gradient: 'from-emerald-500 via-teal-500 to-cyan-500',\n }}\n padded={false}\n >\n {/* Search */}\n <div className=\"border-b border-gray-200/60 p-4 dark:border-white/10\">\n <SearchInput\n value={search}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setSearch(event.target.value)}\n placeholder={t('admin.organizations.searchPlaceholder')}\n />\n </div>\n\n {/* Content */}\n {isLoading ? (\n <div className=\"flex items-center justify-center gap-2 p-8 text-sm text-gray-500 dark:text-gray-400\">\n <InlineSpinner />\n <span>{t('admin.organizations.loading')}</span>\n </div>\n ) : filteredOrganizations.length === 0 ? (\n <div className=\"p-4 sm:p-6\">\n <EmptyState\n message={t('admin.organizations.emptyMessage')}\n description={t('admin.organizations.emptyDescription')}\n icon={BuildingOffice2Icon}\n variant=\"card\"\n />\n </div>\n ) : (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-gray-200/60 dark:border-white/10\">\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-gray-500 dark:text-gray-400\">\n {t('admin.organizations.columnName')}\n </th>\n <th className=\"hidden px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-gray-500 dark:text-gray-400 sm:table-cell\">\n {t('admin.organizations.columnDisplayName')}\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-gray-500 dark:text-gray-400\">\n {t('admin.organizations.columnStatus')}\n </th>\n <th className=\"hidden px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-gray-500 dark:text-gray-400 md:table-cell\">\n {t('admin.organizations.columnCreated')}\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium uppercase tracking-wide text-gray-500 dark:text-gray-400\">\n {t('admin.organizations.columnActions')}\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-gray-200/60 dark:divide-white/10\">\n {filteredOrganizations.map((organization) => (\n <tr\n key={organization.id}\n className=\"cursor-pointer transition-colors hover:bg-white/40 dark:hover:bg-white/5\"\n onClick={() => handleOrganizationClick(organization)}\n >\n <td className=\"px-4 py-3\">\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">\n {organization.name}\n </p>\n {organization.description && (\n <p className=\"mt-0.5 truncate text-xs text-gray-500 dark:text-gray-400\">\n {organization.description}\n </p>\n )}\n </td>\n <td className=\"hidden px-4 py-3 text-gray-500 dark:text-gray-400 sm:table-cell\">\n {organization.displayName ?? '—'}\n </td>\n <td className=\"px-4 py-3\">\n <StatusBadge\n status={organization.enabled ? 'active' : 'inactive'}\n label={organization.enabled ? t('admin.organizations.statusEnabled') : t('admin.organizations.statusDisabled')}\n size=\"sm\"\n />\n </td>\n <td className=\"hidden px-4 py-3 text-gray-500 dark:text-gray-400 md:table-cell\">\n {format.dateTime(new Date(organization.createdAt), {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n })}\n </td>\n <td className=\"px-4 py-3 text-right\">\n <Button\n size=\"sm\"\n color=\"ios-glass-red\"\n onClick={(event: React.MouseEvent) => {\n event.stopPropagation()\n handleDeleteRequest(organization)\n }}\n >\n <TrashIcon className=\"h-3.5 w-3.5\" />\n </Button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </SectionCard>\n\n {/* Delete confirmation */}\n <DynamicIslandConfirm\n open={deleteTarget !== null}\n onClose={handleDeleteCancel}\n onConfirm={handleDeleteConfirm}\n title={t('admin.organizations.deleteConfirmTitle', { name: deleteTarget?.displayName ?? deleteTarget?.name ?? '' })}\n icon={<TrashIcon className=\"h-5 w-5 text-white\" />}\n iconBackground=\"bg-ios-red\"\n confirmLabel={t('admin.organizations.deleteConfirmButton')}\n cancelLabel={t('admin.organizations.deleteCancelButton')}\n />\n </>\n )\n}\n","import { useState, useEffect, useCallback } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n GlassModal,\n Input,\n Button,\n triggerHaptic,\n} from '@ui/index'\nimport { BuildingOffice2Icon } from '@heroicons/react/24/outline'\n\nexport type { AdminOrganizationFormProps } from '@datatechsolutions/shared-domain'\nimport type {\n AdminOrganizationFormProps,\n AdminCreateOrganizationInput,\n AdminUpdateOrganizationInput,\n} from '@datatechsolutions/shared-domain'\n\nexport function AdminOrganizationForm({\n open,\n onClose,\n organization,\n onSubmit,\n}: AdminOrganizationFormProps) {\n const t = useTranslations('windsock')\n\n const isEditing = organization !== null && organization !== undefined\n\n const [name, setName] = useState('')\n const [displayName, setDisplayName] = useState('')\n const [description, setDescription] = useState('')\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n if (organization) {\n setName(organization.name)\n setDisplayName(organization.displayName ?? '')\n setDescription(organization.description ?? '')\n } else {\n setName('')\n setDisplayName('')\n setDescription('')\n }\n setError(null)\n }, [organization, open])\n\n const handleClose = useCallback(() => {\n setError(null)\n onClose()\n }, [onClose])\n\n const handleSubmit = useCallback(async () => {\n if (!name.trim()) {\n setError(t('admin.organizationForm.errorNameRequired'))\n triggerHaptic('error')\n return\n }\n\n setError(null)\n setIsSubmitting(true)\n triggerHaptic('light')\n\n try {\n if (isEditing) {\n const data: AdminUpdateOrganizationInput = {\n name: name.trim(),\n displayName: displayName.trim() || null,\n description: description.trim() || null,\n }\n await onSubmit(data)\n } else {\n const data: AdminCreateOrganizationInput = {\n name: name.trim(),\n displayName: displayName.trim() || undefined,\n description: description.trim() || undefined,\n }\n await onSubmit(data)\n }\n triggerHaptic('success')\n onClose()\n } catch {\n setError(isEditing\n ? t('admin.organizationForm.errorUpdateFailed')\n : t('admin.organizationForm.errorCreateFailed'),\n )\n triggerHaptic('error')\n } finally {\n setIsSubmitting(false)\n }\n }, [name, displayName, description, isEditing, onSubmit, onClose, t])\n\n return (\n <GlassModal\n open={open}\n onClose={handleClose}\n title={isEditing ? t('admin.organizationForm.editTitle') : t('admin.organizationForm.createTitle')}\n subtitle={isEditing ? t('admin.organizationForm.editSubtitle') : t('admin.organizationForm.createSubtitle')}\n icon={<BuildingOffice2Icon className=\"h-5 w-5 text-white\" />}\n maxWidth=\"md\"\n >\n <form\n onSubmit={(event) => {\n event.preventDefault()\n handleSubmit()\n }}\n className=\"space-y-4 p-4 sm:p-6\"\n >\n <Input\n label={t('admin.organizationForm.nameLabel')}\n value={name}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setName(event.target.value)}\n placeholder={t('admin.organizationForm.namePlaceholder')}\n disabled={isSubmitting}\n autoFocus\n />\n\n <Input\n label={t('admin.organizationForm.displayNameLabel')}\n value={displayName}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setDisplayName(event.target.value)}\n placeholder={t('admin.organizationForm.displayNamePlaceholder')}\n disabled={isSubmitting}\n />\n\n <Input\n label={t('admin.organizationForm.descriptionLabel')}\n value={description}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setDescription(event.target.value)}\n placeholder={t('admin.organizationForm.descriptionPlaceholder')}\n disabled={isSubmitting}\n />\n\n {error && (\n <p className=\"text-sm text-red-600 dark:text-red-400\" role=\"alert\">{error}</p>\n )}\n\n <div className=\"flex gap-3 pt-2\">\n <Button\n type=\"button\"\n outline\n onClick={handleClose}\n disabled={isSubmitting}\n className=\"flex-1\"\n >\n {t('admin.organizationForm.cancelButton')}\n </Button>\n <Button\n type=\"submit\"\n color=\"ios-glass-blue\"\n loading={isSubmitting}\n disabled={isSubmitting || !name.trim()}\n className=\"flex-1\"\n >\n {isEditing ? t('admin.organizationForm.saveButton') : t('admin.organizationForm.createButton')}\n </Button>\n </div>\n </form>\n </GlassModal>\n )\n}\n","import { useState, useEffect, useCallback } from 'react'\nimport { useTranslations, useFormatter } from '@ui/lib/i18n-context'\nimport {\n SectionCard,\n Button,\n Input,\n SearchInput,\n Badge,\n EmptyState,\n InlineSpinner,\n Sheet,\n DynamicIslandConfirm,\n triggerHaptic,\n} from '@ui/index'\nimport {\n KeyIcon,\n PlusIcon,\n PencilSquareIcon,\n TrashIcon,\n} from '@heroicons/react/24/outline'\nimport type { AdminPermission } from '@datatechsolutions/shared-domain'\n\nexport type { AdminPermissionListProps } from '@datatechsolutions/shared-domain'\nimport type {\n AdminPermissionListProps,\n AdminCreatePermissionInput,\n AdminUpdatePermissionInput,\n} from '@datatechsolutions/shared-domain'\n\nexport function AdminPermissionList({ client }: AdminPermissionListProps) {\n const t = useTranslations('windsock')\n const format = useFormatter()\n\n const [permissions, setPermissions] = useState<AdminPermission[]>([])\n const [filteredPermissions, setFilteredPermissions] = useState<AdminPermission[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [search, setSearch] = useState('')\n\n // Form state\n const [isFormOpen, setIsFormOpen] = useState(false)\n const [editingPermission, setEditingPermission] = useState<AdminPermission | null>(null)\n const [formId, setFormId] = useState('')\n const [formName, setFormName] = useState('')\n const [formDescription, setFormDescription] = useState('')\n const [formResource, setFormResource] = useState('')\n const [formAction, setFormAction] = useState('')\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [formError, setFormError] = useState<string | null>(null)\n\n // Delete state\n const [deleteTarget, setDeleteTarget] = useState<AdminPermission | null>(null)\n const [isDeleting, setIsDeleting] = useState(false)\n\n const fetchPermissions = useCallback(async () => {\n setIsLoading(true)\n try {\n const result = await client.listPermissions()\n setPermissions(result)\n } catch {\n // Fail gracefully\n } finally {\n setIsLoading(false)\n }\n }, [client])\n\n useEffect(() => {\n fetchPermissions()\n }, [fetchPermissions])\n\n useEffect(() => {\n if (!search.trim()) {\n setFilteredPermissions(permissions)\n return\n }\n const query = search.toLowerCase()\n setFilteredPermissions(\n permissions.filter((permission) =>\n permission.name.toLowerCase().includes(query) ||\n permission.description?.toLowerCase().includes(query) ||\n permission.resource?.toLowerCase().includes(query) ||\n permission.action?.toLowerCase().includes(query),\n ),\n )\n }, [permissions, search])\n\n // ── Form handlers ───────────────────────────────────────────────────\n\n const handleOpenCreate = useCallback(() => {\n triggerHaptic('light')\n setEditingPermission(null)\n setFormId('')\n setFormName('')\n setFormDescription('')\n setFormResource('')\n setFormAction('')\n setFormError(null)\n setIsFormOpen(true)\n }, [])\n\n const handleOpenEdit = useCallback((permission: AdminPermission) => {\n triggerHaptic('light')\n setEditingPermission(permission)\n setFormId(permission.id)\n setFormName(permission.name)\n setFormDescription(permission.description ?? '')\n setFormResource(permission.resource ?? '')\n setFormAction(permission.action ?? '')\n setFormError(null)\n setIsFormOpen(true)\n }, [])\n\n const handleCloseForm = useCallback(() => {\n triggerHaptic('light')\n setIsFormOpen(false)\n }, [])\n\n const handleSubmitForm = useCallback(async () => {\n const isEditing = editingPermission !== null\n\n if (!isEditing && !formId.trim()) {\n setFormError(t('admin.permissions.errorIdRequired'))\n triggerHaptic('error')\n return\n }\n if (!formName.trim()) {\n setFormError(t('admin.permissions.errorNameRequired'))\n triggerHaptic('error')\n return\n }\n\n setFormError(null)\n setIsSubmitting(true)\n triggerHaptic('light')\n\n try {\n if (isEditing) {\n const data: AdminUpdatePermissionInput = {\n name: formName.trim(),\n description: formDescription.trim() || undefined,\n resource: formResource.trim() || undefined,\n action: formAction.trim() || undefined,\n }\n await client.updatePermission(editingPermission.id, data)\n } else {\n const data: AdminCreatePermissionInput = {\n id: formId.trim(),\n name: formName.trim(),\n description: formDescription.trim() || undefined,\n resource: formResource.trim() || undefined,\n action: formAction.trim() || undefined,\n }\n await client.createPermission(data)\n }\n triggerHaptic('success')\n setIsFormOpen(false)\n fetchPermissions()\n } catch {\n setFormError(\n isEditing\n ? t('admin.permissions.errorUpdateFailed')\n : t('admin.permissions.errorCreateFailed'),\n )\n triggerHaptic('error')\n } finally {\n setIsSubmitting(false)\n }\n }, [editingPermission, formId, formName, formDescription, formResource, formAction, client, fetchPermissions, t])\n\n // ── Delete handlers ─────────────────────────────────────────────────\n\n const handleDeleteRequest = useCallback((permission: AdminPermission) => {\n triggerHaptic('warning')\n setDeleteTarget(permission)\n }, [])\n\n const handleDeleteConfirm = useCallback(async () => {\n if (!deleteTarget) return\n setIsDeleting(true)\n triggerHaptic('medium')\n try {\n await client.deletePermission(deleteTarget.id)\n setDeleteTarget(null)\n triggerHaptic('success')\n fetchPermissions()\n } catch {\n triggerHaptic('error')\n } finally {\n setIsDeleting(false)\n }\n }, [deleteTarget, client, fetchPermissions])\n\n const handleDeleteCancel = useCallback(() => {\n triggerHaptic('light')\n setDeleteTarget(null)\n }, [])\n\n return (\n <>\n <SectionCard\n header={{\n icon: <KeyIcon className=\"h-5 w-5 text-white\" />,\n title: t('admin.permissions.title'),\n subtitle: t('admin.permissions.subtitle'),\n gradient: 'from-violet-500 via-purple-500 to-pink-500',\n rightContent: (\n <Button size=\"sm\" color=\"ios-glass-blue\" onClick={handleOpenCreate}>\n <PlusIcon className=\"mr-1 h-3.5 w-3.5\" />\n {t('admin.permissions.createButton')}\n </Button>\n ),\n }}\n padded={false}\n >\n {/* Search */}\n <div className=\"border-b border-gray-200/60 p-4 dark:border-white/10\">\n <SearchInput\n value={search}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setSearch(event.target.value)}\n placeholder={t('admin.permissions.searchPlaceholder')}\n />\n </div>\n\n {/* Content */}\n {isLoading ? (\n <div className=\"flex items-center justify-center gap-2 p-8 text-sm text-gray-500 dark:text-gray-400\">\n <InlineSpinner />\n <span>{t('admin.permissions.loading')}</span>\n </div>\n ) : filteredPermissions.length === 0 ? (\n <div className=\"p-4 sm:p-6\">\n <EmptyState\n message={t('admin.permissions.emptyMessage')}\n description={t('admin.permissions.emptyDescription')}\n icon={KeyIcon}\n action={{\n label: t('admin.permissions.createButton'),\n onClick: handleOpenCreate,\n }}\n variant=\"card\"\n />\n </div>\n ) : (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-gray-200/60 dark:border-white/10\">\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-gray-500 dark:text-gray-400\">\n {t('admin.permissions.columnName')}\n </th>\n <th className=\"hidden px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-gray-500 dark:text-gray-400 sm:table-cell\">\n {t('admin.permissions.columnResource')}\n </th>\n <th className=\"hidden px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-gray-500 dark:text-gray-400 sm:table-cell\">\n {t('admin.permissions.columnAction')}\n </th>\n <th className=\"hidden px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-gray-500 dark:text-gray-400 md:table-cell\">\n {t('admin.permissions.columnCreated')}\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium uppercase tracking-wide text-gray-500 dark:text-gray-400\">\n {t('admin.permissions.columnActions')}\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-gray-200/60 dark:divide-white/10\">\n {filteredPermissions.map((permission) => (\n <tr key={permission.id} className=\"transition-colors hover:bg-white/40 dark:hover:bg-white/5\">\n <td className=\"px-4 py-3\">\n <div>\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">\n {permission.name}\n </p>\n {permission.description && (\n <p className=\"mt-0.5 truncate text-xs text-gray-500 dark:text-gray-400\">\n {permission.description}\n </p>\n )}\n </div>\n </td>\n <td className=\"hidden px-4 py-3 sm:table-cell\">\n {permission.resource ? (\n <Badge color=\"blue\">{permission.resource}</Badge>\n ) : (\n <span className=\"text-gray-400 dark:text-gray-500\">—</span>\n )}\n </td>\n <td className=\"hidden px-4 py-3 sm:table-cell\">\n {permission.action ? (\n <Badge color=\"amber\">{permission.action}</Badge>\n ) : (\n <span className=\"text-gray-400 dark:text-gray-500\">—</span>\n )}\n </td>\n <td className=\"hidden px-4 py-3 text-gray-500 dark:text-gray-400 md:table-cell\">\n {format.dateTime(new Date(permission.createdAt), {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n })}\n </td>\n <td className=\"px-4 py-3 text-right\">\n <div className=\"flex items-center justify-end gap-1\">\n <Button\n size=\"sm\"\n outline\n onClick={() => handleOpenEdit(permission)}\n >\n <PencilSquareIcon className=\"h-3.5 w-3.5\" />\n </Button>\n <Button\n size=\"sm\"\n color=\"ios-glass-red\"\n onClick={() => handleDeleteRequest(permission)}\n >\n <TrashIcon className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </SectionCard>\n\n {/* Create/Edit permission sheet */}\n <Sheet\n open={isFormOpen}\n onClose={handleCloseForm}\n title={editingPermission\n ? t('admin.permissions.editSheetTitle')\n : t('admin.permissions.createSheetTitle')}\n side=\"bottom\"\n size=\"md\"\n >\n <div className=\"space-y-4 p-4 sm:p-6\">\n {!editingPermission && (\n <Input\n label={t('admin.permissions.formIdLabel')}\n value={formId}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setFormId(event.target.value)}\n placeholder={t('admin.permissions.formIdPlaceholder')}\n disabled={isSubmitting}\n autoFocus\n />\n )}\n\n <Input\n label={t('admin.permissions.formNameLabel')}\n value={formName}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setFormName(event.target.value)}\n placeholder={t('admin.permissions.formNamePlaceholder')}\n disabled={isSubmitting}\n autoFocus={!!editingPermission}\n />\n\n <Input\n label={t('admin.permissions.formDescriptionLabel')}\n value={formDescription}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setFormDescription(event.target.value)}\n placeholder={t('admin.permissions.formDescriptionPlaceholder')}\n disabled={isSubmitting}\n />\n\n <div className=\"grid grid-cols-2 gap-3\">\n <Input\n label={t('admin.permissions.formResourceLabel')}\n value={formResource}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setFormResource(event.target.value)}\n placeholder={t('admin.permissions.formResourcePlaceholder')}\n disabled={isSubmitting}\n />\n <Input\n label={t('admin.permissions.formActionLabel')}\n value={formAction}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setFormAction(event.target.value)}\n placeholder={t('admin.permissions.formActionPlaceholder')}\n disabled={isSubmitting}\n />\n </div>\n\n {formError && (\n <p className=\"text-sm text-red-600 dark:text-red-400\" role=\"alert\">{formError}</p>\n )}\n\n <div className=\"flex gap-3\">\n <Button\n outline\n onClick={handleCloseForm}\n disabled={isSubmitting}\n className=\"flex-1\"\n >\n {t('admin.permissions.formCancelButton')}\n </Button>\n <Button\n color=\"ios-glass-blue\"\n onClick={handleSubmitForm}\n loading={isSubmitting}\n disabled={isSubmitting || !formName.trim() || (!editingPermission && !formId.trim())}\n className=\"flex-1\"\n >\n {editingPermission\n ? t('admin.permissions.formSaveButton')\n : t('admin.permissions.formCreateButton')}\n </Button>\n </div>\n </div>\n </Sheet>\n\n {/* Delete confirmation */}\n <DynamicIslandConfirm\n open={deleteTarget !== null}\n onClose={handleDeleteCancel}\n onConfirm={handleDeleteConfirm}\n title={t('admin.permissions.deleteConfirmTitle', { name: deleteTarget?.name ?? '' })}\n icon={<TrashIcon className=\"h-5 w-5 text-white\" />}\n iconBackground=\"bg-ios-red\"\n confirmLabel={t('admin.permissions.deleteConfirmButton')}\n cancelLabel={t('admin.permissions.deleteCancelButton')}\n />\n </>\n )\n}\n"]}
|