@modern-admin/web 0.3.5 → 0.4.1

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 (174) hide show
  1. package/README.md +42 -0
  2. package/dist/config/runtime-config.d.ts +84 -0
  3. package/dist/config/runtime-config.js +19 -0
  4. package/dist/config/vite.d.ts +84 -0
  5. package/dist/config/vite.js +166 -0
  6. package/dist/lib/index.js +0 -1
  7. package/dist/lib/index.js.map +1 -1
  8. package/dist/lib/mount.d.ts.map +1 -1
  9. package/dist/standalone/assets/{action-component-host-CXIbN-8V.js → action-component-host-BrEZDHZt.js} +2 -2
  10. package/dist/standalone/assets/action-component-host-BrEZDHZt.js.br +0 -0
  11. package/dist/standalone/assets/action-component-host-BrEZDHZt.js.gz +0 -0
  12. package/dist/standalone/assets/{action-component-host-CXIbN-8V.js.map → action-component-host-BrEZDHZt.js.map} +1 -1
  13. package/dist/standalone/assets/{action-page-OsWfKQ6C.js → action-page-Bx7kzeK7.js} +2 -2
  14. package/dist/standalone/assets/action-page-Bx7kzeK7.js.br +0 -0
  15. package/dist/standalone/assets/action-page-Bx7kzeK7.js.gz +0 -0
  16. package/dist/standalone/assets/{action-page-OsWfKQ6C.js.map → action-page-Bx7kzeK7.js.map} +1 -1
  17. package/dist/standalone/assets/{ai-assistant-widget-Bt4Z7Fmr.js → ai-assistant-widget-BbIXVrSu.js} +2 -2
  18. package/dist/standalone/assets/ai-assistant-widget-BbIXVrSu.js.br +0 -0
  19. package/dist/standalone/assets/ai-assistant-widget-BbIXVrSu.js.gz +0 -0
  20. package/dist/standalone/assets/{ai-assistant-widget-Bt4Z7Fmr.js.map → ai-assistant-widget-BbIXVrSu.js.map} +1 -1
  21. package/dist/standalone/assets/{audit-log-page-2wuGiWg-.js → audit-log-page-BoZh23oQ.js} +2 -2
  22. package/dist/standalone/assets/audit-log-page-BoZh23oQ.js.br +0 -0
  23. package/dist/standalone/assets/audit-log-page-BoZh23oQ.js.gz +0 -0
  24. package/dist/standalone/assets/{audit-log-page-2wuGiWg-.js.map → audit-log-page-BoZh23oQ.js.map} +1 -1
  25. package/dist/standalone/assets/{calendar-BZVUWakC.js → calendar-nvD_z7KQ.js} +2 -2
  26. package/dist/standalone/assets/calendar-nvD_z7KQ.js.br +0 -0
  27. package/dist/standalone/assets/calendar-nvD_z7KQ.js.gz +0 -0
  28. package/dist/standalone/assets/{calendar-BZVUWakC.js.map → calendar-nvD_z7KQ.js.map} +1 -1
  29. package/dist/standalone/assets/{chart-widget-BtJb6YXV.js → chart-widget-YeCL7jdB.js} +2 -2
  30. package/dist/standalone/assets/chart-widget-YeCL7jdB.js.br +0 -0
  31. package/dist/standalone/assets/chart-widget-YeCL7jdB.js.gz +0 -0
  32. package/dist/standalone/assets/{chart-widget-BtJb6YXV.js.map → chart-widget-YeCL7jdB.js.map} +1 -1
  33. package/dist/standalone/assets/{command-BNF_evMy.js → command-Sb0xL-se.js} +2 -2
  34. package/dist/standalone/assets/command-Sb0xL-se.js.br +0 -0
  35. package/dist/standalone/assets/command-Sb0xL-se.js.gz +0 -0
  36. package/dist/standalone/assets/{command-BNF_evMy.js.map → command-Sb0xL-se.js.map} +1 -1
  37. package/dist/standalone/assets/date-picker-C4HcgidQ.js +2 -0
  38. package/dist/standalone/assets/date-picker-C4HcgidQ.js.br +0 -0
  39. package/dist/standalone/assets/date-picker-C4HcgidQ.js.gz +0 -0
  40. package/dist/standalone/assets/date-picker-C4HcgidQ.js.map +1 -0
  41. package/dist/standalone/assets/{edit-page-DCRB9Y_q.js → edit-page-CW7-FAPC.js} +2 -2
  42. package/dist/standalone/assets/edit-page-CW7-FAPC.js.br +0 -0
  43. package/dist/standalone/assets/edit-page-CW7-FAPC.js.gz +0 -0
  44. package/dist/standalone/assets/{edit-page-DCRB9Y_q.js.map → edit-page-CW7-FAPC.js.map} +1 -1
  45. package/dist/standalone/assets/{empty-DAEAjFd3.js → empty-Cposcczv.js} +2 -2
  46. package/dist/standalone/assets/empty-Cposcczv.js.br +0 -0
  47. package/dist/standalone/assets/empty-Cposcczv.js.gz +0 -0
  48. package/dist/standalone/assets/{empty-DAEAjFd3.js.map → empty-Cposcczv.js.map} +1 -1
  49. package/dist/standalone/assets/{global-search-dialog-HMLztOho.js → global-search-dialog-DLv_nIvM.js} +2 -2
  50. package/dist/standalone/assets/global-search-dialog-DLv_nIvM.js.br +0 -0
  51. package/dist/standalone/assets/global-search-dialog-DLv_nIvM.js.gz +0 -0
  52. package/dist/standalone/assets/{global-search-dialog-HMLztOho.js.map → global-search-dialog-DLv_nIvM.js.map} +1 -1
  53. package/dist/standalone/assets/{heavy-fields-ZuqfOFMv.js → heavy-fields-BiCEgD2L.js} +2 -2
  54. package/dist/standalone/assets/heavy-fields-BiCEgD2L.js.br +0 -0
  55. package/dist/standalone/assets/heavy-fields-BiCEgD2L.js.gz +0 -0
  56. package/dist/standalone/assets/{heavy-fields-ZuqfOFMv.js.map → heavy-fields-BiCEgD2L.js.map} +1 -1
  57. package/dist/standalone/assets/{home-page-HmheewiP.js → home-page-BSz1wGk0.js} +3 -3
  58. package/dist/standalone/assets/home-page-BSz1wGk0.js.br +0 -0
  59. package/dist/standalone/assets/home-page-BSz1wGk0.js.gz +0 -0
  60. package/dist/standalone/assets/{home-page-HmheewiP.js.map → home-page-BSz1wGk0.js.map} +1 -1
  61. package/dist/standalone/assets/{icon-registry-BV44--RL.js → icon-registry-BQU4fIc4.js} +2 -2
  62. package/dist/standalone/assets/icon-registry-BQU4fIc4.js.br +0 -0
  63. package/dist/standalone/assets/{icon-registry-BV44--RL.js.gz → icon-registry-BQU4fIc4.js.gz} +0 -0
  64. package/dist/standalone/assets/{icon-registry-BV44--RL.js.map → icon-registry-BQU4fIc4.js.map} +1 -1
  65. package/dist/standalone/assets/index-BL8keDxQ.js +15 -0
  66. package/dist/standalone/assets/index-BL8keDxQ.js.br +0 -0
  67. package/dist/standalone/assets/index-BL8keDxQ.js.gz +0 -0
  68. package/dist/standalone/assets/{index-t4woXGa-.js.map → index-BL8keDxQ.js.map} +1 -1
  69. package/dist/standalone/assets/{json-editor-sGw4fDoj.js → json-editor-CAIgxYb3.js} +2 -2
  70. package/dist/standalone/assets/json-editor-CAIgxYb3.js.br +0 -0
  71. package/dist/standalone/assets/json-editor-CAIgxYb3.js.gz +0 -0
  72. package/dist/standalone/assets/{json-editor-sGw4fDoj.js.map → json-editor-CAIgxYb3.js.map} +1 -1
  73. package/dist/standalone/assets/{property-renderer-DyCwdVkh.js → property-renderer-B8Md-EqW.js} +4 -4
  74. package/dist/standalone/assets/property-renderer-B8Md-EqW.js.br +0 -0
  75. package/dist/standalone/assets/property-renderer-B8Md-EqW.js.gz +0 -0
  76. package/dist/standalone/assets/property-renderer-B8Md-EqW.js.map +1 -0
  77. package/dist/standalone/assets/{reference-Dfd804y3.js → reference-WPaf6IdD.js} +2 -2
  78. package/dist/standalone/assets/reference-WPaf6IdD.js.br +0 -0
  79. package/dist/standalone/assets/reference-WPaf6IdD.js.gz +0 -0
  80. package/dist/standalone/assets/{reference-Dfd804y3.js.map → reference-WPaf6IdD.js.map} +1 -1
  81. package/dist/standalone/assets/{revisions-button-DXZAh2Lu.js → revisions-button-0WtL6bsZ.js} +2 -2
  82. package/dist/standalone/assets/revisions-button-0WtL6bsZ.js.br +0 -0
  83. package/dist/standalone/assets/revisions-button-0WtL6bsZ.js.gz +0 -0
  84. package/dist/standalone/assets/{revisions-button-DXZAh2Lu.js.map → revisions-button-0WtL6bsZ.js.map} +1 -1
  85. package/dist/standalone/assets/{select-BWf6walM.js → select-CR4acjX0.js} +2 -2
  86. package/dist/standalone/assets/select-CR4acjX0.js.br +0 -0
  87. package/dist/standalone/assets/select-CR4acjX0.js.gz +0 -0
  88. package/dist/standalone/assets/{select-BWf6walM.js.map → select-CR4acjX0.js.map} +1 -1
  89. package/dist/standalone/assets/{settings-page-Co7sWbbL.js → settings-page-DtguXLAP.js} +2 -2
  90. package/dist/standalone/assets/settings-page-DtguXLAP.js.br +0 -0
  91. package/dist/standalone/assets/settings-page-DtguXLAP.js.gz +0 -0
  92. package/dist/standalone/assets/{settings-page-Co7sWbbL.js.map → settings-page-DtguXLAP.js.map} +1 -1
  93. package/dist/standalone/assets/{show-page-D-_vldWV.js → show-page-Dnox2NwO.js} +2 -2
  94. package/dist/standalone/assets/show-page-Dnox2NwO.js.br +0 -0
  95. package/dist/standalone/assets/show-page-Dnox2NwO.js.gz +0 -0
  96. package/dist/standalone/assets/{show-page-D-_vldWV.js.map → show-page-Dnox2NwO.js.map} +1 -1
  97. package/dist/standalone/assets/{tabs-khcHka8W.js → tabs-DUS8e6dR.js} +2 -2
  98. package/dist/standalone/assets/tabs-DUS8e6dR.js.br +0 -0
  99. package/dist/standalone/assets/tabs-DUS8e6dR.js.gz +0 -0
  100. package/dist/standalone/assets/{tabs-khcHka8W.js.map → tabs-DUS8e6dR.js.map} +1 -1
  101. package/dist/standalone/assets/{value-format-CPnbnlE6.js → value-format-Cgau0meh.js} +2 -2
  102. package/dist/standalone/assets/value-format-Cgau0meh.js.br +0 -0
  103. package/dist/standalone/assets/{value-format-CPnbnlE6.js.gz → value-format-Cgau0meh.js.gz} +0 -0
  104. package/dist/standalone/assets/{value-format-CPnbnlE6.js.map → value-format-Cgau0meh.js.map} +1 -1
  105. package/dist/standalone/assets/{wizard-create-page-CFwMs8E3.js → wizard-create-page-v2-Aw8Oj.js} +2 -2
  106. package/dist/standalone/assets/wizard-create-page-v2-Aw8Oj.js.br +0 -0
  107. package/dist/standalone/assets/wizard-create-page-v2-Aw8Oj.js.gz +0 -0
  108. package/dist/standalone/assets/{wizard-create-page-CFwMs8E3.js.map → wizard-create-page-v2-Aw8Oj.js.map} +1 -1
  109. package/dist/standalone/assets/{zod-BbfEBA4A.js → zod-BrelKLfy.js} +2 -2
  110. package/dist/standalone/assets/zod-BrelKLfy.js.br +0 -0
  111. package/dist/standalone/assets/zod-BrelKLfy.js.gz +0 -0
  112. package/dist/standalone/assets/{zod-BbfEBA4A.js.map → zod-BrelKLfy.js.map} +1 -1
  113. package/dist/standalone/index.html +4 -4
  114. package/dist/standalone/index.html.br +0 -0
  115. package/dist/standalone/index.html.gz +0 -0
  116. package/package.json +28 -6
  117. package/src/mount.tsx +8 -2
  118. package/src/standalone.tsx +1 -0
  119. package/src/vite.ts +219 -0
  120. package/vite.config.ts +13 -104
  121. package/dist/standalone/assets/action-component-host-CXIbN-8V.js.br +0 -0
  122. package/dist/standalone/assets/action-component-host-CXIbN-8V.js.gz +0 -0
  123. package/dist/standalone/assets/action-page-OsWfKQ6C.js.br +0 -0
  124. package/dist/standalone/assets/action-page-OsWfKQ6C.js.gz +0 -0
  125. package/dist/standalone/assets/ai-assistant-widget-Bt4Z7Fmr.js.br +0 -0
  126. package/dist/standalone/assets/ai-assistant-widget-Bt4Z7Fmr.js.gz +0 -0
  127. package/dist/standalone/assets/audit-log-page-2wuGiWg-.js.br +0 -0
  128. package/dist/standalone/assets/audit-log-page-2wuGiWg-.js.gz +0 -0
  129. package/dist/standalone/assets/calendar-BZVUWakC.js.br +0 -0
  130. package/dist/standalone/assets/calendar-BZVUWakC.js.gz +0 -0
  131. package/dist/standalone/assets/chart-widget-BtJb6YXV.js.br +0 -0
  132. package/dist/standalone/assets/chart-widget-BtJb6YXV.js.gz +0 -0
  133. package/dist/standalone/assets/command-BNF_evMy.js.br +0 -0
  134. package/dist/standalone/assets/command-BNF_evMy.js.gz +0 -0
  135. package/dist/standalone/assets/date-picker-LfbUehd1.js +0 -2
  136. package/dist/standalone/assets/date-picker-LfbUehd1.js.br +0 -0
  137. package/dist/standalone/assets/date-picker-LfbUehd1.js.gz +0 -0
  138. package/dist/standalone/assets/date-picker-LfbUehd1.js.map +0 -1
  139. package/dist/standalone/assets/edit-page-DCRB9Y_q.js.br +0 -0
  140. package/dist/standalone/assets/edit-page-DCRB9Y_q.js.gz +0 -0
  141. package/dist/standalone/assets/empty-DAEAjFd3.js.br +0 -0
  142. package/dist/standalone/assets/empty-DAEAjFd3.js.gz +0 -0
  143. package/dist/standalone/assets/global-search-dialog-HMLztOho.js.br +0 -0
  144. package/dist/standalone/assets/global-search-dialog-HMLztOho.js.gz +0 -0
  145. package/dist/standalone/assets/heavy-fields-ZuqfOFMv.js.br +0 -0
  146. package/dist/standalone/assets/heavy-fields-ZuqfOFMv.js.gz +0 -0
  147. package/dist/standalone/assets/home-page-HmheewiP.js.br +0 -0
  148. package/dist/standalone/assets/home-page-HmheewiP.js.gz +0 -0
  149. package/dist/standalone/assets/icon-registry-BV44--RL.js.br +0 -0
  150. package/dist/standalone/assets/index-t4woXGa-.js +0 -15
  151. package/dist/standalone/assets/index-t4woXGa-.js.br +0 -0
  152. package/dist/standalone/assets/index-t4woXGa-.js.gz +0 -0
  153. package/dist/standalone/assets/json-editor-sGw4fDoj.js.br +0 -0
  154. package/dist/standalone/assets/json-editor-sGw4fDoj.js.gz +0 -0
  155. package/dist/standalone/assets/property-renderer-DyCwdVkh.js.br +0 -0
  156. package/dist/standalone/assets/property-renderer-DyCwdVkh.js.gz +0 -0
  157. package/dist/standalone/assets/property-renderer-DyCwdVkh.js.map +0 -1
  158. package/dist/standalone/assets/reference-Dfd804y3.js.br +0 -0
  159. package/dist/standalone/assets/reference-Dfd804y3.js.gz +0 -0
  160. package/dist/standalone/assets/revisions-button-DXZAh2Lu.js.br +0 -0
  161. package/dist/standalone/assets/revisions-button-DXZAh2Lu.js.gz +0 -0
  162. package/dist/standalone/assets/select-BWf6walM.js.br +0 -0
  163. package/dist/standalone/assets/select-BWf6walM.js.gz +0 -0
  164. package/dist/standalone/assets/settings-page-Co7sWbbL.js.br +0 -0
  165. package/dist/standalone/assets/settings-page-Co7sWbbL.js.gz +0 -0
  166. package/dist/standalone/assets/show-page-D-_vldWV.js.br +0 -0
  167. package/dist/standalone/assets/show-page-D-_vldWV.js.gz +0 -0
  168. package/dist/standalone/assets/tabs-khcHka8W.js.br +0 -0
  169. package/dist/standalone/assets/tabs-khcHka8W.js.gz +0 -0
  170. package/dist/standalone/assets/value-format-CPnbnlE6.js.br +0 -0
  171. package/dist/standalone/assets/wizard-create-page-CFwMs8E3.js.br +0 -0
  172. package/dist/standalone/assets/wizard-create-page-CFwMs8E3.js.gz +0 -0
  173. package/dist/standalone/assets/zod-BbfEBA4A.js.br +0 -0
  174. package/dist/standalone/assets/zod-BbfEBA4A.js.gz +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"command-BNF_evMy.js","names":["Y","k","B","K","ae","H","D","G","w.Root","w.Portal","w.Overlay","w.Content"],"sources":["../../../../../node_modules/.bun/cmdk@1.1.1+ae2b4604ef263bc9/node_modules/cmdk/dist/chunk-NZJY6EH4.mjs","../../../../../node_modules/.bun/cmdk@1.1.1+ae2b4604ef263bc9/node_modules/cmdk/dist/index.mjs","../../../../ui/src/components/command.tsx"],"sourcesContent":["var U=1,Y=.9,H=.8,J=.17,p=.1,u=.999,$=.9999;var k=.99,m=/[\\\\\\/_+.#\"@\\[\\(\\{&]/,B=/[\\\\\\/_+.#\"@\\[\\(\\{&]/g,K=/[\\s-]/,X=/[\\s-]/g;function G(_,C,h,P,A,f,O){if(f===C.length)return A===_.length?U:k;var T=`${A},${f}`;if(O[T]!==void 0)return O[T];for(var L=P.charAt(f),c=h.indexOf(L,A),S=0,E,N,R,M;c>=0;)E=G(_,C,h,P,c+1,f+1,O),E>S&&(c===A?E*=U:m.test(_.charAt(c-1))?(E*=H,R=_.slice(A,c-1).match(B),R&&A>0&&(E*=Math.pow(u,R.length))):K.test(_.charAt(c-1))?(E*=Y,M=_.slice(A,c-1).match(X),M&&A>0&&(E*=Math.pow(u,M.length))):(E*=J,A>0&&(E*=Math.pow(u,c-A))),_.charAt(c)!==C.charAt(f)&&(E*=$)),(E<p&&h.charAt(c-1)===P.charAt(f+1)||P.charAt(f+1)===P.charAt(f)&&h.charAt(c-1)!==P.charAt(f))&&(N=G(_,C,h,P,c+1,f+2,O),N*p>E&&(E=N*p)),E>S&&(S=E),c=h.indexOf(L,c+1);return O[T]=S,S}function D(_){return _.toLowerCase().replace(X,\" \")}function W(_,C,h){return _=h&&h.length>0?`${_+\" \"+h.join(\" \")}`:_,G(_,C,D(_),D(C),0,0,{})}export{W as a};\n","\"use client\";import{a as ae}from\"./chunk-NZJY6EH4.mjs\";import*as w from\"@radix-ui/react-dialog\";import*as t from\"react\";import{Primitive as D}from\"@radix-ui/react-primitive\";import{useId as H}from\"@radix-ui/react-id\";import{composeRefs as G}from\"@radix-ui/react-compose-refs\";var N='[cmdk-group=\"\"]',Y='[cmdk-group-items=\"\"]',be='[cmdk-group-heading=\"\"]',le='[cmdk-item=\"\"]',ce=`${le}:not([aria-disabled=\"true\"])`,Z=\"cmdk-item-select\",T=\"data-value\",Re=(r,o,n)=>ae(r,o,n),ue=t.createContext(void 0),K=()=>t.useContext(ue),de=t.createContext(void 0),ee=()=>t.useContext(de),fe=t.createContext(void 0),me=t.forwardRef((r,o)=>{let n=L(()=>{var e,a;return{search:\"\",value:(a=(e=r.value)!=null?e:r.defaultValue)!=null?a:\"\",selectedItemId:void 0,filtered:{count:0,items:new Map,groups:new Set}}}),u=L(()=>new Set),c=L(()=>new Map),d=L(()=>new Map),f=L(()=>new Set),p=pe(r),{label:b,children:m,value:R,onValueChange:x,filter:C,shouldFilter:S,loop:A,disablePointerSelection:ge=!1,vimBindings:j=!0,...O}=r,$=H(),q=H(),_=H(),I=t.useRef(null),v=ke();k(()=>{if(R!==void 0){let e=R.trim();n.current.value=e,E.emit()}},[R]),k(()=>{v(6,ne)},[]);let E=t.useMemo(()=>({subscribe:e=>(f.current.add(e),()=>f.current.delete(e)),snapshot:()=>n.current,setState:(e,a,s)=>{var i,l,g,y;if(!Object.is(n.current[e],a)){if(n.current[e]=a,e===\"search\")J(),z(),v(1,W);else if(e===\"value\"){if(document.activeElement.hasAttribute(\"cmdk-input\")||document.activeElement.hasAttribute(\"cmdk-root\")){let h=document.getElementById(_);h?h.focus():(i=document.getElementById($))==null||i.focus()}if(v(7,()=>{var h;n.current.selectedItemId=(h=M())==null?void 0:h.id,E.emit()}),s||v(5,ne),((l=p.current)==null?void 0:l.value)!==void 0){let h=a!=null?a:\"\";(y=(g=p.current).onValueChange)==null||y.call(g,h);return}}E.emit()}},emit:()=>{f.current.forEach(e=>e())}}),[]),U=t.useMemo(()=>({value:(e,a,s)=>{var i;a!==((i=d.current.get(e))==null?void 0:i.value)&&(d.current.set(e,{value:a,keywords:s}),n.current.filtered.items.set(e,te(a,s)),v(2,()=>{z(),E.emit()}))},item:(e,a)=>(u.current.add(e),a&&(c.current.has(a)?c.current.get(a).add(e):c.current.set(a,new Set([e]))),v(3,()=>{J(),z(),n.current.value||W(),E.emit()}),()=>{d.current.delete(e),u.current.delete(e),n.current.filtered.items.delete(e);let s=M();v(4,()=>{J(),(s==null?void 0:s.getAttribute(\"id\"))===e&&W(),E.emit()})}),group:e=>(c.current.has(e)||c.current.set(e,new Set),()=>{d.current.delete(e),c.current.delete(e)}),filter:()=>p.current.shouldFilter,label:b||r[\"aria-label\"],getDisablePointerSelection:()=>p.current.disablePointerSelection,listId:$,inputId:_,labelId:q,listInnerRef:I}),[]);function te(e,a){var i,l;let s=(l=(i=p.current)==null?void 0:i.filter)!=null?l:Re;return e?s(e,n.current.search,a):0}function z(){if(!n.current.search||p.current.shouldFilter===!1)return;let e=n.current.filtered.items,a=[];n.current.filtered.groups.forEach(i=>{let l=c.current.get(i),g=0;l.forEach(y=>{let h=e.get(y);g=Math.max(h,g)}),a.push([i,g])});let s=I.current;V().sort((i,l)=>{var h,F;let g=i.getAttribute(\"id\"),y=l.getAttribute(\"id\");return((h=e.get(y))!=null?h:0)-((F=e.get(g))!=null?F:0)}).forEach(i=>{let l=i.closest(Y);l?l.appendChild(i.parentElement===l?i:i.closest(`${Y} > *`)):s.appendChild(i.parentElement===s?i:i.closest(`${Y} > *`))}),a.sort((i,l)=>l[1]-i[1]).forEach(i=>{var g;let l=(g=I.current)==null?void 0:g.querySelector(`${N}[${T}=\"${encodeURIComponent(i[0])}\"]`);l==null||l.parentElement.appendChild(l)})}function W(){let e=V().find(s=>s.getAttribute(\"aria-disabled\")!==\"true\"),a=e==null?void 0:e.getAttribute(T);E.setState(\"value\",a||void 0)}function J(){var a,s,i,l;if(!n.current.search||p.current.shouldFilter===!1){n.current.filtered.count=u.current.size;return}n.current.filtered.groups=new Set;let e=0;for(let g of u.current){let y=(s=(a=d.current.get(g))==null?void 0:a.value)!=null?s:\"\",h=(l=(i=d.current.get(g))==null?void 0:i.keywords)!=null?l:[],F=te(y,h);n.current.filtered.items.set(g,F),F>0&&e++}for(let[g,y]of c.current)for(let h of y)if(n.current.filtered.items.get(h)>0){n.current.filtered.groups.add(g);break}n.current.filtered.count=e}function ne(){var a,s,i;let e=M();e&&(((a=e.parentElement)==null?void 0:a.firstChild)===e&&((i=(s=e.closest(N))==null?void 0:s.querySelector(be))==null||i.scrollIntoView({block:\"nearest\"})),e.scrollIntoView({block:\"nearest\"}))}function M(){var e;return(e=I.current)==null?void 0:e.querySelector(`${le}[aria-selected=\"true\"]`)}function V(){var e;return Array.from(((e=I.current)==null?void 0:e.querySelectorAll(ce))||[])}function X(e){let s=V()[e];s&&E.setState(\"value\",s.getAttribute(T))}function Q(e){var g;let a=M(),s=V(),i=s.findIndex(y=>y===a),l=s[i+e];(g=p.current)!=null&&g.loop&&(l=i+e<0?s[s.length-1]:i+e===s.length?s[0]:s[i+e]),l&&E.setState(\"value\",l.getAttribute(T))}function re(e){let a=M(),s=a==null?void 0:a.closest(N),i;for(;s&&!i;)s=e>0?we(s,N):De(s,N),i=s==null?void 0:s.querySelector(ce);i?E.setState(\"value\",i.getAttribute(T)):Q(e)}let oe=()=>X(V().length-1),ie=e=>{e.preventDefault(),e.metaKey?oe():e.altKey?re(1):Q(1)},se=e=>{e.preventDefault(),e.metaKey?X(0):e.altKey?re(-1):Q(-1)};return t.createElement(D.div,{ref:o,tabIndex:-1,...O,\"cmdk-root\":\"\",onKeyDown:e=>{var s;(s=O.onKeyDown)==null||s.call(O,e);let a=e.nativeEvent.isComposing||e.keyCode===229;if(!(e.defaultPrevented||a))switch(e.key){case\"n\":case\"j\":{j&&e.ctrlKey&&ie(e);break}case\"ArrowDown\":{ie(e);break}case\"p\":case\"k\":{j&&e.ctrlKey&&se(e);break}case\"ArrowUp\":{se(e);break}case\"Home\":{e.preventDefault(),X(0);break}case\"End\":{e.preventDefault(),oe();break}case\"Enter\":{e.preventDefault();let i=M();if(i){let l=new Event(Z);i.dispatchEvent(l)}}}}},t.createElement(\"label\",{\"cmdk-label\":\"\",htmlFor:U.inputId,id:U.labelId,style:Te},b),B(r,e=>t.createElement(de.Provider,{value:E},t.createElement(ue.Provider,{value:U},e))))}),he=t.forwardRef((r,o)=>{var _,I;let n=H(),u=t.useRef(null),c=t.useContext(fe),d=K(),f=pe(r),p=(I=(_=f.current)==null?void 0:_.forceMount)!=null?I:c==null?void 0:c.forceMount;k(()=>{if(!p)return d.item(n,c==null?void 0:c.id)},[p]);let b=ve(n,u,[r.value,r.children,u],r.keywords),m=ee(),R=P(v=>v.value&&v.value===b.current),x=P(v=>p||d.filter()===!1?!0:v.search?v.filtered.items.get(n)>0:!0);t.useEffect(()=>{let v=u.current;if(!(!v||r.disabled))return v.addEventListener(Z,C),()=>v.removeEventListener(Z,C)},[x,r.onSelect,r.disabled]);function C(){var v,E;S(),(E=(v=f.current).onSelect)==null||E.call(v,b.current)}function S(){m.setState(\"value\",b.current,!0)}if(!x)return null;let{disabled:A,value:ge,onSelect:j,forceMount:O,keywords:$,...q}=r;return t.createElement(D.div,{ref:G(u,o),...q,id:n,\"cmdk-item\":\"\",role:\"option\",\"aria-disabled\":!!A,\"aria-selected\":!!R,\"data-disabled\":!!A,\"data-selected\":!!R,onPointerMove:A||d.getDisablePointerSelection()?void 0:S,onClick:A?void 0:C},r.children)}),Ee=t.forwardRef((r,o)=>{let{heading:n,children:u,forceMount:c,...d}=r,f=H(),p=t.useRef(null),b=t.useRef(null),m=H(),R=K(),x=P(S=>c||R.filter()===!1?!0:S.search?S.filtered.groups.has(f):!0);k(()=>R.group(f),[]),ve(f,p,[r.value,r.heading,b]);let C=t.useMemo(()=>({id:f,forceMount:c}),[c]);return t.createElement(D.div,{ref:G(p,o),...d,\"cmdk-group\":\"\",role:\"presentation\",hidden:x?void 0:!0},n&&t.createElement(\"div\",{ref:b,\"cmdk-group-heading\":\"\",\"aria-hidden\":!0,id:m},n),B(r,S=>t.createElement(\"div\",{\"cmdk-group-items\":\"\",role:\"group\",\"aria-labelledby\":n?m:void 0},t.createElement(fe.Provider,{value:C},S))))}),ye=t.forwardRef((r,o)=>{let{alwaysRender:n,...u}=r,c=t.useRef(null),d=P(f=>!f.search);return!n&&!d?null:t.createElement(D.div,{ref:G(c,o),...u,\"cmdk-separator\":\"\",role:\"separator\"})}),Se=t.forwardRef((r,o)=>{let{onValueChange:n,...u}=r,c=r.value!=null,d=ee(),f=P(m=>m.search),p=P(m=>m.selectedItemId),b=K();return t.useEffect(()=>{r.value!=null&&d.setState(\"search\",r.value)},[r.value]),t.createElement(D.input,{ref:o,...u,\"cmdk-input\":\"\",autoComplete:\"off\",autoCorrect:\"off\",spellCheck:!1,\"aria-autocomplete\":\"list\",role:\"combobox\",\"aria-expanded\":!0,\"aria-controls\":b.listId,\"aria-labelledby\":b.labelId,\"aria-activedescendant\":p,id:b.inputId,type:\"text\",value:c?r.value:f,onChange:m=>{c||d.setState(\"search\",m.target.value),n==null||n(m.target.value)}})}),Ce=t.forwardRef((r,o)=>{let{children:n,label:u=\"Suggestions\",...c}=r,d=t.useRef(null),f=t.useRef(null),p=P(m=>m.selectedItemId),b=K();return t.useEffect(()=>{if(f.current&&d.current){let m=f.current,R=d.current,x,C=new ResizeObserver(()=>{x=requestAnimationFrame(()=>{let S=m.offsetHeight;R.style.setProperty(\"--cmdk-list-height\",S.toFixed(1)+\"px\")})});return C.observe(m),()=>{cancelAnimationFrame(x),C.unobserve(m)}}},[]),t.createElement(D.div,{ref:G(d,o),...c,\"cmdk-list\":\"\",role:\"listbox\",tabIndex:-1,\"aria-activedescendant\":p,\"aria-label\":u,id:b.listId},B(r,m=>t.createElement(\"div\",{ref:G(f,b.listInnerRef),\"cmdk-list-sizer\":\"\"},m)))}),xe=t.forwardRef((r,o)=>{let{open:n,onOpenChange:u,overlayClassName:c,contentClassName:d,container:f,...p}=r;return t.createElement(w.Root,{open:n,onOpenChange:u},t.createElement(w.Portal,{container:f},t.createElement(w.Overlay,{\"cmdk-overlay\":\"\",className:c}),t.createElement(w.Content,{\"aria-label\":r.label,\"cmdk-dialog\":\"\",className:d},t.createElement(me,{ref:o,...p}))))}),Ie=t.forwardRef((r,o)=>P(u=>u.filtered.count===0)?t.createElement(D.div,{ref:o,...r,\"cmdk-empty\":\"\",role:\"presentation\"}):null),Pe=t.forwardRef((r,o)=>{let{progress:n,children:u,label:c=\"Loading...\",...d}=r;return t.createElement(D.div,{ref:o,...d,\"cmdk-loading\":\"\",role:\"progressbar\",\"aria-valuenow\":n,\"aria-valuemin\":0,\"aria-valuemax\":100,\"aria-label\":c},B(r,f=>t.createElement(\"div\",{\"aria-hidden\":!0},f)))}),_e=Object.assign(me,{List:Ce,Item:he,Input:Se,Group:Ee,Separator:ye,Dialog:xe,Empty:Ie,Loading:Pe});function we(r,o){let n=r.nextElementSibling;for(;n;){if(n.matches(o))return n;n=n.nextElementSibling}}function De(r,o){let n=r.previousElementSibling;for(;n;){if(n.matches(o))return n;n=n.previousElementSibling}}function pe(r){let o=t.useRef(r);return k(()=>{o.current=r}),o}var k=typeof window==\"undefined\"?t.useEffect:t.useLayoutEffect;function L(r){let o=t.useRef();return o.current===void 0&&(o.current=r()),o}function P(r){let o=ee(),n=()=>r(o.snapshot());return t.useSyncExternalStore(o.subscribe,n,n)}function ve(r,o,n,u=[]){let c=t.useRef(),d=K();return k(()=>{var b;let f=(()=>{var m;for(let R of n){if(typeof R==\"string\")return R.trim();if(typeof R==\"object\"&&\"current\"in R)return R.current?(m=R.current.textContent)==null?void 0:m.trim():c.current}})(),p=u.map(m=>m.trim());d.value(r,f,p),(b=o.current)==null||b.setAttribute(T,f),c.current=f}),c}var ke=()=>{let[r,o]=t.useState(),n=L(()=>new Map);return k(()=>{n.current.forEach(u=>u()),n.current=new Map},[r]),(u,c)=>{n.current.set(u,c),o({})}};function Me(r){let o=r.type;return typeof o==\"function\"?o(r.props):\"render\"in o?o.render(r.props):r}function B({asChild:r,children:o},n){return r&&t.isValidElement(o)?t.cloneElement(Me(o),{ref:o.ref},n(o.props.children)):n(o)}var Te={position:\"absolute\",width:\"1px\",height:\"1px\",padding:\"0\",margin:\"-1px\",overflow:\"hidden\",clip:\"rect(0, 0, 0, 0)\",whiteSpace:\"nowrap\",borderWidth:\"0\"};export{_e as Command,xe as CommandDialog,Ie as CommandEmpty,Ee as CommandGroup,Se as CommandInput,he as CommandItem,Ce as CommandList,Pe as CommandLoading,me as CommandRoot,ye as CommandSeparator,Re as defaultFilter,P as useCommandState};\n","import * as React from 'react'\nimport { Command as CommandPrimitive } from 'cmdk'\nimport { Search } from 'lucide-react'\nimport { cn } from '../lib/utils.js'\nimport { Dialog, DialogContent } from './dialog.js'\n\nexport const Command = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive\n ref={ref}\n className={cn(\n 'flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground',\n className,\n )}\n {...props}\n />\n))\nCommand.displayName = CommandPrimitive.displayName\n\nexport const CommandDialog = ({\n children,\n ...props\n}: React.ComponentProps<typeof Dialog>): React.ReactElement => (\n <Dialog {...props}>\n <DialogContent className=\"overflow-hidden p-0 shadow-lg\">\n <Command className=\"[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n)\n\nexport const CommandInput = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Input>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>\n>(({ className, ...props }, ref) => (\n <div className=\"flex items-center border-b border-border px-3\" cmdk-input-wrapper=\"\">\n <Search className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n ref={ref}\n className={cn(\n 'flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n </div>\n))\nCommandInput.displayName = CommandPrimitive.Input.displayName\n\nexport const CommandList = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.List\n ref={ref}\n className={cn('max-h-[300px] overflow-y-auto overflow-x-hidden', className)}\n {...props}\n />\n))\nCommandList.displayName = CommandPrimitive.List.displayName\n\nexport const CommandEmpty = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Empty>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>\n>((props, ref) => (\n <CommandPrimitive.Empty ref={ref} className=\"py-6 text-center text-sm\" {...props} />\n))\nCommandEmpty.displayName = CommandPrimitive.Empty.displayName\n\nexport const CommandGroup = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Group>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Group\n ref={ref}\n className={cn(\n 'overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground',\n className,\n )}\n {...props}\n />\n))\nCommandGroup.displayName = CommandPrimitive.Group.displayName\n\nexport const CommandSeparator = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Separator ref={ref} className={cn('-mx-1 h-px bg-border/40', className)} {...props} />\n))\nCommandSeparator.displayName = CommandPrimitive.Separator.displayName\n\nexport const CommandItem = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',\n className,\n )}\n {...props}\n />\n))\nCommandItem.displayName = CommandPrimitive.Item.displayName\n\nexport const CommandShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>): React.ReactElement => (\n <span\n className={cn('ml-auto text-xs tracking-widest text-muted-foreground', className)}\n {...props}\n />\n)\nCommandShortcut.displayName = 'CommandShortcut'\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
1
+ {"version":3,"file":"command-Sb0xL-se.js","names":["Y","k","B","K","ae","H","D","G","w.Root","w.Portal","w.Overlay","w.Content"],"sources":["../../../../../node_modules/.bun/cmdk@1.1.1+ae2b4604ef263bc9/node_modules/cmdk/dist/chunk-NZJY6EH4.mjs","../../../../../node_modules/.bun/cmdk@1.1.1+ae2b4604ef263bc9/node_modules/cmdk/dist/index.mjs","../../../../ui/src/components/command.tsx"],"sourcesContent":["var U=1,Y=.9,H=.8,J=.17,p=.1,u=.999,$=.9999;var k=.99,m=/[\\\\\\/_+.#\"@\\[\\(\\{&]/,B=/[\\\\\\/_+.#\"@\\[\\(\\{&]/g,K=/[\\s-]/,X=/[\\s-]/g;function G(_,C,h,P,A,f,O){if(f===C.length)return A===_.length?U:k;var T=`${A},${f}`;if(O[T]!==void 0)return O[T];for(var L=P.charAt(f),c=h.indexOf(L,A),S=0,E,N,R,M;c>=0;)E=G(_,C,h,P,c+1,f+1,O),E>S&&(c===A?E*=U:m.test(_.charAt(c-1))?(E*=H,R=_.slice(A,c-1).match(B),R&&A>0&&(E*=Math.pow(u,R.length))):K.test(_.charAt(c-1))?(E*=Y,M=_.slice(A,c-1).match(X),M&&A>0&&(E*=Math.pow(u,M.length))):(E*=J,A>0&&(E*=Math.pow(u,c-A))),_.charAt(c)!==C.charAt(f)&&(E*=$)),(E<p&&h.charAt(c-1)===P.charAt(f+1)||P.charAt(f+1)===P.charAt(f)&&h.charAt(c-1)!==P.charAt(f))&&(N=G(_,C,h,P,c+1,f+2,O),N*p>E&&(E=N*p)),E>S&&(S=E),c=h.indexOf(L,c+1);return O[T]=S,S}function D(_){return _.toLowerCase().replace(X,\" \")}function W(_,C,h){return _=h&&h.length>0?`${_+\" \"+h.join(\" \")}`:_,G(_,C,D(_),D(C),0,0,{})}export{W as a};\n","\"use client\";import{a as ae}from\"./chunk-NZJY6EH4.mjs\";import*as w from\"@radix-ui/react-dialog\";import*as t from\"react\";import{Primitive as D}from\"@radix-ui/react-primitive\";import{useId as H}from\"@radix-ui/react-id\";import{composeRefs as G}from\"@radix-ui/react-compose-refs\";var N='[cmdk-group=\"\"]',Y='[cmdk-group-items=\"\"]',be='[cmdk-group-heading=\"\"]',le='[cmdk-item=\"\"]',ce=`${le}:not([aria-disabled=\"true\"])`,Z=\"cmdk-item-select\",T=\"data-value\",Re=(r,o,n)=>ae(r,o,n),ue=t.createContext(void 0),K=()=>t.useContext(ue),de=t.createContext(void 0),ee=()=>t.useContext(de),fe=t.createContext(void 0),me=t.forwardRef((r,o)=>{let n=L(()=>{var e,a;return{search:\"\",value:(a=(e=r.value)!=null?e:r.defaultValue)!=null?a:\"\",selectedItemId:void 0,filtered:{count:0,items:new Map,groups:new Set}}}),u=L(()=>new Set),c=L(()=>new Map),d=L(()=>new Map),f=L(()=>new Set),p=pe(r),{label:b,children:m,value:R,onValueChange:x,filter:C,shouldFilter:S,loop:A,disablePointerSelection:ge=!1,vimBindings:j=!0,...O}=r,$=H(),q=H(),_=H(),I=t.useRef(null),v=ke();k(()=>{if(R!==void 0){let e=R.trim();n.current.value=e,E.emit()}},[R]),k(()=>{v(6,ne)},[]);let E=t.useMemo(()=>({subscribe:e=>(f.current.add(e),()=>f.current.delete(e)),snapshot:()=>n.current,setState:(e,a,s)=>{var i,l,g,y;if(!Object.is(n.current[e],a)){if(n.current[e]=a,e===\"search\")J(),z(),v(1,W);else if(e===\"value\"){if(document.activeElement.hasAttribute(\"cmdk-input\")||document.activeElement.hasAttribute(\"cmdk-root\")){let h=document.getElementById(_);h?h.focus():(i=document.getElementById($))==null||i.focus()}if(v(7,()=>{var h;n.current.selectedItemId=(h=M())==null?void 0:h.id,E.emit()}),s||v(5,ne),((l=p.current)==null?void 0:l.value)!==void 0){let h=a!=null?a:\"\";(y=(g=p.current).onValueChange)==null||y.call(g,h);return}}E.emit()}},emit:()=>{f.current.forEach(e=>e())}}),[]),U=t.useMemo(()=>({value:(e,a,s)=>{var i;a!==((i=d.current.get(e))==null?void 0:i.value)&&(d.current.set(e,{value:a,keywords:s}),n.current.filtered.items.set(e,te(a,s)),v(2,()=>{z(),E.emit()}))},item:(e,a)=>(u.current.add(e),a&&(c.current.has(a)?c.current.get(a).add(e):c.current.set(a,new Set([e]))),v(3,()=>{J(),z(),n.current.value||W(),E.emit()}),()=>{d.current.delete(e),u.current.delete(e),n.current.filtered.items.delete(e);let s=M();v(4,()=>{J(),(s==null?void 0:s.getAttribute(\"id\"))===e&&W(),E.emit()})}),group:e=>(c.current.has(e)||c.current.set(e,new Set),()=>{d.current.delete(e),c.current.delete(e)}),filter:()=>p.current.shouldFilter,label:b||r[\"aria-label\"],getDisablePointerSelection:()=>p.current.disablePointerSelection,listId:$,inputId:_,labelId:q,listInnerRef:I}),[]);function te(e,a){var i,l;let s=(l=(i=p.current)==null?void 0:i.filter)!=null?l:Re;return e?s(e,n.current.search,a):0}function z(){if(!n.current.search||p.current.shouldFilter===!1)return;let e=n.current.filtered.items,a=[];n.current.filtered.groups.forEach(i=>{let l=c.current.get(i),g=0;l.forEach(y=>{let h=e.get(y);g=Math.max(h,g)}),a.push([i,g])});let s=I.current;V().sort((i,l)=>{var h,F;let g=i.getAttribute(\"id\"),y=l.getAttribute(\"id\");return((h=e.get(y))!=null?h:0)-((F=e.get(g))!=null?F:0)}).forEach(i=>{let l=i.closest(Y);l?l.appendChild(i.parentElement===l?i:i.closest(`${Y} > *`)):s.appendChild(i.parentElement===s?i:i.closest(`${Y} > *`))}),a.sort((i,l)=>l[1]-i[1]).forEach(i=>{var g;let l=(g=I.current)==null?void 0:g.querySelector(`${N}[${T}=\"${encodeURIComponent(i[0])}\"]`);l==null||l.parentElement.appendChild(l)})}function W(){let e=V().find(s=>s.getAttribute(\"aria-disabled\")!==\"true\"),a=e==null?void 0:e.getAttribute(T);E.setState(\"value\",a||void 0)}function J(){var a,s,i,l;if(!n.current.search||p.current.shouldFilter===!1){n.current.filtered.count=u.current.size;return}n.current.filtered.groups=new Set;let e=0;for(let g of u.current){let y=(s=(a=d.current.get(g))==null?void 0:a.value)!=null?s:\"\",h=(l=(i=d.current.get(g))==null?void 0:i.keywords)!=null?l:[],F=te(y,h);n.current.filtered.items.set(g,F),F>0&&e++}for(let[g,y]of c.current)for(let h of y)if(n.current.filtered.items.get(h)>0){n.current.filtered.groups.add(g);break}n.current.filtered.count=e}function ne(){var a,s,i;let e=M();e&&(((a=e.parentElement)==null?void 0:a.firstChild)===e&&((i=(s=e.closest(N))==null?void 0:s.querySelector(be))==null||i.scrollIntoView({block:\"nearest\"})),e.scrollIntoView({block:\"nearest\"}))}function M(){var e;return(e=I.current)==null?void 0:e.querySelector(`${le}[aria-selected=\"true\"]`)}function V(){var e;return Array.from(((e=I.current)==null?void 0:e.querySelectorAll(ce))||[])}function X(e){let s=V()[e];s&&E.setState(\"value\",s.getAttribute(T))}function Q(e){var g;let a=M(),s=V(),i=s.findIndex(y=>y===a),l=s[i+e];(g=p.current)!=null&&g.loop&&(l=i+e<0?s[s.length-1]:i+e===s.length?s[0]:s[i+e]),l&&E.setState(\"value\",l.getAttribute(T))}function re(e){let a=M(),s=a==null?void 0:a.closest(N),i;for(;s&&!i;)s=e>0?we(s,N):De(s,N),i=s==null?void 0:s.querySelector(ce);i?E.setState(\"value\",i.getAttribute(T)):Q(e)}let oe=()=>X(V().length-1),ie=e=>{e.preventDefault(),e.metaKey?oe():e.altKey?re(1):Q(1)},se=e=>{e.preventDefault(),e.metaKey?X(0):e.altKey?re(-1):Q(-1)};return t.createElement(D.div,{ref:o,tabIndex:-1,...O,\"cmdk-root\":\"\",onKeyDown:e=>{var s;(s=O.onKeyDown)==null||s.call(O,e);let a=e.nativeEvent.isComposing||e.keyCode===229;if(!(e.defaultPrevented||a))switch(e.key){case\"n\":case\"j\":{j&&e.ctrlKey&&ie(e);break}case\"ArrowDown\":{ie(e);break}case\"p\":case\"k\":{j&&e.ctrlKey&&se(e);break}case\"ArrowUp\":{se(e);break}case\"Home\":{e.preventDefault(),X(0);break}case\"End\":{e.preventDefault(),oe();break}case\"Enter\":{e.preventDefault();let i=M();if(i){let l=new Event(Z);i.dispatchEvent(l)}}}}},t.createElement(\"label\",{\"cmdk-label\":\"\",htmlFor:U.inputId,id:U.labelId,style:Te},b),B(r,e=>t.createElement(de.Provider,{value:E},t.createElement(ue.Provider,{value:U},e))))}),he=t.forwardRef((r,o)=>{var _,I;let n=H(),u=t.useRef(null),c=t.useContext(fe),d=K(),f=pe(r),p=(I=(_=f.current)==null?void 0:_.forceMount)!=null?I:c==null?void 0:c.forceMount;k(()=>{if(!p)return d.item(n,c==null?void 0:c.id)},[p]);let b=ve(n,u,[r.value,r.children,u],r.keywords),m=ee(),R=P(v=>v.value&&v.value===b.current),x=P(v=>p||d.filter()===!1?!0:v.search?v.filtered.items.get(n)>0:!0);t.useEffect(()=>{let v=u.current;if(!(!v||r.disabled))return v.addEventListener(Z,C),()=>v.removeEventListener(Z,C)},[x,r.onSelect,r.disabled]);function C(){var v,E;S(),(E=(v=f.current).onSelect)==null||E.call(v,b.current)}function S(){m.setState(\"value\",b.current,!0)}if(!x)return null;let{disabled:A,value:ge,onSelect:j,forceMount:O,keywords:$,...q}=r;return t.createElement(D.div,{ref:G(u,o),...q,id:n,\"cmdk-item\":\"\",role:\"option\",\"aria-disabled\":!!A,\"aria-selected\":!!R,\"data-disabled\":!!A,\"data-selected\":!!R,onPointerMove:A||d.getDisablePointerSelection()?void 0:S,onClick:A?void 0:C},r.children)}),Ee=t.forwardRef((r,o)=>{let{heading:n,children:u,forceMount:c,...d}=r,f=H(),p=t.useRef(null),b=t.useRef(null),m=H(),R=K(),x=P(S=>c||R.filter()===!1?!0:S.search?S.filtered.groups.has(f):!0);k(()=>R.group(f),[]),ve(f,p,[r.value,r.heading,b]);let C=t.useMemo(()=>({id:f,forceMount:c}),[c]);return t.createElement(D.div,{ref:G(p,o),...d,\"cmdk-group\":\"\",role:\"presentation\",hidden:x?void 0:!0},n&&t.createElement(\"div\",{ref:b,\"cmdk-group-heading\":\"\",\"aria-hidden\":!0,id:m},n),B(r,S=>t.createElement(\"div\",{\"cmdk-group-items\":\"\",role:\"group\",\"aria-labelledby\":n?m:void 0},t.createElement(fe.Provider,{value:C},S))))}),ye=t.forwardRef((r,o)=>{let{alwaysRender:n,...u}=r,c=t.useRef(null),d=P(f=>!f.search);return!n&&!d?null:t.createElement(D.div,{ref:G(c,o),...u,\"cmdk-separator\":\"\",role:\"separator\"})}),Se=t.forwardRef((r,o)=>{let{onValueChange:n,...u}=r,c=r.value!=null,d=ee(),f=P(m=>m.search),p=P(m=>m.selectedItemId),b=K();return t.useEffect(()=>{r.value!=null&&d.setState(\"search\",r.value)},[r.value]),t.createElement(D.input,{ref:o,...u,\"cmdk-input\":\"\",autoComplete:\"off\",autoCorrect:\"off\",spellCheck:!1,\"aria-autocomplete\":\"list\",role:\"combobox\",\"aria-expanded\":!0,\"aria-controls\":b.listId,\"aria-labelledby\":b.labelId,\"aria-activedescendant\":p,id:b.inputId,type:\"text\",value:c?r.value:f,onChange:m=>{c||d.setState(\"search\",m.target.value),n==null||n(m.target.value)}})}),Ce=t.forwardRef((r,o)=>{let{children:n,label:u=\"Suggestions\",...c}=r,d=t.useRef(null),f=t.useRef(null),p=P(m=>m.selectedItemId),b=K();return t.useEffect(()=>{if(f.current&&d.current){let m=f.current,R=d.current,x,C=new ResizeObserver(()=>{x=requestAnimationFrame(()=>{let S=m.offsetHeight;R.style.setProperty(\"--cmdk-list-height\",S.toFixed(1)+\"px\")})});return C.observe(m),()=>{cancelAnimationFrame(x),C.unobserve(m)}}},[]),t.createElement(D.div,{ref:G(d,o),...c,\"cmdk-list\":\"\",role:\"listbox\",tabIndex:-1,\"aria-activedescendant\":p,\"aria-label\":u,id:b.listId},B(r,m=>t.createElement(\"div\",{ref:G(f,b.listInnerRef),\"cmdk-list-sizer\":\"\"},m)))}),xe=t.forwardRef((r,o)=>{let{open:n,onOpenChange:u,overlayClassName:c,contentClassName:d,container:f,...p}=r;return t.createElement(w.Root,{open:n,onOpenChange:u},t.createElement(w.Portal,{container:f},t.createElement(w.Overlay,{\"cmdk-overlay\":\"\",className:c}),t.createElement(w.Content,{\"aria-label\":r.label,\"cmdk-dialog\":\"\",className:d},t.createElement(me,{ref:o,...p}))))}),Ie=t.forwardRef((r,o)=>P(u=>u.filtered.count===0)?t.createElement(D.div,{ref:o,...r,\"cmdk-empty\":\"\",role:\"presentation\"}):null),Pe=t.forwardRef((r,o)=>{let{progress:n,children:u,label:c=\"Loading...\",...d}=r;return t.createElement(D.div,{ref:o,...d,\"cmdk-loading\":\"\",role:\"progressbar\",\"aria-valuenow\":n,\"aria-valuemin\":0,\"aria-valuemax\":100,\"aria-label\":c},B(r,f=>t.createElement(\"div\",{\"aria-hidden\":!0},f)))}),_e=Object.assign(me,{List:Ce,Item:he,Input:Se,Group:Ee,Separator:ye,Dialog:xe,Empty:Ie,Loading:Pe});function we(r,o){let n=r.nextElementSibling;for(;n;){if(n.matches(o))return n;n=n.nextElementSibling}}function De(r,o){let n=r.previousElementSibling;for(;n;){if(n.matches(o))return n;n=n.previousElementSibling}}function pe(r){let o=t.useRef(r);return k(()=>{o.current=r}),o}var k=typeof window==\"undefined\"?t.useEffect:t.useLayoutEffect;function L(r){let o=t.useRef();return o.current===void 0&&(o.current=r()),o}function P(r){let o=ee(),n=()=>r(o.snapshot());return t.useSyncExternalStore(o.subscribe,n,n)}function ve(r,o,n,u=[]){let c=t.useRef(),d=K();return k(()=>{var b;let f=(()=>{var m;for(let R of n){if(typeof R==\"string\")return R.trim();if(typeof R==\"object\"&&\"current\"in R)return R.current?(m=R.current.textContent)==null?void 0:m.trim():c.current}})(),p=u.map(m=>m.trim());d.value(r,f,p),(b=o.current)==null||b.setAttribute(T,f),c.current=f}),c}var ke=()=>{let[r,o]=t.useState(),n=L(()=>new Map);return k(()=>{n.current.forEach(u=>u()),n.current=new Map},[r]),(u,c)=>{n.current.set(u,c),o({})}};function Me(r){let o=r.type;return typeof o==\"function\"?o(r.props):\"render\"in o?o.render(r.props):r}function B({asChild:r,children:o},n){return r&&t.isValidElement(o)?t.cloneElement(Me(o),{ref:o.ref},n(o.props.children)):n(o)}var Te={position:\"absolute\",width:\"1px\",height:\"1px\",padding:\"0\",margin:\"-1px\",overflow:\"hidden\",clip:\"rect(0, 0, 0, 0)\",whiteSpace:\"nowrap\",borderWidth:\"0\"};export{_e as Command,xe as CommandDialog,Ie as CommandEmpty,Ee as CommandGroup,Se as CommandInput,he as CommandItem,Ce as CommandList,Pe as CommandLoading,me as CommandRoot,ye as CommandSeparator,Re as defaultFilter,P as useCommandState};\n","import * as React from 'react'\nimport { Command as CommandPrimitive } from 'cmdk'\nimport { Search } from 'lucide-react'\nimport { cn } from '../lib/utils.js'\nimport { Dialog, DialogContent } from './dialog.js'\n\nexport const Command = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive\n ref={ref}\n className={cn(\n 'flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground',\n className,\n )}\n {...props}\n />\n))\nCommand.displayName = CommandPrimitive.displayName\n\nexport const CommandDialog = ({\n children,\n ...props\n}: React.ComponentProps<typeof Dialog>): React.ReactElement => (\n <Dialog {...props}>\n <DialogContent className=\"overflow-hidden p-0 shadow-lg\">\n <Command className=\"[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n)\n\nexport const CommandInput = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Input>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>\n>(({ className, ...props }, ref) => (\n <div className=\"flex items-center border-b border-border px-3\" cmdk-input-wrapper=\"\">\n <Search className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n ref={ref}\n className={cn(\n 'flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n </div>\n))\nCommandInput.displayName = CommandPrimitive.Input.displayName\n\nexport const CommandList = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.List\n ref={ref}\n className={cn('max-h-[300px] overflow-y-auto overflow-x-hidden', className)}\n {...props}\n />\n))\nCommandList.displayName = CommandPrimitive.List.displayName\n\nexport const CommandEmpty = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Empty>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>\n>((props, ref) => (\n <CommandPrimitive.Empty ref={ref} className=\"py-6 text-center text-sm\" {...props} />\n))\nCommandEmpty.displayName = CommandPrimitive.Empty.displayName\n\nexport const CommandGroup = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Group>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Group\n ref={ref}\n className={cn(\n 'overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground',\n className,\n )}\n {...props}\n />\n))\nCommandGroup.displayName = CommandPrimitive.Group.displayName\n\nexport const CommandSeparator = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Separator ref={ref} className={cn('-mx-1 h-px bg-border/40', className)} {...props} />\n))\nCommandSeparator.displayName = CommandPrimitive.Separator.displayName\n\nexport const CommandItem = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',\n className,\n )}\n {...props}\n />\n))\nCommandItem.displayName = CommandPrimitive.Item.displayName\n\nexport const CommandShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>): React.ReactElement => (\n <span\n className={cn('ml-auto text-xs tracking-widest text-muted-foreground', className)}\n {...props}\n />\n)\nCommandShortcut.displayName = 'CommandShortcut'\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{a as e,n as t}from"./createLucideIcon-CUopU_LC.js";import{S as n,s as r}from"./with-selector-NDLhu4dT.js";import{n as i}from"./refresh-cw-DHvUQTMb.js";import{s as a}from"./dist-Dpg8xy_r.js";import{a as o,i as s,n as c,s as l,t as u}from"./calendar-nvD_z7KQ.js";import{a as d,i as f,n as p}from"./useQueries-BCUhWYX4.js";import{Y as m}from"./index-BL8keDxQ.js";var h=e(t(),1),g=n(),_=`yyyy-MM-dd`,v=`yyyy-MM-dd'T'HH:mm`,y=`yyyy-MM-dd HH:mm`;function b(e){if(!e)return;let t=e.length<=10?s(e,_,new Date):c(e);return Number.isNaN(t.getTime())?void 0:t}function x(e,t){let n=e.trim();if(n===``)return;let r=t===`datetime`?[v,y,`yyyy-MM-dd'T'HH:mm:ss`,_]:[_];for(let e of r){let t=s(n,e,new Date);if(l(t))return t}let i=c(n);return l(i)?i:null}function S(e,t){return e?o(e,t===`datetime`?y:_):``}function C(e,t){return t===`datetime`?e.toISOString():o(e,_)}function w({value:e,onChange:t,mode:n=`date`,disabled:s,placeholder:c,className:l,inputClassName:_,ariaLabel:v,openCalendarLabel:y=`Open calendar`,timeLabel:w=`Time`}){let[T,E]=h.useState(!1),D=b(e),[O,k]=h.useState(()=>S(D,n)),A=h.useRef(S(D,n));h.useEffect(()=>{let e=S(D,n);e!==A.current&&(A.current=e,k(e))},[e,n]);let j=D?o(D,`HH:mm`):`00:00`,M=e=>{if(!e){A.current=``,k(``),t(``);return}if(n===`datetime`){let[t,n]=j.split(`:`).map(Number);e.setHours(t??0,n??0,0,0)}let r=S(e,n);A.current=r,k(r),t(C(e,n))},N=e=>{if(!D)return;let[r,i]=e.split(`:`).map(Number),a=new Date(D);a.setHours(r??0,i??0,0,0);let o=S(a,n);A.current=o,k(o),t(C(a,n))},P=e=>{let r=e.target.value;k(r);let i=x(r,n);i===void 0?(A.current=``,t(``)):i&&(A.current=S(i,n),t(C(i,n)))},F=()=>{if(x(O,n)===null){let e=S(D,n);A.current=e,k(e)}},I=c??(n===`datetime`?`YYYY-MM-DD HH:MM`:`YYYY-MM-DD`);return(0,g.jsxs)(p,{open:T,onOpenChange:E,children:[(0,g.jsxs)(`div`,{className:r(`relative w-full`,l),children:[(0,g.jsx)(m,{type:`text`,inputMode:`numeric`,value:O,onChange:P,onBlur:F,placeholder:I,disabled:s,"aria-label":v,className:r(_,`pr-10`)}),(0,g.jsx)(d,{asChild:!0,children:(0,g.jsx)(a,{type:`button`,variant:`ghost`,size:`icon`,disabled:s,"aria-label":y,className:`absolute right-1 top-1/2 size-8 -translate-y-1/2 text-muted-foreground hover:text-foreground`,children:(0,g.jsx)(i,{className:`size-4`})})})]}),(0,g.jsxs)(f,{className:`w-auto p-0`,align:`start`,children:[(0,g.jsx)(u,{mode:`single`,selected:D,defaultMonth:D,onSelect:e=>{M(e),n===`date`&&E(!1)},autoFocus:!0}),n===`datetime`&&(0,g.jsxs)(`div`,{className:`flex items-center gap-2 border-t border-border p-3`,children:[(0,g.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:w}),(0,g.jsx)(m,{type:`time`,value:j,disabled:!D,onChange:e=>N(e.target.value),className:`h-8 w-32`})]})]})]})}w.displayName=`DatePicker`;export{w as t};
2
+ //# sourceMappingURL=date-picker-C4HcgidQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-picker-C4HcgidQ.js","names":[],"sources":["../../../../ui/src/components/date-picker.tsx"],"sourcesContent":["// Popover-driven date / datetime input. Single picker handles both modes:\n// pass `mode=\"datetime\"` to surface an HH:MM time input below the calendar.\n//\n// Value is an ISO string: `yyyy-MM-dd` for dates, a full UTC instant\n// (`toISOString()`) for datetime — offset-less wall time would be re-read in\n// the server's timezone and drift. Incoming values may be in any ISO shape;\n// only what we emit is normalised. The trigger is a real text\n// input so users can also type the date manually; clicks on the trailing\n// calendar icon open the popover with the inline picker.\n\nimport * as React from 'react'\nimport { format, isValid, parse, parseISO } from 'date-fns'\nimport { Calendar as CalendarIcon } from 'lucide-react'\nimport { cn } from '../lib/utils.js'\nimport { Button } from './button.js'\nimport { Calendar } from './calendar.js'\nimport { Input } from './input.js'\nimport { Popover, PopoverContent, PopoverTrigger } from './popover.js'\n\nexport type DatePickerMode = 'date' | 'datetime'\n\nexport interface DatePickerProps {\n value: string | null | undefined\n onChange(next: string): void\n mode?: DatePickerMode\n disabled?: boolean\n placeholder?: string\n /** Applied to the outer wrapper div (controls width, etc.). */\n className?: string\n /** Applied to the inner text Input — use to override height / font size. */\n inputClassName?: string\n /** ARIA label forwarded to the trigger input (mobile users / screen readers). */\n ariaLabel?: string\n /** ARIA label for the calendar icon button. Default: \"Open calendar\". */\n openCalendarLabel?: string\n /** Label for the time input shown in datetime mode. Default: \"Time\". */\n timeLabel?: string\n}\n\nconst DATE_FMT = 'yyyy-MM-dd'\nconst DATETIME_FMT = \"yyyy-MM-dd'T'HH:mm\"\n// Friendlier display format for the datetime input — space instead of `T`.\nconst DATETIME_DISPLAY_FMT = 'yyyy-MM-dd HH:mm'\n\nfunction parseValue(value: string | null | undefined): Date | undefined {\n if (!value) return undefined\n const direct = value.length <= 10 ? parse(value, DATE_FMT, new Date()) : parseISO(value)\n return Number.isNaN(direct.getTime()) ? undefined : direct\n}\n\n/**\n * Try to parse a manually-typed string in any of the supported shapes.\n * Returns `undefined` on blank, `null` on invalid (non-blank) input so the\n * caller can distinguish \"cleared\" from \"typo\".\n */\nfunction parseTyped(raw: string, mode: DatePickerMode): Date | undefined | null {\n const trimmed = raw.trim()\n if (trimmed === '') return undefined\n const candidates =\n mode === 'datetime'\n ? [DATETIME_FMT, DATETIME_DISPLAY_FMT, \"yyyy-MM-dd'T'HH:mm:ss\", DATE_FMT]\n : [DATE_FMT]\n for (const fmt of candidates) {\n const parsed = parse(trimmed, fmt, new Date())\n if (isValid(parsed)) return parsed\n }\n // Last resort: ISO with timezone, etc.\n const iso = parseISO(trimmed)\n return isValid(iso) ? iso : null\n}\n\nfunction formatForInput(date: Date | undefined, mode: DatePickerMode): string {\n if (!date) return ''\n return format(date, mode === 'datetime' ? DATETIME_DISPLAY_FMT : DATE_FMT)\n}\n\n// Datetime values go out as a UTC instant, never as browser-local wall time.\n// A `yyyy-MM-ddTHH:mm` string carries no offset, so whoever resolves it later\n// (`new Date(...)` on the server) reads it in *that process's* timezone — a\n// browser/server timezone gap then shifts the stored instant on every save,\n// cumulatively. `date` mode keeps the bare `yyyy-MM-dd`: a date-only string is\n// spec'd to parse as UTC midnight, and it has no instant to preserve.\nfunction formatForApi(date: Date, mode: DatePickerMode): string {\n return mode === 'datetime' ? date.toISOString() : format(date, DATE_FMT)\n}\n\nexport function DatePicker({\n value,\n onChange,\n mode = 'date',\n disabled,\n placeholder,\n className,\n inputClassName,\n ariaLabel,\n openCalendarLabel = 'Open calendar',\n timeLabel = 'Time',\n}: DatePickerProps): React.ReactElement {\n const [open, setOpen] = React.useState(false)\n const date = parseValue(value)\n // Local draft for the text input — keeps user typing intact even when\n // intermediate strings don't yet parse.\n const [draft, setDraft] = React.useState(() => formatForInput(date, mode))\n // Re-sync draft whenever the canonical value changes from outside (e.g.\n // calendar selection or form reset). Compare via formatted shape so a noop\n // update doesn't clobber what the user is typing.\n const lastFormatted = React.useRef(formatForInput(date, mode))\n React.useEffect(() => {\n const next = formatForInput(date, mode)\n if (next !== lastFormatted.current) {\n lastFormatted.current = next\n setDraft(next)\n }\n }, [value, mode]) // eslint-disable-line react-hooks/exhaustive-deps\n\n const time = date ? format(date, 'HH:mm') : '00:00'\n\n const commitDate = (next: Date | undefined): void => {\n if (!next) {\n lastFormatted.current = ''\n setDraft('')\n onChange('')\n return\n }\n if (mode === 'datetime') {\n const [h, m] = time.split(':').map(Number)\n next.setHours(h ?? 0, m ?? 0, 0, 0)\n }\n const formatted = formatForInput(next, mode)\n lastFormatted.current = formatted\n setDraft(formatted)\n onChange(formatForApi(next, mode))\n }\n\n const setTime = (raw: string): void => {\n if (!date) return\n const [h, m] = raw.split(':').map(Number)\n const next = new Date(date)\n next.setHours(h ?? 0, m ?? 0, 0, 0)\n const formatted = formatForInput(next, mode)\n lastFormatted.current = formatted\n setDraft(formatted)\n onChange(formatForApi(next, mode))\n }\n\n const handleInputChange: React.ChangeEventHandler<HTMLInputElement> = (e) => {\n const text = e.target.value\n setDraft(text)\n const parsed = parseTyped(text, mode)\n if (parsed === undefined) {\n // cleared\n lastFormatted.current = ''\n onChange('')\n } else if (parsed) {\n lastFormatted.current = formatForInput(parsed, mode)\n onChange(formatForApi(parsed, mode))\n }\n // parsed === null → keep draft, don't fire onChange yet\n }\n\n const handleInputBlur: React.FocusEventHandler<HTMLInputElement> = () => {\n // On blur, if the draft is invalid, snap back to the canonical value.\n const parsed = parseTyped(draft, mode)\n if (parsed === null) {\n const restored = formatForInput(date, mode)\n lastFormatted.current = restored\n setDraft(restored)\n }\n }\n\n const inputPlaceholder =\n placeholder ?? (mode === 'datetime' ? 'YYYY-MM-DD HH:MM' : 'YYYY-MM-DD')\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <div className={cn('relative w-full', className)}>\n <Input\n type=\"text\"\n inputMode=\"numeric\"\n value={draft}\n onChange={handleInputChange}\n onBlur={handleInputBlur}\n placeholder={inputPlaceholder}\n disabled={disabled}\n aria-label={ariaLabel}\n className={cn(inputClassName, 'pr-10')}\n />\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n disabled={disabled}\n aria-label={openCalendarLabel}\n className=\"absolute right-1 top-1/2 size-8 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <CalendarIcon className=\"size-4\" />\n </Button>\n </PopoverTrigger>\n </div>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <Calendar\n mode=\"single\"\n selected={date}\n defaultMonth={date}\n onSelect={(d) => {\n commitDate(d)\n if (mode === 'date') setOpen(false)\n }}\n autoFocus\n />\n {mode === 'datetime' && (\n <div className=\"flex items-center gap-2 border-t border-border p-3\">\n <span className=\"text-xs text-muted-foreground\">{timeLabel}</span>\n <Input\n type=\"time\"\n value={time}\n disabled={!date}\n onChange={(e) => setTime(e.target.value)}\n className=\"h-8 w-32\"\n />\n </div>\n )}\n </PopoverContent>\n </Popover>\n )\n}\nDatePicker.displayName = 'DatePicker'\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{a as e,n as t}from"./createLucideIcon-CUopU_LC.js";import{S as n}from"./with-selector-NDLhu4dT.js";import{t as r}from"./trash-2-DhyKQCKv.js";import{t as i}from"./circle-alert-0EyKeic4.js";import{t as a}from"./plus-Dk-FzitW.js";import{t as o}from"./save-Cd3oR3Sj.js";import{t as s}from"./sparkles-CqF0zjrF.js";import{t as c}from"./x-C3kLunD6.js";import{s as l}from"./dist-Dpg8xy_r.js";import{s as u}from"./empty-DAEAjFd3.js";import{Ct as d,F as f,K as p,N as m,Q as h,U as g,et as _,i as v,j as ee,n as y,rt as b}from"./router-wFvtgo77.js";import{c as te,l as x}from"./action-component-host-CXIbN-8V.js";import{a as S,i as C,n as w,t as T}from"./card-4cS4uWCP.js";import{a as ne,c as E,i as D,n as re,o as ie,r as O,s as ae,t as oe}from"./zod-BbfEBA4A.js";import{l as se,n as ce,u as k}from"./property-renderer-DyCwdVkh.js";import{t as le}from"./revisions-button-DXZAh2Lu.js";import{F as A,I as j,L as M,N,P,R as F,_ as I,b as ue,ft as de,g as fe,h as pe,i as L,m as me,n as he,ot as R,r as ge,v as _e,x as ve,y as ye}from"./index-t4woXGa-.js";var z=e(t(),1),B=n();function be({resourceId:e,onClose:t,onFilled:n}){let{t:r}=_(),i=b(),a=L(),[o,c]=z.useState(null),[u,f]=z.useState(!1),p=z.useRef(null),[m,h]=z.useState(null);z.useEffect(()=>{if(!o){h(null);return}let e=URL.createObjectURL(o);return h(e),()=>URL.revokeObjectURL(e)},[o]),z.useEffect(()=>()=>{p.current?.abort(`dialog unmounted`)},[]);let g=async()=>{if(!o||u)return;let r=new AbortController;p.current=r,f(!0);try{let{values:s}=await i.aiFillFromImage(e,o,{signal:r.signal});if(Object.keys(s).length===0){a.error({key:`aiFill:noValues`});return}n(s),t()}catch(e){if(r.signal.aborted)return;let{message:t}=d(e);a.error({key:`aiFill:errorGeneric`,params:{message:t}},{description:t})}finally{f(!1),p.current=null}},v=()=>{u&&p.current?.abort(`dialog closed`),t()};return(0,B.jsx)(N,{open:!0,onOpenChange:e=>{e||v()},children:(0,B.jsxs)(P,{className:`w-full max-w-md`,children:[(0,B.jsxs)(M,{children:[(0,B.jsxs)(F,{className:`flex items-center gap-2`,children:[(0,B.jsx)(s,{className:`size-4`}),r(`aiFill:dialogTitle`)]}),(0,B.jsx)(A,{children:r(`aiFill:dialogDescription`)})]}),(0,B.jsx)(k,{accept:`image/*`,value:o?o.name:null,displayName:o?.name??null,previewUrl:m,uploading:u,uploadingName:o?.name,disabled:u,onFileSelect:e=>c(e),onRemove:()=>c(null),labels:{chooseFile:r(`common:chooseFile`),dragAndDrop:r(`common:dragAndDrop`),chooseAFile:r(`common:chooseAFile`),uploading:r(`aiFill:processing`),uploadingFile:r(`aiFill:processing`),removeFile:r(`common:removeFile`)}}),(0,B.jsxs)(j,{children:[(0,B.jsx)(l,{variant:`outline`,onClick:v,children:r(`common:cancel`)}),(0,B.jsxs)(l,{onClick:()=>void g(),disabled:!o||u,children:[u?(0,B.jsx)(R,{className:`size-4 animate-spin`}):(0,B.jsx)(s,{className:`size-4`}),r(`aiFill:fillButton`)]})]})]})})}function xe(e,t){if(t!=null){if(e.availableValues?.length){if(typeof t!=`string`)return;let n=t.trim();if(n===``)return;let r=n.toLowerCase();return(e.availableValues.find(e=>e.value===n)??e.availableValues.find(e=>e.value.toLowerCase()===r)??e.availableValues.find(e=>e.label.toLowerCase()===r))?.value}if(e.reference)return typeof t==`string`||typeof t==`number`?t:void 0;switch(e.type){case`bigint`:case`biginteger`:{if(typeof t==`bigint`)return t.toString();if(typeof t==`number`)return!Number.isFinite(t)||!Number.isInteger(t)?void 0:String(t);if(typeof t!=`string`)return;let e=t.trim().replace(/[\s_]/g,``);return/^-?\d+$/.test(e)?e:void 0}case`number`:case`float`:case`currency`:case`money`:case`decimal`:case`integer`:{if(typeof t==`number`)return Number.isFinite(t)?t:void 0;if(typeof t!=`string`)return;let n=t.trim().replace(/[^\d.,\-+eE]/g,``);if(n===``||n===`-`||n===`+`)return;let r=n.lastIndexOf(`.`)>=n.lastIndexOf(`,`)?n.replace(/,/g,``):n.replace(/\./g,``).replace(`,`,`.`),i=Number(r);return Number.isFinite(i)?e.type===`integer`?Math.trunc(i):i:void 0}case`boolean`:if(typeof t==`boolean`)return t;if(typeof t==`number`)return t!==0;if(typeof t==`string`){let e=t.trim().toLowerCase();if([`true`,`yes`,`y`,`1`,`on`].includes(e))return!0;if([`false`,`no`,`n`,`0`,`off`].includes(e))return!1}return;case`date`:case`datetime`:case`datetime-local`:return typeof t==`string`&&/^\d{4}-\d{2}-\d{2}/.test(t.trim())?t.trim():void 0;default:return t}}}function V({resourceId:e,recordId:t}){let n=p(e),b=g(e,t),E=ee(e),D=h(e),k=m(e),A=f(),j=v(),{t:M,locale:N}=_(),P=L(),F=ge(),R=z.useMemo(()=>n?se(n.properties,`edit`,n.propertyOrder?.edit).filter(e=>!e.isDisabled):[],[n]),V=z.useRef(()=>({})),we=z.useMemo(()=>re(R,M,()=>V.current()),[R,N]),H=z.useMemo(()=>{let e={};for(let t of R)e[t.path]=O(t);return e},[R]),U=ae({resolver:oe(we),defaultValues:H});V.current=U.getValues;let W=z.useRef(void 0),G=!t,K=G?`modern-admin:draft:${e}`:null,q=z.useRef(void 0),J=z.useRef(!1),Y=z.useRef(!1);z.useEffect(()=>{if(!t){if(W.current=void 0,q.current===e||R.length===0)return;q.current=e,Y.current=!1;let t=null;if(K&&typeof window<`u`)try{let e=window.localStorage.getItem(K);e&&(t=JSON.parse(e))}catch{}if(t&&typeof t==`object`){let e={...H};for(let n of R)Object.prototype.hasOwnProperty.call(t,n.path)&&(e[n.path]=t[n.path]);J.current=!0,U.reset(e),P.raw(M(`common:draftRestored`),{position:`bottom-center`,duration:8e3,action:{label:M(`common:undoDraftRestore`),onClick:()=>{J.current=!0,U.reset(H);try{K&&window.localStorage.removeItem(K)}catch{}}}})}else U.reset(H);return}if(R.length===0||!b.data||W.current===t)return;W.current=t,q.current=void 0;let n=b.data.record.params,r={...H};for(let e of R){let t=n[e.path];e.type===`boolean`?r[e.path]=!!t:t==null?r[e.path]=O(e):r[e.path]=t}U.reset(r)},[t,b.data,R,H,U,K,e,P,M]),z.useEffect(()=>{if(!G||!K||R.length===0||typeof window>`u`)return;let e=U.watch(e=>{if(Y.current)return;if(J.current){J.current=!1;return}let t=!1,n={};for(let r of R){let i=e[r.path];r.type!==`password`&&(i instanceof File||Array.isArray(i)&&i.some(e=>e instanceof File)||(n[r.path]=i,Ce(i,H[r.path])||(t=!0)))}try{t?window.localStorage.setItem(K,JSON.stringify(n)):window.localStorage.removeItem(K)}catch{}});return()=>e.unsubscribe()},[G,K,R,H,U]);let Te=z.useCallback(()=>{if(q.current=void 0,Y.current=!0,!(!K||typeof window>`u`))try{window.localStorage.removeItem(K)}catch{}},[K]),[X,Z]=z.useState(null),[Ee,De]=z.useState(!1),Oe=z.useMemo(()=>!!n?.actions.find(e=>e.custom?.aiFill===!0),[n]),ke=z.useCallback(e=>{let t=new Map(R.map(e=>[e.path,e])),n={},r=U.getValues(),i=[];for(let[a,o]of Object.entries(e)){let e=t.get(a);if(!e)continue;let s=xe(e,o);s!==void 0&&(i.push([a,s]),n[a]=r[a])}for(let[e,t]of i)U.setValue(e,t,{shouldDirty:!0,shouldValidate:!0});if(i.length===0){P.error({key:`aiFill:noValues`});return}P.raw(M(`aiFill:applied`,{count:i.length}),{position:`bottom-center`,duration:8e3,action:{label:M(`common:undoDraftRestore`),onClick:()=>{for(let[e,t]of Object.entries(n))U.setValue(e,t,{shouldDirty:!0,shouldValidate:!0})}}})},[R,U,P,M]),Ae=async n=>{Z(null);try{let r=G?await E.mutateAsync(n):await D.mutateAsync({id:t,payload:n}),i=r.record.errors;if(i&&Object.keys(i).length>0){for(let[e,t]of Object.entries(i)){let n=typeof t==`string`?t:t?.message??M(`common:invalidValue`);U.setError(e,{type:`server`,message:n})}r.record.baseError&&Z(String(r.record.baseError)),P.error({key:`toast:validationFailed`});return}G&&Te(),P.success({key:G?`toast:created`:`toast:saved`}),j({name:`show`,resourceId:e,recordId:String(r.record.id)})}catch(e){let t=e instanceof Error?e.message:String(e);Z(t),P.error({key:G?`toast:createFailed`:`toast:saveFailed`},{description:t})}},Q=()=>{P.error({key:`toast:validationFailed`})},je=async()=>{t&&await F.confirm({title:M(`common:confirmDelete`),confirmLabel:M(`common:delete`),destructive:!0})&&(await k.mutateAsync(t),j({name:`list`,resourceId:e}))},$=!G&&(b.isLoading||W.current!==t);if(he(`mod+s`,()=>{U.formState.isSubmitting||$||U.handleSubmit(Ae,Q)()},{description:M(G?`common:create`:`common:save`)}),!n)return(0,B.jsx)(`div`,{className:`p-6`,children:M(`common:loading`)});if(!G&&b.isError){let{status:r,message:a}=d(b.error),o=M(r===404?`errors:notFound`:r===403?`errors:forbidden`:`errors:server`);return(0,B.jsxs)(`div`,{className:`flex min-h-full flex-col gap-4`,children:[(0,B.jsx)(te,{items:[x(M(`common:home`)),{label:n.name,to:{name:`list`,resourceId:e}},{label:t??``}]}),(0,B.jsxs)(T,{children:[(0,B.jsxs)(C,{className:`flex flex-row items-center justify-between gap-3`,children:[(0,B.jsxs)(S,{className:`truncate`,children:[n.name,` #`,t]}),(0,B.jsx)(y,{to:{name:`list`,resourceId:e},children:(0,B.jsx)(l,{variant:`ghost`,size:`sm`,children:M(`common:back`)})})]}),(0,B.jsx)(w,{children:(0,B.jsxs)(`div`,{className:`flex items-start gap-3 rounded-lg border border-destructive/50 bg-destructive/10 p-4 dark:bg-destructive/15`,children:[(0,B.jsx)(i,{className:`mt-0.5 size-5 shrink-0 text-destructive`}),(0,B.jsxs)(`div`,{className:`space-y-1 text-sm`,children:[(0,B.jsx)(`p`,{className:`font-semibold text-destructive`,children:o}),(0,B.jsx)(`p`,{className:`text-destructive/90`,children:a})]})]})})]})]})}let Me=_e(),Ne=b.data?.record.title||t;return(0,B.jsxs)(`div`,{className:`flex min-h-full flex-col gap-4`,children:[(0,B.jsx)(te,{items:[x(M(`common:home`)),{label:n.name,to:{name:`list`,resourceId:e}},...G?[{label:M(`common:new`)}]:[{label:Ne??``,to:{name:`show`,resourceId:e,recordId:t}},{label:M(`common:edit`)}]]}),(0,B.jsxs)(T,{className:`flex-1`,children:[(0,B.jsxs)(C,{className:`flex flex-row items-center justify-between gap-3`,children:[(0,B.jsx)(S,{className:`truncate`,children:G?M(`common:newRecord`,{name:n.name}):M(`common:editRecord`,{name:n.name,id:t??``})}),(0,B.jsxs)(`div`,{className:`flex shrink-0 gap-2`,children:[Oe&&(0,B.jsxs)(l,{type:`button`,variant:`outline`,size:`sm`,disabled:U.formState.isSubmitting||$,onClick:()=>De(!0),children:[(0,B.jsx)(s,{className:`size-4`}),(0,B.jsx)(`span`,{className:`hidden sm:inline`,children:M(`aiFill:button`)})]}),!G&&(0,B.jsxs)(B.Fragment,{children:[A.history&&(0,B.jsx)(le,{resourceId:e,recordId:t}),(0,B.jsx)(y,{to:{name:`show`,resourceId:e,recordId:t},children:(0,B.jsxs)(l,{variant:`outline`,size:`sm`,"aria-label":M(`common:show`),children:[(0,B.jsx)(de,{className:`size-4`}),(0,B.jsx)(`span`,{className:`hidden sm:inline`,children:M(`common:show`)})]})}),(0,B.jsxs)(l,{variant:`destructive`,size:`sm`,disabled:k.isPending||U.formState.isSubmitting||$,onClick:()=>void je(),"aria-label":M(`common:delete`),children:[(0,B.jsx)(r,{className:`size-4`}),(0,B.jsx)(`span`,{className:`hidden sm:inline`,children:M(`common:delete`)})]})]})]})]}),(0,B.jsx)(ne,{...U,children:(0,B.jsx)(`form`,{id:`edit-record-form`,onSubmit:U.handleSubmit(Ae,Q),children:(0,B.jsx)(w,{className:`gap-4 pb-6 [column-fill:_balance] md:columns-2`,children:R.map(t=>(0,B.jsx)(Se,{control:U.control,property:t,children:(0,B.jsx)(ie,{control:U.control,name:t.path,render:({field:n,fieldState:r})=>(0,B.jsxs)(me,{"data-invalid":r.error?!0:void 0,className:`mb-8 break-inside-avoid`,children:[(0,B.jsxs)(fe,{htmlFor:n.name,children:[t.label,t.description?(0,B.jsx)(u,{content:t.description,ariaLabel:t.description}):null,t.isRequired&&(0,B.jsx)(`span`,{className:`ml-1 text-destructive`,children:`*`})]}),(0,B.jsx)(ce,{property:t,value:n.value,onChange:n.onChange,disabled:U.formState.isSubmitting,resourceId:e}),r.error?.message&&(0,B.jsx)(pe,{children:r.error.message})]})})},t.path))})})})]}),Ee&&(0,B.jsx)(be,{resourceId:e,onClose:()=>De(!1),onFilled:ke}),(0,B.jsx)(`div`,{className:`sticky bottom-0 -mb-px z-20 -mx-2 border-t border-border bg-card px-2 py-3 pr-14 sm:-mx-6 sm:px-6 sm:pr-16`,children:(0,B.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,B.jsx)(`div`,{children:X&&(0,B.jsx)(`span`,{className:`text-sm text-destructive`,children:X})}),(0,B.jsxs)(`div`,{className:`flex gap-2`,children:[(0,B.jsxs)(l,{type:`button`,variant:`ghost`,onClick:()=>j(G?{name:`list`,resourceId:e}:{name:`show`,resourceId:e,recordId:t}),"aria-label":M(`common:cancel`),children:[(0,B.jsx)(c,{className:`size-4`}),(0,B.jsx)(`span`,{className:`hidden sm:inline`,children:M(`common:cancel`)})]}),(0,B.jsxs)(ye,{children:[(0,B.jsx)(ve,{asChild:!0,children:(0,B.jsxs)(l,{type:`submit`,form:`edit-record-form`,disabled:U.formState.isSubmitting||$,"aria-label":M(G?`common:create`:`common:save`),children:[G?(0,B.jsx)(a,{className:`size-4`}):(0,B.jsx)(o,{className:`size-4`}),(0,B.jsx)(`span`,{className:`hidden sm:inline`,children:M(G?`common:create`:`common:save`)})]})}),(0,B.jsxs)(ue,{className:`flex items-center gap-1.5`,children:[(0,B.jsx)(`span`,{children:M(G?`common:create`:`common:save`)}),(0,B.jsxs)(`span`,{className:`inline-flex items-center gap-0.5`,children:[(0,B.jsx)(I,{children:Me}),(0,B.jsx)(`span`,{className:`text-muted-foreground`,children:`+`}),(0,B.jsx)(I,{children:`S`})]})]})]})]})]})})]})}function Se({control:e,property:t,children:n}){let r=t.showWhen,i=E({control:e,name:r?.field??t.path});return r?D(r,{[r.field]:i})?(0,B.jsx)(B.Fragment,{children:n}):null:(0,B.jsx)(B.Fragment,{children:n})}function Ce(e,t){if(e===t)return!0;let n=e==null||e===``,r=t==null||t===``;if(n&&r)return!0;if(n||r||typeof e!=typeof t)return!1;if(typeof e==`object`)try{return JSON.stringify(e)===JSON.stringify(t)}catch{return!1}return!1}export{V as ResourceEditPage};
2
- //# sourceMappingURL=edit-page-DCRB9Y_q.js.map
1
+ import{a as e,n as t}from"./createLucideIcon-CUopU_LC.js";import{S as n}from"./with-selector-NDLhu4dT.js";import{t as r}from"./trash-2-DhyKQCKv.js";import{t as i}from"./circle-alert-0EyKeic4.js";import{t as a}from"./plus-Dk-FzitW.js";import{t as o}from"./save-Cd3oR3Sj.js";import{t as s}from"./sparkles-CqF0zjrF.js";import{t as c}from"./x-C3kLunD6.js";import{s as l}from"./dist-Dpg8xy_r.js";import{s as u}from"./empty-Cposcczv.js";import{Ct as d,F as f,K as p,N as m,Q as h,U as g,et as _,i as v,j as ee,n as y,rt as b}from"./router-wFvtgo77.js";import{c as te,l as x}from"./action-component-host-BrEZDHZt.js";import{a as S,i as C,n as w,t as T}from"./card-4cS4uWCP.js";import{a as ne,c as E,i as D,n as re,o as ie,r as O,s as ae,t as oe}from"./zod-BrelKLfy.js";import{l as se,n as ce,u as k}from"./property-renderer-B8Md-EqW.js";import{t as le}from"./revisions-button-0WtL6bsZ.js";import{F as A,I as j,L as M,N,P,R as F,_ as I,b as ue,ft as de,g as fe,h as pe,i as L,m as me,n as he,ot as R,r as ge,v as _e,x as ve,y as ye}from"./index-BL8keDxQ.js";var z=e(t(),1),B=n();function be({resourceId:e,onClose:t,onFilled:n}){let{t:r}=_(),i=b(),a=L(),[o,c]=z.useState(null),[u,f]=z.useState(!1),p=z.useRef(null),[m,h]=z.useState(null);z.useEffect(()=>{if(!o){h(null);return}let e=URL.createObjectURL(o);return h(e),()=>URL.revokeObjectURL(e)},[o]),z.useEffect(()=>()=>{p.current?.abort(`dialog unmounted`)},[]);let g=async()=>{if(!o||u)return;let r=new AbortController;p.current=r,f(!0);try{let{values:s}=await i.aiFillFromImage(e,o,{signal:r.signal});if(Object.keys(s).length===0){a.error({key:`aiFill:noValues`});return}n(s),t()}catch(e){if(r.signal.aborted)return;let{message:t}=d(e);a.error({key:`aiFill:errorGeneric`,params:{message:t}},{description:t})}finally{f(!1),p.current=null}},v=()=>{u&&p.current?.abort(`dialog closed`),t()};return(0,B.jsx)(N,{open:!0,onOpenChange:e=>{e||v()},children:(0,B.jsxs)(P,{className:`w-full max-w-md`,children:[(0,B.jsxs)(M,{children:[(0,B.jsxs)(F,{className:`flex items-center gap-2`,children:[(0,B.jsx)(s,{className:`size-4`}),r(`aiFill:dialogTitle`)]}),(0,B.jsx)(A,{children:r(`aiFill:dialogDescription`)})]}),(0,B.jsx)(k,{accept:`image/*`,value:o?o.name:null,displayName:o?.name??null,previewUrl:m,uploading:u,uploadingName:o?.name,disabled:u,onFileSelect:e=>c(e),onRemove:()=>c(null),labels:{chooseFile:r(`common:chooseFile`),dragAndDrop:r(`common:dragAndDrop`),chooseAFile:r(`common:chooseAFile`),uploading:r(`aiFill:processing`),uploadingFile:r(`aiFill:processing`),removeFile:r(`common:removeFile`)}}),(0,B.jsxs)(j,{children:[(0,B.jsx)(l,{variant:`outline`,onClick:v,children:r(`common:cancel`)}),(0,B.jsxs)(l,{onClick:()=>void g(),disabled:!o||u,children:[u?(0,B.jsx)(R,{className:`size-4 animate-spin`}):(0,B.jsx)(s,{className:`size-4`}),r(`aiFill:fillButton`)]})]})]})})}function xe(e,t){if(t!=null){if(e.availableValues?.length){if(typeof t!=`string`)return;let n=t.trim();if(n===``)return;let r=n.toLowerCase();return(e.availableValues.find(e=>e.value===n)??e.availableValues.find(e=>e.value.toLowerCase()===r)??e.availableValues.find(e=>e.label.toLowerCase()===r))?.value}if(e.reference)return typeof t==`string`||typeof t==`number`?t:void 0;switch(e.type){case`bigint`:case`biginteger`:{if(typeof t==`bigint`)return t.toString();if(typeof t==`number`)return!Number.isFinite(t)||!Number.isInteger(t)?void 0:String(t);if(typeof t!=`string`)return;let e=t.trim().replace(/[\s_]/g,``);return/^-?\d+$/.test(e)?e:void 0}case`number`:case`float`:case`currency`:case`money`:case`decimal`:case`integer`:{if(typeof t==`number`)return Number.isFinite(t)?t:void 0;if(typeof t!=`string`)return;let n=t.trim().replace(/[^\d.,\-+eE]/g,``);if(n===``||n===`-`||n===`+`)return;let r=n.lastIndexOf(`.`)>=n.lastIndexOf(`,`)?n.replace(/,/g,``):n.replace(/\./g,``).replace(`,`,`.`),i=Number(r);return Number.isFinite(i)?e.type===`integer`?Math.trunc(i):i:void 0}case`boolean`:if(typeof t==`boolean`)return t;if(typeof t==`number`)return t!==0;if(typeof t==`string`){let e=t.trim().toLowerCase();if([`true`,`yes`,`y`,`1`,`on`].includes(e))return!0;if([`false`,`no`,`n`,`0`,`off`].includes(e))return!1}return;case`date`:case`datetime`:case`datetime-local`:return typeof t==`string`&&/^\d{4}-\d{2}-\d{2}/.test(t.trim())?t.trim():void 0;default:return t}}}function V({resourceId:e,recordId:t}){let n=p(e),b=g(e,t),E=ee(e),D=h(e),k=m(e),A=f(),j=v(),{t:M,locale:N}=_(),P=L(),F=ge(),R=z.useMemo(()=>n?se(n.properties,`edit`,n.propertyOrder?.edit).filter(e=>!e.isDisabled):[],[n]),V=z.useRef(()=>({})),we=z.useMemo(()=>re(R,M,()=>V.current()),[R,N]),H=z.useMemo(()=>{let e={};for(let t of R)e[t.path]=O(t);return e},[R]),U=ae({resolver:oe(we),defaultValues:H});V.current=U.getValues;let W=z.useRef(void 0),G=!t,K=G?`modern-admin:draft:${e}`:null,q=z.useRef(void 0),J=z.useRef(!1),Y=z.useRef(!1);z.useEffect(()=>{if(!t){if(W.current=void 0,q.current===e||R.length===0)return;q.current=e,Y.current=!1;let t=null;if(K&&typeof window<`u`)try{let e=window.localStorage.getItem(K);e&&(t=JSON.parse(e))}catch{}if(t&&typeof t==`object`){let e={...H};for(let n of R)Object.prototype.hasOwnProperty.call(t,n.path)&&(e[n.path]=t[n.path]);J.current=!0,U.reset(e),P.raw(M(`common:draftRestored`),{position:`bottom-center`,duration:8e3,action:{label:M(`common:undoDraftRestore`),onClick:()=>{J.current=!0,U.reset(H);try{K&&window.localStorage.removeItem(K)}catch{}}}})}else U.reset(H);return}if(R.length===0||!b.data||W.current===t)return;W.current=t,q.current=void 0;let n=b.data.record.params,r={...H};for(let e of R){let t=n[e.path];e.type===`boolean`?r[e.path]=!!t:t==null?r[e.path]=O(e):r[e.path]=t}U.reset(r)},[t,b.data,R,H,U,K,e,P,M]),z.useEffect(()=>{if(!G||!K||R.length===0||typeof window>`u`)return;let e=U.watch(e=>{if(Y.current)return;if(J.current){J.current=!1;return}let t=!1,n={};for(let r of R){let i=e[r.path];r.type!==`password`&&(i instanceof File||Array.isArray(i)&&i.some(e=>e instanceof File)||(n[r.path]=i,Ce(i,H[r.path])||(t=!0)))}try{t?window.localStorage.setItem(K,JSON.stringify(n)):window.localStorage.removeItem(K)}catch{}});return()=>e.unsubscribe()},[G,K,R,H,U]);let Te=z.useCallback(()=>{if(q.current=void 0,Y.current=!0,!(!K||typeof window>`u`))try{window.localStorage.removeItem(K)}catch{}},[K]),[X,Z]=z.useState(null),[Ee,De]=z.useState(!1),Oe=z.useMemo(()=>!!n?.actions.find(e=>e.custom?.aiFill===!0),[n]),ke=z.useCallback(e=>{let t=new Map(R.map(e=>[e.path,e])),n={},r=U.getValues(),i=[];for(let[a,o]of Object.entries(e)){let e=t.get(a);if(!e)continue;let s=xe(e,o);s!==void 0&&(i.push([a,s]),n[a]=r[a])}for(let[e,t]of i)U.setValue(e,t,{shouldDirty:!0,shouldValidate:!0});if(i.length===0){P.error({key:`aiFill:noValues`});return}P.raw(M(`aiFill:applied`,{count:i.length}),{position:`bottom-center`,duration:8e3,action:{label:M(`common:undoDraftRestore`),onClick:()=>{for(let[e,t]of Object.entries(n))U.setValue(e,t,{shouldDirty:!0,shouldValidate:!0})}}})},[R,U,P,M]),Ae=async n=>{Z(null);try{let r=G?await E.mutateAsync(n):await D.mutateAsync({id:t,payload:n}),i=r.record.errors;if(i&&Object.keys(i).length>0){for(let[e,t]of Object.entries(i)){let n=typeof t==`string`?t:t?.message??M(`common:invalidValue`);U.setError(e,{type:`server`,message:n})}r.record.baseError&&Z(String(r.record.baseError)),P.error({key:`toast:validationFailed`});return}G&&Te(),P.success({key:G?`toast:created`:`toast:saved`}),j({name:`show`,resourceId:e,recordId:String(r.record.id)})}catch(e){let t=e instanceof Error?e.message:String(e);Z(t),P.error({key:G?`toast:createFailed`:`toast:saveFailed`},{description:t})}},Q=()=>{P.error({key:`toast:validationFailed`})},je=async()=>{t&&await F.confirm({title:M(`common:confirmDelete`),confirmLabel:M(`common:delete`),destructive:!0})&&(await k.mutateAsync(t),j({name:`list`,resourceId:e}))},$=!G&&(b.isLoading||W.current!==t);if(he(`mod+s`,()=>{U.formState.isSubmitting||$||U.handleSubmit(Ae,Q)()},{description:M(G?`common:create`:`common:save`)}),!n)return(0,B.jsx)(`div`,{className:`p-6`,children:M(`common:loading`)});if(!G&&b.isError){let{status:r,message:a}=d(b.error),o=M(r===404?`errors:notFound`:r===403?`errors:forbidden`:`errors:server`);return(0,B.jsxs)(`div`,{className:`flex min-h-full flex-col gap-4`,children:[(0,B.jsx)(te,{items:[x(M(`common:home`)),{label:n.name,to:{name:`list`,resourceId:e}},{label:t??``}]}),(0,B.jsxs)(T,{children:[(0,B.jsxs)(C,{className:`flex flex-row items-center justify-between gap-3`,children:[(0,B.jsxs)(S,{className:`truncate`,children:[n.name,` #`,t]}),(0,B.jsx)(y,{to:{name:`list`,resourceId:e},children:(0,B.jsx)(l,{variant:`ghost`,size:`sm`,children:M(`common:back`)})})]}),(0,B.jsx)(w,{children:(0,B.jsxs)(`div`,{className:`flex items-start gap-3 rounded-lg border border-destructive/50 bg-destructive/10 p-4 dark:bg-destructive/15`,children:[(0,B.jsx)(i,{className:`mt-0.5 size-5 shrink-0 text-destructive`}),(0,B.jsxs)(`div`,{className:`space-y-1 text-sm`,children:[(0,B.jsx)(`p`,{className:`font-semibold text-destructive`,children:o}),(0,B.jsx)(`p`,{className:`text-destructive/90`,children:a})]})]})})]})]})}let Me=_e(),Ne=b.data?.record.title||t;return(0,B.jsxs)(`div`,{className:`flex min-h-full flex-col gap-4`,children:[(0,B.jsx)(te,{items:[x(M(`common:home`)),{label:n.name,to:{name:`list`,resourceId:e}},...G?[{label:M(`common:new`)}]:[{label:Ne??``,to:{name:`show`,resourceId:e,recordId:t}},{label:M(`common:edit`)}]]}),(0,B.jsxs)(T,{className:`flex-1`,children:[(0,B.jsxs)(C,{className:`flex flex-row items-center justify-between gap-3`,children:[(0,B.jsx)(S,{className:`truncate`,children:G?M(`common:newRecord`,{name:n.name}):M(`common:editRecord`,{name:n.name,id:t??``})}),(0,B.jsxs)(`div`,{className:`flex shrink-0 gap-2`,children:[Oe&&(0,B.jsxs)(l,{type:`button`,variant:`outline`,size:`sm`,disabled:U.formState.isSubmitting||$,onClick:()=>De(!0),children:[(0,B.jsx)(s,{className:`size-4`}),(0,B.jsx)(`span`,{className:`hidden sm:inline`,children:M(`aiFill:button`)})]}),!G&&(0,B.jsxs)(B.Fragment,{children:[A.history&&(0,B.jsx)(le,{resourceId:e,recordId:t}),(0,B.jsx)(y,{to:{name:`show`,resourceId:e,recordId:t},children:(0,B.jsxs)(l,{variant:`outline`,size:`sm`,"aria-label":M(`common:show`),children:[(0,B.jsx)(de,{className:`size-4`}),(0,B.jsx)(`span`,{className:`hidden sm:inline`,children:M(`common:show`)})]})}),(0,B.jsxs)(l,{variant:`destructive`,size:`sm`,disabled:k.isPending||U.formState.isSubmitting||$,onClick:()=>void je(),"aria-label":M(`common:delete`),children:[(0,B.jsx)(r,{className:`size-4`}),(0,B.jsx)(`span`,{className:`hidden sm:inline`,children:M(`common:delete`)})]})]})]})]}),(0,B.jsx)(ne,{...U,children:(0,B.jsx)(`form`,{id:`edit-record-form`,onSubmit:U.handleSubmit(Ae,Q),children:(0,B.jsx)(w,{className:`gap-4 pb-6 [column-fill:_balance] md:columns-2`,children:R.map(t=>(0,B.jsx)(Se,{control:U.control,property:t,children:(0,B.jsx)(ie,{control:U.control,name:t.path,render:({field:n,fieldState:r})=>(0,B.jsxs)(me,{"data-invalid":r.error?!0:void 0,className:`mb-8 break-inside-avoid`,children:[(0,B.jsxs)(fe,{htmlFor:n.name,children:[t.label,t.description?(0,B.jsx)(u,{content:t.description,ariaLabel:t.description}):null,t.isRequired&&(0,B.jsx)(`span`,{className:`ml-1 text-destructive`,children:`*`})]}),(0,B.jsx)(ce,{property:t,value:n.value,onChange:n.onChange,disabled:U.formState.isSubmitting,resourceId:e}),r.error?.message&&(0,B.jsx)(pe,{children:r.error.message})]})})},t.path))})})})]}),Ee&&(0,B.jsx)(be,{resourceId:e,onClose:()=>De(!1),onFilled:ke}),(0,B.jsx)(`div`,{className:`sticky bottom-0 -mb-px z-20 -mx-2 border-t border-border bg-card px-2 py-3 pr-14 sm:-mx-6 sm:px-6 sm:pr-16`,children:(0,B.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,B.jsx)(`div`,{children:X&&(0,B.jsx)(`span`,{className:`text-sm text-destructive`,children:X})}),(0,B.jsxs)(`div`,{className:`flex gap-2`,children:[(0,B.jsxs)(l,{type:`button`,variant:`ghost`,onClick:()=>j(G?{name:`list`,resourceId:e}:{name:`show`,resourceId:e,recordId:t}),"aria-label":M(`common:cancel`),children:[(0,B.jsx)(c,{className:`size-4`}),(0,B.jsx)(`span`,{className:`hidden sm:inline`,children:M(`common:cancel`)})]}),(0,B.jsxs)(ye,{children:[(0,B.jsx)(ve,{asChild:!0,children:(0,B.jsxs)(l,{type:`submit`,form:`edit-record-form`,disabled:U.formState.isSubmitting||$,"aria-label":M(G?`common:create`:`common:save`),children:[G?(0,B.jsx)(a,{className:`size-4`}):(0,B.jsx)(o,{className:`size-4`}),(0,B.jsx)(`span`,{className:`hidden sm:inline`,children:M(G?`common:create`:`common:save`)})]})}),(0,B.jsxs)(ue,{className:`flex items-center gap-1.5`,children:[(0,B.jsx)(`span`,{children:M(G?`common:create`:`common:save`)}),(0,B.jsxs)(`span`,{className:`inline-flex items-center gap-0.5`,children:[(0,B.jsx)(I,{children:Me}),(0,B.jsx)(`span`,{className:`text-muted-foreground`,children:`+`}),(0,B.jsx)(I,{children:`S`})]})]})]})]})]})})]})}function Se({control:e,property:t,children:n}){let r=t.showWhen,i=E({control:e,name:r?.field??t.path});return r?D(r,{[r.field]:i})?(0,B.jsx)(B.Fragment,{children:n}):null:(0,B.jsx)(B.Fragment,{children:n})}function Ce(e,t){if(e===t)return!0;let n=e==null||e===``,r=t==null||t===``;if(n&&r)return!0;if(n||r||typeof e!=typeof t)return!1;if(typeof e==`object`)try{return JSON.stringify(e)===JSON.stringify(t)}catch{return!1}return!1}export{V as ResourceEditPage};
2
+ //# sourceMappingURL=edit-page-CW7-FAPC.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"edit-page-DCRB9Y_q.js","names":[],"sources":["../../../../react/src/components/ai-fill-dialog.tsx","../../../../react/src/pages/edit-page.tsx"],"sourcesContent":["// AiFillDialog — dropzone + \"Recognize\" button that sends a single image to\n// the resource's `aiFill` action and forwards the extracted values to the\n// caller. The dialog is purely presentational regarding form state; the\n// edit page handles merging the returned values into the live form.\n\nimport * as React from 'react'\nimport { Sparkles, Loader2 } from 'lucide-react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n FileInput,\n} from '@modern-admin/ui'\nimport { useAdminClient } from '../provider.js'\nimport { useI18n } from '../i18n.js'\nimport { useNotify } from '../notify.js'\nimport { parseApiError } from '../client.js'\n\nexport interface AiFillDialogProps {\n resourceId: string\n onClose(): void\n /** Called with the extracted values map. Caller merges into form state. */\n onFilled(values: Record<string, unknown>): void\n}\n\nexport function AiFillDialog({\n resourceId,\n onClose,\n onFilled,\n}: AiFillDialogProps): React.ReactElement {\n const { t } = useI18n()\n const client = useAdminClient()\n const notify = useNotify()\n const [file, setFile] = React.useState<File | null>(null)\n const [busy, setBusy] = React.useState(false)\n const abortRef = React.useRef<AbortController | null>(null)\n\n // Use useEffect for createObjectURL to ensure cleanup is always paired with\n // creation and happens at the right time (avoiding the side-effect-in-useMemo\n // anti-pattern).\n const [previewUrl, setPreviewUrl] = React.useState<string | null>(null)\n React.useEffect(() => {\n if (!file) {\n setPreviewUrl(null)\n return\n }\n const url = URL.createObjectURL(file)\n setPreviewUrl(url)\n return () => URL.revokeObjectURL(url)\n }, [file])\n\n // Abort any in-flight request when the dialog unmounts.\n React.useEffect(() => {\n return () => {\n abortRef.current?.abort('dialog unmounted')\n }\n }, [])\n\n const handleFill = async (): Promise<void> => {\n if (!file || busy) return\n\n const ac = new AbortController()\n abortRef.current = ac\n setBusy(true)\n try {\n const { values } = await client.aiFillFromImage(resourceId, file, { signal: ac.signal })\n const count = Object.keys(values).length\n if (count === 0) {\n notify.error({ key: 'aiFill:noValues' })\n return\n }\n onFilled(values)\n // The undo toast is surfaced by the edit-page (applyAiFillValues); the\n // dialog only needs to close cleanly after handing off the values.\n onClose()\n } catch (err) {\n if (ac.signal.aborted) return // user-initiated close — silently ignore\n const { message } = parseApiError(err)\n notify.error(\n { key: 'aiFill:errorGeneric', params: { message } },\n { description: message },\n )\n } finally {\n setBusy(false)\n abortRef.current = null\n }\n }\n\n const handleClose = (): void => {\n if (busy) {\n abortRef.current?.abort('dialog closed')\n }\n onClose()\n }\n\n return (\n <Dialog open onOpenChange={(open) => { if (!open) handleClose() }}>\n <DialogContent className=\"w-full max-w-md\">\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <Sparkles className=\"size-4\" />\n {t('aiFill:dialogTitle')}\n </DialogTitle>\n <DialogDescription>{t('aiFill:dialogDescription')}</DialogDescription>\n </DialogHeader>\n\n <FileInput\n accept=\"image/*\"\n value={file ? file.name : null}\n displayName={file?.name ?? null}\n previewUrl={previewUrl}\n uploading={busy}\n uploadingName={file?.name}\n disabled={busy}\n onFileSelect={(f) => setFile(f)}\n onRemove={() => setFile(null)}\n labels={{\n chooseFile: t('common:chooseFile'),\n dragAndDrop: t('common:dragAndDrop'),\n chooseAFile: t('common:chooseAFile'),\n uploading: t('aiFill:processing'),\n uploadingFile: t('aiFill:processing'),\n removeFile: t('common:removeFile'),\n }}\n />\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={handleClose}>\n {t('common:cancel')}\n </Button>\n <Button onClick={() => void handleFill()} disabled={!file || busy}>\n {busy ? <Loader2 className=\"size-4 animate-spin\" /> : <Sparkles className=\"size-4\" />}\n {t('aiFill:fillButton')}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","// Edit / new page driven by react-hook-form + zodResolver. The Zod schema\n// is derived dynamically from the resource's editable PropertyJSON list via\n// `buildValidationSchema()` — every property type maps to the right runtime\n// check, with localized error messages. Field-level server errors from\n// `record.errors` are projected back onto the form via setError, and global\n// success/failure messages surface as toasts.\n\nimport * as React from 'react'\nimport { useForm, useWatch, type Control, type SubmitHandler } from 'react-hook-form'\nimport { zodResolver } from '@hookform/resolvers/zod'\nimport {\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Field,\n FieldError,\n FieldLabel,\n Form,\n FormField,\n InfoTooltip,\n Kbd,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n getModKeyLabel,\n} from '@modern-admin/ui'\nimport { AlertCircle, Eye, Plus, Save, Sparkles, Trash2, X } from 'lucide-react'\nimport { useCreateRecord, useDeleteRecord, useFeatures, useRecord, useResource, useUpdateRecord } from '../hooks.js'\nimport { parseApiError } from '../client.js'\nimport { PropertyEditor } from '../property-renderer.js'\nimport { Link, useNavigate } from '../router.js'\nimport { useI18n } from '../i18n.js'\nimport { useNotify } from '../notify.js'\nimport { useHotkey } from '../use-hotkey.js'\nimport { PageBreadcrumbs, homeCrumb } from '../breadcrumbs.js'\nimport type { BreadcrumbItemSpec } from '../breadcrumbs.js'\nimport { buildValidationSchema, defaultValueFor } from '../validation.js'\nimport { evaluateShowWhen } from '../show-when.js'\nimport type { PropertyJSON } from '../types.js'\nimport { useDialogs } from '../dialogs.js'\nimport { RevisionsButton } from '../components/revisions-button.js'\nimport { AiFillDialog } from '../components/ai-fill-dialog.js'\nimport { visibleRecordProperties } from '../relations.js'\n\nexport interface ResourceEditPageProps {\n resourceId: string\n recordId?: string\n}\n\n/**\n * Defensive coercion applied to values returned by `aiFillFromImage` before\n * they reach `form.setValue`. The backend already normalises numbers/dates/\n * enums/references; this is a last-line check so an unexpected stringy\n * number does not poison a numeric field's state and so out-of-domain enum\n * values are dropped rather than silently committed. Returns `undefined` to\n * mean \"drop this value, keep the existing form state\".\n */\nfunction coerceAiFillValue(property: PropertyJSON, value: unknown): unknown {\n if (value === null || value === undefined) return undefined\n // Enum-style: snap by exact / case-insensitive value or label.\n if (property.availableValues?.length) {\n if (typeof value !== 'string') return undefined\n const trimmed = value.trim()\n if (trimmed === '') return undefined\n const lower = trimmed.toLowerCase()\n const match = property.availableValues.find((v) => v.value === trimmed)\n ?? property.availableValues.find((v) => v.value.toLowerCase() === lower)\n ?? property.availableValues.find((v) => v.label.toLowerCase() === lower)\n return match?.value\n }\n // References: keep id-shaped scalars only (string or number).\n if (property.reference) {\n if (typeof value === 'string' || typeof value === 'number') return value\n return undefined\n }\n switch (property.type) {\n case 'bigint':\n case 'biginteger': {\n // BigInt values are transported as digit strings end-to-end (matches\n // BaseRecord.toJSON + the Prisma adapter's accept-string write path).\n // Never round-trip via Number() — values >2^53 would lose precision.\n if (typeof value === 'bigint') return value.toString()\n if (typeof value === 'number') {\n if (!Number.isFinite(value) || !Number.isInteger(value)) return undefined\n return String(value)\n }\n if (typeof value !== 'string') return undefined\n const trimmed = value.trim().replace(/[\\s_]/g, '')\n return /^-?\\d+$/.test(trimmed) ? trimmed : undefined\n }\n case 'number':\n case 'float':\n case 'currency':\n case 'money':\n case 'decimal':\n case 'integer': {\n if (typeof value === 'number') return Number.isFinite(value) ? value : undefined\n if (typeof value !== 'string') return undefined\n const trimmed = value.trim().replace(/[^\\d.,\\-+eE]/g, '')\n if (trimmed === '' || trimmed === '-' || trimmed === '+') return undefined\n const lastDot = trimmed.lastIndexOf('.')\n const lastComma = trimmed.lastIndexOf(',')\n const normalised = lastDot >= lastComma\n ? trimmed.replace(/,/g, '')\n : trimmed.replace(/\\./g, '').replace(',', '.')\n const n = Number(normalised)\n if (!Number.isFinite(n)) return undefined\n return property.type === 'integer' ? Math.trunc(n) : n\n }\n case 'boolean':\n if (typeof value === 'boolean') return value\n if (typeof value === 'number') return value !== 0\n if (typeof value === 'string') {\n const t = value.trim().toLowerCase()\n if (['true', 'yes', 'y', '1', 'on'].includes(t)) return true\n if (['false', 'no', 'n', '0', 'off'].includes(t)) return false\n }\n return undefined\n case 'date':\n case 'datetime':\n case 'datetime-local':\n // Keep ISO-ish strings; date pickers cope with both YYYY-MM-DD and full\n // ISO. Reject anything that doesn't at least look year-prefixed so we\n // don't push \"12 March 2026\" into a <DatePicker>.\n if (typeof value !== 'string') return undefined\n return /^\\d{4}-\\d{2}-\\d{2}/.test(value.trim()) ? value.trim() : undefined\n default:\n return value\n }\n}\n\ntype FormValues = Record<string, unknown>\n\nexport function ResourceEditPage({\n resourceId,\n recordId,\n}: ResourceEditPageProps): React.ReactElement {\n const resource = useResource(resourceId)\n const existing = useRecord(resourceId, recordId)\n const create = useCreateRecord(resourceId)\n const update = useUpdateRecord(resourceId)\n const remove = useDeleteRecord(resourceId)\n const features = useFeatures()\n const navigate = useNavigate()\n const { t, locale } = useI18n()\n const notify = useNotify()\n const dialogs = useDialogs()\n\n const editable = React.useMemo<PropertyJSON[]>(\n () =>\n resource\n ? visibleRecordProperties(resource.properties, 'edit', resource.propertyOrder?.edit).filter((p) => !p.isDisabled)\n : [],\n [resource],\n )\n\n // The validation schema needs to consult the live form values so it can\n // skip required/format checks for fields hidden by `showWhen`. We can't\n // call `form.getValues` here (the form isn't built yet), so we route\n // through a ref filled in below — the schema closure reads from the ref\n // at validation time, not at build time.\n const getValuesRef = React.useRef<() => Record<string, unknown>>(() => ({}))\n\n // Re-build the schema when locale changes so error messages re-translate.\n const schema = React.useMemo(\n () => buildValidationSchema(editable, t, () => getValuesRef.current()),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [editable, locale],\n )\n const defaults = React.useMemo<FormValues>(() => {\n const out: FormValues = {}\n for (const p of editable) out[p.path] = defaultValueFor(p)\n return out\n }, [editable])\n\n const form = useForm<FormValues>({\n resolver: zodResolver(schema),\n defaultValues: defaults,\n })\n\n // Keep the ref pointing at the latest getValues so the schema closure\n // always sees the current form snapshot.\n getValuesRef.current = form.getValues\n\n // Track which recordId has already been hydrated so background refetches\n // don't overwrite user edits after the initial load.\n const hydratedRecordIdRef = React.useRef<string | undefined>(undefined)\n\n const isNew = !recordId\n\n // localStorage key for the per-resource new-record draft. We persist the\n // form snapshot here whenever the user has typed anything but not yet\n // submitted, so that closing the tab / navigating away doesn't lose work.\n const draftKey = isNew ? `modern-admin:draft:${resourceId}` : null\n\n // Once-per-resource init flag for the new-record form. Gates the whole\n // initialisation block — without this, every dep change in the hydration\n // effect (e.g. a background `useResource` refetch bumping the `defaults`\n // reference) would re-run `form.reset(defaults)` and wipe the user's\n // in-progress input (and any draft we just restored).\n const newFormInitForRef = React.useRef<string | undefined>(undefined)\n\n // When we programmatically reset the form (draft restore / undo), we don't\n // want that synthetic change to trigger the persistence watcher and re-save\n // a draft that we just decided not to keep.\n const skipNextPersistRef = React.useRef(false)\n\n // Hard off-switch for draft persistence, set by `clearDraft` after a\n // successful submit. Between the submit and the unmount of this form,\n // cache invalidations (mutation fan-out, the realtime bridge echoing the\n // just-created record back to this tab) can re-render the page and fire\n // the watch subscription with the submitted values still in the form —\n // re-saving the draft that was just cleared. The flag stays on until the\n // hydration effect re-initialises the form for the next `/new` visit.\n const draftPersistDisabledRef = React.useRef(false)\n\n // Hydrate when the existing record arrives (edit mode) or after the resource\n // schema settles (new mode).\n React.useEffect(() => {\n if (!recordId) {\n // New-record form: initialise exactly once per resource. Second and\n // later runs (triggered by background refetches changing `editable` /\n // `defaults` references) must NOT touch the form — `form.reset(...)`\n // would wipe the user's in-progress input.\n hydratedRecordIdRef.current = undefined\n if (newFormInitForRef.current === resourceId) return\n // Defer until the schema has loaded — otherwise we'd \"initialise\"\n // against an empty defaults map and then refuse to ever re-init.\n if (editable.length === 0) return\n newFormInitForRef.current = resourceId\n draftPersistDisabledRef.current = false\n\n // Attempt to restore a saved draft. If we find one, reset to the\n // merged snapshot and surface a bottom-center toast with an Undo\n // action. If not, fall back to a single reset to defaults.\n let draft: FormValues | null = null\n if (draftKey && typeof window !== 'undefined') {\n try {\n const stored = window.localStorage.getItem(draftKey)\n if (stored) draft = JSON.parse(stored) as FormValues\n } catch {\n /* corrupted JSON — ignore */\n }\n }\n\n if (draft && typeof draft === 'object') {\n const merged: FormValues = { ...defaults }\n for (const p of editable) {\n if (Object.prototype.hasOwnProperty.call(draft, p.path)) {\n merged[p.path] = (draft as FormValues)[p.path]\n }\n }\n skipNextPersistRef.current = true\n form.reset(merged)\n notify.raw(t('common:draftRestored'), {\n position: 'bottom-center',\n duration: 8000,\n action: {\n label: t('common:undoDraftRestore'),\n onClick: () => {\n skipNextPersistRef.current = true\n form.reset(defaults)\n try {\n if (draftKey) window.localStorage.removeItem(draftKey)\n } catch {\n /* ignore */\n }\n },\n },\n })\n } else {\n form.reset(defaults)\n }\n return\n }\n // Wait until both the resource schema and the record data are ready.\n // Without this guard an early fire with editable=[] would wipe the form.\n if (editable.length === 0 || !existing.data) return\n // Hydrate only once per record — prevents background refetches from\n // overwriting in-progress user edits.\n if (hydratedRecordIdRef.current === recordId) return\n hydratedRecordIdRef.current = recordId\n // Switching into edit mode invalidates any prior new-form init — so the\n // next visit to `/new` (potentially in a reused component instance)\n // restores the draft / resets to defaults instead of keeping the edit\n // record's values.\n newFormInitForRef.current = undefined\n\n const params = existing.data.record.params\n const merged: FormValues = { ...defaults }\n for (const p of editable) {\n const v = params[p.path]\n if (p.type === 'boolean') merged[p.path] = Boolean(v)\n else if (v == null) merged[p.path] = defaultValueFor(p)\n else merged[p.path] = v\n }\n form.reset(merged)\n }, [recordId, existing.data, editable, defaults, form, draftKey, resourceId, notify, t])\n\n // Persist the form snapshot to localStorage on every change in new mode.\n // We only write when at least one field deviates from defaults; when the\n // form is back to pristine state we delete the key so the user isn't\n // greeted with an \"empty draft\" toast on reopen.\n React.useEffect(() => {\n if (!isNew || !draftKey || editable.length === 0 || typeof window === 'undefined') return\n const subscription = form.watch((values) => {\n if (draftPersistDisabledRef.current) return\n if (skipNextPersistRef.current) {\n skipNextPersistRef.current = false\n return\n }\n let isDirty = false\n const sanitized: FormValues = {}\n for (const p of editable) {\n const v = (values as FormValues)[p.path]\n // Never persist secrets to localStorage — password fields would leave\n // the plaintext sitting in the browser's draft store indefinitely.\n if (p.type === 'password') continue\n // Skip non-serializable values (File objects from file inputs).\n if (v instanceof File) continue\n if (Array.isArray(v) && v.some((x) => x instanceof File)) continue\n sanitized[p.path] = v\n if (!valuesEqual(v, defaults[p.path])) isDirty = true\n }\n try {\n if (isDirty) {\n window.localStorage.setItem(draftKey, JSON.stringify(sanitized))\n } else {\n window.localStorage.removeItem(draftKey)\n }\n } catch {\n /* quota / disabled storage — ignore */\n }\n })\n return () => subscription.unsubscribe()\n }, [isNew, draftKey, editable, defaults, form])\n\n const clearDraft = React.useCallback((): void => {\n // After a successful submit we navigate to the show page, but the\n // component might be reused if the user clicks \"back\" or follows a\n // Create link again. Clearing the init flag forces the next /new visit\n // to fall back to defaults instead of retaining the just-submitted\n // values.\n newFormInitForRef.current = undefined\n // Stop persisting until the next new-form init — post-submit re-renders\n // must not resurrect the draft we're about to remove.\n draftPersistDisabledRef.current = true\n if (!draftKey || typeof window === 'undefined') return\n try {\n window.localStorage.removeItem(draftKey)\n } catch {\n /* ignore */\n }\n }, [draftKey])\n\n const [submitError, setSubmitError] = React.useState<string | null>(null)\n const [aiFillOpen, setAiFillOpen] = React.useState(false)\n\n // The `aiFill` feature plugin (packages/feature-ai-fill) registers a\n // resource-scoped action whose `custom.aiFill === true` flag tells us\n // the resource opts in. Absent the action, the button is hidden.\n // Detect the aiFill plugin by the `custom.aiFill === true` marker, not by\n // action name, so renaming the action in the future can't silently break this.\n const aiFillEnabled = React.useMemo(\n () =>\n Boolean(\n resource?.actions.find(\n (a) => (a.custom as { aiFill?: boolean } | undefined)?.aiFill === true,\n ),\n ),\n [resource],\n )\n\n const applyAiFillValues = React.useCallback(\n (values: Record<string, unknown>): void => {\n // Snapshot the current values of the fields that will be overwritten so\n // the user can undo with a single toast action. Only fields we actually\n // applied are snapshotted — fields skipped due to unknown path or\n // failed coercion must not be \"undone\" to undefined.\n const known = new Map(editable.map((p) => [p.path, p]))\n const snapshot: Record<string, unknown> = {}\n const current = form.getValues()\n const applied: Array<[string, unknown]> = []\n for (const [path, value] of Object.entries(values)) {\n const property = known.get(path)\n if (!property) continue\n const coerced = coerceAiFillValue(property, value)\n if (coerced === undefined) continue\n applied.push([path, coerced])\n snapshot[path] = current[path]\n }\n\n for (const [path, value] of applied) {\n // shouldValidate: true so any value the model returned that does not\n // pass the form schema is highlighted to the user immediately rather\n // than discovered on submit.\n form.setValue(path, value as never, { shouldDirty: true, shouldValidate: true })\n }\n\n if (applied.length === 0) {\n notify.error({ key: 'aiFill:noValues' })\n return\n }\n\n // Offer a quick undo via a bottom-center toast — same pattern as draft restore.\n notify.raw(t('aiFill:applied', { count: applied.length }), {\n position: 'bottom-center',\n duration: 8000,\n action: {\n label: t('common:undoDraftRestore'),\n onClick: () => {\n for (const [path, prev] of Object.entries(snapshot)) {\n form.setValue(path, prev as never, { shouldDirty: true, shouldValidate: true })\n }\n },\n },\n })\n },\n [editable, form, notify, t],\n )\n\n const onSubmit: SubmitHandler<FormValues> = async (values) => {\n setSubmitError(null)\n try {\n const result = isNew\n ? await create.mutateAsync(values)\n : await update.mutateAsync({ id: recordId!, payload: values })\n // Field-level errors come back as 200 with `record.errors`.\n const errors = result.record.errors as Record<string, { message?: string } | string>\n if (errors && Object.keys(errors).length > 0) {\n for (const [path, err] of Object.entries(errors)) {\n const message = typeof err === 'string' ? err : (err?.message ?? t('common:invalidValue'))\n form.setError(path, { type: 'server', message })\n }\n if (result.record.baseError) {\n setSubmitError(String(result.record.baseError))\n }\n notify.error({ key: 'toast:validationFailed' })\n return\n }\n // Successful submit — drop the saved draft so we don't restore it on\n // the next visit to the new-form route.\n if (isNew) clearDraft()\n notify.success({ key: isNew ? 'toast:created' : 'toast:saved' })\n navigate({ name: 'show', resourceId, recordId: String(result.record.id) })\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n setSubmitError(message)\n notify.error({ key: isNew ? 'toast:createFailed' : 'toast:saveFailed' }, { description: message })\n }\n }\n\n const onInvalid = (): void => {\n notify.error({ key: 'toast:validationFailed' })\n }\n\n const handleDelete = async (): Promise<void> => {\n if (!recordId) return\n const ok = await dialogs.confirm({\n title: t('common:confirmDelete'),\n confirmLabel: t('common:delete'),\n destructive: true,\n })\n if (!ok) return\n await remove.mutateAsync(recordId)\n navigate({ name: 'list', resourceId })\n }\n\n // While editing an existing record, block submit/delete until the record\n // has been hydrated. Otherwise the form submits with empty defaults and\n // wipes server-side fields (e.g. enums coerce '' → null).\n const isHydrating = !isNew && (existing.isLoading || hydratedRecordIdRef.current !== recordId)\n\n // ── Keyboard shortcuts ──\n // Ctrl/Cmd+S submits the form. Submit-on-Ctrl+S works even when focus is\n // in an input — that's the standard \"save\" gesture across editors.\n useHotkey(\n 'mod+s',\n () => {\n if (form.formState.isSubmitting || isHydrating) return\n void form.handleSubmit(onSubmit, onInvalid)()\n },\n { description: isNew ? t('common:create') : t('common:save') },\n )\n\n if (!resource) return <div className=\"p-6\">{t('common:loading')}</div>\n\n // When editing an existing record that failed to load (e.g. 404), bail out\n // before rendering the form — there's nothing to edit.\n if (!isNew && existing.isError) {\n const { status, message } = parseApiError(existing.error)\n const title =\n status === 404\n ? t('errors:notFound')\n : status === 403\n ? t('errors:forbidden')\n : t('errors:server')\n return (\n <div className=\"flex min-h-full flex-col gap-4\">\n <PageBreadcrumbs\n items={[\n homeCrumb(t('common:home')),\n { label: resource.name, to: { name: 'list', resourceId } },\n { label: recordId ?? '' },\n ]}\n />\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between gap-3\">\n <CardTitle className=\"truncate\">\n {resource.name} #{recordId}\n </CardTitle>\n <Link to={{ name: 'list', resourceId }}>\n <Button variant=\"ghost\" size=\"sm\">\n {t('common:back')}\n </Button>\n </Link>\n </CardHeader>\n <CardContent>\n <div className=\"flex items-start gap-3 rounded-lg border border-destructive/50 bg-destructive/10 p-4 dark:bg-destructive/15\">\n <AlertCircle className=\"mt-0.5 size-5 shrink-0 text-destructive\" />\n <div className=\"space-y-1 text-sm\">\n <p className=\"font-semibold text-destructive\">{title}</p>\n <p className=\"text-destructive/90\">{message}</p>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n )\n }\n\n const modLabel = getModKeyLabel()\n\n const recordLabel = existing.data?.record.title || recordId\n const crumbs: BreadcrumbItemSpec[] = [\n homeCrumb(t('common:home')),\n { label: resource.name, to: { name: 'list', resourceId } },\n ...(isNew\n ? [{ label: t('common:new') }]\n : [\n {\n label: recordLabel ?? '',\n to: { name: 'show' as const, resourceId, recordId: recordId! },\n },\n { label: t('common:edit') },\n ]),\n ]\n\n return (\n <div className=\"flex min-h-full flex-col gap-4\">\n <PageBreadcrumbs items={crumbs} />\n <Card className=\"flex-1\">\n <CardHeader className=\"flex flex-row items-center justify-between gap-3\">\n <CardTitle className=\"truncate\">\n {isNew\n ? t('common:newRecord', { name: resource.name })\n : t('common:editRecord', { name: resource.name, id: recordId ?? '' })}\n </CardTitle>\n <div className=\"flex shrink-0 gap-2\">\n {aiFillEnabled && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={form.formState.isSubmitting || isHydrating}\n onClick={() => setAiFillOpen(true)}\n >\n <Sparkles className=\"size-4\" />\n <span className=\"hidden sm:inline\">{t('aiFill:button')}</span>\n </Button>\n )}\n {!isNew && (\n <>\n {features.history && (\n <RevisionsButton resourceId={resourceId} recordId={recordId!} />\n )}\n <Link to={{ name: 'show', resourceId, recordId: recordId! }}>\n <Button variant=\"outline\" size=\"sm\" aria-label={t('common:show')}>\n <Eye className=\"size-4\" />\n <span className=\"hidden sm:inline\">{t('common:show')}</span>\n </Button>\n </Link>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n disabled={remove.isPending || form.formState.isSubmitting || isHydrating}\n onClick={() => void handleDelete()}\n aria-label={t('common:delete')}\n >\n <Trash2 className=\"size-4\" />\n <span className=\"hidden sm:inline\">{t('common:delete')}</span>\n </Button>\n </>\n )}\n </div>\n </CardHeader>\n <Form {...form}>\n <form id=\"edit-record-form\" onSubmit={form.handleSubmit(onSubmit, onInvalid)}>\n <CardContent className=\"gap-4 pb-6 [column-fill:_balance] md:columns-2\">\n {editable.map((property) => (\n <ConditionalField\n key={property.path}\n control={form.control}\n property={property}\n >\n <FormField\n control={form.control}\n name={property.path}\n render={({ field, fieldState }) => (\n <Field\n data-invalid={fieldState.error ? true : undefined}\n className=\"mb-8 break-inside-avoid\"\n >\n <FieldLabel htmlFor={field.name}>\n {property.label}\n {property.description ? (\n <InfoTooltip\n content={property.description}\n ariaLabel={property.description}\n />\n ) : null}\n {property.isRequired && (\n <span className=\"ml-1 text-destructive\">*</span>\n )}\n </FieldLabel>\n <PropertyEditor\n property={property}\n value={field.value}\n onChange={field.onChange}\n disabled={form.formState.isSubmitting}\n resourceId={resourceId}\n />\n {fieldState.error?.message && (\n <FieldError>{fieldState.error.message}</FieldError>\n )}\n </Field>\n )}\n />\n </ConditionalField>\n ))}\n </CardContent>\n </form>\n </Form>\n </Card>\n {/* Sticky action bar — sibling of Card, same pattern as the list-page\n paginator. Pinned to the viewport bottom while the user scrolls.\n `form=\"edit-record-form\"` ties the submit button to the <form> above\n even though it's not a descendant of that element. */}\n {aiFillOpen && (\n <AiFillDialog\n resourceId={resourceId}\n onClose={() => setAiFillOpen(false)}\n onFilled={applyAiFillValues}\n />\n )}\n <div className=\"sticky bottom-0 -mb-px z-20 -mx-2 border-t border-border bg-card px-2 py-3 pr-14 sm:-mx-6 sm:px-6 sm:pr-16\">\n <div className=\"flex items-center justify-between\">\n <div>\n {submitError && (\n <span className=\"text-sm text-destructive\">{submitError}</span>\n )}\n </div>\n <div className=\"flex gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() =>\n navigate(\n isNew\n ? { name: 'list', resourceId }\n : { name: 'show', resourceId, recordId: recordId! },\n )\n }\n aria-label={t('common:cancel')}\n >\n <X className=\"size-4\" />\n <span className=\"hidden sm:inline\">{t('common:cancel')}</span>\n </Button>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"submit\"\n form=\"edit-record-form\"\n disabled={form.formState.isSubmitting || isHydrating}\n aria-label={isNew ? t('common:create') : t('common:save')}\n >\n {isNew ? <Plus className=\"size-4\" /> : <Save className=\"size-4\" />}\n <span className=\"hidden sm:inline\">\n {isNew ? t('common:create') : t('common:save')}\n </span>\n </Button>\n </TooltipTrigger>\n <TooltipContent className=\"flex items-center gap-1.5\">\n <span>{isNew ? t('common:create') : t('common:save')}</span>\n <span className=\"inline-flex items-center gap-0.5\">\n <Kbd>{modLabel}</Kbd>\n <span className=\"text-muted-foreground\">+</span>\n <Kbd>S</Kbd>\n </span>\n </TooltipContent>\n </Tooltip>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\n// ── ConditionalField ──────────────────────────────────────────────────────────\n// Wraps a FormField with `showWhen` evaluation. Subscribes only to the named\n// control field via `useWatch` so unrelated form changes do not re-render the\n// branch. When the rule does not match, the entire FormField subtree (label,\n// editor, description, error) is unmounted — and crucially, the schema's\n// matching `superRefine` skips required/format checks for the same field, so\n// hidden branches cannot block submission.\n\ninterface ConditionalFieldProps {\n control: Control<FormValues>\n property: PropertyJSON\n children: React.ReactNode\n}\n\nfunction ConditionalField({\n control,\n property,\n children,\n}: ConditionalFieldProps): React.ReactElement | null {\n const rule = property.showWhen\n // useWatch with `name: undefined` would subscribe to every field, defeating\n // the purpose. Always pass a string when there's no rule we still want a\n // stable hook order, so we subscribe to the property's own path.\n const watched = useWatch({ control, name: rule?.field ?? property.path })\n if (!rule) return <>{children}</>\n const visible = evaluateShowWhen(rule, { [rule.field]: watched })\n if (!visible) return null\n return <>{children}</>\n}\n\n// Cheap structural equality for form values. Empty-ish primitives are treated\n// as equal (`''` ≈ `null` ≈ `undefined`) so the persistence watcher does not\n// store a draft for an untouched form whose defaults happen to be `''` vs\n// `undefined`. Falls back to JSON stringify for objects/arrays.\nfunction valuesEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true\n const aEmpty = a == null || a === ''\n const bEmpty = b == null || b === ''\n if (aEmpty && bEmpty) return true\n if (aEmpty || bEmpty) return false\n if (typeof a !== typeof b) return false\n if (typeof a === 'object') {\n try {\n return JSON.stringify(a) === JSON.stringify(b)\n } catch {\n return false\n }\n }\n return false\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"edit-page-CW7-FAPC.js","names":[],"sources":["../../../../react/src/components/ai-fill-dialog.tsx","../../../../react/src/pages/edit-page.tsx"],"sourcesContent":["// AiFillDialog — dropzone + \"Recognize\" button that sends a single image to\n// the resource's `aiFill` action and forwards the extracted values to the\n// caller. The dialog is purely presentational regarding form state; the\n// edit page handles merging the returned values into the live form.\n\nimport * as React from 'react'\nimport { Sparkles, Loader2 } from 'lucide-react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n FileInput,\n} from '@modern-admin/ui'\nimport { useAdminClient } from '../provider.js'\nimport { useI18n } from '../i18n.js'\nimport { useNotify } from '../notify.js'\nimport { parseApiError } from '../client.js'\n\nexport interface AiFillDialogProps {\n resourceId: string\n onClose(): void\n /** Called with the extracted values map. Caller merges into form state. */\n onFilled(values: Record<string, unknown>): void\n}\n\nexport function AiFillDialog({\n resourceId,\n onClose,\n onFilled,\n}: AiFillDialogProps): React.ReactElement {\n const { t } = useI18n()\n const client = useAdminClient()\n const notify = useNotify()\n const [file, setFile] = React.useState<File | null>(null)\n const [busy, setBusy] = React.useState(false)\n const abortRef = React.useRef<AbortController | null>(null)\n\n // Use useEffect for createObjectURL to ensure cleanup is always paired with\n // creation and happens at the right time (avoiding the side-effect-in-useMemo\n // anti-pattern).\n const [previewUrl, setPreviewUrl] = React.useState<string | null>(null)\n React.useEffect(() => {\n if (!file) {\n setPreviewUrl(null)\n return\n }\n const url = URL.createObjectURL(file)\n setPreviewUrl(url)\n return () => URL.revokeObjectURL(url)\n }, [file])\n\n // Abort any in-flight request when the dialog unmounts.\n React.useEffect(() => {\n return () => {\n abortRef.current?.abort('dialog unmounted')\n }\n }, [])\n\n const handleFill = async (): Promise<void> => {\n if (!file || busy) return\n\n const ac = new AbortController()\n abortRef.current = ac\n setBusy(true)\n try {\n const { values } = await client.aiFillFromImage(resourceId, file, { signal: ac.signal })\n const count = Object.keys(values).length\n if (count === 0) {\n notify.error({ key: 'aiFill:noValues' })\n return\n }\n onFilled(values)\n // The undo toast is surfaced by the edit-page (applyAiFillValues); the\n // dialog only needs to close cleanly after handing off the values.\n onClose()\n } catch (err) {\n if (ac.signal.aborted) return // user-initiated close — silently ignore\n const { message } = parseApiError(err)\n notify.error(\n { key: 'aiFill:errorGeneric', params: { message } },\n { description: message },\n )\n } finally {\n setBusy(false)\n abortRef.current = null\n }\n }\n\n const handleClose = (): void => {\n if (busy) {\n abortRef.current?.abort('dialog closed')\n }\n onClose()\n }\n\n return (\n <Dialog open onOpenChange={(open) => { if (!open) handleClose() }}>\n <DialogContent className=\"w-full max-w-md\">\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <Sparkles className=\"size-4\" />\n {t('aiFill:dialogTitle')}\n </DialogTitle>\n <DialogDescription>{t('aiFill:dialogDescription')}</DialogDescription>\n </DialogHeader>\n\n <FileInput\n accept=\"image/*\"\n value={file ? file.name : null}\n displayName={file?.name ?? null}\n previewUrl={previewUrl}\n uploading={busy}\n uploadingName={file?.name}\n disabled={busy}\n onFileSelect={(f) => setFile(f)}\n onRemove={() => setFile(null)}\n labels={{\n chooseFile: t('common:chooseFile'),\n dragAndDrop: t('common:dragAndDrop'),\n chooseAFile: t('common:chooseAFile'),\n uploading: t('aiFill:processing'),\n uploadingFile: t('aiFill:processing'),\n removeFile: t('common:removeFile'),\n }}\n />\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={handleClose}>\n {t('common:cancel')}\n </Button>\n <Button onClick={() => void handleFill()} disabled={!file || busy}>\n {busy ? <Loader2 className=\"size-4 animate-spin\" /> : <Sparkles className=\"size-4\" />}\n {t('aiFill:fillButton')}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","// Edit / new page driven by react-hook-form + zodResolver. The Zod schema\n// is derived dynamically from the resource's editable PropertyJSON list via\n// `buildValidationSchema()` — every property type maps to the right runtime\n// check, with localized error messages. Field-level server errors from\n// `record.errors` are projected back onto the form via setError, and global\n// success/failure messages surface as toasts.\n\nimport * as React from 'react'\nimport { useForm, useWatch, type Control, type SubmitHandler } from 'react-hook-form'\nimport { zodResolver } from '@hookform/resolvers/zod'\nimport {\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Field,\n FieldError,\n FieldLabel,\n Form,\n FormField,\n InfoTooltip,\n Kbd,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n getModKeyLabel,\n} from '@modern-admin/ui'\nimport { AlertCircle, Eye, Plus, Save, Sparkles, Trash2, X } from 'lucide-react'\nimport { useCreateRecord, useDeleteRecord, useFeatures, useRecord, useResource, useUpdateRecord } from '../hooks.js'\nimport { parseApiError } from '../client.js'\nimport { PropertyEditor } from '../property-renderer.js'\nimport { Link, useNavigate } from '../router.js'\nimport { useI18n } from '../i18n.js'\nimport { useNotify } from '../notify.js'\nimport { useHotkey } from '../use-hotkey.js'\nimport { PageBreadcrumbs, homeCrumb } from '../breadcrumbs.js'\nimport type { BreadcrumbItemSpec } from '../breadcrumbs.js'\nimport { buildValidationSchema, defaultValueFor } from '../validation.js'\nimport { evaluateShowWhen } from '../show-when.js'\nimport type { PropertyJSON } from '../types.js'\nimport { useDialogs } from '../dialogs.js'\nimport { RevisionsButton } from '../components/revisions-button.js'\nimport { AiFillDialog } from '../components/ai-fill-dialog.js'\nimport { visibleRecordProperties } from '../relations.js'\n\nexport interface ResourceEditPageProps {\n resourceId: string\n recordId?: string\n}\n\n/**\n * Defensive coercion applied to values returned by `aiFillFromImage` before\n * they reach `form.setValue`. The backend already normalises numbers/dates/\n * enums/references; this is a last-line check so an unexpected stringy\n * number does not poison a numeric field's state and so out-of-domain enum\n * values are dropped rather than silently committed. Returns `undefined` to\n * mean \"drop this value, keep the existing form state\".\n */\nfunction coerceAiFillValue(property: PropertyJSON, value: unknown): unknown {\n if (value === null || value === undefined) return undefined\n // Enum-style: snap by exact / case-insensitive value or label.\n if (property.availableValues?.length) {\n if (typeof value !== 'string') return undefined\n const trimmed = value.trim()\n if (trimmed === '') return undefined\n const lower = trimmed.toLowerCase()\n const match = property.availableValues.find((v) => v.value === trimmed)\n ?? property.availableValues.find((v) => v.value.toLowerCase() === lower)\n ?? property.availableValues.find((v) => v.label.toLowerCase() === lower)\n return match?.value\n }\n // References: keep id-shaped scalars only (string or number).\n if (property.reference) {\n if (typeof value === 'string' || typeof value === 'number') return value\n return undefined\n }\n switch (property.type) {\n case 'bigint':\n case 'biginteger': {\n // BigInt values are transported as digit strings end-to-end (matches\n // BaseRecord.toJSON + the Prisma adapter's accept-string write path).\n // Never round-trip via Number() — values >2^53 would lose precision.\n if (typeof value === 'bigint') return value.toString()\n if (typeof value === 'number') {\n if (!Number.isFinite(value) || !Number.isInteger(value)) return undefined\n return String(value)\n }\n if (typeof value !== 'string') return undefined\n const trimmed = value.trim().replace(/[\\s_]/g, '')\n return /^-?\\d+$/.test(trimmed) ? trimmed : undefined\n }\n case 'number':\n case 'float':\n case 'currency':\n case 'money':\n case 'decimal':\n case 'integer': {\n if (typeof value === 'number') return Number.isFinite(value) ? value : undefined\n if (typeof value !== 'string') return undefined\n const trimmed = value.trim().replace(/[^\\d.,\\-+eE]/g, '')\n if (trimmed === '' || trimmed === '-' || trimmed === '+') return undefined\n const lastDot = trimmed.lastIndexOf('.')\n const lastComma = trimmed.lastIndexOf(',')\n const normalised = lastDot >= lastComma\n ? trimmed.replace(/,/g, '')\n : trimmed.replace(/\\./g, '').replace(',', '.')\n const n = Number(normalised)\n if (!Number.isFinite(n)) return undefined\n return property.type === 'integer' ? Math.trunc(n) : n\n }\n case 'boolean':\n if (typeof value === 'boolean') return value\n if (typeof value === 'number') return value !== 0\n if (typeof value === 'string') {\n const t = value.trim().toLowerCase()\n if (['true', 'yes', 'y', '1', 'on'].includes(t)) return true\n if (['false', 'no', 'n', '0', 'off'].includes(t)) return false\n }\n return undefined\n case 'date':\n case 'datetime':\n case 'datetime-local':\n // Keep ISO-ish strings; date pickers cope with both YYYY-MM-DD and full\n // ISO. Reject anything that doesn't at least look year-prefixed so we\n // don't push \"12 March 2026\" into a <DatePicker>.\n if (typeof value !== 'string') return undefined\n return /^\\d{4}-\\d{2}-\\d{2}/.test(value.trim()) ? value.trim() : undefined\n default:\n return value\n }\n}\n\ntype FormValues = Record<string, unknown>\n\nexport function ResourceEditPage({\n resourceId,\n recordId,\n}: ResourceEditPageProps): React.ReactElement {\n const resource = useResource(resourceId)\n const existing = useRecord(resourceId, recordId)\n const create = useCreateRecord(resourceId)\n const update = useUpdateRecord(resourceId)\n const remove = useDeleteRecord(resourceId)\n const features = useFeatures()\n const navigate = useNavigate()\n const { t, locale } = useI18n()\n const notify = useNotify()\n const dialogs = useDialogs()\n\n const editable = React.useMemo<PropertyJSON[]>(\n () =>\n resource\n ? visibleRecordProperties(resource.properties, 'edit', resource.propertyOrder?.edit).filter((p) => !p.isDisabled)\n : [],\n [resource],\n )\n\n // The validation schema needs to consult the live form values so it can\n // skip required/format checks for fields hidden by `showWhen`. We can't\n // call `form.getValues` here (the form isn't built yet), so we route\n // through a ref filled in below — the schema closure reads from the ref\n // at validation time, not at build time.\n const getValuesRef = React.useRef<() => Record<string, unknown>>(() => ({}))\n\n // Re-build the schema when locale changes so error messages re-translate.\n const schema = React.useMemo(\n () => buildValidationSchema(editable, t, () => getValuesRef.current()),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [editable, locale],\n )\n const defaults = React.useMemo<FormValues>(() => {\n const out: FormValues = {}\n for (const p of editable) out[p.path] = defaultValueFor(p)\n return out\n }, [editable])\n\n const form = useForm<FormValues>({\n resolver: zodResolver(schema),\n defaultValues: defaults,\n })\n\n // Keep the ref pointing at the latest getValues so the schema closure\n // always sees the current form snapshot.\n getValuesRef.current = form.getValues\n\n // Track which recordId has already been hydrated so background refetches\n // don't overwrite user edits after the initial load.\n const hydratedRecordIdRef = React.useRef<string | undefined>(undefined)\n\n const isNew = !recordId\n\n // localStorage key for the per-resource new-record draft. We persist the\n // form snapshot here whenever the user has typed anything but not yet\n // submitted, so that closing the tab / navigating away doesn't lose work.\n const draftKey = isNew ? `modern-admin:draft:${resourceId}` : null\n\n // Once-per-resource init flag for the new-record form. Gates the whole\n // initialisation block — without this, every dep change in the hydration\n // effect (e.g. a background `useResource` refetch bumping the `defaults`\n // reference) would re-run `form.reset(defaults)` and wipe the user's\n // in-progress input (and any draft we just restored).\n const newFormInitForRef = React.useRef<string | undefined>(undefined)\n\n // When we programmatically reset the form (draft restore / undo), we don't\n // want that synthetic change to trigger the persistence watcher and re-save\n // a draft that we just decided not to keep.\n const skipNextPersistRef = React.useRef(false)\n\n // Hard off-switch for draft persistence, set by `clearDraft` after a\n // successful submit. Between the submit and the unmount of this form,\n // cache invalidations (mutation fan-out, the realtime bridge echoing the\n // just-created record back to this tab) can re-render the page and fire\n // the watch subscription with the submitted values still in the form —\n // re-saving the draft that was just cleared. The flag stays on until the\n // hydration effect re-initialises the form for the next `/new` visit.\n const draftPersistDisabledRef = React.useRef(false)\n\n // Hydrate when the existing record arrives (edit mode) or after the resource\n // schema settles (new mode).\n React.useEffect(() => {\n if (!recordId) {\n // New-record form: initialise exactly once per resource. Second and\n // later runs (triggered by background refetches changing `editable` /\n // `defaults` references) must NOT touch the form — `form.reset(...)`\n // would wipe the user's in-progress input.\n hydratedRecordIdRef.current = undefined\n if (newFormInitForRef.current === resourceId) return\n // Defer until the schema has loaded — otherwise we'd \"initialise\"\n // against an empty defaults map and then refuse to ever re-init.\n if (editable.length === 0) return\n newFormInitForRef.current = resourceId\n draftPersistDisabledRef.current = false\n\n // Attempt to restore a saved draft. If we find one, reset to the\n // merged snapshot and surface a bottom-center toast with an Undo\n // action. If not, fall back to a single reset to defaults.\n let draft: FormValues | null = null\n if (draftKey && typeof window !== 'undefined') {\n try {\n const stored = window.localStorage.getItem(draftKey)\n if (stored) draft = JSON.parse(stored) as FormValues\n } catch {\n /* corrupted JSON — ignore */\n }\n }\n\n if (draft && typeof draft === 'object') {\n const merged: FormValues = { ...defaults }\n for (const p of editable) {\n if (Object.prototype.hasOwnProperty.call(draft, p.path)) {\n merged[p.path] = (draft as FormValues)[p.path]\n }\n }\n skipNextPersistRef.current = true\n form.reset(merged)\n notify.raw(t('common:draftRestored'), {\n position: 'bottom-center',\n duration: 8000,\n action: {\n label: t('common:undoDraftRestore'),\n onClick: () => {\n skipNextPersistRef.current = true\n form.reset(defaults)\n try {\n if (draftKey) window.localStorage.removeItem(draftKey)\n } catch {\n /* ignore */\n }\n },\n },\n })\n } else {\n form.reset(defaults)\n }\n return\n }\n // Wait until both the resource schema and the record data are ready.\n // Without this guard an early fire with editable=[] would wipe the form.\n if (editable.length === 0 || !existing.data) return\n // Hydrate only once per record — prevents background refetches from\n // overwriting in-progress user edits.\n if (hydratedRecordIdRef.current === recordId) return\n hydratedRecordIdRef.current = recordId\n // Switching into edit mode invalidates any prior new-form init — so the\n // next visit to `/new` (potentially in a reused component instance)\n // restores the draft / resets to defaults instead of keeping the edit\n // record's values.\n newFormInitForRef.current = undefined\n\n const params = existing.data.record.params\n const merged: FormValues = { ...defaults }\n for (const p of editable) {\n const v = params[p.path]\n if (p.type === 'boolean') merged[p.path] = Boolean(v)\n else if (v == null) merged[p.path] = defaultValueFor(p)\n else merged[p.path] = v\n }\n form.reset(merged)\n }, [recordId, existing.data, editable, defaults, form, draftKey, resourceId, notify, t])\n\n // Persist the form snapshot to localStorage on every change in new mode.\n // We only write when at least one field deviates from defaults; when the\n // form is back to pristine state we delete the key so the user isn't\n // greeted with an \"empty draft\" toast on reopen.\n React.useEffect(() => {\n if (!isNew || !draftKey || editable.length === 0 || typeof window === 'undefined') return\n const subscription = form.watch((values) => {\n if (draftPersistDisabledRef.current) return\n if (skipNextPersistRef.current) {\n skipNextPersistRef.current = false\n return\n }\n let isDirty = false\n const sanitized: FormValues = {}\n for (const p of editable) {\n const v = (values as FormValues)[p.path]\n // Never persist secrets to localStorage — password fields would leave\n // the plaintext sitting in the browser's draft store indefinitely.\n if (p.type === 'password') continue\n // Skip non-serializable values (File objects from file inputs).\n if (v instanceof File) continue\n if (Array.isArray(v) && v.some((x) => x instanceof File)) continue\n sanitized[p.path] = v\n if (!valuesEqual(v, defaults[p.path])) isDirty = true\n }\n try {\n if (isDirty) {\n window.localStorage.setItem(draftKey, JSON.stringify(sanitized))\n } else {\n window.localStorage.removeItem(draftKey)\n }\n } catch {\n /* quota / disabled storage — ignore */\n }\n })\n return () => subscription.unsubscribe()\n }, [isNew, draftKey, editable, defaults, form])\n\n const clearDraft = React.useCallback((): void => {\n // After a successful submit we navigate to the show page, but the\n // component might be reused if the user clicks \"back\" or follows a\n // Create link again. Clearing the init flag forces the next /new visit\n // to fall back to defaults instead of retaining the just-submitted\n // values.\n newFormInitForRef.current = undefined\n // Stop persisting until the next new-form init — post-submit re-renders\n // must not resurrect the draft we're about to remove.\n draftPersistDisabledRef.current = true\n if (!draftKey || typeof window === 'undefined') return\n try {\n window.localStorage.removeItem(draftKey)\n } catch {\n /* ignore */\n }\n }, [draftKey])\n\n const [submitError, setSubmitError] = React.useState<string | null>(null)\n const [aiFillOpen, setAiFillOpen] = React.useState(false)\n\n // The `aiFill` feature plugin (packages/feature-ai-fill) registers a\n // resource-scoped action whose `custom.aiFill === true` flag tells us\n // the resource opts in. Absent the action, the button is hidden.\n // Detect the aiFill plugin by the `custom.aiFill === true` marker, not by\n // action name, so renaming the action in the future can't silently break this.\n const aiFillEnabled = React.useMemo(\n () =>\n Boolean(\n resource?.actions.find(\n (a) => (a.custom as { aiFill?: boolean } | undefined)?.aiFill === true,\n ),\n ),\n [resource],\n )\n\n const applyAiFillValues = React.useCallback(\n (values: Record<string, unknown>): void => {\n // Snapshot the current values of the fields that will be overwritten so\n // the user can undo with a single toast action. Only fields we actually\n // applied are snapshotted — fields skipped due to unknown path or\n // failed coercion must not be \"undone\" to undefined.\n const known = new Map(editable.map((p) => [p.path, p]))\n const snapshot: Record<string, unknown> = {}\n const current = form.getValues()\n const applied: Array<[string, unknown]> = []\n for (const [path, value] of Object.entries(values)) {\n const property = known.get(path)\n if (!property) continue\n const coerced = coerceAiFillValue(property, value)\n if (coerced === undefined) continue\n applied.push([path, coerced])\n snapshot[path] = current[path]\n }\n\n for (const [path, value] of applied) {\n // shouldValidate: true so any value the model returned that does not\n // pass the form schema is highlighted to the user immediately rather\n // than discovered on submit.\n form.setValue(path, value as never, { shouldDirty: true, shouldValidate: true })\n }\n\n if (applied.length === 0) {\n notify.error({ key: 'aiFill:noValues' })\n return\n }\n\n // Offer a quick undo via a bottom-center toast — same pattern as draft restore.\n notify.raw(t('aiFill:applied', { count: applied.length }), {\n position: 'bottom-center',\n duration: 8000,\n action: {\n label: t('common:undoDraftRestore'),\n onClick: () => {\n for (const [path, prev] of Object.entries(snapshot)) {\n form.setValue(path, prev as never, { shouldDirty: true, shouldValidate: true })\n }\n },\n },\n })\n },\n [editable, form, notify, t],\n )\n\n const onSubmit: SubmitHandler<FormValues> = async (values) => {\n setSubmitError(null)\n try {\n const result = isNew\n ? await create.mutateAsync(values)\n : await update.mutateAsync({ id: recordId!, payload: values })\n // Field-level errors come back as 200 with `record.errors`.\n const errors = result.record.errors as Record<string, { message?: string } | string>\n if (errors && Object.keys(errors).length > 0) {\n for (const [path, err] of Object.entries(errors)) {\n const message = typeof err === 'string' ? err : (err?.message ?? t('common:invalidValue'))\n form.setError(path, { type: 'server', message })\n }\n if (result.record.baseError) {\n setSubmitError(String(result.record.baseError))\n }\n notify.error({ key: 'toast:validationFailed' })\n return\n }\n // Successful submit — drop the saved draft so we don't restore it on\n // the next visit to the new-form route.\n if (isNew) clearDraft()\n notify.success({ key: isNew ? 'toast:created' : 'toast:saved' })\n navigate({ name: 'show', resourceId, recordId: String(result.record.id) })\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n setSubmitError(message)\n notify.error({ key: isNew ? 'toast:createFailed' : 'toast:saveFailed' }, { description: message })\n }\n }\n\n const onInvalid = (): void => {\n notify.error({ key: 'toast:validationFailed' })\n }\n\n const handleDelete = async (): Promise<void> => {\n if (!recordId) return\n const ok = await dialogs.confirm({\n title: t('common:confirmDelete'),\n confirmLabel: t('common:delete'),\n destructive: true,\n })\n if (!ok) return\n await remove.mutateAsync(recordId)\n navigate({ name: 'list', resourceId })\n }\n\n // While editing an existing record, block submit/delete until the record\n // has been hydrated. Otherwise the form submits with empty defaults and\n // wipes server-side fields (e.g. enums coerce '' → null).\n const isHydrating = !isNew && (existing.isLoading || hydratedRecordIdRef.current !== recordId)\n\n // ── Keyboard shortcuts ──\n // Ctrl/Cmd+S submits the form. Submit-on-Ctrl+S works even when focus is\n // in an input — that's the standard \"save\" gesture across editors.\n useHotkey(\n 'mod+s',\n () => {\n if (form.formState.isSubmitting || isHydrating) return\n void form.handleSubmit(onSubmit, onInvalid)()\n },\n { description: isNew ? t('common:create') : t('common:save') },\n )\n\n if (!resource) return <div className=\"p-6\">{t('common:loading')}</div>\n\n // When editing an existing record that failed to load (e.g. 404), bail out\n // before rendering the form — there's nothing to edit.\n if (!isNew && existing.isError) {\n const { status, message } = parseApiError(existing.error)\n const title =\n status === 404\n ? t('errors:notFound')\n : status === 403\n ? t('errors:forbidden')\n : t('errors:server')\n return (\n <div className=\"flex min-h-full flex-col gap-4\">\n <PageBreadcrumbs\n items={[\n homeCrumb(t('common:home')),\n { label: resource.name, to: { name: 'list', resourceId } },\n { label: recordId ?? '' },\n ]}\n />\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between gap-3\">\n <CardTitle className=\"truncate\">\n {resource.name} #{recordId}\n </CardTitle>\n <Link to={{ name: 'list', resourceId }}>\n <Button variant=\"ghost\" size=\"sm\">\n {t('common:back')}\n </Button>\n </Link>\n </CardHeader>\n <CardContent>\n <div className=\"flex items-start gap-3 rounded-lg border border-destructive/50 bg-destructive/10 p-4 dark:bg-destructive/15\">\n <AlertCircle className=\"mt-0.5 size-5 shrink-0 text-destructive\" />\n <div className=\"space-y-1 text-sm\">\n <p className=\"font-semibold text-destructive\">{title}</p>\n <p className=\"text-destructive/90\">{message}</p>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n )\n }\n\n const modLabel = getModKeyLabel()\n\n const recordLabel = existing.data?.record.title || recordId\n const crumbs: BreadcrumbItemSpec[] = [\n homeCrumb(t('common:home')),\n { label: resource.name, to: { name: 'list', resourceId } },\n ...(isNew\n ? [{ label: t('common:new') }]\n : [\n {\n label: recordLabel ?? '',\n to: { name: 'show' as const, resourceId, recordId: recordId! },\n },\n { label: t('common:edit') },\n ]),\n ]\n\n return (\n <div className=\"flex min-h-full flex-col gap-4\">\n <PageBreadcrumbs items={crumbs} />\n <Card className=\"flex-1\">\n <CardHeader className=\"flex flex-row items-center justify-between gap-3\">\n <CardTitle className=\"truncate\">\n {isNew\n ? t('common:newRecord', { name: resource.name })\n : t('common:editRecord', { name: resource.name, id: recordId ?? '' })}\n </CardTitle>\n <div className=\"flex shrink-0 gap-2\">\n {aiFillEnabled && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={form.formState.isSubmitting || isHydrating}\n onClick={() => setAiFillOpen(true)}\n >\n <Sparkles className=\"size-4\" />\n <span className=\"hidden sm:inline\">{t('aiFill:button')}</span>\n </Button>\n )}\n {!isNew && (\n <>\n {features.history && (\n <RevisionsButton resourceId={resourceId} recordId={recordId!} />\n )}\n <Link to={{ name: 'show', resourceId, recordId: recordId! }}>\n <Button variant=\"outline\" size=\"sm\" aria-label={t('common:show')}>\n <Eye className=\"size-4\" />\n <span className=\"hidden sm:inline\">{t('common:show')}</span>\n </Button>\n </Link>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n disabled={remove.isPending || form.formState.isSubmitting || isHydrating}\n onClick={() => void handleDelete()}\n aria-label={t('common:delete')}\n >\n <Trash2 className=\"size-4\" />\n <span className=\"hidden sm:inline\">{t('common:delete')}</span>\n </Button>\n </>\n )}\n </div>\n </CardHeader>\n <Form {...form}>\n <form id=\"edit-record-form\" onSubmit={form.handleSubmit(onSubmit, onInvalid)}>\n <CardContent className=\"gap-4 pb-6 [column-fill:_balance] md:columns-2\">\n {editable.map((property) => (\n <ConditionalField\n key={property.path}\n control={form.control}\n property={property}\n >\n <FormField\n control={form.control}\n name={property.path}\n render={({ field, fieldState }) => (\n <Field\n data-invalid={fieldState.error ? true : undefined}\n className=\"mb-8 break-inside-avoid\"\n >\n <FieldLabel htmlFor={field.name}>\n {property.label}\n {property.description ? (\n <InfoTooltip\n content={property.description}\n ariaLabel={property.description}\n />\n ) : null}\n {property.isRequired && (\n <span className=\"ml-1 text-destructive\">*</span>\n )}\n </FieldLabel>\n <PropertyEditor\n property={property}\n value={field.value}\n onChange={field.onChange}\n disabled={form.formState.isSubmitting}\n resourceId={resourceId}\n />\n {fieldState.error?.message && (\n <FieldError>{fieldState.error.message}</FieldError>\n )}\n </Field>\n )}\n />\n </ConditionalField>\n ))}\n </CardContent>\n </form>\n </Form>\n </Card>\n {/* Sticky action bar — sibling of Card, same pattern as the list-page\n paginator. Pinned to the viewport bottom while the user scrolls.\n `form=\"edit-record-form\"` ties the submit button to the <form> above\n even though it's not a descendant of that element. */}\n {aiFillOpen && (\n <AiFillDialog\n resourceId={resourceId}\n onClose={() => setAiFillOpen(false)}\n onFilled={applyAiFillValues}\n />\n )}\n <div className=\"sticky bottom-0 -mb-px z-20 -mx-2 border-t border-border bg-card px-2 py-3 pr-14 sm:-mx-6 sm:px-6 sm:pr-16\">\n <div className=\"flex items-center justify-between\">\n <div>\n {submitError && (\n <span className=\"text-sm text-destructive\">{submitError}</span>\n )}\n </div>\n <div className=\"flex gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() =>\n navigate(\n isNew\n ? { name: 'list', resourceId }\n : { name: 'show', resourceId, recordId: recordId! },\n )\n }\n aria-label={t('common:cancel')}\n >\n <X className=\"size-4\" />\n <span className=\"hidden sm:inline\">{t('common:cancel')}</span>\n </Button>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"submit\"\n form=\"edit-record-form\"\n disabled={form.formState.isSubmitting || isHydrating}\n aria-label={isNew ? t('common:create') : t('common:save')}\n >\n {isNew ? <Plus className=\"size-4\" /> : <Save className=\"size-4\" />}\n <span className=\"hidden sm:inline\">\n {isNew ? t('common:create') : t('common:save')}\n </span>\n </Button>\n </TooltipTrigger>\n <TooltipContent className=\"flex items-center gap-1.5\">\n <span>{isNew ? t('common:create') : t('common:save')}</span>\n <span className=\"inline-flex items-center gap-0.5\">\n <Kbd>{modLabel}</Kbd>\n <span className=\"text-muted-foreground\">+</span>\n <Kbd>S</Kbd>\n </span>\n </TooltipContent>\n </Tooltip>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\n// ── ConditionalField ──────────────────────────────────────────────────────────\n// Wraps a FormField with `showWhen` evaluation. Subscribes only to the named\n// control field via `useWatch` so unrelated form changes do not re-render the\n// branch. When the rule does not match, the entire FormField subtree (label,\n// editor, description, error) is unmounted — and crucially, the schema's\n// matching `superRefine` skips required/format checks for the same field, so\n// hidden branches cannot block submission.\n\ninterface ConditionalFieldProps {\n control: Control<FormValues>\n property: PropertyJSON\n children: React.ReactNode\n}\n\nfunction ConditionalField({\n control,\n property,\n children,\n}: ConditionalFieldProps): React.ReactElement | null {\n const rule = property.showWhen\n // useWatch with `name: undefined` would subscribe to every field, defeating\n // the purpose. Always pass a string when there's no rule we still want a\n // stable hook order, so we subscribe to the property's own path.\n const watched = useWatch({ control, name: rule?.field ?? property.path })\n if (!rule) return <>{children}</>\n const visible = evaluateShowWhen(rule, { [rule.field]: watched })\n if (!visible) return null\n return <>{children}</>\n}\n\n// Cheap structural equality for form values. Empty-ish primitives are treated\n// as equal (`''` ≈ `null` ≈ `undefined`) so the persistence watcher does not\n// store a draft for an untouched form whose defaults happen to be `''` vs\n// `undefined`. Falls back to JSON stringify for objects/arrays.\nfunction valuesEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true\n const aEmpty = a == null || a === ''\n const bEmpty = b == null || b === ''\n if (aEmpty && bEmpty) return true\n if (aEmpty || bEmpty) return false\n if (typeof a !== typeof b) return false\n if (typeof a === 'object') {\n try {\n return JSON.stringify(a) === JSON.stringify(b)\n } catch {\n return false\n }\n }\n return false\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{a as e,n as t}from"./createLucideIcon-CUopU_LC.js";import{S as n,b as r,d as i,h as a,p as o,s,x as c}from"./with-selector-NDLhu4dT.js";import{t as l}from"./info-CGVdWTj1.js";import{l as u,o as d}from"./dist-Dpg8xy_r.js";import{o as f}from"./select-BWf6walM.js";import{b as p,x as m,y as h}from"./index-t4woXGa-.js";var g=e(t(),1),_=n(),v=`Switch`,[y,b]=c(v),[x,S]=y(v);function C(e){let{__scopeSwitch:t,checked:n,children:r,defaultChecked:i,disabled:a,form:s,name:c,onCheckedChange:l,required:u,value:d=`on`,internal_do_not_use_render:f}=e,[p,m]=o({prop:n,defaultProp:i??!1,onChange:l,caller:v}),[h,y]=g.useState(null),[b,S]=g.useState(null),C={checked:p,setChecked:m,disabled:a,control:h,setControl:y,name:c,form:s,value:d,hasConsumerStoppedPropagationRef:g.useRef(!1),required:u,defaultChecked:i,isFormControl:!h||!!s||!!h.closest(`form`),bubbleInput:b,setBubbleInput:S};return(0,_.jsx)(x,{scope:t,...C,children:j(f)?f(C):r})}var w=`SwitchTrigger`,T=g.forwardRef(({__scopeSwitch:e,onClick:t,...n},o)=>{let{control:s,form:c,value:l,disabled:u,checked:d,required:f,setControl:p,setChecked:m,hasConsumerStoppedPropagationRef:h,isFormControl:v,bubbleInput:y}=S(w,e),b=r(o,p),x=g.useRef(d);return g.useEffect(()=>{let e=c?s?.ownerDocument.getElementById(c):s?.form;if(e instanceof HTMLFormElement){let t=()=>m(x.current);return e.addEventListener(`reset`,t),()=>e.removeEventListener(`reset`,t)}},[s,c,m]),(0,_.jsx)(i.button,{type:`button`,role:`switch`,"aria-checked":d,"aria-required":f,"data-state":M(d),"data-disabled":u?``:void 0,disabled:u,value:l,...n,ref:b,onClick:a(t,e=>{m(e=>!e),y&&v&&(h.current=e.isPropagationStopped(),h.current||e.stopPropagation())})})});T.displayName=w;var E=g.forwardRef((e,t)=>{let{__scopeSwitch:n,name:r,checked:i,defaultChecked:a,required:o,disabled:s,value:c,onCheckedChange:l,form:u,...d}=e;return(0,_.jsx)(C,{__scopeSwitch:n,checked:i,defaultChecked:a,disabled:s,required:o,onCheckedChange:l,name:r,form:u,value:c,internal_do_not_use_render:({isFormControl:e})=>(0,_.jsxs)(_.Fragment,{children:[(0,_.jsx)(T,{...d,ref:t,__scopeSwitch:n}),e&&(0,_.jsx)(A,{__scopeSwitch:n})]})})});E.displayName=v;var D=`SwitchThumb`,O=g.forwardRef((e,t)=>{let{__scopeSwitch:n,...r}=e,a=S(D,n);return(0,_.jsx)(i.span,{"data-state":M(a.checked),"data-disabled":a.disabled?``:void 0,...r,ref:t})});O.displayName=D;var k=`SwitchBubbleInput`,A=g.forwardRef(({__scopeSwitch:e,...t},n)=>{let{control:a,hasConsumerStoppedPropagationRef:o,checked:s,defaultChecked:c,required:l,disabled:u,name:p,value:m,form:h,bubbleInput:v,setBubbleInput:y}=S(k,e),b=r(n,y),x=f(s),C=d(a);g.useEffect(()=>{let e=v;if(!e)return;let t=window.HTMLInputElement.prototype,n=Object.getOwnPropertyDescriptor(t,`checked`).set,r=!o.current;if(x!==s&&n){let t=new Event(`click`,{bubbles:r});n.call(e,s),e.dispatchEvent(t)}},[v,x,s,o]);let w=g.useRef(s);return(0,_.jsx)(i.input,{type:`checkbox`,"aria-hidden":!0,defaultChecked:c??w.current,required:l,disabled:u,name:p,value:m,form:h,...t,tabIndex:-1,ref:b,style:{...t.style,...C,position:`absolute`,pointerEvents:`none`,opacity:0,margin:0,transform:`translateX(-100%)`}})});A.displayName=k;function j(e){return typeof e==`function`}function M(e){return e?`checked`:`unchecked`}var N=g.forwardRef(({className:e,...t},n)=>(0,_.jsx)(E,{ref:n,className:s(`peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input`,e),...t,children:(0,_.jsx)(O,{className:s(`pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0`)})}));N.displayName=E.displayName;function P({content:e,ariaLabel:t,className:n,iconClassName:r,side:i=`top`}){return(0,_.jsxs)(h,{children:[(0,_.jsx)(m,{asChild:!0,children:(0,_.jsx)(`button`,{type:`button`,"aria-label":t,className:s(`inline-flex size-4 shrink-0 items-center justify-center rounded-sm text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2`,n),children:(0,_.jsx)(l,{className:s(`size-3.5`,r)})})}),(0,_.jsx)(p,{side:i,className:`max-w-80 whitespace-pre-wrap text-left leading-relaxed`,children:e})]})}var F=g.forwardRef(({className:e,...t},n)=>(0,_.jsx)(`div`,{ref:n,"data-slot":`empty`,className:s(`flex w-full flex-col items-center justify-center gap-6 rounded-lg border border-dashed border-border bg-card/40 p-8 text-center`,e),...t}));F.displayName=`Empty`;var I=g.forwardRef(({className:e,...t},n)=>(0,_.jsx)(`div`,{ref:n,"data-slot":`empty-header`,className:s(`flex flex-col items-center gap-3 text-center`,e),...t}));I.displayName=`EmptyHeader`;var L=u(`flex shrink-0 items-center justify-center [&>svg]:size-6`,{variants:{variant:{default:`text-muted-foreground`,icon:`flex size-12 items-center justify-center rounded-full bg-muted text-muted-foreground [&>svg]:size-6`}},defaultVariants:{variant:`icon`}}),R=g.forwardRef(({className:e,variant:t,...n},r)=>(0,_.jsx)(`div`,{ref:r,"data-slot":`empty-media`,className:s(L({variant:t}),e),...n}));R.displayName=`EmptyMedia`;var z=g.forwardRef(({className:e,...t},n)=>(0,_.jsx)(`h3`,{ref:n,"data-slot":`empty-title`,className:s(`text-base font-semibold tracking-tight`,e),...t}));z.displayName=`EmptyTitle`;var B=g.forwardRef(({className:e,...t},n)=>(0,_.jsx)(`p`,{ref:n,"data-slot":`empty-description`,className:s(`max-w-sm text-sm text-muted-foreground`,e),...t}));B.displayName=`EmptyDescription`;var V=g.forwardRef(({className:e,...t},n)=>(0,_.jsx)(`div`,{ref:n,"data-slot":`empty-content`,className:s(`flex flex-wrap items-center justify-center gap-2`,e),...t}));V.displayName=`EmptyContent`;export{R as a,N as c,I as i,V as n,z as o,B as r,P as s,F as t};
2
- //# sourceMappingURL=empty-DAEAjFd3.js.map
1
+ import{a as e,n as t}from"./createLucideIcon-CUopU_LC.js";import{S as n,b as r,d as i,h as a,p as o,s,x as c}from"./with-selector-NDLhu4dT.js";import{t as l}from"./info-CGVdWTj1.js";import{l as u,o as d}from"./dist-Dpg8xy_r.js";import{o as f}from"./select-CR4acjX0.js";import{b as p,x as m,y as h}from"./index-BL8keDxQ.js";var g=e(t(),1),_=n(),v=`Switch`,[y,b]=c(v),[x,S]=y(v);function C(e){let{__scopeSwitch:t,checked:n,children:r,defaultChecked:i,disabled:a,form:s,name:c,onCheckedChange:l,required:u,value:d=`on`,internal_do_not_use_render:f}=e,[p,m]=o({prop:n,defaultProp:i??!1,onChange:l,caller:v}),[h,y]=g.useState(null),[b,S]=g.useState(null),C={checked:p,setChecked:m,disabled:a,control:h,setControl:y,name:c,form:s,value:d,hasConsumerStoppedPropagationRef:g.useRef(!1),required:u,defaultChecked:i,isFormControl:!h||!!s||!!h.closest(`form`),bubbleInput:b,setBubbleInput:S};return(0,_.jsx)(x,{scope:t,...C,children:j(f)?f(C):r})}var w=`SwitchTrigger`,T=g.forwardRef(({__scopeSwitch:e,onClick:t,...n},o)=>{let{control:s,form:c,value:l,disabled:u,checked:d,required:f,setControl:p,setChecked:m,hasConsumerStoppedPropagationRef:h,isFormControl:v,bubbleInput:y}=S(w,e),b=r(o,p),x=g.useRef(d);return g.useEffect(()=>{let e=c?s?.ownerDocument.getElementById(c):s?.form;if(e instanceof HTMLFormElement){let t=()=>m(x.current);return e.addEventListener(`reset`,t),()=>e.removeEventListener(`reset`,t)}},[s,c,m]),(0,_.jsx)(i.button,{type:`button`,role:`switch`,"aria-checked":d,"aria-required":f,"data-state":M(d),"data-disabled":u?``:void 0,disabled:u,value:l,...n,ref:b,onClick:a(t,e=>{m(e=>!e),y&&v&&(h.current=e.isPropagationStopped(),h.current||e.stopPropagation())})})});T.displayName=w;var E=g.forwardRef((e,t)=>{let{__scopeSwitch:n,name:r,checked:i,defaultChecked:a,required:o,disabled:s,value:c,onCheckedChange:l,form:u,...d}=e;return(0,_.jsx)(C,{__scopeSwitch:n,checked:i,defaultChecked:a,disabled:s,required:o,onCheckedChange:l,name:r,form:u,value:c,internal_do_not_use_render:({isFormControl:e})=>(0,_.jsxs)(_.Fragment,{children:[(0,_.jsx)(T,{...d,ref:t,__scopeSwitch:n}),e&&(0,_.jsx)(A,{__scopeSwitch:n})]})})});E.displayName=v;var D=`SwitchThumb`,O=g.forwardRef((e,t)=>{let{__scopeSwitch:n,...r}=e,a=S(D,n);return(0,_.jsx)(i.span,{"data-state":M(a.checked),"data-disabled":a.disabled?``:void 0,...r,ref:t})});O.displayName=D;var k=`SwitchBubbleInput`,A=g.forwardRef(({__scopeSwitch:e,...t},n)=>{let{control:a,hasConsumerStoppedPropagationRef:o,checked:s,defaultChecked:c,required:l,disabled:u,name:p,value:m,form:h,bubbleInput:v,setBubbleInput:y}=S(k,e),b=r(n,y),x=f(s),C=d(a);g.useEffect(()=>{let e=v;if(!e)return;let t=window.HTMLInputElement.prototype,n=Object.getOwnPropertyDescriptor(t,`checked`).set,r=!o.current;if(x!==s&&n){let t=new Event(`click`,{bubbles:r});n.call(e,s),e.dispatchEvent(t)}},[v,x,s,o]);let w=g.useRef(s);return(0,_.jsx)(i.input,{type:`checkbox`,"aria-hidden":!0,defaultChecked:c??w.current,required:l,disabled:u,name:p,value:m,form:h,...t,tabIndex:-1,ref:b,style:{...t.style,...C,position:`absolute`,pointerEvents:`none`,opacity:0,margin:0,transform:`translateX(-100%)`}})});A.displayName=k;function j(e){return typeof e==`function`}function M(e){return e?`checked`:`unchecked`}var N=g.forwardRef(({className:e,...t},n)=>(0,_.jsx)(E,{ref:n,className:s(`peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input`,e),...t,children:(0,_.jsx)(O,{className:s(`pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0`)})}));N.displayName=E.displayName;function P({content:e,ariaLabel:t,className:n,iconClassName:r,side:i=`top`}){return(0,_.jsxs)(h,{children:[(0,_.jsx)(m,{asChild:!0,children:(0,_.jsx)(`button`,{type:`button`,"aria-label":t,className:s(`inline-flex size-4 shrink-0 items-center justify-center rounded-sm text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2`,n),children:(0,_.jsx)(l,{className:s(`size-3.5`,r)})})}),(0,_.jsx)(p,{side:i,className:`max-w-80 whitespace-pre-wrap text-left leading-relaxed`,children:e})]})}var F=g.forwardRef(({className:e,...t},n)=>(0,_.jsx)(`div`,{ref:n,"data-slot":`empty`,className:s(`flex w-full flex-col items-center justify-center gap-6 rounded-lg border border-dashed border-border bg-card/40 p-8 text-center`,e),...t}));F.displayName=`Empty`;var I=g.forwardRef(({className:e,...t},n)=>(0,_.jsx)(`div`,{ref:n,"data-slot":`empty-header`,className:s(`flex flex-col items-center gap-3 text-center`,e),...t}));I.displayName=`EmptyHeader`;var L=u(`flex shrink-0 items-center justify-center [&>svg]:size-6`,{variants:{variant:{default:`text-muted-foreground`,icon:`flex size-12 items-center justify-center rounded-full bg-muted text-muted-foreground [&>svg]:size-6`}},defaultVariants:{variant:`icon`}}),R=g.forwardRef(({className:e,variant:t,...n},r)=>(0,_.jsx)(`div`,{ref:r,"data-slot":`empty-media`,className:s(L({variant:t}),e),...n}));R.displayName=`EmptyMedia`;var z=g.forwardRef(({className:e,...t},n)=>(0,_.jsx)(`h3`,{ref:n,"data-slot":`empty-title`,className:s(`text-base font-semibold tracking-tight`,e),...t}));z.displayName=`EmptyTitle`;var B=g.forwardRef(({className:e,...t},n)=>(0,_.jsx)(`p`,{ref:n,"data-slot":`empty-description`,className:s(`max-w-sm text-sm text-muted-foreground`,e),...t}));B.displayName=`EmptyDescription`;var V=g.forwardRef(({className:e,...t},n)=>(0,_.jsx)(`div`,{ref:n,"data-slot":`empty-content`,className:s(`flex flex-wrap items-center justify-center gap-2`,e),...t}));V.displayName=`EmptyContent`;export{R as a,N as c,I as i,V as n,z as o,B as r,P as s,F as t};
2
+ //# sourceMappingURL=empty-Cposcczv.js.map