@dragonmastery/dragoncore-vue 0.0.22 → 0.0.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (249) hide show
  1. package/dist/{AppLink-CHMMrSFI.js → AppLink-FcNGKgvG.js} +1 -1
  2. package/dist/{AppLink-CHMMrSFI.js.map → AppLink-FcNGKgvG.js.map} +1 -1
  3. package/dist/Appearance-Ch4zfWZ3.js +3 -0
  4. package/dist/{Appearance-DxWTyx1M.js → Appearance-shr0Aql0.js} +1 -1
  5. package/dist/{Appearance-DxWTyx1M.js.map → Appearance-shr0Aql0.js.map} +1 -1
  6. package/dist/{ChangePasswordPage-ePeFkv_6.js → ChangePasswordPage-C633yQiU.js} +2 -2
  7. package/dist/{ChangePasswordPage-ePeFkv_6.js.map → ChangePasswordPage-C633yQiU.js.map} +1 -1
  8. package/dist/ChangePasswordPage-CYuCCosx.js +7 -0
  9. package/dist/ConfirmDialog-DjthOYU6.js +85 -0
  10. package/dist/ConfirmDialog-DjthOYU6.js.map +1 -0
  11. package/dist/ConsentFlowStep-DbQpQQA-.js +149 -0
  12. package/dist/ConsentFlowStep-DbQpQQA-.js.map +1 -0
  13. package/dist/ConsentRequired-BiCKEVBG.js +113 -0
  14. package/dist/ConsentRequired-BiCKEVBG.js.map +1 -0
  15. package/dist/CreateTeamForm-BnC_JPEK.js +12 -0
  16. package/dist/CreateTeamForm-CvMUbK5X.js +142 -0
  17. package/dist/CreateTeamForm-CvMUbK5X.js.map +1 -0
  18. package/dist/CreateTeamMemberForm-DUVHzzF0.js +140 -0
  19. package/dist/CreateTeamMemberForm-DUVHzzF0.js.map +1 -0
  20. package/dist/CreateTeamMemberForm-QpDhqvfb.js +12 -0
  21. package/dist/CreateUserPage-C9uOeYDJ.js +7 -0
  22. package/dist/{CreateUserPage-Cdv-3U5M.js → CreateUserPage-CqKcY7_X.js} +2 -2
  23. package/dist/{CreateUserPage-Cdv-3U5M.js.map → CreateUserPage-CqKcY7_X.js.map} +1 -1
  24. package/dist/CreditBalanceDashboard-CS4fV6MP.js +13 -0
  25. package/dist/CreditBalanceDashboard-CSUKpYSo.js +28 -0
  26. package/dist/CreditBalanceDashboard-CSUKpYSo.js.map +1 -0
  27. package/dist/CreditManagement-BdRd_TLz.js +356 -0
  28. package/dist/CreditManagement-BdRd_TLz.js.map +1 -0
  29. package/dist/CreditManagement-Buuew7-f.js +13 -0
  30. package/dist/CreditTransactionHistory-cYyRFOdS.js +229 -0
  31. package/dist/CreditTransactionHistory-cYyRFOdS.js.map +1 -0
  32. package/dist/CustomerCreateSupportTicketForm-BDNs8cKo.js +158 -0
  33. package/dist/CustomerCreateSupportTicketForm-BDNs8cKo.js.map +1 -0
  34. package/dist/CustomerCreateSupportTicketForm-Dk6lwDGL.js +14 -0
  35. package/dist/{CustomerSupportTicketDetailPage-UGqVoV4j.js → CustomerSupportTicketDetailPage-DGfUzPl8.js} +12 -9
  36. package/dist/{CustomerSupportTicketDetailPage-UGqVoV4j.js.map → CustomerSupportTicketDetailPage-DGfUzPl8.js.map} +1 -1
  37. package/dist/CustomerSupportTicketList-DoWnrEwj.js +63 -0
  38. package/dist/{CustomerSupportTicketParent-C2XdM5f7.js → CustomerSupportTicketParent-BpBuYCrP.js} +4 -4
  39. package/dist/{CustomerSupportTicketParent-C2XdM5f7.js.map → CustomerSupportTicketParent-BpBuYCrP.js.map} +1 -1
  40. package/dist/CustomerSupportTicketParent-Djy7pNqO.js +8 -0
  41. package/dist/CustomerSupportTicketSuccess-BKQ07Y8H.js +12 -0
  42. package/dist/CustomerSupportTicketSuccess-DZ6_1jL9.js +54 -0
  43. package/dist/CustomerSupportTicketSuccess-DZ6_1jL9.js.map +1 -0
  44. package/dist/EditTeamForm-CPJBjZa2.js +163 -0
  45. package/dist/EditTeamForm-CPJBjZa2.js.map +1 -0
  46. package/dist/EditTeamForm-DS_zV1Mk.js +12 -0
  47. package/dist/EditTeamMemberForm-D7D1Zddh.js +9 -0
  48. package/dist/{EditTeamMemberForm-BgjNP8MZ.js → EditTeamMemberForm-DfgJr5Cy.js} +7 -72
  49. package/dist/EditTeamMemberForm-DfgJr5Cy.js.map +1 -0
  50. package/dist/EditUserPage-C0K7EGjM.js +8 -0
  51. package/dist/{EditUserPage-uLPhRW5x.js → EditUserPage-CI_jtU8P.js} +4 -4
  52. package/dist/{EditUserPage-uLPhRW5x.js.map → EditUserPage-CI_jtU8P.js.map} +1 -1
  53. package/dist/EnhancedRefreshTokenHandler-C6tZCcfX.js +189 -0
  54. package/dist/EnhancedRefreshTokenHandler-C6tZCcfX.js.map +1 -0
  55. package/dist/FieldsetSection-Cd4B8Ad7.js +27 -0
  56. package/dist/FieldsetSection-Cd4B8Ad7.js.map +1 -0
  57. package/dist/{ForgotPassword-B8JG_n9D.js → ForgotPassword-Ckb9Z-wb.js} +4 -4
  58. package/dist/{ForgotPassword-B8JG_n9D.js.map → ForgotPassword-Ckb9Z-wb.js.map} +1 -1
  59. package/dist/ForgotPassword-tJVSg7PB.js +8 -0
  60. package/dist/{TimelineSystemEvent-BGG9WkQw.js → InlineAttachments-DAn_QknY.js} +60 -661
  61. package/dist/InlineAttachments-DAn_QknY.js.map +1 -0
  62. package/dist/{LoginForm-C-_lBDyl.js → LoginForm-CMN2T1fA.js} +5 -5
  63. package/dist/{LoginForm-C-_lBDyl.js.map → LoginForm-CMN2T1fA.js.map} +1 -1
  64. package/dist/LoginForm-QFJ8NHww.js +8 -0
  65. package/dist/{Logout-CIAoXyOg.js → Logout-CFLYHlLr.js} +5 -5
  66. package/dist/{Logout-CIAoXyOg.js.map → Logout-CFLYHlLr.js.map} +1 -1
  67. package/dist/Logout-CjDBff3W.js +8 -0
  68. package/dist/{MfaSetup-9qdTKQ0m.js → MfaSetup-85i4HlNJ.js} +7 -7
  69. package/dist/{MfaSetup-9qdTKQ0m.js.map → MfaSetup-85i4HlNJ.js.map} +1 -1
  70. package/dist/MfaSetup-C5mBMKsa.js +9 -0
  71. package/dist/{MfaVerify-Cgta1nE9.js → MfaVerify-C-A75TFZ.js} +6 -6
  72. package/dist/{MfaVerify-Cgta1nE9.js.map → MfaVerify-C-A75TFZ.js.map} +1 -1
  73. package/dist/MfaVerify-Dy2aV5Gk.js +9 -0
  74. package/dist/{RecordVersionViewer-BWZ78vvE.js → RecordVersionViewer-D2j10HdK.js} +1 -1
  75. package/dist/{RecordVersionViewer-BWZ78vvE.js.map → RecordVersionViewer-D2j10HdK.js.map} +1 -1
  76. package/dist/{ResetPassword-DHUfERyS.js → ResetPassword-Cd-Yxp8E.js} +4 -4
  77. package/dist/{ResetPassword-DHUfERyS.js.map → ResetPassword-Cd-Yxp8E.js.map} +1 -1
  78. package/dist/ResetPassword-D6to3G6a.js +8 -0
  79. package/dist/{SavedFiltersPage-CjFv4fI_.js → SavedFiltersPage-DPJA7feS.js} +62 -34
  80. package/dist/{SavedFiltersPage-CjFv4fI_.js.map → SavedFiltersPage-DPJA7feS.js.map} +1 -1
  81. package/dist/{Signup-DfG7Xmkx.js → Signup-2pqvJiVt.js} +57 -57
  82. package/dist/Signup-2pqvJiVt.js.map +1 -0
  83. package/dist/Signup-XdImA1os.js +9 -0
  84. package/dist/SignupConsentFlow-dyQSp9iU.js +214 -0
  85. package/dist/SignupConsentFlow-dyQSp9iU.js.map +1 -0
  86. package/dist/{SignupRequirementsPage-Sm3vgkhC.js → SignupRequirementsPage-Cf-ElkEq.js} +9 -8
  87. package/dist/{SignupRequirementsPage-Sm3vgkhC.js.map → SignupRequirementsPage-Cf-ElkEq.js.map} +1 -1
  88. package/dist/StaffCreateSupportTicketForm-BgaZJWpj.js +255 -0
  89. package/dist/StaffCreateSupportTicketForm-BgaZJWpj.js.map +1 -0
  90. package/dist/StaffCreateSupportTicketForm-C_i7mz26.js +14 -0
  91. package/dist/{StaffSupportTicketDetailPage-ePkLJU12.js → StaffSupportTicketDetailPage-DoZClE4Y.js} +17 -14
  92. package/dist/StaffSupportTicketDetailPage-DoZClE4Y.js.map +1 -0
  93. package/dist/StaffSupportTicketList-DejFCAh7.js +63 -0
  94. package/dist/StaffSupportTicketParent-B7mEN1oD.js +8 -0
  95. package/dist/{StaffSupportTicketParent-Bz-SH6-k.js → StaffSupportTicketParent-BvPwgOqH.js} +4 -4
  96. package/dist/{StaffSupportTicketParent-Bz-SH6-k.js.map → StaffSupportTicketParent-BvPwgOqH.js.map} +1 -1
  97. package/dist/StaffSupportTicketSuccess-Bt9FWXmM.js +12 -0
  98. package/dist/StaffSupportTicketSuccess-CUu2MNXF.js +54 -0
  99. package/dist/StaffSupportTicketSuccess-CUu2MNXF.js.map +1 -0
  100. package/dist/{SupportStaffPage-0X1VMovT.js → SupportStaffPage-B69-kuvg.js} +8 -7
  101. package/dist/{SupportStaffPage-0X1VMovT.js.map → SupportStaffPage-B69-kuvg.js.map} +1 -1
  102. package/dist/{SupportTicketDevLifecycleBadge-EMrQHfyG.js → SupportTicketDevLifecycleBadge-BoAjMb08.js} +1 -1
  103. package/dist/{SupportTicketDevLifecycleBadge-EMrQHfyG.js.map → SupportTicketDevLifecycleBadge-BoAjMb08.js.map} +1 -1
  104. package/dist/{SupportTicketMaintenancePage-CLDqc4Pb.js → SupportTicketMaintenancePage-Bptja-xb.js} +5 -4
  105. package/dist/{SupportTicketMaintenancePage-CLDqc4Pb.js.map → SupportTicketMaintenancePage-Bptja-xb.js.map} +1 -1
  106. package/dist/TeamAttachmentsTab-D4iYMMF3.js +63 -0
  107. package/dist/TeamHistoryTab-CRONdHcL.js +6 -0
  108. package/dist/{TeamHistoryTab-D0zW5wjj.js → TeamHistoryTab-DM8KBEG1.js} +7 -19
  109. package/dist/TeamHistoryTab-DM8KBEG1.js.map +1 -0
  110. package/dist/TeamList-BZN0Ek6v.js +141 -0
  111. package/dist/TeamList-BZN0Ek6v.js.map +1 -0
  112. package/dist/TeamList-DXtr4j1y.js +8 -0
  113. package/dist/TeamMemberList-JfyklWlt.js +7 -0
  114. package/dist/TeamMemberList-TTAPf2GN.js +166 -0
  115. package/dist/TeamMemberList-TTAPf2GN.js.map +1 -0
  116. package/dist/TeamMemberParent-a2xQB08R.js +10 -0
  117. package/dist/TeamMemberParent-xv56jEhd.js +83 -0
  118. package/dist/TeamMemberParent-xv56jEhd.js.map +1 -0
  119. package/dist/TeamMembersTab-BGcdyEE8.js +3 -0
  120. package/dist/{TeamMembersTab-4gmnP9sD.js → TeamMembersTab-BigqpBDH.js} +1 -1
  121. package/dist/{TeamMembersTab-4gmnP9sD.js.map → TeamMembersTab-BigqpBDH.js.map} +1 -1
  122. package/dist/{TeamNotesTab-DImzeVPk.js → TeamNotesTab-BgxleidZ.js} +6 -5
  123. package/dist/{TeamNotesTab-DImzeVPk.js.map → TeamNotesTab-BgxleidZ.js.map} +1 -1
  124. package/dist/TeamNotesTab-o7glfjoY.js +8 -0
  125. package/dist/TeamParent-7_XO4IOH.js +83 -0
  126. package/dist/TeamParent-7_XO4IOH.js.map +1 -0
  127. package/dist/TeamParent-Cf6RWFHo.js +11 -0
  128. package/dist/{TimelineNoteInput-Cpnwnx7B.js → TimelineNoteInput-D6LOdKZW.js} +3 -2
  129. package/dist/{TimelineNoteInput-Cpnwnx7B.js.map → TimelineNoteInput-D6LOdKZW.js.map} +1 -1
  130. package/dist/TimelineSystemEvent-zCMUx5Zz.js +525 -0
  131. package/dist/TimelineSystemEvent-zCMUx5Zz.js.map +1 -0
  132. package/dist/UserListPage-Bmwg0an5.js +5 -0
  133. package/dist/{UserListPage-DpkOdR1U.js → UserListPage-DtA8tLff.js} +4 -3
  134. package/dist/{UserListPage-DpkOdR1U.js.map → UserListPage-DtA8tLff.js.map} +1 -1
  135. package/dist/UserProfilePage-DRbCAr9H.js +8 -0
  136. package/dist/{UserProfilePage-CWRgwGQH.js → UserProfilePage-g4-VEDXo.js} +4 -4
  137. package/dist/{UserProfilePage-CWRgwGQH.js.map → UserProfilePage-g4-VEDXo.js.map} +1 -1
  138. package/dist/{VerifyEmail-DXZ4T5eN.js → VerifyEmail-CM5ehFB8.js} +7 -7
  139. package/dist/{VerifyEmail-DXZ4T5eN.js.map → VerifyEmail-CM5ehFB8.js.map} +1 -1
  140. package/dist/VerifyEmail-DMHczC9f.js +10 -0
  141. package/dist/ViewTeam-CbV0w4J_.js +220 -0
  142. package/dist/ViewTeam-CbV0w4J_.js.map +1 -0
  143. package/dist/ViewTeam-LAQmZPzc.js +8 -0
  144. package/dist/ViewTeamMember-DtWqc_q5.js +7 -0
  145. package/dist/ViewTeamMember-y3txJoRR.js +167 -0
  146. package/dist/ViewTeamMember-y3txJoRR.js.map +1 -0
  147. package/dist/ZiniaContainer-CjVhCnGB.js +18 -0
  148. package/dist/ZiniaContainer-CjVhCnGB.js.map +1 -0
  149. package/dist/{convertToLocalDateTime-CFhtN6PI.js → convertToLocalDateTime-BF25N4xd.js} +1 -2
  150. package/dist/convertToLocalDateTime-BF25N4xd.js.map +1 -0
  151. package/dist/customerSupportTicketRoutes-DYG3Vlzz.js +142 -0
  152. package/dist/customerSupportTicketRoutes-DYG3Vlzz.js.map +1 -0
  153. package/dist/{displayIdFormatter-Dz900Awr.js → displayIdFormatter-B-_WQHOr.js} +1 -1
  154. package/dist/{displayIdFormatter-Dz900Awr.js.map → displayIdFormatter-B-_WQHOr.js.map} +1 -1
  155. package/dist/{extractRpcErrorMessage-Di8E8-Wh.js → extractRpcErrorMessage-diUBl6Ij.js} +1 -1
  156. package/dist/{extractRpcErrorMessage-Di8E8-Wh.js.map → extractRpcErrorMessage-diUBl6Ij.js.map} +1 -1
  157. package/dist/index.d.ts +859 -900
  158. package/dist/index.js +66 -38
  159. package/dist/{mfaSchema-BnRWf0ma.js → mfaSchema-Ukqzdyck.js} +1 -1
  160. package/dist/{mfaSchema-BnRWf0ma.js.map → mfaSchema-Ukqzdyck.js.map} +1 -1
  161. package/dist/saved_filter-fHzm4pk5.js +1210 -0
  162. package/dist/saved_filter-fHzm4pk5.js.map +1 -0
  163. package/dist/signupConsentStorage-DS9vCUuC.js +27 -0
  164. package/dist/signupConsentStorage-DS9vCUuC.js.map +1 -0
  165. package/dist/{src-CEBiyg_f.css → src-C6ZmNSSU.css} +1 -1
  166. package/dist/{src-CEBiyg_f.css.map → src-C6ZmNSSU.css.map} +1 -1
  167. package/dist/src-DgC3Izwe.js +4655 -0
  168. package/dist/src-DgC3Izwe.js.map +1 -0
  169. package/dist/staffSupportTicketRoutes-Crk6BFEE.js +135 -0
  170. package/dist/staffSupportTicketRoutes-Crk6BFEE.js.map +1 -0
  171. package/dist/teamMemberMetadata-CQnbVepq.js +49 -0
  172. package/dist/teamMemberMetadata-CQnbVepq.js.map +1 -0
  173. package/dist/teamMetadata-DlvwO5V0.js +53 -0
  174. package/dist/teamMetadata-DlvwO5V0.js.map +1 -0
  175. package/dist/teamRoutes-_-DGwLZW.js +192 -0
  176. package/dist/teamRoutes-_-DGwLZW.js.map +1 -0
  177. package/dist/team_memberRoutes-B7Zzuuz8.js +84 -0
  178. package/dist/team_memberRoutes-B7Zzuuz8.js.map +1 -0
  179. package/dist/{useBreadcrumbs-qB6ghsAf.js → useBreadcrumbs-DIqU5AAp.js} +1 -1
  180. package/dist/{useBreadcrumbs-qB6ghsAf.js.map → useBreadcrumbs-DIqU5AAp.js.map} +1 -1
  181. package/dist/{useEmailVerificationChannel-BiiuuTUM.js → useEmailVerificationChannel-B51z65PN.js} +3 -3
  182. package/dist/{useEmailVerificationChannel-BiiuuTUM.js.map → useEmailVerificationChannel-B51z65PN.js.map} +1 -1
  183. package/dist/{useMutation-BMZJLpgx.js → useMutation-BLNuJoYl.js} +6 -3
  184. package/dist/useMutation-BLNuJoYl.js.map +1 -0
  185. package/dist/{useQuery-qpXzBuVg.js → useQuery-BzUGEOj0.js} +4 -3
  186. package/dist/{useQuery-qpXzBuVg.js.map → useQuery-BzUGEOj0.js.map} +1 -1
  187. package/dist/{useQueryCache-DkRwK5Gz.js → useQueryCache-alzaRWEb.js} +2 -2
  188. package/dist/{useQueryCache-DkRwK5Gz.js.map → useQueryCache-alzaRWEb.js.map} +1 -1
  189. package/dist/{useReturnUrl-qFeazn-G.js → useReturnUrl-B5V3SJf5.js} +1 -1
  190. package/dist/{useReturnUrl-qFeazn-G.js.map → useReturnUrl-B5V3SJf5.js.map} +1 -1
  191. package/dist/{useRpcAuth-x5Gn5gR0.js → useRpcAuth-CJtq1dqM.js} +9 -192
  192. package/dist/useRpcAuth-CJtq1dqM.js.map +1 -0
  193. package/dist/userAuthorized-C09FHWGL.js +185 -0
  194. package/dist/userAuthorized-C09FHWGL.js.map +1 -0
  195. package/package.json +3 -3
  196. package/dist/Appearance-D5pwxuf4.js +0 -3
  197. package/dist/ChangePasswordPage-DVBkBcm9.js +0 -6
  198. package/dist/ConsentRequired-e7DEOGNg.js +0 -213
  199. package/dist/ConsentRequired-e7DEOGNg.js.map +0 -1
  200. package/dist/CreateTeamForm-CV9Y00tD.js +0 -35
  201. package/dist/CreateTeamMemberForm-BX1vUcdg.js +0 -35
  202. package/dist/CreateUserPage-DQoEX-Er.js +0 -6
  203. package/dist/CreditBalanceDashboard-BZAnEjSz.js +0 -35
  204. package/dist/CreditManagement-C4-_c175.js +0 -35
  205. package/dist/CustomerCreateSupportTicketForm-3tIJKMnJ.js +0 -35
  206. package/dist/CustomerSupportTicketList-CFQEoXtm.js +0 -35
  207. package/dist/CustomerSupportTicketParent-Tnov1dEg.js +0 -7
  208. package/dist/CustomerSupportTicketSuccess-DLszUCsg.js +0 -35
  209. package/dist/EditTeamForm-Ww04P2M0.js +0 -35
  210. package/dist/EditTeamMemberForm-BgjNP8MZ.js.map +0 -1
  211. package/dist/EditTeamMemberForm-COfY-2FQ.js +0 -6
  212. package/dist/EditUserPage-BJHs3raG.js +0 -7
  213. package/dist/ForgotPassword-CzMPARbz.js +0 -7
  214. package/dist/LoginForm-DdzRn8nU.js +0 -7
  215. package/dist/Logout-3_Ns09Vy.js +0 -7
  216. package/dist/MfaSetup-BE_NP70B.js +0 -8
  217. package/dist/MfaVerify-CyiJ9A3L.js +0 -8
  218. package/dist/ResetPassword-DXHunZVp.js +0 -7
  219. package/dist/Signup-Cy1puoqh.js +0 -9
  220. package/dist/Signup-DfG7Xmkx.js.map +0 -1
  221. package/dist/SignupConsentFlow-YGWhF7tj.js +0 -269
  222. package/dist/SignupConsentFlow-YGWhF7tj.js.map +0 -1
  223. package/dist/StaffCreateSupportTicketForm-C5tRPz95.js +0 -35
  224. package/dist/StaffSupportTicketDetailPage-ePkLJU12.js.map +0 -1
  225. package/dist/StaffSupportTicketList-BbiPTm54.js +0 -35
  226. package/dist/StaffSupportTicketParent-D2onnMqe.js +0 -7
  227. package/dist/StaffSupportTicketSuccess-DLVRTvr1.js +0 -35
  228. package/dist/TeamAttachmentsTab-B-xXmvOy.js +0 -35
  229. package/dist/TeamHistoryTab-Bb7mq4Dc.js +0 -4
  230. package/dist/TeamHistoryTab-D0zW5wjj.js.map +0 -1
  231. package/dist/TeamList-B-cFoclM.js +0 -35
  232. package/dist/TeamMemberList-D3GNHlXH.js +0 -35
  233. package/dist/TeamMemberParent-BKfPMX05.js +0 -35
  234. package/dist/TeamMembersTab-CBB2Yl_I.js +0 -3
  235. package/dist/TeamNotesTab-BbODx7wS.js +0 -7
  236. package/dist/TeamParent-5lokhztw.js +0 -35
  237. package/dist/TimelineSystemEvent-BGG9WkQw.js.map +0 -1
  238. package/dist/UserListPage-4hZll_PC.js +0 -4
  239. package/dist/UserProfilePage-qFrg3PiC.js +0 -7
  240. package/dist/VerifyEmail-C5EO8OFo.js +0 -9
  241. package/dist/ViewTeam-Die0SWa_.js +0 -35
  242. package/dist/ViewTeamMember-_sqrqGit.js +0 -35
  243. package/dist/convertToLocalDateTime-CFhtN6PI.js.map +0 -1
  244. package/dist/src-_IeDZXH6.js +0 -8951
  245. package/dist/src-_IeDZXH6.js.map +0 -1
  246. package/dist/useMutation-BMZJLpgx.js.map +0 -1
  247. package/dist/useRpcAuth-x5Gn5gR0.js.map +0 -1
  248. package/dist/useSignupPendingData-BWHwUHhL.js +0 -47
  249. package/dist/useSignupPendingData-BWHwUHhL.js.map +0 -1
