your-ai-workflow-firebase-os 2.0.8 → 2.0.9

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 (139) hide show
  1. package/dist/{Assets-Dd_96avv.js → Assets-COH4Ji57.js} +5 -5
  2. package/dist/{Assets-CBBNIHrw.cjs → Assets-D7fDckSi.cjs} +1 -1
  3. package/dist/{Attachments-C6QrTcNt.cjs → Attachments-BMuQ0CD4.cjs} +1 -1
  4. package/dist/{Attachments-YyjQmhBx.js → Attachments-Co1UkdWB.js} +2 -2
  5. package/dist/{Billing-B6f49cGH.cjs → Billing-DkuJdls5.cjs} +1 -1
  6. package/dist/{Billing-BZafAizg.js → Billing-kk4ZMd3z.js} +4 -4
  7. package/dist/{BookingCalendar-DYsA71vl.cjs → BookingCalendar-BcvJiyaq.cjs} +1 -1
  8. package/dist/{BookingCalendar-_xoRa2tL.js → BookingCalendar-Bej__mIs.js} +1 -1
  9. package/dist/{Button-DSldWACF.js → Button-BGN6q7lY.js} +1 -1
  10. package/dist/{Button-PyTaaoyu.cjs → Button-Ccy4wFZ1.cjs} +1 -1
  11. package/dist/{ConfirmModal-CQ73WYUg.cjs → ConfirmModal-BUNtss4a.cjs} +1 -1
  12. package/dist/{ConfirmModal-C1dM-bzk.js → ConfirmModal-BW9e6Y7d.js} +3 -3
  13. package/dist/{ContactPopup-D5Hh0bfE.cjs → ContactPopup-D8aSSlmS.cjs} +1 -1
  14. package/dist/{ContactPopup-CL4AMwK9.js → ContactPopup-Fs7wzrOX.js} +7 -7
  15. package/dist/{CopyLink-BnYpVy6H.cjs → CopyLink-C5lKLyOU.cjs} +1 -1
  16. package/dist/{CopyLink-rLr_5eNM.js → CopyLink-CNjDLzOl.js} +2 -2
  17. package/dist/{DashboardNav-B0G943ux.js → DashboardNav-CEd8gGPm.js} +3 -3
  18. package/dist/{DashboardNav-DOl9gJuu.cjs → DashboardNav-GgEUpyTa.cjs} +1 -1
  19. package/dist/{EmailAdmin-CWHMMybh.cjs → EmailAdmin-d_gWd48U.cjs} +1 -1
  20. package/dist/{EmailAdmin-humrSTzI.js → EmailAdmin-pbQ-f9Ge.js} +9 -9
  21. package/dist/{EventCard-CrPswwyG.js → EventCard-BSGLYD64.js} +2 -2
  22. package/dist/{EventCard-6eCfvOA-.cjs → EventCard-DAsGsicK.cjs} +1 -1
  23. package/dist/{FileViewerPopup-DQmhXMSg.cjs → FileViewerPopup-CkLUYCNo.cjs} +1 -1
  24. package/dist/{FileViewerPopup-Dnl3td2o.js → FileViewerPopup-gqhRT22v.js} +2 -2
  25. package/dist/{FormNote-BWGLs9lx.js → FormNote-DJ9HBokL.js} +1 -1
  26. package/dist/{FormNote-CX2rSBDB.cjs → FormNote-DP0GK9ya.cjs} +1 -1
  27. package/dist/{FormsAdmin-Tg20B0iA.cjs → FormsAdmin-5KTTp6zo.cjs} +1 -1
  28. package/dist/{FormsAdmin-CHwmKnYU.js → FormsAdmin-BNI63vEk.js} +9 -9
  29. package/dist/{Inbox-Cgq4MALU.js → Inbox-D9Y5K8Se.js} +9 -9
  30. package/dist/{Inbox-BPwIiThg.cjs → Inbox-DjslBakx.cjs} +1 -1
  31. package/dist/{Loader-DP_dL5qC.js → Loader-CVoz1Zf0.js} +1 -1
  32. package/dist/{Loader-p3eNQDUU.cjs → Loader-QHqQsXLr.cjs} +1 -1
  33. package/dist/{ManagePlanButton-BRW7Sevd.cjs → ManagePlanButton-Buwfs2bU.cjs} +1 -1
  34. package/dist/{ManagePlanButton-CNLCxK-o.js → ManagePlanButton-CE4uyh_7.js} +2 -2
  35. package/dist/{MyBookings-C_pqsSEk.js → MyBookings-B4DndHV6.js} +7 -7
  36. package/dist/{MyBookings-BC5sn_fE.cjs → MyBookings-CkEioQIj.cjs} +1 -1
  37. package/dist/{PageTitle-DFGW71q8.js → PageTitle-DCoUQWw6.js} +2 -2
  38. package/dist/{PageTitle-BWmE74WQ.cjs → PageTitle-DQkvCB11.cjs} +1 -1
  39. package/dist/PagesAdmin-D0qgoZtW.js +3 -0
  40. package/dist/{PagesAdmin-jjnDLYmF.js → PagesAdmin-DzLJWKBJ.js} +21 -21
  41. package/dist/PagesAdmin-KUxCI1Mr.cjs +1 -0
  42. package/dist/{PagesAdmin-BZZ3by92.cjs → PagesAdmin-YdYgmuEB.cjs} +1 -1
  43. package/dist/{PaymentsAdmin-CI0zXraR.cjs → PaymentsAdmin-B5l-f0mp.cjs} +1 -1
  44. package/dist/{PaymentsAdmin-DeBMmFFo.js → PaymentsAdmin-C3cEOeIs.js} +15 -15
  45. package/dist/{Popup-DmPEk98h.js → Popup-Bi63lzoS.js} +1 -1
  46. package/dist/{Popup-nq7YNM4N.cjs → Popup-COnHpbrY.cjs} +1 -1
  47. package/dist/{ProviderMark-DJ5mYjYn.cjs → ProviderMark--adeeajP.cjs} +1 -1
  48. package/dist/{ProviderMark-CAeOnBsB.js → ProviderMark-BvEMlZAm.js} +1 -1
  49. package/dist/{PublishApp-mMMwf_in.js → PublishApp-B9Fo6xN0.js} +7 -7
  50. package/dist/{PublishApp-DI96gX9b.cjs → PublishApp-Bc82Ijkq.cjs} +1 -1
  51. package/dist/{Said-DAD7Ctp_.js → Said-BvSRaEfZ.js} +1 -1
  52. package/dist/{Said-DlJOjNMN.cjs → Said-W3KFi5uX.cjs} +1 -1
  53. package/dist/{ScheduleAdmin-dWj_N_tf.cjs → ScheduleAdmin-Dh_hW6p4.cjs} +1 -1
  54. package/dist/{ScheduleAdmin-C4W8Ls0D.js → ScheduleAdmin-bk3GgxKP.js} +14 -14
  55. package/dist/{SchedulePicker-CwKId9JF.cjs → SchedulePicker-CN0755Ek.cjs} +1 -1
  56. package/dist/{SchedulePicker-BOSJEcfL.js → SchedulePicker-DO4PewPJ.js} +2 -2
  57. package/dist/{Setup-DcZzh6Xd.cjs → Setup-R4r6_tbV.cjs} +1 -1
  58. package/dist/{Setup-NOvtplUS.js → Setup-_G-s5y5Q.js} +3 -3
  59. package/dist/{SetupPayments-DrXK0LQa.js → SetupPayments-CkolcOtv.js} +5 -5
  60. package/dist/{SetupPayments-CZ0KqXdR.cjs → SetupPayments-CuFk9REC.cjs} +1 -1
  61. package/dist/{SignInAdmin-CwIUAJrv.cjs → SignInAdmin-B1yLLaQu.cjs} +1 -1
  62. package/dist/{SignInAdmin-Cb65ChHL.js → SignInAdmin-BLEn0rId.js} +9 -9
  63. package/dist/{SupportBar-528kXe-Z.js → SupportBar-DI_XbEsG.js} +4 -4
  64. package/dist/{SupportBar-CNVXSYwT.cjs → SupportBar-DLWruzQb.cjs} +1 -1
  65. package/dist/{SystemTabContent-EegzTuLd.cjs → SystemTabContent-BWhRHoXx.cjs} +1 -1
  66. package/dist/{SystemTabContent-C4azXKMs.js → SystemTabContent-CMyT7mDN.js} +2 -2
  67. package/dist/{TemplateDrive-XDRPkxIj.cjs → TemplateDrive-BJN-ReA_.cjs} +1 -1
  68. package/dist/{TemplateDrive-CfPXKMKX.js → TemplateDrive-DNBwL0oy.js} +10 -10
  69. package/dist/{ThemeAdmin-XLbC9fX7.js → ThemeAdmin-Cnqefrz6.js} +6 -6
  70. package/dist/ThemeAdmin-CoE_c5-P.cjs +1 -0
  71. package/dist/ThemeAdmin-DI7QaZ-0.js +2 -0
  72. package/dist/{ThemeAdmin-BrEozdpZ.cjs → ThemeAdmin-DkgmjW3g.cjs} +1 -1
  73. package/dist/TimeZoneField-Ckn1pKAL.cjs +11 -0
  74. package/dist/{TimeZoneField-Dv389mAe.js → TimeZoneField-oIMwb5_X.js} +119 -107
  75. package/dist/{TransactionsAdmin-X-NjI4NB.js → TransactionsAdmin-Brs-CEcG.js} +11 -11
  76. package/dist/{TransactionsAdmin-DgsG629u.cjs → TransactionsAdmin-C5wQRR1g.cjs} +1 -1
  77. package/dist/{Trouble-qjWYeKzC.js → Trouble-CtFq7tjk.js} +1 -1
  78. package/dist/{Trouble-DokPNHQZ.cjs → Trouble-KQZyf6aY.cjs} +1 -1
  79. package/dist/{Users-BEjl_Vjc.cjs → Users-B16L9cKI.cjs} +1 -1
  80. package/dist/{Users-BUGb7-Kz.js → Users-CbI4K_Le.js} +15 -15
  81. package/dist/{VideoPlayer-BVOkrJBR.cjs → VideoPlayer-CggwpVXH.cjs} +1 -1
  82. package/dist/{VideoPlayer-DB0oz6lM.js → VideoPlayer-QI1Jc3bS.js} +1 -1
  83. package/dist/appIcons-C90OKlV5.cjs +130 -0
  84. package/dist/{appIcons-CUXAX_gJ.js → appIcons-CCArfCDe.js} +761 -735
  85. package/dist/{arrivalRoads-BZk39p8Z.js → arrivalRoads-CGXm9Ntm.js} +0 -0
  86. package/dist/{arrivalRoads-CD7pt03E.cjs → arrivalRoads-Cc6AZM-d.cjs} +0 -0
  87. package/dist/{bookingPages-BxqkyZ-M.js → bookingPages-BFSY3Riv.js} +1 -1
  88. package/dist/{bookingPages-2fn9xPiA.cjs → bookingPages-Dx1ViiwW.cjs} +1 -1
  89. package/dist/{contentFallback-C6xLwXTs.js → contentFallback-BGGpI1Ts.js} +2 -2
  90. package/dist/{contentFallback-DLm_iHo9.cjs → contentFallback-DVCrIUvK.cjs} +1 -1
  91. package/dist/{email-DxxovRtf.js → email-PBHbXXgR.js} +1 -1
  92. package/dist/{email-DD48BP42.cjs → email-Sya6gl4F.cjs} +1 -1
  93. package/dist/lib/basket.d.ts +29 -9
  94. package/dist/lib/recordPrice.d.ts +1 -1
  95. package/dist/{notices-Cwon5Q0Y.cjs → notices-CKm9-Pqt.cjs} +1 -1
  96. package/dist/{notices-C4yqYzBw.js → notices-CysS7BLF.js} +1 -1
  97. package/dist/{ownerMail-CGmDk7aP.cjs → ownerMail-BS9SjJ2u.cjs} +1 -1
  98. package/dist/{ownerMail-Chzy5Ehy.js → ownerMail-DepG5-Qw.js} +2 -2
  99. package/dist/{pageFiles-BClshvXs.cjs → pageFiles-Cn0YQ4Ur.cjs} +1 -1
  100. package/dist/{pageFiles-D-GYqRgZ.js → pageFiles-ZFPSCDZz.js} +1 -1
  101. package/dist/{paidInFull-KuStok9_.cjs → paidInFull-CZywIs-V.cjs} +1 -1
  102. package/dist/{paidInFull-D14Eh0QV.js → paidInFull-mBOh9iwN.js} +1 -1
  103. package/dist/{paidSessions-Cr_93LGa.js → paidSessions-B8e5RHi4.js} +7 -7
  104. package/dist/{paidSessions-QXv7SHeb.cjs → paidSessions-D-zHC4oG.cjs} +1 -1
  105. package/dist/{people-D8nPPMlM.cjs → people-BwWVVLfy.cjs} +1 -1
  106. package/dist/{people-sk2DcHPi.js → people-Wk2opW4G.js} +1 -1
  107. package/dist/{publishSteps-DB1Hxr6H.js → publishSteps-Cf5pSB_H.js} +1 -1
  108. package/dist/{publishSteps-CaZRpC3C.cjs → publishSteps-DvWlF0p_.cjs} +1 -1
  109. package/dist/{recordLock-Dnz61J-_.js → recordLock-CMOiezNC.js} +1 -1
  110. package/dist/{recordLock-CLUp3QNh.cjs → recordLock-CiulizO1.cjs} +1 -1
  111. package/dist/{recordsKey-R5BjLoGQ.cjs → recordsKey-C4E2vOti.cjs} +1 -1
  112. package/dist/{recordsKey-DHJJWWOo.js → recordsKey-Cd216nq1.js} +2 -2
  113. package/dist/{registrationFields-COv8jW4n.cjs → registrationFields-DHHTptcl.cjs} +1 -1
  114. package/dist/{registrationFields-CeTZSerx.js → registrationFields-DdHoMPAQ.js} +1 -1
  115. package/dist/renderer.cjs.js +1 -1
  116. package/dist/renderer.es.js +1 -1
  117. package/dist/{roles-5juCr5sY.cjs → roles-BBDIJzox.cjs} +1 -1
  118. package/dist/{roles-hzcMnn_M.js → roles-DiwP6-WQ.js} +3 -3
  119. package/dist/{scheduleData-BpkfnBjP.cjs → scheduleData-BXjNXVHY.cjs} +1 -1
  120. package/dist/{scheduleData-BLCUm84s.js → scheduleData-DR6A-Q7Z.js} +1 -1
  121. package/dist/server.cjs.js +1 -1
  122. package/dist/server.es.js +1 -1
  123. package/dist/{serviceStatus-5sk8MPjW.js → serviceStatus-C9izcuQz.js} +2 -2
  124. package/dist/{serviceStatus-1pGLLilF.cjs → serviceStatus-Cde96_OO.cjs} +1 -1
  125. package/dist/{serviceSwitches-BWnZBooS.js → serviceSwitches-CZHwvVfP.js} +1 -1
  126. package/dist/{serviceSwitches-Do_pkFCu.cjs → serviceSwitches-mhJbQBrV.cjs} +1 -1
  127. package/dist/vite.cjs.js +1 -1
  128. package/dist/vite.es.js +1 -1
  129. package/dist/your-ai-workflow-firebase-os.cjs.js +8 -8
  130. package/dist/your-ai-workflow-firebase-os.css +1 -1
  131. package/dist/your-ai-workflow-firebase-os.es.js +358 -316
  132. package/package.json +1 -1
  133. package/src/index.css +41 -6
  134. package/dist/PagesAdmin-B-XopEi9.js +0 -3
  135. package/dist/PagesAdmin-nL5ZltFn.cjs +0 -1
  136. package/dist/ThemeAdmin-CwCiTp2I.js +0 -2
  137. package/dist/ThemeAdmin-Db5edTYj.cjs +0 -1
  138. package/dist/TimeZoneField-zR8N2Fj0.cjs +0 -11
  139. package/dist/appIcons-BNovDw6_.cjs +0 -130
@@ -1,4 +1,4 @@
1
- import { ui as e } from "./TimeZoneField-Dv389mAe.js";
1
+ import { ui as e } from "./TimeZoneField-oIMwb5_X.js";
2
2
  import { It as t, P as n } from "./schedule-C13m_kiO.js";
3
3
  import { useEffect as r, useState as i } from "react";
4
4
  import { deleteDoc as a, doc as o, setDoc as s } from "firebase/firestore";
@@ -1 +1 @@
1
- require(`./chunk-CiTBaPhY.cjs`);const e=require(`./TimeZoneField-zR8N2Fj0.cjs`),t=require(`./schedule-BAea6q8_.cjs`);let n=require(`react`),r=require(`firebase/firestore`);var i=`sys_bookingpages`,a=(e,t=``,n=``)=>({id:e,title:t,intro:``,photo:``,schedules:[],enabled:!0,memberId:n,createdAt:Date.now()}),o=e=>e.normalize(`NFKD`).replace(/[\u0300-\u036f]/g,``).toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``).slice(0,48);function s(e,t){let n=o(e)||`page`;if(!t.includes(n))return n;for(let e=2;;e++){let r=`${n}-${e}`;if(!t.includes(r))return r}}var c=e=>`/meet/${e}`,l=(e,t,n)=>n?e:e.filter(e=>!!t&&e.memberId===t),u=(e,t)=>e.schedules.map(e=>t.find(t=>t.id===e)).filter(e=>!!e),d=(e,n)=>u(e,n).filter(t.P),f=(e,t)=>({...e,schedules:e.schedules.includes(t)?e.schedules.filter(e=>e!==t):[...e.schedules,t]});function p(e,n){if(!e.title.trim())return`Give the page a name — usually the name of whoever it is for.`;if(!e.schedules.length)return`Tick at least one meeting to offer on this page.`;if(!d(e,n).length){let r=u(e,n);return r.length?`${t.It(r[0])} is not taking bookings — switch it on above, or tick a different meeting.`:`The meetings picked for this page no longer exist — tick one that does.`}return``}var m=e=>e.title.trim()||`Booking page`;function h(){let[e,t]=(0,n.useState)({loading:!1,pages:[]});return(0,n.useEffect)(()=>{},[]),e}async function g(t){try{let{id:n,...a}=t;return await(0,r.setDoc)((0,r.doc)(e.ui,i,n),{...a,updatedAt:Date.now()}),null}catch(e){return console.error(`Could not save the booking page`,e),`The page could not be saved — it is saved by whoever it belongs to, so make sure you are signed in as them or as an admin, and try again.`}}async function _(t){try{return await(0,r.deleteDoc)((0,r.doc)(e.ui,i,t)),null}catch(e){return console.error(`Could not remove the booking page`,e),`It could not be removed — a page is removed by whoever it belongs to, or by an admin.`}}async function v(t,n){if(t===n.id)return g(n);let a=await g(n);if(a)return a;try{await(0,r.deleteDoc)((0,r.doc)(e.ui,i,t))}catch(e){return console.error(`Could not remove the old booking page`,e),`The page moved, but its old address is still live — remove it and try again.`}return null}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return l}});
1
+ require(`./chunk-CiTBaPhY.cjs`);const e=require(`./TimeZoneField-Ckn1pKAL.cjs`),t=require(`./schedule-BAea6q8_.cjs`);let n=require(`react`),r=require(`firebase/firestore`);var i=`sys_bookingpages`,a=(e,t=``,n=``)=>({id:e,title:t,intro:``,photo:``,schedules:[],enabled:!0,memberId:n,createdAt:Date.now()}),o=e=>e.normalize(`NFKD`).replace(/[\u0300-\u036f]/g,``).toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``).slice(0,48);function s(e,t){let n=o(e)||`page`;if(!t.includes(n))return n;for(let e=2;;e++){let r=`${n}-${e}`;if(!t.includes(r))return r}}var c=e=>`/meet/${e}`,l=(e,t,n)=>n?e:e.filter(e=>!!t&&e.memberId===t),u=(e,t)=>e.schedules.map(e=>t.find(t=>t.id===e)).filter(e=>!!e),d=(e,n)=>u(e,n).filter(t.P),f=(e,t)=>({...e,schedules:e.schedules.includes(t)?e.schedules.filter(e=>e!==t):[...e.schedules,t]});function p(e,n){if(!e.title.trim())return`Give the page a name — usually the name of whoever it is for.`;if(!e.schedules.length)return`Tick at least one meeting to offer on this page.`;if(!d(e,n).length){let r=u(e,n);return r.length?`${t.It(r[0])} is not taking bookings — switch it on above, or tick a different meeting.`:`The meetings picked for this page no longer exist — tick one that does.`}return``}var m=e=>e.title.trim()||`Booking page`;function h(){let[e,t]=(0,n.useState)({loading:!1,pages:[]});return(0,n.useEffect)(()=>{},[]),e}async function g(t){try{let{id:n,...a}=t;return await(0,r.setDoc)((0,r.doc)(e.ui,i,n),{...a,updatedAt:Date.now()}),null}catch(e){return console.error(`Could not save the booking page`,e),`The page could not be saved — it is saved by whoever it belongs to, so make sure you are signed in as them or as an admin, and try again.`}}async function _(t){try{return await(0,r.deleteDoc)((0,r.doc)(e.ui,i,t)),null}catch(e){return console.error(`Could not remove the booking page`,e),`It could not be removed — a page is removed by whoever it belongs to, or by an admin.`}}async function v(t,n){if(t===n.id)return g(n);let a=await g(n);if(a)return a;try{await(0,r.deleteDoc)((0,r.doc)(e.ui,i,t))}catch(e){return console.error(`Could not remove the old booking page`,e),`The page moved, but its old address is still live — remove it and try again.`}return null}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return l}});
@@ -1,5 +1,5 @@
1
- import { ei as e, oi as t, ri as n } from "./TimeZoneField-Dv389mAe.js";
2
- import { t as r } from "./Trouble-qjWYeKzC.js";
1
+ import { ei as e, oi as t, ri as n } from "./TimeZoneField-oIMwb5_X.js";
2
+ import { t as r } from "./Trouble-CtFq7tjk.js";
3
3
  import i, { useSyncExternalStore as a } from "react";
4
4
  import { jsx as o } from "react/jsx-runtime";
5
5
  //#region src/components/AppCrash.tsx
