@ketvietlab/ketsuite 0.1.20 → 0.1.24
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/cli.js +9 -3
- package/dist/cli.js.map +1 -1
- package/dist/demo/crm.d.ts +3 -0
- package/dist/demo/crm.d.ts.map +1 -0
- package/dist/demo/crm.js +418 -0
- package/dist/demo/crm.js.map +1 -0
- package/dist/demo/partner.d.ts +8 -0
- package/dist/demo/partner.d.ts.map +1 -0
- package/dist/demo/partner.js +179 -0
- package/dist/demo/partner.js.map +1 -0
- package/dist/demo/product.d.ts +25 -0
- package/dist/demo/product.d.ts.map +1 -0
- package/dist/demo/product.js +579 -0
- package/dist/demo/product.js.map +1 -0
- package/dist/demo/purchase.d.ts +4 -0
- package/dist/demo/purchase.d.ts.map +1 -0
- package/dist/demo/purchase.js +58 -0
- package/dist/demo/purchase.js.map +1 -0
- package/dist/demo/sale.d.ts +4 -0
- package/dist/demo/sale.d.ts.map +1 -0
- package/dist/demo/sale.js +52 -0
- package/dist/demo/sale.js.map +1 -0
- package/dist/demo/seed.d.ts +14 -0
- package/dist/demo/seed.d.ts.map +1 -0
- package/dist/demo/seed.js +88 -0
- package/dist/demo/seed.js.map +1 -0
- package/dist/demo/stock.d.ts +7 -0
- package/dist/demo/stock.d.ts.map +1 -0
- package/dist/demo/stock.js +26 -0
- package/dist/demo/stock.js.map +1 -0
- package/dist/demo/user.d.ts +4 -0
- package/dist/demo/user.d.ts.map +1 -0
- package/dist/demo/user.js +41 -0
- package/dist/demo/user.js.map +1 -0
- package/dist/demo/util.d.ts +7 -0
- package/dist/demo/util.d.ts.map +1 -0
- package/dist/demo/util.js +19 -0
- package/dist/demo/util.js.map +1 -0
- package/dist/modules/backend/design/client/backend-shell.d.mts +2 -2
- package/dist/modules/backend/design/client/backend-shell.d.mts.map +1 -1
- package/dist/modules/backend/design/client/backend-shell.mjs +1 -1
- package/dist/modules/backend/design/client/backend-shell.mjs.map +3 -3
- package/dist/modules/backend/design/content.css +9 -9
- package/dist/modules/backend/design/controls.css +5 -5
- package/dist/modules/backend/design/forms.css +12 -5
- package/dist/modules/backend/design/foundation.css +3 -3
- package/dist/modules/backend/design/lists.css +23 -24
- package/dist/modules/backend/design/user-workflow.css +2 -2
- package/dist/modules/backend/screen.d.ts.map +1 -1
- package/dist/modules/backend/screen.js +11 -2
- package/dist/modules/backend/screen.js.map +1 -1
- package/dist/modules/crm/functions/access.d.ts +3 -0
- package/dist/modules/crm/functions/access.d.ts.map +1 -0
- package/dist/modules/crm/functions/access.js +89 -0
- package/dist/modules/crm/functions/access.js.map +1 -0
- package/dist/modules/crm/functions/activities.d.ts +3 -0
- package/dist/modules/crm/functions/activities.d.ts.map +1 -0
- package/dist/modules/crm/functions/activities.js +174 -0
- package/dist/modules/crm/functions/activities.js.map +1 -0
- package/dist/modules/crm/functions/cases.d.ts +3 -0
- package/dist/modules/crm/functions/cases.d.ts.map +1 -0
- package/dist/modules/crm/functions/cases.js +585 -0
- package/dist/modules/crm/functions/cases.js.map +1 -0
- package/dist/modules/crm/functions/configuration.d.ts +3 -0
- package/dist/modules/crm/functions/configuration.d.ts.map +1 -0
- package/dist/modules/crm/functions/configuration.js +331 -0
- package/dist/modules/crm/functions/configuration.js.map +1 -0
- package/dist/modules/crm/functions/gamification.d.ts +3 -0
- package/dist/modules/crm/functions/gamification.d.ts.map +1 -0
- package/dist/modules/crm/functions/gamification.js +58 -0
- package/dist/modules/crm/functions/gamification.js.map +1 -0
- package/dist/modules/crm/functions/index.d.ts +4 -0
- package/dist/modules/crm/functions/index.d.ts.map +1 -0
- package/dist/modules/crm/functions/index.js +33 -0
- package/dist/modules/crm/functions/index.js.map +1 -0
- package/dist/modules/crm/functions/modal-context.d.ts +3 -0
- package/dist/modules/crm/functions/modal-context.d.ts.map +1 -0
- package/dist/modules/crm/functions/modal-context.js +248 -0
- package/dist/modules/crm/functions/modal-context.js.map +1 -0
- package/dist/modules/crm/functions/previews.d.ts +3 -0
- package/dist/modules/crm/functions/previews.d.ts.map +1 -0
- package/dist/modules/crm/functions/previews.js +20 -0
- package/dist/modules/crm/functions/previews.js.map +1 -0
- package/dist/modules/crm/functions/shared.d.ts +31 -0
- package/dist/modules/crm/functions/shared.d.ts.map +1 -0
- package/dist/modules/crm/functions/shared.js +194 -0
- package/dist/modules/crm/functions/shared.js.map +1 -0
- package/dist/modules/crm/index.d.ts +1 -1
- package/dist/modules/crm/index.d.ts.map +1 -1
- package/dist/modules/crm/index.js +2 -2
- package/dist/modules/crm/index.js.map +1 -1
- package/dist/modules/crm/messages.d.ts +4 -1
- package/dist/modules/crm/messages.d.ts.map +1 -1
- package/dist/modules/crm/messages.js +6 -0
- package/dist/modules/crm/messages.js.map +1 -1
- package/dist/modules/crm/record-modal-labels.d.ts +9 -0
- package/dist/modules/crm/record-modal-labels.d.ts.map +1 -0
- package/dist/modules/crm/record-modal-labels.js +36 -0
- package/dist/modules/crm/record-modal-labels.js.map +1 -0
- package/dist/modules/crm/types.d.ts +5 -0
- package/dist/modules/crm/types.d.ts.map +1 -1
- package/dist/modules/crm/types.js +9 -0
- package/dist/modules/crm/types.js.map +1 -1
- package/dist/modules/crm_backend/client/crm-configuration-modal.d.mts +352 -0
- package/dist/modules/crm_backend/client/crm-configuration-modal.d.mts.map +1 -0
- package/dist/modules/crm_backend/client/crm-configuration-modal.mjs +2 -0
- package/dist/modules/crm_backend/client/crm-configuration-modal.mjs.map +7 -0
- package/dist/modules/crm_backend/index.d.ts.map +1 -1
- package/dist/modules/crm_backend/index.js +5 -1
- package/dist/modules/crm_backend/index.js.map +1 -1
- package/dist/modules/crm_backend/islands.d.ts +27 -0
- package/dist/modules/crm_backend/islands.d.ts.map +1 -1
- package/dist/modules/crm_backend/islands.js +22 -0
- package/dist/modules/crm_backend/islands.js.map +1 -1
- package/dist/modules/crm_backend/messages.d.ts +30 -0
- package/dist/modules/crm_backend/messages.d.ts.map +1 -1
- package/dist/modules/crm_backend/messages.js +30 -0
- package/dist/modules/crm_backend/messages.js.map +1 -1
- package/dist/modules/crm_backend/modal/configuration-modal-view.d.ts +55 -0
- package/dist/modules/crm_backend/modal/configuration-modal-view.d.ts.map +1 -0
- package/dist/modules/crm_backend/modal/configuration-modal-view.js +601 -0
- package/dist/modules/crm_backend/modal/configuration-modal-view.js.map +1 -0
- package/dist/modules/crm_backend/routes.d.ts.map +1 -1
- package/dist/modules/crm_backend/routes.js +107 -368
- package/dist/modules/crm_backend/routes.js.map +1 -1
- package/dist/modules/crm_backend/screens/configuration.d.ts +24 -32
- package/dist/modules/crm_backend/screens/configuration.d.ts.map +1 -1
- package/dist/modules/crm_backend/screens/configuration.js +183 -274
- package/dist/modules/crm_backend/screens/configuration.js.map +1 -1
- package/dist/modules/crm_backend/screens/index.d.ts +2 -2
- package/dist/modules/crm_backend/screens/index.d.ts.map +1 -1
- package/dist/modules/crm_backend/screens/index.js +1 -1
- package/dist/modules/crm_backend/screens/index.js.map +1 -1
- package/dist/modules/product/functions.d.ts +14 -1
- package/dist/modules/product/functions.d.ts.map +1 -1
- package/dist/modules/product/functions.js +36 -31
- package/dist/modules/product/functions.js.map +1 -1
- package/dist/modules/product/product-modal-context.d.ts +3 -0
- package/dist/modules/product/product-modal-context.d.ts.map +1 -0
- package/dist/modules/product/product-modal-context.js +171 -0
- package/dist/modules/product/product-modal-context.js.map +1 -0
- package/dist/modules/product_backend/client/product-modal.d.mts +143 -0
- package/dist/modules/product_backend/client/product-modal.d.mts.map +1 -0
- package/dist/modules/product_backend/client/product-modal.mjs +2 -0
- package/dist/modules/product_backend/client/product-modal.mjs.map +7 -0
- package/dist/modules/product_backend/index.d.ts.map +1 -1
- package/dist/modules/product_backend/index.js +16 -0
- package/dist/modules/product_backend/index.js.map +1 -1
- package/dist/modules/product_backend/islands.d.ts +1 -0
- package/dist/modules/product_backend/islands.d.ts.map +1 -1
- package/dist/modules/product_backend/islands.js +9 -0
- package/dist/modules/product_backend/islands.js.map +1 -1
- package/dist/modules/product_backend/modal/product-modal-view.d.ts +43 -0
- package/dist/modules/product_backend/modal/product-modal-view.d.ts.map +1 -0
- package/dist/modules/product_backend/modal/product-modal-view.js +602 -0
- package/dist/modules/product_backend/modal/product-modal-view.js.map +1 -0
- package/dist/modules/product_backend/routes.d.ts.map +1 -1
- package/dist/modules/product_backend/routes.js +44 -330
- package/dist/modules/product_backend/routes.js.map +1 -1
- package/dist/modules/product_backend/screens/detail.d.ts.map +1 -1
- package/dist/modules/product_backend/screens/detail.js +6 -108
- package/dist/modules/product_backend/screens/detail.js.map +1 -1
- package/dist/modules/product_backend/screens/index.d.ts +0 -1
- package/dist/modules/product_backend/screens/index.d.ts.map +1 -1
- package/dist/modules/product_backend/screens/index.js +0 -1
- package/dist/modules/product_backend/screens/index.js.map +1 -1
- package/dist/modules/product_backend/screens/list.d.ts +3 -1
- package/dist/modules/product_backend/screens/list.d.ts.map +1 -1
- package/dist/modules/product_backend/screens/list.js +6 -5
- package/dist/modules/product_backend/screens/list.js.map +1 -1
- package/dist/modules/user/authorization.d.ts.map +1 -1
- package/dist/modules/user/authorization.js +114 -0
- package/dist/modules/user/authorization.js.map +1 -1
- package/dist/modules/user/functions.d.ts.map +1 -1
- package/dist/modules/user/functions.js +2 -0
- package/dist/modules/user/functions.js.map +1 -1
- package/dist/modules/user/user-modal-context.d.ts +3 -0
- package/dist/modules/user/user-modal-context.d.ts.map +1 -0
- package/dist/modules/user/user-modal-context.js +151 -0
- package/dist/modules/user/user-modal-context.js.map +1 -0
- package/dist/modules/user_backend/client/user-modal.d.mts +72 -0
- package/dist/modules/user_backend/client/user-modal.d.mts.map +1 -0
- package/dist/modules/user_backend/client/user-modal.mjs +2 -0
- package/dist/modules/user_backend/client/user-modal.mjs.map +7 -0
- package/dist/modules/user_backend/index.d.ts.map +1 -1
- package/dist/modules/user_backend/index.js +9 -0
- package/dist/modules/user_backend/index.js.map +1 -1
- package/dist/modules/user_backend/islands.d.ts +15 -0
- package/dist/modules/user_backend/islands.d.ts.map +1 -0
- package/dist/modules/user_backend/islands.js +14 -0
- package/dist/modules/user_backend/islands.js.map +1 -0
- package/dist/modules/user_backend/messages.d.ts +30 -0
- package/dist/modules/user_backend/messages.d.ts.map +1 -1
- package/dist/modules/user_backend/messages.js +30 -0
- package/dist/modules/user_backend/messages.js.map +1 -1
- package/dist/modules/user_backend/modal/user-modal-view.d.ts +26 -0
- package/dist/modules/user_backend/modal/user-modal-view.d.ts.map +1 -0
- package/dist/modules/user_backend/modal/user-modal-view.js +320 -0
- package/dist/modules/user_backend/modal/user-modal-view.js.map +1 -0
- package/dist/modules/user_backend/routes.d.ts.map +1 -1
- package/dist/modules/user_backend/routes.js +15 -3
- package/dist/modules/user_backend/routes.js.map +1 -1
- package/dist/permission-catalogue.d.ts.map +1 -1
- package/dist/permission-catalogue.js +8 -0
- package/dist/permission-catalogue.js.map +1 -1
- package/dist/scaffold/index.js +1 -1
- package/dist/ui/client/activity.css +6 -6
- package/dist/ui/client/calendar.css +6 -6
- package/dist/ui/client/flow-app.css +1 -1
- package/dist/ui/client/mail.css +6 -6
- package/dist/ui/client/record-modal-form.d.ts +67 -0
- package/dist/ui/client/record-modal-form.d.ts.map +1 -0
- package/dist/ui/client/record-modal-form.js +45 -0
- package/dist/ui/client/record-modal-form.js.map +1 -0
- package/dist/ui/client/record-modal.d.ts +97 -6
- package/dist/ui/client/record-modal.d.ts.map +1 -1
- package/dist/ui/client/record-modal.js +330 -64
- package/dist/ui/client/record-modal.js.map +1 -1
- package/dist/ui/index.d.ts +2 -1
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +2 -1
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/layout.d.ts.map +1 -1
- package/dist/ui/layout.js +5 -3
- package/dist/ui/layout.js.map +1 -1
- package/dist/ui/nav.d.ts +7 -0
- package/dist/ui/nav.d.ts.map +1 -1
- package/dist/ui/nav.js +1 -1
- package/dist/ui/nav.js.map +1 -1
- package/dist/ui/record-modal.d.ts +15 -0
- package/dist/ui/record-modal.d.ts.map +1 -1
- package/dist/ui/record-modal.js +12 -0
- package/dist/ui/record-modal.js.map +1 -1
- package/dist/ui/table.d.ts.map +1 -1
- package/dist/ui/table.js +1 -1
- package/dist/ui/table.js.map +1 -1
- package/package.json +4 -4
- package/dist/modules/crm/functions.d.ts +0 -10
- package/dist/modules/crm/functions.d.ts.map +0 -1
- package/dist/modules/crm/functions.js +0 -1394
- package/dist/modules/crm/functions.js.map +0 -1
- package/dist/modules/product_backend/screens/create.d.ts +0 -16
- package/dist/modules/product_backend/screens/create.d.ts.map +0 -1
- package/dist/modules/product_backend/screens/create.js +0 -86
- package/dist/modules/product_backend/screens/create.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"purchase.js","sourceRoot":"","sources":["../../../../../../packages/ketsuite/src/demo/purchase.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sale.d.ts","sourceRoot":"","sources":["../../../../../packages/ketsuite/src/demo/sale.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AA2B/C,wBAAsB,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAsBzG"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// Phase 1 of the `--demo-data` seed: sales quotations/orders.
|
|
2
|
+
//
|
|
3
|
+
// `sale_backend`'s own order list has no page-size affordance yet (unlike
|
|
4
|
+
// partner/product/crm/user, it never adopted `backend/paging.ts`), so there is
|
|
5
|
+
// no real "page 2" to prove here — a dozen genuine, distinct orders against the
|
|
6
|
+
// seeded catalog is what a running business actually has, not padded volume.
|
|
7
|
+
// `lines` indexes into the seeded catalog (product.ts's `catalog`, in
|
|
8
|
+
// declaration order) so each order pulls a believable, varied basket instead
|
|
9
|
+
// of always the first few products.
|
|
10
|
+
const ORDERS = [
|
|
11
|
+
{ id: 'demo-so-01', partnerId: 'demo-partner-dai-phat', clientOrderRef: 'PO-DP-0142', lines: [0, 4, 20] },
|
|
12
|
+
{ id: 'demo-so-02', partnerId: 'demo-partner-song-hong', lines: [7, 8, 9] },
|
|
13
|
+
{
|
|
14
|
+
id: 'demo-so-03',
|
|
15
|
+
partnerId: 'demo-partner-bien-xanh',
|
|
16
|
+
clientOrderRef: 'KS-2026-018',
|
|
17
|
+
lines: [1, 2, 3, 6],
|
|
18
|
+
},
|
|
19
|
+
{ id: 'demo-so-04', partnerId: 'demo-partner-viet-nhat', lines: [6, 11] },
|
|
20
|
+
{ id: 'demo-so-05', partnerId: 'demo-partner-hong-ha', lines: [16] },
|
|
21
|
+
{ id: 'demo-so-06', partnerId: 'demo-partner-tay-bac', clientOrderRef: 'TB-AT-2026', lines: [14] },
|
|
22
|
+
{ id: 'demo-so-07', partnerId: 'demo-partner-mat-troi-viet', lines: [24, 25] },
|
|
23
|
+
{ id: 'demo-so-08', partnerId: 'demo-partner-an-binh', lines: [12, 13] },
|
|
24
|
+
{ id: 'demo-so-09', partnerId: 'demo-partner-phuong-nam', clientOrderRef: 'PN-QC-77', lines: [23] },
|
|
25
|
+
{ id: 'demo-so-10', partnerId: 'demo-partner-hoa-binh', lines: [29] },
|
|
26
|
+
{ id: 'demo-so-11', partnerId: 'demo-partner-hoang-long', lines: [0, 30, 31] },
|
|
27
|
+
{ id: 'demo-so-12', partnerId: 'demo-partner-mien-trung', lines: [0, 5] },
|
|
28
|
+
];
|
|
29
|
+
export async function seedSale(call, catalog, warehouseId) {
|
|
30
|
+
const ids = [];
|
|
31
|
+
for (const order of ORDERS) {
|
|
32
|
+
await call('sale.saveDraft', {
|
|
33
|
+
id: order.id,
|
|
34
|
+
partnerId: order.partnerId,
|
|
35
|
+
warehouseId,
|
|
36
|
+
create: true,
|
|
37
|
+
...(order.clientOrderRef ? { clientOrderRef: order.clientOrderRef } : {}),
|
|
38
|
+
lines: order.lines.map((index, position) => {
|
|
39
|
+
const item = catalog[index % catalog.length];
|
|
40
|
+
return {
|
|
41
|
+
id: `${order.id}:line-${position + 1}`,
|
|
42
|
+
productId: item.productId,
|
|
43
|
+
productUomId: item.uomId,
|
|
44
|
+
productUomQty: String(2 + ((position * 3 + index) % 8)),
|
|
45
|
+
};
|
|
46
|
+
}),
|
|
47
|
+
});
|
|
48
|
+
ids.push(order.id);
|
|
49
|
+
}
|
|
50
|
+
return ids;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=sale.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sale.js","sourceRoot":"","sources":["../../../../../../packages/ketsuite/src/demo/sale.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { DeploymentSpec } from '@ketvietlab/ketjs';
|
|
2
|
+
/**
|
|
3
|
+
* Seed a demo dataset — partners, a product catalog, CRM cases, warehouses,
|
|
4
|
+
* sales and purchase orders, and a few extra staff logins — onto the company
|
|
5
|
+
* `--dev-admin` already created. Reachable only from `ketsuite serve
|
|
6
|
+
* --demo-data`, the same explicit, local-development-only path as
|
|
7
|
+
* `ensureDevelopmentAdmin`.
|
|
8
|
+
*
|
|
9
|
+
* Idempotent the same way: a fixed-id partner acts as the marker. If it is
|
|
10
|
+
* already there, this returns `'exists'` without seeding anything else, so
|
|
11
|
+
* restarting the dev server never duplicates the dataset.
|
|
12
|
+
*/
|
|
13
|
+
export declare function seedDemoData(spec?: DeploymentSpec, env?: Record<string, string | undefined>): Promise<'seeded' | 'exists'>;
|
|
14
|
+
//# sourceMappingURL=seed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../../../../packages/ketsuite/src/demo/seed.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAcvD;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAChC,IAAI,GAAE,cAAyB,EAC/B,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAiE9B"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { bootRuntime, callFn, migrateOne, sqliteStore } from '@ketvietlab/ketjs';
|
|
2
|
+
import { ketsuite } from '../deployment.js';
|
|
3
|
+
import { seedPartners } from './partner.js';
|
|
4
|
+
import { seedProducts } from './product.js';
|
|
5
|
+
import { seedCrm } from './crm.js';
|
|
6
|
+
import { seedStock } from './stock.js';
|
|
7
|
+
import { seedSale } from './sale.js';
|
|
8
|
+
import { seedPurchase } from './purchase.js';
|
|
9
|
+
import { seedStaff } from './user.js';
|
|
10
|
+
/** The marker this seed checks for before touching anything else — see the idempotency note below. */
|
|
11
|
+
const MARKER_PARTNER_ID = 'demo-partner-hoang-long';
|
|
12
|
+
/**
|
|
13
|
+
* Seed a demo dataset — partners, a product catalog, CRM cases, warehouses,
|
|
14
|
+
* sales and purchase orders, and a few extra staff logins — onto the company
|
|
15
|
+
* `--dev-admin` already created. Reachable only from `ketsuite serve
|
|
16
|
+
* --demo-data`, the same explicit, local-development-only path as
|
|
17
|
+
* `ensureDevelopmentAdmin`.
|
|
18
|
+
*
|
|
19
|
+
* Idempotent the same way: a fixed-id partner acts as the marker. If it is
|
|
20
|
+
* already there, this returns `'exists'` without seeding anything else, so
|
|
21
|
+
* restarting the dev server never duplicates the dataset.
|
|
22
|
+
*/
|
|
23
|
+
export async function seedDemoData(spec = ketsuite, env = process.env) {
|
|
24
|
+
if (!spec.serve)
|
|
25
|
+
throw new Error(`app "${spec.name}" declares no serve block`);
|
|
26
|
+
const runtime = await bootRuntime(spec, { env });
|
|
27
|
+
const adapter = await (spec.serve.openStore ?? sqliteStore)(runtime.config);
|
|
28
|
+
try {
|
|
29
|
+
await migrateOne(adapter, runtime.manifest);
|
|
30
|
+
// `actor: null`, not `'system:scaffold'` — `user.createUser` (used below for
|
|
31
|
+
// the staff logins) refuses to set a password at all once `ctx.actor` is
|
|
32
|
+
// truthy, of any value, not just an authenticated one.
|
|
33
|
+
const boot = { adapter, manifest: runtime.manifest, actor: null, scope: { company: null, branch: null } };
|
|
34
|
+
const marker = await callFn('partner.getPartner', { id: MARKER_PARTNER_ID }, boot);
|
|
35
|
+
if (marker.value)
|
|
36
|
+
return 'exists';
|
|
37
|
+
// `user.createUser` refuses a password once an authenticated actor is
|
|
38
|
+
// calling it ("an agent that can mint logins is an agent that can mint
|
|
39
|
+
// itself one") — the same reason `ensureDevelopmentAdmin` creates `admin`
|
|
40
|
+
// at this same unauthenticated, system-only level.
|
|
41
|
+
const systemCall = async (name, input) => {
|
|
42
|
+
const result = await callFn(name, input, boot);
|
|
43
|
+
const value = result.value;
|
|
44
|
+
if (value && value.ok === false)
|
|
45
|
+
throw new Error(`${name}: ${JSON.stringify(value.errors ?? value)}`);
|
|
46
|
+
return value;
|
|
47
|
+
};
|
|
48
|
+
const companies = (await callFn('company.listCompanies', {}, boot)).value;
|
|
49
|
+
const company = companies[0];
|
|
50
|
+
if (!company)
|
|
51
|
+
throw new Error('no company found — run with --dev-admin (or --demo-data, which already implies it) first');
|
|
52
|
+
const branches = (await callFn('company.listBranches', { companyId: company.id }, boot)).value;
|
|
53
|
+
const branch = branches.find((row) => row.isRoot) ?? branches[0];
|
|
54
|
+
if (!branch)
|
|
55
|
+
throw new Error(`company "${String(company.id)}" has no branch to seed into`);
|
|
56
|
+
const admins = (await callFn('user.listUsers', { search: 'admin', limit: 1 }, boot)).value;
|
|
57
|
+
const admin = admins[0];
|
|
58
|
+
if (!admin)
|
|
59
|
+
throw new Error('no admin user found — run with --dev-admin first');
|
|
60
|
+
const companyId = String(company.id);
|
|
61
|
+
const branchId = String(branch.id);
|
|
62
|
+
const ctx = {
|
|
63
|
+
adapter,
|
|
64
|
+
manifest: runtime.manifest,
|
|
65
|
+
actor: String(admin.id),
|
|
66
|
+
scope: { company: companyId, companies: [companyId], branch: branchId, branches: [branchId] },
|
|
67
|
+
};
|
|
68
|
+
const call = async (name, input) => {
|
|
69
|
+
const result = await callFn(name, input, ctx);
|
|
70
|
+
const value = result.value;
|
|
71
|
+
if (value && value.ok === false)
|
|
72
|
+
throw new Error(`${name}: ${JSON.stringify(value.errors ?? value)}`);
|
|
73
|
+
return value;
|
|
74
|
+
};
|
|
75
|
+
await seedPartners(call);
|
|
76
|
+
const products = await seedProducts(call);
|
|
77
|
+
const stock = await seedStock(call);
|
|
78
|
+
await seedCrm(call);
|
|
79
|
+
await seedSale(call, products.catalog, stock.mainWarehouseId);
|
|
80
|
+
await seedPurchase(call, products.catalog, stock.receivingPickingTypeId);
|
|
81
|
+
await seedStaff(systemCall, companyId, branchId);
|
|
82
|
+
return 'seeded';
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
await adapter.close();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=seed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed.js","sourceRoot":"","sources":["../../../../../../packages/ketsuite/src/demo/seed.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stock.d.ts","sourceRoot":"","sources":["../../../../../packages/ketsuite/src/demo/stock.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAErC,MAAM,MAAM,eAAe,GAAG;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,sBAAsB,EAAE,MAAM,CAAA;CAAE,CAAA;AAEzF,wBAAsB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,eAAe,CAAC,CAgBpE"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// Phase 1 of the `--demo-data` seed: warehouses.
|
|
2
|
+
//
|
|
3
|
+
// `stock.saveWarehouse` already creates the locations and picking types a
|
|
4
|
+
// warehouse needs (see packages/ketsuite/src/modules/stock/functions.ts), so
|
|
5
|
+
// sale/purchase only need the ids this hands back — no separate location or
|
|
6
|
+
// picking-type seeding belongs here. Two warehouses (not thirty) is what a
|
|
7
|
+
// real single-company demo actually has; padding this for pagination would be
|
|
8
|
+
// exactly the fake-volume the content bar rules out.
|
|
9
|
+
export async function seedStock(call) {
|
|
10
|
+
await call('stock.saveWarehouse', {
|
|
11
|
+
id: 'demo-wh-main',
|
|
12
|
+
name: 'Kho trung tâm Kết Việt',
|
|
13
|
+
code: 'WH-MAIN',
|
|
14
|
+
receptionSteps: 'one_step',
|
|
15
|
+
deliverySteps: 'ship_only',
|
|
16
|
+
});
|
|
17
|
+
await call('stock.saveWarehouse', {
|
|
18
|
+
id: 'demo-wh-south',
|
|
19
|
+
name: 'Kho khu vực miền Nam',
|
|
20
|
+
code: 'WH-SOUTH',
|
|
21
|
+
receptionSteps: 'one_step',
|
|
22
|
+
deliverySteps: 'ship_only',
|
|
23
|
+
});
|
|
24
|
+
return { mainWarehouseId: 'demo-wh-main', receivingPickingTypeId: 'demo-wh-main:incoming' };
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=stock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stock.js","sourceRoot":"","sources":["../../../../../../packages/ketsuite/src/demo/stock.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,EAAE;AACF,0EAA0E;AAC1E,6EAA6E;AAC7E,4EAA4E;AAC5E,2EAA2E;AAC3E,8EAA8E;AAC9E,qDAAqD;AAMrD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAU;IACxC,MAAM,IAAI,CAAC,qBAAqB,EAAE;QAChC,EAAE,EAAE,cAAc;QAClB,IAAI,EAAE,wBAAwB;QAC9B,IAAI,EAAE,SAAS;QACf,cAAc,EAAE,UAAU;QAC1B,aAAa,EAAE,WAAW;KAC3B,CAAC,CAAA;IACF,MAAM,IAAI,CAAC,qBAAqB,EAAE;QAChC,EAAE,EAAE,eAAe;QACnB,IAAI,EAAE,sBAAsB;QAC5B,IAAI,EAAE,UAAU;QAChB,cAAc,EAAE,UAAU;QAC1B,aAAa,EAAE,WAAW;KAC3B,CAAC,CAAA;IACF,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,CAAA;AAC7F,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../../../packages/ketsuite/src/demo/user.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAErC,eAAO,MAAM,cAAc,uBAAuB,CAAA;AAkBlD,wBAAsB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAkBlG"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// Phase 1 of the `--demo-data` seed: a handful of extra staff logins.
|
|
2
|
+
//
|
|
3
|
+
// Not padded to 30+ — a single-company demo genuinely has a small team, and
|
|
4
|
+
// inventing headcount just to fill a page is exactly the fake volume the
|
|
5
|
+
// content bar rules out (see stock.ts for the same call on warehouses).
|
|
6
|
+
// Every login's password is the same fixed, clearly-labeled demo password —
|
|
7
|
+
// printed by the CLI so a developer can actually sign in as one of them.
|
|
8
|
+
export const STAFF_PASSWORD = 'ketsuite-demo-2026';
|
|
9
|
+
const STAFF = [
|
|
10
|
+
{ id: 'demo-user-lan-anh', login: 'lan.anh', name: 'Nguyễn Thị Lan Anh', email: 'lan.anh@ketsuite.local' },
|
|
11
|
+
{ id: 'demo-user-van-bao', login: 'van.bao', name: 'Trần Văn Bảo', email: 'van.bao@ketsuite.local' },
|
|
12
|
+
{
|
|
13
|
+
id: 'demo-user-thu-huong',
|
|
14
|
+
login: 'thu.huong',
|
|
15
|
+
name: 'Lê Thị Thu Hường',
|
|
16
|
+
email: 'thu.huong@ketsuite.local',
|
|
17
|
+
},
|
|
18
|
+
{ id: 'demo-user-duc-toan', login: 'duc.toan', name: 'Phạm Đức Toàn', email: 'duc.toan@ketsuite.local' },
|
|
19
|
+
{ id: 'demo-user-kim-yen', login: 'kim.yen', name: 'Vũ Thị Kim Yến', email: 'kim.yen@ketsuite.local' },
|
|
20
|
+
{ id: 'demo-user-van-son', login: 'van.son', name: 'Hoàng Văn Sơn', email: 'van.son@ketsuite.local' },
|
|
21
|
+
];
|
|
22
|
+
export async function seedStaff(call, companyId, branchId) {
|
|
23
|
+
const ids = [];
|
|
24
|
+
for (const staff of STAFF) {
|
|
25
|
+
await call('user.createUser', {
|
|
26
|
+
id: staff.id,
|
|
27
|
+
login: staff.login,
|
|
28
|
+
password: STAFF_PASSWORD,
|
|
29
|
+
name: staff.name,
|
|
30
|
+
email: staff.email,
|
|
31
|
+
defaultCompanyId: companyId,
|
|
32
|
+
defaultBranchId: branchId,
|
|
33
|
+
superuser: false,
|
|
34
|
+
});
|
|
35
|
+
await call('user.grantCompany', { id: `${staff.id}:${companyId}`, userId: staff.id, companyId });
|
|
36
|
+
await call('user.grantBranch', { id: `${staff.id}:${branchId}`, userId: staff.id, branchId });
|
|
37
|
+
ids.push(staff.id);
|
|
38
|
+
}
|
|
39
|
+
return ids;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=user.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../../../../../packages/ketsuite/src/demo/user.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,EAAE;AACF,4EAA4E;AAC5E,yEAAyE;AACzE,wEAAwE;AACxE,4EAA4E;AAC5E,yEAAyE;AAIzE,MAAM,CAAC,MAAM,cAAc,GAAG,oBAAoB,CAAA;AAIlD,MAAM,KAAK,GAAgB;IACzB,EAAE,EAAE,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,wBAAwB,EAAE;IAC1G,EAAE,EAAE,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,wBAAwB,EAAE;IACpG;QACE,EAAE,EAAE,qBAAqB;QACzB,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,0BAA0B;KAClC;IACD,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,yBAAyB,EAAE;IACxG,EAAE,EAAE,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,wBAAwB,EAAE;IACtG,EAAE,EAAE,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,wBAAwB,EAAE;CACtG,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAU,EAAE,SAAiB,EAAE,QAAgB;IAC7E,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,IAAI,CAAC,iBAAiB,EAAE;YAC5B,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ,EAAE,cAAc;YACxB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,gBAAgB,EAAE,SAAS;YAC3B,eAAe,EAAE,QAAQ;YACzB,SAAS,EAAE,KAAK;SACjB,CAAC,CAAA;QACF,MAAM,IAAI,CAAC,mBAAmB,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,SAAS,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;QAChG,MAAM,IAAI,CAAC,kBAAkB,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,QAAQ,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAA;QAC7F,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IACpB,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type Row = Record<string, unknown>;
|
|
2
|
+
export type Call = (name: string, input: Row) => Promise<Row>;
|
|
3
|
+
/** ASCII slug for a Vietnamese display name — used for technical fields (email, ref), never for the name itself. */
|
|
4
|
+
export declare const slug: (name: string) => string;
|
|
5
|
+
/** A distinct-looking Vietnamese mobile number, deterministic from an index. */
|
|
6
|
+
export declare const phoneVN: (index: number) => string;
|
|
7
|
+
//# sourceMappingURL=util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../../../packages/ketsuite/src/demo/util.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AACzC,MAAM,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAA;AAE7D,oHAAoH;AACpH,eAAO,MAAM,IAAI,SAAU,MAAM,KAAG,MAQX,CAAA;AAIzB,gFAAgF;AAChF,eAAO,MAAM,OAAO,UAAW,MAAM,KAAG,MAIvC,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Shared plumbing for the `--demo-data` seed. Kept separate from the domain
|
|
2
|
+
// files so each of those stays pure content plus the handful of calls it makes.
|
|
3
|
+
/** ASCII slug for a Vietnamese display name — used for technical fields (email, ref), never for the name itself. */
|
|
4
|
+
export const slug = (name) => name
|
|
5
|
+
.toLowerCase()
|
|
6
|
+
.replace(/đ/g, 'd')
|
|
7
|
+
.normalize('NFKD')
|
|
8
|
+
.replace(/[̀-ͯ]/g, '')
|
|
9
|
+
.replace(/[^a-z0-9\s-]/g, '')
|
|
10
|
+
.trim()
|
|
11
|
+
.replace(/\s+/g, '-');
|
|
12
|
+
const MOBILE_PREFIXES = ['090', '091', '093', '096', '097', '098', '032', '035', '070', '079', '081', '086'];
|
|
13
|
+
/** A distinct-looking Vietnamese mobile number, deterministic from an index. */
|
|
14
|
+
export const phoneVN = (index) => {
|
|
15
|
+
const prefix = MOBILE_PREFIXES[index % MOBILE_PREFIXES.length];
|
|
16
|
+
const rest = String(1000000 + ((index * 7919) % 8999999)).padStart(7, '0');
|
|
17
|
+
return `${prefix}${rest}`;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../../../../../packages/ketsuite/src/demo/util.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,gFAAgF;AAKhF,oHAAoH;AACpH,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,IAAY,EAAU,EAAE,CAC3C,IAAI;KACD,WAAW,EAAE;KACb,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;KAClB,SAAS,CAAC,MAAM,CAAC;KACjB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;KACrB,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;KAC5B,IAAI,EAAE;KACN,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AAEzB,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;AAE5G,gFAAgF;AAChF,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAa,EAAU,EAAE;IAC/C,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,CAAA;IAC9D,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC1E,OAAO,GAAG,MAAM,GAAG,IAAI,EAAE,CAAA;AAC3B,CAAC,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
declare var
|
|
1
|
+
declare var $c: ({ navigation: a, lifetime: t }: {
|
|
2
2
|
lifetime: any;
|
|
3
3
|
navigation: any;
|
|
4
4
|
}) => () => void;
|
|
5
|
-
export {
|
|
5
|
+
export { $c as backendShell };
|
|
6
6
|
//# sourceMappingURL=backend-shell.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend-shell.d.mts","sourceRoot":"","sources":["../../../../../../../../packages/ketsuite/src/modules/backend/design/client/backend-shell.mjs"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"backend-shell.d.mts","sourceRoot":"","sources":["../../../../../../../../packages/ketsuite/src/modules/backend/design/client/backend-shell.mjs"],"names":[],"mappings":"AAC4+zB,QAAA,IAAo1O,EAAE;;;gBAAiJ,CAAC;AAAA,OAAM,EAAC,EAAE,IAAI,YAAY,EAAC,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @ts-nocheck Generated by tools/build-backend-client.mjs — do not edit.
|
|
2
|
-
function ae(a){let t,i,n=0;async function u(l){let s=l.querySelector("input[type=email]"),y=l.querySelector("[data-email-status]");if(!s||!y)return;t?.abort(),clearTimeout(i);let k=++n,w=s.value.trim(),C=l.querySelector("[data-email-next]"),H=l.querySelector("[data-email-retry]"),L=(S,O)=>{y.textContent=S,C&&(C.disabled=!O),s.setAttribute("aria-invalid",String(!O)),l.dataset.emailAvailable=O?"true":"false"};if(H&&(H.hidden=!0),!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(w)){L(w?"Email ch\u01B0a \u0111\xFAng \u0111\u1ECBnh d\u1EA1ng.":"Nh\u1EADp email \u0111\u1EC3 ki\u1EC3m tra.",!1);return}L("\u0110ang ki\u1EC3m tra email\u2026",!1),i=setTimeout(async()=>{t=new AbortController;try{let S=await fetch(l.dataset.emailCheck,{method:"POST",cache:"no-store",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({email:w}),signal:AbortSignal.any([t.signal,AbortSignal.timeout(1e4)])});if(!S.ok)throw new Error("email-check-failed");let O=await S.json();if(k!==n||!l.isConnected)return;if(!O.ok)throw new Error("email-check-failed");L(O.available?"Email c\xF3 th\u1EC3 s\u1EED d\u1EE5ng.":"Email \u0111\xE3 \u0111\u01B0\u1EE3c s\u1EED d\u1EE5ng. Nh\u1EADp email kh\xE1c.",O.available)}catch{if(k!==n||!l.isConnected)return;L("Ch\u01B0a ki\u1EC3m tra \u0111\u01B0\u1EE3c email. Vui l\xF2ng th\u1EED l\u1EA1i.",!1),H&&(H.hidden=!1)}},400)}function d(l,s=!1){let y=l.querySelector('select[name="companyId"]'),k=l.querySelector('select[name="branchId"]'),w=l.querySelector('select[name="scopeKind"]')?.value;if(k&&y){s&&(k.value="");for(let S of k.options)S.value&&(S.hidden=S.dataset.companyId!==y.value,S.disabled=S.hidden)}let C=w==="tenant"?"tenant":w==="branch"?`branch:${y?.value}:${k?.value}`:`company:${y?.value}`;for(let S of l.querySelectorAll("[data-assigned-scopes]")){let D=JSON.parse(S.dataset.assignedScopes??"[]").includes(C);S.disabled=S.dataset.roleDisabled==="true"||D;let I=S.closest("[data-role-option]"),J=I?.querySelector("[data-role-assigned]"),X=I?.querySelector("[data-role-description]");J&&(J.hidden=!D),X&&(X.hidden=D),S.disabled&&(S.checked=!1)}let H=y?.closest('[data-ui="form-field"]'),L=k?.closest('[data-ui="form-field"]');H&&(H.hidden=w==="tenant"),L&&(L.hidden=w==="tenant"||w==="company")}function b(){for(let l of document.querySelectorAll("form[data-user-workflow]"))l.dataset.initialized||(l.dataset.initialized="true",d(l),u(l))}document.addEventListener("input",l=>{let s=l.target,y=s.closest("form[data-user-workflow]");if(y&&(s.type==="email"&&u(y),s.matches("[data-role-search]"))){let k=0;for(let C of y.querySelectorAll("[data-role-option]"))C.hidden=!C.textContent?.toLocaleLowerCase("vi").includes(s.value.toLocaleLowerCase("vi")),C.hidden||k++;let w=y.querySelector("[data-role-empty]");w&&(w.hidden=k>0)}},{signal:a}),document.addEventListener("change",l=>{let s=l.target,y=s.closest("form[data-user-workflow]");y&&s.matches('select[name="companyId"],select[name="branchId"],select[name="scopeKind"]')&&d(y,s.matches('select[name="companyId"]'))},{signal:a}),document.addEventListener("click",l=>{let s=l.target;s.matches("[data-email-retry]")&&u(s.closest("form"))},{signal:a}),document.addEventListener("submit",l=>{let s=l.target;s.matches("form[data-user-workflow]")&&s.querySelector("input[type=email]")&&s.dataset.emailAvailable!=="true"&&l.preventDefault()},{signal:a});let v=new MutationObserver(b);return v.observe(document.documentElement,{childList:!0,subtree:!0}),b(),()=>{t?.abort(),clearTimeout(i),v.disconnect()}}import{each as Nt}from"/_ket/view/index.js";import{Fragment as qt,jsx as $t,jsxs as Gt}from"/_ket/view/jsx-runtime.js";var ie=["action","action-leading","action-label","action-spinner","action-group"];import{jsx as Ut,jsxs as Wt}from"/_ket/view/jsx-runtime.js";var ne=["badge","tag","tag-remove","count-badge","avatar","code"];import{each as Zt}from"/_ket/view/index.js";import{Fragment as ea,jsx as jt,jsxs as ta}from"/_ket/view/jsx-runtime.js";var re=["notice","notice-mark","notice-copy","notice-title","notice-message","notice-actions","empty","empty-mark","empty-title","empty-message","empty-actions","loading","loading-label"];import{each as Aa}from"/_ket/view/index.js";import{each as ha}from"/_ket/view/index.js";import{Fragment as la,jsx as na,jsxs as ra}from"/_ket/view/jsx-runtime.js";import{jsx as ca,jsxs as ua}from"/_ket/view/jsx-runtime.js";var oe=["app-shell","app-sidebar","app-main","app-right-rail","page","page-context","page-header","page-heading","page-eyebrow","page-title-row","page-title","page-description","page-subline","page-status","page-actions","page-meta","page-body","record-canvas","record-content","record-section","record-section-title"];import{Fragment as xa,jsx as va,jsxs as Sa}from"/_ket/view/jsx-runtime.js";var de=["stack","inline","grid","card-grid","surface","surface-head","surface-heading","surface-title","surface-description","surface-actions","disclosure","disclosure-summary","disclosure-body","section","section-head","section-eyebrow","section-title","section-description","section-actions","section-body","content-card","card-media","card-head","card-leading","card-heading","card-eyebrow","card-title","card-summary","card-status","card-body","card-meta","card-actions","kanban","kanban-card","kanban-media","kanban-title","kanban-meta","kanban-note","kanban-actions","metric","metric-icon","metric-label","metric-value","metric-detail"];import{each as Ra}from"/_ket/view/index.js";import{Fragment as La,jsx as Ha}from"/_ket/view/jsx-runtime.js";import{jsx as Ja,jsxs as Xa}from"/_ket/view/jsx-runtime.js";var se=["field","field-label","field-required","field-control","field-options","field-option","field-option-input","field-help","field-error"];import{each as Ba}from"/_ket/view/index.js";import{jsx as qa,jsxs as Ga}from"/_ket/view/jsx-runtime.js";var ce=["breadcrumbs","breadcrumb","breadcrumb-overflow","breadcrumb-overflow-trigger","breadcrumb-overflow-list","nav-list","nav-item","nav-item-leading","nav-item-label","nav-item-count","tabs","tab","tab-count"];import{jsx as Ua,jsxs as Wa}from"/_ket/view/jsx-runtime.js";var ue=["progress","progress-label","progress-value","progress-track","progress-bar"];import{each as Za}from"/_ket/view/index.js";import{Fragment as ti,jsx as ja,jsxs as ei}from"/_ket/view/jsx-runtime.js";var me=["menu","menu-trigger","menu-panel","menu-label","menu-separator","menu-item","menu-item-leading","menu-item-copy","menu-item-check","menu-item-shortcut"];import{jsx as ni,jsxs as ri}from"/_ket/view/jsx-runtime.js";var ge=["popover","popover-trigger","popover-panel","popover-close"];import{jsx as di,jsxs as si}from"/_ket/view/jsx-runtime.js";var be=["tooltip","tooltip-trigger","tooltip-content"];import{jsx as mi,jsxs as gi}from"/_ket/view/jsx-runtime.js";var fe=["modal-layer","modal-backdrop","modal-sheet","modal-head","modal-heading","modal-title","modal-description","modal-close","modal-body","modal-actions"];import{jsx as yi}from"/_ket/view/jsx-runtime.js";var he=["dialog","confirm-dialog-message"];import{each as Si}from"/_ket/view/index.js";import{jsx as wi,jsxs as ki}from"/_ket/view/jsx-runtime.js";var pe=["toast-region","toast","toast-copy","toast-title","toast-message","toast-actions"];import{jsx as Ci}from"/_ket/view/jsx-runtime.js";var ye=["spinner","visually-hidden"];import{each as Oi}from"/_ket/view/index.js";import{jsx as Mi}from"/_ket/view/jsx-runtime.js";var ve=["skeleton","skeleton-line"];var gt=["a[href]","button:not([disabled])","input:not([disabled])","select:not([disabled])","textarea:not([disabled])","summary",'[tabindex]:not([tabindex="-1"])'].join(","),B=a=>[...a.querySelectorAll(gt)].filter(t=>t instanceof HTMLElement&&!t.hidden&&t.getAttribute("aria-hidden")!=="true"&&(typeof t.checkVisibility!="function"||t.checkVisibility())),W=(a=document)=>{let t=document.activeElement instanceof HTMLElement?document.activeElement:null,i=a.querySelector('[data-ui="modal-layer"][data-route-modal="true"] [role="dialog"]'),n=a.querySelector('[data-ui="app-shell"], [data-ui="shell"]'),u=n instanceof HTMLElement?n.inert:!1;if(i instanceof HTMLElement){n instanceof HTMLElement&&!n.contains(i)&&(n.inert=!0);let e=B(i)[0];(e instanceof HTMLElement?e:i).focus()}let d=[...a.querySelectorAll('[data-ui="menu"]')].filter(e=>e instanceof HTMLDetailsElement),b=e=>{let o=e.querySelector('[data-ui="menu-trigger"]');o instanceof HTMLElement&&o.setAttribute("aria-expanded",String(e.open))},v=d.map(e=>{let o=()=>b(e);return e.addEventListener("toggle",o),b(e),()=>e.removeEventListener("toggle",o)}),l=window.matchMedia("(max-width: 48rem)"),s=document.documentElement,y=s.dataset.kvNavigationOpen,k=[...a.querySelectorAll('[data-ui="app-navigation"]')].filter(e=>e instanceof HTMLDetailsElement),w=new Map,C=e=>{let o=w.get(e);if(o?.targets){for(let{element:r,inert:f}of o.targets)r.inert=f;o.targets=null}},H=()=>{l.matches&&k.some(o=>o.open)?s.dataset.kvNavigationOpen="true":y===void 0?delete s.dataset.kvNavigationOpen:s.dataset.kvNavigationOpen=y},L=e=>{let o=e.querySelector('[data-ui="navigation-trigger"]'),r=e.querySelector('[data-ui="navigation-drawer"]');if(!(o instanceof HTMLElement)||!(r instanceof HTMLElement))return;let f=l.matches;if(o.dataset.open=String(f&&e.open),!f){r.removeAttribute("role"),r.removeAttribute("aria-modal"),r.removeAttribute("aria-label"),C(e),H();return}if(r.setAttribute("role","dialog"),r.setAttribute("aria-modal","true"),r.setAttribute("aria-label",r.dataset.navigationLabel??"Navigation"),!e.open){C(e),H();return}let h=w.get(e)??{};if(!h.targets){let p=e.closest('[data-ui="app-shell"], [data-ui="shell"]'),P=p?[...p.querySelectorAll(':scope > [data-ui="app-main"], :scope > [data-ui="main"], :scope > [data-ui="app-right-rail"]')].filter(R=>R instanceof HTMLElement).map(R=>({element:R,inert:R.inert})):[];for(let{element:R}of P)R.inert=!0;h.targets=P,h.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:o,w.set(e,h),queueMicrotask(()=>{if(!e.open||!l.matches)return;let R=r.querySelector('[data-ui="navigation-item"][aria-current="page"]'),A=B(r)[0],E=R instanceof HTMLElement?R:A;(E instanceof HTMLElement?E:r).focus()})}H()},S=(e,o=!0)=>{let r=w.get(e);e.open=!1,L(e),o&&r?.returnFocus instanceof HTMLElement&&r.returnFocus.isConnected&&r.returnFocus.focus(),w.delete(e)},O=k.map(e=>{let o=()=>L(e),r=f=>{let h=f.target;if(!(h instanceof Element))return;let P=h.closest('[data-ui="navigation-branch-trigger"]')?.closest('[data-ui="navigation-branch"]');if(P instanceof HTMLDetailsElement&&P.open){f.preventDefault();return}!l.matches||!e.open||(h.closest('[data-ui="navigation-close"]')||h.closest('[data-ui="navigation-backdrop"]')||h.closest('[data-ui="navigation-item"]'))&&S(e)};return e.addEventListener("toggle",o),e.addEventListener("click",r),L(e),()=>{e.removeEventListener("toggle",o),e.removeEventListener("click",r),C(e)}}),D=()=>{for(let e of k)e.open?S(e,!1):L(e)};l.addEventListener("change",D);for(let e of a.querySelectorAll('[data-ui="popover"][data-open="true"]')){let o=e.querySelector('[data-ui="popover-trigger"]'),r=e.querySelector('[data-ui="popover-panel"]');if(!(o instanceof HTMLElement)||!(r instanceof HTMLElement))continue;let f=o.getBoundingClientRect(),h=8,p=e.getAttribute("data-placement")??"bottom-start",P=p.startsWith("top"),R=p.endsWith("end"),A=f.top-r.offsetHeight-h,E=f.bottom+h,g=A>=8,c=E+r.offsetHeight<=window.innerHeight-8,T=P?g||!c:!c&&g,m=R?f.right-r.offsetWidth:f.left,x=Math.max(8,Math.min(m,window.innerWidth-r.offsetWidth-8)),F=Math.max(8,Math.min(T?A:E,window.innerHeight-r.offsetHeight-8));r.dataset.runtimePositioned="true",r.dataset.runtimePlacement=`${T?"top":"bottom"}-${R?"end":"start"}`,r.style.left=`${Math.round(x)}px`,r.style.top=`${Math.round(F)}px`,r.style.right="auto",r.style.bottom="auto"}let I=e=>{let o=k.find(g=>l.matches&&g.open);if(o instanceof HTMLDetailsElement){let g=o.querySelector('[data-ui="navigation-drawer"]');if(e.key==="Escape"){S(o),e.preventDefault();return}if(e.key==="Tab"&&g instanceof HTMLElement){let c=B(g),T=c[0],m=c.at(-1);if(!c.length){e.preventDefault(),g.focus();return}if(e.shiftKey&&(document.activeElement===T||document.activeElement===g)){e.preventDefault(),m instanceof HTMLElement&&m.focus();return}if(!e.shiftKey&&document.activeElement===m){e.preventDefault(),T instanceof HTMLElement&&T.focus();return}}}let r=document.activeElement?.closest('[data-ui="tree"] [role="treeitem"]');if(r instanceof HTMLElement){let g=r.closest('[data-ui="tree"]'),c=g?[...g.querySelectorAll('[role="treeitem"]')].filter(x=>x instanceof HTMLElement):[],T=c.indexOf(r),m=-1;if(e.key==="ArrowDown")m=Math.min(c.length-1,T+1);else if(e.key==="ArrowUp")m=Math.max(0,T-1);else if(e.key==="Home")m=0;else if(e.key==="End")m=c.length-1;else if(e.key==="ArrowRight"){let x=Number(r.getAttribute("aria-level"));r.getAttribute("aria-expanded")==="true"&&Number(c[T+1]?.getAttribute("aria-level"))>x&&(m=T+1)}else if(e.key==="ArrowLeft"){let x=Number(r.getAttribute("aria-level"));x>1&&(m=c.findLastIndex((F,rt)=>rt<T&&Number(F.getAttribute("aria-level"))<x))}if(m>=0&&c[m]){for(let x of c)x.tabIndex=-1;c[m].tabIndex=0,c[m].focus(),e.preventDefault();return}}let f=document.activeElement?.closest('[data-ui="tree-grid-row"]');if(f instanceof HTMLElement){let g=f.closest('[data-ui="tree-grid"]'),c=g?[...g.querySelectorAll('[data-ui="tree-grid-row"]')].filter(x=>x instanceof HTMLElement):[],T=c.indexOf(f),m=e.key==="ArrowDown"?Math.min(c.length-1,T+1):e.key==="ArrowUp"?Math.max(0,T-1):e.key==="Home"?0:e.key==="End"?c.length-1:-1;if(m>=0&&c[m]){for(let x of c)x.tabIndex=-1;c[m].tabIndex=0,c[m].focus(),e.preventDefault();return}}let h=document.activeElement?.closest('[data-ui="menu"]');if(h instanceof HTMLDetailsElement&&!h.open){let g=h.querySelector('[data-ui="menu-trigger"]');if(document.activeElement===g&&(e.key==="ArrowDown"||e.key==="ArrowUp")){h.open=!0;let c=[...h.querySelectorAll('[role="menuitem"], [role="menuitemcheckbox"], [role="menuitemradio"]')].filter(m=>m instanceof HTMLElement&&m.getAttribute("aria-disabled")!=="true"),T=e.key==="ArrowUp"?c.at(-1):c[0];T instanceof HTMLElement&&T.focus(),e.preventDefault();return}}let p=document.activeElement?.closest('[data-ui="menu"][open]');if(p instanceof HTMLDetailsElement){let g=p.querySelector('[data-ui="menu-trigger"]'),c=[...p.querySelectorAll('[role="menuitem"], [role="menuitemcheckbox"], [role="menuitemradio"]')].filter(F=>F instanceof HTMLElement&&F.getAttribute("aria-disabled")!=="true"),T=document.activeElement,m=T instanceof HTMLElement?c.indexOf(T):-1,x=-1;if(e.key==="ArrowDown"?x=m<0?0:(m+1)%c.length:e.key==="ArrowUp"?x=m<0?c.length-1:(m-1+c.length)%c.length:e.key==="Home"?x=0:e.key==="End"&&(x=c.length-1),x>=0&&c[x]instanceof HTMLElement){c[x].focus(),e.preventDefault();return}if((e.key==="Enter"||e.key===" ")&&document.activeElement===g){c[0]instanceof HTMLElement&&c[0].focus(),e.preventDefault();return}}if(e.key==="Escape"&&p instanceof HTMLDetailsElement){p.open=!1;let g=p.querySelector('[data-ui="menu-trigger"]');g instanceof HTMLElement&&g.focus(),e.preventDefault();return}let P=document.activeElement?.closest('[data-ui="popover"][data-open="true"]');if(e.key==="Escape"&&P instanceof HTMLElement){let g=P.querySelector('[data-ui="popover-close"]');g instanceof HTMLElement&&g.click(),e.preventDefault();return}if(!(i instanceof HTMLElement))return;if(e.key==="Escape"){let g=i.querySelector('[data-ui="modal-close"]');g instanceof HTMLElement&&g.click(),e.preventDefault();return}if(e.key!=="Tab")return;let R=B(i);if(!R.length){e.preventDefault(),i.focus();return}let A=R[0],E=R.at(-1);e.shiftKey&&(document.activeElement===A||document.activeElement===i)?(e.preventDefault(),E instanceof HTMLElement&&E.focus()):!e.shiftKey&&document.activeElement===E&&(e.preventDefault(),A instanceof HTMLElement&&A.focus())},J=e=>{let o=[...e.querySelectorAll('[data-ui="row-select"]')].filter(p=>p instanceof HTMLInputElement&&!p.disabled),r=o.filter(p=>p.checked),f=e.querySelector('[data-ui="select-all"]');f instanceof HTMLInputElement&&(f.checked=o.length>0&&r.length===o.length,f.indeterminate=r.length>0&&r.length<o.length);for(let p of o)p.closest('[data-ui="row"]')?.toggleAttribute("data-selected",p.checked);let h=o[0]?.getAttribute("form");if(h)for(let p of document.querySelectorAll(`[data-ui="bulk-actions"][data-form="${CSS.escape(h)}"]`)){r.length?p.setAttribute("data-has-selection","true"):p.removeAttribute("data-has-selection");for(let P of p.querySelectorAll('[data-ui="bulk-count"]'))P.textContent=String(r.length);for(let P of p.querySelectorAll('[data-ui="bulk-action-list"] button'))P instanceof HTMLButtonElement&&P.dataset.kvAlwaysDisabled!=="true"&&(P.disabled=r.length===0)}},X=e=>{let o=e.target;if(!(o instanceof HTMLInputElement))return;let r=o.getAttribute("data-ui");if(r!=="select-all"&&r!=="row-select")return;let f=o.closest('[data-ui="table"]');if(f){if(r==="select-all")for(let h of f.querySelectorAll('[data-ui="row-select"]'))h instanceof HTMLInputElement&&!h.disabled&&(h.checked=o.checked);J(f)}};for(let e of a.querySelectorAll('[data-ui="table"]'))e.querySelector('[data-ui="row-select"]')&&J(e);document.addEventListener("change",X);let te=e=>{let o=e.target;if(o instanceof Node)for(let r of a.querySelectorAll('[data-ui="menu"][open]')){if(!(r instanceof HTMLDetailsElement))continue;let f=o instanceof Element?o.closest('[data-ui="menu-item"]'):null;(!r.contains(o)||f&&f.getAttribute("aria-disabled")!=="true")&&(r.open=!1)}};return document.addEventListener("keydown",I),document.addEventListener("click",te),()=>{document.removeEventListener("keydown",I),document.removeEventListener("click",te),document.removeEventListener("change",X);for(let e of v)e();l.removeEventListener("change",D);for(let e of O)e();y===void 0?delete s.dataset.kvNavigationOpen:s.dataset.kvNavigationOpen=y,n instanceof HTMLElement&&(n.inert=u),t?.isConnected&&t.focus()}};import{jsx as Ii,jsxs as Ji}from"/_ket/view/jsx-runtime.js";import{jsx as $i,jsxs as qi}from"/_ket/view/jsx-runtime.js";var Te=["switch-control","switch-track"];import{each as zi}from"/_ket/view/index.js";import{Fragment as Zi,jsx as _i,jsxs as Qi}from"/_ket/view/jsx-runtime.js";var we=["combobox","combobox-input-row","combobox-toggle","combobox-listbox","combobox-option","combobox-empty","tag-picker"];import{jsx as an,jsxs as nn}from"/_ket/view/jsx-runtime.js";var ke=["date-range"];import{jsx as dn,jsxs as sn}from"/_ket/view/jsx-runtime.js";var Pe=["file-upload","drop-zone","upload-status"];import{jsx as gn}from"/_ket/view/jsx-runtime.js";var Re=["relation-picker"];import{each as hn}from"/_ket/view/index.js";import{jsx as xn,jsxs as Sn}from"/_ket/view/jsx-runtime.js";var Ce=["search-bar","filter-bar","applied-filters","applied-filter","saved-views","saved-view","view-settings","view-settings-options"];import{jsx as Pn,jsxs as Rn}from"/_ket/view/jsx-runtime.js";var Le=["inline-edit","inline-edit-value","inline-edit-form","inline-edit-actions"];import{each as Kn}from"/_ket/view/index.js";import{each as En}from"/_ket/view/index.js";import{Fragment as In,jsx as Dn,jsxs as Fn}from"/_ket/view/jsx-runtime.js";var He=["list-chrome","list-chrome-row","list-search","list-search-label","list-search-input","list-search-submit","list-facets","list-facet","list-facet-count","list-view-switch","list-view","list-sort","list-sort-label","list-sort-select","list-status","list-actions","bulk-actions","bulk-summary","bulk-count","bulk-action-list","pager-bar","pager-summary","pager-pages","pager-page","pager-actions","pager-link"];import{jsx as qn,jsxs as Gn}from"/_ket/view/jsx-runtime.js";var Oe=["resource-list","resource-list-item","resource-list-select","resource-list-link"];import{each as Un}from"/_ket/view/index.js";import{jsx as _n,jsxs as Qn}from"/_ket/view/jsx-runtime.js";var Ee=["data-grid-scroll","data-grid","data-grid-cap","data-grid-cell"];import{each as jn}from"/_ket/view/index.js";import{jsx as tr,jsxs as ar}from"/_ket/view/jsx-runtime.js";var Me=["tree","tree-item","tree-link","tree-grid","tree-grid-row"];import{each as rr}from"/_ket/view/index.js";import{jsx as or,jsxs as dr}from"/_ket/view/jsx-runtime.js";var Ae=["data-matrix","data-matrix-head","data-matrix-heading","data-matrix-eyebrow","data-matrix-title","data-matrix-description","data-matrix-summary","data-matrix-scroll","data-matrix-table","data-matrix-column","data-matrix-row-head","data-matrix-row-leading","data-matrix-row-title","data-matrix-row-description","data-matrix-row-status","data-matrix-row-actions","data-matrix-cell"];import{each as ur}from"/_ket/view/index.js";import{jsx as gr,jsxs as br}from"/_ket/view/jsx-runtime.js";var De=["bar-chart","bar-chart-rows","bar-chart-row","bar-chart-label","bar-chart-caption","bar-chart-track","bar-chart-fill","bar-chart-segment","bar-chart-value","bar-chart-scale","bar-chart-legend","bar-chart-legend-item","bar-chart-legend-swatch","bar-chart-empty"];import{each as pr}from"/_ket/view/index.js";import{jsx as vr,jsxs as xr}from"/_ket/view/jsx-runtime.js";var Fe=["timeframe","timeframe-menu","timeframe-trigger","timeframe-label","timeframe-value","timeframe-content","timeframe-option","timeframe-option-label","timeframe-option-detail","timeframe-range","timeframe-asof","timeframe-note"];import{each as wr}from"/_ket/view/index.js";import{jsx as Rr,jsxs as Cr}from"/_ket/view/jsx-runtime.js";var Ie=["description-list","key-value","key-value-label","key-value-value","person","person-body","avatar-group","status"];import{jsx as Or}from"/_ket/view/jsx-runtime.js";var Je=["formatted-date","formatted-number","formatted-money"];import{each as Ar}from"/_ket/view/index.js";import{jsx as Xr,jsxs as Kr}from"/_ket/view/jsx-runtime.js";var Ke=["record-summary","record-summary-main","record-actions","record-rail"];import{each as $r}from"/_ket/view/index.js";import{jsx as zr,jsxs as Ur}from"/_ket/view/jsx-runtime.js";var Be=["activity-timeline","activity-item","activity-marker","audit-log","audit-item"];import{each as Qr}from"/_ket/view/index.js";import{jsx as jr,jsxs as el}from"/_ket/view/jsx-runtime.js";var $e=["attachments","attachment","media-gallery","media-item"];import{each as il}from"/_ket/view/index.js";import{Fragment as ol,jsx as rl,jsxs as ll}from"/_ket/view/jsx-runtime.js";var qe=["app-navigation","navigation-trigger","navigation-trigger-icon","navigation-trigger-identity","navigation-trigger-label","navigation-layer","navigation-backdrop","navigation-drawer","navigation-header","navigation-identity","navigation-context","navigation-close","navigation-groups","navigation-group","navigation-group-label","navigation-items","navigation-supplementary","navigation-item","navigation-branch","navigation-branch-trigger","navigation-children","navigation-item-leading","navigation-item-copy","navigation-item-label","navigation-item-description","navigation-item-count","navigation-footer"];import{each as ml}from"/_ket/view/index.js";import{Fragment as yl,jsx as hl,jsxs as pl}from"/_ket/view/jsx-runtime.js";var Ge=["table-scroll","table","table-caption","select-col","select-all","col","sort-link","sort-icon","row","group-row","group-cell","group-link","group-indent","group-count","group-pager","group-pager-actions","cell","select-cell","row-select","row-link"];import{jsx as Rl,jsxs as Cl}from"/_ket/view/jsx-runtime.js";var Ve=["list-page","list-page-context","list-page-header","list-page-heading","list-page-title-row","list-page-eyebrow","list-page-title","list-page-description","list-page-actions","list-page-toolbar","list-page-controls","list-page-status","list-page-body","list-page-footer"];import{jsx as El,jsxs as Ml}from"/_ket/view/jsx-runtime.js";var ze=["record-page","record-page-context","record-page-header","record-page-title-row","record-page-heading","record-page-title","record-page-subline","record-page-status","record-page-description","record-page-actions","record-page-meta","record-page-controller","record-page-navigation","record-page-layout","record-page-body","record-page-aside"];var Ue=["form-page","form-page-context","form-page-header","form-page-title-row","form-page-heading","form-page-title","form-page-subline","form-page-status","form-page-description","form-page-actions","form-page-meta","form-page-controller","form-page-navigation","form-page-layout","form-page-body","form-page-aside"];import{jsx as Bl,jsxs as $l}from"/_ket/view/jsx-runtime.js";var We=["dashboard-page","dashboard-page-context","dashboard-page-header","dashboard-page-heading","dashboard-page-eyebrow","dashboard-page-title-row","dashboard-page-title","dashboard-page-subline","dashboard-page-status","dashboard-page-description","dashboard-page-actions","dashboard-page-meta","dashboard-page-body"];var _e=["board-page","board-page-context","board-page-header","board-page-heading","board-page-eyebrow","board-page-title-row","board-page-title","board-page-subline","board-page-status","board-page-description","board-page-actions","board-page-meta","board-page-toolbar","board-page-controls","board-page-body"];import{each as Zl}from"/_ket/view/index.js";import{jsx as jl,jsxs as eo}from"/_ket/view/jsx-runtime.js";var Qe=["pipeline","pipeline-step","pipeline-arrow","pipeline-step-label","pipeline-step-value","pipeline-step-node"];import{each as ro}from"/_ket/view/index.js";import{jsx as co,jsxs as uo}from"/_ket/view/jsx-runtime.js";var Ze=["record-form","form-errors","form-grid","form-actions"];var Ye={actions:ie,feedback:re,fields:se,status:ne,navigation:ce,progress:ue,menu:me,popover:ge,tooltip:be,dialog:he,toast:pe,spinner:ye,skeleton:ve,scalarFields:Te,combobox:we,dateTime:ke,upload:Pe,relationPicker:Re,listControls:Ce,inlineEdit:Le,resourceList:Oe,dataGrid:Ee,tree:Me,matrix:Ae,barChart:De,timeframe:Fe,recordDisplay:Ie,formattedValues:Je,recordComposition:Ke,activity:Be,media:$e,layouts:de,shell:oe,appNavigation:qe,table:Ge,listChrome:He,listPage:Ve,formPage:Ue,recordPage:ze,dashboardPage:We,boardPage:_e,modal:fe,pipeline:Qe,form:Ze},kt=[...new Set(Object.values(Ye).flat())].sort(),Pt=Object.freeze(Object.fromEntries(Object.entries(Ye).map(([a,t])=>[a,[...t]])));var j="ket.backend.theme",Y=['[data-ui="search-menu"]','[data-ui="col-config"]','[data-ui="bulk-actions"]','[data-ui="viewer"]','[data-ui="record-more"]'].join(", "),at=globalThis,M=a=>a.target instanceof Element?a.target:null,V=a=>a==="light"||a==="dark"?a:null,Rt=()=>{try{return V(localStorage.getItem(j))}catch{return null}},Ct=a=>{try{localStorage.setItem(j,a)}catch{}},it=()=>V(document.documentElement.dataset.theme)??(matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),q=()=>{let a=String(it()==="dark");for(let t of document.querySelectorAll('[data-ui="sidebar-tools"] [data-ui="action"][name="theme"]'))t.setAttribute("aria-pressed",a)},Lt=a=>{let t=Rt();t&&(document.documentElement.dataset.theme=t),q(),document.addEventListener("click",i=>{let n=M(i)?.closest('[data-ui="sidebar-tools"] [data-ui="action"][name="theme"]');if(!n||n.disabled)return;let u=it()==="dark"?"light":"dark";document.documentElement.dataset.theme=u,Ct(u),q()},{signal:a}),matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{V(document.documentElement.dataset.theme)||q()},{signal:a}),addEventListener("storage",i=>{if(i.key!==j)return;let n=V(i.newValue);n?document.documentElement.dataset.theme=n:delete document.documentElement.dataset.theme,q()},{signal:a})},Ht=a=>{let t=[...a.querySelectorAll('[data-ui="row-select"]:not(:disabled)')],i=t.filter(u=>u.checked).length,n=a.querySelector('[data-ui="select-all"]');if(n&&(n.checked=t.length>0&&i===t.length,n.indeterminate=i>0&&i<t.length),!i){let u=a.closest('[data-ui="app-shell"]');for(let d of u?.querySelectorAll('[data-ui="bulk-actions"][open]')??[])d.removeAttribute("open")}},Ot=(a,t)=>{document.addEventListener("change",i=>{let n=M(i);if(!(n instanceof HTMLInputElement)||!n.matches('[data-ui="select-all"], [data-ui="row-select"]'))return;let u=n.closest('[data-ui="table"]');if(u){if(n.matches('[data-ui="select-all"]'))for(let d of u.querySelectorAll('[data-ui="row-select"]:not(:disabled)'))d.checked=n.checked;Ht(u)}},{signal:a}),document.addEventListener("click",i=>{if(i.defaultPrevented||i.button!==0||i.metaKey||i.ctrlKey||i.shiftKey||i.altKey)return;let n=M(i);if(n?.closest('a, button, input, select, textarea, label, summary, details, [data-ui="select-cell"]'))return;let d=n?.closest('[data-ui="row"][data-row-href]')?.getAttribute("data-row-href");d&&(i.preventDefault(),t.navigate(d))},{signal:a}),document.addEventListener("keydown",i=>{if(i.defaultPrevented||i.key!=="Enter"&&i.key!==" ")return;let n=M(i),d=(n?.matches('[data-ui="row"][data-row-href][tabindex="0"]')?n:null)?.getAttribute("data-row-href");d&&(i.preventDefault(),ee(d,t))},{signal:a})},je=()=>[...document.querySelectorAll(`${Y}[open]`)],Et=a=>{document.addEventListener("click",t=>{let i=M(t)?.closest(Y);for(let n of je())n!==i&&!n.contains(i??null)&&n.removeAttribute("open")},{signal:a}),document.addEventListener("keydown",t=>{if(t.key!=="Escape")return;let i=je();if(!i.length)return;let n=document.activeElement?.closest(Y),u=n?.open?n:i.at(-1);u?.removeAttribute("open"),u?.querySelector("summary")?.focus(),t.preventDefault()},{signal:a})},Mt=a=>{document.addEventListener("click",t=>{let i=M(t)?.closest('[data-ui="chrome-search-toggle"]'),n=i?.getAttribute("aria-controls");if(!i||!n)return;let u=document.getElementById(n);!(u instanceof HTMLDialogElement)||u.open||(u.showModal(),i.setAttribute("aria-expanded","true"),requestAnimationFrame(()=>u.querySelector('[data-presentation="modal"] [data-ui="chrome-search-input"]')?.focus()))},{signal:a}),document.addEventListener("cancel",t=>{M(t)?.matches('[data-ui="chrome-search-modal"]')&&t.preventDefault()},{capture:!0,signal:a}),document.addEventListener("close",t=>{let i=M(t);if(!(i instanceof HTMLDialogElement)||!i.matches('[data-ui="chrome-search-modal"]'))return;let n=document.querySelector(`[data-ui="chrome-search-toggle"][aria-controls="${CSS.escape(i.id)}"]`);n?.setAttribute("aria-expanded","false"),n?.focus()},{capture:!0,signal:a})},At=["a[href]","button:not(:disabled)",'input:not(:disabled):not([type="hidden"])',"select:not(:disabled)","textarea:not(:disabled)",'[tabindex]:not([tabindex="-1"])'].join(", "),G=()=>document.querySelector('[data-ui="modal-layer"][data-route-modal="true"]'),et=a=>[...a.querySelectorAll(At)].filter(t=>!t.hidden&&t.getAttribute("aria-hidden")!=="true"&&!t.matches('[data-ui="modal-backdrop"]')),ee=(a,t)=>{t.navigate(a)},Dt=(a,t)=>a.composedPath().some(i=>i instanceof HTMLElement&&i!==t&&i.matches('[data-ui="modal-layer"][data-presentation="dialog"]')),nt=a=>{for(let t of a.querySelectorAll('input:not([type="hidden"])'))if(!t.disabled){if(t.type==="checkbox"||t.type==="radio"){if(t.checked!==t.defaultChecked)return!0}else if(t.value!==t.defaultValue)return!0}for(let t of a.querySelectorAll("textarea"))if(!t.disabled&&t.value!==t.defaultValue)return!0;for(let t of a.querySelectorAll("select"))if(!t.disabled){for(let i of t.options)if(i.selected!==i.defaultSelected)return!0}return!1},tt=a=>{if(!nt(a))return!0;let t=a.getAttribute("data-unsaved-prompt");return t?at.confirm(t):!0},Ft=(a,t)=>{if(typeof EventSource!="function")return;let i=null,n=null,u=()=>{n?.close(),n=null,i=null},d=()=>{let v=document.querySelector('[data-ui="live-region"][data-stream]');if(v===i)return;u();let l=v instanceof HTMLElement?v.dataset.stream??"":"";if(!l)return;i=v,n=new EventSource(`/_ket/stream/${encodeURIComponent(l)}`);let s=()=>ee(location.href,t);n.onmessage=s,n.addEventListener("done",()=>{u(),s()}),n.onerror=()=>{n?.readyState===EventSource.CLOSED&&u()}};d();let b=new MutationObserver(d);return b.observe(document.body,{childList:!0,subtree:!0}),addEventListener("pagehide",u,{signal:a}),()=>{b.disconnect(),u()}},It=(a,t)=>{let i=new WeakSet,n=()=>{let d=G();!d||i.has(d)||(i.add(d),requestAnimationFrame(()=>{let b=d.querySelector('[data-ui="modal-sheet"]');(et(d).find(l=>!l.matches('[data-ui="modal-close"]'))??b)?.focus()}))};n();let u=new MutationObserver(n);return u.observe(document.body,{childList:!0,subtree:!0}),document.addEventListener("click",d=>{let b=G();if(!b)return;let v=d.composedPath().find(l=>l instanceof HTMLElement&&(l.matches('[data-ui="modal-close"], [data-ui="modal-backdrop"], a[data-ui="tab"]')||l.matches('a[data-ui="action"][href]')));!v||!b.contains(v)||tt(b)||(d.preventDefault(),d.stopPropagation())},{capture:!0,signal:a}),document.addEventListener("click",d=>{let b=document.querySelector("[data-save-before-navigation]"),v=b instanceof HTMLFormElement?b:b?.querySelector("form"),l=M(d)?.closest("a[href]");if(!b||!v||!l||G()||!nt(b)||(d.preventDefault(),d.stopPropagation(),!at.confirm(b.dataset.saveBeforeNavigation)))return;let s=v.querySelector('input[name="returnTo"]');s||(s=document.createElement("input"),s.type="hidden",s.name="returnTo",v.append(s)),s.value=l.href,v.requestSubmit()},{capture:!0,signal:a}),document.addEventListener("keydown",d=>{let b=G();if(!b||Dt(d,b))return;if(d.key==="Escape"){let y=b.querySelector('[data-ui="modal-close"]');if(!y||(d.preventDefault(),!tt(b)))return;ee(y.getAttribute("href")??y.href,t);return}if(d.key!=="Tab")return;let v=et(b);if(!v.length)return;let l=v[0],s=v.at(-1);d.shiftKey&&document.activeElement===l?(d.preventDefault(),s.focus()):!d.shiftKey&&document.activeElement===s&&(d.preventDefault(),l.focus())},{signal:a}),()=>u.disconnect()},Jt=(a,t)=>{document.addEventListener("ket:records-changed",()=>{document.querySelector('[data-ket-slot="backend.content"]')&&t.navigate(location.href,{replace:!0})},{signal:a})},Ic=({navigation:a,lifetime:t})=>{Jt(t,a);let i=W(document),n=ae(t);Lt(t),Ot(t,a),Et(t),Mt(t);let u=It(t,a),d=Ft(t,a);return()=>{i(),d?.(),u(),n()}};export{Ic as backendShell};
|
|
2
|
+
function ie(a){let t,i,n=0;async function u(l){let s=l.querySelector("input[type=email]"),y=l.querySelector("[data-email-status]");if(!s||!y)return;t?.abort(),clearTimeout(i);let P=++n,w=s.value.trim(),C=l.querySelector("[data-email-next]"),H=l.querySelector("[data-email-retry]"),L=(S,O)=>{y.textContent=S,C&&(C.disabled=!O),s.setAttribute("aria-invalid",String(!O)),l.dataset.emailAvailable=O?"true":"false"};if(H&&(H.hidden=!0),!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(w)){L(w?"Email ch\u01B0a \u0111\xFAng \u0111\u1ECBnh d\u1EA1ng.":"Nh\u1EADp email \u0111\u1EC3 ki\u1EC3m tra.",!1);return}L("\u0110ang ki\u1EC3m tra email\u2026",!1),i=setTimeout(async()=>{t=new AbortController;try{let S=await fetch(l.dataset.emailCheck,{method:"POST",cache:"no-store",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({email:w}),signal:AbortSignal.any([t.signal,AbortSignal.timeout(1e4)])});if(!S.ok)throw new Error("email-check-failed");let O=await S.json();if(P!==n||!l.isConnected)return;if(!O.ok)throw new Error("email-check-failed");L(O.available?"Email c\xF3 th\u1EC3 s\u1EED d\u1EE5ng.":"Email \u0111\xE3 \u0111\u01B0\u1EE3c s\u1EED d\u1EE5ng. Nh\u1EADp email kh\xE1c.",O.available)}catch{if(P!==n||!l.isConnected)return;L("Ch\u01B0a ki\u1EC3m tra \u0111\u01B0\u1EE3c email. Vui l\xF2ng th\u1EED l\u1EA1i.",!1),H&&(H.hidden=!1)}},400)}function d(l,s=!1){let y=l.querySelector('select[name="companyId"]'),P=l.querySelector('select[name="branchId"]'),w=l.querySelector('select[name="scopeKind"]')?.value;if(P&&y){s&&(P.value="");for(let S of P.options)S.value&&(S.hidden=S.dataset.companyId!==y.value,S.disabled=S.hidden)}let C=w==="tenant"?"tenant":w==="branch"?`branch:${y?.value}:${P?.value}`:`company:${y?.value}`;for(let S of l.querySelectorAll("[data-assigned-scopes]")){let D=JSON.parse(S.dataset.assignedScopes??"[]").includes(C);S.disabled=S.dataset.roleDisabled==="true"||D;let F=S.closest("[data-role-option]"),J=F?.querySelector("[data-role-assigned]"),X=F?.querySelector("[data-role-description]");J&&(J.hidden=!D),X&&(X.hidden=D),S.disabled&&(S.checked=!1)}let H=y?.closest('[data-ui="form-field"]'),L=P?.closest('[data-ui="form-field"]');H&&(H.hidden=w==="tenant"),L&&(L.hidden=w==="tenant"||w==="company")}function b(){for(let l of document.querySelectorAll("form[data-user-workflow]"))l.dataset.initialized||(l.dataset.initialized="true",d(l),u(l))}document.addEventListener("input",l=>{let s=l.target,y=s.closest("form[data-user-workflow]");if(y&&(s.type==="email"&&u(y),s.matches("[data-role-search]"))){let P=0;for(let C of y.querySelectorAll("[data-role-option]"))C.hidden=!C.textContent?.toLocaleLowerCase("vi").includes(s.value.toLocaleLowerCase("vi")),C.hidden||P++;let w=y.querySelector("[data-role-empty]");w&&(w.hidden=P>0)}},{signal:a}),document.addEventListener("change",l=>{let s=l.target,y=s.closest("form[data-user-workflow]");y&&s.matches('select[name="companyId"],select[name="branchId"],select[name="scopeKind"]')&&d(y,s.matches('select[name="companyId"]'))},{signal:a}),document.addEventListener("click",l=>{let s=l.target;s.matches("[data-email-retry]")&&u(s.closest("form"))},{signal:a}),document.addEventListener("submit",l=>{let s=l.target;s.matches("form[data-user-workflow]")&&s.querySelector("input[type=email]")&&s.dataset.emailAvailable!=="true"&&l.preventDefault()},{signal:a});let v=new MutationObserver(b);return v.observe(document.documentElement,{childList:!0,subtree:!0}),b(),()=>{t?.abort(),clearTimeout(i),v.disconnect()}}import{each as qt}from"/_ket/view/index.js";import{Fragment as zt,jsx as Vt,jsxs as Ut}from"/_ket/view/jsx-runtime.js";var ne=["action","action-leading","action-label","action-spinner","action-group"];import{jsx as Zt,jsxs as Qt}from"/_ket/view/jsx-runtime.js";var re=["badge","tag","tag-remove","count-badge","avatar","code"];import{each as ea}from"/_ket/view/index.js";import{Fragment as ia,jsx as aa,jsxs as na}from"/_ket/view/jsx-runtime.js";var le=["notice","notice-mark","notice-copy","notice-title","notice-message","notice-actions","empty","empty-mark","empty-title","empty-message","empty-actions","loading","loading-label"];import{each as Fa}from"/_ket/view/index.js";import{each as va}from"/_ket/view/index.js";import{Fragment as sa,jsx as oa,jsxs as da}from"/_ket/view/jsx-runtime.js";import{jsx as ga,jsxs as ba}from"/_ket/view/jsx-runtime.js";var de=["app-shell","app-sidebar","app-main","app-right-rail","page","page-context","page-header","page-heading","page-eyebrow","page-title-row","page-title","page-description","page-subline","page-status","page-actions","page-meta","page-body","record-canvas","record-content","record-section","record-section-title"];import{Fragment as wa,jsx as Ta,jsxs as ka}from"/_ket/view/jsx-runtime.js";var se=["stack","inline","grid","card-grid","surface","surface-head","surface-heading","surface-title","surface-description","surface-actions","disclosure","disclosure-summary","disclosure-body","section","section-head","section-eyebrow","section-title","section-description","section-actions","section-body","content-card","card-media","card-head","card-leading","card-heading","card-eyebrow","card-title","card-summary","card-status","card-body","card-meta","card-actions","kanban","kanban-card","kanban-media","kanban-title","kanban-meta","kanban-note","kanban-actions","metric","metric-icon","metric-label","metric-value","metric-detail"];import{each as Ha}from"/_ket/view/index.js";import{Fragment as Ea,jsx as Ma}from"/_ket/view/jsx-runtime.js";import{jsx as Na,jsxs as Ba}from"/_ket/view/jsx-runtime.js";var ce=["field","field-label","field-required","field-control","field-options","field-option","field-option-input","field-help","field-error"];import{each as Ga}from"/_ket/view/index.js";import{jsx as za,jsxs as Ua}from"/_ket/view/jsx-runtime.js";var ue=["breadcrumbs","breadcrumb","breadcrumb-overflow","breadcrumb-overflow-trigger","breadcrumb-overflow-list","nav-list","nav-item","nav-item-leading","nav-item-label","nav-item-count","tabs","tab","tab-count","tabbed-view","tabbed-view-context","tab-panel"];import{jsx as Za,jsxs as Qa}from"/_ket/view/jsx-runtime.js";var me=["progress","progress-label","progress-value","progress-track","progress-bar"];import{each as ei}from"/_ket/view/index.js";import{Fragment as ni,jsx as ai,jsxs as ii}from"/_ket/view/jsx-runtime.js";var ge=["menu","menu-trigger","menu-trigger-count","menu-panel","menu-search","menu-search-input","menu-label","menu-separator","menu-item","menu-item-leading","menu-item-copy","menu-item-check","menu-item-shortcut"];import{jsx as oi,jsxs as di}from"/_ket/view/jsx-runtime.js";var be=["popover","popover-trigger","popover-panel","popover-close"];import{jsx as ui,jsxs as mi}from"/_ket/view/jsx-runtime.js";var fe=["tooltip","tooltip-trigger","tooltip-content"];import{jsx as fi,jsxs as hi}from"/_ket/view/jsx-runtime.js";var he=["modal-layer","modal-backdrop","modal-sheet","modal-head","modal-heading","modal-title-row","modal-title","modal-description","modal-close","modal-body","modal-actions"];import{jsx as Si}from"/_ket/view/jsx-runtime.js";var pe=["dialog","confirm-dialog-message"];import{each as ki}from"/_ket/view/index.js";import{jsx as Ri,jsxs as Ci}from"/_ket/view/jsx-runtime.js";var ye=["toast-region","toast","toast-copy","toast-title","toast-message","toast-actions"];import{jsx as Oi}from"/_ket/view/jsx-runtime.js";var ve=["spinner","visually-hidden"];import{each as Ai}from"/_ket/view/index.js";import{jsx as Ii}from"/_ket/view/jsx-runtime.js";var xe=["skeleton","skeleton-line"];var ft=["a[href]","button:not([disabled])","input:not([disabled])","select:not([disabled])","textarea:not([disabled])","summary",'[tabindex]:not([tabindex="-1"])'].join(","),$=a=>[...a.querySelectorAll(ft)].filter(t=>t instanceof HTMLElement&&!t.hidden&&t.getAttribute("aria-hidden")!=="true"&&(typeof t.checkVisibility!="function"||t.checkVisibility())),ht=['[data-ui="timeframe-menu"]','[data-ui="view-settings"]'],Se=ht.map(a=>`${a}[open]`).join(", "),_=(a=document)=>{let t=document.activeElement instanceof HTMLElement?document.activeElement:null,i=a.querySelector('[data-ui="modal-layer"][data-route-modal="true"] [role="dialog"]'),n=a.querySelector('[data-ui="app-shell"], [data-ui="shell"]'),u=n instanceof HTMLElement?n.inert:!1;if(i instanceof HTMLElement){n instanceof HTMLElement&&!n.contains(i)&&(n.inert=!0);let e=$(i)[0];(e instanceof HTMLElement?e:i).focus()}let d=[...a.querySelectorAll('[data-ui="menu"]')].filter(e=>e instanceof HTMLDetailsElement),b=e=>{let o=e.querySelector('[data-ui="menu-trigger"]');o instanceof HTMLElement&&o.setAttribute("aria-expanded",String(e.open))},v=d.map(e=>{let o=()=>b(e);return e.addEventListener("toggle",o),b(e),()=>e.removeEventListener("toggle",o)}),l=window.matchMedia("(max-width: 48rem)"),s=document.documentElement,y=s.dataset.kvNavigationOpen,P=[...a.querySelectorAll('[data-ui="app-navigation"]')].filter(e=>e instanceof HTMLDetailsElement),w=new Map,C=e=>{let o=w.get(e);if(o?.targets){for(let{element:r,inert:f}of o.targets)r.inert=f;o.targets=null}},H=()=>{l.matches&&P.some(o=>o.open)?s.dataset.kvNavigationOpen="true":y===void 0?delete s.dataset.kvNavigationOpen:s.dataset.kvNavigationOpen=y},L=e=>{let o=e.querySelector('[data-ui="navigation-trigger"]'),r=e.querySelector('[data-ui="navigation-drawer"]');if(!(o instanceof HTMLElement)||!(r instanceof HTMLElement))return;let f=l.matches;if(o.dataset.open=String(f&&e.open),!f){r.removeAttribute("role"),r.removeAttribute("aria-modal"),r.removeAttribute("aria-label"),C(e),H();return}if(r.setAttribute("role","dialog"),r.setAttribute("aria-modal","true"),r.setAttribute("aria-label",r.dataset.navigationLabel??"Navigation"),!e.open){C(e),H();return}let h=w.get(e)??{};if(!h.targets){let p=e.closest('[data-ui="app-shell"], [data-ui="shell"]'),k=p?[...p.querySelectorAll(':scope > [data-ui="app-main"], :scope > [data-ui="main"], :scope > [data-ui="app-right-rail"]')].filter(R=>R instanceof HTMLElement).map(R=>({element:R,inert:R.inert})):[];for(let{element:R}of k)R.inert=!0;h.targets=k,h.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:o,w.set(e,h),queueMicrotask(()=>{if(!e.open||!l.matches)return;let R=r.querySelector('[data-ui="navigation-item"][aria-current="page"]'),A=$(r)[0],E=R instanceof HTMLElement?R:A;(E instanceof HTMLElement?E:r).focus()})}H()},S=(e,o=!0)=>{let r=w.get(e);e.open=!1,L(e),o&&r?.returnFocus instanceof HTMLElement&&r.returnFocus.isConnected&&r.returnFocus.focus(),w.delete(e)},O=P.map(e=>{let o=()=>L(e),r=f=>{let h=f.target;if(!(h instanceof Element))return;let k=h.closest('[data-ui="navigation-branch-trigger"]')?.closest('[data-ui="navigation-branch"]');if(k instanceof HTMLDetailsElement&&k.open){f.preventDefault();return}!l.matches||!e.open||(h.closest('[data-ui="navigation-close"]')||h.closest('[data-ui="navigation-backdrop"]')||h.closest('[data-ui="navigation-item"]'))&&S(e)};return e.addEventListener("toggle",o),e.addEventListener("click",r),L(e),()=>{e.removeEventListener("toggle",o),e.removeEventListener("click",r),C(e)}}),D=()=>{for(let e of P)e.open?S(e,!1):L(e)};l.addEventListener("change",D);for(let e of a.querySelectorAll('[data-ui="popover"][data-open="true"]')){let o=e.querySelector('[data-ui="popover-trigger"]'),r=e.querySelector('[data-ui="popover-panel"]');if(!(o instanceof HTMLElement)||!(r instanceof HTMLElement))continue;let f=o.getBoundingClientRect(),h=8,p=e.getAttribute("data-placement")??"bottom-start",k=p.startsWith("top"),R=p.endsWith("end"),A=f.top-r.offsetHeight-h,E=f.bottom+h,I=A>=8,m=E+r.offsetHeight<=window.innerHeight-8,c=k?I||!m:!m&&I,T=R?f.right-r.offsetWidth:f.left,g=Math.max(8,Math.min(T,window.innerWidth-r.offsetWidth-8)),x=Math.max(8,Math.min(c?A:E,window.innerHeight-r.offsetHeight-8));r.dataset.runtimePositioned="true",r.dataset.runtimePlacement=`${c?"top":"bottom"}-${R?"end":"start"}`,r.style.left=`${Math.round(g)}px`,r.style.top=`${Math.round(x)}px`,r.style.right="auto",r.style.bottom="auto"}let F=e=>{let o=P.find(m=>l.matches&&m.open);if(o instanceof HTMLDetailsElement){let m=o.querySelector('[data-ui="navigation-drawer"]');if(e.key==="Escape"){S(o),e.preventDefault();return}if(e.key==="Tab"&&m instanceof HTMLElement){let c=$(m),T=c[0],g=c.at(-1);if(!c.length){e.preventDefault(),m.focus();return}if(e.shiftKey&&(document.activeElement===T||document.activeElement===m)){e.preventDefault(),g instanceof HTMLElement&&g.focus();return}if(!e.shiftKey&&document.activeElement===g){e.preventDefault(),T instanceof HTMLElement&&T.focus();return}}}let r=document.activeElement?.closest('[data-ui="tree"] [role="treeitem"]');if(r instanceof HTMLElement){let m=r.closest('[data-ui="tree"]'),c=m?[...m.querySelectorAll('[role="treeitem"]')].filter(x=>x instanceof HTMLElement):[],T=c.indexOf(r),g=-1;if(e.key==="ArrowDown")g=Math.min(c.length-1,T+1);else if(e.key==="ArrowUp")g=Math.max(0,T-1);else if(e.key==="Home")g=0;else if(e.key==="End")g=c.length-1;else if(e.key==="ArrowRight"){let x=Number(r.getAttribute("aria-level"));r.getAttribute("aria-expanded")==="true"&&Number(c[T+1]?.getAttribute("aria-level"))>x&&(g=T+1)}else if(e.key==="ArrowLeft"){let x=Number(r.getAttribute("aria-level"));x>1&&(g=c.findLastIndex((N,ot)=>ot<T&&Number(N.getAttribute("aria-level"))<x))}if(g>=0&&c[g]){for(let x of c)x.tabIndex=-1;c[g].tabIndex=0,c[g].focus(),e.preventDefault();return}}let f=document.activeElement?.closest('[data-ui="tree-grid-row"]');if(f instanceof HTMLElement){let m=f.closest('[data-ui="tree-grid"]'),c=m?[...m.querySelectorAll('[data-ui="tree-grid-row"]')].filter(x=>x instanceof HTMLElement):[],T=c.indexOf(f),g=e.key==="ArrowDown"?Math.min(c.length-1,T+1):e.key==="ArrowUp"?Math.max(0,T-1):e.key==="Home"?0:e.key==="End"?c.length-1:-1;if(g>=0&&c[g]){for(let x of c)x.tabIndex=-1;c[g].tabIndex=0,c[g].focus(),e.preventDefault();return}}let h=document.activeElement?.closest('[data-ui="menu"]');if(h instanceof HTMLDetailsElement&&!h.open){let m=h.querySelector('[data-ui="menu-trigger"]');if(document.activeElement===m&&(e.key==="ArrowDown"||e.key==="ArrowUp")){h.open=!0;let c=[...h.querySelectorAll('[role="menuitem"], [role="menuitemcheckbox"], [role="menuitemradio"]')].filter(g=>g instanceof HTMLElement&&g.getAttribute("aria-disabled")!=="true"),T=e.key==="ArrowUp"?c.at(-1):c[0];T instanceof HTMLElement&&T.focus(),e.preventDefault();return}}let p=document.activeElement?.closest('[data-ui="menu"][open]');if(p instanceof HTMLDetailsElement){let m=p.querySelector('[data-ui="menu-trigger"]'),c=[...p.querySelectorAll('[role="menuitem"], [role="menuitemcheckbox"], [role="menuitemradio"]')].filter(N=>N instanceof HTMLElement&&N.getAttribute("aria-disabled")!=="true"),T=document.activeElement,g=T instanceof HTMLElement?c.indexOf(T):-1,x=-1;if(e.key==="ArrowDown"?x=g<0?0:(g+1)%c.length:e.key==="ArrowUp"?x=g<0?c.length-1:(g-1+c.length)%c.length:e.key==="Home"?x=0:e.key==="End"&&(x=c.length-1),x>=0&&c[x]instanceof HTMLElement){c[x].focus(),e.preventDefault();return}if((e.key==="Enter"||e.key===" ")&&document.activeElement===m){c[0]instanceof HTMLElement&&c[0].focus(),e.preventDefault();return}}if(e.key==="Escape"&&p instanceof HTMLDetailsElement){p.open=!1;let m=p.querySelector('[data-ui="menu-trigger"]');m instanceof HTMLElement&&m.focus(),e.preventDefault();return}let k=[...a.querySelectorAll(Se)].at(-1);if(e.key==="Escape"&&k instanceof HTMLDetailsElement){k.open=!1;let m=k.querySelector("summary");m instanceof HTMLElement&&m.focus(),e.preventDefault();return}let R=document.activeElement?.closest('[data-ui="popover"][data-open="true"]');if(e.key==="Escape"&&R instanceof HTMLElement){let m=R.querySelector('[data-ui="popover-close"]');m instanceof HTMLElement&&m.click(),e.preventDefault();return}if(!(i instanceof HTMLElement))return;if(e.key==="Escape"){let m=i.querySelector('[data-ui="modal-close"]');m instanceof HTMLElement&&m.click(),e.preventDefault();return}if(e.key!=="Tab")return;let A=$(i);if(!A.length){e.preventDefault(),i.focus();return}let E=A[0],I=A.at(-1);e.shiftKey&&(document.activeElement===E||document.activeElement===i)?(e.preventDefault(),I instanceof HTMLElement&&I.focus()):!e.shiftKey&&document.activeElement===I&&(e.preventDefault(),E instanceof HTMLElement&&E.focus())},J=e=>{let o=[...e.querySelectorAll('[data-ui="row-select"]')].filter(p=>p instanceof HTMLInputElement&&!p.disabled),r=o.filter(p=>p.checked),f=e.querySelector('[data-ui="select-all"]');f instanceof HTMLInputElement&&(f.checked=o.length>0&&r.length===o.length,f.indeterminate=r.length>0&&r.length<o.length);for(let p of o)p.closest('[data-ui="row"]')?.toggleAttribute("data-selected",p.checked);let h=o[0]?.getAttribute("form");if(h)for(let p of document.querySelectorAll(`[data-ui="bulk-actions"][data-form="${CSS.escape(h)}"]`)){r.length?p.setAttribute("data-has-selection","true"):p.removeAttribute("data-has-selection");for(let k of p.querySelectorAll('[data-ui="bulk-count"]'))k.textContent=String(r.length);for(let k of p.querySelectorAll('[data-ui="bulk-action-list"] button'))k instanceof HTMLButtonElement&&k.dataset.kvAlwaysDisabled!=="true"&&(k.disabled=r.length===0)}},X=e=>{let o=e.target;if(!(o instanceof HTMLInputElement))return;let r=o.getAttribute("data-ui");if(r!=="select-all"&&r!=="row-select")return;let f=o.closest('[data-ui="table"]');if(f){if(r==="select-all")for(let h of f.querySelectorAll('[data-ui="row-select"]'))h instanceof HTMLInputElement&&!h.disabled&&(h.checked=o.checked);J(f)}};for(let e of a.querySelectorAll('[data-ui="table"]'))e.querySelector('[data-ui="row-select"]')&&J(e);document.addEventListener("change",X);let ae=e=>{let o=e.target;if(o instanceof Node){for(let r of a.querySelectorAll('[data-ui="menu"][open]')){if(!(r instanceof HTMLDetailsElement))continue;let f=o instanceof Element?o.closest('[data-ui="menu-item"]'):null;(!r.contains(o)||f&&f.getAttribute("aria-disabled")!=="true")&&(r.open=!1)}for(let r of a.querySelectorAll(Se))r instanceof HTMLDetailsElement&&!r.contains(o)&&(r.open=!1)}};return document.addEventListener("keydown",F),document.addEventListener("click",ae),()=>{document.removeEventListener("keydown",F),document.removeEventListener("click",ae),document.removeEventListener("change",X);for(let e of v)e();l.removeEventListener("change",D);for(let e of O)e();y===void 0?delete s.dataset.kvNavigationOpen:s.dataset.kvNavigationOpen=y,n instanceof HTMLElement&&(n.inert=u),t?.isConnected&&t.focus()}};import{jsx as Ki,jsxs as Ni}from"/_ket/view/jsx-runtime.js";import{jsx as Vi,jsxs as zi}from"/_ket/view/jsx-runtime.js";var ke=["switch-control","switch-track"];import{each as _i}from"/_ket/view/index.js";import{Fragment as en,jsx as Yi,jsxs as ji}from"/_ket/view/jsx-runtime.js";var Pe=["combobox","combobox-input-row","combobox-toggle","combobox-listbox","combobox-option","combobox-empty","tag-picker"];import{jsx as ln,jsxs as on}from"/_ket/view/jsx-runtime.js";var Re=["date-range"];import{jsx as un,jsxs as mn}from"/_ket/view/jsx-runtime.js";var Ce=["file-upload","drop-zone","upload-status"];import{jsx as hn}from"/_ket/view/jsx-runtime.js";var Le=["relation-picker"];import{each as vn}from"/_ket/view/index.js";import{jsx as wn,jsxs as kn}from"/_ket/view/jsx-runtime.js";var He=["search-bar","filter-bar","applied-filters","applied-filter","saved-views","saved-view","view-settings","view-settings-options"];import{jsx as Ln,jsxs as Hn}from"/_ket/view/jsx-runtime.js";var Oe=["inline-edit","inline-edit-value","inline-edit-form","inline-edit-actions"];import{each as $n}from"/_ket/view/index.js";import{each as Dn}from"/_ket/view/index.js";import{Fragment as Kn,jsx as Jn,jsxs as Xn}from"/_ket/view/jsx-runtime.js";var Ee=["list-chrome","list-chrome-row","list-search","list-search-label","list-search-input","list-search-submit","list-filter-menus","list-facets","list-facet","list-facet-count","list-view-switch","list-view","list-sort","list-sort-label","list-sort-select","list-status","list-actions","bulk-actions","bulk-summary","bulk-count","bulk-action-list","pager-bar","pager-summary","pager-pages","pager-page","pager-actions","pager-link"];import{jsx as zn,jsxs as Un}from"/_ket/view/jsx-runtime.js";var Me=["resource-list","resource-list-item","resource-list-select","resource-list-link"];import{each as Zn}from"/_ket/view/index.js";import{jsx as Yn,jsxs as jn}from"/_ket/view/jsx-runtime.js";var Ae=["data-grid-scroll","data-grid","data-grid-cap","data-grid-cell"];import{each as ar}from"/_ket/view/index.js";import{jsx as nr,jsxs as rr}from"/_ket/view/jsx-runtime.js";var De=["tree","tree-item","tree-link","tree-grid","tree-grid-row"];import{each as dr}from"/_ket/view/index.js";import{jsx as cr,jsxs as ur}from"/_ket/view/jsx-runtime.js";var Ie=["data-matrix","data-matrix-head","data-matrix-heading","data-matrix-eyebrow","data-matrix-title","data-matrix-description","data-matrix-summary","data-matrix-scroll","data-matrix-table","data-matrix-column","data-matrix-row-head","data-matrix-row-leading","data-matrix-row-title","data-matrix-row-description","data-matrix-row-status","data-matrix-row-actions","data-matrix-cell"];import{each as br}from"/_ket/view/index.js";import{jsx as hr,jsxs as pr}from"/_ket/view/jsx-runtime.js";var Fe=["bar-chart","bar-chart-rows","bar-chart-row","bar-chart-label","bar-chart-caption","bar-chart-track","bar-chart-fill","bar-chart-segment","bar-chart-value","bar-chart-scale","bar-chart-legend","bar-chart-legend-item","bar-chart-legend-swatch","bar-chart-empty"];import{each as xr}from"/_ket/view/index.js";import{jsx as Tr,jsxs as wr}from"/_ket/view/jsx-runtime.js";var Je=["timeframe","timeframe-menu","timeframe-trigger","timeframe-label","timeframe-value","timeframe-content","timeframe-option","timeframe-option-label","timeframe-option-detail","timeframe-range","timeframe-asof","timeframe-note"];import{each as Rr}from"/_ket/view/index.js";import{jsx as Hr,jsxs as Or}from"/_ket/view/jsx-runtime.js";var Xe=["description-list","key-value","key-value-label","key-value-value","person","person-body","avatar-group","status"];import{jsx as Ar}from"/_ket/view/jsx-runtime.js";var Ke=["formatted-date","formatted-number","formatted-money"];import{each as Fr}from"/_ket/view/index.js";import{jsx as Br,jsxs as $r}from"/_ket/view/jsx-runtime.js";var Be=["record-summary","record-summary-main","record-actions","record-rail"];import{each as Vr}from"/_ket/view/index.js";import{jsx as _r,jsxs as Zr}from"/_ket/view/jsx-runtime.js";var qe=["activity-timeline","activity-item","activity-marker","audit-log","audit-item"];import{each as jr}from"/_ket/view/index.js";import{jsx as al,jsxs as il}from"/_ket/view/jsx-runtime.js";var Ge=["attachments","attachment","media-gallery","media-item"];import{each as ll}from"/_ket/view/index.js";import{Fragment as cl,jsx as dl,jsxs as sl}from"/_ket/view/jsx-runtime.js";var Ve=["app-navigation","navigation-trigger","navigation-trigger-icon","navigation-trigger-identity","navigation-trigger-label","navigation-layer","navigation-backdrop","navigation-drawer","navigation-header","navigation-identity","navigation-context","navigation-close","navigation-groups","navigation-group","navigation-group-label","navigation-items","navigation-supplementary","navigation-item","navigation-branch","navigation-branch-trigger","navigation-children","navigation-item-leading","navigation-item-copy","navigation-item-label","navigation-item-description","navigation-item-count","navigation-footer"];import{each as fl}from"/_ket/view/index.js";import{Fragment as Sl,jsx as vl,jsxs as xl}from"/_ket/view/jsx-runtime.js";var ze=["table-scroll","table","table-caption","select-col","select-all","col","sort-link","sort-icon","row","group-row","group-cell","group-link","group-indent","group-count","group-pager","group-pager-actions","cell","select-cell","row-select","row-link"];import{jsx as Hl,jsxs as Ol}from"/_ket/view/jsx-runtime.js";var Ue=["list-page","list-page-context","list-page-header","list-page-heading","list-page-title-row","list-page-eyebrow","list-page-title","list-page-description","list-page-actions","list-page-toolbar","list-page-controls","list-page-status","list-page-body","list-page-footer"];import{jsx as Dl,jsxs as Il}from"/_ket/view/jsx-runtime.js";var We=["record-page","record-page-context","record-page-header","record-page-title-row","record-page-heading","record-page-title","record-page-subline","record-page-status","record-page-description","record-page-actions","record-page-meta","record-page-controller","record-page-navigation","record-page-layout","record-page-body","record-page-aside"];var _e=["form-page","form-page-context","form-page-header","form-page-title-row","form-page-heading","form-page-title","form-page-subline","form-page-status","form-page-description","form-page-actions","form-page-meta","form-page-controller","form-page-navigation","form-page-layout","form-page-body","form-page-aside"];import{jsx as Gl,jsxs as Vl}from"/_ket/view/jsx-runtime.js";var Ze=["dashboard-page","dashboard-page-context","dashboard-page-header","dashboard-page-heading","dashboard-page-eyebrow","dashboard-page-title-row","dashboard-page-title","dashboard-page-subline","dashboard-page-status","dashboard-page-description","dashboard-page-actions","dashboard-page-meta","dashboard-page-body"];var Qe=["board-page","board-page-context","board-page-header","board-page-heading","board-page-eyebrow","board-page-title-row","board-page-title","board-page-subline","board-page-status","board-page-description","board-page-actions","board-page-meta","board-page-toolbar","board-page-controls","board-page-body"];import{each as eo}from"/_ket/view/index.js";import{jsx as ao,jsxs as io}from"/_ket/view/jsx-runtime.js";var Ye=["pipeline","pipeline-step","pipeline-arrow","pipeline-step-label","pipeline-step-value","pipeline-step-node"];import{each as so}from"/_ket/view/index.js";import{jsx as go,jsxs as bo}from"/_ket/view/jsx-runtime.js";var je=["record-form","form-errors","form-grid","form-actions"];var et={actions:ne,feedback:le,fields:ce,status:re,navigation:ue,progress:me,menu:ge,popover:be,tooltip:fe,dialog:pe,toast:ye,spinner:ve,skeleton:xe,scalarFields:ke,combobox:Pe,dateTime:Re,upload:Ce,relationPicker:Le,listControls:He,inlineEdit:Oe,resourceList:Me,dataGrid:Ae,tree:De,matrix:Ie,barChart:Fe,timeframe:Je,recordDisplay:Xe,formattedValues:Ke,recordComposition:Be,activity:qe,media:Ge,layouts:se,shell:de,appNavigation:Ve,table:ze,listChrome:Ee,listPage:Ue,formPage:_e,recordPage:We,dashboardPage:Ze,boardPage:Qe,modal:he,pipeline:Ye,form:je},Ct=[...new Set(Object.values(et).flat())].sort(),Lt=Object.freeze(Object.fromEntries(Object.entries(et).map(([a,t])=>[a,[...t]])));var ee="ket.backend.theme",j=['[data-ui="search-menu"]','[data-ui="col-config"]','[data-ui="bulk-actions"]','[data-ui="viewer"]','[data-ui="record-more"]'].join(", "),nt=globalThis,M=a=>a.target instanceof Element?a.target:null,z=a=>a==="light"||a==="dark"?a:null,Ht=()=>{try{return z(localStorage.getItem(ee))}catch{return null}},Ot=a=>{try{localStorage.setItem(ee,a)}catch{}},rt=()=>z(document.documentElement.dataset.theme)??(matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),G=()=>{let a=String(rt()==="dark");for(let t of document.querySelectorAll('[data-ui="sidebar-tools"] [data-ui="action"][name="theme"]'))t.setAttribute("aria-pressed",a)},Et=a=>{let t=Ht();t&&(document.documentElement.dataset.theme=t),G(),document.addEventListener("click",i=>{let n=M(i)?.closest('[data-ui="sidebar-tools"] [data-ui="action"][name="theme"]');if(!n||n.disabled)return;let u=rt()==="dark"?"light":"dark";document.documentElement.dataset.theme=u,Ot(u),G()},{signal:a}),matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{z(document.documentElement.dataset.theme)||G()},{signal:a}),addEventListener("storage",i=>{if(i.key!==ee)return;let n=z(i.newValue);n?document.documentElement.dataset.theme=n:delete document.documentElement.dataset.theme,G()},{signal:a})},Mt=a=>{let t=[...a.querySelectorAll('[data-ui="row-select"]:not(:disabled)')],i=t.filter(u=>u.checked).length,n=a.querySelector('[data-ui="select-all"]');if(n&&(n.checked=t.length>0&&i===t.length,n.indeterminate=i>0&&i<t.length),!i){let u=a.closest('[data-ui="app-shell"]');for(let d of u?.querySelectorAll('[data-ui="bulk-actions"][open]')??[])d.removeAttribute("open")}},At=(a,t)=>{document.addEventListener("change",i=>{let n=M(i);if(!(n instanceof HTMLInputElement)||!n.matches('[data-ui="select-all"], [data-ui="row-select"]'))return;let u=n.closest('[data-ui="table"]');if(u){if(n.matches('[data-ui="select-all"]'))for(let d of u.querySelectorAll('[data-ui="row-select"]:not(:disabled)'))d.checked=n.checked;Mt(u)}},{signal:a}),document.addEventListener("click",i=>{if(i.defaultPrevented||i.button!==0||i.metaKey||i.ctrlKey||i.shiftKey||i.altKey)return;let n=M(i);if(n?.closest('a, button, input, select, textarea, label, summary, details, [data-ui="select-cell"]'))return;let d=n?.closest('[data-ui="row"][data-row-href]')?.getAttribute("data-row-href");d&&(i.preventDefault(),t.navigate(d))},{signal:a}),document.addEventListener("keydown",i=>{if(i.defaultPrevented||i.key!=="Enter"&&i.key!==" ")return;let n=M(i),d=(n?.matches('[data-ui="row"][data-row-href][tabindex="0"]')?n:null)?.getAttribute("data-row-href");d&&(i.preventDefault(),te(d,t))},{signal:a})},tt=()=>[...document.querySelectorAll(`${j}[open]`)],Dt=a=>{document.addEventListener("click",t=>{let i=M(t)?.closest(j);for(let n of tt())n!==i&&!n.contains(i??null)&&n.removeAttribute("open")},{signal:a}),document.addEventListener("keydown",t=>{if(t.key!=="Escape")return;let i=tt();if(!i.length)return;let n=document.activeElement?.closest(j),u=n?.open?n:i.at(-1);u?.removeAttribute("open"),u?.querySelector("summary")?.focus(),t.preventDefault()},{signal:a})},It=a=>{document.addEventListener("click",t=>{let i=M(t)?.closest('[data-ui="chrome-search-toggle"]'),n=i?.getAttribute("aria-controls");if(!i||!n)return;let u=document.getElementById(n);!(u instanceof HTMLDialogElement)||u.open||(u.showModal(),i.setAttribute("aria-expanded","true"),requestAnimationFrame(()=>u.querySelector('[data-presentation="modal"] [data-ui="chrome-search-input"]')?.focus()))},{signal:a}),document.addEventListener("cancel",t=>{M(t)?.matches('[data-ui="chrome-search-modal"]')&&t.preventDefault()},{capture:!0,signal:a}),document.addEventListener("close",t=>{let i=M(t);if(!(i instanceof HTMLDialogElement)||!i.matches('[data-ui="chrome-search-modal"]'))return;let n=document.querySelector(`[data-ui="chrome-search-toggle"][aria-controls="${CSS.escape(i.id)}"]`);n?.setAttribute("aria-expanded","false"),n?.focus()},{capture:!0,signal:a})},Ft=["a[href]","button:not(:disabled)",'input:not(:disabled):not([type="hidden"])',"select:not(:disabled)","textarea:not(:disabled)",'[tabindex]:not([tabindex="-1"])'].join(", "),V=()=>document.querySelector('[data-ui="modal-layer"][data-route-modal="true"]'),at=a=>[...a.querySelectorAll(Ft)].filter(t=>!t.hidden&&t.getAttribute("aria-hidden")!=="true"&&!t.matches('[data-ui="modal-backdrop"]')),te=(a,t)=>{t.navigate(a)},Jt=(a,t)=>a.composedPath().some(i=>i instanceof HTMLElement&&i!==t&&i.matches('[data-ui="modal-layer"][data-presentation="dialog"]')),lt=a=>{for(let t of a.querySelectorAll('input:not([type="hidden"])'))if(!t.disabled){if(t.type==="checkbox"||t.type==="radio"){if(t.checked!==t.defaultChecked)return!0}else if(t.value!==t.defaultValue)return!0}for(let t of a.querySelectorAll("textarea"))if(!t.disabled&&t.value!==t.defaultValue)return!0;for(let t of a.querySelectorAll("select"))if(!t.disabled){for(let i of t.options)if(i.selected!==i.defaultSelected)return!0}return!1},it=a=>{if(!lt(a))return!0;let t=a.getAttribute("data-unsaved-prompt");return t?nt.confirm(t):!0},Xt=(a,t)=>{if(typeof EventSource!="function")return;let i=null,n=null,u=()=>{n?.close(),n=null,i=null},d=()=>{let v=document.querySelector('[data-ui="live-region"][data-stream]');if(v===i)return;u();let l=v instanceof HTMLElement?v.dataset.stream??"":"";if(!l)return;i=v,n=new EventSource(`/_ket/stream/${encodeURIComponent(l)}`);let s=()=>te(location.href,t);n.onmessage=s,n.addEventListener("done",()=>{u(),s()}),n.onerror=()=>{n?.readyState===EventSource.CLOSED&&u()}};d();let b=new MutationObserver(d);return b.observe(document.body,{childList:!0,subtree:!0}),addEventListener("pagehide",u,{signal:a}),()=>{b.disconnect(),u()}},Kt=(a,t)=>{let i=new WeakSet,n=()=>{let d=V();!d||i.has(d)||(i.add(d),requestAnimationFrame(()=>{let b=d.querySelector('[data-ui="modal-sheet"]');(at(d).find(l=>!l.matches('[data-ui="modal-close"]'))??b)?.focus()}))};n();let u=new MutationObserver(n);return u.observe(document.body,{childList:!0,subtree:!0}),document.addEventListener("click",d=>{let b=V();if(!b)return;let v=d.composedPath().find(l=>l instanceof HTMLElement&&(l.matches('[data-ui="modal-close"], [data-ui="modal-backdrop"], a[data-ui="tab"]')||l.matches('a[data-ui="action"][href]')));!v||!b.contains(v)||it(b)||(d.preventDefault(),d.stopPropagation())},{capture:!0,signal:a}),document.addEventListener("click",d=>{let b=document.querySelector("[data-save-before-navigation]"),v=b instanceof HTMLFormElement?b:b?.querySelector("form"),l=M(d)?.closest("a[href]");if(!b||!v||!l||V()||!lt(b)||(d.preventDefault(),d.stopPropagation(),!nt.confirm(b.dataset.saveBeforeNavigation)))return;let s=v.querySelector('input[name="returnTo"]');s||(s=document.createElement("input"),s.type="hidden",s.name="returnTo",v.append(s)),s.value=l.href,v.requestSubmit()},{capture:!0,signal:a}),document.addEventListener("keydown",d=>{let b=V();if(!b||Jt(d,b))return;if(d.key==="Escape"){let y=b.querySelector('[data-ui="modal-close"]');if(!y||(d.preventDefault(),!it(b)))return;te(y.getAttribute("href")??y.href,t);return}if(d.key!=="Tab")return;let v=at(b);if(!v.length)return;let l=v[0],s=v.at(-1);d.shiftKey&&document.activeElement===l?(d.preventDefault(),s.focus()):!d.shiftKey&&document.activeElement===s&&(d.preventDefault(),l.focus())},{signal:a}),()=>u.disconnect()},Nt=(a,t)=>{document.addEventListener("ket:records-changed",()=>{document.querySelector('[data-ket-slot="backend.content"]')&&t.navigate(location.href,{replace:!0})},{signal:a})},$c=({navigation:a,lifetime:t})=>{Nt(t,a);let i=_(document),n=ie(t);Et(t),At(t,a),Dt(t),It(t);let u=Kt(t,a),d=Xt(t,a);return()=>{i(),d?.(),u(),n()}};export{$c as backendShell};
|