@ketvietlab/ketsuite 0.1.6 → 0.1.8

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.
Files changed (169) hide show
  1. package/dist/cli.js +1 -1
  2. package/dist/modules/activity_backend/islands.d.ts +39 -2
  3. package/dist/modules/activity_backend/islands.d.ts.map +1 -1
  4. package/dist/modules/activity_backend/islands.js +5 -5
  5. package/dist/modules/activity_backend/islands.js.map +1 -1
  6. package/dist/modules/backend/design/client/backend-shell.d.mts +6 -0
  7. package/dist/modules/backend/design/client/backend-shell.d.mts.map +1 -0
  8. package/dist/modules/backend/design/client/backend-shell.mjs +2 -0
  9. package/dist/modules/backend/design/client/backend-shell.mjs.map +7 -0
  10. package/dist/modules/backend/design/client/chart.d.mts +3 -0
  11. package/dist/modules/backend/design/client/chart.d.mts.map +1 -1
  12. package/dist/modules/backend/design/client/chart.mjs +1 -1
  13. package/dist/modules/backend/design/client/chart.mjs.map +3 -3
  14. package/dist/modules/backend/design/design-system.css +1 -1
  15. package/dist/modules/backend/design/record.css +15 -2
  16. package/dist/modules/backend/index.d.ts.map +1 -1
  17. package/dist/modules/backend/index.js +8 -2
  18. package/dist/modules/backend/index.js.map +1 -1
  19. package/dist/modules/backend/islands.d.ts +38 -2
  20. package/dist/modules/backend/islands.d.ts.map +1 -1
  21. package/dist/modules/backend/islands.js +5 -11
  22. package/dist/modules/backend/islands.js.map +1 -1
  23. package/dist/modules/backend/joints.js +1 -1
  24. package/dist/modules/calendar_backend/islands.d.ts +20 -2
  25. package/dist/modules/calendar_backend/islands.d.ts.map +1 -1
  26. package/dist/modules/calendar_backend/islands.js +3 -3
  27. package/dist/modules/calendar_backend/islands.js.map +1 -1
  28. package/dist/modules/crm_backend/client/crm-kanban-view.d.mts.map +1 -1
  29. package/dist/modules/crm_backend/client/crm-kanban-view.mjs +0 -1
  30. package/dist/modules/crm_backend/client/crm-kanban-view.mjs.map +1 -1
  31. package/dist/modules/crm_backend/islands.d.ts +16 -2
  32. package/dist/modules/crm_backend/islands.d.ts.map +1 -1
  33. package/dist/modules/crm_backend/islands.js +3 -3
  34. package/dist/modules/crm_backend/islands.js.map +1 -1
  35. package/dist/modules/flow_backend/islands.d.ts +41 -2
  36. package/dist/modules/flow_backend/islands.d.ts.map +1 -1
  37. package/dist/modules/flow_backend/islands.js +8 -8
  38. package/dist/modules/flow_backend/islands.js.map +1 -1
  39. package/dist/modules/livedoc/islands.d.ts +24 -2
  40. package/dist/modules/livedoc/islands.d.ts.map +1 -1
  41. package/dist/modules/livedoc/islands.js +6 -5
  42. package/dist/modules/livedoc/islands.js.map +1 -1
  43. package/dist/modules/mail_backend/islands.d.ts +39 -2
  44. package/dist/modules/mail_backend/islands.d.ts.map +1 -1
  45. package/dist/modules/mail_backend/islands.js +5 -5
  46. package/dist/modules/mail_backend/islands.js.map +1 -1
  47. package/dist/modules/partner_backend/islands.d.ts +35 -2
  48. package/dist/modules/partner_backend/islands.d.ts.map +1 -1
  49. package/dist/modules/partner_backend/islands.js +3 -3
  50. package/dist/modules/partner_backend/islands.js.map +1 -1
  51. package/dist/modules/product_backend/client/editor-view.d.mts +5 -4
  52. package/dist/modules/product_backend/client/editor-view.d.mts.map +1 -1
  53. package/dist/modules/product_backend/client/editor-view.mjs +53 -79
  54. package/dist/modules/product_backend/client/editor-view.mjs.map +1 -1
  55. package/dist/modules/product_backend/client/product.d.mts +2 -5
  56. package/dist/modules/product_backend/client/product.d.mts.map +1 -1
  57. package/dist/modules/product_backend/client/product.mjs +2 -3
  58. package/dist/modules/product_backend/client/product.mjs.map +1 -1
  59. package/dist/modules/product_backend/index.d.ts.map +1 -1
  60. package/dist/modules/product_backend/index.js +7 -0
  61. package/dist/modules/product_backend/index.js.map +1 -1
  62. package/dist/modules/product_backend/islands.d.ts +35 -2
  63. package/dist/modules/product_backend/islands.d.ts.map +1 -1
  64. package/dist/modules/product_backend/islands.js +7 -9
  65. package/dist/modules/product_backend/islands.js.map +1 -1
  66. package/dist/modules/sale_backend/client/editor-view.d.mts +5 -4
  67. package/dist/modules/sale_backend/client/editor-view.d.mts.map +1 -1
  68. package/dist/modules/sale_backend/client/editor-view.mjs +49 -71
  69. package/dist/modules/sale_backend/client/editor-view.mjs.map +1 -1
  70. package/dist/modules/sale_backend/client/sale.d.mts +1 -5
  71. package/dist/modules/sale_backend/client/sale.d.mts.map +1 -1
  72. package/dist/modules/sale_backend/client/sale.mjs +1 -8
  73. package/dist/modules/sale_backend/client/sale.mjs.map +1 -1
  74. package/dist/modules/sale_backend/index.js +7 -0
  75. package/dist/modules/sale_backend/index.js.map +1 -1
  76. package/dist/modules/sale_backend/islands.d.ts +17 -2
  77. package/dist/modules/sale_backend/islands.d.ts.map +1 -1
  78. package/dist/modules/sale_backend/islands.js +5 -7
  79. package/dist/modules/sale_backend/islands.js.map +1 -1
  80. package/dist/modules/stock_backend/client/editor-view.d.mts +5 -4
  81. package/dist/modules/stock_backend/client/editor-view.d.mts.map +1 -1
  82. package/dist/modules/stock_backend/client/editor-view.mjs +77 -92
  83. package/dist/modules/stock_backend/client/editor-view.mjs.map +1 -1
  84. package/dist/modules/stock_backend/client/stock.d.mts +1 -5
  85. package/dist/modules/stock_backend/client/stock.d.mts.map +1 -1
  86. package/dist/modules/stock_backend/client/stock.mjs +1 -8
  87. package/dist/modules/stock_backend/client/stock.mjs.map +1 -1
  88. package/dist/modules/stock_backend/index.js +7 -0
  89. package/dist/modules/stock_backend/index.js.map +1 -1
  90. package/dist/modules/stock_backend/islands.d.ts +19 -2
  91. package/dist/modules/stock_backend/islands.d.ts.map +1 -1
  92. package/dist/modules/stock_backend/islands.js +5 -7
  93. package/dist/modules/stock_backend/islands.js.map +1 -1
  94. package/dist/modules/website/cms.d.ts.map +1 -1
  95. package/dist/modules/website/cms.js +34 -7
  96. package/dist/modules/website/cms.js.map +1 -1
  97. package/dist/modules/website_backend/index.js +144 -0
  98. package/dist/modules/website_backend/index.js.map +1 -1
  99. package/dist/modules/website_backend/screens/index.d.ts +11 -0
  100. package/dist/modules/website_backend/screens/index.d.ts.map +1 -1
  101. package/dist/modules/website_backend/screens/index.js +335 -112
  102. package/dist/modules/website_backend/screens/index.js.map +1 -1
  103. package/dist/modules/website_backend/screens/page-frame.d.ts +2 -1
  104. package/dist/modules/website_backend/screens/page-frame.d.ts.map +1 -1
  105. package/dist/modules/website_backend/screens/page-frame.js +1 -1
  106. package/dist/modules/website_backend/screens/page-frame.js.map +1 -1
  107. package/dist/modules/website_search/client/search.d.mts +8 -1
  108. package/dist/modules/website_search/client/search.d.mts.map +1 -1
  109. package/dist/modules/website_search/client/search.mjs +37 -16
  110. package/dist/modules/website_search/client/search.mjs.map +1 -1
  111. package/dist/modules/website_search/islands.d.ts +18 -2
  112. package/dist/modules/website_search/islands.d.ts.map +1 -1
  113. package/dist/modules/website_search/islands.js +4 -14
  114. package/dist/modules/website_search/islands.js.map +1 -1
  115. package/dist/scaffold/index.js +1 -1
  116. package/dist/ui/client/activity-view.d.mts +2 -0
  117. package/dist/ui/client/activity-view.d.mts.map +1 -1
  118. package/dist/ui/client/activity-view.mjs +6 -4
  119. package/dist/ui/client/activity-view.mjs.map +1 -1
  120. package/dist/ui/client/activity.d.mts +2 -0
  121. package/dist/ui/client/activity.d.mts.map +1 -1
  122. package/dist/ui/client/calendar-view.d.mts +1 -0
  123. package/dist/ui/client/calendar-view.d.mts.map +1 -1
  124. package/dist/ui/client/calendar-view.mjs +1 -2
  125. package/dist/ui/client/calendar-view.mjs.map +1 -1
  126. package/dist/ui/client/calendar.d.mts +1 -0
  127. package/dist/ui/client/calendar.d.mts.map +1 -1
  128. package/dist/ui/client/chart-view.d.ts +1 -7
  129. package/dist/ui/client/chart-view.d.ts.map +1 -1
  130. package/dist/ui/client/chart-view.js +10 -13
  131. package/dist/ui/client/chart-view.js.map +1 -1
  132. package/dist/ui/client/flow-board-view.d.mts.map +1 -1
  133. package/dist/ui/client/flow-board-view.mjs +3 -4
  134. package/dist/ui/client/flow-board-view.mjs.map +1 -1
  135. package/dist/ui/client/live-doc-view.d.ts +3 -3
  136. package/dist/ui/client/live-doc-view.d.ts.map +1 -1
  137. package/dist/ui/client/live-doc-view.js +13 -10
  138. package/dist/ui/client/live-doc-view.js.map +1 -1
  139. package/dist/ui/client/live-doc.d.mts +4 -1
  140. package/dist/ui/client/live-doc.d.mts.map +1 -1
  141. package/dist/ui/client/live-doc.mjs +1 -1
  142. package/dist/ui/client/live-doc.mjs.map +3 -3
  143. package/dist/ui/client/mail-bundle.d.mts +5 -3
  144. package/dist/ui/client/mail-bundle.d.mts.map +1 -1
  145. package/dist/ui/client/mail-bundle.mjs +5 -5
  146. package/dist/ui/client/mail-bundle.mjs.map +2 -2
  147. package/dist/ui/client/mail-entry.d.mts +2 -0
  148. package/dist/ui/client/mail-entry.d.mts.map +1 -1
  149. package/dist/ui/client/mail-view.d.mts +2 -0
  150. package/dist/ui/client/mail-view.d.mts.map +1 -1
  151. package/dist/ui/client/mail-view.mjs +6 -4
  152. package/dist/ui/client/mail-view.mjs.map +1 -1
  153. package/dist/ui/client/table-selection-view.d.ts +2 -3
  154. package/dist/ui/client/table-selection-view.d.ts.map +1 -1
  155. package/dist/ui/client/table-selection-view.js +49 -72
  156. package/dist/ui/client/table-selection-view.js.map +1 -1
  157. package/dist/ui/client/user-workflow.d.ts +1 -1
  158. package/dist/ui/client/user-workflow.d.ts.map +1 -1
  159. package/dist/ui/client/user-workflow.js +12 -10
  160. package/dist/ui/client/user-workflow.js.map +1 -1
  161. package/dist/ui/form-page.d.ts +14 -4
  162. package/dist/ui/form-page.d.ts.map +1 -1
  163. package/dist/ui/form-page.js +11 -3
  164. package/dist/ui/form-page.js.map +1 -1
  165. package/package.json +4 -4
  166. package/dist/modules/backend/design/client/table-selection.d.mts +0 -7
  167. package/dist/modules/backend/design/client/table-selection.d.mts.map +0 -1
  168. package/dist/modules/backend/design/client/table-selection.mjs +0 -2
  169. package/dist/modules/backend/design/client/table-selection.mjs.map +0 -7