@@ -1,4 +1,4 @@
1
- const e=require(`./chunk-CiTBaPhY.cjs`),t=require(`./TimeZoneField-zR8N2Fj0.cjs`),n=require(`./Trouble-DokPNHQZ.cjs`);let r=require(`react`);r=e.a(r,1);let i=require(`react/jsx-runtime`);var a=`This screen stopped`,o=`Something went wrong while drawing this page. Nothing you have saved is affected — trying again usually puts it right.`,s=`This part stopped`,c=`One piece of this page could not be drawn. Everything else on the screen still works — try again, and reload the page if it keeps happening.`,l=6e3,u=2,d=class extends r.default.Component{state={error:null,attempt:0,failed:0};retriedAt=0;static getDerivedStateFromError(e){return{error:e}}componentDidCatch(e,t){console.error(`Your AI Firebase could not draw this screen`,e,t),this.retriedAt&&Date.now()-this.retriedAt<l&&this.setState(e=>({failed:e.failed+1}))}componentDidUpdate(e){this.state.error&&e.resetKey!==this.props.resetKey&&(this.setState({error:null,failed:0}),this.retriedAt=0)}tryAgain=()=>{this.retriedAt=Date.now(),this.setState(e=>({error:null,attempt:e.attempt+1}))};reload=()=>{if(this.props.reload){this.props.reload();return}typeof window<`u`&&window.location.reload()};render(){if(!this.state.error)return(0,i.jsx)(r.default.Fragment,{children:this.props.children},this.state.attempt);let e=this.props.size===`part`,l=t.ri(this.state.error),d=l.kind===`unknown`?{title:e?s:a,message:e?c:o}:void 0,f=this.state.failed<u;return(0,i.jsx)(n.t,{error:this.state.error,override:d,size:e?`part`:`page`,onRetry:f&&l.next!==`reload`?this.tryAgain:void 0,reload:this.reload})}},f={pages:`src/your-ai-workflow-firebase-os/microcomponents/registry.ts`,home:`src/your-ai-workflow-firebase-os/Home.tsx`,menu:`src/your-ai-workflow-firebase-os/Menu.tsx`},p=5e3,m={pages:`Your AI Firebase could not load the page-content list (src/your-ai-workflow-firebase-os/microcomponents/registry.ts) — one of the files it imports is broken. Every page now loads its own file instead, so only the broken page is left empty:`,home:`Your AI Firebase could not draw the home page (src/your-ai-workflow-firebase-os/Home.tsx), so the starter home page is showing in its place:`,menu:`Your AI Firebase could not draw the menu (src/your-ai-workflow-firebase-os/Menu.tsx), so the standard menu is showing in its place:`},h=`Your AI Firebase drew the home page (src/your-ai-workflow-firebase-os/Home.tsx) and it stopped part-way:`,g={pages:`One of your pages could not open.`,home:`Your home page could not open, so the starter one is showing.`,menu:`Your menu could not open, so the standard one is showing.`},ee=`Your home page stopped part-way while it was being drawn.`,_=e=>e?`Your ${e} page could not open.`:g.pages,v=`Everything else still works. Copy the fix and paste it to your assistant.`,y=[`pages`,`page`,`home`,`menu`],b=new Map,x=`none`,S=0,C=new Set,w=()=>{S+=1,C.forEach(e=>e())},T=e=>(C.add(e),()=>{C.delete(e)}),E=e=>String(e?.message??e??``),D=()=>typeof document<`u`&&Array.from(document.querySelectorAll(`script[src]`)).some(e=>/\/assets\/[^/?#]+-[\w-]{6,}\.m?js(?:[?#]|$)/.test(e.getAttribute(`src`)||``)),O=()=>{try{let e=typeof window<`u`?window.location.origin:``;return e&&e!==`null`?e:``}catch{return``}},k=e=>{let t=O(),n=E(e).split(`
1
+ const e=require(`./chunk-CiTBaPhY.cjs`),t=require(`./TimeZoneField-Ckn1pKAL.cjs`),n=require(`./Trouble-KQZyf6aY.cjs`);let r=require(`react`);r=e.a(r,1);let i=require(`react/jsx-runtime`);var a=`This screen stopped`,o=`Something went wrong while drawing this page. Nothing you have saved is affected — trying again usually puts it right.`,s=`This part stopped`,c=`One piece of this page could not be drawn. Everything else on the screen still works — try again, and reload the page if it keeps happening.`,l=6e3,u=2,d=class extends r.default.Component{state={error:null,attempt:0,failed:0};retriedAt=0;static getDerivedStateFromError(e){return{error:e}}componentDidCatch(e,t){console.error(`Your AI Firebase could not draw this screen`,e,t),this.retriedAt&&Date.now()-this.retriedAt<l&&this.setState(e=>({failed:e.failed+1}))}componentDidUpdate(e){this.state.error&&e.resetKey!==this.props.resetKey&&(this.setState({error:null,failed:0}),this.retriedAt=0)}tryAgain=()=>{this.retriedAt=Date.now(),this.setState(e=>({error:null,attempt:e.attempt+1}))};reload=()=>{if(this.props.reload){this.props.reload();return}typeof window<`u`&&window.location.reload()};render(){if(!this.state.error)return(0,i.jsx)(r.default.Fragment,{children:this.props.children},this.state.attempt);let e=this.props.size===`part`,l=t.ri(this.state.error),d=l.kind===`unknown`?{title:e?s:a,message:e?c:o}:void 0,f=this.state.failed<u;return(0,i.jsx)(n.t,{error:this.state.error,override:d,size:e?`part`:`page`,onRetry:f&&l.next!==`reload`?this.tryAgain:void 0,reload:this.reload})}},f={pages:`src/your-ai-workflow-firebase-os/microcomponents/registry.ts`,home:`src/your-ai-workflow-firebase-os/Home.tsx`,menu:`src/your-ai-workflow-firebase-os/Menu.tsx`},p=5e3,m={pages:`Your AI Firebase could not load the page-content list (src/your-ai-workflow-firebase-os/microcomponents/registry.ts) — one of the files it imports is broken. Every page now loads its own file instead, so only the broken page is left empty:`,home:`Your AI Firebase could not draw the home page (src/your-ai-workflow-firebase-os/Home.tsx), so the starter home page is showing in its place:`,menu:`Your AI Firebase could not draw the menu (src/your-ai-workflow-firebase-os/Menu.tsx), so the standard menu is showing in its place:`},h=`Your AI Firebase drew the home page (src/your-ai-workflow-firebase-os/Home.tsx) and it stopped part-way:`,g={pages:`One of your pages could not open.`,home:`Your home page could not open, so the starter one is showing.`,menu:`Your menu could not open, so the standard one is showing.`},ee=`Your home page stopped part-way while it was being drawn.`,_=e=>e?`Your ${e} page could not open.`:g.pages,v=`Everything else still works. Copy the fix and paste it to your assistant.`,y=[`pages`,`page`,`home`,`menu`],b=new Map,x=`none`,S=0,C=new Set,w=()=>{S+=1,C.forEach(e=>e())},T=e=>(C.add(e),()=>{C.delete(e)}),E=e=>String(e?.message??e??``),D=()=>typeof document<`u`&&Array.from(document.querySelectorAll(`script[src]`)).some(e=>/\/assets\/[^/?#]+-[\w-]{6,}\.m?js(?:[?#]|$)/.test(e.getAttribute(`src`)||``)),O=()=>{try{let e=typeof window<`u`?window.location.origin:``;return e&&e!==`null`?e:``}catch{return``}},k=e=>{let t=O(),n=E(e).split(`
2
2
  `)[0];return(t?n.split(t).join(``):n).replace(/[?&](?:import|[tv]=[\w.-]+)\b/g,``).trim().slice(0,300)},A=e=>{let t=[e.which,e.file,e.how,e.words].join(`|`);b.has(t)||(b.set(t,{...e,key:t}),w())};function j(e,t,n=`missing`){if([...b.values()].some(t=>t.which===e))return;let r=n===`threw`&&e===`home`;console.error(`${r?h:m[e]} ${E(t)}`,t),A({which:e,how:r?`threw`:`missing`,file:f[e],words:k(t)})}function M(e,t,n){[...b.values()].some(t=>t.which===`page`&&t.file===e)||A({which:`page`,how:`missing`,file:e,page:t,words:k(n)})}var N=`This is a repair, not a redesign: every section, word, picture and link stays exactly where and as it is.`,P=e=>{let t=e.words?` The browser says: "${e.words}".`:``;switch(e.which){case`home`:return e.how===`threw`?`Repair ${e.file}: it loads, then stops part-way while it is drawn.${t} Fix only that fault, and keep export function Home. ${N}`:`Repair ${e.file}: it does not load, so my site shows the starter home page instead of mine.${t} Fix only what stops it loading, and keep export function Home. ${N}`;case`menu`:return`Repair ${e.file}: it does not work, so my site shows the standard menu instead of mine.${t} Fix only that, and keep export function Menu. ${N}`;case`pages`:return`Repair ${e.file}: it does not load.${t} Either a page file it imports is broken — repair that file — or one of its lines names a file that is not there, or not by its exact name — correct that line. Change nothing else in any file.`;case`page`:return`Repair ${e.file}${e.page?`, the file of my ${e.page} page`:``}: it does not load, so the page shows nothing.${t} Fix only what stops it loading, and keep its export default. ${N}`}},te=(e,t,n)=>P({key:``,which:`page`,how:`missing`,file:e,page:t,words:k(n)}),ne=e=>e.which===`page`?_(e.page):e.which===`home`&&e.how===`threw`?ee:g[e.which];function F(e,t=p){if(!e||x!==`none`)return;x=`waiting`;let n=()=>{x!==`settled`&&(x=`settled`,w())},r=setTimeout(()=>{console.warn(`Your AI Firebase waited ${Math.round(t/1e3)} seconds for the page-content list (src/your-ai-workflow-firebase-os/microcomponents/registry.ts) and is drawing the pages without it; each page loads its own file meanwhile.`),n()},t),i;try{i=Promise.resolve(e())}catch(e){i=Promise.reject(e)}i.catch(e=>j(`pages`,e)).finally(()=>{clearTimeout(r),n()})}function I(){return(0,r.useSyncExternalStore)(T,()=>x!==`waiting`,()=>!0)}var L=e=>{let t=e.some(e=>e.which===`page`),n=R(e).filter(e=>!(t&&e.which===`pages`)).map(ne);return`${[...new Set(n)].join(` `)} ${v}`},R=e=>[...e].sort((e,t)=>y.indexOf(e.which)-y.indexOf(t.which)),z=e=>t.ei(L(e),R(e).map(P).join(`
3
3
 
4
4
  `)),B=`firebase-os:own-files-said`,V=()=>{try{return(sessionStorage.getItem(B)||``).split(`
@@ -1,4 +1,4 @@
1
- import { li as e } from "./TimeZoneField-Dv389mAe.js";
1
+ import { li as e } from "./TimeZoneField-oIMwb5_X.js";
2
2
  //#region src/lib/email.ts
3
3
  var t = "Could not reach the server. Check your connection and try again.";
4
4
  async function n(n, r, i = !1) {
@@ -1 +1 @@
1
- const e=require(`./TimeZoneField-zR8N2Fj0.cjs`);var t=`Could not reach the server. Check your connection and try again.`;async function n(n,r,i=!1){let a=e=>(console.warn(`Email not sent (${n}): ${e}`),e);try{let t=i?await e.li?.currentUser?.getIdToken().catch(()=>null):null,o=await fetch(n,{method:`POST`,headers:{"Content-Type":`application/json`,...t?{Authorization:`Bearer ${t}`}:{}},body:JSON.stringify(r)}),s=await o.json().catch(()=>({}));return!o.ok||s?.success!==!0?a(typeof s?.error==`string`&&s.error||`The email could not be sent.`):null}catch{return a(t)}}function r(e,t={}){return n(`/api/email/notify`,{template:e,data:t})}function i(e,t,r,i={}){return n(`/api/email/send`,{template:e,collection:t,docId:r,data:i},!0)}function a(e,t,r,i={}){return n(`/api/email/compose`,{to:e,subject:t,message:r,...i},!0)}function o(e,t){return n(`/api/email/form`,{page:e,...t},!0)}function s(e){return n(`/api/email/notification`,e,!0)}async function c(){try{let e=await(await fetch(`/api/email/status`)).json(),t=e?.key===`works`||e?.key===`sending-only`||e?.key===`refused`?e.key:null,n=Number(e?.ownerCount??e?.adminCount)||0;return{configured:e?.configured===!0&&e?.enabled!==!1,connected:e?.configured===!0,enabled:e?.enabled!==!1,key:t,from:e?.from??null,...typeof e?.senderVerified==`boolean`?{senderVerified:e.senderVerified}:{},ownerCount:n,adminCount:n,receipts:e?.receipts!==!1,saleAlerts:e?.saleAlerts!==!1,error:null}}catch{return{configured:!1,from:null,error:t}}}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return a}});
1
+ const e=require(`./TimeZoneField-Ckn1pKAL.cjs`);var t=`Could not reach the server. Check your connection and try again.`;async function n(n,r,i=!1){let a=e=>(console.warn(`Email not sent (${n}): ${e}`),e);try{let t=i?await e.li?.currentUser?.getIdToken().catch(()=>null):null,o=await fetch(n,{method:`POST`,headers:{"Content-Type":`application/json`,...t?{Authorization:`Bearer ${t}`}:{}},body:JSON.stringify(r)}),s=await o.json().catch(()=>({}));return!o.ok||s?.success!==!0?a(typeof s?.error==`string`&&s.error||`The email could not be sent.`):null}catch{return a(t)}}function r(e,t={}){return n(`/api/email/notify`,{template:e,data:t})}function i(e,t,r,i={}){return n(`/api/email/send`,{template:e,collection:t,docId:r,data:i},!0)}function a(e,t,r,i={}){return n(`/api/email/compose`,{to:e,subject:t,message:r,...i},!0)}function o(e,t){return n(`/api/email/form`,{page:e,...t},!0)}function s(e){return n(`/api/email/notification`,e,!0)}async function c(){try{let e=await(await fetch(`/api/email/status`)).json(),t=e?.key===`works`||e?.key===`sending-only`||e?.key===`refused`?e.key:null,n=Number(e?.ownerCount??e?.adminCount)||0;return{configured:e?.configured===!0&&e?.enabled!==!1,connected:e?.configured===!0,enabled:e?.enabled!==!1,key:t,from:e?.from??null,...typeof e?.senderVerified==`boolean`?{senderVerified:e.senderVerified}:{},ownerCount:n,adminCount:n,receipts:e?.receipts!==!1,saleAlerts:e?.saleAlerts!==!1,error:null}}catch{return{configured:!1,from:null,error:t}}}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return a}});
@@ -21,25 +21,39 @@ export declare function withAdded(lines: BasketLine[], item: BasketItem): Basket
21
21
  /** The basket with one line's quantity set. None of it takes the line out. Pure, tested. */
22
22
  export declare function withQuantity(lines: BasketLine[], key: string, quantity: number): BasketLine[];
23
23
  /**
24
- * The basket with every line of one record at the price that record asks
25
- * now. Pure, tested.
24
+ * The basket with every line of one record made to match that record as it
25
+ * is now: at the price it asks, and taken out when it is gone or no longer
26
+ * has the variant the line was put in as. `gone` names what was taken out.
27
+ * Pure, tested.
26
28
  *
27
29
  * A line keeps the price it was put in at, and it is kept in this browser.
28
30
  * When the owner changed that price afterwards, the server — which charges
29
31
  * the record's price, never the line's (server/prices.ts) — refused the
30
32
  * basket with "reload the page and try again", and the reload changed
31
33
  * nothing: the line came back from storage at the old price, and the buyer
32
- * could not pay until they took it out and put it in again. `<Basket
33
- * collection=…>` hands every answer about a record in it to this.
34
+ * could not pay until they took it out and put it in again. A product the
35
+ * owner DELETED stayed in the bag the same way (2026-09-27: "sometimes older
36
+ * products are just in my cart from cache… if product was removed it should
37
+ * be removed from cart too"): the buyer went through to the checkout, typed
38
+ * who they were, and only the server's "no longer for sale" at Pay stopped
39
+ * them. `<Basket collection=…>` hands every answer about a record in it to
40
+ * this.
34
41
  *
35
42
  * Only lines read from `collection` — a line naming another collection of its
36
- * own is somebody else's record under the same id — and never on a record
37
- * that is gone or names no price: those the server says in words at Pay.
43
+ * own is somebody else's record under the same id — and a record that names
44
+ * no price leaves the price as it is: the server says that in words at Pay.
38
45
  * The same basket, unchanged, when nothing moved.
39
46
  */
40
- export declare function withRecordPrice(lines: BasketLine[], id: string, record: Record<string, unknown> | null | undefined, collection: string): BasketLine[];
41
- /** Put the price a record asks now on its lines in the basket kept under `name`. `<Basket>` calls it. */
42
- export declare function repriceBasket(name: string, id: string, record: Record<string, unknown> | null | undefined, collection: string): void;
47
+ export declare function withRecord(lines: BasketLine[], id: string, record: Record<string, unknown> | null | undefined, collection: string): {
48
+ lines: BasketLine[];
49
+ gone: string[];
50
+ };
51
+ /**
52
+ * Make the lines of one record in the basket kept under `name` match the
53
+ * record as it is now — its price, or out of the basket once it is gone.
54
+ * `<Basket>` calls it with the server's word on each record it holds.
55
+ */
56
+ export declare function followRecord(name: string, id: string, record: Record<string, unknown> | null | undefined, collection: string): void;
43
57
  /**
44
58
  * Hear of every thing put into a basket, from whichever component adds it.
45
59
  * `<Basket tally="products">` is what calls this, so a page never does: the
@@ -59,6 +73,12 @@ export interface Basket {
59
73
  subtotal: number;
60
74
  /** Whether `<Basket>`'s drawer is open. */
61
75
  open: boolean;
76
+ /**
77
+ * What was taken out because it is no longer for sale — its record deleted,
78
+ * or the variant it was put in as — by name, until the drawer is next shut.
79
+ * `<Basket collection=…>` does the taking out and says it.
80
+ */
81
+ gone: string[];
62
82
  /** Put something in. One, unless `quantity` says more; the one already there becomes one more. Opens the drawer, so the buyer SEES it land — pass `{ quiet: true }` to leave it shut. */
63
83
  add: (item: BasketItem, how?: {
64
84
  quiet?: boolean;
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * The server checks every line of a basket that names its collection against
5
5
  * the record before anything is charged (server/prices.ts), and `<Basket>`
6
- * keeps the lines it holds at that same price (lib/basket.ts withRecordPrice).
6
+ * keeps the lines it holds at that same price (lib/basket.ts withRecord).
7
7
  * Two readings of one price would refuse a basket the page thought was right,
8
8
  * so there is one, here, with no Stripe and no database in it.
9
9
  */
@@ -1 +1 @@
1
- require(`./chunk-CiTBaPhY.cjs`);const e=require(`./TimeZoneField-zR8N2Fj0.cjs`);let t=require(`firebase/firestore`);var n=`user_notices`;async function r(r,i){let a=String(r||``).trim();if(!a||!i?.title){console.warn(`leaveNotice(): needs the uid of the person to tell and a title.`,i);return}try{await(0,t.addDoc)((0,t.collection)(e.ui,n),{uid:a,kind:`notice`,title:i.title,body:i.body||``,link:i.link||``,fromName:e.li.currentUser?.displayName||e.li.currentUser?.email||``,createdAt:Date.now()})}catch(e){console.warn(`leaveNotice(): the notice was not saved — only an admin may leave one.`,e)}}async function i(e,t){for(let n of[...new Set(e.map(e=>String(e||``).trim()).filter(Boolean))])await r(n,t)}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return n}});
1
+ require(`./chunk-CiTBaPhY.cjs`);const e=require(`./TimeZoneField-Ckn1pKAL.cjs`);let t=require(`firebase/firestore`);var n=`user_notices`;async function r(r,i){let a=String(r||``).trim();if(!a||!i?.title){console.warn(`leaveNotice(): needs the uid of the person to tell and a title.`,i);return}try{await(0,t.addDoc)((0,t.collection)(e.ui,n),{uid:a,kind:`notice`,title:i.title,body:i.body||``,link:i.link||``,fromName:e.li.currentUser?.displayName||e.li.currentUser?.email||``,createdAt:Date.now()})}catch(e){console.warn(`leaveNotice(): the notice was not saved — only an admin may leave one.`,e)}}async function i(e,t){for(let n of[...new Set(e.map(e=>String(e||``).trim()).filter(Boolean))])await r(n,t)}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return n}});
@@ -1,4 +1,4 @@
1
- import { li as e, ui as t } from "./TimeZoneField-Dv389mAe.js";
1
+ import { li as e, ui as t } from "./TimeZoneField-oIMwb5_X.js";
2
2
  import { addDoc as n, collection as r } from "firebase/firestore";
3
3
  //#region src/lib/notices.ts
4
4
  var i = "user_notices";
@@ -1 +1 @@
1
- require(`./chunk-CiTBaPhY.cjs`);const e=require(`./TimeZoneField-zR8N2Fj0.cjs`),t=require(`./serviceSwitches-Do_pkFCu.cjs`);let n=require(`react`),r=require(`firebase/firestore`);var{collection:i,doc:a}=t.t.email;async function o(t){try{let n=await e.li?.currentUser?.getIdToken().catch(()=>null);if(!n)return{state:null,error:`Sign in again to set where your mail goes.`};let o=await fetch(`/api/email/owner`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${n}`},body:JSON.stringify(t?{who:t}:{})}),s=await o.json().catch(()=>({}));return!o.ok||s?.success!==!0?{state:null,error:typeof s?.error==`string`&&s.error?s.error:`Where your mail goes could not be worked out just now.`}:(typeof s.sealed==`string`&&s.sealed&&await(0,r.setDoc)((0,r.doc)(e.ui,i,a),{ownerMail:s.sealed,ownerMailWho:s.who},{merge:!0}),{state:{me:String(s.me||``),who:s.who===`me`?`me`:`admins`,count:Number(s.count)||0},error:null})}catch{return{state:null,error:`Where your mail goes could not be saved. Check that you are signed in as an admin.`}}}var s=e=>e.filter(e=>e.role===`admin`&&e.inactive!==!0).map(e=>`${e.id}:${String(e.email||``).toLowerCase()}`).sort().join(`|`);function c(e,t,r){let i=(0,n.useRef)(null),a=s(e);(0,n.useEffect)(()=>{!r||!t||(i.current!==null&&i.current!==a&&o(),i.current=a)},[a,t,r])}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return o}});
1
+ require(`./chunk-CiTBaPhY.cjs`);const e=require(`./TimeZoneField-Ckn1pKAL.cjs`),t=require(`./serviceSwitches-mhJbQBrV.cjs`);let n=require(`react`),r=require(`firebase/firestore`);var{collection:i,doc:a}=t.t.email;async function o(t){try{let n=await e.li?.currentUser?.getIdToken().catch(()=>null);if(!n)return{state:null,error:`Sign in again to set where your mail goes.`};let o=await fetch(`/api/email/owner`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${n}`},body:JSON.stringify(t?{who:t}:{})}),s=await o.json().catch(()=>({}));return!o.ok||s?.success!==!0?{state:null,error:typeof s?.error==`string`&&s.error?s.error:`Where your mail goes could not be worked out just now.`}:(typeof s.sealed==`string`&&s.sealed&&await(0,r.setDoc)((0,r.doc)(e.ui,i,a),{ownerMail:s.sealed,ownerMailWho:s.who},{merge:!0}),{state:{me:String(s.me||``),who:s.who===`me`?`me`:`admins`,count:Number(s.count)||0},error:null})}catch{return{state:null,error:`Where your mail goes could not be saved. Check that you are signed in as an admin.`}}}var s=e=>e.filter(e=>e.role===`admin`&&e.inactive!==!0).map(e=>`${e.id}:${String(e.email||``).toLowerCase()}`).sort().join(`|`);function c(e,t,r){let i=(0,n.useRef)(null),a=s(e);(0,n.useEffect)(()=>{!r||!t||(i.current!==null&&i.current!==a&&o(),i.current=a)},[a,t,r])}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return o}});
@@ -1,5 +1,5 @@
1
- import { li as e, ui as t } from "./TimeZoneField-Dv389mAe.js";
2
- import { t as n } from "./serviceSwitches-BWnZBooS.js";
1
+ import { li as e, ui as t } from "./TimeZoneField-oIMwb5_X.js";
2
+ import { t as n } from "./serviceSwitches-CZHwvVfP.js";
3
3
  import { useEffect as r, useRef as i } from "react";
