@ketvietlab/ketsuite 0.1.13 → 0.1.14
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 +1 -1
- package/dist/modules/backend/design/HANDOFF.md +17 -18
- 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 +4 -4
- package/dist/modules/backend/design/content.css +0 -88
- package/dist/modules/backend/design/design-system.css +1 -1
- package/dist/modules/backend/design/foundation.css +8 -195
- package/dist/modules/backend/design/responsive.css +7 -16
- package/dist/modules/backend/messages.d.ts.map +1 -1
- package/dist/modules/backend/messages.js +4 -0
- package/dist/modules/backend/messages.js.map +1 -1
- package/dist/scaffold/index.js +1 -1
- package/dist/ui/client/table-selection-view.d.ts.map +1 -1
- package/dist/ui/client/table-selection-view.js +3 -0
- package/dist/ui/client/table-selection-view.js.map +1 -1
- package/dist/ui/layout.d.ts.map +1 -1
- package/dist/ui/layout.js +2 -2
- package/dist/ui/layout.js.map +1 -1
- package/dist/ui/nav.d.ts +4 -2
- package/dist/ui/nav.d.ts.map +1 -1
- package/dist/ui/nav.js +53 -39
- package/dist/ui/nav.js.map +1 -1
- package/package.json +4 -4
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.
|
|
7
|
+
const VERSION = '0.1.14';
|
|
8
8
|
const HELP = `KetSuite ${VERSION}
|
|
9
9
|
|
|
10
10
|
Usage:
|
|
@@ -240,23 +240,24 @@ Các selector này đã có baseline trong `auth.css` và nằm trong `@layer ke
|
|
|
240
240
|
Việc đổi công ty/chi nhánh dùng `context-switcher` trên thanh trên. Footer chỉ hiển
|
|
241
241
|
thị ngữ cảnh hiện tại trong menu tài khoản để giữ hàng systray gọn như KétViệt cũ.
|
|
242
242
|
|
|
243
|
-
## Điều hướng
|
|
243
|
+
## Điều hướng phân cấp
|
|
244
244
|
|
|
245
|
-
Sidebar
|
|
245
|
+
Sidebar dùng `AppNavigation` của design system: mỗi phân hệ cấp một mở menu con ngay
|
|
246
|
+
bên dưới chính nó. Chỉ một phân hệ mở tại một thời điểm; bấm lại phân hệ đang mở không
|
|
247
|
+
đóng nó. Trạng thái active chỉ nằm trên link con dẫn tới trang hiện tại, không nằm trên
|
|
248
|
+
phân hệ và không dùng badge đếm hay mũi tên trang trí.
|
|
246
249
|
Cây menu do module khai báo (xem D42) và **đã được lọc trước khi tới CSS** — cái gì
|
|
247
250
|
chưa cài, hoặc người đang đăng nhập không có quyền gọi, thì không có trong HTML.
|
|
248
251
|
Không cần CSS ẩn gì cả.
|
|
249
252
|
|
|
250
253
|
| hook | ý nghĩa |
|
|
251
254
|
| --- | --- |
|
|
252
|
-
| `[data-ui="app-
|
|
253
|
-
| `[data-ui="
|
|
254
|
-
| `[data-ui="
|
|
255
|
-
| `[data-ui="
|
|
256
|
-
| `[data-ui="
|
|
257
|
-
| `[data-ui="
|
|
258
|
-
| `[data-ui="menu-section"][open]` | một nhóm — là `<details>`, gập được không cần JavaScript |
|
|
259
|
-
| `[data-ui="menu-section-title"]` | `<summary>` của nhóm đó |
|
|
255
|
+
| `[data-ui="app-navigation"]`, `[data-ui="navigation-drawer"]` | cùng một navigation model cho desktop và drawer mobile mở từ trái |
|
|
256
|
+
| `[data-ui="navigation-groups"]` | vùng cuộn; header và footer đứng yên |
|
|
257
|
+
| `[data-ui="navigation-branch"]`, `[data-ui="navigation-branch-trigger"]` | phân hệ hoặc nhóm con có thể mở tại chỗ |
|
|
258
|
+
| `[data-ui="navigation-children"]` | menu con, có đường kẻ dọc để biểu thị độ sâu |
|
|
259
|
+
| `[data-ui="navigation-item"][data-active="true"]` | link lá của trang đang xem; đây là nơi duy nhất có active |
|
|
260
|
+
| `[data-ui="navigation-trigger"]`, `[data-ui="navigation-backdrop"]` | hamburger mobile và vùng click-ra-ngoài để đóng drawer |
|
|
260
261
|
|
|
261
262
|
`[data-ui="nav-item"]` vẫn còn, nhưng chỉ dành cho module khác chèn thêm qua joint
|
|
262
263
|
`backend:nav.items`. Màn hình không tự sinh ra nó nữa.
|
|
@@ -382,22 +383,20 @@ hình vài trăm pixel.
|
|
|
382
383
|
Icon Lucide (ISC) được **chép vào** `icons.ts`, không cài package — giống hệt cách
|
|
383
384
|
theme the domain contract làm. Mỗi module tự chọn tên icon ngữ nghĩa trên bất kỳ `MenuDef` nào;
|
|
384
385
|
design system sở hữu glyph. Tên app không có glyph thì rơi về monogram (chữ đầu),
|
|
385
|
-
tên menu con không có glyph thì
|
|
386
|
+
tên menu con không có glyph thì chỉ dùng nhãn; cả hai đều không làm mất dòng.
|
|
386
387
|
|
|
387
388
|
`[data-ui="icon"]` mặc định `1em`. Hộp nào cỡ cố định thì tự khai báo cho `<svg>`
|
|
388
389
|
bên trong đầy hộp — đừng đặt `width:100%` ở mức chung.
|
|
389
390
|
|
|
390
391
|
| hook | ý nghĩa |
|
|
391
392
|
| --- | --- |
|
|
392
|
-
| `[data-ui="
|
|
393
|
+
| `[data-ui="navigation-header"]`, `[data-ui="navigation-identity"]` | thương hiệu và nút đóng drawer |
|
|
393
394
|
| `[data-ui="sidebar-search"]`, `[data-ui="sidebar-search-input"]` | **tìm menu** (khác ô tìm bản ghi ở control panel) |
|
|
394
|
-
| `[data-ui="
|
|
395
|
-
| `[data-ui="sidebar-section-label"][data-scope="app"]` | nhãn nhóm; `data-scope="app"` là nhãn của app đang mở |
|
|
395
|
+
| `[data-ui="navigation-groups"]` | vùng cuộn; brand, search và chân đứng yên |
|
|
396
396
|
| `[data-ui="sidebar-empty"]` | không tìm thấy gì |
|
|
397
|
-
| `[data-ui="
|
|
398
|
-
| `[data-ui="
|
|
399
|
-
| `[data-ui="
|
|
400
|
-
| `[data-ui="menu-item"][data-active]`, `[data-ui="menu-icon"]`, `[data-ui="menu-dot"]`, `[data-ui="menu-label"]` | một mục lá; icon do module chọn, dot là fallback |
|
|
397
|
+
| `[data-ui="navigation-item-leading"]`, `[data-ui="app-monogram"]` | icon do module chọn; monogram là fallback của phân hệ |
|
|
398
|
+
| `[data-ui="navigation-branch"][data-level]` | một nhóm và độ sâu của nó |
|
|
399
|
+
| `[data-ui="navigation-item"][data-level]` | một link lá và độ sâu của nó |
|
|
401
400
|
|
|
402
401
|
## Form và media
|
|
403
402
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
declare var
|
|
1
|
+
declare var Gs: ({ navigation: i, lifetime: t }: {
|
|
2
2
|
lifetime: any;
|
|
3
3
|
navigation: any;
|
|
4
4
|
}) => () => void;
|
|
5
|
-
export {
|
|
5
|
+
export { Gs 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":"AACy1qB,QAAA,IAAspO,EAAE;;;gBAAwI,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 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};
|
|
2
|
+
function Q(i){let t,a,n=0;async function s(r){let d=r.querySelector("input[type=email]"),p=r.querySelector("[data-email-status]");if(!d||!p)return;t?.abort(),clearTimeout(a);let R=++n,T=d.value.trim(),P=r.querySelector("[data-email-next]"),C=r.querySelector("[data-email-retry]"),H=(y,k)=>{p.textContent=y,P&&(P.disabled=!k),d.setAttribute("aria-invalid",String(!k)),r.dataset.emailAvailable=k?"true":"false"};if(C&&(C.hidden=!0),!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(T)){H(T?"Email ch\u01B0a \u0111\xFAng \u0111\u1ECBnh d\u1EA1ng.":"Nh\u1EADp email \u0111\u1EC3 ki\u1EC3m tra.",!1);return}H("\u0110ang ki\u1EC3m tra email\u2026",!1),a=setTimeout(async()=>{t=new AbortController;try{let y=await fetch(r.dataset.emailCheck,{method:"POST",cache:"no-store",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({email:T}),signal:AbortSignal.any([t.signal,AbortSignal.timeout(1e4)])});if(!y.ok)throw new Error("email-check-failed");let k=await y.json();if(R!==n||!r.isConnected)return;if(!k.ok)throw new Error("email-check-failed");H(k.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.",k.available)}catch{if(R!==n||!r.isConnected)return;H("Ch\u01B0a ki\u1EC3m tra \u0111\u01B0\u1EE3c email. Vui l\xF2ng th\u1EED l\u1EA1i.",!1),C&&(C.hidden=!1)}},400)}function o(r,d=!1){let p=r.querySelector('select[name="companyId"]'),R=r.querySelector('select[name="branchId"]'),T=r.querySelector('select[name="scopeKind"]')?.value;if(R&&p){d&&(R.value="");for(let y of R.options)y.value&&(y.hidden=y.dataset.companyId!==p.value,y.disabled=y.hidden)}let P=T==="tenant"?"tenant":T==="branch"?`branch:${p?.value}:${R?.value}`:`company:${p?.value}`;for(let y of r.querySelectorAll("[data-assigned-scopes]")){let e=JSON.parse(y.dataset.assignedScopes??"[]").includes(P);y.disabled=y.dataset.roleDisabled==="true"||e;let g=y.closest("[data-role-option]"),l=g?.querySelector("[data-role-assigned]"),x=g?.querySelector("[data-role-description]");l&&(l.hidden=!e),x&&(x.hidden=e),y.disabled&&(y.checked=!1)}let C=p?.closest('[data-ui="form-field"]'),H=R?.closest('[data-ui="form-field"]');C&&(C.hidden=T==="tenant"),H&&(H.hidden=T==="tenant"||T==="company")}function u(){for(let r of document.querySelectorAll("form[data-user-workflow]"))r.dataset.initialized||(r.dataset.initialized="true",o(r),s(r))}document.addEventListener("input",r=>{let d=r.target,p=d.closest("form[data-user-workflow]");if(p&&(d.type==="email"&&s(p),d.matches("[data-role-search]"))){let R=0;for(let P of p.querySelectorAll("[data-role-option]"))P.hidden=!P.textContent?.toLocaleLowerCase("vi").includes(d.value.toLocaleLowerCase("vi")),P.hidden||R++;let T=p.querySelector("[data-role-empty]");T&&(T.hidden=R>0)}},{signal:i}),document.addEventListener("change",r=>{let d=r.target,p=d.closest("form[data-user-workflow]");p&&d.matches('select[name="companyId"],select[name="branchId"],select[name="scopeKind"]')&&o(p,d.matches('select[name="companyId"]'))},{signal:i}),document.addEventListener("click",r=>{let d=r.target;d.matches("[data-email-retry]")&&s(d.closest("form"))},{signal:i}),document.addEventListener("submit",r=>{let d=r.target;d.matches("form[data-user-workflow]")&&d.querySelector("input[type=email]")&&d.dataset.emailAvailable!=="true"&&r.preventDefault()},{signal:i});let f=new MutationObserver(u);return f.observe(document.documentElement,{childList:!0,subtree:!0}),u(),()=>{t?.abort(),clearTimeout(a),f.disconnect()}}import{each as Ct}from"/_ket/view/index.js";import{Fragment as Mt,jsx as Et,jsxs as Dt}from"/_ket/view/jsx-runtime.js";var Z=["action","action-leading","action-label","action-spinner","action-group"];import{jsx as Jt,jsxs as Xt}from"/_ket/view/jsx-runtime.js";var Y=["badge","tag","tag-remove","count-badge","avatar","code"];import{each as Kt}from"/_ket/view/index.js";import{jsx as Bt,jsxs as qt}from"/_ket/view/jsx-runtime.js";var j=["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 Yt}from"/_ket/view/index.js";import{jsx as zt,jsxs as Ut}from"/_ket/view/jsx-runtime.js";var ee=["app-shell","app-sidebar","app-main","app-right-rail","page","page-header","page-heading","page-title","page-description","page-actions","page-body","record-canvas","record-content","record-section","record-section-title"];import{Fragment as aa,jsx as ta,jsxs as ia}from"/_ket/view/jsx-runtime.js";var te=["stack","inline","grid","surface","surface-head","surface-title","surface-actions","disclosure","disclosure-summary","disclosure-body","section","section-head","section-eyebrow","section-title","section-description","section-actions","section-body","content-card","card-head","card-title","card-summary","card-body","card-meta","card-actions","metric","metric-icon","metric-label","metric-value","metric-detail"];import{each as da}from"/_ket/view/index.js";import{Fragment as ca,jsx as ua}from"/_ket/view/jsx-runtime.js";import{jsx as va,jsxs as xa}from"/_ket/view/jsx-runtime.js";var ae=["field","field-label","field-required","field-control","field-options","field-option","field-option-input","field-help","field-error"];import{each as wa}from"/_ket/view/index.js";import{jsx as Pa,jsxs as ka}from"/_ket/view/jsx-runtime.js";var ie=["breadcrumbs","breadcrumb","nav-list","nav-item","nav-item-leading","nav-item-label","nav-item-count","tabs","tab","tab-count"];import{jsx as Ca,jsxs as Oa}from"/_ket/view/jsx-runtime.js";var ne=["progress","progress-label","progress-value","progress-track","progress-bar"];import{each as Da}from"/_ket/view/index.js";import{Fragment as Xa,jsx as Fa,jsxs as Ja}from"/_ket/view/jsx-runtime.js";var oe=["menu","menu-trigger","menu-panel","menu-item","menu-item-copy"];import{jsx as Ka,jsxs as $a}from"/_ket/view/jsx-runtime.js";var re=["popover","popover-trigger","popover-panel","popover-close"];import{jsx as Va,jsxs as Ga}from"/_ket/view/jsx-runtime.js";var le=["tooltip","tooltip-trigger","tooltip-content"];import{jsx as Wa,jsxs as _a}from"/_ket/view/jsx-runtime.js";var de=["modal-layer","modal-backdrop","modal-sheet","modal-head","modal-heading","modal-title","modal-description","modal-close","modal-body","modal-actions"];import{jsx as ei}from"/_ket/view/jsx-runtime.js";var se=["dialog","confirm-dialog-message"];import{each as ii}from"/_ket/view/index.js";import{jsx as oi,jsxs as ri}from"/_ket/view/jsx-runtime.js";var ce=["toast-region","toast","toast-copy","toast-title","toast-message","toast-actions"];import{jsx as si}from"/_ket/view/jsx-runtime.js";var ue=["spinner","visually-hidden"];import{each as mi}from"/_ket/view/index.js";import{jsx as bi}from"/_ket/view/jsx-runtime.js";var me=["skeleton","skeleton-line"];var at=["a[href]","button:not([disabled])","input:not([disabled])","select:not([disabled])","textarea:not([disabled])","summary",'[tabindex]:not([tabindex="-1"])'].join(","),J=i=>[...i.querySelectorAll(at)].filter(t=>t instanceof HTMLElement&&!t.hidden&&t.getAttribute("aria-hidden")!=="true"&&(typeof t.checkVisibility!="function"||t.checkVisibility())),q=(i=document)=>{let t=document.activeElement instanceof HTMLElement?document.activeElement:null,a=i.querySelector('[data-ui="modal-layer"][data-route-modal="true"] [role="dialog"]'),n=i.querySelector('[data-ui="app-shell"], [data-ui="shell"]'),s=n instanceof HTMLElement?n.inert:!1;if(a instanceof HTMLElement){n instanceof HTMLElement&&!n.contains(a)&&(n.inert=!0);let e=J(a)[0];(e instanceof HTMLElement?e:a).focus()}let o=window.matchMedia("(max-width: 48rem)"),u=document.documentElement,f=u.dataset.kvNavigationOpen,r=[...i.querySelectorAll('[data-ui="app-navigation"]')].filter(e=>e instanceof HTMLDetailsElement),d=new Map,p=e=>{let g=d.get(e);if(g?.targets){for(let{element:l,inert:x}of g.targets)l.inert=x;g.targets=null}},R=()=>{o.matches&&r.some(g=>g.open)?u.dataset.kvNavigationOpen="true":f===void 0?delete u.dataset.kvNavigationOpen:u.dataset.kvNavigationOpen=f},T=e=>{let g=e.querySelector('[data-ui="navigation-trigger"]'),l=e.querySelector('[data-ui="navigation-drawer"]');if(!(g instanceof HTMLElement)||!(l instanceof HTMLElement))return;let x=o.matches;if(g.dataset.open=String(x&&e.open),!x){l.removeAttribute("role"),l.removeAttribute("aria-modal"),l.removeAttribute("aria-label"),p(e),R();return}if(l.setAttribute("role","dialog"),l.setAttribute("aria-modal","true"),l.setAttribute("aria-label",l.dataset.navigationLabel??"Navigation"),!e.open){p(e),R();return}let v=d.get(e)??{};if(!v.targets){let O=e.closest('[data-ui="app-shell"], [data-ui="shell"]'),L=O?[...O.querySelectorAll(':scope > [data-ui="app-main"], :scope > [data-ui="main"], :scope > [data-ui="app-right-rail"]')].filter(w=>w instanceof HTMLElement).map(w=>({element:w,inert:w.inert})):[];for(let{element:w}of L)w.inert=!0;v.targets=L,v.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:g,d.set(e,v),queueMicrotask(()=>{if(!e.open||!o.matches)return;let w=l.querySelector('[data-ui="navigation-item"][aria-current="page"]'),M=J(l)[0],m=w instanceof HTMLElement?w:M;(m instanceof HTMLElement?m:l).focus()})}R()},P=(e,g=!0)=>{let l=d.get(e);e.open=!1,T(e),g&&l?.returnFocus instanceof HTMLElement&&l.returnFocus.isConnected&&l.returnFocus.focus(),d.delete(e)},C=r.map(e=>{let g=()=>T(e),l=x=>{let v=x.target;if(!(v instanceof Element))return;let L=v.closest('[data-ui="navigation-branch-trigger"]')?.closest('[data-ui="navigation-branch"]');if(L instanceof HTMLDetailsElement&&L.open){x.preventDefault();return}!o.matches||!e.open||(v.closest('[data-ui="navigation-close"]')||v.closest('[data-ui="navigation-backdrop"]')||v.closest('[data-ui="navigation-item"]'))&&P(e)};return e.addEventListener("toggle",g),e.addEventListener("click",l),T(e),()=>{e.removeEventListener("toggle",g),e.removeEventListener("click",l),p(e)}}),H=()=>{for(let e of r)e.open?P(e,!1):T(e)};o.addEventListener("change",H);for(let e of i.querySelectorAll('[data-ui="popover"][data-open="true"]')){let g=e.querySelector('[data-ui="popover-trigger"]'),l=e.querySelector('[data-ui="popover-panel"]');if(!(g instanceof HTMLElement)||!(l instanceof HTMLElement))continue;let x=g.getBoundingClientRect(),v=8,O=e.getAttribute("data-placement")??"bottom-start",L=O.startsWith("top"),w=O.endsWith("end"),M=x.top-l.offsetHeight-v,m=x.bottom+v,c=M>=8,S=m+l.offsetHeight<=window.innerHeight-8,b=L?c||!S:!S&&c,h=w?x.right-l.offsetWidth:x.left,D=Math.max(8,Math.min(h,window.innerWidth-l.offsetWidth-8)),$=Math.max(8,Math.min(b?M:m,window.innerHeight-l.offsetHeight-8));l.dataset.runtimePositioned="true",l.dataset.runtimePlacement=`${b?"top":"bottom"}-${w?"end":"start"}`,l.style.left=`${Math.round(D)}px`,l.style.top=`${Math.round($)}px`,l.style.right="auto",l.style.bottom="auto"}let y=e=>{let g=r.find(m=>o.matches&&m.open);if(g instanceof HTMLDetailsElement){let m=g.querySelector('[data-ui="navigation-drawer"]');if(e.key==="Escape"){P(g),e.preventDefault();return}if(e.key==="Tab"&&m instanceof HTMLElement){let c=J(m),S=c[0],b=c.at(-1);if(!c.length){e.preventDefault(),m.focus();return}if(e.shiftKey&&(document.activeElement===S||document.activeElement===m)){e.preventDefault(),b instanceof HTMLElement&&b.focus();return}if(!e.shiftKey&&document.activeElement===b){e.preventDefault(),S instanceof HTMLElement&&S.focus();return}}}let l=document.activeElement?.closest('[data-ui="tree"] [role="treeitem"]');if(l instanceof HTMLElement){let m=l.closest('[data-ui="tree"]'),c=m?[...m.querySelectorAll('[role="treeitem"]')].filter(h=>h instanceof HTMLElement):[],S=c.indexOf(l),b=-1;if(e.key==="ArrowDown")b=Math.min(c.length-1,S+1);else if(e.key==="ArrowUp")b=Math.max(0,S-1);else if(e.key==="Home")b=0;else if(e.key==="End")b=c.length-1;else if(e.key==="ArrowRight"){let h=Number(l.getAttribute("aria-level"));l.getAttribute("aria-expanded")==="true"&&Number(c[S+1]?.getAttribute("aria-level"))>h&&(b=S+1)}else if(e.key==="ArrowLeft"){let h=Number(l.getAttribute("aria-level"));h>1&&(b=c.findLastIndex((D,$)=>$<S&&Number(D.getAttribute("aria-level"))<h))}if(b>=0&&c[b]){for(let h of c)h.tabIndex=-1;c[b].tabIndex=0,c[b].focus(),e.preventDefault();return}}let x=document.activeElement?.closest('[data-ui="tree-grid-row"]');if(x instanceof HTMLElement){let m=x.closest('[data-ui="tree-grid"]'),c=m?[...m.querySelectorAll('[data-ui="tree-grid-row"]')].filter(h=>h instanceof HTMLElement):[],S=c.indexOf(x),b=e.key==="ArrowDown"?Math.min(c.length-1,S+1):e.key==="ArrowUp"?Math.max(0,S-1):e.key==="Home"?0:e.key==="End"?c.length-1:-1;if(b>=0&&c[b]){for(let h of c)h.tabIndex=-1;c[b].tabIndex=0,c[b].focus(),e.preventDefault();return}}let v=document.activeElement?.closest('[data-ui="menu"][open]');if(v instanceof HTMLDetailsElement){let m=v.querySelector('[data-ui="menu-trigger"]'),c=[...v.querySelectorAll('[role="menuitem"]')].filter(D=>D instanceof HTMLElement&&D.getAttribute("aria-disabled")!=="true"),S=document.activeElement,b=S instanceof HTMLElement?c.indexOf(S):-1,h=-1;if(e.key==="ArrowDown"?h=b<0?0:(b+1)%c.length:e.key==="ArrowUp"?h=b<0?c.length-1:(b-1+c.length)%c.length:e.key==="Home"?h=0:e.key==="End"&&(h=c.length-1),h>=0&&c[h]instanceof HTMLElement){c[h].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"&&v instanceof HTMLDetailsElement){v.open=!1;let m=v.querySelector('[data-ui="menu-trigger"]');m instanceof HTMLElement&&m.focus(),e.preventDefault();return}let O=document.activeElement?.closest('[data-ui="popover"][data-open="true"]');if(e.key==="Escape"&&O instanceof HTMLElement){let m=O.querySelector('[data-ui="popover-close"]');m instanceof HTMLElement&&m.click(),e.preventDefault();return}if(!(a instanceof HTMLElement))return;if(e.key==="Escape"){let m=a.querySelector('[data-ui="modal-close"]');m instanceof HTMLElement&&m.click(),e.preventDefault();return}if(e.key!=="Tab")return;let L=J(a);if(!L.length){e.preventDefault(),a.focus();return}let w=L[0],M=L.at(-1);e.shiftKey&&(document.activeElement===w||document.activeElement===a)?(e.preventDefault(),M instanceof HTMLElement&&M.focus()):!e.shiftKey&&document.activeElement===M&&(e.preventDefault(),w instanceof HTMLElement&&w.focus())},k=e=>{let g=e.target;if(g instanceof Node)for(let l of i.querySelectorAll('[data-ui="menu"][open]'))l instanceof HTMLDetailsElement&&!l.contains(g)&&(l.open=!1)};return document.addEventListener("keydown",y),document.addEventListener("click",k),()=>{document.removeEventListener("keydown",y),document.removeEventListener("click",k),o.removeEventListener("change",H);for(let e of C)e();f===void 0?delete u.dataset.kvNavigationOpen:u.dataset.kvNavigationOpen=f,n instanceof HTMLElement&&(n.inert=s),t?.isConnected&&t.focus()}};import{jsx as yi,jsxs as vi}from"/_ket/view/jsx-runtime.js";import{jsx as Ri,jsxs as Pi}from"/_ket/view/jsx-runtime.js";var fe=["switch-control","switch-track"];import{each as Hi}from"/_ket/view/index.js";import{Fragment as Di,jsx as Ei,jsxs as Mi}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 Ii,jsxs as Ni}from"/_ket/view/jsx-runtime.js";var he=["date-range"];import{jsx as qi,jsxs as Vi}from"/_ket/view/jsx-runtime.js";var ye=["file-upload","drop-zone","upload-status"];import{jsx as Wi}from"/_ket/view/jsx-runtime.js";var ve=["relation-picker"];import{each as Zi}from"/_ket/view/index.js";import{jsx as tn,jsxs as an}from"/_ket/view/jsx-runtime.js";var xe=["search-bar","filter-bar","applied-filters","applied-filter","saved-views","saved-view","view-settings","view-settings-options"];import{jsx as ln,jsxs as dn}from"/_ket/view/jsx-runtime.js";var Se=["inline-edit","inline-edit-value","inline-edit-form","inline-edit-actions"];import{each as xn}from"/_ket/view/index.js";import{each as gn}from"/_ket/view/index.js";import{jsx as pn,jsxs as hn}from"/_ket/view/jsx-runtime.js";var Te=["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-action-list","pager-bar","pager-summary","pager-pages","pager-page","pager-actions","pager-link"];import{jsx as Rn,jsxs as Pn}from"/_ket/view/jsx-runtime.js";var we=["resource-list","resource-list-item","resource-list-select","resource-list-link"];import{each as Hn}from"/_ket/view/index.js";import{jsx as On,jsxs as En}from"/_ket/view/jsx-runtime.js";var Re=["data-grid-scroll","data-grid","data-grid-cap","data-grid-cell"];import{each as An}from"/_ket/view/index.js";import{jsx as Jn,jsxs as Xn}from"/_ket/view/jsx-runtime.js";var Pe=["tree","tree-item","tree-link","tree-grid","tree-grid-row"];import{each as Kn}from"/_ket/view/index.js";import{jsx as qn,jsxs as Vn}from"/_ket/view/jsx-runtime.js";var ke=["description-list","key-value","key-value-label","key-value-value","person","person-body","avatar-group","status"];import{jsx as Un}from"/_ket/view/jsx-runtime.js";var Le=["formatted-date","formatted-number","formatted-money"];import{each as Qn}from"/_ket/view/index.js";import{jsx as to,jsxs as ao}from"/_ket/view/jsx-runtime.js";var Ce=["record-summary","record-summary-main","record-actions","record-rail"];import{each as oo}from"/_ket/view/index.js";import{jsx as co,jsxs as uo}from"/_ket/view/jsx-runtime.js";var Ee=["activity-timeline","activity-item","activity-marker","audit-log","audit-item"];import{each as bo}from"/_ket/view/index.js";import{jsx as ho,jsxs as yo}from"/_ket/view/jsx-runtime.js";var Me=["attachments","attachment","media-gallery","media-item"];import{each as So}from"/_ket/view/index.js";import{Fragment as Po,jsx as wo,jsxs as Ro}from"/_ket/view/jsx-runtime.js";var De=["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 Oo}from"/_ket/view/index.js";import{Fragment as Jo,jsx as Ao,jsxs as Fo}from"/_ket/view/jsx-runtime.js";var Ae=["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{Fragment as $o,jsx as No,jsxs as Ko}from"/_ket/view/jsx-runtime.js";import{jsx as Uo,jsxs as Wo}from"/_ket/view/jsx-runtime.js";var Fe=["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 jo,jsxs as er}from"/_ket/view/jsx-runtime.js";var Je=["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 Xe=["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 sr,jsxs as cr}from"/_ket/view/jsx-runtime.js";var Ie=["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 Ne=["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 vr}from"/_ket/view/index.js";import{jsx as Sr,jsxs as Tr}from"/_ket/view/jsx-runtime.js";var Ke=["pipeline","pipeline-step","pipeline-arrow","pipeline-step-label","pipeline-step-value","pipeline-step-node"];import{each as Lr}from"/_ket/view/index.js";import{jsx as Er,jsxs as Mr}from"/_ket/view/jsx-runtime.js";var $e=["record-form","form-errors","form-grid","form-actions"];var Be={actions:Z,feedback:j,fields:ae,status:Y,navigation:ie,progress:ne,menu:oe,popover:re,tooltip:le,dialog:se,toast:ce,spinner:ue,skeleton:me,scalarFields:fe,combobox:pe,dateTime:he,upload:ye,relationPicker:ve,listControls:xe,inlineEdit:Se,resourceList:we,dataGrid:Re,tree:Pe,recordDisplay:ke,formattedValues:Le,recordComposition:Ce,activity:Ee,media:Me,layouts:te,shell:ee,appNavigation:De,table:Ae,listChrome:Te,listPage:Fe,formPage:Xe,recordPage:Je,dashboardPage:Ie,boardPage:Ne,modal:de,pipeline:Ke,form:$e},bt=[...new Set(Object.values(Be).flat())].sort(),ft=Object.freeze(Object.fromEntries(Object.entries(Be).map(([i,t])=>[i,[...t]])));var W="ket.backend.theme",U=['[data-ui="search-menu"]','[data-ui="col-config"]','[data-ui="bulk-actions"]','[data-ui="viewer"]','[data-ui="record-more"]'].join(", "),ze=globalThis,E=i=>i.target instanceof Element?i.target:null,K=i=>i==="light"||i==="dark"?i:null,pt=()=>{try{return K(localStorage.getItem(W))}catch{return null}},ht=i=>{try{localStorage.setItem(W,i)}catch{}},Ue=()=>K(document.documentElement.dataset.theme)??(matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),I=()=>{let i=String(Ue()==="dark");for(let t of document.querySelectorAll('[data-ui="sidebar-tools"] [data-ui="action"][name="theme"]'))t.setAttribute("aria-pressed",i)},yt=i=>{let t=pt();t&&(document.documentElement.dataset.theme=t),I(),document.addEventListener("click",a=>{let n=E(a)?.closest('[data-ui="sidebar-tools"] [data-ui="action"][name="theme"]');if(!n||n.disabled)return;let s=Ue()==="dark"?"light":"dark";document.documentElement.dataset.theme=s,ht(s),I()},{signal:i}),matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{K(document.documentElement.dataset.theme)||I()},{signal:i}),addEventListener("storage",a=>{if(a.key!==W)return;let n=K(a.newValue);n?document.documentElement.dataset.theme=n:delete document.documentElement.dataset.theme,I()},{signal:i})},vt=i=>{let t=[...i.querySelectorAll('[data-ui="row-select"]:not(:disabled)')],a=t.filter(s=>s.checked).length,n=i.querySelector('[data-ui="select-all"]');if(n&&(n.checked=t.length>0&&a===t.length,n.indeterminate=a>0&&a<t.length),!a){let s=i.closest('[data-ui="shell"]');for(let o of s?.querySelectorAll('[data-ui="bulk-actions"][open]')??[])o.removeAttribute("open")}},xt=(i,t)=>{document.addEventListener("change",a=>{let n=E(a);if(!(n instanceof HTMLInputElement)||!n.matches('[data-ui="select-all"], [data-ui="row-select"]'))return;let s=n.closest('[data-ui="table"]');if(s){if(n.matches('[data-ui="select-all"]'))for(let o of s.querySelectorAll('[data-ui="row-select"]:not(:disabled)'))o.checked=n.checked;vt(s)}},{signal:i}),document.addEventListener("click",a=>{if(a.defaultPrevented||a.button!==0||a.metaKey||a.ctrlKey||a.shiftKey||a.altKey)return;let n=E(a);if(n?.closest('a, button, input, select, textarea, label, summary, details, [data-ui="select-cell"]'))return;let o=n?.closest('[data-ui="row"][data-row-href]')?.getAttribute("data-row-href");o&&(a.preventDefault(),t.navigate(o))},{signal:i}),document.addEventListener("keydown",a=>{if(a.defaultPrevented||a.key!=="Enter"&&a.key!==" ")return;let n=E(a),o=(n?.matches('[data-ui="row"][data-row-href][tabindex="0"]')?n:null)?.getAttribute("data-row-href");o&&(a.preventDefault(),_(o,t))},{signal:i})},qe=()=>[...document.querySelectorAll(`${U}[open]`)],St=i=>{document.addEventListener("click",t=>{let a=E(t)?.closest(U);for(let n of qe())n!==a&&!n.contains(a??null)&&n.removeAttribute("open")},{signal:i}),document.addEventListener("keydown",t=>{if(t.key!=="Escape")return;let a=qe();if(!a.length)return;let n=document.activeElement?.closest(U),s=n?.open?n:a.at(-1);s?.removeAttribute("open"),s?.querySelector("summary")?.focus(),t.preventDefault()},{signal:i})},Tt=i=>{document.addEventListener("click",t=>{let a=E(t)?.closest('[data-ui="chrome-search-toggle"]'),n=a?.getAttribute("aria-controls");if(!a||!n)return;let s=document.getElementById(n);!(s instanceof HTMLDialogElement)||s.open||(s.showModal(),a.setAttribute("aria-expanded","true"),requestAnimationFrame(()=>s.querySelector('[data-presentation="modal"] [data-ui="chrome-search-input"]')?.focus()))},{signal:i}),document.addEventListener("cancel",t=>{E(t)?.matches('[data-ui="chrome-search-modal"]')&&t.preventDefault()},{capture:!0,signal:i}),document.addEventListener("close",t=>{let a=E(t);if(!(a instanceof HTMLDialogElement)||!a.matches('[data-ui="chrome-search-modal"]'))return;let n=document.querySelector(`[data-ui="chrome-search-toggle"][aria-controls="${CSS.escape(a.id)}"]`);n?.setAttribute("aria-expanded","false"),n?.focus()},{capture:!0,signal:i})},wt=["a[href]","button:not(:disabled)",'input:not(:disabled):not([type="hidden"])',"select:not(:disabled)","textarea:not(:disabled)",'[tabindex]:not([tabindex="-1"])'].join(", "),N=()=>document.querySelector('[data-ui="modal-layer"][data-route-modal="true"]'),Ve=i=>[...i.querySelectorAll(wt)].filter(t=>!t.hidden&&t.getAttribute("aria-hidden")!=="true"&&!t.matches('[data-ui="modal-backdrop"]')),_=(i,t)=>{t.navigate(i)},Rt=(i,t)=>i.composedPath().some(a=>a instanceof HTMLElement&&a!==t&&a.matches('[data-ui="modal-layer"][data-presentation="dialog"]')),We=i=>{for(let t of i.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 i.querySelectorAll("textarea"))if(!t.disabled&&t.value!==t.defaultValue)return!0;for(let t of i.querySelectorAll("select"))if(!t.disabled){for(let a of t.options)if(a.selected!==a.defaultSelected)return!0}return!1},Ge=i=>{if(!We(i))return!0;let t=i.getAttribute("data-unsaved-prompt");return t?ze.confirm(t):!0},Pt=(i,t)=>{if(typeof EventSource!="function")return;let a=null,n=null,s=()=>{n?.close(),n=null,a=null},o=()=>{let f=document.querySelector('[data-ui="live-region"][data-stream]');if(f===a)return;s();let r=f instanceof HTMLElement?f.dataset.stream??"":"";if(!r)return;a=f,n=new EventSource(`/_ket/stream/${encodeURIComponent(r)}`);let d=()=>_(location.href,t);n.onmessage=d,n.addEventListener("done",()=>{s(),d()}),n.onerror=()=>{n?.readyState===EventSource.CLOSED&&s()}};o();let u=new MutationObserver(o);return u.observe(document.body,{childList:!0,subtree:!0}),addEventListener("pagehide",s,{signal:i}),()=>{u.disconnect(),s()}},kt=(i,t)=>{let a=new WeakSet,n=()=>{let o=N();!o||a.has(o)||(a.add(o),requestAnimationFrame(()=>{let u=o.querySelector('[data-ui="modal-sheet"]');(Ve(o).find(r=>!r.matches('[data-ui="modal-close"]'))??u)?.focus()}))};n();let s=new MutationObserver(n);return s.observe(document.body,{childList:!0,subtree:!0}),document.addEventListener("click",o=>{let u=N();if(!u)return;let f=o.composedPath().find(r=>r instanceof HTMLElement&&(r.matches('[data-ui="modal-close"], [data-ui="modal-backdrop"], a[data-ui="tab"]')||r.matches('a[data-ui="action"][href]')));!f||!u.contains(f)||Ge(u)||(o.preventDefault(),o.stopPropagation())},{capture:!0,signal:i}),document.addEventListener("click",o=>{let u=document.querySelector("[data-save-before-navigation]"),f=u instanceof HTMLFormElement?u:u?.querySelector("form"),r=E(o)?.closest("a[href]");if(!u||!f||!r||N()||!We(u)||(o.preventDefault(),o.stopPropagation(),!ze.confirm(u.dataset.saveBeforeNavigation)))return;let d=f.querySelector('input[name="returnTo"]');d||(d=document.createElement("input"),d.type="hidden",d.name="returnTo",f.append(d)),d.value=r.href,f.requestSubmit()},{capture:!0,signal:i}),document.addEventListener("keydown",o=>{let u=N();if(!u||Rt(o,u))return;if(o.key==="Escape"){let p=u.querySelector('[data-ui="modal-close"]');if(!p||(o.preventDefault(),!Ge(u)))return;_(p.getAttribute("href")??p.href,t);return}if(o.key!=="Tab")return;let f=Ve(u);if(!f.length)return;let r=f[0],d=f.at(-1);o.shiftKey&&document.activeElement===r?(o.preventDefault(),d.focus()):!o.shiftKey&&document.activeElement===d&&(o.preventDefault(),r.focus())},{signal:i}),()=>s.disconnect()},Gs=({navigation:i,lifetime:t})=>{let a=q(document),n=Q(t);yt(t),xt(t,i),St(t),Tt(t);let s=kt(t,i),o=Pt(t,i);return()=>{a(),o?.(),s(),n()}};export{Gs as backendShell};
|