package/dist/cli.js CHANGED
@@ -4,7 +4,7 @@ import { serveDeployment } from '@ketvietlab/ketjs';
4
4
  import { ketsuite } from './deployment.js';
5
5
  import { ensureDevelopmentAdmin } from './development.js';
6
6
  import { scaffoldKetsuite } from './scaffold/index.js';
7
- const VERSION = '0.1.6';
7
+ const VERSION = '0.1.8';
8
8
  const HELP = `KetSuite ${VERSION}
9
9
 
10
10
  Usage:
@@ -1,3 +1,40 @@
1
- import type { IslandDefinition } from '@ketvietlab/ketjs-view';
2
- export declare const islands: Record<string, IslandDefinition>;
1
+ type RecordActivityProps = {
2
+ resModel: string;
3
+ resId: string;
4
+ lang?: string;
5
+ };
6
+ type IndicatorProps = {
7
+ lang?: string;
8
+ };
9
+ export declare const islands: {
10
+ 'activity.record': {
11
+ props: {
12
+ resModel: string;
13
+ resId: string;
14
+ lang: string;
15
+ };
16
+ key: ("resId" | "resModel")[];
17
+ client: string;
18
+ export: string;
19
+ view: (props: Readonly<RecordActivityProps>) => {
20
+ view: () => any;
21
+ mount: () => void;
22
+ dispose: () => void;
23
+ };
24
+ };
25
+ 'activity.indicator': {
26
+ props: {
27
+ lang: string;
28
+ };
29
+ key: never[];
30
+ client: string;
31
+ export: string;
32
+ view: (props: Readonly<IndicatorProps>) => {
33
+ view: () => any;
34
+ mount: () => undefined;
35
+ dispose: () => void;
36
+ };
37
+ };
38
+ };
39
+ export {};
3
40
  //# sourceMappingURL=islands.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"islands.d.ts","sourceRoot":"","sources":["../../../../../../packages/ketsuite/src/modules/activity_backend/islands.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAe,MAAM,wBAAwB,CAAA;AAK3E,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAepD,CAAA"}
1
+ {"version":3,"file":"islands.d.ts","sourceRoot":"","sources":["../../../../../../packages/ketsuite/src/modules/activity_backend/islands.ts"],"names":[],"mappings":"AAKA,KAAK,mBAAmB,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAC7E,KAAK,cAAc,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAEvC,eAAO,MAAM,OAAO;IAClB,iBAAiB;;YACN,QAAQ;YAAU,KAAK;YAAQ,IAAI;;;;;;;;;;;IAM9C,oBAAoB;;YACT,IAAI;;;;;;;;;;;CAMhB,CAAA"}
@@ -1,20 +1,20 @@
1
- import { each, html, signal } from '@ketvietlab/ketjs-view';
1
+ import { defineIsland, each, html, signal } from '@ketvietlab/ketjs-view';
2
2
  import { createActivityIndicatorView, createRecordActivityView } from '../../ui/client/activity-view.mjs';
3
3
  const runtime = { each, html, signal };
4
4
  export const islands = {
5
- 'activity.record': {
5
+ 'activity.record': defineIsland()({
6
6
  props: { resModel: 'text', resId: 'id', lang: 'text?' },
7
7
  key: ['resModel', 'resId'],
8
8
  client: 'activity.mjs',
9
9
  export: 'record',
10
10
  view: (props) => createRecordActivityView(runtime, props),
11
- },
12
- 'activity.indicator': {
11
+ }),
12
+ 'activity.indicator': defineIsland()({
13
13
  props: { lang: 'text?' },
14
14
  key: [],
15
15
  client: 'activity.mjs',
16
16
  export: 'indicator',
17
17
  view: (props) => createActivityIndicatorView(runtime, props),
18
- },
18
+ }),
19
19
  };
20
20
  //# sourceMappingURL=islands.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"islands.js","sourceRoot":"","sources":["../../../../../../../packages/ketsuite/src/modules/activity_backend/islands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAE3D,OAAO,EAAE,2BAA2B,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAA;AAEzG,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AAEtC,MAAM,CAAC,MAAM,OAAO,GAAqC;IACvD,iBAAiB,EAAE;QACjB,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE;QACvD,GAAG,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC;QAC1B,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,CAAC,KAAkB,EAAE,EAAE,CAAC,wBAAwB,CAAC,OAAO,EAAE,KAAK,CAAC;KACvE;IACD,oBAAoB,EAAE;QACpB,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;QACxB,GAAG,EAAE,EAAE;QACP,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,WAAW;QACnB,IAAI,EAAE,CAAC,KAAkB,EAAE,EAAE,CAAC,2BAA2B,CAAC,OAAO,EAAE,KAAK,CAAC;KAC1E;CACF,CAAA"}
1
+ {"version":3,"file":"islands.js","sourceRoot":"","sources":["../../../../../../../packages/ketsuite/src/modules/activity_backend/islands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AACzE,OAAO,EAAE,2BAA2B,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAA;AAEzG,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AAKtC,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,iBAAiB,EAAE,YAAY,EAAuB,CAAC;QACrD,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE;QACvD,GAAG,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC;QAC1B,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,wBAAwB,CAAC,OAAO,EAAE,KAAK,CAAC;KAC1D,CAAC;IACF,oBAAoB,EAAE,YAAY,EAAkB,CAAC;QACnD,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;QACxB,GAAG,EAAE,EAAE;QACP,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,WAAW;QACnB,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,2BAA2B,CAAC,OAAO,EAAE,KAAK,CAAC;KAC7D,CAAC;CACH,CAAA"}
@@ -0,0 +1,6 @@
1
+ declare var _: ({ navigation: n, lifetime: e }: {
2
+ lifetime: any;
3
+ navigation: any;
4
+ }) => () => void;
5
+ export { _ as backendShell };
6
+ //# sourceMappingURL=backend-shell.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend-shell.d.mts","sourceRoot":"","sources":["../../../../../../../../packages/ketsuite/src/modules/backend/design/client/backend-shell.mjs"],"names":[],"mappings":"AAC26G,QAAA,IAAonO,CAAC;;;gBAAgH,CAAC;AAAA,OAAM,EAAC,CAAC,IAAI,YAAY,EAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ // @ts-nocheck Generated by tools/build-backend-client.mjs — do not edit.
2
+ function q(n){let e,t,o=0;async function l(a){let s=a.querySelector("input[type=email]"),d=a.querySelector("[data-email-status]");if(!s||!d)return;e?.abort(),clearTimeout(t);let f=++o,m=s.value.trim(),p=a.querySelector("[data-email-next]"),b=a.querySelector("[data-email-retry]"),y=(u,E)=>{d.textContent=u,p&&(p.disabled=!E),s.setAttribute("aria-invalid",String(!E)),a.dataset.emailAvailable=E?"true":"false"};if(b&&(b.hidden=!0),!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(m)){y(m?"Email ch\u01B0a \u0111\xFAng \u0111\u1ECBnh d\u1EA1ng.":"Nh\u1EADp email \u0111\u1EC3 ki\u1EC3m tra.",!1);return}y("\u0110ang ki\u1EC3m tra email\u2026",!1),t=setTimeout(async()=>{e=new AbortController;try{let u=await fetch(a.dataset.emailCheck,{method:"POST",cache:"no-store",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({email:m}),signal:AbortSignal.any([e.signal,AbortSignal.timeout(1e4)])});if(!u.ok)throw new Error("email-check-failed");let E=await u.json();if(f!==o||!a.isConnected)return;if(!E.ok)throw new Error("email-check-failed");y(E.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.",E.available)}catch{if(f!==o||!a.isConnected)return;y("Ch\u01B0a ki\u1EC3m tra \u0111\u01B0\u1EE3c email. Vui l\xF2ng th\u1EED l\u1EA1i.",!1),b&&(b.hidden=!1)}},400)}function r(a,s=!1){let d=a.querySelector('select[name="companyId"]'),f=a.querySelector('select[name="branchId"]'),m=a.querySelector('select[name="scopeKind"]')?.value;if(f&&d){s&&(f.value="");for(let u of f.options)u.value&&(u.hidden=u.dataset.companyId!==d.value,u.disabled=u.hidden)}let p=m==="tenant"?"tenant":m==="branch"?`branch:${d?.value}:${f?.value}`:`company:${d?.value}`;for(let u of a.querySelectorAll("[data-assigned-scopes]")){let v=JSON.parse(u.dataset.assignedScopes??"[]").includes(p);u.disabled=u.dataset.roleDisabled==="true"||v;let k=u.closest("[data-role-option]"),H=k?.querySelector("[data-role-assigned]"),A=k?.querySelector("[data-role-description]");H&&(H.hidden=!v),A&&(A.hidden=v),u.disabled&&(u.checked=!1)}let b=d?.closest('[data-ui="form-field"]'),y=f?.closest('[data-ui="form-field"]');b&&(b.hidden=m==="tenant"),y&&(y.hidden=m==="tenant"||m==="company")}function c(){for(let a of document.querySelectorAll("form[data-user-workflow]"))a.dataset.initialized||(a.dataset.initialized="true",r(a),l(a))}document.addEventListener("input",a=>{let s=a.target,d=s.closest("form[data-user-workflow]");if(d&&(s.type==="email"&&l(d),s.matches("[data-role-search]"))){let f=0;for(let p of d.querySelectorAll("[data-role-option]"))p.hidden=!p.textContent?.toLocaleLowerCase("vi").includes(s.value.toLocaleLowerCase("vi")),p.hidden||f++;let m=d.querySelector("[data-role-empty]");m&&(m.hidden=f>0)}},{signal:n}),document.addEventListener("change",a=>{let s=a.target,d=s.closest("form[data-user-workflow]");d&&s.matches('select[name="companyId"],select[name="branchId"],select[name="scopeKind"]')&&r(d,s.matches('select[name="companyId"]'))},{signal:n}),document.addEventListener("click",a=>{let s=a.target;s.matches("[data-email-retry]")&&l(s.closest("form"))},{signal:n}),document.addEventListener("submit",a=>{let s=a.target;s.matches("form[data-user-workflow]")&&s.querySelector("input[type=email]")&&s.dataset.emailAvailable!=="true"&&a.preventDefault()},{signal:n});let i=new MutationObserver(c);return i.observe(document.documentElement,{childList:!0,subtree:!0}),c(),()=>{e?.abort(),clearTimeout(t),i.disconnect()}}var S="ket.backend.theme",M=['[data-ui="search-menu"]','[data-ui="col-config"]','[data-ui="bulk-actions"]','[data-ui="viewer"]','[data-ui="record-more"]'].join(", "),B=globalThis,h=n=>n.target instanceof Element?n.target:null,T=n=>n==="light"||n==="dark"?n:null,P=()=>{try{return T(localStorage.getItem(S))}catch{return null}},K=n=>{try{localStorage.setItem(S,n)}catch{}},C=()=>T(document.documentElement.dataset.theme)??(matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),L=()=>{let n=String(C()==="dark");for(let e of document.querySelectorAll('[data-ui="sidebar-tools"] [data-ui="action"][name="theme"]'))e.setAttribute("aria-pressed",n)},N=n=>{let e=P();e&&(document.documentElement.dataset.theme=e),L(),document.addEventListener("click",t=>{let o=h(t)?.closest('[data-ui="sidebar-tools"] [data-ui="action"][name="theme"]');if(!o||o.disabled)return;let l=C()==="dark"?"light":"dark";document.documentElement.dataset.theme=l,K(l),L()},{signal:n}),matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{T(document.documentElement.dataset.theme)||L()},{signal:n}),addEventListener("storage",t=>{if(t.key!==S)return;let o=T(t.newValue);o?document.documentElement.dataset.theme=o:delete document.documentElement.dataset.theme,L()},{signal:n})},R=n=>{let e=[...n.querySelectorAll('[data-ui="row-select"]:not(:disabled)')],t=e.filter(l=>l.checked).length,o=n.querySelector('[data-ui="select-all"]');if(o&&(o.checked=e.length>0&&t===e.length,o.indeterminate=t>0&&t<e.length),!t){let l=n.closest('[data-ui="shell"]');for(let r of l?.querySelectorAll('[data-ui="bulk-actions"][open]')??[])r.removeAttribute("open")}},$=(n,e)=>{document.addEventListener("change",t=>{let o=h(t);if(!(o instanceof HTMLInputElement)||!o.matches('[data-ui="select-all"], [data-ui="row-select"]'))return;let l=o.closest('[data-ui="table"]');if(l){if(o.matches('[data-ui="select-all"]'))for(let r of l.querySelectorAll('[data-ui="row-select"]:not(:disabled)'))r.checked=o.checked;R(l)}},{signal:n}),document.addEventListener("click",t=>{if(t.defaultPrevented||t.button!==0||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey)return;let o=h(t);if(o?.closest('a, button, input, select, textarea, label, summary, details, [data-ui="select-cell"]'))return;let r=o?.closest('[data-ui="row"][data-row-href]')?.getAttribute("data-row-href");r&&(t.preventDefault(),e.navigate(r))},{signal:n}),document.addEventListener("keydown",t=>{if(t.defaultPrevented||t.key!=="Enter"&&t.key!==" ")return;let o=h(t),r=(o?.matches('[data-ui="row"][data-row-href][tabindex="0"]')?o:null)?.getAttribute("data-row-href");r&&(t.preventDefault(),w(r,e))},{signal:n})},D=()=>[...document.querySelectorAll(`${M}[open]`)],O=n=>{document.addEventListener("click",e=>{let t=h(e)?.closest(M);for(let o of D())o!==t&&!o.contains(t??null)&&o.removeAttribute("open")},{signal:n}),document.addEventListener("keydown",e=>{if(e.key!=="Escape")return;let t=D();if(!t.length)return;let o=document.activeElement?.closest(M),l=o?.open?o:t.at(-1);l?.removeAttribute("open"),l?.querySelector("summary")?.focus(),e.preventDefault()},{signal:n})},U=n=>{document.addEventListener("click",e=>{let t=h(e)?.closest('[data-ui="chrome-search-toggle"]'),o=t?.getAttribute("aria-controls");if(!t||!o)return;let l=document.getElementById(o);!(l instanceof HTMLDialogElement)||l.open||(l.showModal(),t.setAttribute("aria-expanded","true"),requestAnimationFrame(()=>l.querySelector('[data-presentation="modal"] [data-ui="chrome-search-input"]')?.focus()))},{signal:n}),document.addEventListener("cancel",e=>{h(e)?.matches('[data-ui="chrome-search-modal"]')&&e.preventDefault()},{capture:!0,signal:n}),document.addEventListener("close",e=>{let t=h(e);if(!(t instanceof HTMLDialogElement)||!t.matches('[data-ui="chrome-search-modal"]'))return;let o=document.querySelector(`[data-ui="chrome-search-toggle"][aria-controls="${CSS.escape(t.id)}"]`);o?.setAttribute("aria-expanded","false"),o?.focus()},{capture:!0,signal:n})},j=["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"]'),I=n=>[...n.querySelectorAll(j)].filter(e=>!e.hidden&&e.getAttribute("aria-hidden")!=="true"&&!e.matches('[data-ui="modal-backdrop"]')),w=(n,e)=>{e.navigate(n)},G=(n,e)=>n.composedPath().some(t=>t instanceof HTMLElement&&t!==e&&t.matches('[data-ui="modal-layer"][data-presentation="dialog"]')),F=n=>{for(let e of n.querySelectorAll('input:not([type="hidden"])'))if(!e.disabled){if(e.type==="checkbox"||e.type==="radio"){if(e.checked!==e.defaultChecked)return!0}else if(e.value!==e.defaultValue)return!0}for(let e of n.querySelectorAll("textarea"))if(!e.disabled&&e.value!==e.defaultValue)return!0;for(let e of n.querySelectorAll("select"))if(!e.disabled){for(let t of e.options)if(t.selected!==t.defaultSelected)return!0}return!1},x=n=>{if(!F(n))return!0;let e=n.getAttribute("data-unsaved-prompt");return e?B.confirm(e):!0},V=(n,e)=>{if(typeof EventSource!="function")return;let t=null,o=null,l=()=>{o?.close(),o=null,t=null},r=()=>{let i=document.querySelector('[data-ui="live-region"][data-stream]');if(i===t)return;l();let a=i instanceof HTMLElement?i.dataset.stream??"":"";if(!a)return;t=i,o=new EventSource(`/_ket/stream/${encodeURIComponent(a)}`);let s=()=>w(location.href,e);o.onmessage=s,o.addEventListener("done",()=>{l(),s()}),o.onerror=()=>{o?.readyState===EventSource.CLOSED&&l()}};r();let c=new MutationObserver(r);return c.observe(document.body,{childList:!0,subtree:!0}),addEventListener("pagehide",l,{signal:n}),()=>{c.disconnect(),l()}},W=(n,e)=>{let t=new WeakSet,o=()=>{let r=g();!r||t.has(r)||(t.add(r),requestAnimationFrame(()=>{let c=r.querySelector('[data-ui="modal-sheet"]');(I(r).find(a=>!a.matches('[data-ui="modal-close"]'))??c)?.focus()}))};o();let l=new MutationObserver(o);return l.observe(document.body,{childList:!0,subtree:!0}),document.addEventListener("click",r=>{let c=g();if(!c)return;let i=r.composedPath().find(a=>a instanceof HTMLElement&&(a.matches('[data-ui="modal-close"], [data-ui="modal-backdrop"], a[data-ui="tab"]')||a.matches('a[data-ui="action"][href]')));!i||!c.contains(i)||x(c)||(r.preventDefault(),r.stopPropagation())},{capture:!0,signal:n}),document.addEventListener("click",r=>{let c=document.querySelector("[data-save-before-navigation]"),i=c instanceof HTMLFormElement?c:c?.querySelector("form"),a=h(r)?.closest("a[href]");if(!c||!i||!a||g()||!F(c)||(r.preventDefault(),r.stopPropagation(),!B.confirm(c.dataset.saveBeforeNavigation)))return;let s=i.querySelector('input[name="returnTo"]');s||(s=document.createElement("input"),s.type="hidden",s.name="returnTo",i.append(s)),s.value=a.href,i.requestSubmit()},{capture:!0,signal:n}),document.addEventListener("keydown",r=>{let c=g();if(!c||G(r,c))return;if(r.key==="Escape"){let d=c.querySelector('[data-ui="modal-close"]');if(!d||(r.preventDefault(),!x(c)))return;w(d.getAttribute("href")??d.href,e);return}if(r.key!=="Tab")return;let i=I(c);if(!i.length)return;let a=i[0],s=i.at(-1);r.shiftKey&&document.activeElement===a?(r.preventDefault(),s.focus()):!r.shiftKey&&document.activeElement===s&&(r.preventDefault(),a.focus())},{signal:n}),()=>l.disconnect()},_=({navigation:n,lifetime:e})=>{let t=q(e);N(e),$(e,n),O(e),U(e);let o=W(e,n),l=V(e,n);return()=>{l?.(),o(),t()}};export{_ as backendShell};
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../ui/client/user-workflow.ts", "../../../../ui/client/table-selection-view.tsx"],
4
+ "sourcesContent": ["export function installUserWorkflow(lifetime: AbortSignal): () => void {\n let abort: AbortController | undefined,\n timer: ReturnType<typeof setTimeout> | undefined,\n sequence = 0\n async function check(form: HTMLFormElement) {\n const input = form.querySelector<HTMLInputElement>('input[type=email]'),\n status = form.querySelector<HTMLElement>('[data-email-status]')\n if (!input || !status) return\n abort?.abort()\n clearTimeout(timer)\n const request = ++sequence\n const value = input.value.trim(),\n next = form.querySelector<HTMLButtonElement>('[data-email-next]'),\n retry = form.querySelector<HTMLButtonElement>('[data-email-retry]')\n const paint = (message: string, valid: boolean) => {\n status.textContent = message\n if (next) next.disabled = !valid\n input.setAttribute('aria-invalid', String(!valid))\n form.dataset.emailAvailable = valid ? 'true' : 'false'\n }\n if (retry) retry.hidden = true\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) {\n paint(value ? 'Email ch\u01B0a \u0111\u00FAng \u0111\u1ECBnh d\u1EA1ng.' : 'Nh\u1EADp email \u0111\u1EC3 ki\u1EC3m tra.', false)\n return\n }\n paint('\u0110ang ki\u1EC3m tra email\u2026', false)\n timer = setTimeout(async () => {\n abort = new AbortController()\n try {\n const response = await fetch(form.dataset.emailCheck!, {\n method: 'POST',\n cache: 'no-store',\n headers: { 'content-type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({ email: value }),\n signal: AbortSignal.any([abort.signal, AbortSignal.timeout(10000)]),\n })\n if (!response.ok) throw new Error('email-check-failed')\n const result = (await response.json()) as { available: boolean; ok: boolean }\n if (request !== sequence || !form.isConnected) return\n if (!result.ok) throw new Error('email-check-failed')\n paint(\n result.available ? 'Email c\u00F3 th\u1EC3 s\u1EED d\u1EE5ng.' : 'Email \u0111\u00E3 \u0111\u01B0\u1EE3c s\u1EED d\u1EE5ng. Nh\u1EADp email kh\u00E1c.',\n result.available,\n )\n } catch {\n if (request !== sequence || !form.isConnected) return\n paint('Ch\u01B0a ki\u1EC3m tra \u0111\u01B0\u1EE3c email. Vui l\u00F2ng th\u1EED l\u1EA1i.', false)\n if (retry) retry.hidden = false\n }\n }, 400)\n }\n function scope(form: HTMLFormElement, changed = false) {\n const company = form.querySelector<HTMLSelectElement>('select[name=\"companyId\"]'),\n branch = form.querySelector<HTMLSelectElement>('select[name=\"branchId\"]'),\n kind = form.querySelector<HTMLSelectElement>('select[name=\"scopeKind\"]')?.value\n if (branch && company) {\n if (changed) branch.value = ''\n for (const option of branch.options) {\n if (option.value) {\n option.hidden = option.dataset.companyId !== company.value\n option.disabled = option.hidden\n }\n }\n }\n const key =\n kind === 'tenant'\n ? 'tenant'\n : kind === 'branch'\n ? `branch:${company?.value}:${branch?.value}`\n : `company:${company?.value}`\n for (const input of form.querySelectorAll<HTMLInputElement>('[data-assigned-scopes]')) {\n const scopes = JSON.parse(input.dataset.assignedScopes ?? '[]') as string[]\n const assigned = scopes.includes(key)\n input.disabled = input.dataset.roleDisabled === 'true' || assigned\n const row = input.closest('[data-role-option]')\n const assignedLabel = row?.querySelector<HTMLElement>('[data-role-assigned]')\n const description = row?.querySelector<HTMLElement>('[data-role-description]')\n if (assignedLabel) assignedLabel.hidden = !assigned\n if (description) description.hidden = assigned\n if (input.disabled) input.checked = false\n }\n const companyField = company?.closest<HTMLElement>('[data-ui=\"form-field\"]')\n const branchField = branch?.closest<HTMLElement>('[data-ui=\"form-field\"]')\n if (companyField) companyField.hidden = kind === 'tenant'\n if (branchField) branchField.hidden = kind === 'tenant' || kind === 'company'\n }\n function scan() {\n for (const form of document.querySelectorAll<HTMLFormElement>('form[data-user-workflow]'))\n if (!form.dataset.initialized) {\n form.dataset.initialized = 'true'\n scope(form)\n void check(form)\n }\n }\n document.addEventListener(\n 'input',\n (event) => {\n const input = event.target as HTMLInputElement,\n form = input.closest<HTMLFormElement>('form[data-user-workflow]')\n if (!form) return\n if (input.type === 'email') void check(form)\n if (input.matches('[data-role-search]')) {\n let n = 0\n for (const row of form.querySelectorAll<HTMLElement>('[data-role-option]')) {\n row.hidden = !row.textContent?.toLocaleLowerCase('vi').includes(input.value.toLocaleLowerCase('vi'))\n if (!row.hidden) n++\n }\n const empty = form.querySelector<HTMLElement>('[data-role-empty]')\n if (empty) empty.hidden = n > 0\n }\n },\n { signal: lifetime },\n )\n document.addEventListener(\n 'change',\n (event) => {\n const input = event.target as HTMLElement,\n form = input.closest<HTMLFormElement>('form[data-user-workflow]')\n if (form && input.matches('select[name=\"companyId\"],select[name=\"branchId\"],select[name=\"scopeKind\"]'))\n scope(form, input.matches('select[name=\"companyId\"]'))\n },\n { signal: lifetime },\n )\n document.addEventListener(\n 'click',\n (event) => {\n const target = event.target as HTMLElement\n if (target.matches('[data-email-retry]')) void check(target.closest('form')!)\n },\n { signal: lifetime },\n )\n document.addEventListener(\n 'submit',\n (event) => {\n const form = event.target as HTMLFormElement\n if (\n form.matches('form[data-user-workflow]') &&\n form.querySelector('input[type=email]') &&\n form.dataset.emailAvailable !== 'true'\n )\n event.preventDefault()\n },\n { signal: lifetime },\n )\n const observer = new MutationObserver(scan)\n observer.observe(document.documentElement, { childList: true, subtree: true })\n scan()\n return () => {\n abort?.abort()\n clearTimeout(timer)\n observer.disconnect()\n }\n}\n", "import { installUserWorkflow } from './user-workflow.ts'\nimport type { BrowserBehavior, BrowserNavigation } from '@ketvietlab/ketjs'\n\nconst themeStorageKey = 'ket.backend.theme'\nconst dismissibleDropdown = [\n '[data-ui=\"search-menu\"]',\n '[data-ui=\"col-config\"]',\n '[data-ui=\"bulk-actions\"]',\n '[data-ui=\"viewer\"]',\n '[data-ui=\"record-more\"]',\n].join(', ')\n\ntype KetBrowserGlobals = typeof globalThis & {\n confirm: (message?: string) => boolean\n}\n\nconst browserGlobals = globalThis as KetBrowserGlobals\nconst eventElement = (event: Event): Element | null => (event.target instanceof Element ? event.target : null)\n\ntype ThemePreference = 'light' | 'dark'\n\nconst themePreference = (value: string | null | undefined): ThemePreference | null =>\n value === 'light' || value === 'dark' ? value : null\n\nconst storedTheme = (): ThemePreference | null => {\n try {\n return themePreference(localStorage.getItem(themeStorageKey))\n } catch {\n return null\n }\n}\n\nconst saveTheme = (theme: ThemePreference): void => {\n try {\n localStorage.setItem(themeStorageKey, theme)\n } catch {\n // Theme selection still works for this document when storage is unavailable.\n }\n}\n\nconst resolvedTheme = (): ThemePreference =>\n themePreference(document.documentElement.dataset.theme) ??\n (matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light')\n\nconst syncThemeToggle = (): void => {\n const pressed = String(resolvedTheme() === 'dark')\n for (const control of document.querySelectorAll<HTMLElement>(\n '[data-ui=\"sidebar-tools\"] [data-ui=\"action\"][name=\"theme\"]',\n ))\n control.setAttribute('aria-pressed', pressed)\n}\n\n/** Keep the shell preference explicit only after the reader chooses one. */\nconst installThemeToggle = (signal: AbortSignal): void => {\n const preference = storedTheme()\n if (preference) document.documentElement.dataset.theme = preference\n syncThemeToggle()\n\n document.addEventListener(\n 'click',\n (event) => {\n const control = eventElement(event)?.closest<HTMLButtonElement>(\n '[data-ui=\"sidebar-tools\"] [data-ui=\"action\"][name=\"theme\"]',\n )\n if (!control || control.disabled) return\n const next = resolvedTheme() === 'dark' ? 'light' : 'dark'\n document.documentElement.dataset.theme = next\n saveTheme(next)\n syncThemeToggle()\n },\n { signal },\n )\n\n matchMedia('(prefers-color-scheme: dark)').addEventListener(\n 'change',\n () => {\n if (!themePreference(document.documentElement.dataset.theme)) syncThemeToggle()\n },\n { signal },\n )\n\n addEventListener(\n 'storage',\n (event) => {\n if (event.key !== themeStorageKey) return\n const next = themePreference(event.newValue)\n if (next) document.documentElement.dataset.theme = next\n else delete document.documentElement.dataset.theme\n syncThemeToggle()\n },\n { signal },\n )\n}\n\nconst updateSelection = (table: Element): void => {\n const rows = [...table.querySelectorAll<HTMLInputElement>('[data-ui=\"row-select\"]:not(:disabled)')]\n const checked = rows.filter((input) => input.checked).length\n const all = table.querySelector<HTMLInputElement>('[data-ui=\"select-all\"]')\n if (all) {\n all.checked = rows.length > 0 && checked === rows.length\n all.indeterminate = checked > 0 && checked < rows.length\n }\n if (!checked) {\n const shell = table.closest('[data-ui=\"shell\"]')\n for (const menu of shell?.querySelectorAll<HTMLDetailsElement>('[data-ui=\"bulk-actions\"][open]') ?? [])\n menu.removeAttribute('open')\n }\n}\n\nconst installTableSelection = (signal: AbortSignal, navigation: BrowserNavigation): void => {\n document.addEventListener(\n 'change',\n (event) => {\n const target = eventElement(event)\n if (!(target instanceof HTMLInputElement)) return\n if (!target.matches('[data-ui=\"select-all\"], [data-ui=\"row-select\"]')) return\n const table = target.closest('[data-ui=\"table\"]')\n if (!table) return\n if (target.matches('[data-ui=\"select-all\"]'))\n for (const input of table.querySelectorAll<HTMLInputElement>('[data-ui=\"row-select\"]:not(:disabled)'))\n input.checked = target.checked\n updateSelection(table)\n },\n { signal },\n )\n\n document.addEventListener(\n 'click',\n (event) => {\n if (\n event.defaultPrevented ||\n event.button !== 0 ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey ||\n event.altKey\n )\n return\n const target = eventElement(event)\n if (\n target?.closest(\n 'a, button, input, select, textarea, label, summary, details, [data-ui=\"select-cell\"]',\n )\n )\n return\n const row = target?.closest<HTMLElement>('[data-ui=\"row\"][data-row-href]')\n const href = row?.getAttribute('data-row-href')\n if (!href) return\n event.preventDefault()\n void navigation.navigate(href)\n },\n { signal },\n )\n document.addEventListener(\n 'keydown',\n (event) => {\n if (event.defaultPrevented || (event.key !== 'Enter' && event.key !== ' ')) return\n const target = eventElement(event)\n const row = target?.matches('[data-ui=\"row\"][data-row-href][tabindex=\"0\"]') ? target : null\n const href = row?.getAttribute('data-row-href')\n if (!href) return\n event.preventDefault()\n navigateTo(href, navigation)\n },\n { signal },\n )\n}\n\nconst openDropdowns = (): HTMLDetailsElement[] => [\n ...document.querySelectorAll<HTMLDetailsElement>(`${dismissibleDropdown}[open]`),\n]\n\nconst installDropdownDismiss = (signal: AbortSignal): void => {\n document.addEventListener(\n 'click',\n (event) => {\n const current = eventElement(event)?.closest(dismissibleDropdown)\n for (const dropdown of openDropdowns()) {\n if (dropdown !== current && !dropdown.contains(current ?? null)) dropdown.removeAttribute('open')\n }\n },\n { signal },\n )\n\n document.addEventListener(\n 'keydown',\n (event) => {\n if (event.key !== 'Escape') return\n const dropdowns = openDropdowns()\n if (!dropdowns.length) return\n const focused = document.activeElement?.closest<HTMLDetailsElement>(dismissibleDropdown)\n const current = focused?.open ? focused : dropdowns.at(-1)\n current?.removeAttribute('open')\n current?.querySelector<HTMLElement>('summary')?.focus()\n event.preventDefault()\n },\n { signal },\n )\n}\n\nconst installGlobalFilter = (signal: AbortSignal): void => {\n document.addEventListener(\n 'click',\n (event) => {\n const trigger = eventElement(event)?.closest<HTMLElement>('[data-ui=\"chrome-search-toggle\"]')\n const controls = trigger?.getAttribute('aria-controls')\n if (!trigger || !controls) return\n const dialog = document.getElementById(controls)\n if (!(dialog instanceof HTMLDialogElement) || dialog.open) return\n dialog.showModal()\n trigger.setAttribute('aria-expanded', 'true')\n requestAnimationFrame(() =>\n dialog\n .querySelector<HTMLElement>('[data-presentation=\"modal\"] [data-ui=\"chrome-search-input\"]')\n ?.focus(),\n )\n },\n { signal },\n )\n\n document.addEventListener(\n 'cancel',\n (event) => {\n if (!eventElement(event)?.matches('[data-ui=\"chrome-search-modal\"]')) return\n event.preventDefault()\n },\n { capture: true, signal },\n )\n\n document.addEventListener(\n 'close',\n (event) => {\n const dialog = eventElement(event)\n if (!(dialog instanceof HTMLDialogElement)) return\n if (!dialog.matches('[data-ui=\"chrome-search-modal\"]')) return\n const trigger = document.querySelector<HTMLElement>(\n `[data-ui=\"chrome-search-toggle\"][aria-controls=\"${CSS.escape(dialog.id)}\"]`,\n )\n trigger?.setAttribute('aria-expanded', 'false')\n trigger?.focus()\n },\n { capture: true, signal },\n )\n}\n\nconst focusable = [\n 'a[href]',\n 'button:not(:disabled)',\n 'input:not(:disabled):not([type=\"hidden\"])',\n 'select:not(:disabled)',\n 'textarea:not(:disabled)',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(', ')\n\nconst activeRouteModal = (): HTMLElement | null =>\n document.querySelector<HTMLElement>('[data-ui=\"modal-layer\"][data-route-modal=\"true\"]')\n\nconst modalFocusables = (modal: HTMLElement): HTMLElement[] =>\n [...modal.querySelectorAll<HTMLElement>(focusable)].filter(\n (item) =>\n !item.hidden &&\n item.getAttribute('aria-hidden') !== 'true' &&\n !item.matches('[data-ui=\"modal-backdrop\"]'),\n )\n\nconst navigateTo = (href: string, navigation: BrowserNavigation): void => {\n void navigation.navigate(href)\n}\n\nconst eventStartedInNestedModal = (event: KeyboardEvent, routeModal: HTMLElement): boolean =>\n event\n .composedPath()\n .some(\n (target) =>\n target instanceof HTMLElement &&\n target !== routeModal &&\n target.matches('[data-ui=\"modal-layer\"][data-presentation=\"dialog\"]'),\n )\n\n/**\n * Whether anything in the modal has been typed into since the server rendered it.\n *\n * Comparing each control against its own default is what makes this work without\n * any bookkeeping: the page is server-rendered, so the default *is* the state the\n * reader was given. A modal with no form \u2014 a reader, an inspector \u2014 has nothing\n * to compare and is never dirty, so the guard costs those screens nothing.\n */\nconst modalHasDraft = (modal: HTMLElement): boolean => {\n for (const field of modal.querySelectorAll<HTMLInputElement>('input:not([type=\"hidden\"])')) {\n if (field.disabled) continue\n if (field.type === 'checkbox' || field.type === 'radio') {\n if (field.checked !== field.defaultChecked) return true\n } else if (field.value !== field.defaultValue) return true\n }\n for (const area of modal.querySelectorAll<HTMLTextAreaElement>('textarea'))\n if (!area.disabled && area.value !== area.defaultValue) return true\n for (const select of modal.querySelectorAll<HTMLSelectElement>('select')) {\n if (select.disabled) continue\n for (const option of select.options) if (option.selected !== option.defaultSelected) return true\n }\n return false\n}\n\n/**\n * The guard, and what it is not.\n *\n * Leaving a modal is a link, and a link still works with scripting off \u2014 that is\n * the point of building it as one. So this catches the stray backdrop click, the\n * reflexive Escape and the tab clicked without thinking about the note already\n * typed; it is not a lock, and nothing here should be read as one. The wording\n * comes from the server because this file cannot translate.\n */\nconst mayLeaveModal = (modal: HTMLElement): boolean => {\n if (!modalHasDraft(modal)) return true\n const message = modal.getAttribute('data-unsaved-prompt')\n // No prompt declared means the screen did not ask to be guarded.\n if (!message) return true\n return browserGlobals.confirm(message)\n}\n\n/** Progressive keyboard behavior for URL-owned create/edit workspaces. */\n/**\n * Hear when the thing a screen is waiting for actually changed.\n *\n * The screens this replaces reloaded the whole document on a timer, which threw\n * away scroll, focus and anything typed, on a schedule unrelated to when the\n * work finished. Here the server says so, and the page asks for the fragment it\n * already knows how to swap \u2014 so the reader keeps their place.\n *\n * The connection belongs to the element. A fragment swap replaces it, and the\n * observer opens the new one and closes the old; a screen with nothing to wait\n * for renders no element and opens nothing.\n */\nconst installLiveRegion = (signal: AbortSignal, navigation: BrowserNavigation): (() => void) | undefined => {\n if (typeof EventSource !== 'function') return\n\n let watched: Element | null = null\n let source: EventSource | null = null\n const close = () => {\n source?.close()\n source = null\n watched = null\n }\n\n const sync = (): void => {\n const region = document.querySelector('[data-ui=\"live-region\"][data-stream]')\n if (region === watched) return\n close()\n const id = region instanceof HTMLElement ? (region.dataset.stream ?? '') : ''\n if (!id) return\n watched = region\n source = new EventSource(`/_ket/stream/${encodeURIComponent(id)}`)\n // What the chunk says is the deployment's business. That something was said\n // is the whole signal: the screen is server-rendered, so the way to find out\n // what changed is to ask for it.\n const refresh = () => navigateTo(location.href, navigation)\n source.onmessage = refresh\n source.addEventListener('done', () => {\n close()\n refresh()\n })\n // EventSource reconnects on its own, and a stream that has ended answers 404\n // rather than reopening. Leaving the error alone would retry that forever.\n source.onerror = () => {\n if (source?.readyState === EventSource.CLOSED) close()\n }\n }\n\n sync()\n const observer = new MutationObserver(sync)\n observer.observe(document.body, { childList: true, subtree: true })\n addEventListener('pagehide', close, { signal })\n return () => {\n observer.disconnect()\n close()\n }\n}\n\nconst installRouteModal = (signal: AbortSignal, navigation: BrowserNavigation): (() => void) => {\n const focused = new WeakSet<HTMLElement>()\n const focusModal = (): void => {\n const modal = activeRouteModal()\n if (!modal || focused.has(modal)) return\n focused.add(modal)\n requestAnimationFrame(() => {\n const sheet = modal.querySelector<HTMLElement>('[data-ui=\"modal-sheet\"]')\n const target = modalFocusables(modal).find((item) => !item.matches('[data-ui=\"modal-close\"]'))\n ;(target ?? sheet)?.focus()\n })\n }\n focusModal()\n const observer = new MutationObserver(focusModal)\n observer.observe(document.body, { childList: true, subtree: true })\n\n // The backdrop and the X are ordinary links, so the guard has to run before\n // the navigation layer sees the click rather than inside it.\n document.addEventListener(\n 'click',\n (event) => {\n const modal = activeRouteModal()\n if (!modal) return\n // A tab inside a modal is a third way out of it. It looks like a control\n // that stays on the screen, which is exactly why losing a half-written\n // note to one went unnoticed: the reader never meant to leave. It is a\n // link like the other two, and it leaves the same way.\n const leaving = event\n .composedPath()\n .find(\n (target) =>\n target instanceof HTMLElement &&\n (target.matches('[data-ui=\"modal-close\"], [data-ui=\"modal-backdrop\"], a[data-ui=\"tab\"]') ||\n target.matches('a[data-ui=\"action\"][href]')),\n )\n if (!leaving || !modal.contains(leaving as HTMLElement)) return\n if (!mayLeaveModal(modal)) {\n event.preventDefault()\n event.stopPropagation()\n }\n },\n { capture: true, signal },\n )\n\n document.addEventListener(\n 'click',\n (event) => {\n const container = document.querySelector<HTMLElement>('[data-save-before-navigation]')\n const form =\n container instanceof HTMLFormElement ? container : container?.querySelector<HTMLFormElement>('form')\n const anchor = eventElement(event)?.closest<HTMLAnchorElement>('a[href]')\n if (!container || !form || !anchor || activeRouteModal() || !modalHasDraft(container)) return\n event.preventDefault()\n event.stopPropagation()\n if (!browserGlobals.confirm(container.dataset.saveBeforeNavigation)) return\n let destination = form.querySelector<HTMLInputElement>('input[name=\"returnTo\"]')\n if (!destination) {\n destination = document.createElement('input')\n destination.type = 'hidden'\n destination.name = 'returnTo'\n form.append(destination)\n }\n destination.value = anchor.href\n form.requestSubmit()\n },\n { capture: true, signal },\n )\n document.addEventListener(\n 'keydown',\n (event) => {\n const modal = activeRouteModal()\n if (!modal) return\n // Relation-select removes its dialog synchronously on Escape. The event's\n // composed path is stable even after that DOM subtree disappears, so the\n // route layer must use it instead of querying the now-removed target.\n if (eventStartedInNestedModal(event, modal)) return\n if (event.key === 'Escape') {\n const close = modal.querySelector<HTMLAnchorElement>('[data-ui=\"modal-close\"]')\n if (!close) return\n event.preventDefault()\n if (!mayLeaveModal(modal)) return\n navigateTo(close.getAttribute('href') ?? close.href, navigation)\n return\n }\n if (event.key !== 'Tab') return\n const items = modalFocusables(modal)\n if (!items.length) return\n const first = items[0]\n const last = items.at(-1)!\n if (event.shiftKey && document.activeElement === first) {\n event.preventDefault()\n last.focus()\n } else if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault()\n first.focus()\n }\n },\n { signal },\n )\n return () => observer.disconnect()\n}\n\nexport const backendShell: BrowserBehavior = ({ navigation, lifetime }) => {\n const cleanupUserWorkflow = installUserWorkflow(lifetime)\n installThemeToggle(lifetime)\n installTableSelection(lifetime, navigation)\n installDropdownDismiss(lifetime)\n installGlobalFilter(lifetime)\n const cleanupRouteModal = installRouteModal(lifetime, navigation)\n const cleanupLiveRegion = installLiveRegion(lifetime, navigation)\n return () => {\n cleanupLiveRegion?.()\n cleanupRouteModal()\n cleanupUserWorkflow()\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["installUserWorkflow", "lifetime", "abort", "timer", "sequence", "check", "form", "input", "status", "request", "value", "next", "retry", "paint", "message", "valid", "response", "result", "scope", "changed", "company", "branch", "kind", "option", "key", "assigned", "row", "assignedLabel", "description", "companyField", "branchField", "scan", "event", "n", "empty", "target", "observer", "themeStorageKey", "dismissibleDropdown", "browserGlobals", "eventElement", "event", "themePreference", "value", "storedTheme", "saveTheme", "theme", "resolvedTheme", "syncThemeToggle", "pressed", "control", "installThemeToggle", "signal", "preference", "next", "updateSelection", "table", "rows", "checked", "input", "all", "shell", "menu", "installTableSelection", "navigation", "target", "href", "navigateTo", "openDropdowns", "installDropdownDismiss", "current", "dropdown", "dropdowns", "focused", "installGlobalFilter", "trigger", "controls", "dialog", "focusable", "activeRouteModal", "modalFocusables", "modal", "item", "eventStartedInNestedModal", "routeModal", "modalHasDraft", "field", "area", "select", "option", "mayLeaveModal", "message", "installLiveRegion", "watched", "source", "close", "sync", "region", "id", "refresh", "observer", "installRouteModal", "focusModal", "sheet", "leaving", "container", "form", "anchor", "destination", "items", "first", "last", "backendShell", "lifetime", "cleanupUserWorkflow", "installUserWorkflow", "cleanupRouteModal", "cleanupLiveRegion"]
7
+ }
@@ -6,6 +6,9 @@ declare function kc(i: any): {
6
6
  };