@@ -1,14 +1,14 @@
1
- import { l as useUserSessionStore, m as useEnv } from "./useRpcAuth-x5Gn5gR0.js";
2
- import { t as useMutation } from "./useMutation-BMZJLpgx.js";
3
- import { t as AppLink_default } from "./AppLink-CHMMrSFI.js";
4
- import { i as setEmailVerificationReturnUrl, o as withReturnUrl, r as getValidReturnUrl } from "./useReturnUrl-qFeazn-G.js";
5
- import { n as SIGNUP_REQUIREMENTS_KEY, t as useSignupPendingData } from "./useSignupPendingData-BWHwUHhL.js";
6
- import { t as useEmailVerificationChannel } from "./useEmailVerificationChannel-BiiuuTUM.js";
1
+ import { d as useEnv, o as useUserSessionStore } from "./useRpcAuth-CJtq1dqM.js";
2
+ import { t as useMutation } from "./useMutation-BLNuJoYl.js";
3
+ import { t as AppLink_default } from "./AppLink-FcNGKgvG.js";
4
+ import { o as withReturnUrl, r as getValidReturnUrl } from "./useReturnUrl-B5V3SJf5.js";
5
+ import { r as setSignupConsentFlowData } from "./signupConsentStorage-DS9vCUuC.js";
6
+ import { t as useEmailVerificationChannel } from "./useEmailVerificationChannel-B51z65PN.js";
7
7
  import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, inject, openBlock, ref, renderList, toDisplayString, unref, withCtx } from "vue";