4
4
  import { doc as a, setDoc as o } from "firebase/firestore";
5
5
  //#region src/lib/ownerMail.ts
@@ -1 +1 @@
1
- require(`./chunk-CiTBaPhY.cjs`);const e=require(`./TimeZoneField-zR8N2Fj0.cjs`),t=require(`./mediaKind-ButDya5f.cjs`);let n=require(`firebase/storage`);var r=e=>`${e}files`,i=`case_files`,a=(e,t)=>e&&t?`${i}/${e}/${t}`:``;function o(e){let t=/^https?:\/\/[^?#\s]*\/v0\/b\/[^/]+\/o\/([^?#\s]+)/.exec(e);if(!t)return``;try{return decodeURIComponent(t[1])}catch{return``}}var s=e=>{let t=String(e||``).split(`/`);return t.length===2&&/^[a-z][a-z0-9]*_files$/.test(t[0])&&t[0]!==`case_files`?t[0]:``},c=t=>s(t)===e.M,l=/^[a-z][a-z0-9_]*_(files|uploads)\//;function u(e,t=5){let n=new Set,r=(e,t)=>{if(typeof e==`string`){let t=o(e)||(l.test(e)?e:``);t&&n.add(t)}else t>0&&Array.isArray(e)?e.forEach(e=>r(e,t-1)):t>0&&e&&typeof e==`object`&&Object.values(e).forEach(e=>r(e,t-1))};return r(e,t),[...n]}function d(e,t){let n=new Set,r=e=>e.startsWith(`${t}/`)&&e.length>t.length+1,i=(e,t)=>{if(typeof e==`string`){let t=r(e)?e:o(e);r(t)&&n.add(t)}else t<2&&Array.isArray(e)?e.forEach(e=>i(e,t+1)):t<2&&e&&typeof e==`object`&&Object.values(e).forEach(e=>i(e,t+1))};return i(e,0),[...n]}async function f(r,i,a){if(!r)return;let o=new Set(i.filter(e=>e.id!==r.id).flatMap(e=>d(e,a))),s=d(r,a).filter(e=>!o.has(e));await Promise.all([...s.map(t=>(0,n.deleteObject)((0,n.ref)(e.fi,t)).catch(e=>{console.warn(`${t}: the record is gone but its file stayed (${e?.code||e}).`)})),...s.flatMap(e=>[t.y(e),t.p(e)]).filter(Boolean).map(t=>(0,n.deleteObject)((0,n.ref)(e.fi,t)).catch(()=>{}))])}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return s}});
1
+ require(`./chunk-CiTBaPhY.cjs`);const e=require(`./TimeZoneField-Ckn1pKAL.cjs`),t=require(`./mediaKind-ButDya5f.cjs`);let n=require(`firebase/storage`);var r=e=>`${e}files`,i=`case_files`,a=(e,t)=>e&&t?`${i}/${e}/${t}`:``;function o(e){let t=/^https?:\/\/[^?#\s]*\/v0\/b\/[^/]+\/o\/([^?#\s]+)/.exec(e);if(!t)return``;try{return decodeURIComponent(t[1])}catch{return``}}var s=e=>{let t=String(e||``).split(`/`);return t.length===2&&/^[a-z][a-z0-9]*_files$/.test(t[0])&&t[0]!==`case_files`?t[0]:``},c=t=>s(t)===e.M,l=/^[a-z][a-z0-9_]*_(files|uploads)\//;function u(e,t=5){let n=new Set,r=(e,t)=>{if(typeof e==`string`){let t=o(e)||(l.test(e)?e:``);t&&n.add(t)}else t>0&&Array.isArray(e)?e.forEach(e=>r(e,t-1)):t>0&&e&&typeof e==`object`&&Object.values(e).forEach(e=>r(e,t-1))};return r(e,t),[...n]}function d(e,t){let n=new Set,r=e=>e.startsWith(`${t}/`)&&e.length>t.length+1,i=(e,t)=>{if(typeof e==`string`){let t=r(e)?e:o(e);r(t)&&n.add(t)}else t<2&&Array.isArray(e)?e.forEach(e=>i(e,t+1)):t<2&&e&&typeof e==`object`&&Object.values(e).forEach(e=>i(e,t+1))};return i(e,0),[...n]}async function f(r,i,a){if(!r)return;let o=new Set(i.filter(e=>e.id!==r.id).flatMap(e=>d(e,a))),s=d(r,a).filter(e=>!o.has(e));await Promise.all([...s.map(t=>(0,n.deleteObject)((0,n.ref)(e.fi,t)).catch(e=>{console.warn(`${t}: the record is gone but its file stayed (${e?.code||e}).`)})),...s.flatMap(e=>[t.y(e),t.p(e)]).filter(Boolean).map(t=>(0,n.deleteObject)((0,n.ref)(e.fi,t)).catch(()=>{}))])}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return s}});
@@ -1,5 +1,5 @@
1
1
  import { p as e, y as t } from "./mediaKind-BtaMpGy8.js";
2
- import { M as n, fi as r } from "./TimeZoneField-Dv389mAe.js";
2
+ import { M as n, fi as r } from "./TimeZoneField-oIMwb5_X.js";
3
3
  import { deleteObject as i, ref as a } from "firebase/storage";
4
4
  //#region src/lib/pageFiles.ts
5
5
  var o = (e) => `${e}files`, s = "case_files", c = (e, t) => e && t ? `${s}/${e}/${t}` : "";
@@ -1 +1 @@
1
- const e=require(`./TimeZoneField-zR8N2Fj0.cjs`),t=require(`./soldLines-BGtA9Oub.cjs`);var n=e=>{if(!e||e.transaction!==!0||!Array.isArray(e.items))return null;let t=Number(e.total);return Number.isFinite(t)?t:null},r=e=>{let[t=``,n=``]=String(e.asked??``).trim().split(/\s+/),r=Number(t);return t&&Number.isFinite(r)&&n?{amount:r,currency:n.toLowerCase()}:null},i=e=>{let t=Number(e.amount),n=String(e.currency||``).trim().toLowerCase();return e.amount!=null&&Number.isFinite(t)&&n?{amount:t,currency:n}:null},a=t=>String(t.currency||e.Fr()||``).trim().toLowerCase(),o=e=>{try{return new Intl.NumberFormat(`en`,{style:`currency`,currency:e}).resolvedOptions().maximumFractionDigits===0?1:.01}catch{return .01}},s=(e,t,n)=>{if(!t||e.currency!==t)return!1;let r=o(t);return Math.round(e.amount/r)>=Math.round(n/r)-1},c=(e,t,r)=>r.reduce((e,r)=>{let i=n(r);return i==null?e:a(r)===t?e+i:NaN},e),l=(e,t,n,o)=>{let l=a(e),u=c(t,l,o);return[r(n),i(n)].some(e=>!!e&&s(e,l,u))},u=(e,r,i)=>{let a=t.i(e.items,r.collected);return a===null?!0:a&&!i.some(e=>n(e)!=null)};function d(e,t,r=[]){let i=n(e);return i==null?!0:t.kind===`charge`?u(e,t,r)&&l(e,i,t,r):!1}function f(e,t,i=[]){let o=n(e);return o==null||t.kind!==`charge`?!1:!!r(t)&&!!a(e)&&!l(e,o,t,i)}function p(e,t,r=[]){return n(e)==null||t.kind!==`charge`?!1:!u(e,t,r)}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return p}});
1
+ const e=require(`./TimeZoneField-Ckn1pKAL.cjs`),t=require(`./soldLines-BGtA9Oub.cjs`);var n=e=>{if(!e||e.transaction!==!0||!Array.isArray(e.items))return null;let t=Number(e.total);return Number.isFinite(t)?t:null},r=e=>{let[t=``,n=``]=String(e.asked??``).trim().split(/\s+/),r=Number(t);return t&&Number.isFinite(r)&&n?{amount:r,currency:n.toLowerCase()}:null},i=e=>{let t=Number(e.amount),n=String(e.currency||``).trim().toLowerCase();return e.amount!=null&&Number.isFinite(t)&&n?{amount:t,currency:n}:null},a=t=>String(t.currency||e.Fr()||``).trim().toLowerCase(),o=e=>{try{return new Intl.NumberFormat(`en`,{style:`currency`,currency:e}).resolvedOptions().maximumFractionDigits===0?1:.01}catch{return .01}},s=(e,t,n)=>{if(!t||e.currency!==t)return!1;let r=o(t);return Math.round(e.amount/r)>=Math.round(n/r)-1},c=(e,t,r)=>r.reduce((e,r)=>{let i=n(r);return i==null?e:a(r)===t?e+i:NaN},e),l=(e,t,n,o)=>{let l=a(e),u=c(t,l,o);return[r(n),i(n)].some(e=>!!e&&s(e,l,u))},u=(e,r,i)=>{let a=t.i(e.items,r.collected);return a===null?!0:a&&!i.some(e=>n(e)!=null)};function d(e,t,r=[]){let i=n(e);return i==null?!0:t.kind===`charge`?u(e,t,r)&&l(e,i,t,r):!1}function f(e,t,i=[]){let o=n(e);return o==null||t.kind!==`charge`?!1:!!r(t)&&!!a(e)&&!l(e,o,t,i)}function p(e,t,r=[]){return n(e)==null||t.kind!==`charge`?!1:!u(e,t,r)}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return p}});
@@ -1,4 +1,4 @@
1
- import { Fr as e } from "./TimeZoneField-Dv389mAe.js";
1
+ import { Fr as e } from "./TimeZoneField-oIMwb5_X.js";
2
2
  import { i as t } from "./soldLines-Ci-FLIrS.js";
3
3
  //#region src/lib/paidInFull.ts