7
7
  declare var Rc: (i: any) => {
8
8
  view: () => any;
9
+ mount: ({ root: e }: {
10
+ root: any;
11
+ }) => void;
9
12
  dispose: () => void;
10
13
  };
11
14
  export { Rc as chart, kc as createChartView };
@@ -1 +1 @@
1
- {"version":3,"file":"chart.d.mts","sourceRoot":"","sources":["../../../../../../../../packages/ketsuite/src/modules/backend/design/client/chart.mjs"],"names":[],"mappings":"AAG88sC,iBAAS,EAAE,CAAC,CAAC,KAAA;;;;;EAA6hB;AAAA,QAAA,IAAI,EAAE;;;CAAyK,CAAC;AAAA,OAAM,EAAC,EAAE,IAAI,KAAK,EAAC,EAAE,IAAI,eAAe,EAAC,CAAC;AACltuC;;;;;;;;;;;;;;;;;;EAkBE"}
1
+ {"version":3,"file":"chart.d.mts","sourceRoot":"","sources":["../../../../../../../../packages/ketsuite/src/modules/backend/design/client/chart.mjs"],"names":[],"mappings":"AAG88sC,iBAAS,EAAE,CAAC,CAAC,KAAA;;;;;EAA6hB;AAAA,QAAA,IAAI,EAAE;;;;;;CAAyL,CAAC;AAAA,OAAM,EAAC,EAAE,IAAI,KAAK,EAAC,EAAE,IAAI,eAAe,EAAC,CAAC;AACluuC;;;;;;;;;;;;;;;;;;EAkBE"}