8
8
  import { jwtDecode } from "jwt-decode";
9
9
  import { useRoute, useRouter } from "vue-router";
10
10
  import { toast } from "vue3-toastify";
11
- import { signupSchema } from "@dragonmastery/dragoncore-shared";
11
+ import { signupInitiateSchema } from "@dragonmastery/dragoncore-shared";
12
12
  import { useForm, withMetadata } from "@dragonmastery/zinia-forms-core";
13
13
 
14
14
  //#region src/slices/auth/utils/isEmailVerificationRequiredError.ts
@@ -25,7 +25,7 @@ function isEmailVerificationRequiredError(error) {
25
25
 
26
26
  //#endregion
27
27
  //#region src/slices/auth/features/signup/signupSchema.ts
28
- const signupSchemaWithMetadata = withMetadata(signupSchema, "signupSchema", {
28
+ const signupSchemaWithMetadata = withMetadata(signupInitiateSchema, "signupInitiateSchema", {
29
29
  email: {
30
30
  inputType: "email",
31
31
  placeholder: "you@example.com",
@@ -66,9 +66,12 @@ const _hoisted_5 = {
66
66
  key: 0,
67
67
  class: "mb-6 p-4 rounded-lg bg-base-100 border border-base-300"
68
68
  };
69
- const _hoisted_6 = { class: "list-disc list-inside space-y-1 text-sm text-base-content/80" };
70
- const _hoisted_7 = ["href"];
71
- const _hoisted_8 = { key: 1 };
69
+ const _hoisted_6 = { class: "font-medium mb-2" };
70
+ const _hoisted_7 = { class: "list-disc list-inside space-y-1 text-sm text-base-content/80" };
71
+ const _hoisted_8 = {
72
+ key: 0,
73
+ class: "mt-2 text-sm text-base-content/70"
74
+ };
72
75
  const _hoisted_9 = { class: "text-center mt-2" };
73
76
  const _sfc_main = /* @__PURE__ */ defineComponent({
74
77
  __name: "Signup",
@@ -86,47 +89,44 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
86
89
  const returnUrl = computed(() => route.query.returnUrl);
87
90
  const loginLink = computed(() => withReturnUrl("/auth/login", returnUrl.value));
88
91
  const awaitingVerification = ref(false);
89
- const signupRequirements = inject(SIGNUP_REQUIREMENTS_KEY, () => [], true);
90
- const { set: setSignupPendingData } = useSignupPendingData();
92
+ const signupConsentBeforeText = inject("signupConsentBeforeText", "By signing up you agree to these terms:");
93
+ const signupConsentAfterText = inject("signupConsentAfterText", "After you click Sign Up, we'll show you each document to review and accept.");
94
+ const legalLinks = computed(() => {
95
+ return router.getRoutes().filter((r) => r.meta?.legal === true).map((r) => {
96
+ return {
97
+ path: router.resolve({ name: r.name }).path,
98
+ label: r.meta?.title ?? r.name ?? r.path
99
+ };
100
+ }).sort((a, b) => a.path.localeCompare(b.path));
101
+ });
102
+ const showConsentSection = computed(() => legalLinks.value.length > 0);
91
103
  const declinedMessage = computed(() => {
92
104
  const declined = route.query.declined;
93
105
  if (declined === "1" || declined === "true") return "You declined the consent. Your account was not created.";
94
106
  return null;
95
107
  });
96
- const { mutate: signupMutate } = useMutation((api, input) => api.users.signupUser(input), { skipAuthCheck: true });
97
- const { mutate: loginMutate } = useMutation((api, input) => api.userSessions.login(input), { credentials: "include" });
108
+ const { mutate: signupInitiateMutate } = useMutation((api, input) => api.users.signupInitiate(input), {
109
+ skipAuthCheck: true,
110
+ credentials: "include"
111
+ });
98
112
  const handleSubmit = async (data) => {
99
- if ((signupRequirements ?? []).length > 0) {
100
- setSignupPendingData(data);
101
- const consentPath = withReturnUrl("/auth/signup-consents", returnUrl.value);
102
- await router.push(consentPath);
103
- return REDIRECTED_TO_CONSENTS;
104
- }
105
- if (!await signupMutate(data)) throw new Error("Signup failed");
106
- try {
107
- const loginResult = await loginMutate({
108
- email: data.email,
109
- password: data.passwords.password
110
- });
111
- if (!loginResult?.access_token || !loginResult?.user_details_token) throw new Error("Failed to login after signup");
113
+ const result = await signupInitiateMutate(data);
114
+ if (!result) throw new Error("Signup failed");
115
+ if (result.created) {
116
+ if (!result.session?.access_token || !result.session?.user_details_token) throw new Error("Failed to get session after signup");
112
117
  return {
113
- access_token: loginResult.access_token,
114
- user_details_token: loginResult.user_details_token
118
+ access_token: result.session.access_token,
119
+ user_details_token: result.session.user_details_token
115
120
  };
116
- } catch (loginError) {
117
- if (isEmailVerificationRequiredError(loginError)) {
118
- form.reset();
119
- if (emailVerificationMode === "strict") {
120
- awaitingVerification.value = true;
121
- setEmailVerificationReturnUrl(getValidReturnUrl(route, "/"));
122
- throw loginError;
123
- }
124
- const verifyPath = withReturnUrl("/auth/verify-email", returnUrl.value);
125
- await router.push(verifyPath);
126
- throw loginError;
127
- }
128
- throw loginError;
129
121
  }
122
+ setSignupConsentFlowData({
123
+ token: result.signup_consent_token,
124
+ consents: result.consents
125
+ });
126
+ const basePath = withReturnUrl("/auth/signup-consents", returnUrl.value);
127
+ const sep = basePath.includes("?") ? "&" : "?";
128
+ await router.push(`${basePath}${sep}token=${encodeURIComponent(result.signup_consent_token)}`);
129
+ return REDIRECTED_TO_CONSENTS;
130
130
  };
131
131
  const handleSuccess = async (data) => {
132
132
  if (data === REDIRECTED_TO_CONSENTS) return;
@@ -154,7 +154,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
154
154
  useEmailVerificationChannel(awaitingVerification, (targetUrl) => router.push(targetUrl), () => getValidReturnUrl(route, "/"));
155
155
  return (_ctx, _cache) => {
156
156
  return openBlock(), createElementBlock("div", _hoisted_1, [
157
- _cache[5] || (_cache[5] = createElementVNode("h1", { class: "text-2xl font-bold mb-6 text-center" }, "Sign Up", -1)),
157
+ _cache[3] || (_cache[3] = createElementVNode("h1", { class: "text-2xl font-bold mb-6 text-center" }, "Sign Up", -1)),
158
158
  awaitingVerification.value ? (openBlock(), createElementBlock("div", _hoisted_2, [..._cache[0] || (_cache[0] = [createElementVNode("p", { class: "text-base-content/80" }, " We sent a verification link to your email address. Click the link to verify your account, then you can continue. ", -1), createElementVNode("p", { class: "text-sm text-base-content/60" }, " If you opened the link in another tab, we'll redirect you automatically when verification completes. ", -1)])])) : declinedMessage.value ? (openBlock(), createElementBlock("div", _hoisted_3, [createElementVNode("div", _hoisted_4, [createElementVNode("span", null, toDisplayString(declinedMessage.value), 1)])])) : createCommentVNode("v-if", true),
159
159
  !awaitingVerification.value ? (openBlock(), createBlock(unref(ZiniaForm), {
160
160
  key: 2,
@@ -166,28 +166,28 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
166
166
  createVNode(unref(zinia).EmailField),
167
167
  createVNode(unref(zinia).PasswordsPasswordField),
168
168
  createVNode(unref(zinia).PasswordsPasswordConfirmField),
169
- (unref(signupRequirements) ?? []).length > 0 ? (openBlock(), createElementBlock("div", _hoisted_5, [
170
- _cache[1] || (_cache[1] = createElementVNode("p", { class: "font-medium mb-2" }, "Before signing up, you'll need to accept:", -1)),
171
- createElementVNode("ul", _hoisted_6, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(signupRequirements) ?? [], (config) => {
172
- return openBlock(), createElementBlock("li", { key: config.type }, [config.url ? (openBlock(), createElementBlock("a", {
173
- key: 0,
174
- href: config.url,
175
- target: "_blank",
176
- rel: "noopener noreferrer",
169
+ showConsentSection.value ? (openBlock(), createElementBlock("div", _hoisted_5, [
170
+ createElementVNode("p", _hoisted_6, toDisplayString(unref(signupConsentBeforeText)), 1),
171
+ createElementVNode("ul", _hoisted_7, [(openBlock(true), createElementBlock(Fragment, null, renderList(legalLinks.value, (link) => {
172
+ return openBlock(), createElementBlock("li", { key: link.path }, [createVNode(AppLink_default, {
173
+ to: link.path,
177
174
  class: "link link-accent"
178
- }, toDisplayString(config.label), 9, _hoisted_7)) : (openBlock(), createElementBlock("span", _hoisted_8, toDisplayString(config.label), 1))]);
175
+ }, {
176
+ default: withCtx(() => [createTextVNode(toDisplayString(link.label), 1)]),
177
+ _: 2
178
+ }, 1032, ["to"])]);
179
179
  }), 128))]),
180
- _cache[2] || (_cache[2] = createElementVNode("p", { class: "mt-2 text-sm text-base-content/70" }, " After you click Sign Up, we'll show you each document to review and accept. ", -1))
180
+ unref(signupConsentAfterText) ? (openBlock(), createElementBlock("p", _hoisted_8, toDisplayString(unref(signupConsentAfterText)), 1)) : createCommentVNode("v-if", true)
181
181
  ])) : createCommentVNode("v-if", true),
182
182
  createVNode(unref(ZiniaSubmitButton), {
183
183
  submitText: "Sign Up",
184
184
  submittingText: "Signing up..."
185
185
  }),
186
- createElementVNode("div", _hoisted_9, [createElementVNode("p", null, [_cache[4] || (_cache[4] = createTextVNode(" Already have an account? ", -1)), createVNode(AppLink_default, {
186
+ createElementVNode("div", _hoisted_9, [createElementVNode("p", null, [_cache[2] || (_cache[2] = createTextVNode(" Already have an account? ", -1)), createVNode(AppLink_default, {
187
187
  class: "link-accent link",
188
188
  to: loginLink.value
189
189
  }, {
190
- default: withCtx(() => [..._cache[3] || (_cache[3] = [createTextVNode("Login", -1)])]),
190
+ default: withCtx(() => [..._cache[1] || (_cache[1] = [createTextVNode("Login", -1)])]),
191
191
  _: 1
192
192
  }, 8, ["to"])])])
193
193
  ]),
@@ -201,4 +201,4 @@ var Signup_default = _sfc_main;
201
201
 
202
202
  //#endregion
203
203
  export { signupSchemaWithMetadata as n, Signup_default as t };
204
- //# sourceMappingURL=Signup-DfG7Xmkx.js.map
204
+ //# sourceMappingURL=Signup-2pqvJiVt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Signup-2pqvJiVt.js","names":[],"sources":["../src/slices/auth/utils/isEmailVerificationRequiredError.ts","../src/slices/auth/features/signup/signupSchema.ts","../src/slices/auth/features/signup/Signup.vue"],"sourcesContent":["/**\n * Detects if an error indicates that email verification is required before login.\n * Used in signup flow when auto-login after signup fails due to unverified email.\n */\nexport function isEmailVerificationRequiredError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n const e = error as {\n error_type?: string;\n error_name?: string;\n name?: string;\n message?: string;\n };\n if (\n e.error_type === 'EmailVerificationRequiredError' ||\n e.error_name === 'EmailVerificationRequiredError' ||\n e.name === 'EmailVerificationRequiredError'\n ) {\n return true;\n }\n const msg = typeof e.message === 'string' ? e.message : '';\n return msg.includes('Please verify your email before logging in');\n}\n","import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { signupInitiateSchema } from '@dragonmastery/dragoncore-shared';\nimport { z } from 'zod';\n\n// Define the signup form type (signupInitiate: email + passwords only)\nexport type SignupForm = z.infer<typeof signupInitiateSchema>;\n\n// Enhance the schema with metadata\nexport const signupSchemaWithMetadata = withMetadata(signupInitiateSchema, 'signupInitiateSchema', {\n email: {\n inputType: 'email',\n placeholder: 'you@example.com',\n helpText: 'Enter the email address you used to register',\n autocomplete: 'email',\n className: 'login-field',\n autofocus: true,\n },\n 'passwords.password': {\n inputType: 'password',\n placeholder: '••••••••',\n helpText: 'Must be at least 8 characters',\n autocomplete: 'current-password',\n className: 'login-field',\n },\n 'passwords.password_confirm': {\n inputType: 'password',\n placeholder: '••••••••',\n helpText: 'Must be at least 8 characters',\n autocomplete: 'current-password',\n className: 'login-field',\n },\n});\n","<template>\n <div class=\"max-w-md mx-auto bg-base-200 p-6 rounded-xl shadow-md container\">\n <h1 class=\"text-2xl font-bold mb-6 text-center\">Sign Up</h1>\n\n <div\n v-if=\"awaitingVerification\"\n class=\"space-y-4 text-center\"\n >\n <p class=\"text-base-content/80\">\n We sent a verification link to your email address. Click the link to verify your account,\n then you can continue.\n </p>\n <p class=\"text-sm text-base-content/60\">\n If you opened the link in another tab, we'll redirect you automatically when verification\n completes.\n </p>\n </div>\n\n <div v-else-if=\"declinedMessage\" class=\"mb-4\">\n <div class=\"alert alert-warning\">\n <span>{{ declinedMessage }}</span>\n </div>\n </div>\n\n <ZiniaForm\n v-if=\"!awaitingVerification\"\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n >\n <zinia.EmailField />\n <zinia.PasswordsPasswordField />\n <zinia.PasswordsPasswordConfirmField />\n\n <div\n v-if=\"showConsentSection\"\n class=\"mb-6 p-4 rounded-lg bg-base-100 border border-base-300\"\n >\n <p class=\"font-medium mb-2\">{{ signupConsentBeforeText }}</p>\n <ul class=\"list-disc list-inside space-y-1 text-sm text-base-content/80\">\n <li\n v-for=\"link in legalLinks\"\n :key=\"link.path\"\n >\n <AppLink\n :to=\"link.path\"\n class=\"link link-accent\"\n >\n {{ link.label }}\n </AppLink>\n </li>\n </ul>\n <p\n v-if=\"signupConsentAfterText\"\n class=\"mt-2 text-sm text-base-content/70\"\n >\n {{ signupConsentAfterText }}\n </p>\n </div>\n\n <ZiniaSubmitButton submitText=\"Sign Up\" submittingText=\"Signing up...\" />\n\n <div class=\"text-center mt-2\">\n <p>\n Already have an account?\n <AppLink class=\"link-accent link\" :to=\"loginLink\">Login</AppLink>\n </p>\n </div>\n </ZiniaForm>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type {\n SignupInitiateInputDto,\n SignupInitiateResponseDto,\n} from '@dragonmastery/dragoncore-shared';\nimport type { UserDetailsTokenPayload } from '../../../../lib/models/userSession';\nimport AppLink from '../../../../components/AppLink.vue';\nimport { setSignupConsentFlowData } from '../../signupConsentStorage';\nimport { useEnv } from '../../../../composables/useEnv';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useUserSessionStore } from '../../../../composables/useUserSessionStore';\nimport { getValidReturnUrl, withReturnUrl } from '../../../../utils/useReturnUrl';\nimport { useEmailVerificationChannel } from '../../useEmailVerificationChannel';\nimport { isEmailVerificationRequiredError } from '../../utils/isEmailVerificationRequiredError';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { jwtDecode } from 'jwt-decode';\nimport { computed, inject, ref } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport { signupSchemaWithMetadata } from './signupSchema';\n\nconst REDIRECTED_TO_CONSENTS = Symbol('redirected-to-consents');\n\n// Create a type-safe form using our schema with metadata\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton } = useForm(signupSchemaWithMetadata, {\n storeName: 'signup-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n});\n\nconst sessionStore = useUserSessionStore();\nconst route = useRoute();\nconst router = useRouter();\nconst { emailVerificationMode } = useEnv();\n\nconst returnUrl = computed(() => route.query.returnUrl as string | undefined);\nconst loginLink = computed(() => withReturnUrl('/auth/login', returnUrl.value));\nconst awaitingVerification = ref(false);\n\nconst signupConsentBeforeText = inject<string>(\n 'signupConsentBeforeText',\n 'By signing up you agree to these terms:',\n);\nconst signupConsentAfterText = inject<string>(\n 'signupConsentAfterText',\n \"After you click Sign Up, we'll show you each document to review and accept.\",\n);\n\n// Legal routes - auto-collected from router (meta.legal: true) for the consent preview\nconst legalLinks = computed(() => {\n const routes = router.getRoutes();\n return routes\n .filter((r) => r.meta?.legal === true)\n .map((r) => {\n const resolved = router.resolve({ name: r.name as string });\n return {\n path: resolved.path,\n label: (r.meta?.title as string) ?? (r.name as string) ?? r.path,\n };\n })\n .sort((a, b) => a.path.localeCompare(b.path));\n});\n\nconst showConsentSection = computed(() => legalLinks.value.length > 0);\n\n// Show declined message when returning from consent flow\nconst declinedMessage = computed(() => {\n const declined = route.query.declined;\n if (declined === '1' || declined === 'true') {\n return 'You declined the consent. Your account was not created.';\n }\n return null;\n});\n\nconst { mutate: signupInitiateMutate } = useMutation<\n import('@dragonmastery/dragoncore-shared').DragoncoreApi,\n SignupInitiateInputDto,\n SignupInitiateResponseDto\n>(\n (api, input: SignupInitiateInputDto) => api.users.signupInitiate(input),\n { skipAuthCheck: true, credentials: 'include' },\n);\n\n// Handle form submission\nconst handleSubmit = async (data: SignupInitiateInputDto) => {\n const result = await signupInitiateMutate(data);\n if (!result) throw new Error('Signup failed');\n\n if (result.created) {\n if (!result.session?.access_token || !result.session?.user_details_token) {\n throw new Error('Failed to get session after signup');\n }\n return {\n access_token: result.session.access_token,\n user_details_token: result.session.user_details_token,\n };\n }\n\n setSignupConsentFlowData({\n token: result.signup_consent_token,\n consents: result.consents,\n });\n const basePath = withReturnUrl('/auth/signup-consents', returnUrl.value);\n const sep = basePath.includes('?') ? '&' : '?';\n await router.push(`${basePath}${sep}token=${encodeURIComponent(result.signup_consent_token)}`);\n return REDIRECTED_TO_CONSENTS;\n};\n\n// Handle success (not called when we redirect to consent flow)\nconst handleSuccess = async (data: { access_token: string; user_details_token: string } | symbol) => {\n if (data === REDIRECTED_TO_CONSENTS) return;\n\n const payload = data as { access_token: string; user_details_token: string };\n sessionStore.setSession(payload.user_details_token);\n sessionStore.setAccessToken(payload.access_token);\n\n form.reset();\n\n const defaultRedirect = getValidReturnUrl(route, '/');\n const redirectTo =\n emailVerificationMode !== 'disabled'\n ? (() => {\n try {\n const tokenPayload = jwtDecode<UserDetailsTokenPayload>(payload.user_details_token);\n const emailVerified = tokenPayload.details?.user?.email_verified ?? true;\n return emailVerified ? defaultRedirect : withReturnUrl('/auth/verify-email', returnUrl.value);\n } catch {\n return defaultRedirect;\n }\n })()\n : defaultRedirect;\n\n await router.push(redirectTo);\n const wentToVerify = typeof redirectTo === 'string' && redirectTo.startsWith('/auth/verify-email');\n toast.success(\n !wentToVerify\n ? 'Registration successful! You are now logged in.'\n : 'Registration successful! Please check your email to verify your account.',\n );\n};\n\n// Handle error\nconst handleError = (error: unknown) => {\n if (isEmailVerificationRequiredError(error)) {\n return;\n }\n const message = error instanceof Error ? error.message : 'Registration failed';\n toast.error(message);\n};\n\nuseEmailVerificationChannel(\n awaitingVerification,\n (targetUrl) => router.push(targetUrl),\n () => getValidReturnUrl(route, '/'),\n);\n</script>\n"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import "./useRpcAuth-CJtq1dqM.js";
2
+ import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
+ import "./useQueryCache-alzaRWEb.js";
4
+ import "./useMutation-BLNuJoYl.js";
5
+ import "./AppLink-FcNGKgvG.js";
6
+ import "./useEmailVerificationChannel-B51z65PN.js";
7
+ import { t as Signup_default } from "./Signup-2pqvJiVt.js";
8
+
9
+ export { Signup_default as default };
@@ -0,0 +1,214 @@
1
+ import { d as useEnv, o as useUserSessionStore } from "./useRpcAuth-CJtq1dqM.js";
2
+ import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
+ import "./useQueryCache-alzaRWEb.js";
4
+ import { t as useMutation } from "./useMutation-BLNuJoYl.js";
5
+ import { t as AppLink_default } from "./AppLink-FcNGKgvG.js";
6
+ import { i as setEmailVerificationReturnUrl, o as withReturnUrl, r as getValidReturnUrl } from "./useReturnUrl-B5V3SJf5.js";
7
+ import { n as getSignupConsentFlowData, t as clearSignupConsentFlowData } from "./signupConsentStorage-DS9vCUuC.js";
8
+ import { t as ConsentFlowStep_default } from "./ConsentFlowStep-DbQpQQA-.js";
9
+ import { computed, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, nextTick, openBlock, ref, toDisplayString, withCtx } from "vue";
10
+ import { useRoute, useRouter } from "vue-router";
11
+ import { toast } from "vue3-toastify";
12
+
13
+ //#region src/slices/auth/features/signup_consents/SignupConsentFlow.vue
14
+ const _hoisted_1 = { class: "w-full max-w-md mx-auto mb-8 sm:mb-10 bg-base-200 px-3 py-4 sm:px-6 sm:py-6 rounded-xl shadow-md container min-w-0" };
15
+ const _hoisted_2 = {
16
+ key: 0,
17
+ class: "text-center"
18
+ };
19
+ const _hoisted_3 = {
20
+ key: 1,
21
+ class: "text-center"
22
+ };
23
+ const _hoisted_4 = {
24
+ key: 2,
25
+ class: "space-y-6"
26
+ };
27
+ const _hoisted_5 = ["disabled"];
28
+ const _sfc_main = /* @__PURE__ */ defineComponent({
29
+ __name: "SignupConsentFlow",
30
+ setup(__props) {
31
+ const sessionStore = useUserSessionStore();
32
+ const router = useRouter();
33
+ const route = useRoute();
34
+ const { emailVerificationMode } = useEnv();
35
+ const returnUrl = computed(() => route.query.returnUrl);
36
+ const signupLink = computed(() => withReturnUrl("/auth/signup", returnUrl.value));
37
+ const token = computed(() => route.query.token ?? "");
38
+ const storedData = ref(null);
39
+ const loading = ref(true);
40
+ const consents = computed(() => {
41
+ const t = token.value;
42
+ const data = storedData.value;
43
+ if (!t || !data || data.token !== t) return [];
44
+ return data.consents;
45
+ });
46
+ const { mutate: fetchConsentsForToken } = useMutation((api, _t) => api.users.getSignupConsentsForToken(), {
47
+ skipAuthCheck: true,
48
+ credentials: "include",
49
+ customAuthToken: (t) => t
50
+ });
51
+ async function loadConsents() {
52
+ loading.value = true;
53
+ const t = token.value;
54
+ if (!t) {
55
+ loading.value = false;
56
+ return;
57
+ }
58
+ const data = getSignupConsentFlowData();
59
+ if (data && data.token === t) {
60
+ storedData.value = data;
61
+ loading.value = false;
62
+ return;
63
+ }
64
+ try {
65
+ const reqs = await fetchConsentsForToken(t);
66
+ if (reqs && Array.isArray(reqs) && reqs.length > 0) storedData.value = {
67
+ token: t,
68
+ consents: reqs
69
+ };
70
+ } catch {}
71
+ loading.value = false;
72
+ }
73
+ loadConsents();
74
+ const currentStep = ref(1);
75
+ const totalSteps = computed(() => consents.value.length);
76
+ const currentConfig = computed(() => consents.value[currentStep.value - 1] ?? null);
77
+ const declining = ref(false);
78
+ const goingBack = ref(false);
79
+ const submitting = ref(false);
80
+ const submitError = ref(null);
81
+ function getErrorMessage(error) {
82
+ if (error instanceof Error && error.message) return error.message;
83
+ if (error && typeof error === "object" && "message" in error && typeof error.message === "string") return error.message;
84
+ return "Registration failed. Please try again.";
85
+ }
86
+ const { mutate: signupCompleteMutate } = useMutation((api, input) => api.users.signupComplete({ acceptances: input.acceptances }), {
87
+ skipAuthCheck: true,
88
+ credentials: "include",
89
+ customAuthToken: (input) => input.token
90
+ });
91
+ async function handleAccept() {
92
+ if (!currentConfig.value || !token.value || !consents.value.length) return;
93
+ submitError.value = null;
94
+ const acceptancesSoFar = {};
95
+ for (let i = 0; i < currentStep.value; i++) {
96
+ const c = consents.value[i];
97
+ if (c) acceptancesSoFar[c.type] = true;
98
+ }
99
+ if (currentStep.value >= totalSteps.value) {
100
+ submitting.value = true;
101
+ try {
102
+ await completeSignup(acceptancesSoFar);
103
+ } catch (err) {
104
+ submitError.value = getErrorMessage(err);
105
+ } finally {
106
+ submitting.value = false;
107
+ }
108
+ return;
109
+ }
110
+ currentStep.value++;
111
+ nextTick();
112
+ }
113
+ async function completeSignup(acceptances) {
114
+ const t = token.value;
115
+ if (!t) return;
116
+ const session = await signupCompleteMutate({
117
+ token: t,
118
+ acceptances
119
+ });
120
+ if (!session?.access_token || !session?.user_details_token) throw new Error("Signup failed");
121
+ clearSignupConsentFlowData();
122
+ sessionStore.setSession(session.user_details_token);
123
+ sessionStore.setAccessToken(session.access_token);
124
+ if (emailVerificationMode !== "disabled") {
125
+ if (emailVerificationMode === "strict") setEmailVerificationReturnUrl(getValidReturnUrl(route, "/"));
126
+ window.scrollTo(0, 0);
127
+ const verifyPath = withReturnUrl("/auth/verify-email", returnUrl.value);
128
+ await router.push(verifyPath);
129
+ return;
130
+ }
131
+ window.scrollTo(0, 0);
132
+ const defaultRedirect = getValidReturnUrl(route, "/");
133
+ await router.push(defaultRedirect);
134
+ toast.success("Registration successful! You are now logged in.");
135
+ }
136
+ async function handleDecline() {
137
+ declining.value = true;
138
+ try {
139
+ clearSignupConsentFlowData();
140
+ const signupPath = withReturnUrl("/auth/signup", returnUrl.value);
141
+ await router.push({
142
+ path: signupPath,
143
+ query: {
144
+ ...route.query,
145
+ declined: "1"
146
+ }
147
+ });
148
+ } finally {
149
+ declining.value = false;
150
+ }
151
+ }
152
+ async function goBackToSignup() {
153
+ goingBack.value = true;
154
+ try {
155
+ clearSignupConsentFlowData();
156
+ const signupPath = withReturnUrl("/auth/signup", returnUrl.value);
157
+ const { declined: _d, token: _t, ...rest } = route.query;
158
+ await router.push({
159
+ path: signupPath,
160
+ query: rest
161
+ });
162
+ } finally {
163
+ goingBack.value = false;
164
+ }
165
+ }
166
+ return (_ctx, _cache) => {
167
+ return openBlock(), createElementBlock("div", _hoisted_1, [loading.value ? (openBlock(), createElementBlock("div", _hoisted_2, [..._cache[0] || (_cache[0] = [createElementVNode("p", { class: "text-base-content/80" }, "Loading...", -1)])])) : !token.value || !consents.value.length ? (openBlock(), createElementBlock("div", _hoisted_3, [_cache[2] || (_cache[2] = createElementVNode("p", { class: "text-base-content/80" }, "Invalid or expired signup link. Please start over.", -1)), createVNode(AppLink_default, {
168
+ to: signupLink.value,
169
+ class: "btn btn-primary btn-sm mt-4"
170
+ }, {
171
+ default: withCtx(() => [..._cache[1] || (_cache[1] = [createTextVNode("Back to sign up", -1)])]),
172
+ _: 1
173
+ }, 8, ["to"])])) : currentConfig.value ? (openBlock(), createElementBlock("div", _hoisted_4, [createVNode(ConsentFlowStep_default, {
174
+ config: currentConfig.value,
175
+ "current-step": currentStep.value,
176
+ "total-steps": totalSteps.value,
177
+ submitting: submitting.value,
178
+ "submit-error": submitError.value,
179
+ declining: declining.value,
180
+ "accept-label": "Accept and continue",
181
+ "submit-accept-label": "Submitting...",
182
+ "decline-label": "Decline",
183
+ "decline-submitting-label": "Returning...",
184
+ "intro-text": "Please read the full document before accepting. Scroll to the bottom when you've finished reading. You can decline at any time; if you decline, your account will not be created and you will return to sign up.",
185
+ onAccept: handleAccept,
186
+ onDecline: handleDecline
187
+ }, {
188
+ "error-recovery": withCtx(() => [
189
+ createElementVNode("span", null, toDisplayString(submitError.value), 1),
190
+ _cache[3] || (_cache[3] = createElementVNode("p", { class: "text-sm opacity-90" }, " You can try again below or go back to sign up. ", -1)),
191
+ createElementVNode("button", {
192
+ type: "button",
193
+ class: "btn btn-ghost btn-sm mt-1",
194
+ disabled: goingBack.value || submitting.value,
195
+ onClick: goBackToSignup
196
+ }, toDisplayString(goingBack.value ? "Returning..." : "Back to sign up"), 9, _hoisted_5)
197
+ ]),
198
+ _: 1
199
+ }, 8, [
200
+ "config",
201
+ "current-step",
202
+ "total-steps",
203
+ "submitting",
204
+ "submit-error",
205
+ "declining"
206
+ ])])) : createCommentVNode("v-if", true)]);
207
+ };
208
+ }
209
+ });
210
+ var SignupConsentFlow_default = _sfc_main;
211
+
212
+ //#endregion
213
+ export { SignupConsentFlow_default as default };
214
+ //# sourceMappingURL=SignupConsentFlow-dyQSp9iU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SignupConsentFlow-dyQSp9iU.js","names":["acceptancesSoFar: Record<string, boolean>"],"sources":["../src/slices/auth/features/signup_consents/SignupConsentFlow.vue"],"sourcesContent":["<template>\n <div class=\"w-full max-w-md mx-auto mb-8 sm:mb-10 bg-base-200 px-3 py-4 sm:px-6 sm:py-6 rounded-xl shadow-md container min-w-0\">\n <div v-if=\"loading\" class=\"text-center\">\n <p class=\"text-base-content/80\">Loading...</p>\n </div>\n\n <div v-else-if=\"!token || !consents.length\" class=\"text-center\">\n <p class=\"text-base-content/80\">Invalid or expired signup link. Please start over.</p>\n <AppLink :to=\"signupLink\" class=\"btn btn-primary btn-sm mt-4\">Back to sign up</AppLink>\n </div>\n\n <div v-else-if=\"currentConfig\" class=\"space-y-6\">\n <ConsentFlowStep\n :config=\"currentConfig\"\n :current-step=\"currentStep\"\n :total-steps=\"totalSteps\"\n :submitting=\"submitting\"\n :submit-error=\"submitError\"\n :declining=\"declining\"\n accept-label=\"Accept and continue\"\n submit-accept-label=\"Submitting...\"\n decline-label=\"Decline\"\n decline-submitting-label=\"Returning...\"\n intro-text=\"Please read the full document before accepting. Scroll to the bottom when you've finished reading. You can decline at any time; if you decline, your account will not be created and you will return to sign up.\"\n @accept=\"handleAccept\"\n @decline=\"handleDecline\"\n >\n <template #error-recovery>\n <span>{{ submitError }}</span>\n <p class=\"text-sm opacity-90\">\n You can try again below or go back to sign up.\n </p>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm mt-1\"\n :disabled=\"goingBack || submitting\"\n @click=\"goBackToSignup\"\n >\n {{ goingBack ? 'Returning...' : 'Back to sign up' }}\n </button>\n </template>\n </ConsentFlowStep>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { SignupRequirementsDto } from '@dragonmastery/dragoncore-shared';\nimport AppLink from '../../../../components/AppLink.vue';\nimport ConsentFlowStep from '../shared/ConsentFlowStep.vue';\nimport {\n clearSignupConsentFlowData,\n getSignupConsentFlowData,\n} from '../../signupConsentStorage';\nimport { computed, nextTick, ref } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport { useEnv } from '../../../../composables/useEnv';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useUserSessionStore } from '../../../../composables/useUserSessionStore';\nimport {\n getValidReturnUrl,\n setEmailVerificationReturnUrl,\n withReturnUrl,\n} from '../../../../utils/useReturnUrl';\n\nconst sessionStore = useUserSessionStore();\nconst router = useRouter();\nconst route = useRoute();\nconst { emailVerificationMode } = useEnv();\n\nconst returnUrl = computed(() => route.query.returnUrl as string | undefined);\nconst signupLink = computed(() => withReturnUrl('/auth/signup', returnUrl.value));\n\nconst token = computed(() => (route.query.token as string) ?? '');\nconst storedData = ref<{ token: string; consents: SignupRequirementsDto } | null>(null);\nconst loading = ref(true);\n\n// Load consents from sessionStorage (must match token from URL)\nconst consents = computed(() => {\n const t = token.value;\n const data = storedData.value;\n if (!t || !data || data.token !== t) return [];\n return data.consents;\n});\n\n// Fallback: if no stored data, fetch consents with token (e.g. user opened link in new tab)\nconst { mutate: fetchConsentsForToken } = useMutation(\n (api, _t: string) => api.users.getSignupConsentsForToken(),\n {\n skipAuthCheck: true,\n credentials: 'include',\n customAuthToken: (t) => t,\n },\n);\n\nasync function loadConsents() {\n loading.value = true;\n const t = token.value;\n if (!t) {\n loading.value = false;\n return;\n }\n const data = getSignupConsentFlowData();\n if (data && data.token === t) {\n storedData.value = data;\n loading.value = false;\n return;\n }\n try {\n const reqs = await fetchConsentsForToken(t);\n if (reqs && Array.isArray(reqs) && reqs.length > 0) {\n storedData.value = { token: t, consents: reqs };\n }\n } catch {\n // Token invalid/expired - consents stay empty, user sees \"Invalid or expired\" message\n }\n loading.value = false;\n}\n\nloadConsents();\n\nconst currentStep = ref(1);\nconst totalSteps = computed(() => consents.value.length);\nconst currentConfig = computed(\n () => consents.value[currentStep.value - 1] ?? null,\n);\n\nconst declining = ref(false);\nconst goingBack = ref(false);\nconst submitting = ref(false);\nconst submitError = ref<string | null>(null);\n\nfunction getErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message) return error.message;\n if (error && typeof error === 'object' && 'message' in error && typeof (error as { message: unknown }).message === 'string') {\n return (error as { message: string }).message;\n }\n return 'Registration failed. Please try again.';\n}\n\nconst { mutate: signupCompleteMutate } = useMutation(\n (api, input: { token: string; acceptances: Record<string, boolean> }) =>\n api.users.signupComplete({ acceptances: input.acceptances }),\n {\n skipAuthCheck: true,\n credentials: 'include',\n customAuthToken: (input) => input.token,\n },\n);\n\nasync function handleAccept() {\n const config = currentConfig.value;\n if (!config || !token.value || !consents.value.length) return;\n\n submitError.value = null;\n\n const acceptancesSoFar: Record<string, boolean> = {};\n for (let i = 0; i < currentStep.value; i++) {\n const c = consents.value[i];\n if (c) acceptancesSoFar[c.type] = true;\n }\n\n if (currentStep.value >= totalSteps.value) {\n submitting.value = true;\n try {\n await completeSignup(acceptancesSoFar);\n } catch (err) {\n submitError.value = getErrorMessage(err);\n } finally {\n submitting.value = false;\n }\n return;\n }\n\n currentStep.value++;\n nextTick();\n}\n\nasync function completeSignup(acceptances: Record<string, boolean>) {\n const t = token.value;\n if (!t) return;\n\n const session = await signupCompleteMutate({ token: t, acceptances });\n if (!session?.access_token || !session?.user_details_token) {\n throw new Error('Signup failed');\n }\n\n clearSignupConsentFlowData();\n\n sessionStore.setSession(session.user_details_token);\n sessionStore.setAccessToken(session.access_token);\n\n if (emailVerificationMode !== 'disabled') {\n if (emailVerificationMode === 'strict') {\n const targetUrl = getValidReturnUrl(route, '/');\n setEmailVerificationReturnUrl(targetUrl);\n }\n window.scrollTo(0, 0);\n const verifyPath = withReturnUrl('/auth/verify-email', returnUrl.value);\n await router.push(verifyPath);\n return;\n }\n\n window.scrollTo(0, 0);\n const defaultRedirect = getValidReturnUrl(route, '/');\n await router.push(defaultRedirect);\n toast.success('Registration successful! You are now logged in.');\n}\n\nasync function handleDecline() {\n declining.value = true;\n try {\n clearSignupConsentFlowData();\n const signupPath = withReturnUrl('/auth/signup', returnUrl.value);\n await router.push({ path: signupPath, query: { ...route.query, declined: '1' } });\n } finally {\n declining.value = false;\n }\n}\n\nasync function goBackToSignup() {\n goingBack.value = true;\n try {\n clearSignupConsentFlowData();\n const signupPath = withReturnUrl('/auth/signup', returnUrl.value);\n const { declined: _d, token: _t, ...rest } = route.query;\n await router.push({ path: signupPath, query: rest });\n } finally {\n goingBack.value = false;\n }\n}\n</script>\n"],"mappings":"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"}
@@ -1,10 +1,11 @@
1
- import "./useRpcAuth-x5Gn5gR0.js";
2
- import "./useQueryCache-DkRwK5Gz.js";
3
- import { t as useMutation } from "./useMutation-BMZJLpgx.js";
4
- import { t as useQuery } from "./useQuery-qpXzBuVg.js";
5
- import { n as RecordVersionList_default, t as RecordVersionViewer_default } from "./RecordVersionViewer-BWZ78vvE.js";
6
- import { r as formatToISODatetime } from "./convertToLocalDateTime-CFhtN6PI.js";
7
- import { t as extractRpcErrorMessage } from "./extractRpcErrorMessage-Di8E8-Wh.js";
1
+ import "./useRpcAuth-CJtq1dqM.js";
2
+ import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
+ import "./useQueryCache-alzaRWEb.js";
4
+ import { t as useMutation } from "./useMutation-BLNuJoYl.js";
5
+ import { t as useQuery } from "./useQuery-BzUGEOj0.js";
6
+ import { n as RecordVersionList_default, t as RecordVersionViewer_default } from "./RecordVersionViewer-D2j10HdK.js";
7
+ import { r as formatToISODatetime } from "./convertToLocalDateTime-BF25N4xd.js";
8
+ import { t as extractRpcErrorMessage } from "./extractRpcErrorMessage-diUBl6Ij.js";
8
9
  import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, ref, renderList, toDisplayString, unref, withCtx } from "vue";
9
10
  import { toast } from "vue3-toastify";
10
11
  import { RecordConst, SignupConsentItemFormSchema } from "@dragonmastery/dragoncore-shared";
@@ -357,4 +358,4 @@ var SignupRequirementsPage_default = _sfc_main;
357
358
 
358
359
  //#endregion
359
360
  export { SignupRequirementsPage_default as default };
360
- //# sourceMappingURL=SignupRequirementsPage-Sm3vgkhC.js.map
361
+ //# sourceMappingURL=SignupRequirementsPage-Cf-ElkEq.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SignupRequirementsPage-Sm3vgkhC.js","names":["consentItemFieldMetadata: {\n [K in PathsOf<typeof SignupConsentItemFormSchema>]: SchemaFieldMetadata;\n}","config: SignupRequirementsDto"],"sources":["../src/slices/admin/features/signup_requirements/signupRequirementsFormMetadata.ts","../src/slices/admin/features/signup_requirements/SignupRequirementsPage.vue"],"sourcesContent":["import {\n SignupConsentItemFormSchema,\n type SignupConsentItemFormDto,\n} from '@dragonmastery/dragoncore-shared';\nimport {\n withMetadata,\n type PathsOf,\n type SchemaFieldMetadata,\n} from '@dragonmastery/zinia-forms-core';\nimport { z } from 'zod';\n\n/** Field metadata for consent item form — keys must match schema paths */\nexport const consentItemFieldMetadata: {\n [K in PathsOf<typeof SignupConsentItemFormSchema>]: SchemaFieldMetadata;\n} = {\n type: {\n label: 'Type',\n helpText: 'Type (e.g. terms_of_service, privacy_policy)',\n placeholder: 'terms_of_service',\n },\n version: {\n label: 'Version',\n helpText: 'Version (e.g. 2025.1)',\n placeholder: '2025.1',\n },\n label: {\n label: 'Label',\n placeholder: 'Terms of Service',\n },\n effective_at: {\n label: 'Effective at',\n inputType: 'datetime-local',\n helpText:\n 'When this version becomes enforceable for existing users. Set to now for immediate effect.',\n },\n url: {\n label: 'URL',\n helpText: 'URL (link to document)',\n placeholder: 'https://example.com/terms',\n },\n required: {\n label: 'Required',\n helpText: 'User must accept to sign up',\n inputType: 'checkbox' as const,\n },\n content: {\n label: 'Content',\n helpText: 'Optional, Markdown — when set, shown in scroll box; user must scroll to bottom',\n placeholder: '# Terms of Service\\n\\nYour markdown content here...',\n inputType: 'textarea',\n },\n};\n\n/** Item schema with metadata - used as array element (like followupCreateMetadata in tracker) */\nexport const signupConsentItemFormMetadata = withMetadata(\n SignupConsentItemFormSchema,\n 'signupConsentItemForm',\n consentItemFieldMetadata,\n);\n\n/** Full form schema with items array using metadata-wrapped item schema */\nexport const signupRequirementsFormMetadata = withMetadata(\n z.object({\n items: z.array(signupConsentItemFormMetadata).default([]),\n }),\n 'signupRequirementsForm',\n {},\n);\n\nexport function createEmptyConsentItem(): SignupConsentItemFormDto {\n const now = new Date();\n const pad = (n: number) => String(n).padStart(2, '0');\n const effectiveAt = `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}T${pad(now.getHours())}:${pad(now.getMinutes())}`;\n return {\n type: '',\n required: true,\n url: '',\n label: '',\n version: '1',\n effective_at: effectiveAt,\n content: '',\n };\n}\n","<template>\n <div class=\"mt-2\">\n <div class=\"flex justify-between items-center mb-4\">\n <h1 class=\"text-2xl font-bold\">Signup Requirements</h1>\n </div>\n\n <p class=\"text-base-content/70 mb-4\">\n Configure consent checkboxes shown on signup and consent-required flows. Each item can be\n required or optional. When <strong>content</strong> is provided, terms are shown in a\n scroll box (Markdown supported) and the user must scroll to bottom before accepting. When\n content is omitted, only a link is shown.\n </p>\n\n <div v-if=\"isLoading\" class=\"flex justify-center py-8\">\n <span class=\"loading loading-spinner loading-lg\"></span>\n </div>\n\n <div v-else class=\"space-y-6\">\n <ZiniaForm\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"\"\n subtitle=\"\"\n >\n <zinia.ItemsField label=\"Consent Items\" :create-item=\"createEmptyConsentItem\">\n <template #itemPreview=\"{ item }\">\n <div class=\"font-medium text-sm\">\n {{ item.label || item.type || 'Item' }}\n <span v-if=\"item.type\" class=\"text-base-content/60\">({{ item.type }})</span>\n </div>\n </template>\n <template #itemRenderer=\"{ fields }\">\n <div class=\"space-y-3\">\n <div class=\"grid grid-cols-1 md:grid-cols-3 gap-3\">\n <ziniaGeneric.TextField\n :name=\"fields.type\"\n :label=\"consentItemFieldMetadata.type.label\"\n :placeholder=\"consentItemFieldMetadata.type.placeholder\"\n required\n />\n <ziniaGeneric.TextField\n :name=\"fields.version\"\n :label=\"consentItemFieldMetadata.version.label\"\n :placeholder=\"consentItemFieldMetadata.version.placeholder\"\n required\n />\n <ziniaGeneric.TextField\n :name=\"fields.label\"\n :label=\"consentItemFieldMetadata.label.label\"\n :placeholder=\"consentItemFieldMetadata.label.placeholder\"\n required\n />\n </div>\n <ziniaGeneric.DateField\n :name=\"fields.effective_at\"\n :label=\"consentItemFieldMetadata.effective_at.label\"\n :formatter=\"formatToISODatetime\"\n required\n />\n <ziniaGeneric.TextField\n :name=\"fields.url\"\n :label=\"consentItemFieldMetadata.url.label\"\n :placeholder=\"consentItemFieldMetadata.url.placeholder\"\n type=\"url\"\n />\n <ziniaGeneric.CheckboxField\n :name=\"fields.required\"\n :label=\"consentItemFieldMetadata.required.label\"\n />\n <ziniaGeneric.TextareaField\n :name=\"fields.content\"\n :label=\"consentItemFieldMetadata.content.label\"\n :placeholder=\"consentItemFieldMetadata.content.placeholder\"\n :rows=\"5\"\n class=\"font-mono text-sm\"\n />\n </div>\n </template>\n </zinia.ItemsField>\n\n <div v-if=\"form.submitError\" class=\"alert alert-error mt-2\">\n <span>{{ form.submitError }}</span>\n </div>\n\n <div class=\"mt-4 flex justify-end\">\n <ZiniaSubmitButton\n submitText=\"Save\"\n submittingText=\"Saving...\"\n :disabled=\"!hasChanges\"\n />\n </div>\n </ZiniaForm>\n\n <!-- Version History -->\n <div class=\"card bg-base-200\">\n <div class=\"card-body\">\n <h2 class=\"card-title text-lg\">Version History</h2>\n <p class=\"text-sm text-base-content/70\">\n Past changes to signup requirements. Each save creates a new version.\n </p>\n <RecordVersionList\n :versions=\"versionHistoryItems\"\n :loading=\"versionHistoryLoading\"\n :error=\"versionHistoryError\"\n :has-next-page=\"versionHistoryPageInfo?.hasNextPage ?? false\"\n :loading-more=\"versionHistoryLoadingMore\"\n :config=\"versionListConfig\"\n exclude-latest\n @retry=\"refetchVersionHistory\"\n @load-more=\"loadMoreVersions\"\n />\n <dialog ref=\"versionModalRef\" class=\"modal\">\n <div class=\"modal-box max-w-4xl max-h-[90vh] overflow-auto\">\n <RecordVersionViewer\n v-if=\"selectedVersion\"\n :version=\"selectedVersion\"\n :record-data=\"selectedVersionRecordData\"\n :config=\"versionViewerConfig\"\n >\n <template #content=\"{ recordData }\">\n <div v-if=\"recordData?.items?.length\" class=\"space-y-4\">\n <h3 class=\"font-semibold\">Consent items at this version</h3>\n <div\n v-for=\"(item, idx) in recordData.items\"\n :key=\"idx\"\n class=\"border border-base-300 rounded p-3 text-sm space-y-1\"\n >\n <div><strong>Type:</strong> {{ item.type }}</div>\n <div><strong>Version:</strong> {{ item.version }}</div>\n <div><strong>Label:</strong> {{ item.label }}</div>\n <div><strong>Effective at:</strong> {{ item.effective_at }}</div>\n <div><strong>Required:</strong> {{ item.required ? 'Yes' : 'No' }}</div>\n <div v-if=\"item.url\"><strong>URL:</strong> {{ item.url }}</div>\n </div>\n </div>\n <pre v-else class=\"text-xs bg-base-200 p-3 rounded overflow-auto max-h-96\">{{\n JSON.stringify(recordData, null, 2)\n }}</pre>\n </template>\n </RecordVersionViewer>\n </div>\n <form method=\"dialog\" class=\"modal-backdrop\">\n <button type=\"button\" @click=\"closeVersionModal\">close</button>\n </form>\n </dialog>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { SignupRequirementsDto } from '@dragonmastery/dragoncore-shared';\nimport { RecordConst } from '@dragonmastery/dragoncore-shared';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { computed, ref } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport RecordVersionList from '../../../../components/ui/RecordVersionList.vue';\nimport RecordVersionViewer from '../../../../components/ui/RecordVersionViewer.vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useQuery } from '../../../../composables/useQuery';\nimport { formatToISODatetime } from '../../../../utils/convertToLocalDateTime';\nimport { extractRpcErrorMessage } from '../../../../utils/extractRpcErrorMessage';\nimport {\n consentItemFieldMetadata,\n createEmptyConsentItem,\n signupRequirementsFormMetadata,\n} from './signupRequirementsFormMetadata';\n\nconst {\n data: _signupRequirements,\n loading: isLoading,\n refetch,\n} = useQuery((api) => api.appSettings.getSignupRequirements(), {\n // cacheKey: 'admin-signup-requirements',\n // staleTime: 30 * 1000,\n});\n\nconst { form, zinia, ziniaGeneric, ZiniaForm, ZiniaSubmitButton } = useForm(\n signupRequirementsFormMetadata,\n {\n storeName: 'admin-signup-requirements-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n // wait for signup requirements to load\n fetchData: async () => {\n while (isLoading.value) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n return { items: _signupRequirements.value ?? [] };\n },\n },\n);\n\nconst initialSnapshot = ref<string>('');\n\nconst hasChanges = computed(() => {\n const current = form.values?.items ?? [];\n return JSON.stringify(current) !== initialSnapshot.value;\n});\n\nconst { mutate: updateSignupRequirements } = useMutation(\n (api, config: SignupRequirementsDto) => api.appSettings.updateSignupRequirements(config),\n { invalidate: /admin-signup-requirements/ },\n);\n\nasync function handleSubmit(formData: {\n items: Array<{\n type: string;\n required: boolean;\n url: string;\n label: string;\n version: string;\n effective_at: string;\n content?: string | null;\n }>;\n}) {\n const config: SignupRequirementsDto = formData.items.map((c) => ({\n type: c.type.trim() || 'unknown',\n required: c.required,\n url: c.url.trim(),\n label: c.label.trim() || c.type.trim() || 'Consent',\n version: c.version.trim() || '1',\n effective_at:\n (c.effective_at?.trim()\n ? formatToISODatetime(c.effective_at.trim())\n : formatToISODatetime(new Date().toISOString())) ?? new Date().toISOString(),\n content: c.content?.trim() ? c.content.trim() : undefined,\n }));\n await updateSignupRequirements(config);\n}\n\nasync function handleSuccess() {\n toast.success('Signup requirements saved');\n initialSnapshot.value = JSON.stringify(form.values?.items ?? []);\n await refetch();\n await refetchVersionHistory();\n}\n\nfunction handleError(error: Error | unknown) {\n const message = error instanceof Error ? error.message : 'An unknown error occurred';\n form.setSubmitError(extractRpcErrorMessage(error, message));\n toast.error(form.submitError ?? 'Failed to save signup requirements');\n}\n\n// Version history\nconst VERSION_HISTORY_KEY = 'admin-signup-requirements-history';\n\nconst {\n data: versionHistoryData,\n loading: versionHistoryLoading,\n error: versionHistoryError,\n refetch: refetchVersionHistory,\n} = useQuery(\n async (api) =>\n api.recordVersions.listRecordVersionsPaginated(\n 'signup_requirements',\n RecordConst.APP_SETTING,\n {\n first: 50,\n sortBy: 'recorded_at',\n sortDirection: 'desc',\n },\n ),\n {\n cacheKey: VERSION_HISTORY_KEY,\n staleTime: 60 * 1000,\n },\n);\n\nconst versionHistoryItems = computed(() => versionHistoryData.value?.items ?? []);\nconst versionHistoryPageInfo = computed(() => versionHistoryData.value?.pageInfo);\nconst versionHistoryLoadingMore = ref(false);\n\nfunction loadMoreVersions() {\n // Pagination: could add cursor-based load more if needed\n}\n\nconst versionListConfig = {\n recordDisplayName: 'signup requirements',\n noVersionsText: 'No previous versions. Save changes to create the first version.',\n viewAction: (version: { id: string }) => openVersionModal(version),\n viewActionText: 'View',\n};\n\nconst versionModalRef = ref<HTMLDialogElement | null>(null);\nconst selectedVersion = ref<{\n id: string;\n operation: string;\n recorded_at: string;\n auth_username?: string | null;\n record?: unknown;\n old_record?: unknown;\n} | null>(null);\n\nconst selectedVersionRecordData = computed(() => {\n if (!selectedVersion.value) return null;\n const v = selectedVersion.value;\n const record = v.record;\n if (Array.isArray(record)) return { items: record };\n if (typeof record === 'object' && record !== null) return record;\n if (typeof record === 'string') {\n try {\n const parsed = JSON.parse(record);\n return Array.isArray(parsed) ? { items: parsed } : parsed;\n } catch {\n return { raw: record };\n }\n }\n return null;\n});\n\nconst versionViewerConfig = {\n recordDisplayName: 'signup requirements',\n title: 'Signup Requirements Version',\n onBack: () => closeVersionModal(),\n excludeFields: ['raw'],\n};\n\nfunction openVersionModal(version: { id: string; record?: unknown; old_record?: unknown }) {\n selectedVersion.value = version as typeof selectedVersion.value;\n versionModalRef.value?.showModal();\n}\n\nfunction closeVersionModal() {\n selectedVersion.value = null;\n versionModalRef.value?.close();\n}\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"SignupRequirementsPage-Cf-ElkEq.js","names":["consentItemFieldMetadata: {\n [K in PathsOf<typeof SignupConsentItemFormSchema>]: SchemaFieldMetadata;\n}","config: SignupRequirementsDto"],"sources":["../src/slices/admin/features/signup_requirements/signupRequirementsFormMetadata.ts","../src/slices/admin/features/signup_requirements/SignupRequirementsPage.vue"],"sourcesContent":["import {\n SignupConsentItemFormSchema,\n type SignupConsentItemFormDto,\n} from '@dragonmastery/dragoncore-shared';\nimport {\n withMetadata,\n type PathsOf,\n type SchemaFieldMetadata,\n} from '@dragonmastery/zinia-forms-core';\nimport { z } from 'zod';\n\n/** Field metadata for consent item form — keys must match schema paths */\nexport const consentItemFieldMetadata: {\n [K in PathsOf<typeof SignupConsentItemFormSchema>]: SchemaFieldMetadata;\n} = {\n type: {\n label: 'Type',\n helpText: 'Type (e.g. terms_of_service, privacy_policy)',\n placeholder: 'terms_of_service',\n },\n version: {\n label: 'Version',\n helpText: 'Version (e.g. 2025.1)',\n placeholder: '2025.1',\n },\n label: {\n label: 'Label',\n placeholder: 'Terms of Service',\n },\n effective_at: {\n label: 'Effective at',\n inputType: 'datetime-local',\n helpText:\n 'When this version becomes enforceable for existing users. Set to now for immediate effect.',\n },\n url: {\n label: 'URL',\n helpText: 'URL (link to document)',\n placeholder: 'https://example.com/terms',\n },\n required: {\n label: 'Required',\n helpText: 'User must accept to sign up',\n inputType: 'checkbox' as const,\n },\n content: {\n label: 'Content',\n helpText: 'Optional, Markdown — when set, shown in scroll box; user must scroll to bottom',\n placeholder: '# Terms of Service\\n\\nYour markdown content here...',\n inputType: 'textarea',\n },\n};\n\n/** Item schema with metadata - used as array element (like followupCreateMetadata in tracker) */\nexport const signupConsentItemFormMetadata = withMetadata(\n SignupConsentItemFormSchema,\n 'signupConsentItemForm',\n consentItemFieldMetadata,\n);\n\n/** Full form schema with items array using metadata-wrapped item schema */\nexport const signupRequirementsFormMetadata = withMetadata(\n z.object({\n items: z.array(signupConsentItemFormMetadata).default([]),\n }),\n 'signupRequirementsForm',\n {},\n);\n\nexport function createEmptyConsentItem(): SignupConsentItemFormDto {\n const now = new Date();\n const pad = (n: number) => String(n).padStart(2, '0');\n const effectiveAt = `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}T${pad(now.getHours())}:${pad(now.getMinutes())}`;\n return {\n type: '',\n required: true,\n url: '',\n label: '',\n version: '1',\n effective_at: effectiveAt,\n content: '',\n };\n}\n","<template>\n <div class=\"mt-2\">\n <div class=\"flex justify-between items-center mb-4\">\n <h1 class=\"text-2xl font-bold\">Signup Requirements</h1>\n </div>\n\n <p class=\"text-base-content/70 mb-4\">\n Configure consent checkboxes shown on signup and consent-required flows. Each item can be\n required or optional. When <strong>content</strong> is provided, terms are shown in a\n scroll box (Markdown supported) and the user must scroll to bottom before accepting. When\n content is omitted, only a link is shown.\n </p>\n\n <div v-if=\"isLoading\" class=\"flex justify-center py-8\">\n <span class=\"loading loading-spinner loading-lg\"></span>\n </div>\n\n <div v-else class=\"space-y-6\">\n <ZiniaForm\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"\"\n subtitle=\"\"\n >\n <zinia.ItemsField label=\"Consent Items\" :create-item=\"createEmptyConsentItem\">\n <template #itemPreview=\"{ item }\">\n <div class=\"font-medium text-sm\">\n {{ item.label || item.type || 'Item' }}\n <span v-if=\"item.type\" class=\"text-base-content/60\">({{ item.type }})</span>\n </div>\n </template>\n <template #itemRenderer=\"{ fields }\">\n <div class=\"space-y-3\">\n <div class=\"grid grid-cols-1 md:grid-cols-3 gap-3\">\n <ziniaGeneric.TextField\n :name=\"fields.type\"\n :label=\"consentItemFieldMetadata.type.label\"\n :placeholder=\"consentItemFieldMetadata.type.placeholder\"\n required\n />\n <ziniaGeneric.TextField\n :name=\"fields.version\"\n :label=\"consentItemFieldMetadata.version.label\"\n :placeholder=\"consentItemFieldMetadata.version.placeholder\"\n required\n />\n <ziniaGeneric.TextField\n :name=\"fields.label\"\n :label=\"consentItemFieldMetadata.label.label\"\n :placeholder=\"consentItemFieldMetadata.label.placeholder\"\n required\n />\n </div>\n <ziniaGeneric.DateField\n :name=\"fields.effective_at\"\n :label=\"consentItemFieldMetadata.effective_at.label\"\n :formatter=\"formatToISODatetime\"\n required\n />\n <ziniaGeneric.TextField\n :name=\"fields.url\"\n :label=\"consentItemFieldMetadata.url.label\"\n :placeholder=\"consentItemFieldMetadata.url.placeholder\"\n type=\"url\"\n />\n <ziniaGeneric.CheckboxField\n :name=\"fields.required\"\n :label=\"consentItemFieldMetadata.required.label\"\n />\n <ziniaGeneric.TextareaField\n :name=\"fields.content\"\n :label=\"consentItemFieldMetadata.content.label\"\n :placeholder=\"consentItemFieldMetadata.content.placeholder\"\n :rows=\"5\"\n class=\"font-mono text-sm\"\n />\n </div>\n </template>\n </zinia.ItemsField>\n\n <div v-if=\"form.submitError\" class=\"alert alert-error mt-2\">\n <span>{{ form.submitError }}</span>\n </div>\n\n <div class=\"mt-4 flex justify-end\">\n <ZiniaSubmitButton\n submitText=\"Save\"\n submittingText=\"Saving...\"\n :disabled=\"!hasChanges\"\n />\n </div>\n </ZiniaForm>\n\n <!-- Version History -->\n <div class=\"card bg-base-200\">\n <div class=\"card-body\">\n <h2 class=\"card-title text-lg\">Version History</h2>\n <p class=\"text-sm text-base-content/70\">\n Past changes to signup requirements. Each save creates a new version.\n </p>\n <RecordVersionList\n :versions=\"versionHistoryItems\"\n :loading=\"versionHistoryLoading\"\n :error=\"versionHistoryError\"\n :has-next-page=\"versionHistoryPageInfo?.hasNextPage ?? false\"\n :loading-more=\"versionHistoryLoadingMore\"\n :config=\"versionListConfig\"\n exclude-latest\n @retry=\"refetchVersionHistory\"\n @load-more=\"loadMoreVersions\"\n />\n <dialog ref=\"versionModalRef\" class=\"modal\">\n <div class=\"modal-box max-w-4xl max-h-[90vh] overflow-auto\">\n <RecordVersionViewer\n v-if=\"selectedVersion\"\n :version=\"selectedVersion\"\n :record-data=\"selectedVersionRecordData\"\n :config=\"versionViewerConfig\"\n >\n <template #content=\"{ recordData }\">\n <div v-if=\"recordData?.items?.length\" class=\"space-y-4\">\n <h3 class=\"font-semibold\">Consent items at this version</h3>\n <div\n v-for=\"(item, idx) in recordData.items\"\n :key=\"idx\"\n class=\"border border-base-300 rounded p-3 text-sm space-y-1\"\n >\n <div><strong>Type:</strong> {{ item.type }}</div>\n <div><strong>Version:</strong> {{ item.version }}</div>\n <div><strong>Label:</strong> {{ item.label }}</div>\n <div><strong>Effective at:</strong> {{ item.effective_at }}</div>\n <div><strong>Required:</strong> {{ item.required ? 'Yes' : 'No' }}</div>\n <div v-if=\"item.url\"><strong>URL:</strong> {{ item.url }}</div>\n </div>\n </div>\n <pre v-else class=\"text-xs bg-base-200 p-3 rounded overflow-auto max-h-96\">{{\n JSON.stringify(recordData, null, 2)\n }}</pre>\n </template>\n </RecordVersionViewer>\n </div>\n <form method=\"dialog\" class=\"modal-backdrop\">\n <button type=\"button\" @click=\"closeVersionModal\">close</button>\n </form>\n </dialog>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { SignupRequirementsDto } from '@dragonmastery/dragoncore-shared';\nimport { RecordConst } from '@dragonmastery/dragoncore-shared';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { computed, ref } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport RecordVersionList from '../../../../components/ui/RecordVersionList.vue';\nimport RecordVersionViewer from '../../../../components/ui/RecordVersionViewer.vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useQuery } from '../../../../composables/useQuery';\nimport { formatToISODatetime } from '../../../../utils/convertToLocalDateTime';\nimport { extractRpcErrorMessage } from '../../../../utils/extractRpcErrorMessage';\nimport {\n consentItemFieldMetadata,\n createEmptyConsentItem,\n signupRequirementsFormMetadata,\n} from './signupRequirementsFormMetadata';\n\nconst {\n data: _signupRequirements,\n loading: isLoading,\n refetch,\n} = useQuery((api) => api.appSettings.getSignupRequirements(), {\n // cacheKey: 'admin-signup-requirements',\n // staleTime: 30 * 1000,\n});\n\nconst { form, zinia, ziniaGeneric, ZiniaForm, ZiniaSubmitButton } = useForm(\n signupRequirementsFormMetadata,\n {\n storeName: 'admin-signup-requirements-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n // wait for signup requirements to load\n fetchData: async () => {\n while (isLoading.value) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n return { items: _signupRequirements.value ?? [] };\n },\n },\n);\n\nconst initialSnapshot = ref<string>('');\n\nconst hasChanges = computed(() => {\n const current = form.values?.items ?? [];\n return JSON.stringify(current) !== initialSnapshot.value;\n});\n\nconst { mutate: updateSignupRequirements } = useMutation(\n (api, config: SignupRequirementsDto) => api.appSettings.updateSignupRequirements(config),\n { invalidate: /admin-signup-requirements/ },\n);\n\nasync function handleSubmit(formData: {\n items: Array<{\n type: string;\n required: boolean;\n url: string;\n label: string;\n version: string;\n effective_at: string;\n content?: string | null;\n }>;\n}) {\n const config: SignupRequirementsDto = formData.items.map((c) => ({\n type: c.type.trim() || 'unknown',\n required: c.required,\n url: c.url.trim(),\n label: c.label.trim() || c.type.trim() || 'Consent',\n version: c.version.trim() || '1',\n effective_at:\n (c.effective_at?.trim()\n ? formatToISODatetime(c.effective_at.trim())\n : formatToISODatetime(new Date().toISOString())) ?? new Date().toISOString(),\n content: c.content?.trim() ? c.content.trim() : undefined,\n }));\n await updateSignupRequirements(config);\n}\n\nasync function handleSuccess() {\n toast.success('Signup requirements saved');\n initialSnapshot.value = JSON.stringify(form.values?.items ?? []);\n await refetch();\n await refetchVersionHistory();\n}\n\nfunction handleError(error: Error | unknown) {\n const message = error instanceof Error ? error.message : 'An unknown error occurred';\n form.setSubmitError(extractRpcErrorMessage(error, message));\n toast.error(form.submitError ?? 'Failed to save signup requirements');\n}\n\n// Version history\nconst VERSION_HISTORY_KEY = 'admin-signup-requirements-history';\n\nconst {\n data: versionHistoryData,\n loading: versionHistoryLoading,\n error: versionHistoryError,\n refetch: refetchVersionHistory,\n} = useQuery(\n async (api) =>\n api.recordVersions.listRecordVersionsPaginated(\n 'signup_requirements',\n RecordConst.APP_SETTING,\n {\n first: 50,\n sortBy: 'recorded_at',\n sortDirection: 'desc',\n },\n ),\n {\n cacheKey: VERSION_HISTORY_KEY,\n staleTime: 60 * 1000,\n },\n);\n\nconst versionHistoryItems = computed(() => versionHistoryData.value?.items ?? []);\nconst versionHistoryPageInfo = computed(() => versionHistoryData.value?.pageInfo);\nconst versionHistoryLoadingMore = ref(false);\n\nfunction loadMoreVersions() {\n // Pagination: could add cursor-based load more if needed\n}\n\nconst versionListConfig = {\n recordDisplayName: 'signup requirements',\n noVersionsText: 'No previous versions. Save changes to create the first version.',\n viewAction: (version: { id: string }) => openVersionModal(version),\n viewActionText: 'View',\n};\n\nconst versionModalRef = ref<HTMLDialogElement | null>(null);\nconst selectedVersion = ref<{\n id: string;\n operation: string;\n recorded_at: string;\n auth_username?: string | null;\n record?: unknown;\n old_record?: unknown;\n} | null>(null);\n\nconst selectedVersionRecordData = computed(() => {\n if (!selectedVersion.value) return null;\n const v = selectedVersion.value;\n const record = v.record;\n if (Array.isArray(record)) return { items: record };\n if (typeof record === 'object' && record !== null) return record;\n if (typeof record === 'string') {\n try {\n const parsed = JSON.parse(record);\n return Array.isArray(parsed) ? { items: parsed } : parsed;\n } catch {\n return { raw: record };\n }\n }\n return null;\n});\n\nconst versionViewerConfig = {\n recordDisplayName: 'signup requirements',\n title: 'Signup Requirements Version',\n onBack: () => closeVersionModal(),\n excludeFields: ['raw'],\n};\n\nfunction openVersionModal(version: { id: string; record?: unknown; old_record?: unknown }) {\n selectedVersion.value = version as typeof selectedVersion.value;\n versionModalRef.value?.showModal();\n}\n\nfunction closeVersionModal() {\n selectedVersion.value = null;\n versionModalRef.value?.close();\n}\n</script>\n"],"mappings":"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"}