4
4
  var n = (e) => {
@@ -1,17 +1,17 @@
1
- import "./PageTitle-DFGW71q8.js";
2
- import { An as e, At as t, I as n, N as r, P as i, _ as a, b as o, g as s, kt as c, nt as l, o as u, rt as d, u as f, y as p } from "./TimeZoneField-Dv389mAe.js";
1
+ import "./PageTitle-DCoUQWw6.js";
2
+ import { An as e, At as t, I as n, N as r, P as i, _ as a, b as o, g as s, kt as c, nt as l, o as u, rt as d, u as f, y as p } from "./TimeZoneField-oIMwb5_X.js";
3
3
  import { Kt as m, Tt as h, Zt as g, at as _, cn as v, ln as y, nn as b, p as x, st as S, v as C, wt as w } from "./schedule-C13m_kiO.js";
4
4
  import { n as T } from "./chevron-down--LwXEv9w.js";
5
- import { s as E } from "./scheduleData-BLCUm84s.js";
6
- import { a as D, d as O, i as k, o as A, r as j, s as ee, t as M } from "./BookingCalendar-_xoRa2tL.js";
7
- import { a as N, c as te, i as ne, n as P, o as F, r as I, s as re, t as L } from "./EventCard-CrPswwyG.js";
5
+ import { s as E } from "./scheduleData-DR6A-Q7Z.js";
6
+ import { a as D, d as O, i as k, o as A, r as j, s as ee, t as M } from "./BookingCalendar-Bej__mIs.js";
7
+ import { a as N, c as te, i as ne, n as P, o as F, r as I, s as re, t as L } from "./EventCard-BSGLYD64.js";
8
8
  import { t as R } from "./chevron-left-By8iIdje.js";
9
9
  import { t as z } from "./x-hax8aKt8.js";
10
10
  import { t as B } from "./plus-BKrt0Qx5.js";
11
11
  import { t as V } from "./trash-6Wj66gJi.js";
12
- import { t as H } from "./Button-DSldWACF.js";
12
+ import { t as H } from "./Button-BGN6q7lY.js";
13
13
  import { s as U } from "./bookingHold-DX9zPdMr.js";
14
- import { t as ie } from "./ConfirmModal-C1dM-bzk.js";
14
+ import { t as ie } from "./ConfirmModal-BW9e6Y7d.js";
15
15
  import { useEffect as W, useMemo as G, useRef as K, useState as q } from "react";
16
16
  import { Fragment as ae, jsx as J, jsxs as Y } from "react/jsx-runtime";
17
17
  //#region node_modules/lucide-react/dist/esm/icons/clock-3.mjs
@@ -1 +1 @@
1
- require(`./chunk-CiTBaPhY.cjs`),require(`./PageTitle-BWmE74WQ.cjs`);const e=require(`./TimeZoneField-zR8N2Fj0.cjs`),t=require(`./schedule-BAea6q8_.cjs`),n=require(`./chevron-down-lyDK1rfL.cjs`),r=require(`./scheduleData-BpkfnBjP.cjs`),i=require(`./BookingCalendar-DYsA71vl.cjs`),a=require(`./EventCard-6eCfvOA-.cjs`),o=require(`./chevron-left-DHTPst5Z.cjs`),s=require(`./x-Ci8c5p6T.cjs`),c=require(`./plus-zsWFCu4F.cjs`),l=require(`./trash-D-CpYHCs.cjs`),u=require(`./Button-PyTaaoyu.cjs`),d=require(`./bookingHold-DhS-tuuC.cjs`),f=require(`./ConfirmModal-CQ73WYUg.cjs`);let p=require(`react`),m=require(`react/jsx-runtime`);var h={name:`clock-3`,size:24,node:[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 6v6h4`,key:`135r8i`}]]};h.node;var g=n.n(h),_={name:`paperclip`,size:24,node:[[`path`,{d:`m16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551`,key:`1miecu`}]]};_.node;var v=n.n(_),y=e=>{let t=e.replace(/_/g,` `).trim();return t.charAt(0).toUpperCase()+t.slice(1)};function b(e,t){let n=e.memberName.trim();if(e.partySize>1){let n=`${e.partyAccepted} of ${e.partySize} have accepted.`;return t?`${n} Yours is still to come.`:n}return t?`This is waiting for you to accept.`:n?`Waiting for ${n} to accept.`:`Waiting to be accepted.`}function x(e){let t=e.memberName.trim();return e.partySize>1?e.partyAccepted>0?`${e.partyAccepted} of ${e.partySize} have confirmed so far. You will hear once they all have.`:`Waiting to be confirmed. You will hear as soon as it is.`:t?`Waiting for ${t} to confirm. You will hear as soon as they do.`:`Waiting to be confirmed. You will hear as soon as it is.`}function S({open:t,onClose:n,children:r}){return(0,p.useEffect)(()=>{if(!t)return;let e=e=>{e.key===`Escape`&&n()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[t,n]),(0,m.jsx)(e.rt,{children:t&&(0,m.jsxs)(`div`,{className:`fixed inset-0 z-50 flex items-center justify-center p-4`,children:[(0,m.jsx)(e.nt.div,{onClick:n,initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},className:`absolute inset-0 bg-background/80 backdrop-blur-xl cursor-pointer`}),(0,m.jsx)(e.nt.div,{role:`dialog`,"aria-modal":`true`,initial:{opacity:0,scale:.95,y:10},animate:{opacity:1,scale:1,y:0},exit:{opacity:0,scale:.95,y:10},className:`w-full max-w-[420px] max-h-[85vh] overflow-y-auto styled-scrollbars-mini p-5 sm:p-6 rounded-3xl glass-popover border border-[var(--panel-border)] shadow-2xl relative z-10 text-left`,children:r})]})})}function C({color:e,title:n,line:r,cancelled:o,onClose:c}){return(0,m.jsxs)(`div`,{className:`flex items-start gap-3 mb-4`,children:[(0,m.jsx)(`span`,{"aria-hidden":!0,className:`w-1 self-stretch rounded-full shrink-0 ${o?`bg-foreground/15`:``}`,style:o?void 0:{background:t.at(e,85)}}),(0,m.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,m.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap`,children:[(0,m.jsx)(`h3`,{className:`text-[17px] font-extrabold tracking-tight leading-tight break-words ${o?`text-foreground/50 line-through`:`text-foreground`}`,children:n}),o&&(0,m.jsx)(a.t,{})]}),(0,m.jsx)(`p`,{className:`text-[12.5px] font-medium text-foreground/50 leading-snug mt-0.5`,children:r})]}),(0,m.jsx)(`button`,{type:`button`,onClick:c,"aria-label":`Close`,className:i.t,children:(0,m.jsx)(s.t,{className:`w-4 h-4`})})]})}function w({label:e,children:t}){return(0,m.jsxs)(`div`,{className:`flex items-start justify-between gap-3 px-3.5 py-2.5`,children:[(0,m.jsx)(`span`,{className:`text-[12px] font-medium text-foreground/45 shrink-0`,children:e}),(0,m.jsx)(`span`,{className:`text-[12.5px] font-semibold text-foreground/80 text-right break-words min-w-0`,children:t})]})}function T({booking:n,zone:r,chip:i,me:o=``,side:s=`host`,onClose:c,onColor:d,onAccept:h,onCancel:_,onDelete:T,onRelease:D}){let[O,k]=(0,p.useState)(!1),[A,j]=(0,p.useState)(!1),[M,N]=(0,p.useState)(``),[P,F]=(0,p.useState)(!1),[I,L]=(0,p.useState)(``),R=t.Zt(n,r),z=n.end<new Date().toISOString(),B=!n.own&&n.timeZone&&n.timeZone!==r?n.timeZone:``,V=Object.entries(n.answers).filter(([,e])=>e),H=s===`booker`,U=!n.heldOnly&&(V.length>0||!!B||!!i||!H&&!n.own&&(!!n.scheduleName||!!n.email||n.createdAt>0)),W=n.heldOnly,G=!W&&(n.own||n.cancelled||z),K=!H&&!!o&&n.memberId===o,q=a.s(n),J=!!q&&K&&!!h,Y=W?`Free this held time`:n.own?`Delete this event`:n.cancelled?`Remove this cancelled booking`:z?`Remove this booking`:q&&K?`Decline this booking`:`Cancel this booking`,X=W?!!D:G&&!!T,Z=!G&&!W,Q=!!q&&K&&!G;return(0,m.jsxs)(m.Fragment,{children:[(0,m.jsxs)(S,{open:!0,onClose:c,children:[(0,m.jsx)(C,{color:n.color,title:a.o(n,s),line:`${R.day} · ${R.time}`,cancelled:n.cancelled,onClose:c}),n.cancelled&&(0,m.jsxs)(`div`,{className:`mb-4 px-3.5 py-2.5 rounded-2xl border border-[var(--panel-border)] bg-foreground/[0.03] flex flex-col gap-1.5`,children:[(0,m.jsxs)(`p`,{className:`text-[12.5px] font-medium text-foreground/70 leading-snug`,children:[E(n),` The time is free again — it stays here so you have the record.`]}),!!n.cancelReason&&(0,m.jsxs)(`p`,{className:`text-[12.5px] font-semibold text-foreground/80 leading-snug border-l-2 border-[var(--panel-border)] pl-2.5`,children:[`“`,n.cancelReason,`”`]})]}),!!q&&(0,m.jsxs)(`div`,{className:`mb-4 px-3.5 py-3 rounded-2xl border border-amber-500/25 bg-amber-500/[0.07] flex flex-col gap-2.5`,children:[(0,m.jsxs)(`div`,{className:`flex items-start gap-2.5`,children:[(0,m.jsx)(g,{className:`w-4 h-4 shrink-0 mt-[1px] text-amber-600 dark:text-amber-400`,"aria-hidden":!0}),(0,m.jsx)(`p`,{className:`text-[12.5px] font-semibold text-foreground/75 leading-snug flex-1 min-w-0`,children:H?x(n):b(n,K)}),n.partySize>1&&(0,m.jsx)(a.i,{label:q})]}),J&&!A&&(0,m.jsxs)(u.t,{onClick:async()=>{F(!0),L(``);let e=await h();F(!1),e&&L(e)},isLoading:P,className:`py-2 px-4 text-[13px] font-bold rounded-xl self-start`,children:[(0,m.jsx)(e.At,{className:`w-3.5 h-3.5 shrink-0`,"aria-hidden":!0}),`Accept`]})]}),W&&(0,m.jsx)(`p`,{className:`mb-4 px-3.5 py-2.5 rounded-2xl border border-[var(--panel-border)] bg-foreground/[0.03] text-[12.5px] font-medium text-foreground/70 leading-snug`,children:`This hour is held with no booking behind it — a booking that was started and never finished. Nobody can take the time until it is freed, and there is nothing here to cancel.`}),U&&(0,m.jsxs)(`div`,{className:`rounded-2xl border border-[var(--panel-border)]/60 bg-foreground/[0.015] divide-y divide-[var(--panel-border)]/40`,children:[!H&&!n.own&&n.scheduleName&&(0,m.jsx)(w,{label:`Meeting`,children:n.scheduleName}),!H&&n.email&&(0,m.jsx)(w,{label:`Email`,children:(0,m.jsx)(`a`,{href:`mailto:${n.email}`,className:`text-accent hover:underline break-all`,children:n.email})}),V.map(([t,n])=>(0,m.jsx)(w,{label:t===`note`?`Note`:y(t),children:e.I(n)?(0,m.jsx)(`span`,{className:`flex flex-col items-end gap-1 min-w-0`,children:e.P(n).map(t=>(0,m.jsxs)(`a`,{href:t,target:`_blank`,rel:`noopener noreferrer`,title:e.N(t),className:`inline-flex items-center gap-1.5 max-w-full min-w-0 text-accent hover:underline`,children:[(0,m.jsx)(v,{className:`w-3.5 h-3.5 shrink-0`}),(0,m.jsx)(`span`,{className:`truncate min-w-0`,children:e.N(t)})]},t))}):n},t)),B&&(0,m.jsxs)(w,{label:H?`The time you booked in`:`Their time`,children:[t.st(new Date(n.start),B),` — `,t.nn(B)]}),i&&(0,m.jsx)(w,{label:`Payment`,children:(0,m.jsx)(e._,{state:i.state,label:i.label})}),!H&&!n.own&&n.createdAt>0&&(0,m.jsx)(w,{label:`Booked`,children:new Intl.DateTimeFormat(void 0,{dateStyle:`medium`}).format(new Date(n.createdAt))})]}),!n.cancelled&&!W&&!!d&&(0,m.jsxs)(`div`,{className:`mt-4 flex flex-col gap-2`,children:[(0,m.jsx)(`span`,{className:`text-[12.5px] sm:text-[13px] font-medium text-foreground/50 select-none ml-1`,children:`Colour`}),(0,m.jsx)(a.n,{value:n.color,onChange:async e=>{L(``);let t=await d(e);t&&L(t)}}),(0,m.jsx)(`p`,{className:`text-[11px] font-medium text-foreground/40 leading-snug ml-1 mt-0.5`,children:`Shown on the calendar and in the day beside it.`})]}),A&&(0,m.jsxs)(`div`,{className:`mt-4 flex flex-col gap-3 p-3.5 rounded-2xl border border-[var(--panel-border)] bg-foreground/[0.02]`,children:[(0,m.jsx)(e.y,{label:Q?`Why are you turning it down?`:H?`Why can you not make it?`:`Why are you cancelling?`,value:M,onChange:N,placeholder:H?`Something has come up — I would like to book another time.`:`Something has come up and I cannot make this time — do book another.`,hint:H?`${n.memberName.trim()||`Whoever you booked with`} will see this.`:`${n.name.trim()||`Whoever booked`} will see this on the meeting.`}),(0,m.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,m.jsx)(u.t,{variant:`secondary`,onClick:()=>{j(!1),L(``)},disabled:P,className:`flex-1 py-2.5 text-[13px] font-bold rounded-xl`,children:`Keep it`}),(0,m.jsx)(u.t,{onClick:async()=>{F(!0),L(``);let e=await _(M.trim());if(F(!1),e){L(e);return}j(!1),c()},isLoading:P,disabled:!M.trim(),className:`flex-1 py-2.5 text-[13px] font-bold rounded-xl bg-red-500 hover:bg-red-600 border-none text-white shadow-lg hover:shadow-red-500/20 disabled:opacity-40 disabled:hover:bg-red-500 disabled:hover:shadow-none`,children:Q?`Decline it`:`Cancel it`})]})]}),!A&&!Z&&!X&&!H&&!W&&(0,m.jsx)(`p`,{className:`text-[11px] sm:text-[11.5px] text-foreground/40 font-medium leading-snug mt-4 ml-1`,children:`Nothing left to do here — only an admin can take a booking off the calendar for good.`}),!!I&&(0,m.jsx)(`p`,{className:`text-[12px] font-semibold text-red-500 mt-3 ml-1`,children:I}),!A&&(0,m.jsxs)(`div`,{className:`mt-5 flex items-center gap-3 ${X||Z?`justify-between`:`justify-end`}`,children:[(X||Z)&&(0,m.jsx)(e.o,{icon:X?l.t:a.c,tone:`danger`,title:Y,onClick:()=>X?k(!0):j(!0),children:W?`Free the time`:n.own?`Delete`:X?`Remove`:Q?`Decline`:`Cancel booking`}),(0,m.jsx)(u.t,{variant:`secondary`,onClick:c,className:`py-2 px-4 text-[13px] font-bold rounded-xl`,children:`Close`})]})]}),(0,m.jsx)(f.t,{isOpen:O,title:`${Y}?`,message:W?`The hour goes back on offer. There is no booking behind it, so nothing else is lost.`:n.own?`It leaves your calendar and the time can be booked again.`:`It goes from the calendar for good, with everything it holds — in every diary it was booked into. This cannot be undone.`,confirmText:W?`Yes, free it`:n.own?`Yes, delete`:`Yes, remove`,cancelText:`Keep it`,isProcessing:P,onCancel:()=>k(!1),onConfirm:async()=>{F(!0);let e=await(W?D?.()??null:T?.()??null);F(!1),k(!1),e?L(e):c()}})]})}function E(e){let t=e.cancelledAt>0?` on ${new Intl.DateTimeFormat(void 0,{dateStyle:`medium`}).format(new Date(e.cancelledAt))}`:``,n=e.cancelledBy.trim();return e.cancelledSide===`booker`?`${n||`The person who booked`} cancelled this${t}.`:e.cancelledSide===`host`?`${n||`Your team`} cancelled this${t}.`:`This booking was cancelled${t}.`}var D=(e,n,r,i)=>({title:``,time:e===i?t.Tt(r,n):`09:00`,minutes:`60`,color:``,note:``});function O({dateKey:n,dayLabel:r,zone:i,today:o,now:s,onClose:c,onAdd:l}){let[d,f]=(0,p.useState)(()=>D(n,i,s?s():new Date,o)),[h,g]=(0,p.useState)(!1),[_,v]=(0,p.useState)(``),y=e=>f(t=>({...t,...e}));return(0,m.jsxs)(S,{open:!0,onClose:c,children:[(0,m.jsx)(C,{color:d.color,title:d.title.trim()||`Add an event`,line:`${r} · your time, ${t.nn(i)}`,onClose:c}),(0,m.jsxs)(`div`,{className:`flex flex-col gap-3.5`,children:[(0,m.jsx)(e.b,{label:`What is it?`,value:d.title,onChange:e=>y({title:e}),placeholder:`Lunch with Sam`,hint:`Leave it empty and the time simply shows as busy.`}),(0,m.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,m.jsx)(e.g,{label:`Starts at`,value:d.time,onChange:e=>y({time:e}),options:t.v,allowEmpty:!1}),(0,m.jsx)(e.g,{label:`Lasts`,value:d.minutes,onChange:e=>y({minutes:e}),options:t.p,allowEmpty:!1})]}),(0,m.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,m.jsx)(`span`,{className:`${e.u} ml-1`,children:`Colour`}),(0,m.jsx)(a.n,{value:d.color,onChange:e=>y({color:e})})]}),(0,m.jsx)(e.y,{label:`Note`,value:d.note,onChange:e=>y({note:e}),placeholder:`Anything to remember`})]}),(0,m.jsx)(`p`,{className:`text-[11.5px] font-medium text-foreground/40 leading-snug mt-3 ml-1`,children:`Nobody can book this time once it is here.`}),!!_&&(0,m.jsx)(`p`,{className:`text-[12px] font-semibold text-red-500 mt-3 ml-1`,children:_}),(0,m.jsxs)(`div`,{className:`mt-5 flex items-center gap-3`,children:[(0,m.jsx)(u.t,{variant:`secondary`,onClick:c,disabled:h,className:`flex-1 py-2.5 text-[13px] font-bold rounded-xl`,children:`Cancel`}),(0,m.jsx)(u.t,{onClick:async()=>{g(!0),v(``);let e=t.ln(n,d.time,i),r=new Date(e.getTime()+Number(d.minutes)*6e4),a=await l({title:d.title.trim(),start:e.toISOString(),end:r.toISOString(),color:d.color,note:d.note.trim()});g(!1),a?v(a):c()},isLoading:h,className:`flex-1 py-2.5 text-[13px] font-bold rounded-xl`,children:`Add it`})]})]})}var k=(e,t)=>new Intl.DateTimeFormat(t,{timeZone:`UTC`,weekday:`short`,day:`numeric`,month:`long`}).format(new Date(`${e}T00:00:00Z`)),A=[`M`,`T`,`W`,`T`,`F`,`S`,`S`],j=e=>e.slice(0,7),M=(e,n,r)=>t.st(e,n,r).replace(/[\s\u00a0\u202f]+/g,``).toLowerCase();function N(e,t=3){return e.length<=t?{shown:e,extra:0}:{shown:e.slice(0,t-1),extra:e.length-(t-1)}}var P=(e,t,n=`host`)=>n===`booker`?a.o(e,n):t&&e.memberName?`${a.a(e)} · ${e.memberName}`:a.a(e);function F(e,n){let r=new Map;for(let i of e){let e=t.cn(new Date(i.start),n).dateKey,a=r.get(e)||[];a.push(i),r.set(e,a)}for(let e of r.values())e.sort((e,t)=>e.start.localeCompare(t.start));return r}function I(e,t,n=!0){return!n||!e.paymentId&&!e.paymentSession?null:e.paymentSession?t===void 0?{state:`saving`,label:`Checking payment`}:t?{state:`saved`,label:`Paid`}:{state:`off`,label:`Awaiting payment`}:{state:`off`,label:`Not paid`}}var L=`h-8 px-3 rounded-xl border border-[var(--panel-border)]/60 inline-flex items-center gap-1.5 text-[12.5px] font-semibold text-foreground/60 hover:text-foreground hover:border-accent/40 hover:bg-foreground/5 active:scale-[0.98] transition-all cursor-pointer`;function R({bookings:n,zone:r,paid:s,openBookingId:l,onOpened:u,withMember:d=!1,me:f=``,side:h=`host`,onAccept:g,onCancel:_,onDelete:v,canDelete:y,onColor:b,onRelease:x,onAdd:S,now:C}){let w=t.cn(C?C():new Date,r).dateKey,E=(0,p.useMemo)(()=>F(n,r),[n,r]),[D,R]=(0,p.useState)(j(w)),[z,B]=(0,p.useState)(w),[V,H]=(0,p.useState)(null),[U,W]=(0,p.useState)(!1),G=(0,p.useRef)(``);(0,p.useEffect)(()=>{if(!l){G.current=``;return}if(G.current===l)return;let e=n.find(e=>e.id===l);if(!e)return;G.current=l;let i=t.cn(new Date(e.start),r).dateKey;R(j(i)),B(i),H(e.id),u?.()},[l,n,r,u]);let K=i.o(D),q=E.get(z)||[],J=(C?C():new Date).toISOString(),Y=k(z),X=V?n.find(e=>e.id===V):void 0,{ref:Z,moreBelow:Q}=i.s(q.length,z);return(0,m.jsxs)(`div`,{className:`flex flex-col md:flex-row gap-3 md:gap-4 w-full md:items-stretch`,children:[(0,m.jsxs)(`div`,{className:`${i.r} w-full md:flex-1 min-w-0`,children:[(0,m.jsxs)(`div`,{className:i.i,children:[(0,m.jsx)(`h4`,{className:`text-[14px] font-bold text-foreground tracking-tight truncate`,children:t.wt(D)}),(0,m.jsxs)(`div`,{className:`flex items-center gap-1.5 shrink-0`,children:[(0,m.jsx)(`button`,{type:`button`,onClick:()=>{R(j(w)),B(w)},className:L,children:`Today`}),(0,m.jsx)(`button`,{type:`button`,"aria-label":`Previous month`,onClick:()=>R(e=>t.Kt(e,-1)),className:i.t,children:(0,m.jsx)(o.t,{className:`w-4 h-4`})}),(0,m.jsx)(`button`,{type:`button`,"aria-label":`Next month`,onClick:()=>R(e=>t.Kt(e,1)),className:i.t,children:(0,m.jsx)(e.kt,{className:`w-4 h-4`})})]})]}),(0,m.jsx)(`div`,{className:`p-2 sm:p-3`,children:(0,m.jsxs)(`div`,{className:`grid grid-cols-7 gap-1`,role:`grid`,"aria-label":t.wt(D),children:[A.map((e,t)=>(0,m.jsx)(`div`,{className:`text-center text-[10.5px] font-bold uppercase tracking-wider text-foreground/35 pb-1`,children:e},t)),K.map((e,n)=>{if(!e)return(0,m.jsx)(`div`,{"aria-hidden":!0},`blank-${n}`);let i=E.get(e)||[],{shown:a,extra:o}=N(i),s=e===z,c=e===w;return(0,m.jsxs)(`button`,{type:`button`,role:`gridcell`,"aria-label":`${e}${i.length?`, ${i.length} booked`:``}`,"aria-selected":s,onClick:()=>B(e),className:`relative flex flex-col items-center sm:items-stretch justify-center sm:justify-start h-10 sm:h-[86px] rounded-xl sm:p-1 text-left transition-all cursor-pointer border ${s?`border-accent/70 bg-accent/[0.08] shadow-sm shadow-accent/10`:i.length?`border-transparent hover:bg-foreground/[0.05] hover:border-[var(--panel-border)]/60`:`border-transparent hover:bg-foreground/[0.03]`} ${c&&!s?`ring-1 ring-inset ring-accent/45`:``}`,children:[(0,m.jsx)(`span`,{className:`text-[13px] tabular-nums leading-none sm:px-1 sm:pt-0.5 sm:pb-1 ${s||c?`font-bold text-accent`:i.length?`font-bold text-foreground`:`font-semibold text-foreground/35`}`,children:Number(e.slice(8,10))}),(0,m.jsxs)(`span`,{"aria-hidden":!0,className:`max-sm:hidden sm:flex flex-col gap-[2px] w-full min-w-0`,children:[a.map(e=>(0,m.jsxs)(`span`,{className:`flex items-center gap-1 min-w-0 rounded-md pr-1 py-[2px] leading-[1.2] overflow-hidden ${e.end<J&&!e.cancelled?`opacity-50`:``} ${e.cancelled?`bg-foreground/[0.04] line-through`:``}`,style:e.cancelled?void 0:{background:t.at(e.color,12)},children:[(0,m.jsx)(`span`,{className:`w-[3px] self-stretch rounded-full shrink-0 ${e.cancelled?`bg-foreground/15`:``}`,style:e.cancelled?void 0:{background:t.at(e.color,85)}}),(0,m.jsx)(`span`,{className:`text-[9.5px] font-bold tabular-nums shrink-0 ${e.cancelled?`text-foreground/40`:`text-foreground/85`}`,children:M(new Date(e.start),r)}),(0,m.jsx)(`span`,{className:`text-[9.5px] font-medium truncate ${e.cancelled?`text-foreground/40`:`text-foreground/60`}`,children:P(e,d,h)})]},e.id)),o>0&&(0,m.jsxs)(`span`,{className:`px-1 text-[9.5px] font-bold text-foreground/45 leading-[1.2]`,children:[`+`,o,` more`]})]})]},e)})]})})]}),(0,m.jsx)(`div`,{className:`w-full md:w-[320px] shrink-0 md:relative md:min-h-[360px]`,children:(0,m.jsxs)(`div`,{className:`${i.r} flex flex-col md:absolute md:inset-0`,children:[(0,m.jsxs)(`div`,{className:i.i,children:[(0,m.jsx)(`p`,{className:`text-[13px] font-bold text-foreground tracking-tight truncate`,children:Y}),(0,m.jsxs)(`div`,{className:`flex items-center gap-2 shrink-0`,children:[q.length>0&&(0,m.jsxs)(`span`,{className:`text-[11.5px] font-semibold text-foreground/40 tabular-nums max-sm:hidden`,children:[q.length,` `,q.length===1?`event`:`events`]}),S&&(0,m.jsxs)(`button`,{type:`button`,onClick:()=>W(!0),title:`Add an event on ${Y}`,className:L,children:[(0,m.jsx)(c.t,{className:`w-3.5 h-3.5 shrink-0`}),`Add`]})]})]}),(0,m.jsxs)(`div`,{className:`relative flex-1 min-h-0`,children:[(0,m.jsx)(`div`,{ref:Z,className:`p-3 h-full overflow-y-auto styled-scrollbars-mini flex flex-col gap-2`,children:q.length===0?(0,m.jsxs)(`div`,{className:`flex flex-col items-center justify-center text-center gap-2 py-8 px-2`,children:[(0,m.jsx)(i.d,{className:`w-5 h-5 text-foreground/25`,"aria-hidden":!0}),(0,m.jsx)(`p`,{className:`text-[12.5px] font-medium text-foreground/45 leading-relaxed`,children:`Nothing on this day yet.`})]}):q.map(e=>(0,m.jsx)(a.r,{booking:e,zone:r,now:C,chip:I(e,s?.[e.id],!!s),withMember:d,side:h,onOpen:()=>H(e.id)},e.id))}),Q&&(0,m.jsx)(i.a,{})]})]})}),X&&(0,m.jsx)(T,{booking:X,zone:r,chip:I(X,s?.[X.id],!!s),onClose:()=>H(null),me:f,side:h,onColor:b?e=>b(X.id,e):void 0,onAccept:g?()=>g(X):void 0,onCancel:e=>_(X,e),onDelete:v&&(!y||y(X))?()=>v(X):void 0,onRelease:x?()=>x(X):void 0}),U&&S&&(0,m.jsx)(O,{dateKey:z,dayLabel:Y,zone:r,today:w,now:C,onClose:()=>W(!1),onAdd:S})]})}var z=new Map,B=3,V=60*1e3;function H(t){let[n,i]=(0,p.useState)({}),a=(0,p.useRef)(new Set),o=(0,p.useRef)([]),s=(0,p.useRef)(0),c=(0,p.useRef)(!0),l=(0,p.useRef)(new Map),u=(0,p.useRef)(new Set),f=(e,t,n)=>{u.current.add(e),r.s(t,`paid`).then(({refused:r})=>{if(!r.length){l.current.delete(e),z.set(e,n);return}l.current.set(e,{passes:Object.fromEntries(r.map(e=>[e,t[e]])),forBookings:n})}).finally(()=>u.current.delete(e))},m=()=>{for(let[e,{passes:t,forBookings:n}]of l.current)u.current.has(e)||f(e,t,n)};return(0,p.useEffect)(()=>{c.current=!0;let e=setInterval(m,V);return()=>{c.current=!1,clearInterval(e)}},[]),(0,p.useEffect)(()=>{m();let n=()=>{for(;s.current<B&&o.current.length;){let t=o.current.shift();s.current+=1,e.An(t,{quiet:!0}).then(e=>{let n=[...new Set([...d.s(e.metadata),String(e.metadata?.bookingId||``)].filter(Boolean))],r=e.holdPasses||{};Object.keys(r).length?f(t,r,n):e.paid&&z.set(t,n),c.current&&i(r=>({...r,[t]:{paid:e.paid,forBookings:n,status:e.status??null}}))}).catch(()=>{}).finally(()=>{--s.current,c.current&&n()})}};for(let e of t){let t=e.paymentSession;!t||z.has(t)||a.current.has(t)||(a.current.add(t),o.current.push(t))}n()},[t]),(0,p.useMemo)(()=>{let e={},r={};for(let i of t){let t=i.paymentSession;if(!t)continue;let a=z.has(t)?{paid:!0,forBookings:z.get(t),status:`complete`}:n[t];if(!a)continue;let o=new Set([i.id,...i.copyIds||[]]);e[i.id]=a.paid&&a.forBookings.some(e=>o.has(e)),r[i.id]={paid:e[i.id],status:a.status}}return{paid:e,checkouts:r}},[n,t])}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return H}});
1
+ require(`./chunk-CiTBaPhY.cjs`),require(`./PageTitle-DQkvCB11.cjs`);const e=require(`./TimeZoneField-Ckn1pKAL.cjs`),t=require(`./schedule-BAea6q8_.cjs`),n=require(`./chevron-down-lyDK1rfL.cjs`),r=require(`./scheduleData-BXjNXVHY.cjs`),i=require(`./BookingCalendar-BcvJiyaq.cjs`),a=require(`./EventCard-DAsGsicK.cjs`),o=require(`./chevron-left-DHTPst5Z.cjs`),s=require(`./x-Ci8c5p6T.cjs`),c=require(`./plus-zsWFCu4F.cjs`),l=require(`./trash-D-CpYHCs.cjs`),u=require(`./Button-Ccy4wFZ1.cjs`),d=require(`./bookingHold-DhS-tuuC.cjs`),f=require(`./ConfirmModal-BUNtss4a.cjs`);let p=require(`react`),m=require(`react/jsx-runtime`);var h={name:`clock-3`,size:24,node:[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 6v6h4`,key:`135r8i`}]]};h.node;var g=n.n(h),_={name:`paperclip`,size:24,node:[[`path`,{d:`m16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551`,key:`1miecu`}]]};_.node;var v=n.n(_),y=e=>{let t=e.replace(/_/g,` `).trim();return t.charAt(0).toUpperCase()+t.slice(1)};function b(e,t){let n=e.memberName.trim();if(e.partySize>1){let n=`${e.partyAccepted} of ${e.partySize} have accepted.`;return t?`${n} Yours is still to come.`:n}return t?`This is waiting for you to accept.`:n?`Waiting for ${n} to accept.`:`Waiting to be accepted.`}function x(e){let t=e.memberName.trim();return e.partySize>1?e.partyAccepted>0?`${e.partyAccepted} of ${e.partySize} have confirmed so far. You will hear once they all have.`:`Waiting to be confirmed. You will hear as soon as it is.`:t?`Waiting for ${t} to confirm. You will hear as soon as they do.`:`Waiting to be confirmed. You will hear as soon as it is.`}function S({open:t,onClose:n,children:r}){return(0,p.useEffect)(()=>{if(!t)return;let e=e=>{e.key===`Escape`&&n()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[t,n]),(0,m.jsx)(e.rt,{children:t&&(0,m.jsxs)(`div`,{className:`fixed inset-0 z-50 flex items-center justify-center p-4`,children:[(0,m.jsx)(e.nt.div,{onClick:n,initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},className:`absolute inset-0 bg-background/80 backdrop-blur-xl cursor-pointer`}),(0,m.jsx)(e.nt.div,{role:`dialog`,"aria-modal":`true`,initial:{opacity:0,scale:.95,y:10},animate:{opacity:1,scale:1,y:0},exit:{opacity:0,scale:.95,y:10},className:`w-full max-w-[420px] max-h-[85vh] overflow-y-auto styled-scrollbars-mini p-5 sm:p-6 rounded-3xl glass-popover border border-[var(--panel-border)] shadow-2xl relative z-10 text-left`,children:r})]})})}function C({color:e,title:n,line:r,cancelled:o,onClose:c}){return(0,m.jsxs)(`div`,{className:`flex items-start gap-3 mb-4`,children:[(0,m.jsx)(`span`,{"aria-hidden":!0,className:`w-1 self-stretch rounded-full shrink-0 ${o?`bg-foreground/15`:``}`,style:o?void 0:{background:t.at(e,85)}}),(0,m.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,m.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap`,children:[(0,m.jsx)(`h3`,{className:`text-[17px] font-extrabold tracking-tight leading-tight break-words ${o?`text-foreground/50 line-through`:`text-foreground`}`,children:n}),o&&(0,m.jsx)(a.t,{})]}),(0,m.jsx)(`p`,{className:`text-[12.5px] font-medium text-foreground/50 leading-snug mt-0.5`,children:r})]}),(0,m.jsx)(`button`,{type:`button`,onClick:c,"aria-label":`Close`,className:i.t,children:(0,m.jsx)(s.t,{className:`w-4 h-4`})})]})}function w({label:e,children:t}){return(0,m.jsxs)(`div`,{className:`flex items-start justify-between gap-3 px-3.5 py-2.5`,children:[(0,m.jsx)(`span`,{className:`text-[12px] font-medium text-foreground/45 shrink-0`,children:e}),(0,m.jsx)(`span`,{className:`text-[12.5px] font-semibold text-foreground/80 text-right break-words min-w-0`,children:t})]})}function T({booking:n,zone:r,chip:i,me:o=``,side:s=`host`,onClose:c,onColor:d,onAccept:h,onCancel:_,onDelete:T,onRelease:D}){let[O,k]=(0,p.useState)(!1),[A,j]=(0,p.useState)(!1),[M,N]=(0,p.useState)(``),[P,F]=(0,p.useState)(!1),[I,L]=(0,p.useState)(``),R=t.Zt(n,r),z=n.end<new Date().toISOString(),B=!n.own&&n.timeZone&&n.timeZone!==r?n.timeZone:``,V=Object.entries(n.answers).filter(([,e])=>e),H=s===`booker`,U=!n.heldOnly&&(V.length>0||!!B||!!i||!H&&!n.own&&(!!n.scheduleName||!!n.email||n.createdAt>0)),W=n.heldOnly,G=!W&&(n.own||n.cancelled||z),K=!H&&!!o&&n.memberId===o,q=a.s(n),J=!!q&&K&&!!h,Y=W?`Free this held time`:n.own?`Delete this event`:n.cancelled?`Remove this cancelled booking`:z?`Remove this booking`:q&&K?`Decline this booking`:`Cancel this booking`,X=W?!!D:G&&!!T,Z=!G&&!W,Q=!!q&&K&&!G;return(0,m.jsxs)(m.Fragment,{children:[(0,m.jsxs)(S,{open:!0,onClose:c,children:[(0,m.jsx)(C,{color:n.color,title:a.o(n,s),line:`${R.day} · ${R.time}`,cancelled:n.cancelled,onClose:c}),n.cancelled&&(0,m.jsxs)(`div`,{className:`mb-4 px-3.5 py-2.5 rounded-2xl border border-[var(--panel-border)] bg-foreground/[0.03] flex flex-col gap-1.5`,children:[(0,m.jsxs)(`p`,{className:`text-[12.5px] font-medium text-foreground/70 leading-snug`,children:[E(n),` The time is free again — it stays here so you have the record.`]}),!!n.cancelReason&&(0,m.jsxs)(`p`,{className:`text-[12.5px] font-semibold text-foreground/80 leading-snug border-l-2 border-[var(--panel-border)] pl-2.5`,children:[`“`,n.cancelReason,`”`]})]}),!!q&&(0,m.jsxs)(`div`,{className:`mb-4 px-3.5 py-3 rounded-2xl border border-amber-500/25 bg-amber-500/[0.07] flex flex-col gap-2.5`,children:[(0,m.jsxs)(`div`,{className:`flex items-start gap-2.5`,children:[(0,m.jsx)(g,{className:`w-4 h-4 shrink-0 mt-[1px] text-amber-600 dark:text-amber-400`,"aria-hidden":!0}),(0,m.jsx)(`p`,{className:`text-[12.5px] font-semibold text-foreground/75 leading-snug flex-1 min-w-0`,children:H?x(n):b(n,K)}),n.partySize>1&&(0,m.jsx)(a.i,{label:q})]}),J&&!A&&(0,m.jsxs)(u.t,{onClick:async()=>{F(!0),L(``);let e=await h();F(!1),e&&L(e)},isLoading:P,className:`py-2 px-4 text-[13px] font-bold rounded-xl self-start`,children:[(0,m.jsx)(e.At,{className:`w-3.5 h-3.5 shrink-0`,"aria-hidden":!0}),`Accept`]})]}),W&&(0,m.jsx)(`p`,{className:`mb-4 px-3.5 py-2.5 rounded-2xl border border-[var(--panel-border)] bg-foreground/[0.03] text-[12.5px] font-medium text-foreground/70 leading-snug`,children:`This hour is held with no booking behind it — a booking that was started and never finished. Nobody can take the time until it is freed, and there is nothing here to cancel.`}),U&&(0,m.jsxs)(`div`,{className:`rounded-2xl border border-[var(--panel-border)]/60 bg-foreground/[0.015] divide-y divide-[var(--panel-border)]/40`,children:[!H&&!n.own&&n.scheduleName&&(0,m.jsx)(w,{label:`Meeting`,children:n.scheduleName}),!H&&n.email&&(0,m.jsx)(w,{label:`Email`,children:(0,m.jsx)(`a`,{href:`mailto:${n.email}`,className:`text-accent hover:underline break-all`,children:n.email})}),V.map(([t,n])=>(0,m.jsx)(w,{label:t===`note`?`Note`:y(t),children:e.I(n)?(0,m.jsx)(`span`,{className:`flex flex-col items-end gap-1 min-w-0`,children:e.P(n).map(t=>(0,m.jsxs)(`a`,{href:t,target:`_blank`,rel:`noopener noreferrer`,title:e.N(t),className:`inline-flex items-center gap-1.5 max-w-full min-w-0 text-accent hover:underline`,children:[(0,m.jsx)(v,{className:`w-3.5 h-3.5 shrink-0`}),(0,m.jsx)(`span`,{className:`truncate min-w-0`,children:e.N(t)})]},t))}):n},t)),B&&(0,m.jsxs)(w,{label:H?`The time you booked in`:`Their time`,children:[t.st(new Date(n.start),B),` — `,t.nn(B)]}),i&&(0,m.jsx)(w,{label:`Payment`,children:(0,m.jsx)(e._,{state:i.state,label:i.label})}),!H&&!n.own&&n.createdAt>0&&(0,m.jsx)(w,{label:`Booked`,children:new Intl.DateTimeFormat(void 0,{dateStyle:`medium`}).format(new Date(n.createdAt))})]}),!n.cancelled&&!W&&!!d&&(0,m.jsxs)(`div`,{className:`mt-4 flex flex-col gap-2`,children:[(0,m.jsx)(`span`,{className:`text-[12.5px] sm:text-[13px] font-medium text-foreground/50 select-none ml-1`,children:`Colour`}),(0,m.jsx)(a.n,{value:n.color,onChange:async e=>{L(``);let t=await d(e);t&&L(t)}}),(0,m.jsx)(`p`,{className:`text-[11px] font-medium text-foreground/40 leading-snug ml-1 mt-0.5`,children:`Shown on the calendar and in the day beside it.`})]}),A&&(0,m.jsxs)(`div`,{className:`mt-4 flex flex-col gap-3 p-3.5 rounded-2xl border border-[var(--panel-border)] bg-foreground/[0.02]`,children:[(0,m.jsx)(e.y,{label:Q?`Why are you turning it down?`:H?`Why can you not make it?`:`Why are you cancelling?`,value:M,onChange:N,placeholder:H?`Something has come up — I would like to book another time.`:`Something has come up and I cannot make this time — do book another.`,hint:H?`${n.memberName.trim()||`Whoever you booked with`} will see this.`:`${n.name.trim()||`Whoever booked`} will see this on the meeting.`}),(0,m.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,m.jsx)(u.t,{variant:`secondary`,onClick:()=>{j(!1),L(``)},disabled:P,className:`flex-1 py-2.5 text-[13px] font-bold rounded-xl`,children:`Keep it`}),(0,m.jsx)(u.t,{onClick:async()=>{F(!0),L(``);let e=await _(M.trim());if(F(!1),e){L(e);return}j(!1),c()},isLoading:P,disabled:!M.trim(),className:`flex-1 py-2.5 text-[13px] font-bold rounded-xl bg-red-500 hover:bg-red-600 border-none text-white shadow-lg hover:shadow-red-500/20 disabled:opacity-40 disabled:hover:bg-red-500 disabled:hover:shadow-none`,children:Q?`Decline it`:`Cancel it`})]})]}),!A&&!Z&&!X&&!H&&!W&&(0,m.jsx)(`p`,{className:`text-[11px] sm:text-[11.5px] text-foreground/40 font-medium leading-snug mt-4 ml-1`,children:`Nothing left to do here — only an admin can take a booking off the calendar for good.`}),!!I&&(0,m.jsx)(`p`,{className:`text-[12px] font-semibold text-red-500 mt-3 ml-1`,children:I}),!A&&(0,m.jsxs)(`div`,{className:`mt-5 flex items-center gap-3 ${X||Z?`justify-between`:`justify-end`}`,children:[(X||Z)&&(0,m.jsx)(e.o,{icon:X?l.t:a.c,tone:`danger`,title:Y,onClick:()=>X?k(!0):j(!0),children:W?`Free the time`:n.own?`Delete`:X?`Remove`:Q?`Decline`:`Cancel booking`}),(0,m.jsx)(u.t,{variant:`secondary`,onClick:c,className:`py-2 px-4 text-[13px] font-bold rounded-xl`,children:`Close`})]})]}),(0,m.jsx)(f.t,{isOpen:O,title:`${Y}?`,message:W?`The hour goes back on offer. There is no booking behind it, so nothing else is lost.`:n.own?`It leaves your calendar and the time can be booked again.`:`It goes from the calendar for good, with everything it holds — in every diary it was booked into. This cannot be undone.`,confirmText:W?`Yes, free it`:n.own?`Yes, delete`:`Yes, remove`,cancelText:`Keep it`,isProcessing:P,onCancel:()=>k(!1),onConfirm:async()=>{F(!0);let e=await(W?D?.()??null:T?.()??null);F(!1),k(!1),e?L(e):c()}})]})}function E(e){let t=e.cancelledAt>0?` on ${new Intl.DateTimeFormat(void 0,{dateStyle:`medium`}).format(new Date(e.cancelledAt))}`:``,n=e.cancelledBy.trim();return e.cancelledSide===`booker`?`${n||`The person who booked`} cancelled this${t}.`:e.cancelledSide===`host`?`${n||`Your team`} cancelled this${t}.`:`This booking was cancelled${t}.`}var D=(e,n,r,i)=>({title:``,time:e===i?t.Tt(r,n):`09:00`,minutes:`60`,color:``,note:``});function O({dateKey:n,dayLabel:r,zone:i,today:o,now:s,onClose:c,onAdd:l}){let[d,f]=(0,p.useState)(()=>D(n,i,s?s():new Date,o)),[h,g]=(0,p.useState)(!1),[_,v]=(0,p.useState)(``),y=e=>f(t=>({...t,...e}));return(0,m.jsxs)(S,{open:!0,onClose:c,children:[(0,m.jsx)(C,{color:d.color,title:d.title.trim()||`Add an event`,line:`${r} · your time, ${t.nn(i)}`,onClose:c}),(0,m.jsxs)(`div`,{className:`flex flex-col gap-3.5`,children:[(0,m.jsx)(e.b,{label:`What is it?`,value:d.title,onChange:e=>y({title:e}),placeholder:`Lunch with Sam`,hint:`Leave it empty and the time simply shows as busy.`}),(0,m.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,m.jsx)(e.g,{label:`Starts at`,value:d.time,onChange:e=>y({time:e}),options:t.v,allowEmpty:!1}),(0,m.jsx)(e.g,{label:`Lasts`,value:d.minutes,onChange:e=>y({minutes:e}),options:t.p,allowEmpty:!1})]}),(0,m.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,m.jsx)(`span`,{className:`${e.u} ml-1`,children:`Colour`}),(0,m.jsx)(a.n,{value:d.color,onChange:e=>y({color:e})})]}),(0,m.jsx)(e.y,{label:`Note`,value:d.note,onChange:e=>y({note:e}),placeholder:`Anything to remember`})]}),(0,m.jsx)(`p`,{className:`text-[11.5px] font-medium text-foreground/40 leading-snug mt-3 ml-1`,children:`Nobody can book this time once it is here.`}),!!_&&(0,m.jsx)(`p`,{className:`text-[12px] font-semibold text-red-500 mt-3 ml-1`,children:_}),(0,m.jsxs)(`div`,{className:`mt-5 flex items-center gap-3`,children:[(0,m.jsx)(u.t,{variant:`secondary`,onClick:c,disabled:h,className:`flex-1 py-2.5 text-[13px] font-bold rounded-xl`,children:`Cancel`}),(0,m.jsx)(u.t,{onClick:async()=>{g(!0),v(``);let e=t.ln(n,d.time,i),r=new Date(e.getTime()+Number(d.minutes)*6e4),a=await l({title:d.title.trim(),start:e.toISOString(),end:r.toISOString(),color:d.color,note:d.note.trim()});g(!1),a?v(a):c()},isLoading:h,className:`flex-1 py-2.5 text-[13px] font-bold rounded-xl`,children:`Add it`})]})]})}var k=(e,t)=>new Intl.DateTimeFormat(t,{timeZone:`UTC`,weekday:`short`,day:`numeric`,month:`long`}).format(new Date(`${e}T00:00:00Z`)),A=[`M`,`T`,`W`,`T`,`F`,`S`,`S`],j=e=>e.slice(0,7),M=(e,n,r)=>t.st(e,n,r).replace(/[\s\u00a0\u202f]+/g,``).toLowerCase();function N(e,t=3){return e.length<=t?{shown:e,extra:0}:{shown:e.slice(0,t-1),extra:e.length-(t-1)}}var P=(e,t,n=`host`)=>n===`booker`?a.o(e,n):t&&e.memberName?`${a.a(e)} · ${e.memberName}`:a.a(e);function F(e,n){let r=new Map;for(let i of e){let e=t.cn(new Date(i.start),n).dateKey,a=r.get(e)||[];a.push(i),r.set(e,a)}for(let e of r.values())e.sort((e,t)=>e.start.localeCompare(t.start));return r}function I(e,t,n=!0){return!n||!e.paymentId&&!e.paymentSession?null:e.paymentSession?t===void 0?{state:`saving`,label:`Checking payment`}:t?{state:`saved`,label:`Paid`}:{state:`off`,label:`Awaiting payment`}:{state:`off`,label:`Not paid`}}var L=`h-8 px-3 rounded-xl border border-[var(--panel-border)]/60 inline-flex items-center gap-1.5 text-[12.5px] font-semibold text-foreground/60 hover:text-foreground hover:border-accent/40 hover:bg-foreground/5 active:scale-[0.98] transition-all cursor-pointer`;function R({bookings:n,zone:r,paid:s,openBookingId:l,onOpened:u,withMember:d=!1,me:f=``,side:h=`host`,onAccept:g,onCancel:_,onDelete:v,canDelete:y,onColor:b,onRelease:x,onAdd:S,now:C}){let w=t.cn(C?C():new Date,r).dateKey,E=(0,p.useMemo)(()=>F(n,r),[n,r]),[D,R]=(0,p.useState)(j(w)),[z,B]=(0,p.useState)(w),[V,H]=(0,p.useState)(null),[U,W]=(0,p.useState)(!1),G=(0,p.useRef)(``);(0,p.useEffect)(()=>{if(!l){G.current=``;return}if(G.current===l)return;let e=n.find(e=>e.id===l);if(!e)return;G.current=l;let i=t.cn(new Date(e.start),r).dateKey;R(j(i)),B(i),H(e.id),u?.()},[l,n,r,u]);let K=i.o(D),q=E.get(z)||[],J=(C?C():new Date).toISOString(),Y=k(z),X=V?n.find(e=>e.id===V):void 0,{ref:Z,moreBelow:Q}=i.s(q.length,z);return(0,m.jsxs)(`div`,{className:`flex flex-col md:flex-row gap-3 md:gap-4 w-full md:items-stretch`,children:[(0,m.jsxs)(`div`,{className:`${i.r} w-full md:flex-1 min-w-0`,children:[(0,m.jsxs)(`div`,{className:i.i,children:[(0,m.jsx)(`h4`,{className:`text-[14px] font-bold text-foreground tracking-tight truncate`,children:t.wt(D)}),(0,m.jsxs)(`div`,{className:`flex items-center gap-1.5 shrink-0`,children:[(0,m.jsx)(`button`,{type:`button`,onClick:()=>{R(j(w)),B(w)},className:L,children:`Today`}),(0,m.jsx)(`button`,{type:`button`,"aria-label":`Previous month`,onClick:()=>R(e=>t.Kt(e,-1)),className:i.t,children:(0,m.jsx)(o.t,{className:`w-4 h-4`})}),(0,m.jsx)(`button`,{type:`button`,"aria-label":`Next month`,onClick:()=>R(e=>t.Kt(e,1)),className:i.t,children:(0,m.jsx)(e.kt,{className:`w-4 h-4`})})]})]}),(0,m.jsx)(`div`,{className:`p-2 sm:p-3`,children:(0,m.jsxs)(`div`,{className:`grid grid-cols-7 gap-1`,role:`grid`,"aria-label":t.wt(D),children:[A.map((e,t)=>(0,m.jsx)(`div`,{className:`text-center text-[10.5px] font-bold uppercase tracking-wider text-foreground/35 pb-1`,children:e},t)),K.map((e,n)=>{if(!e)return(0,m.jsx)(`div`,{"aria-hidden":!0},`blank-${n}`);let i=E.get(e)||[],{shown:a,extra:o}=N(i),s=e===z,c=e===w;return(0,m.jsxs)(`button`,{type:`button`,role:`gridcell`,"aria-label":`${e}${i.length?`, ${i.length} booked`:``}`,"aria-selected":s,onClick:()=>B(e),className:`relative flex flex-col items-center sm:items-stretch justify-center sm:justify-start h-10 sm:h-[86px] rounded-xl sm:p-1 text-left transition-all cursor-pointer border ${s?`border-accent/70 bg-accent/[0.08] shadow-sm shadow-accent/10`:i.length?`border-transparent hover:bg-foreground/[0.05] hover:border-[var(--panel-border)]/60`:`border-transparent hover:bg-foreground/[0.03]`} ${c&&!s?`ring-1 ring-inset ring-accent/45`:``}`,children:[(0,m.jsx)(`span`,{className:`text-[13px] tabular-nums leading-none sm:px-1 sm:pt-0.5 sm:pb-1 ${s||c?`font-bold text-accent`:i.length?`font-bold text-foreground`:`font-semibold text-foreground/35`}`,children:Number(e.slice(8,10))}),(0,m.jsxs)(`span`,{"aria-hidden":!0,className:`max-sm:hidden sm:flex flex-col gap-[2px] w-full min-w-0`,children:[a.map(e=>(0,m.jsxs)(`span`,{className:`flex items-center gap-1 min-w-0 rounded-md pr-1 py-[2px] leading-[1.2] overflow-hidden ${e.end<J&&!e.cancelled?`opacity-50`:``} ${e.cancelled?`bg-foreground/[0.04] line-through`:``}`,style:e.cancelled?void 0:{background:t.at(e.color,12)},children:[(0,m.jsx)(`span`,{className:`w-[3px] self-stretch rounded-full shrink-0 ${e.cancelled?`bg-foreground/15`:``}`,style:e.cancelled?void 0:{background:t.at(e.color,85)}}),(0,m.jsx)(`span`,{className:`text-[9.5px] font-bold tabular-nums shrink-0 ${e.cancelled?`text-foreground/40`:`text-foreground/85`}`,children:M(new Date(e.start),r)}),(0,m.jsx)(`span`,{className:`text-[9.5px] font-medium truncate ${e.cancelled?`text-foreground/40`:`text-foreground/60`}`,children:P(e,d,h)})]},e.id)),o>0&&(0,m.jsxs)(`span`,{className:`px-1 text-[9.5px] font-bold text-foreground/45 leading-[1.2]`,children:[`+`,o,` more`]})]})]},e)})]})})]}),(0,m.jsx)(`div`,{className:`w-full md:w-[320px] shrink-0 md:relative md:min-h-[360px]`,children:(0,m.jsxs)(`div`,{className:`${i.r} flex flex-col md:absolute md:inset-0`,children:[(0,m.jsxs)(`div`,{className:i.i,children:[(0,m.jsx)(`p`,{className:`text-[13px] font-bold text-foreground tracking-tight truncate`,children:Y}),(0,m.jsxs)(`div`,{className:`flex items-center gap-2 shrink-0`,children:[q.length>0&&(0,m.jsxs)(`span`,{className:`text-[11.5px] font-semibold text-foreground/40 tabular-nums max-sm:hidden`,children:[q.length,` `,q.length===1?`event`:`events`]}),S&&(0,m.jsxs)(`button`,{type:`button`,onClick:()=>W(!0),title:`Add an event on ${Y}`,className:L,children:[(0,m.jsx)(c.t,{className:`w-3.5 h-3.5 shrink-0`}),`Add`]})]})]}),(0,m.jsxs)(`div`,{className:`relative flex-1 min-h-0`,children:[(0,m.jsx)(`div`,{ref:Z,className:`p-3 h-full overflow-y-auto styled-scrollbars-mini flex flex-col gap-2`,children:q.length===0?(0,m.jsxs)(`div`,{className:`flex flex-col items-center justify-center text-center gap-2 py-8 px-2`,children:[(0,m.jsx)(i.d,{className:`w-5 h-5 text-foreground/25`,"aria-hidden":!0}),(0,m.jsx)(`p`,{className:`text-[12.5px] font-medium text-foreground/45 leading-relaxed`,children:`Nothing on this day yet.`})]}):q.map(e=>(0,m.jsx)(a.r,{booking:e,zone:r,now:C,chip:I(e,s?.[e.id],!!s),withMember:d,side:h,onOpen:()=>H(e.id)},e.id))}),Q&&(0,m.jsx)(i.a,{})]})]})}),X&&(0,m.jsx)(T,{booking:X,zone:r,chip:I(X,s?.[X.id],!!s),onClose:()=>H(null),me:f,side:h,onColor:b?e=>b(X.id,e):void 0,onAccept:g?()=>g(X):void 0,onCancel:e=>_(X,e),onDelete:v&&(!y||y(X))?()=>v(X):void 0,onRelease:x?()=>x(X):void 0}),U&&S&&(0,m.jsx)(O,{dateKey:z,dayLabel:Y,zone:r,today:w,now:C,onClose:()=>W(!1),onAdd:S})]})}var z=new Map,B=3,V=60*1e3;function H(t){let[n,i]=(0,p.useState)({}),a=(0,p.useRef)(new Set),o=(0,p.useRef)([]),s=(0,p.useRef)(0),c=(0,p.useRef)(!0),l=(0,p.useRef)(new Map),u=(0,p.useRef)(new Set),f=(e,t,n)=>{u.current.add(e),r.s(t,`paid`).then(({refused:r})=>{if(!r.length){l.current.delete(e),z.set(e,n);return}l.current.set(e,{passes:Object.fromEntries(r.map(e=>[e,t[e]])),forBookings:n})}).finally(()=>u.current.delete(e))},m=()=>{for(let[e,{passes:t,forBookings:n}]of l.current)u.current.has(e)||f(e,t,n)};return(0,p.useEffect)(()=>{c.current=!0;let e=setInterval(m,V);return()=>{c.current=!1,clearInterval(e)}},[]),(0,p.useEffect)(()=>{m();let n=()=>{for(;s.current<B&&o.current.length;){let t=o.current.shift();s.current+=1,e.An(t,{quiet:!0}).then(e=>{let n=[...new Set([...d.s(e.metadata),String(e.metadata?.bookingId||``)].filter(Boolean))],r=e.holdPasses||{};Object.keys(r).length?f(t,r,n):e.paid&&z.set(t,n),c.current&&i(r=>({...r,[t]:{paid:e.paid,forBookings:n,status:e.status??null}}))}).catch(()=>{}).finally(()=>{--s.current,c.current&&n()})}};for(let e of t){let t=e.paymentSession;!t||z.has(t)||a.current.has(t)||(a.current.add(t),o.current.push(t))}n()},[t]),(0,p.useMemo)(()=>{let e={},r={};for(let i of t){let t=i.paymentSession;if(!t)continue;let a=z.has(t)?{paid:!0,forBookings:z.get(t),status:`complete`}:n[t];if(!a)continue;let o=new Set([i.id,...i.copyIds||[]]);e[i.id]=a.paid&&a.forBookings.some(e=>o.has(e)),r[i.id]={paid:e[i.id],status:a.status}}return{paid:e,checkouts:r}},[n,t])}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return H}});
@@ -1 +1 @@
1
- require(`./chunk-CiTBaPhY.cjs`);const e=require(`./TimeZoneField-zR8N2Fj0.cjs`),t=require(`./schedule-BAea6q8_.cjs`),n=require(`./personName-BvH1NWNy.cjs`);let r=require(`react`),i=require(`firebase/firestore`);var a=`user_profiles`,o=(t,n)=>{let r=e.qr(n);return t?.code===`permission-denied`?`The people marked ${r} are not yours to list yet. Whoever runs this app opens that by ticking both roles on one page whose entries are sent to people, and pasting the security rules again from the Setup screen.`:`The people marked ${r} could not be listed just now.`},s=(e,t)=>e.name.localeCompare(t.name),c=(e,t=!1)=>{let r=[];return e.forEach(e=>{let i=e.data()||{};i.inactive===!0||i.removed===!0||t&&String(i.role||`user`)!==`user`||r.push({uid:e.id,name:n.n(i),photo:String(i.photoURL||i.avatar||i.avatarUrl||``),email:String(i.email||``).trim(),phone:String(i.phone||``).trim(),role:String(i.role||(t?`user`:``))})}),r.sort(s)};function l(n){let{user:s,userRole:l,isAdmin:u,roleConfirmed:d}=e.Ft(),f=s?.uid||``,p=t.Ln(String(n||``)),m=p===`user`&&(u||t.Sn(l)),h=!u&&!t.Sn(l)&&(!l||l===`user`),g=`${f}|${p}|${m?`all`:`role`}`,[_,v]=(0,r.useState)({loading:!0,people:[],error:``,asked:``});return(0,r.useEffect)(()=>{if(!f||!p||!d||h)return;let t=!0,n=e.Zr(m?`${a}|members`:`${a}|role:${p}`,()=>m?(0,i.query)((0,i.collection)(e.ui,a)):(0,i.query)((0,i.collection)(e.ui,a),(0,i.where)(`role`,`==`,p)),e=>{t&&v({loading:!1,people:c(e,m),error:``,asked:g})},e=>{t&&v({loading:!1,people:[],error:o(e,p),asked:g})});return()=>{t=!1,n()}},[f,p,d,g,m,h]),(0,r.useMemo)(()=>!f||!p||d&&h?{loading:!1,people:[],error:``}:!d||_.asked!==g?{loading:!0,people:[],error:``}:{loading:_.loading,people:_.people,error:_.error},[f,p,d,g,_,h])}function u(n,r=e.Kr()){let i=t.Ln(String(n||``));if(!i)return[];let a=r.find(e=>e.id===i)?.sees;return Array.isArray(a)?a.filter(e=>typeof e==`string`&&!!e&&e!==i):[]}function d(e,n){let r=t.Ln(String(e||``));if(!r)return[];let i=[];for(let e of Array.isArray(n)?n:[]){let n=e?.config||{};if(!t.En(t.Pn(n))||!t.vn(n).includes(r))continue;let a=String(e?.title||``).trim();a&&!i.includes(a)&&i.push(a)}return i}var f=e=>e.length<2?e[0]||``:`${e.slice(0,-1).join(`, `)} and ${e[e.length-1]}`;function p(t,n=[],r=e.Kr()){let i=u(t,r).map(t=>e.qr(t,r));if(!i.length)return``;let a=n.filter(Boolean),o=a.length?`from the ${f(a)} ${a.length>1?`pages`:`page`}`:`from a page where entries are sent to people`;return`Can see who is ${f(i)} — ${o}`}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return d}});
1
+ require(`./chunk-CiTBaPhY.cjs`);const e=require(`./TimeZoneField-Ckn1pKAL.cjs`),t=require(`./schedule-BAea6q8_.cjs`),n=require(`./personName-BvH1NWNy.cjs`);let r=require(`react`),i=require(`firebase/firestore`);var a=`user_profiles`,o=(t,n)=>{let r=e.qr(n);return t?.code===`permission-denied`?`The people marked ${r} are not yours to list yet. Whoever runs this app opens that by ticking both roles on one page whose entries are sent to people, and pasting the security rules again from the Setup screen.`:`The people marked ${r} could not be listed just now.`},s=(e,t)=>e.name.localeCompare(t.name),c=(e,t=!1)=>{let r=[];return e.forEach(e=>{let i=e.data()||{};i.inactive===!0||i.removed===!0||t&&String(i.role||`user`)!==`user`||r.push({uid:e.id,name:n.n(i),photo:String(i.photoURL||i.avatar||i.avatarUrl||``),email:String(i.email||``).trim(),phone:String(i.phone||``).trim(),role:String(i.role||(t?`user`:``))})}),r.sort(s)};function l(n){let{user:s,userRole:l,isAdmin:u,roleConfirmed:d}=e.Ft(),f=s?.uid||``,p=t.Ln(String(n||``)),m=p===`user`&&(u||t.Sn(l)),h=!u&&!t.Sn(l)&&(!l||l===`user`),g=`${f}|${p}|${m?`all`:`role`}`,[_,v]=(0,r.useState)({loading:!0,people:[],error:``,asked:``});return(0,r.useEffect)(()=>{if(!f||!p||!d||h)return;let t=!0,n=e.Zr(m?`${a}|members`:`${a}|role:${p}`,()=>m?(0,i.query)((0,i.collection)(e.ui,a)):(0,i.query)((0,i.collection)(e.ui,a),(0,i.where)(`role`,`==`,p)),e=>{t&&v({loading:!1,people:c(e,m),error:``,asked:g})},e=>{t&&v({loading:!1,people:[],error:o(e,p),asked:g})});return()=>{t=!1,n()}},[f,p,d,g,m,h]),(0,r.useMemo)(()=>!f||!p||d&&h?{loading:!1,people:[],error:``}:!d||_.asked!==g?{loading:!0,people:[],error:``}:{loading:_.loading,people:_.people,error:_.error},[f,p,d,g,_,h])}function u(n,r=e.Kr()){let i=t.Ln(String(n||``));if(!i)return[];let a=r.find(e=>e.id===i)?.sees;return Array.isArray(a)?a.filter(e=>typeof e==`string`&&!!e&&e!==i):[]}function d(e,n){let r=t.Ln(String(e||``));if(!r)return[];let i=[];for(let e of Array.isArray(n)?n:[]){let n=e?.config||{};if(!t.En(t.Pn(n))||!t.vn(n).includes(r))continue;let a=String(e?.title||``).trim();a&&!i.includes(a)&&i.push(a)}return i}var f=e=>e.length<2?e[0]||``:`${e.slice(0,-1).join(`, `)} and ${e[e.length-1]}`;function p(t,n=[],r=e.Kr()){let i=u(t,r).map(t=>e.qr(t,r));if(!i.length)return``;let a=n.filter(Boolean),o=a.length?`from the ${f(a)} ${a.length>1?`pages`:`page`}`:`from a page where entries are sent to people`;return`Can see who is ${f(i)} — ${o}`}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return d}});
@@ -1,4 +1,4 @@
1
- import { Ft as e, Kr as t, Zr as n, qr as r, ui as i } from "./TimeZoneField-Dv389mAe.js";
1
+ import { Ft as e, Kr as t, Zr as n, qr as r, ui as i } from "./TimeZoneField-oIMwb5_X.js";
2
2
  import { En as a, Ln as o, Pn as s, Sn as c, vn as l } from "./schedule-C13m_kiO.js";
3
3
  import { n as u } from "./personName-DeDpef0M.js";
4
4
  import { useEffect as d, useMemo as f, useState as p } from "react";
@@ -1,4 +1,4 @@
1
- import { ui as e } from "./TimeZoneField-Dv389mAe.js";
1
+ import { ui as e } from "./TimeZoneField-oIMwb5_X.js";
2
2
  import { useEffect as t, useState as n } from "react";
3
3
  import { doc as r, onSnapshot as i, setDoc as a } from "firebase/firestore";
4
4
  //#region src/lib/publishSteps.ts
@@ -1 +1 @@
1
- require(`./chunk-CiTBaPhY.cjs`);const e=require(`./TimeZoneField-zR8N2Fj0.cjs`);let t=require(`react`),n=require(`firebase/firestore`);var r={collection:`sys_configs`,doc:`publish`},i=[`published`,`connected`,`authorised`],a={appName:``,domain:``,done:[]};function o(e){let t=Array.isArray(e?.done)?e.done:[];return{appName:typeof e?.appName==`string`?e.appName:``,domain:typeof e?.domain==`string`?e.domain:``,done:i.filter(e=>t.includes(e))}}function s(e){let t=String(e??``).trim().toLowerCase();return t=t.replace(/^[a-z][a-z0-9+.-]*:\/\//,``),t=t.split(/[/?#]/)[0],t=t.replace(/\.ai\.studio$/,``),t.replace(/[\s_]+/g,`-`).replace(/[^a-z0-9-]/g,``).replace(/-{2,}/g,`-`).replace(/^-+|-+$/g,``)}var c=e=>{let t=s(e);return t?`https://${t}.ai.studio/`:``};function l(e){let t=String(e??``).trim().toLowerCase();return t=t.replace(/^[a-z][a-z0-9+.-]*:\/\//,``),t=t.replace(/^[^/@]*@/,``),t=t.split(/[/?#]/)[0],t=t.split(`:`)[0],t=t.replace(/^www\./,``),t=t.replace(/^\.+|\.+$/g,``),/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)*\.[a-z]{2,}$/.test(t)?t:``}var u=e=>{let t=l(e);return t?`https://${t}/`:``},d=e=>u(e?.domain)||c(e?.appName);function f(e,t=null){let n=t=>e.includes(t),r=i.find(e=>!n(e))??null,a=r?i.indexOf(r):i.length-1;return i.map((e,i)=>{let o=i<=a,s=t!==null&&t===e&&o;return{id:e,visible:o,done:n(e),open:s||t===null&&e===r}})}var p=(e,t)=>i.filter(n=>n===t||e.includes(n));function m(e){return!e||!e.configured?!1:e.mode===`live`?!e.webhookConfigured:!0}function h(){let[i,s]=(0,t.useState)({loading:!0,record:a});return(0,t.useEffect)(()=>(0,n.onSnapshot)((0,n.doc)(e.ui,r.collection,r.doc),e=>s({loading:!1,record:o(e.exists()?e.data():null)}),()=>s({loading:!1,record:a})),[]),{loading:i.loading,record:i.record,save:async t=>{s(e=>({loading:!1,record:{...e.record,...t}}));try{return await(0,n.setDoc)((0,n.doc)(e.ui,r.collection,r.doc),t,{merge:!0}),null}catch(e){return console.error(`Could not save where you got to`,e),`That could not be saved. Only an admin can, and only while you are signed in.`}}}}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return p}});
1
+ require(`./chunk-CiTBaPhY.cjs`);const e=require(`./TimeZoneField-Ckn1pKAL.cjs`);let t=require(`react`),n=require(`firebase/firestore`);var r={collection:`sys_configs`,doc:`publish`},i=[`published`,`connected`,`authorised`],a={appName:``,domain:``,done:[]};function o(e){let t=Array.isArray(e?.done)?e.done:[];return{appName:typeof e?.appName==`string`?e.appName:``,domain:typeof e?.domain==`string`?e.domain:``,done:i.filter(e=>t.includes(e))}}function s(e){let t=String(e??``).trim().toLowerCase();return t=t.replace(/^[a-z][a-z0-9+.-]*:\/\//,``),t=t.split(/[/?#]/)[0],t=t.replace(/\.ai\.studio$/,``),t.replace(/[\s_]+/g,`-`).replace(/[^a-z0-9-]/g,``).replace(/-{2,}/g,`-`).replace(/^-+|-+$/g,``)}var c=e=>{let t=s(e);return t?`https://${t}.ai.studio/`:``};function l(e){let t=String(e??``).trim().toLowerCase();return t=t.replace(/^[a-z][a-z0-9+.-]*:\/\//,``),t=t.replace(/^[^/@]*@/,``),t=t.split(/[/?#]/)[0],t=t.split(`:`)[0],t=t.replace(/^www\./,``),t=t.replace(/^\.+|\.+$/g,``),/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)*\.[a-z]{2,}$/.test(t)?t:``}var u=e=>{let t=l(e);return t?`https://${t}/`:``},d=e=>u(e?.domain)||c(e?.appName);function f(e,t=null){let n=t=>e.includes(t),r=i.find(e=>!n(e))??null,a=r?i.indexOf(r):i.length-1;return i.map((e,i)=>{let o=i<=a,s=t!==null&&t===e&&o;return{id:e,visible:o,done:n(e),open:s||t===null&&e===r}})}var p=(e,t)=>i.filter(n=>n===t||e.includes(n));function m(e){return!e||!e.configured?!1:e.mode===`live`?!e.webhookConfigured:!0}function h(){let[i,s]=(0,t.useState)({loading:!0,record:a});return(0,t.useEffect)(()=>(0,n.onSnapshot)((0,n.doc)(e.ui,r.collection,r.doc),e=>s({loading:!1,record:o(e.exists()?e.data():null)}),()=>s({loading:!1,record:a})),[]),{loading:i.loading,record:i.record,save:async t=>{s(e=>({loading:!1,record:{...e.record,...t}}));try{return await(0,n.setDoc)((0,n.doc)(e.ui,r.collection,r.doc),t,{merge:!0}),null}catch(e){return console.error(`Could not save where you got to`,e),`That could not be saved. Only an admin can, and only while you are signed in.`}}}}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return p}});
@@ -1,4 +1,4 @@
1
- import { qr as e, ui as t } from "./TimeZoneField-Dv389mAe.js";
1
+ import { qr as e, ui as t } from "./TimeZoneField-oIMwb5_X.js";
2
2
  import { vn as n } from "./schedule-C13m_kiO.js";
3
3
  import { deleteField as r, doc as i, writeBatch as a } from "firebase/firestore";
4
4
  //#region src/lib/recordLock.ts
@@ -1 +1 @@
1
- require(`./chunk-CiTBaPhY.cjs`);const e=require(`./TimeZoneField-zR8N2Fj0.cjs`),t=require(`./schedule-BAea6q8_.cjs`);let n=require(`firebase/firestore`);var r=[{value:`none`,label:`No one`},{value:`admin`,label:`Only me and my admins`},{value:`all`,label:`Everyone who can change it`}],i={none:`Nothing on this page can be thrown away — there is no Delete button for anybody, you included. Pick one of the others where something has to go.`,admin:`Nobody but an admin can delete anything on this page — the database refuses it, whatever the page shows. Needs the rules pasted from /setup at 1.14.66 or later.`,all:`Whoever may change a record may delete it too.`},a=[`admin`],o=[],s=[`board`,`table`,`calendar`,`drive`],c=e=>{let t=String(e?.pageType||``);return!t||t===`public`||t===`admin`?!1:!s.includes(String(e?.template||``))},l=e=>{let t=e?.deleteBy;return t===`admin`?`admin`:t===`all`||t===``?`all`:t===`none`||c(e)?`none`:`all`},u=e=>{let t=l(e);return t===`admin`?a:t===`none`?o:null},d=[{value:`admin`,label:`Only me and my admins`},{value:`holder`,label:`Whoever holds it`}],f={admin:`Nobody but you and your admins can hand one to a person or take it back — the database refuses it, whatever the page shows. Needs the rules pasted from /setup at 2.0.8 or later.`,holder:`Whoever was handed one can pass it on to somebody else, or give it back.`},p=/\b(?:re-?)?(?:assigned|allocated|handed|given|sent|passed)(?:\s+(?:out|over|on))?\s+(?:to\s+(?:them|him|her|me|us|each|one)\b|by\b)/gi,m=String.raw`(?:re-?)?(?:assign|allocat|delegat|hand|pass|send|giv|forward|transfer)\w*`,h=new RegExp(String.raw`\b(?:cannot|can\s*not|can['’]?t|mustn['’]?t|shouldn['’]?t|don['’]?t|doesn['’]?t|won['’]?t|never|not|no|nor|without|unable\s+to|nobody|no\s+one)\s+`+String.raw`(?:(?!(?:but|and|can|may|could|will)\b)[\w'’-]+,?\s+){0,3}?${m}`,`gi`),g=String.raw`(?:supervisors?|managers?|admins?|administrators?|owners?|boss(?:es)?|(?:team\s+)?lead(?:er)?s?|directors?|dispatchers?|coordinators?|somebody|someone|anybody|anyone)`,_=String.raw`(?:(?:then|can|may|will|might|must|should|has|have|had|also|later|first)\s+)*`,v=new RegExp(String.raw`\b(?:(?:an?|the|my|our|your|their)\s+)?(${g})\s+(?:else\s+)?${_}${m}`+String.raw`|\b(?:I|we)\s+${_}${m}`,`gi`),y=e=>String(e??``).trim().toLowerCase().replace(/\s+/g,` `).replace(/(?:es|s)$/,``),b=String.raw`(?:it|them|one|(?:an?|the|each|every|any|this|that|their|his|her)\s+(?:\w+\s+)?(?:orders?|jobs?|tasks?|tickets?|cases?|issues?|requests?|entry|entries|bookings?|leads?|enquiry|enquiries|inquiry|inquiries|applications?|claims?|projects?|cards?|deals?)|orders|jobs|tasks|tickets|cases|issues|requests|entries|bookings|leads|enquiries|inquiries|applications|claims|projects|cards|deals)`,x=String.raw`\s+(?:the\s+|a\s+|an\s+|their\s+|its\s+)?(?:buyers?|customers?|clients?|couriers?|carriers?|shippers?|post|suppliers?|vendors?)\b`,S=String.raw`to\b(?!${x})`,C=RegExp(String.raw`\b(?:`+String.raw`re-?(?:assign|allocat)(?:e|s|es|ing)?\b`+String.raw`|delegat(?:e|es|ing)\s+${b}`+String.raw`|(?:assign(?:s|ing)?|allocat(?:e|es|ing))\s+${b}\s+${S}`+String.raw`|(?:hand|pass|send|give|forward|transfer)(?:s|es|ing)?\s+${b}\s+(?:(?:on|over|out)\b(?!\s+(?:its|the|their)\s+way)(?!\s+to${x})|${S})`+String.raw`|(?:hand|pass|send)(?:s|es|ing)?\s+(?:on|over|out)\s+${b}\b(?!\s+to${x})`+`)`,`i`),w=(e,t)=>{let n=y(t),r=String(e??``).replace(p,` `).replace(h,` `).replace(v,(e,t)=>t&&n&&y(t)===n?e:` `);return C.test(r)},T=n=>{let r=n?.canDo&&typeof n.canDo==`object`?n.canDo:{},i=t.vn(n);return Object.entries(r).some(([t,n])=>t!==`admin`&&i.includes(t)&&w(n,e.qr(t)))},E=e=>{if(e?.arrivalsTo!==`handed`)return`holder`;let t=e?.handOnBy;return t===`admin`||t===`holder`?t:T(e)?`holder`:`admin`},D=e=>E(e)===`admin`?a:null,O=e=>{let t=u(e),n=D(e);return!t&&!n?null:{...t?{delete:[...t]}:{},...n?{send:[...n]}:{}}},k=e=>{let t=O(e);return t?`delete:${(t.delete||[`-`]).join(`,`)}|send:${(t.send||[`-`]).join(`,`)}`:``},A=(e,t)=>!e&&!t?null:{...e?{delete:[...e]}:{},...t?{send:[...t]}:{}},j=[`heldByUid`,`heldByName`,`assigneeUid`,`assignedToUid`,`assigneeId`,`assigneeName`,`assignedToName`],M=e=>!!e&&(typeof e.sourceId==`string`&&!!e.sourceId||Array.isArray(e.lock?.send)||j.some(t=>typeof e[t]==`string`&&!!e[t].trim())),N=(e,t)=>A(u(t),M(e)?D(t):null),P=(e,t)=>{let n=A(u(e),t===`admin`?D(e):null);return n?{lock:n}:{}},F=(e,t)=>{let n=e?.lock?.[t];return Array.isArray(n)?n.map(String):null},I=e=>F(e,`delete`),L=(e,t)=>{let n=F(e,`send`);return n?t===`admin`||!!t&&n.includes(t):!0},R=(e,t)=>{let n=I(e);return n?n.length?t===`admin`||!!t&&n.includes(t):!1:!0},z=(e,t)=>e?t!==null&&t.length===e.length&&e.every(e=>t.includes(e)):t===null,B=(e,t)=>z(u(t),I(e))&&z(M(e)?D(t):null,F(e,`send`));async function V(t,r,i,a){if(!a||!t)return 0;let o=r.filter(e=>e&&e.id&&!B(e,i));if(!o.length)return 0;for(let r=0;r<o.length;r+=500){let a=(0,n.writeBatch)(e.ui);for(let s of o.slice(r,r+500)){let r=N(s,i);a.update((0,n.doc)(e.ui,t,s.id),r?{lock:r}:{lock:(0,n.deleteField)()})}await a.commit()}return o.length}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return V}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return P}});
1
+ require(`./chunk-CiTBaPhY.cjs`);const e=require(`./TimeZoneField-Ckn1pKAL.cjs`),t=require(`./schedule-BAea6q8_.cjs`);let n=require(`firebase/firestore`);var r=[{value:`none`,label:`No one`},{value:`admin`,label:`Only me and my admins`},{value:`all`,label:`Everyone who can change it`}],i={none:`Nothing on this page can be thrown away — there is no Delete button for anybody, you included. Pick one of the others where something has to go.`,admin:`Nobody but an admin can delete anything on this page — the database refuses it, whatever the page shows. Needs the rules pasted from /setup at 1.14.66 or later.`,all:`Whoever may change a record may delete it too.`},a=[`admin`],o=[],s=[`board`,`table`,`calendar`,`drive`],c=e=>{let t=String(e?.pageType||``);return!t||t===`public`||t===`admin`?!1:!s.includes(String(e?.template||``))},l=e=>{let t=e?.deleteBy;return t===`admin`?`admin`:t===`all`||t===``?`all`:t===`none`||c(e)?`none`:`all`},u=e=>{let t=l(e);return t===`admin`?a:t===`none`?o:null},d=[{value:`admin`,label:`Only me and my admins`},{value:`holder`,label:`Whoever holds it`}],f={admin:`Nobody but you and your admins can hand one to a person or take it back — the database refuses it, whatever the page shows. Needs the rules pasted from /setup at 2.0.8 or later.`,holder:`Whoever was handed one can pass it on to somebody else, or give it back.`},p=/\b(?:re-?)?(?:assigned|allocated|handed|given|sent|passed)(?:\s+(?:out|over|on))?\s+(?:to\s+(?:them|him|her|me|us|each|one)\b|by\b)/gi,m=String.raw`(?:re-?)?(?:assign|allocat|delegat|hand|pass|send|giv|forward|transfer)\w*`,h=new RegExp(String.raw`\b(?:cannot|can\s*not|can['’]?t|mustn['’]?t|shouldn['’]?t|don['’]?t|doesn['’]?t|won['’]?t|never|not|no|nor|without|unable\s+to|nobody|no\s+one)\s+`+String.raw`(?:(?!(?:but|and|can|may|could|will)\b)[\w'’-]+,?\s+){0,3}?${m}`,`gi`),g=String.raw`(?:supervisors?|managers?|admins?|administrators?|owners?|boss(?:es)?|(?:team\s+)?lead(?:er)?s?|directors?|dispatchers?|coordinators?|somebody|someone|anybody|anyone)`,_=String.raw`(?:(?:then|can|may|will|might|must|should|has|have|had|also|later|first)\s+)*`,v=new RegExp(String.raw`\b(?:(?:an?|the|my|our|your|their)\s+)?(${g})\s+(?:else\s+)?${_}${m}`+String.raw`|\b(?:I|we)\s+${_}${m}`,`gi`),y=e=>String(e??``).trim().toLowerCase().replace(/\s+/g,` `).replace(/(?:es|s)$/,``),b=String.raw`(?:it|them|one|(?:an?|the|each|every|any|this|that|their|his|her)\s+(?:\w+\s+)?(?:orders?|jobs?|tasks?|tickets?|cases?|issues?|requests?|entry|entries|bookings?|leads?|enquiry|enquiries|inquiry|inquiries|applications?|claims?|projects?|cards?|deals?)|orders|jobs|tasks|tickets|cases|issues|requests|entries|bookings|leads|enquiries|inquiries|applications|claims|projects|cards|deals)`,x=String.raw`\s+(?:the\s+|a\s+|an\s+|their\s+|its\s+)?(?:buyers?|customers?|clients?|couriers?|carriers?|shippers?|post|suppliers?|vendors?)\b`,S=String.raw`to\b(?!${x})`,C=RegExp(String.raw`\b(?:`+String.raw`re-?(?:assign|allocat)(?:e|s|es|ing)?\b`+String.raw`|delegat(?:e|es|ing)\s+${b}`+String.raw`|(?:assign(?:s|ing)?|allocat(?:e|es|ing))\s+${b}\s+${S}`+String.raw`|(?:hand|pass|send|give|forward|transfer)(?:s|es|ing)?\s+${b}\s+(?:(?:on|over|out)\b(?!\s+(?:its|the|their)\s+way)(?!\s+to${x})|${S})`+String.raw`|(?:hand|pass|send)(?:s|es|ing)?\s+(?:on|over|out)\s+${b}\b(?!\s+to${x})`+`)`,`i`),w=(e,t)=>{let n=y(t),r=String(e??``).replace(p,` `).replace(h,` `).replace(v,(e,t)=>t&&n&&y(t)===n?e:` `);return C.test(r)},T=n=>{let r=n?.canDo&&typeof n.canDo==`object`?n.canDo:{},i=t.vn(n);return Object.entries(r).some(([t,n])=>t!==`admin`&&i.includes(t)&&w(n,e.qr(t)))},E=e=>{if(e?.arrivalsTo!==`handed`)return`holder`;let t=e?.handOnBy;return t===`admin`||t===`holder`?t:T(e)?`holder`:`admin`},D=e=>E(e)===`admin`?a:null,O=e=>{let t=u(e),n=D(e);return!t&&!n?null:{...t?{delete:[...t]}:{},...n?{send:[...n]}:{}}},k=e=>{let t=O(e);return t?`delete:${(t.delete||[`-`]).join(`,`)}|send:${(t.send||[`-`]).join(`,`)}`:``},A=(e,t)=>!e&&!t?null:{...e?{delete:[...e]}:{},...t?{send:[...t]}:{}},j=[`heldByUid`,`heldByName`,`assigneeUid`,`assignedToUid`,`assigneeId`,`assigneeName`,`assignedToName`],M=e=>!!e&&(typeof e.sourceId==`string`&&!!e.sourceId||Array.isArray(e.lock?.send)||j.some(t=>typeof e[t]==`string`&&!!e[t].trim())),N=(e,t)=>A(u(t),M(e)?D(t):null),P=(e,t)=>{let n=A(u(e),t===`admin`?D(e):null);return n?{lock:n}:{}},F=(e,t)=>{let n=e?.lock?.[t];return Array.isArray(n)?n.map(String):null},I=e=>F(e,`delete`),L=(e,t)=>{let n=F(e,`send`);return n?t===`admin`||!!t&&n.includes(t):!0},R=(e,t)=>{let n=I(e);return n?n.length?t===`admin`||!!t&&n.includes(t):!1:!0},z=(e,t)=>e?t!==null&&t.length===e.length&&e.every(e=>t.includes(e)):t===null,B=(e,t)=>z(u(t),I(e))&&z(M(e)?D(t):null,F(e,`send`));async function V(t,r,i,a){if(!a||!t)return 0;let o=r.filter(e=>e&&e.id&&!B(e,i));if(!o.length)return 0;for(let r=0;r<o.length;r+=500){let a=(0,n.writeBatch)(e.ui);for(let s of o.slice(r,r+500)){let r=N(s,i);a.update((0,n.doc)(e.ui,t,s.id),r?{lock:r}:{lock:(0,n.deleteField)()})}await a.commit()}return o.length}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return V}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return P}});
@@ -1 +1 @@
1
- require(`./chunk-CiTBaPhY.cjs`);const e=require(`./TimeZoneField-zR8N2Fj0.cjs`),t=require(`./DashboardNav-DOl9gJuu.cjs`),n=require(`./schedule-BAea6q8_.cjs`);let r=require(`react`),i=require(`firebase/firestore`);var a=[{id:`home`,title:`Home`,path:`/`,audience:`public`},{id:`contact`,title:`Contact`,path:`/contact`,audience:`public`},{id:`dashboard`,title:`Dashboard`,path:`/dashboard`,audience:`user`},{id:`support`,title:`Support`,path:`/support`,audience:`user`}],o=new Set([`home`,`drive`,`assets`,`contact`,`guide`,`templates`,`setup`,`support`,`theme`,`page_order`,`tab_order`]),s={public:0,user:1,internal:2,admin:3},c=(e,t)=>{let n=String(e||``).trim();return n?n.startsWith(`/`)?n:`/${n}`:`/${t}`},l=e=>new Set((Array.isArray(e?.order)?e.order:[]).filter(e=>e&&typeof e==`object`&&e.removed).map(e=>String(e.id)));function u(e,r,i,l,u=t.x()){let d=[...a];for(let{id:t,data:n}of e)o.has(t)||d.push({id:t,title:String(n?.pageName||n?.title||t),path:c(n?.route,t),brief:String(n?.brief||``),config:n,audience:`public`});for(let{id:e,data:t}of r)o.has(e)||d.push({id:e,title:String(t?.tabName||t?.title||e),path:c(t?.route,e),brief:String(t?.brief||``),config:t,audience:n.jn(t?.pageType)});for(let[e,t]of u){if(o.has(e)||d.some(t=>t.id===e)||d.some(t=>String(t.config?.fileId||``)===e))continue;let r=!!t.isPublic;if((r?i:l).has(e))continue;let a=t.config||{},s=c(a.route,e);d.some(e=>e.path===s)||d.push({id:e,title:String(r?a.pageName||a.pageTitle||a.title||e:a.tabName||a.tabTitle||a.title||e),path:s,brief:String(a.brief||``),config:a,audience:r?`public`:n.jn(a.pageType)})}return d.sort((e,t)=>(s[e.audience||`public`]??9)-(s[t.audience||`public`]??9)||e.title.localeCompare(t.title))}function d(){let[t,n]=(0,r.useState)(null),[a,o]=(0,r.useState)(null),[s,c]=(0,r.useState)(new Set),[d,f]=(0,r.useState)(new Set);return(0,r.useEffect)(()=>{let t=e=>{let t=[];return e.forEach(e=>t.push({id:e.id,data:e.data()})),t},r=[(0,i.onSnapshot)((0,i.collection)(e.ui,`sys_pages`),e=>n(t(e)),()=>n([])),(0,i.onSnapshot)((0,i.collection)(e.ui,`sys_tabs`),e=>o(t(e)),()=>o([])),(0,i.onSnapshot)((0,i.doc)(e.ui,`sys_configs`,`page_order`),e=>c(l(e.exists()?e.data():null)),()=>{}),(0,i.onSnapshot)((0,i.doc)(e.ui,`sys_configs`,`tab_order`),e=>f(l(e.exists()?e.data():null)),()=>{})];return()=>r.forEach(e=>e())},[]),t===null||a===null?null:u(t,a,s,d)}var f=[`board`,`table`,`calendar`,`drive`],p=[`inline_form`,`popup_form`],m=e=>typeof e!=`string`||e===``||e===`none`||e===`custom`||![...f,...p].includes(e),h=(e,t)=>m(e)||t&&!g(e),g=e=>typeof e==`string`&&f.includes(e),_=e=>String(e??``).toLowerCase().replace(/[^a-z0-9]+/g,`_`),v=(e,t)=>String(e?.recordsKey??``).trim()||_(e?.tabName||e?.pageId||t),y=(e,t)=>{let n=String(e?.recordsKey??``).trim();if(n)return n;let r=String(e?.pageName??``).toLowerCase().replace(/\s+/g,`_`)||e?.pageId||`custom_page`;return t&&e?.pageId||r},b={board:`tasks`,table:`table`,calendar:`events`,drive:`files`};function x(e,t,n=``){let r=b[String(e?.template??``)];return r?`${t}${y({...e,pageId:e?.pageId||n},!0)}_${r}`:t===`case_`?w(e,t):`${t}${v(e,t===`admin_`?`admin_page`:t===`mem_`?`internal_page`:`user_page`)}_records`}function S(e,t,n){let r=String(e?.recordsKey??``).trim();if(r)return r;let i=g(String(e?.template??``));return n?i?y({...e,pageId:t},!1):``:i?t:v(e,t)}var C=e=>(String(e?.recordsKey??``).trim()||String(e?.tabName||e?.contentKey||`page`)).toLowerCase().replace(/[^a-z0-9]+/g,`_`).replace(/^_+|_+$/g,``)||`page`,w=(e,t=n.pn)=>`${t}${C(e)}_entries`;Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return d}});
1
+ require(`./chunk-CiTBaPhY.cjs`);const e=require(`./TimeZoneField-Ckn1pKAL.cjs`),t=require(`./DashboardNav-GgEUpyTa.cjs`),n=require(`./schedule-BAea6q8_.cjs`);let r=require(`react`),i=require(`firebase/firestore`);var a=[{id:`home`,title:`Home`,path:`/`,audience:`public`},{id:`contact`,title:`Contact`,path:`/contact`,audience:`public`},{id:`dashboard`,title:`Dashboard`,path:`/dashboard`,audience:`user`},{id:`support`,title:`Support`,path:`/support`,audience:`user`}],o=new Set([`home`,`drive`,`assets`,`contact`,`guide`,`templates`,`setup`,`support`,`theme`,`page_order`,`tab_order`]),s={public:0,user:1,internal:2,admin:3},c=(e,t)=>{let n=String(e||``).trim();return n?n.startsWith(`/`)?n:`/${n}`:`/${t}`},l=e=>new Set((Array.isArray(e?.order)?e.order:[]).filter(e=>e&&typeof e==`object`&&e.removed).map(e=>String(e.id)));function u(e,r,i,l,u=t.x()){let d=[...a];for(let{id:t,data:n}of e)o.has(t)||d.push({id:t,title:String(n?.pageName||n?.title||t),path:c(n?.route,t),brief:String(n?.brief||``),config:n,audience:`public`});for(let{id:e,data:t}of r)o.has(e)||d.push({id:e,title:String(t?.tabName||t?.title||e),path:c(t?.route,e),brief:String(t?.brief||``),config:t,audience:n.jn(t?.pageType)});for(let[e,t]of u){if(o.has(e)||d.some(t=>t.id===e)||d.some(t=>String(t.config?.fileId||``)===e))continue;let r=!!t.isPublic;if((r?i:l).has(e))continue;let a=t.config||{},s=c(a.route,e);d.some(e=>e.path===s)||d.push({id:e,title:String(r?a.pageName||a.pageTitle||a.title||e:a.tabName||a.tabTitle||a.title||e),path:s,brief:String(a.brief||``),config:a,audience:r?`public`:n.jn(a.pageType)})}return d.sort((e,t)=>(s[e.audience||`public`]??9)-(s[t.audience||`public`]??9)||e.title.localeCompare(t.title))}function d(){let[t,n]=(0,r.useState)(null),[a,o]=(0,r.useState)(null),[s,c]=(0,r.useState)(new Set),[d,f]=(0,r.useState)(new Set);return(0,r.useEffect)(()=>{let t=e=>{let t=[];return e.forEach(e=>t.push({id:e.id,data:e.data()})),t},r=[(0,i.onSnapshot)((0,i.collection)(e.ui,`sys_pages`),e=>n(t(e)),()=>n([])),(0,i.onSnapshot)((0,i.collection)(e.ui,`sys_tabs`),e=>o(t(e)),()=>o([])),(0,i.onSnapshot)((0,i.doc)(e.ui,`sys_configs`,`page_order`),e=>c(l(e.exists()?e.data():null)),()=>{}),(0,i.onSnapshot)((0,i.doc)(e.ui,`sys_configs`,`tab_order`),e=>f(l(e.exists()?e.data():null)),()=>{})];return()=>r.forEach(e=>e())},[]),t===null||a===null?null:u(t,a,s,d)}var f=[`board`,`table`,`calendar`,`drive`],p=[`inline_form`,`popup_form`],m=e=>typeof e!=`string`||e===``||e===`none`||e===`custom`||![...f,...p].includes(e),h=(e,t)=>m(e)||t&&!g(e),g=e=>typeof e==`string`&&f.includes(e),_=e=>String(e??``).toLowerCase().replace(/[^a-z0-9]+/g,`_`),v=(e,t)=>String(e?.recordsKey??``).trim()||_(e?.tabName||e?.pageId||t),y=(e,t)=>{let n=String(e?.recordsKey??``).trim();if(n)return n;let r=String(e?.pageName??``).toLowerCase().replace(/\s+/g,`_`)||e?.pageId||`custom_page`;return t&&e?.pageId||r},b={board:`tasks`,table:`table`,calendar:`events`,drive:`files`};function x(e,t,n=``){let r=b[String(e?.template??``)];return r?`${t}${y({...e,pageId:e?.pageId||n},!0)}_${r}`:t===`case_`?w(e,t):`${t}${v(e,t===`admin_`?`admin_page`:t===`mem_`?`internal_page`:`user_page`)}_records`}function S(e,t,n){let r=String(e?.recordsKey??``).trim();if(r)return r;let i=g(String(e?.template??``));return n?i?y({...e,pageId:t},!1):``:i?t:v(e,t)}var C=e=>(String(e?.recordsKey??``).trim()||String(e?.tabName||e?.contentKey||`page`)).toLowerCase().replace(/[^a-z0-9]+/g,`_`).replace(/^_+|_+$/g,``)||`page`,w=(e,t=n.pn)=>`${t}${C(e)}_entries`;Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return d}});
@@ -1,5 +1,5 @@
1
- import { ui as e } from "./TimeZoneField-Dv389mAe.js";
2
- import { x as t } from "./DashboardNav-B0G943ux.js";
1
+ import { ui as e } from "./TimeZoneField-oIMwb5_X.js";
2
+ import { x as t } from "./DashboardNav-CEd8gGPm.js";
3
3
  import { jn as n, pn as r } from "./schedule-C13m_kiO.js";
4
4
  import { useEffect as i, useState as a } from "react";
5
5
  import { collection as o, doc as s, onSnapshot as c } from "firebase/firestore";
@@ -1 +1 @@
1
- const e=require(`./TimeZoneField-zR8N2Fj0.cjs`),t=require(`./schedule-BAea6q8_.cjs`),n=require(`./address-D88ICQCR.cjs`);var r=`member`,i=`finishedAt`,a=[`text`,`email`,`tel`,`number`,`date`,`textarea`,`select`,`checkbox`,`address`],o=new Set([`uid`,`id`,`email`,`displayName`,`avatar`,`photoURL`,`createdAt`,`lastLoginAt`,`role`,`inactive`,`removed`,`planUntil`,`planPass`,`requestedRole`,`requestedRoleAt`,i,`phoneClaim`]),s=e=>typeof e==`string`&&/^[a-zA-Z][a-zA-Z0-9_]{0,39}$/.test(e)&&!o.has(e),c=e=>a.includes(e);function l(e){if(!e||typeof e!=`object`)return null;let t=String(e.key??e.name??``).trim();if(!s(t))return null;let n=c(e.type)?e.type:`text`,r=String(e.label??``).trim()||t,i=[],a={};for(let t of Array.isArray(e.options)?e.options:[]){let e=t&&typeof t==`object`?String(t.value??``).trim()||String(t.label??``).trim():String(t??``).trim();if(!e||i.includes(e))continue;i.push(e);let n=t&&typeof t==`object`?String(t.label??``).trim():``;n&&n!==e&&(a[e]=n)}let o=n===`select`&&i.length===0?`text`:n;return{key:t,label:r,type:o,required:e.required===!0,editable:e.editable!==!1,...o===`select`?{options:i}:{},...o===`select`&&Object.keys(a).length?{optionLabels:a}:{},...typeof e.placeholder==`string`&&e.placeholder.trim()?{placeholder:e.placeholder.trim()}:{}}}function u(e){let t=Array.isArray(e)?e:Array.isArray(e?.fields)?e.fields:[],n=[];for(let e of t){let t=l(e);t&&!n.some(e=>e.key===t.key)&&n.push(t)}return n}function d(){let e=(typeof window<`u`?window.__FBOS_REGISTRATION__:null)||{},t={};for(let n of Object.keys(e)){let r=u(e[n]);r.length&&(t[String(n).toLowerCase()]=r)}return t}var f=e=>e===`member`||e===`internal`||t.Dn(e);function p(e,t=d()){let n=String(e??``).trim().toLowerCase();return f(n)&&t[n]?.length?n:r}var m=(e,t,n=d())=>n[p(t?.perRole?e:`member`,n)]||[];function h(t,n){if(!n?.perRole)return r;let i=e.in(t)?.role,a=String(t?.role??``).trim().toLowerCase(),o=d();for(let e of[i,a])if(e&&f(e)&&o[e]?.length)return e;return r}var g=(e,t)=>m(h(e,t),t);function _(e,t){let n=e?.[t.key];return t.type===`checkbox`?n===!0:typeof n==`number`?Number.isFinite(n):typeof n==`string`?n.trim()!==``:!1}function v(e,t){let n=e?.[t.key];if(t.type===`checkbox`)return n===!0?`Yes`:`No`;if(typeof n==`number`)return String(n);let r=typeof n==`string`?n.trim():``;return t.type===`select`&&r?y(t,r):r}var y=(e,t)=>{let n=e.optionLabels?.[t];return typeof n==`string`&&n?n:t},b=(e,t)=>!t.editable&&_(e,t),x=(e,t)=>e.filter(e=>e.required&&!_(t,e));function S(e){if(!e||e.removed===!0)return[];let t=[];return String(e.displayName??``).trim()||t.push(`name`),String(e.email??``).trim()||t.push(`email`),t}var C=e=>typeof e?.finishedAt==`string`&&e.finishedAt.trim()!==``,w=(e=Date.now())=>({[i]:new Date(e).toISOString()});function T(e,t,n){if(!e||e.removed===!0)return!1;if(S(e).length>0)return!0;if(String(t??``).trim().toLowerCase()===`admin`)return!1;let r=g(e,n);return x(r,e).length>0?!0:r.length>0&&!C(e)}var E=`firebase-os:finish-not-now`;function D(e){if(e)try{sessionStorage.setItem(`${E}:${e}`,`1`)}catch{}}function O(e){if(!e)return!1;try{return sessionStorage.getItem(`${E}:${e}`)===`1`}catch{return!1}}var k=(e,t,n,r)=>T(e,t,n)?S(e).length>0?!0:!(n?.skippable&&O(r)):!1,A=(e,t,n,r)=>T(e,t,n)&&O(r)&&S(e).length===0;function j(e,t){let n=e.type===`checkbox`?t===!0:typeof t==`string`?t.trim()!==``:t!=null&&t!==``;return e.required&&!n?e.type===`checkbox`?`Please tick "${e.label}".`:`Please fill in ${e.label}.`:n?e.type===`email`&&!/^[^@\s]+@[^@\s.]+\.[^@\s]+$/.test(String(t).trim())?`${e.label} does not look like an email address.`:e.type===`number`&&!Number.isFinite(Number(String(t).trim()))?`${e.label} has to be a number.`:``:``}function M(e,t){let n={};for(let r of e){let e=j(r,t[r.key]);e&&(n[r.key]=e)}return n}function N(e,t,r=null){let i={};for(let a of e){if(b(r,a))continue;if(a.type===`address`){let e=n.r(a.key,n.u(n.i(a.key,t)));if(e[a.key]){Object.assign(i,e);continue}for(let[t,n]of Object.entries(e))t in(r||{})&&(i[t]=n);continue}let e=t[a.key];if(e===void 0)continue;if(a.type===`checkbox`){let t=e===!0;(t||a.key in(r||{}))&&(i[a.key]=t);continue}let o=typeof e==`string`?e.trim():String(e??``).trim();if(!o){a.key in(r||{})&&(i[a.key]=``);continue}if(a.type===`number`){let e=Number(o);i[a.key]=Number.isFinite(e)?e:o;continue}i[a.key]=o}return i}function P(e,t){let r={};for(let i of e){let e=t?.[i.key];if(i.type===`address`){Object.assign(r,n.r(i.key,n.i(i.key,t||{})));continue}i.type===`checkbox`?r[i.key]=e===!0:typeof e==`number`?r[i.key]=String(e):r[i.key]=typeof e==`string`?e:``}return r}var F=`registered`;function I(e,t=Date.now()){let n=Date.parse(String(e?.createdAt??``));if(!Number.isFinite(n))return!1;let r=t-n;return r<36e5&&r>-36e5}var L=(t,n)=>t?`Finish registering as ${e.xn(t.role,n)}`:`Finish registration`,R=e=>`${String(e||`member`).toLowerCase()}Registration.config.ts`,z=e=>`${String(e||`member`).toLowerCase()}RegistrationConfig`,B=(e,t)=>e===`member`?`anybody who registers as an ordinary member`:e===`internal`?`somebody registering as one of ${t}`:`somebody registering as ${/^[aeiou]/i.test(t)?`an`:`a`} ${t}`;Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return A}});
1
+ const e=require(`./TimeZoneField-Ckn1pKAL.cjs`),t=require(`./schedule-BAea6q8_.cjs`),n=require(`./address-D88ICQCR.cjs`);var r=`member`,i=`finishedAt`,a=[`text`,`email`,`tel`,`number`,`date`,`textarea`,`select`,`checkbox`,`address`],o=new Set([`uid`,`id`,`email`,`displayName`,`avatar`,`photoURL`,`createdAt`,`lastLoginAt`,`role`,`inactive`,`removed`,`planUntil`,`planPass`,`requestedRole`,`requestedRoleAt`,i,`phoneClaim`]),s=e=>typeof e==`string`&&/^[a-zA-Z][a-zA-Z0-9_]{0,39}$/.test(e)&&!o.has(e),c=e=>a.includes(e);function l(e){if(!e||typeof e!=`object`)return null;let t=String(e.key??e.name??``).trim();if(!s(t))return null;let n=c(e.type)?e.type:`text`,r=String(e.label??``).trim()||t,i=[],a={};for(let t of Array.isArray(e.options)?e.options:[]){let e=t&&typeof t==`object`?String(t.value??``).trim()||String(t.label??``).trim():String(t??``).trim();if(!e||i.includes(e))continue;i.push(e);let n=t&&typeof t==`object`?String(t.label??``).trim():``;n&&n!==e&&(a[e]=n)}let o=n===`select`&&i.length===0?`text`:n;return{key:t,label:r,type:o,required:e.required===!0,editable:e.editable!==!1,...o===`select`?{options:i}:{},...o===`select`&&Object.keys(a).length?{optionLabels:a}:{},...typeof e.placeholder==`string`&&e.placeholder.trim()?{placeholder:e.placeholder.trim()}:{}}}function u(e){let t=Array.isArray(e)?e:Array.isArray(e?.fields)?e.fields:[],n=[];for(let e of t){let t=l(e);t&&!n.some(e=>e.key===t.key)&&n.push(t)}return n}function d(){let e=(typeof window<`u`?window.__FBOS_REGISTRATION__:null)||{},t={};for(let n of Object.keys(e)){let r=u(e[n]);r.length&&(t[String(n).toLowerCase()]=r)}return t}var f=e=>e===`member`||e===`internal`||t.Dn(e);function p(e,t=d()){let n=String(e??``).trim().toLowerCase();return f(n)&&t[n]?.length?n:r}var m=(e,t,n=d())=>n[p(t?.perRole?e:`member`,n)]||[];function h(t,n){if(!n?.perRole)return r;let i=e.in(t)?.role,a=String(t?.role??``).trim().toLowerCase(),o=d();for(let e of[i,a])if(e&&f(e)&&o[e]?.length)return e;return r}var g=(e,t)=>m(h(e,t),t);function _(e,t){let n=e?.[t.key];return t.type===`checkbox`?n===!0:typeof n==`number`?Number.isFinite(n):typeof n==`string`?n.trim()!==``:!1}function v(e,t){let n=e?.[t.key];if(t.type===`checkbox`)return n===!0?`Yes`:`No`;if(typeof n==`number`)return String(n);let r=typeof n==`string`?n.trim():``;return t.type===`select`&&r?y(t,r):r}var y=(e,t)=>{let n=e.optionLabels?.[t];return typeof n==`string`&&n?n:t},b=(e,t)=>!t.editable&&_(e,t),x=(e,t)=>e.filter(e=>e.required&&!_(t,e));function S(e){if(!e||e.removed===!0)return[];let t=[];return String(e.displayName??``).trim()||t.push(`name`),String(e.email??``).trim()||t.push(`email`),t}var C=e=>typeof e?.finishedAt==`string`&&e.finishedAt.trim()!==``,w=(e=Date.now())=>({[i]:new Date(e).toISOString()});function T(e,t,n){if(!e||e.removed===!0)return!1;if(S(e).length>0)return!0;if(String(t??``).trim().toLowerCase()===`admin`)return!1;let r=g(e,n);return x(r,e).length>0?!0:r.length>0&&!C(e)}var E=`firebase-os:finish-not-now`;function D(e){if(e)try{sessionStorage.setItem(`${E}:${e}`,`1`)}catch{}}function O(e){if(!e)return!1;try{return sessionStorage.getItem(`${E}:${e}`)===`1`}catch{return!1}}var k=(e,t,n,r)=>T(e,t,n)?S(e).length>0?!0:!(n?.skippable&&O(r)):!1,A=(e,t,n,r)=>T(e,t,n)&&O(r)&&S(e).length===0;function j(e,t){let n=e.type===`checkbox`?t===!0:typeof t==`string`?t.trim()!==``:t!=null&&t!==``;return e.required&&!n?e.type===`checkbox`?`Please tick "${e.label}".`:`Please fill in ${e.label}.`:n?e.type===`email`&&!/^[^@\s]+@[^@\s.]+\.[^@\s]+$/.test(String(t).trim())?`${e.label} does not look like an email address.`:e.type===`number`&&!Number.isFinite(Number(String(t).trim()))?`${e.label} has to be a number.`:``:``}function M(e,t){let n={};for(let r of e){let e=j(r,t[r.key]);e&&(n[r.key]=e)}return n}function N(e,t,r=null){let i={};for(let a of e){if(b(r,a))continue;if(a.type===`address`){let e=n.r(a.key,n.u(n.i(a.key,t)));if(e[a.key]){Object.assign(i,e);continue}for(let[t,n]of Object.entries(e))t in(r||{})&&(i[t]=n);continue}let e=t[a.key];if(e===void 0)continue;if(a.type===`checkbox`){let t=e===!0;(t||a.key in(r||{}))&&(i[a.key]=t);continue}let o=typeof e==`string`?e.trim():String(e??``).trim();if(!o){a.key in(r||{})&&(i[a.key]=``);continue}if(a.type===`number`){let e=Number(o);i[a.key]=Number.isFinite(e)?e:o;continue}i[a.key]=o}return i}function P(e,t){let r={};for(let i of e){let e=t?.[i.key];if(i.type===`address`){Object.assign(r,n.r(i.key,n.i(i.key,t||{})));continue}i.type===`checkbox`?r[i.key]=e===!0:typeof e==`number`?r[i.key]=String(e):r[i.key]=typeof e==`string`?e:``}return r}var F=`registered`;function I(e,t=Date.now()){let n=Date.parse(String(e?.createdAt??``));if(!Number.isFinite(n))return!1;let r=t-n;return r<36e5&&r>-36e5}var L=(t,n)=>t?`Finish registering as ${e.xn(t.role,n)}`:`Finish registration`,R=e=>`${String(e||`member`).toLowerCase()}Registration.config.ts`,z=e=>`${String(e||`member`).toLowerCase()}RegistrationConfig`,B=(e,t)=>e===`member`?`anybody who registers as an ordinary member`:e===`internal`?`somebody registering as one of ${t}`:`somebody registering as ${/^[aeiou]/i.test(t)?`an`:`a`} ${t}`;Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return A}});
@@ -1,4 +1,4 @@
1
- import { in as e, xn as t } from "./TimeZoneField-Dv389mAe.js";
1
+ import { in as e, xn as t } from "./TimeZoneField-oIMwb5_X.js";
2
2
  import { Dn as n } from "./schedule-C13m_kiO.js";
3
3
  import { i as r, r as i, u as a } from "./address-4GXKgkSk.js";
4
4
  var o = "member", s = "finishedAt", c = [
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./chunk-CiTBaPhY.cjs`);const e=require(`./ContactPopup-D5Hh0bfE.cjs`);exports.ContactPopup=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./chunk-CiTBaPhY.cjs`);const e=require(`./ContactPopup-D8aSSlmS.cjs`);exports.ContactPopup=e.t;
@@ -1,2 +1,2 @@
1
- import { t as e } from "./ContactPopup-CL4AMwK9.js";
1
+ import { t as e } from "./ContactPopup-Fs7wzrOX.js";
2
2
  export { e as ContactPopup };
@@ -1 +1 @@
1
- require(`./chunk-CiTBaPhY.cjs`);const e=require(`./PageTitle-BWmE74WQ.cjs`),t=require(`./TimeZoneField-zR8N2Fj0.cjs`),n=require(`./DashboardNav-DOl9gJuu.cjs`),r=require(`./schedule-BAea6q8_.cjs`);let i=require(`react`),a=require(`firebase/firestore`);var o=new Set([`users`,`users-round`,`user`,`user-round`,`circle-user`,`contact-round`]),s=new Map,c=t=>{let n=String(t||``).trim();if(!n)return``;if(!s.has(n)){let t=e.u(n,8,void 0,!1);s.set(n,t.find(e=>!o.has(e))||t[0]||``)}return s.get(n)||``},l=(e,n=t.Kr())=>String(n.find(t=>t.id===e)?.icon||``).trim()||(t.Gr(e)?t.Wr(e)||t.zr[e]:c(t.qr(e,n))||`id-card`),u=`sys_roles`,d=(e,t)=>({id:e,name:String(t?.name||e),...String(t?.icon||``).trim()?{icon:String(t.icon).trim()}:{},...typeof t?.createdAt==`number`?{createdAt:t.createdAt}:{},...Array.isArray(t?.sees)?{sees:t.sees.filter(e=>typeof e==`string`&&!!e)}:{}}),f=(e,t)=>e.name.localeCompare(t.name);function p(e,n=t.Kr()){let i=String(e||``).trim();if(!i)return`Type a name for the role first — Client, say, or Supplier.`;let a=r.Ln(i);if(a.length<2||!/^[a-z]/.test(a))return`Use a name with at least two letters in it.`;if(r.hn.has(a)||!r.Dn(a))return`${i} is a word the app already uses. Pick another.`;if(n.some(e=>e.id===a))return`You already have a role called ${n.find(e=>e.id===a).name}.`;let o=t.Ur(n).find(e=>e.name.trim().toLowerCase()===i.toLowerCase());return o?`You already have a role called ${o.name}.`:``}async function m(e){let n=String(e||``).trim().slice(0,48),i={id:r.Ln(n),name:n,createdAt:Date.now()};return await(0,a.setDoc)((0,a.doc)(t.ui,u,i.id),{name:i.name,createdAt:i.createdAt}),i}async function h(e,n){let i=String(n||``).trim().slice(0,48);if(i){if(t.Gr(e)){if(i===t.Vr[e]){if(t.Wr(e)){await(0,a.setDoc)((0,a.doc)(t.ui,u,e),{name:``,builtIn:!0},{merge:!0});return}await(0,a.deleteDoc)((0,a.doc)(t.ui,u,e)).catch(()=>{});return}await(0,a.setDoc)((0,a.doc)(t.ui,u,e),{name:i,builtIn:!0},{merge:!0});return}r.Dn(e)&&await(0,a.setDoc)((0,a.doc)(t.ui,u,e),{name:i},{merge:!0})}}async function g(e,n){let i=String(n||``).trim();!t.Gr(e)&&!r.Dn(e)||await(0,a.setDoc)((0,a.doc)(t.ui,u,e),{icon:i,...t.Gr(e)?{builtIn:!0}:{}},{merge:!0})}function _(e,n,r=t.Kr()){let i=String(n||``).trim();if(!i)return`A role needs a name.`;let a=t.Ur(r).find(t=>t.id!==e&&t.name.trim().toLowerCase()===i.toLowerCase());return a?`You already have a role called ${a.name}.`:``}var v=(e,t)=>(Array.isArray(e?.plans)?e.plans:[]).filter(e=>e?.roleId===t);async function y(e){let n={people:[],pages:[],plans:[]};return r.Dn(e)?((await(0,a.getDocs)((0,a.query)((0,a.collection)(t.ui,`user_profiles`),(0,a.where)(`role`,`==`,e)))).forEach(e=>n.people.push(e.id)),(await(0,a.getDocs)((0,a.collection)(t.ui,`sys_tabs`))).forEach(t=>{r._n(t.data()?.roles).includes(e)&&n.pages.push(t.id)}),(await(0,a.getDocs)((0,a.collection)(t.ui,t.Qn))).forEach(t=>{if(t.id!==`_settings`)for(let r of v(t.data(),e))n.plans.push(String(r?.name||``).trim()||`A plan`)}),n):n}async function b(e){if(!r.Dn(e))return;let i=await(0,a.getDocs)((0,a.query)((0,a.collection)(t.ui,`user_profiles`),(0,a.where)(`role`,`==`,e)));for(let e of i.docs)await(0,a.updateDoc)((0,a.doc)(t.ui,`user_profiles`,e.id),{role:r.In(`free`),...t.Wn()});let o=await(0,a.getDocs)((0,a.collection)(t.ui,t.Qn));for(let n of o.docs){if(n.id===`_settings`||!v(n.data(),e).length)continue;let r=n.data().plans.map(t=>t?.roleId===e?{...t,roleId:``}:t);await(0,a.setDoc)((0,a.doc)(t.ui,t.Qn,n.id),{plans:r},{merge:!0})}let s=await(0,a.getDocs)((0,a.collection)(t.ui,`sys_tabs`));for(let n of s.docs){let i=r._n(n.data()?.roles);if(!i.includes(e))continue;let o=i.filter(t=>t!==e);await(0,a.setDoc)((0,a.doc)(t.ui,`sys_tabs`,n.id),{roles:o.length?o:[`user`]},{merge:!0})}await n.p(e),await(0,a.deleteDoc)((0,a.doc)(t.ui,u,e))}function x(){let[e,n]=(0,i.useState)(()=>t.Kr());return(0,i.useEffect)(()=>(0,a.onSnapshot)((0,a.collection)(t.ui,u),e=>{let i=[],a={},o={};e.forEach(e=>{if(t.Gr(e.id)){let t=String(e.data()?.name||``).trim();t&&(a[e.id]=t);let n=String(e.data()?.icon||``).trim();n&&(o[e.id]=n);return}r.Dn(e.id)&&i.push(d(e.id,e.data()))}),i.sort(f),t.Xr(a),t.Jr(o),t.Yr(i),n(i)},()=>{}),[]),e}var S=(e=t.Kr())=>t.Br.map(n=>({id:n,name:t.qr(n,e)}));Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return l}});
1
+ require(`./chunk-CiTBaPhY.cjs`);const e=require(`./PageTitle-DQkvCB11.cjs`),t=require(`./TimeZoneField-Ckn1pKAL.cjs`),n=require(`./DashboardNav-GgEUpyTa.cjs`),r=require(`./schedule-BAea6q8_.cjs`);let i=require(`react`),a=require(`firebase/firestore`);var o=new Set([`users`,`users-round`,`user`,`user-round`,`circle-user`,`contact-round`]),s=new Map,c=t=>{let n=String(t||``).trim();if(!n)return``;if(!s.has(n)){let t=e.u(n,8,void 0,!1);s.set(n,t.find(e=>!o.has(e))||t[0]||``)}return s.get(n)||``},l=(e,n=t.Kr())=>String(n.find(t=>t.id===e)?.icon||``).trim()||(t.Gr(e)?t.Wr(e)||t.zr[e]:c(t.qr(e,n))||`id-card`),u=`sys_roles`,d=(e,t)=>({id:e,name:String(t?.name||e),...String(t?.icon||``).trim()?{icon:String(t.icon).trim()}:{},...typeof t?.createdAt==`number`?{createdAt:t.createdAt}:{},...Array.isArray(t?.sees)?{sees:t.sees.filter(e=>typeof e==`string`&&!!e)}:{}}),f=(e,t)=>e.name.localeCompare(t.name);function p(e,n=t.Kr()){let i=String(e||``).trim();if(!i)return`Type a name for the role first — Client, say, or Supplier.`;let a=r.Ln(i);if(a.length<2||!/^[a-z]/.test(a))return`Use a name with at least two letters in it.`;if(r.hn.has(a)||!r.Dn(a))return`${i} is a word the app already uses. Pick another.`;if(n.some(e=>e.id===a))return`You already have a role called ${n.find(e=>e.id===a).name}.`;let o=t.Ur(n).find(e=>e.name.trim().toLowerCase()===i.toLowerCase());return o?`You already have a role called ${o.name}.`:``}async function m(e){let n=String(e||``).trim().slice(0,48),i={id:r.Ln(n),name:n,createdAt:Date.now()};return await(0,a.setDoc)((0,a.doc)(t.ui,u,i.id),{name:i.name,createdAt:i.createdAt}),i}async function h(e,n){let i=String(n||``).trim().slice(0,48);if(i){if(t.Gr(e)){if(i===t.Vr[e]){if(t.Wr(e)){await(0,a.setDoc)((0,a.doc)(t.ui,u,e),{name:``,builtIn:!0},{merge:!0});return}await(0,a.deleteDoc)((0,a.doc)(t.ui,u,e)).catch(()=>{});return}await(0,a.setDoc)((0,a.doc)(t.ui,u,e),{name:i,builtIn:!0},{merge:!0});return}r.Dn(e)&&await(0,a.setDoc)((0,a.doc)(t.ui,u,e),{name:i},{merge:!0})}}async function g(e,n){let i=String(n||``).trim();!t.Gr(e)&&!r.Dn(e)||await(0,a.setDoc)((0,a.doc)(t.ui,u,e),{icon:i,...t.Gr(e)?{builtIn:!0}:{}},{merge:!0})}function _(e,n,r=t.Kr()){let i=String(n||``).trim();if(!i)return`A role needs a name.`;let a=t.Ur(r).find(t=>t.id!==e&&t.name.trim().toLowerCase()===i.toLowerCase());return a?`You already have a role called ${a.name}.`:``}var v=(e,t)=>(Array.isArray(e?.plans)?e.plans:[]).filter(e=>e?.roleId===t);async function y(e){let n={people:[],pages:[],plans:[]};return r.Dn(e)?((await(0,a.getDocs)((0,a.query)((0,a.collection)(t.ui,`user_profiles`),(0,a.where)(`role`,`==`,e)))).forEach(e=>n.people.push(e.id)),(await(0,a.getDocs)((0,a.collection)(t.ui,`sys_tabs`))).forEach(t=>{r._n(t.data()?.roles).includes(e)&&n.pages.push(t.id)}),(await(0,a.getDocs)((0,a.collection)(t.ui,t.Qn))).forEach(t=>{if(t.id!==`_settings`)for(let r of v(t.data(),e))n.plans.push(String(r?.name||``).trim()||`A plan`)}),n):n}async function b(e){if(!r.Dn(e))return;let i=await(0,a.getDocs)((0,a.query)((0,a.collection)(t.ui,`user_profiles`),(0,a.where)(`role`,`==`,e)));for(let e of i.docs)await(0,a.updateDoc)((0,a.doc)(t.ui,`user_profiles`,e.id),{role:r.In(`free`),...t.Wn()});let o=await(0,a.getDocs)((0,a.collection)(t.ui,t.Qn));for(let n of o.docs){if(n.id===`_settings`||!v(n.data(),e).length)continue;let r=n.data().plans.map(t=>t?.roleId===e?{...t,roleId:``}:t);await(0,a.setDoc)((0,a.doc)(t.ui,t.Qn,n.id),{plans:r},{merge:!0})}let s=await(0,a.getDocs)((0,a.collection)(t.ui,`sys_tabs`));for(let n of s.docs){let i=r._n(n.data()?.roles);if(!i.includes(e))continue;let o=i.filter(t=>t!==e);await(0,a.setDoc)((0,a.doc)(t.ui,`sys_tabs`,n.id),{roles:o.length?o:[`user`]},{merge:!0})}await n.p(e),await(0,a.deleteDoc)((0,a.doc)(t.ui,u,e))}function x(){let[e,n]=(0,i.useState)(()=>t.Kr());return(0,i.useEffect)(()=>(0,a.onSnapshot)((0,a.collection)(t.ui,u),e=>{let i=[],a={},o={};e.forEach(e=>{if(t.Gr(e.id)){let t=String(e.data()?.name||``).trim();t&&(a[e.id]=t);let n=String(e.data()?.icon||``).trim();n&&(o[e.id]=n);return}r.Dn(e.id)&&i.push(d(e.id,e.data()))}),i.sort(f),t.Xr(a),t.Jr(o),t.Yr(i),n(i)},()=>{}),[]),e}var S=(e=t.Kr())=>t.Br.map(n=>({id:n,name:t.qr(n,e)}));Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return l}});
@@ -1,6 +1,6 @@
1
- import { u as e } from "./PageTitle-DFGW71q8.js";
2
- import { Br as t, Gr as n, Jr as r, Kr as i, Qn as a, Ur as o, Vr as s, Wn as c, Wr as l, Xr as u, Yr as d, qr as f, ui as p, zr as m } from "./TimeZoneField-Dv389mAe.js";
3
- import { p as h } from "./DashboardNav-B0G943ux.js";
1
+ import { u as e } from "./PageTitle-DCoUQWw6.js";
2
+ import { Br as t, Gr as n, Jr as r, Kr as i, Qn as a, Ur as o, Vr as s, Wn as c, Wr as l, Xr as u, Yr as d, qr as f, ui as p, zr as m } from "./TimeZoneField-oIMwb5_X.js";
3
+ import { p as h } from "./DashboardNav-CEd8gGPm.js";
4
4
  import { Dn as g, In as _, Ln as v, _n as y, hn as b } from "./schedule-C13m_kiO.js";
5
5
  import { useEffect as x, useState as S } from "react";
6
6
  import { collection as C, deleteDoc as w, doc as T, getDocs as E, onSnapshot as D, query as O, setDoc as k, updateDoc as A, where as j } from "firebase/firestore";