modoboa 2.6.2__py3-none-any.whl → 2.6.4__py3-none-any.whl

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 (294) hide show
  1. modoboa/admin/api/v1/tests.py +5 -0
  2. modoboa/admin/api/v1/viewsets.py +19 -5
  3. modoboa/admin/api/v2/serializers.py +7 -2
  4. modoboa/admin/api/v2/tests.py +23 -1
  5. modoboa/admin/api/v2/viewsets.py +23 -4
  6. modoboa/admin/handlers.py +8 -13
  7. modoboa/admin/management/commands/subcommands/_import.py +1 -1
  8. modoboa/admin/management/commands/subcommands/_repair.py +1 -1
  9. modoboa/admin/models/alias.py +1 -1
  10. modoboa/admin/models/domain.py +1 -1
  11. modoboa/admin/tests/test_alias_targets.py +12 -0
  12. modoboa/admin/tests/test_data/import_accounts.csv +1 -0
  13. modoboa/admin/tests/test_import_.py +8 -0
  14. modoboa/admin/tests/test_repair.py +2 -2
  15. modoboa/calendars/backends/caldav_.py +3 -1
  16. modoboa/core/checks.py +5 -0
  17. modoboa/core/commands/templates/settings.py.tpl +4 -0
  18. modoboa/core/tests/test_checks.py +27 -0
  19. modoboa/frontend_dist/assets/AccountAliasForm-tLHotdIR.js +1 -0
  20. modoboa/frontend_dist/assets/AccountEditView-DnQIIg47.js +1 -0
  21. modoboa/frontend_dist/assets/AccountLayout-B2HptJzY.js +1 -0
  22. modoboa/frontend_dist/assets/{AccountPasswordSubForm-DtqTon2C.js → AccountPasswordSubForm-DpADntAL.js} +1 -1
  23. modoboa/frontend_dist/assets/AccountView-CJBGh9Oe.js +1 -0
  24. modoboa/frontend_dist/assets/AddressBook-CrFqzlzZ.js +1 -0
  25. modoboa/frontend_dist/assets/AdminLayout-BbCt7YxX.js +1 -0
  26. modoboa/frontend_dist/assets/AlarmsView-CIlt_IKQ.js +1 -0
  27. modoboa/frontend_dist/assets/AliasEditView-n75NEN_s.js +1 -0
  28. modoboa/frontend_dist/assets/AliasRecipientForm-jjj5yJJw.js +1 -0
  29. modoboa/frontend_dist/assets/{AliasView-nnu5M-6u.js → AliasView-DFIvPeIm.js} +1 -1
  30. modoboa/frontend_dist/assets/AuditTrailView-sWnED3E9.js +1 -0
  31. modoboa/frontend_dist/assets/CalendarView-DSCBIvef.js +1 -0
  32. modoboa/frontend_dist/assets/{ChoiceField-k5nIk4ck.js → ChoiceField-RDT6XcnX.js} +1 -1
  33. modoboa/frontend_dist/assets/ComposeEmailForm-D3yUbBJX.css +1 -0
  34. modoboa/frontend_dist/assets/ComposeEmailForm-G3sXQAwI.js +1 -0
  35. modoboa/frontend_dist/assets/ComposeEmailView-Ce1CtFjD.js +1 -0
  36. modoboa/frontend_dist/assets/{ConfirmDialog-B0TjtODh.js → ConfirmDialog-Du7aqKbR.js} +1 -1
  37. modoboa/frontend_dist/assets/ConnectedLayout-BHWaBAzH.js +1 -0
  38. modoboa/frontend_dist/assets/ConnectedLayout-C6HNXWkp.css +1 -0
  39. modoboa/frontend_dist/assets/CreationForm-CjtILq0_.js +1 -0
  40. modoboa/frontend_dist/assets/{CreationForm-HaiQhqwK.css → CreationForm-NOzzyspA.css} +1 -1
  41. modoboa/frontend_dist/assets/DashboardView-DFNwusDZ.js +1 -0
  42. modoboa/frontend_dist/assets/DomainAdminList-BjtfbhRj.js +1 -0
  43. modoboa/frontend_dist/assets/DomainEditView-Cq5Ea4RW.js +1 -0
  44. modoboa/frontend_dist/assets/{DomainTransportForm-DflFVeEo.js → DomainTransportForm-DAXJGNLA.js} +1 -1
  45. modoboa/frontend_dist/assets/DomainView-BfpK7U14.js +4 -0
  46. modoboa/frontend_dist/assets/DomainsView-CYxLy-3Y.js +1 -0
  47. modoboa/frontend_dist/assets/EmailField-DmPc4pyP.js +1 -0
  48. modoboa/frontend_dist/assets/EmailView-BE3vYZtJ.js +1 -0
  49. modoboa/frontend_dist/assets/EmptyLayout-DMwKNHfI.js +1 -0
  50. modoboa/frontend_dist/assets/FiltersView-Dps3_fAh.js +1 -0
  51. modoboa/frontend_dist/assets/ForwardEmailView-C0I00eXf.js +1 -0
  52. modoboa/frontend_dist/assets/HtmlEditor-D753fIAJ.js +140 -0
  53. modoboa/frontend_dist/assets/{IdentitiesView-Cl2lbfkM.css → IdentitiesView-C93He_db.css} +1 -1
  54. modoboa/frontend_dist/assets/IdentitiesView-CoGBVhZx.js +1 -0
  55. modoboa/frontend_dist/assets/InformationView-eB2ayeLD.js +1 -0
  56. modoboa/frontend_dist/assets/{LoadingData-1iXkFEpZ.js → LoadingData-Tm56XNwj.js} +1 -1
  57. modoboa/frontend_dist/assets/{LoginCallbackView-wq3vJcja.js → LoginCallbackView-DjCHUgz5.js} +1 -1
  58. modoboa/frontend_dist/assets/{LoginView-DZQijPLC.js → LoginView-D0r4XBEl.js} +1 -1
  59. modoboa/frontend_dist/assets/MailboxView-DIVABvk5.css +1 -0
  60. modoboa/frontend_dist/assets/MailboxView-DNokO2WZ.js +5 -0
  61. modoboa/frontend_dist/assets/MenuItems-dl38msRA.js +1 -0
  62. modoboa/frontend_dist/assets/MessageView-BWh9BqzS.js +1 -0
  63. modoboa/frontend_dist/assets/MessagesView-BZ7NUOwo.js +1 -0
  64. modoboa/frontend_dist/assets/MigrationsView-DcOVgmcH.js +1 -0
  65. modoboa/frontend_dist/assets/{ParametersForm-CPrKRznO.js → ParametersForm-y02-GM0r.js} +1 -1
  66. modoboa/frontend_dist/assets/ParametersView-B6abt-LH.js +1 -0
  67. modoboa/frontend_dist/assets/ParametersView-v0YS6WU4.js +1 -0
  68. modoboa/frontend_dist/assets/ProviderEditView-BaL9mKxJ.js +1 -0
  69. modoboa/frontend_dist/assets/ProviderGeneralForm-eoHMDO5v.js +1 -0
  70. modoboa/frontend_dist/assets/ProvidersView-DE17nfOl.css +1 -0
  71. modoboa/frontend_dist/assets/ProvidersView-Zu-G35u7.js +1 -0
  72. modoboa/frontend_dist/assets/QuarantineLayout-BHiiksnP.js +1 -0
  73. modoboa/frontend_dist/assets/QuarantineView-BOXSobRz.js +1 -0
  74. modoboa/frontend_dist/assets/ReplyEmailView-JmSiNWPy.js +1 -0
  75. modoboa/frontend_dist/assets/{ResourcesForm-D5G8hixZ.js → ResourcesForm-D0YBapCG.js} +1 -1
  76. modoboa/frontend_dist/assets/SelfServiceLayout-DUmQzUDk.js +1 -0
  77. modoboa/frontend_dist/assets/SettingsView-DMuaKagM.js +6 -0
  78. modoboa/frontend_dist/assets/StatisticsView-CyY_CNcI.js +1 -0
  79. modoboa/frontend_dist/assets/TimeSerieChart-BTDBH33K.js +1 -0
  80. modoboa/frontend_dist/assets/TimeSerieChart-C3XHmlRd.css +1 -0
  81. modoboa/frontend_dist/assets/UserLayout-DwxcQr4L.js +1 -0
  82. modoboa/frontend_dist/assets/{VAlert-iGJ3gOzk.css → VAlert-Bkuw9MFB.css} +1 -1
  83. modoboa/frontend_dist/assets/VAlert-CNys_LUS.js +1 -0
  84. modoboa/frontend_dist/assets/VApp-B0vRc3-6.js +1 -0
  85. modoboa/frontend_dist/assets/VApp-C9NK-Gu6.css +1 -0
  86. modoboa/frontend_dist/assets/VAutocomplete-Huaz_-hf.js +1 -0
  87. modoboa/frontend_dist/assets/VAutocomplete-hzGuLlUI.css +1 -0
  88. modoboa/frontend_dist/assets/VAvatar-BPhnln71.css +1 -0
  89. modoboa/frontend_dist/assets/VAvatar-JdJfoK0C.js +1 -0
  90. modoboa/frontend_dist/assets/{VBadge-BQrRJ9S0.css → VBadge-Bqx6XeRo.css} +1 -1
  91. modoboa/frontend_dist/assets/VBadge-Cg5iu5LG.js +1 -0
  92. modoboa/frontend_dist/assets/{VCard-BNvk7mV7.css → VCard-BdSLQNRY.css} +1 -1
  93. modoboa/frontend_dist/assets/VCard-BoH6kjPa.js +1 -0
  94. modoboa/frontend_dist/assets/VCheckbox-CCLOJFKF.js +1 -0
  95. modoboa/frontend_dist/assets/{VCheckboxBtn-B35nMyHy.js → VCheckboxBtn-Ccl786Rg.js} +1 -1
  96. modoboa/frontend_dist/assets/VColorPicker-452uc3tY.js +1 -0
  97. modoboa/frontend_dist/assets/VColorPicker-B_lVDaYR.css +1 -0
  98. modoboa/frontend_dist/assets/{VContainer-CTzYfsVd.js → VContainer-DKMcKasC.js} +1 -1
  99. modoboa/frontend_dist/assets/VDataTable-BkLLfcQK.js +1 -0
  100. modoboa/frontend_dist/assets/VDataTable-CLcLRj9B.css +1 -0
  101. modoboa/frontend_dist/assets/VDataTableServer-B_6fWBA3.js +1 -0
  102. modoboa/frontend_dist/assets/VDataTableVirtual-Ike7oqcC.js +1 -0
  103. modoboa/frontend_dist/assets/VDialog-DIUeAIpw.js +1 -0
  104. modoboa/frontend_dist/assets/VExpansionPanels-BeMgiS7A.js +1 -0
  105. modoboa/frontend_dist/assets/VExpansionPanels-Dyw0hWW-.css +1 -0
  106. modoboa/frontend_dist/assets/VFileInput-Dvj95FL5.js +1 -0
  107. modoboa/frontend_dist/assets/{VFileInput-VtUg4zpy.css → VFileInput-Dwzvf-gD.css} +1 -1
  108. modoboa/frontend_dist/assets/VForm-DkphQD3e.js +1 -0
  109. modoboa/frontend_dist/assets/VGrid-GYROgRMo.css +1 -0
  110. modoboa/frontend_dist/assets/VInput-CbqehdOu.js +1 -0
  111. modoboa/frontend_dist/assets/VMenu-B6SCtOwT.js +1 -0
  112. modoboa/frontend_dist/assets/VMenu-BEipA1lw.css +1 -0
  113. modoboa/frontend_dist/assets/VPicker-BUx70Wjg.js +1 -0
  114. modoboa/frontend_dist/assets/VPicker-ClSXs6kv.css +1 -0
  115. modoboa/frontend_dist/assets/VProgressCircular-C6u34DRJ.css +1 -0
  116. modoboa/frontend_dist/assets/VProgressCircular-DTDGzl2O.js +1 -0
  117. modoboa/frontend_dist/assets/VRadioGroup-CS9ULZ1c.js +1 -0
  118. modoboa/frontend_dist/assets/{VRow-Dnsej546.js → VRow-CuVZGqBj.js} +1 -1
  119. modoboa/frontend_dist/assets/VSelect-D5IXDPEX.js +1 -0
  120. modoboa/frontend_dist/assets/VSelect-DQzySRN1.css +1 -0
  121. modoboa/frontend_dist/assets/VSelectionControl-uKY9Zull.js +1 -0
  122. modoboa/frontend_dist/assets/VSheet-HeHw6g5_.js +1 -0
  123. modoboa/frontend_dist/assets/VSpacer-BUxSSJbH.js +1 -0
  124. modoboa/frontend_dist/assets/{VSwitch-Mm7Rd7At.css → VSwitch-C6REVr_Y.css} +1 -1
  125. modoboa/frontend_dist/assets/VSwitch-Dh_dserW.js +1 -0
  126. modoboa/frontend_dist/assets/VTable-BsI6FsWH.css +1 -0
  127. modoboa/frontend_dist/assets/VTable-gDsAUSLX.js +1 -0
  128. modoboa/frontend_dist/assets/VTabs-5XSICLQP.js +1 -0
  129. modoboa/frontend_dist/assets/VTabs-NzpINroH.css +1 -0
  130. modoboa/frontend_dist/assets/VTextField-Cow3HZvI.css +1 -0
  131. modoboa/frontend_dist/assets/VTextField-QXQFhKxm.js +1 -0
  132. modoboa/frontend_dist/assets/VTextarea-Bdy4UKmV.js +1 -0
  133. modoboa/frontend_dist/assets/VTextarea-DyGjqrlm.css +1 -0
  134. modoboa/frontend_dist/assets/VToolbar-CB2GrZpA.css +1 -0
  135. modoboa/frontend_dist/assets/VToolbar-CyrYSqJZ.js +1 -0
  136. modoboa/frontend_dist/assets/VWindowItem-DqNaT6b1.css +1 -0
  137. modoboa/frontend_dist/assets/VWindowItem-kZpArwK1.js +1 -0
  138. modoboa/frontend_dist/assets/WebmailLayout-BzW0LWYp.css +1 -0
  139. modoboa/frontend_dist/assets/WebmailLayout-CNUHODnw.js +1 -0
  140. modoboa/frontend_dist/assets/{accounts-CxGXJgEh.js → accounts-DqbBlaLK.js} +1 -1
  141. modoboa/frontend_dist/assets/{admin-COcAacoq.js → admin-D36m_nXq.js} +1 -1
  142. modoboa/frontend_dist/assets/{aliases-DJbDT92U.js → aliases-BtyF8GC8.js} +1 -1
  143. modoboa/frontend_dist/assets/{amavis-CbsMYC6e.js → amavis-B4QhM5Fa.js} +1 -1
  144. modoboa/frontend_dist/assets/{amavis-BqfDWEXM.js → amavis-DySmsCJQ.js} +1 -1
  145. modoboa/frontend_dist/assets/{contacts-BqHRqWBy.js → contacts-Df8ptuMn.js} +1 -1
  146. modoboa/frontend_dist/assets/{domains-FSnyP8bd.js → domains-CSxtTvUh.js} +1 -1
  147. modoboa/frontend_dist/assets/{domains.store-GfcrCBY7.js → domains.store-D4ZqCQ-O.js} +1 -1
  148. modoboa/frontend_dist/assets/filter-DHKXX97M.js +1 -0
  149. modoboa/frontend_dist/assets/{global.store-DrPrIa_j.js → global.store-DYMmGKpn.js} +1 -1
  150. modoboa/frontend_dist/assets/{importExport-D12RGpG8.js → importExport-C-adpHJX.js} +1 -1
  151. modoboa/frontend_dist/assets/index-B1bntsLR.js +995 -0
  152. modoboa/frontend_dist/assets/{index-B1bJH8Ti.css → index-B9q1vO3K.css} +1 -1
  153. modoboa/frontend_dist/assets/index-Bp9Fb67E.js +1 -0
  154. modoboa/frontend_dist/assets/language.store-_-zrrEiS.js +1 -0
  155. modoboa/frontend_dist/assets/languages-CxjoT69j.js +1 -0
  156. modoboa/frontend_dist/assets/layout-CjSP_k58.js +1 -0
  157. modoboa/frontend_dist/assets/{layout.store-ZOCP2JtQ.js → layout.store-CF5WRevH.js} +1 -1
  158. modoboa/frontend_dist/assets/{logos-DY4N2P_F.js → logos-95XYS6uH.js} +1 -1
  159. modoboa/frontend_dist/assets/{logs-CgQS5lzy.js → logs-CyU_PIDh.js} +1 -1
  160. modoboa/frontend_dist/assets/{parameters-BOf7j4fc.js → parameters-BxAXBXU1.js} +1 -1
  161. modoboa/frontend_dist/assets/{parameters.store-6D12J_uw.js → parameters.store-CATOSoQZ.js} +1 -1
  162. modoboa/frontend_dist/assets/{permissions-DxMzIhgI.js → permissions-cSkGqV3M.js} +1 -1
  163. modoboa/frontend_dist/assets/{ssrBoot-BbpCPk1A.js → ssrBoot-05WtbG6H.js} +1 -1
  164. modoboa/frontend_dist/assets/{tag-D-_IsM8n.js → tag-BmV84V2s.js} +1 -1
  165. modoboa/frontend_dist/assets/{theme-B2lOH8MT.js → theme-myV4ekXo.js} +1 -1
  166. modoboa/frontend_dist/assets/transports-ChdHV5hX.js +1 -0
  167. modoboa/frontend_dist/assets/webmail-B7MNMkv_.js +1 -0
  168. modoboa/frontend_dist/assets/webmail.store-Cm-h6hhE.js +1 -0
  169. modoboa/frontend_dist/index.html +2 -2
  170. modoboa/locale/fr/LC_MESSAGES/django.mo +0 -0
  171. modoboa/locale/fr/LC_MESSAGES/django.po +131 -391
  172. modoboa/sievefilters/api/v2/tests.py +6 -0
  173. modoboa/sievefilters/api/v2/viewsets.py +10 -0
  174. modoboa/webmail/serializers.py +2 -1
  175. modoboa/webmail/tests/test_viewsets.py +16 -4
  176. modoboa/webmail/viewsets.py +17 -3
  177. {modoboa-2.6.2.dist-info → modoboa-2.6.4.dist-info}/METADATA +5 -5
  178. {modoboa-2.6.2.dist-info → modoboa-2.6.4.dist-info}/RECORD +183 -183
  179. modoboa/frontend_dist/assets/AccountAliasForm-BzwhK9cz.js +0 -1
  180. modoboa/frontend_dist/assets/AccountEditView-Dujx5Scp.js +0 -1
  181. modoboa/frontend_dist/assets/AccountLayout-BDiVTbNa.js +0 -1
  182. modoboa/frontend_dist/assets/AccountView-D8vnHee_.js +0 -1
  183. modoboa/frontend_dist/assets/AddressBook-DWGt9xIC.js +0 -1
  184. modoboa/frontend_dist/assets/AdminLayout-GPLTQAzV.js +0 -1
  185. modoboa/frontend_dist/assets/AlarmsView-DDN5FZ4i.js +0 -1
  186. modoboa/frontend_dist/assets/AliasEditView-BeXQf1Ja.js +0 -1
  187. modoboa/frontend_dist/assets/AliasRecipientForm-CGPKUJVF.js +0 -1
  188. modoboa/frontend_dist/assets/AuditTrailView-Bysr09YT.js +0 -1
  189. modoboa/frontend_dist/assets/CalendarView-CGdVWsxp.js +0 -1
  190. modoboa/frontend_dist/assets/ComposeEmailForm-DHFthaP6.css +0 -1
  191. modoboa/frontend_dist/assets/ComposeEmailForm-DUyJM2FF.js +0 -1
  192. modoboa/frontend_dist/assets/ComposeEmailView-Byvgy2YX.js +0 -1
  193. modoboa/frontend_dist/assets/ConnectedLayout-Bxh21hcH.css +0 -1
  194. modoboa/frontend_dist/assets/ConnectedLayout-C-YqPGtT.js +0 -1
  195. modoboa/frontend_dist/assets/CreationForm-oDKUwmFm.js +0 -1
  196. modoboa/frontend_dist/assets/DashboardView-D_WPdBgH.js +0 -1
  197. modoboa/frontend_dist/assets/DomainAdminList-Bv43h5YQ.js +0 -1
  198. modoboa/frontend_dist/assets/DomainEditView-wXBS3A63.js +0 -1
  199. modoboa/frontend_dist/assets/DomainView-DZn2Rzef.js +0 -5
  200. modoboa/frontend_dist/assets/DomainsView-BJIxWiDj.js +0 -1
  201. modoboa/frontend_dist/assets/EmailField-CFNREcuM.js +0 -1
  202. modoboa/frontend_dist/assets/EmailView-CAukleod.js +0 -1
  203. modoboa/frontend_dist/assets/EmptyLayout-CgltY47x.js +0 -1
  204. modoboa/frontend_dist/assets/FiltersView-COwmHjdx.js +0 -1
  205. modoboa/frontend_dist/assets/ForwardEmailView-DxNEqmlZ.js +0 -1
  206. modoboa/frontend_dist/assets/HtmlEditor-CSRAxVCo.js +0 -93
  207. modoboa/frontend_dist/assets/IdentitiesView-ChlrCGeN.js +0 -1
  208. modoboa/frontend_dist/assets/InformationView-Cq0mfs4D.js +0 -1
  209. modoboa/frontend_dist/assets/MailboxView-CfStlWhk.css +0 -1
  210. modoboa/frontend_dist/assets/MailboxView-Xo1djG8R.js +0 -1
  211. modoboa/frontend_dist/assets/MenuItems-Cm9c9dyI.js +0 -1
  212. modoboa/frontend_dist/assets/MessageView-D0810wvi.js +0 -1
  213. modoboa/frontend_dist/assets/MessagesView-D-BBhhOJ.js +0 -1
  214. modoboa/frontend_dist/assets/MigrationsView-B-OvKVxP.js +0 -1
  215. modoboa/frontend_dist/assets/ParametersView-CMunpHG1.js +0 -1
  216. modoboa/frontend_dist/assets/ParametersView-jdeMts_I.js +0 -1
  217. modoboa/frontend_dist/assets/ProviderEditView-CFm5-K3j.js +0 -1
  218. modoboa/frontend_dist/assets/ProviderGeneralForm-jpkQRqL5.js +0 -1
  219. modoboa/frontend_dist/assets/ProvidersView-D5UWPOH9.js +0 -1
  220. modoboa/frontend_dist/assets/ProvidersView-D_ER4F1h.css +0 -1
  221. modoboa/frontend_dist/assets/QuarantineLayout-DbM_Wx4I.js +0 -1
  222. modoboa/frontend_dist/assets/QuarantineView-B2tBwskg.js +0 -1
  223. modoboa/frontend_dist/assets/ReplyEmailView-Deogiaa7.js +0 -1
  224. modoboa/frontend_dist/assets/SelfServiceLayout-De0pXOuH.js +0 -1
  225. modoboa/frontend_dist/assets/SettingsView-BUd1HmFo.js +0 -6
  226. modoboa/frontend_dist/assets/StatisticsView-DYzFg6_F.js +0 -1
  227. modoboa/frontend_dist/assets/TimeSerieChart-DeItUg1R.js +0 -1
  228. modoboa/frontend_dist/assets/TimeSerieChart-Dn6Wznn8.css +0 -1
  229. modoboa/frontend_dist/assets/UserLayout-CzNQqfm5.js +0 -1
  230. modoboa/frontend_dist/assets/VAlert-mUmhR_lW.js +0 -1
  231. modoboa/frontend_dist/assets/VApp-D-widb3i.js +0 -1
  232. modoboa/frontend_dist/assets/VApp-DwhR0sAF.css +0 -1
  233. modoboa/frontend_dist/assets/VAutocomplete-6cfcsvjI.js +0 -1
  234. modoboa/frontend_dist/assets/VAutocomplete-CPd3yAvV.css +0 -1
  235. modoboa/frontend_dist/assets/VAvatar-BAW2MRci.js +0 -1
  236. modoboa/frontend_dist/assets/VAvatar-DXG1YGB5.css +0 -1
  237. modoboa/frontend_dist/assets/VBadge-D1u6z0HB.js +0 -1
  238. modoboa/frontend_dist/assets/VCard-DI9bqjLN.js +0 -1
  239. modoboa/frontend_dist/assets/VCheckbox-CFYky8Vk.js +0 -1
  240. modoboa/frontend_dist/assets/VChip-C2Lh9BaB.js +0 -1
  241. modoboa/frontend_dist/assets/VChip-D0iltsFo.css +0 -1
  242. modoboa/frontend_dist/assets/VColorPicker-C-5tY_au.js +0 -1
  243. modoboa/frontend_dist/assets/VColorPicker-C5_3l312.css +0 -1
  244. modoboa/frontend_dist/assets/VDataTable-CJyX7uj5.css +0 -1
  245. modoboa/frontend_dist/assets/VDataTable-ClNLUB1Q.js +0 -1
  246. modoboa/frontend_dist/assets/VDataTableServer-DnuQ8rkQ.js +0 -1
  247. modoboa/frontend_dist/assets/VDataTableVirtual-CbOL_PbK.js +0 -1
  248. modoboa/frontend_dist/assets/VDialog-CqMQCPwz.js +0 -1
  249. modoboa/frontend_dist/assets/VExpansionPanels-Cf4WPRqX.js +0 -1
  250. modoboa/frontend_dist/assets/VExpansionPanels-RsCANmDP.css +0 -1
  251. modoboa/frontend_dist/assets/VFileInput-CvKkPeTl.js +0 -1
  252. modoboa/frontend_dist/assets/VForm-DUC3-Taa.js +0 -1
  253. modoboa/frontend_dist/assets/VGrid-Cb7FdSrp.css +0 -1
  254. modoboa/frontend_dist/assets/VInput-B6b2s-5B.js +0 -1
  255. modoboa/frontend_dist/assets/VMenu-CxE66Rh1.css +0 -1
  256. modoboa/frontend_dist/assets/VMenu-sBFHa2zz.js +0 -1
  257. modoboa/frontend_dist/assets/VPicker-CfsXFhHv.css +0 -1
  258. modoboa/frontend_dist/assets/VPicker-DTZ3WsV_.js +0 -1
  259. modoboa/frontend_dist/assets/VProgressCircular-BOPNpUlJ.js +0 -1
  260. modoboa/frontend_dist/assets/VProgressCircular-BPJdTVu4.css +0 -1
  261. modoboa/frontend_dist/assets/VRadioGroup-G9uvkWom.js +0 -1
  262. modoboa/frontend_dist/assets/VSelect-BdxqTzW5.js +0 -1
  263. modoboa/frontend_dist/assets/VSelect-SEzwNEUK.css +0 -1
  264. modoboa/frontend_dist/assets/VSelectionControl-BHD9kDEZ.js +0 -1
  265. modoboa/frontend_dist/assets/VSheet-DRQqJmTV.js +0 -1
  266. modoboa/frontend_dist/assets/VSpacer-Cxcym55r.js +0 -1
  267. modoboa/frontend_dist/assets/VSwitch-bLRfr5zT.js +0 -1
  268. modoboa/frontend_dist/assets/VTable-CHRVGI94.css +0 -1
  269. modoboa/frontend_dist/assets/VTable-CLV2Uv-1.js +0 -1
  270. modoboa/frontend_dist/assets/VTabs-Bv8FUb0o.css +0 -1
  271. modoboa/frontend_dist/assets/VTabs-GZimpcz5.js +0 -1
  272. modoboa/frontend_dist/assets/VTextField-BzBVKKob.css +0 -1
  273. modoboa/frontend_dist/assets/VTextField-Dt3N956g.js +0 -1
  274. modoboa/frontend_dist/assets/VTextarea-BTR7f0gW.css +0 -1
  275. modoboa/frontend_dist/assets/VTextarea-PA2LHtN4.js +0 -1
  276. modoboa/frontend_dist/assets/VToolbar-BxjAEfSk.css +0 -1
  277. modoboa/frontend_dist/assets/VToolbar-Du_s_183.js +0 -1
  278. modoboa/frontend_dist/assets/VWindowItem-CBUkz4P7.js +0 -1
  279. modoboa/frontend_dist/assets/VWindowItem-CWBhiE_Y.css +0 -1
  280. modoboa/frontend_dist/assets/WebmailLayout-BnRwSunS.js +0 -1
  281. modoboa/frontend_dist/assets/WebmailLayout-UlftFiiT.css +0 -1
  282. modoboa/frontend_dist/assets/filter-fudwgMWN.js +0 -1
  283. modoboa/frontend_dist/assets/forwardRefs-DDY5bVRf.js +0 -1
  284. modoboa/frontend_dist/assets/forwardRefs-i-22bMcD.css +0 -1
  285. modoboa/frontend_dist/assets/index-Be6X7UaJ.js +0 -982
  286. modoboa/frontend_dist/assets/index-DuzUMVLM.js +0 -1
  287. modoboa/frontend_dist/assets/layout-DD534hN7.js +0 -1
  288. modoboa/frontend_dist/assets/transports-K6Dg3jL3.js +0 -1
  289. modoboa/frontend_dist/assets/webmail-Dtit1NLT.js +0 -1
  290. {modoboa-2.6.2.data → modoboa-2.6.4.data}/scripts/modoboa-admin.py +0 -0
  291. {modoboa-2.6.2.dist-info → modoboa-2.6.4.dist-info}/WHEEL +0 -0
  292. {modoboa-2.6.2.dist-info → modoboa-2.6.4.dist-info}/entry_points.txt +0 -0
  293. {modoboa-2.6.2.dist-info → modoboa-2.6.4.dist-info}/licenses/LICENSE +0 -0
  294. {modoboa-2.6.2.dist-info → modoboa-2.6.4.dist-info}/top_level.txt +0 -0
@@ -647,6 +647,11 @@ class AliasAPITestCase(ModoAPITestCase):
647
647
  response = response.json()
648
648
  self.assertEqual(len(response), 3)
649
649
 
650
+ response = self.client.get(f"{url}?domain=test2.com")
651
+ self.assertEqual(response.status_code, 200)
652
+ response = response.json()
653
+ self.assertEqual(len(response), 0)
654
+
650
655
  def test_get_alias(self):
651
656
  """Retrieve an alias."""
652
657
  al = models.Alias.objects.get(address="alias@test.com")
@@ -192,6 +192,18 @@ class AccountViewSet(
192
192
  return Response(body)
193
193
 
194
194
 
195
+ class AliasFilter(dj_filters.FilterSet):
196
+
197
+ domain = dj_filters.ModelChoiceFilter(
198
+ queryset=lambda request: models.Domain.objects.get_for_admin(request.user),
199
+ to_field_name="name",
200
+ )
201
+
202
+ class Meta:
203
+ model = models.Alias
204
+ fields = ["domain"]
205
+
206
+
195
207
  class AliasViewSet(
196
208
  GetThrottleViewsetMixin, lib_viewsets.RevisionModelMixin, viewsets.ModelViewSet
197
209
  ):
@@ -200,6 +212,10 @@ class AliasViewSet(
200
212
  Create a new alias instance.
201
213
  """
202
214
 
215
+ filter_backends = [
216
+ dj_filters.DjangoFilterBackend,
217
+ ]
218
+ filterset_class = AliasFilter
203
219
  permission_classes = [
204
220
  IsAuthenticated,
205
221
  DjangoModelPermissions,
@@ -209,14 +225,12 @@ class AliasViewSet(
209
225
  def get_queryset(self):
210
226
  """Filter queryset based on current user."""
211
227
  user = self.request.user
228
+ if user is None or user.is_anonymous:
229
+ return models.Alias.objects.none()
212
230
  ids = user.objectaccess_set.filter(
213
231
  content_type=ContentType.objects.get_for_model(models.Alias)
214
232
  ).values_list("object_id", flat=True)
215
- queryset = models.Alias.objects.filter(pk__in=ids)
216
- domain = self.request.query_params.get("domain")
217
- if domain:
218
- queryset = queryset.filter(domain__name=domain)
219
- return queryset
233
+ return models.Alias.objects.filter(pk__in=ids, internal=False)
220
234
 
221
235
 
222
236
  class SenderAddressFilterSet(dj_filters.FilterSet):
@@ -521,7 +521,8 @@ class WritableAccountSerializer(v1_serializers.WritableAccountSerializer):
521
521
  if not param_tools.get_global_parameter("enable_admin_limits", app="limits"):
522
522
  return
523
523
  del self.fields["domains"]
524
- if self.context["request"].user.role in ["Resellers", "SuperAdmins"]:
524
+ user = self.context["request"].user
525
+ if not user.is_anonymous and user.role in ["Resellers", "SuperAdmins"]:
525
526
  self.fields["resources"] = WritableResourceSerializer(
526
527
  many=True, required=False
527
528
  )
@@ -725,10 +726,14 @@ class AliasSerializer(v1_serializers.AliasSerializer):
725
726
  class UserForwardSerializer(serializers.Serializer):
726
727
  """Serializer to define user forward."""
727
728
 
728
- recipients = serializers.CharField(required=False)
729
+ recipients = serializers.CharField(
730
+ required=False, allow_blank=True, allow_null=True
731
+ )
729
732
  keepcopies = serializers.BooleanField(default=False)
730
733
 
731
734
  def validate_recipients(self, value):
735
+ if not value:
736
+ return value
732
737
  value = value.strip()
733
738
  recipients = []
734
739
  if not value:
@@ -727,12 +727,24 @@ class UserAccountViewSetTestCase(ModoAPITestCase):
727
727
  url = reverse("v2:user_account-forward")
728
728
  resp = self.client.get(url)
729
729
  self.assertEqual(resp.status_code, 200)
730
- self.assertNotIn("recipients", resp.json())
730
+ self.assertIs(resp.json()["recipients"], None)
731
+ self.assertEqual(
732
+ models.Alias.objects.filter(
733
+ internal=False, address=self.da.username
734
+ ).count(),
735
+ 0,
736
+ )
731
737
 
732
738
  data = {"recipients": "user@domain.ext"}
733
739
  resp = self.client.post(url, data, format="json")
734
740
  self.assertEqual(resp.status_code, 200)
735
741
  self.assertEqual(self.da.mailbox.aliasrecipient_set.count(), 1)
742
+ self.assertEqual(
743
+ models.Alias.objects.filter(
744
+ internal=False, address=self.da.username
745
+ ).count(),
746
+ 1,
747
+ )
736
748
 
737
749
  data = {"recipients": "user@domain.ext", "keepcopies": True}
738
750
  resp = self.client.post(url, data, format="json")
@@ -753,6 +765,16 @@ class UserAccountViewSetTestCase(ModoAPITestCase):
753
765
  models.Alias.objects.filter(address=self.da.username).count(), 1
754
766
  )
755
767
 
768
+ data = {"recipients": "", "keepcopies": False}
769
+ resp = self.client.post(url, data, format="json")
770
+ self.assertEqual(resp.status_code, 200)
771
+ self.assertEqual(
772
+ models.Alias.objects.filter(
773
+ internal=False, address=self.da.username
774
+ ).count(),
775
+ 0,
776
+ )
777
+
756
778
 
757
779
  class AlarmViewSetTestCase(ModoAPITestCase):
758
780
  @classmethod
@@ -74,7 +74,9 @@ class DomainViewSet(
74
74
 
75
75
  def get_queryset(self):
76
76
  """Filter queryset based on current user."""
77
- return models.Domain.objects.get_for_admin(self.request.user)
77
+ if self.request.user and not self.request.user.is_anonymous:
78
+ return models.Domain.objects.get_for_admin(self.request.user)
79
+ return models.Domain.objects.none()
78
80
 
79
81
  def get_serializer_class(self, *args, **kwargs):
80
82
  if self.action == "delete":
@@ -198,6 +200,8 @@ class AccountViewSet(v1_viewsets.AccountViewSet):
198
200
  def get_queryset(self):
199
201
  """Filter queryset based on current user."""
200
202
  user = self.request.user
203
+ if not user or user.is_anonymous:
204
+ return core_models.User.objects.none()
201
205
  ids = user.objectaccess_set.filter(
202
206
  content_type=ContentType.objects.get_for_model(user)
203
207
  ).values_list("object_id", flat=True)
@@ -271,14 +275,27 @@ class IdentityViewSet(GetThrottleViewsetMixin, viewsets.ViewSet):
271
275
  return response.Response({"status": status, "message": msg})
272
276
 
273
277
 
278
+ class AliasFilter(dj_filters.FilterSet):
279
+
280
+ domain = dj_filters.ModelChoiceFilter(
281
+ queryset=lambda request: models.Domain.objects.get_for_admin(request.user),
282
+ to_field_name="name",
283
+ )
284
+
285
+ class Meta:
286
+ model = models.Alias
287
+ fields = ["domain"]
288
+
289
+
274
290
  class AliasViewSet(v1_viewsets.AliasViewSet):
275
291
  """Viewset for Alias."""
276
292
 
277
- filter_backends = (
293
+ filter_backends = [
294
+ dj_filters.DjangoFilterBackend,
278
295
  filters.OrderingFilter,
279
296
  filters.SearchFilter,
280
- dj_filters.DjangoFilterBackend,
281
- )
297
+ ]
298
+ filterset_class = AliasFilter
282
299
  pagination_class = pagination.CustomPageNumberPagination
283
300
  search_fields = ["address"]
284
301
  serializer_class = serializers.AliasSerializer
@@ -391,6 +408,8 @@ class AlarmViewSet(
391
408
  serializer_class = serializers.AlarmSerializer
392
409
 
393
410
  def get_queryset(self):
411
+ if self.request.user.is_anonymous:
412
+ return models.Alarm.objects.none()
394
413
  return (
395
414
  models.Alarm.objects.select_related("domain")
396
415
  .filter(domain__in=models.Domain.objects.get_for_admin(self.request.user))
modoboa/admin/handlers.py CHANGED
@@ -236,11 +236,6 @@ def import_account_mailbox(sender, user, account, row, **kwargs):
236
236
  sender="import", context=domain, object_type="mailboxes"
237
237
  )
238
238
  account.save()
239
- qset = models.Mailbox.objects.filter(address=mailbox, domain=domain)
240
- if qset.exists():
241
- raise exceptions.Conflict(
242
- _("Mailbox {} already exists").format(account.email)
243
- )
244
239
  if len(row) == 1:
245
240
  quota = None
246
241
  else:
@@ -274,16 +269,16 @@ def grant_access_to_all_objects(sender, account, role, **kwargs):
274
269
  """Grant all permissions if new role is SuperAdmin."""
275
270
  if role != "SuperAdmins":
276
271
  return
277
- perm_models = [
278
- core_models.User,
279
- models.Domain,
280
- models.DomainAlias,
281
- models.Mailbox,
282
- models.Alias,
272
+ querysets = [
273
+ core_models.User.objects.all(),
274
+ models.Domain.objects.all(),
275
+ models.DomainAlias.objects.all(),
276
+ models.Mailbox.objects.all(),
277
+ models.Alias.objects.filter(internal=False),
283
278
  ]
284
- for model in perm_models:
279
+ for queryset in querysets:
285
280
  permissions.grant_access_to_objects(
286
- account, model.objects.all(), ContentType.objects.get_for_model(model)
281
+ account, queryset, ContentType.objects.get_for_model(queryset.model)
287
282
  )
288
283
 
289
284
 
@@ -35,7 +35,7 @@ class ImportCommand(BaseCommand):
35
35
  help="Continue even if an entry already exists.",
36
36
  )
37
37
  parser.add_argument(
38
- "--crypt-password",
38
+ "--crypt-passwords",
39
39
  action="store_true",
40
40
  default=False,
41
41
  help="Encrypt provided passwords.",
@@ -56,7 +56,7 @@ def sometimes_objects_have_no_owner(**options):
56
56
  User.objects.all(),
57
57
  models.Domain.objects.all(),
58
58
  models.DomainAlias.objects.all(),
59
- models.Alias.objects.filter(domain__isnull=False),
59
+ models.Alias.objects.filter(internal=False, domain__isnull=False),
60
60
  models.Mailbox.objects.filter(domain__isnull=False),
61
61
  )
62
62
  for qs in owned_models:
@@ -105,7 +105,7 @@ def is_alias_target_allowed(domain: str) -> bool:
105
105
  return False
106
106
  else:
107
107
  allowed_domains = params.get("alias_target_allow_list")
108
- if allowed_domains and domain not in convert_to_list(allowed_domains):
108
+ if not allowed_domains or domain not in convert_to_list(allowed_domains):
109
109
  return False
110
110
  return True
111
111
 
@@ -257,7 +257,7 @@ class Domain(mixins.MessageLimitMixin, AdminObject):
257
257
  continue
258
258
  grant_access_to_object(account, mb)
259
259
  grant_access_to_object(account, mb.user)
260
- for al in self.alias_set.all():
260
+ for al in self.alias_set.filter(internal=False):
261
261
  grant_access_to_object(account, al)
262
262
 
263
263
  def remove_admin(self, account):
@@ -28,6 +28,18 @@ class AliasTargetSettingsTestCase(ModoAPITestCase):
28
28
  self.assertEqual(resp.status_code, 400)
29
29
  self.assertEqual(resp.json()["error"], "Target domain not allowed: bad.com")
30
30
 
31
+ def test_block_external_domains(self):
32
+ self.set_global_parameter("alias_can_target_any_domain", False, app="admin")
33
+ # Now try an external domain, should fail
34
+ values = {
35
+ "address": "list4@test.com",
36
+ "recipients": ["user@bad.com"],
37
+ "enabled": True,
38
+ }
39
+ resp = self.client.post(reverse("v2:alias-list"), values, format="json")
40
+ self.assertEqual(resp.status_code, 400)
41
+ self.assertEqual(resp.json()["error"], "Target domain not allowed: bad.com")
42
+
31
43
  def test_allow_only_list_when_any_disallowed(self):
32
44
  # alias_can_target_any_domain = False and allow list contains domain
33
45
  self.set_global_parameter("alias_can_target_any_domain", False, app="admin")
@@ -0,0 +1 @@
1
+ account; user1@test.com; toto; User; One; True; SimpleUsers; user1@test.com; 0
@@ -328,3 +328,11 @@ alias; alias1@test.com; True; user1@test.com
328
328
  self.assertTrue(ex_message.startswith("Object already exists"))
329
329
 
330
330
  call_command("modo", "import", "--continue-if-exists", test_file)
331
+
332
+ def test_import_accounts(self):
333
+ test_file = os.path.join(
334
+ os.path.dirname(__file__), "test_data/import_accounts.csv"
335
+ )
336
+ call_command("modo", "import", "--crypt-passwords", test_file)
337
+ user = User.objects.get(username="user1@test.com")
338
+ self.assertTrue(user.check_password("toto"))
@@ -20,7 +20,7 @@ class RepairTestCase(ModoTestCase):
20
20
  """Check that command works fine."""
21
21
  ObjectAccess.objects.all().delete()
22
22
  mbox = models.Mailbox.objects.first()
23
- alias = models.Alias.objects.first()
23
+ alias = models.Alias.objects.filter(internal=False).first()
24
24
  # assert mbox has no owner
25
25
  self.assertIs(get_object_owner(mbox), None)
26
26
  # fix it. run in quiet mode because we dont want output in tests
@@ -53,7 +53,7 @@ class RepairTestCase(ModoTestCase):
53
53
  count, detail = models.Alias.objects.filter(
54
54
  address="user@test.com", internal=True
55
55
  ).delete()
56
- self.assertEqual(count, 3)
56
+ self.assertEqual(count, 2)
57
57
  ret = management.call_command("modo", "repair", "--quiet")
58
58
  assert ret is None
59
59
  self.assertTrue(
@@ -23,7 +23,9 @@ class Caldav_Backend(CalendarBackend):
23
23
  """Constructor."""
24
24
  super().__init__(calendar)
25
25
  server_url = smart_str(param_tools.get_global_parameter("server_location"))
26
- self.client = caldav.DAVClient(server_url, username=username, password=password)
26
+ self.client = caldav.DAVClient(
27
+ server_url, username=username, password=str(password)
28
+ )
27
29
  if self.calendar:
28
30
  self.remote_cal = Calendar(self.client, calendar.encoded_path)
29
31
 
modoboa/core/checks.py CHANGED
@@ -100,6 +100,11 @@ def check_dovecot_oauth_app(*args, **kwargs):
100
100
 
101
101
  @register(deploy=True)
102
102
  def check_radicale_oauth_app(*args, **kwargs):
103
+ if (
104
+ "modoboa.contacts" not in settings.MODOBOA_APPS
105
+ and "modoboa.calendars" not in settings.MODOBOA_APPS
106
+ ):
107
+ return []
103
108
  error = []
104
109
  if not oauth_app_exists("Radicale"):
105
110
  error.append(E002)
@@ -71,6 +71,7 @@ INSTALLED_APPS = (
71
71
  'corsheaders',
72
72
  'rest_framework',
73
73
  'rest_framework.authtoken',
74
+ 'django_filters',
74
75
  'drf_spectacular',
75
76
  'phonenumber_field',
76
77
  'django_otp',
@@ -246,6 +247,9 @@ SPECTACULAR_SETTINGS = {
246
247
  'TITLE': 'Modoboa API',
247
248
  'VERSION': None,
248
249
  'SERVE_AUTHENTICATION': [],
250
+ 'DEFAULT_FILTER_INSPECTORS': [
251
+ 'drf_spectacular.contrib.django_filters.DjangoFilterBackendInspector',
252
+ ],
249
253
  }
250
254
 
251
255
  # Modoboa settings
@@ -72,3 +72,30 @@ class CheckSessionCookieSecureTest(SimpleModoTestCase):
72
72
  )
73
73
  msgs = checks.check_radicale_oauth_app()
74
74
  self.assertEqual(len(msgs), 0)
75
+
76
+ @override_settings(
77
+ MODOBOA_APPS=[
78
+ "modoboa",
79
+ "modoboa.core",
80
+ "modoboa.lib",
81
+ "modoboa.admin",
82
+ "modoboa.autoconfig",
83
+ "modoboa.transport",
84
+ "modoboa.relaydomains",
85
+ "modoboa.limits",
86
+ "modoboa.parameters",
87
+ "modoboa.dnstools",
88
+ "modoboa.policyd",
89
+ "modoboa.maillog",
90
+ "modoboa.pdfcredentials",
91
+ "modoboa.dmarc",
92
+ "modoboa.imap_migration",
93
+ "modoboa.autoreply",
94
+ "modoboa.sievefilters",
95
+ "modoboa.webmail",
96
+ ]
97
+ )
98
+ def test_radicale_oauth_app_skipped(self):
99
+ get_application_model().objects.filter(name="Radicale").delete()
100
+ msgs = checks.check_radicale_oauth_app()
101
+ self.assertEqual(len(msgs), 0)
@@ -0,0 +1 @@
1
+ import{C as q}from"./ChoiceField-RDT6XcnX.js";import{u as M,b as S,h as V,i as f,j as _,c as R,o as y,w as h,a as d,f as s,e as U,t as x,k as N,_ as C,z as D,m as j,l as Q,F as T,s as G}from"./index-B1bntsLR.js";import{V as H,a as L}from"./VRow-CuVZGqBj.js";import{V as B}from"./VAlert-CNys_LUS.js";import{c as P}from"./VAvatar-JdJfoK0C.js";import{V as k,r as F}from"./VForm-DkphQD3e.js";import{_ as z}from"./AccountPasswordSubForm-DpADntAL.js";import{E as I}from"./EmailField-DmPc4pyP.js";import{V as E}from"./VTextField-QXQFhKxm.js";import{V as $}from"./VSwitch-Dh_dserW.js";import{u as K}from"./domains.store-D4ZqCQ-O.js";import{a as Y}from"./accounts-DqbBlaLK.js";import{V as J}from"./VSelect-D5IXDPEX.js";const W={class:"headline"},X={class:"mt-4"},Ve={__name:"AccountRoleForm",props:{modelValue:{type:Object,default:null}},setup(g,{expose:w}){const i=M(),{$gettext:l}=S(),v=g,m=V(),c=f(()=>v.modelValue),a=f(()=>i.authUser),p=f(()=>{const r=b.value.find(n=>n.value===c.value.role);return r!==void 0?r.label:""}),e=f(()=>{const r=b.value.find(n=>n.value===c.value.role);return r!==void 0?r.help:""}),b=f(()=>a.value.role===_.SUPER_ADMIN?[...A,...o,...u,...t]:a.value.role===_.DOMAIN_ADMIN?[...A]:a.value.role===_.RESELLER?[...o,...A]:[]),A=[{label:l("Simple user"),value:_.USER,help:l("A user with no privileges but with a mailbox. He will be allowed to use all end-user features: webmail, calendar, contacts, filters.")}],o=[{label:l("Domain administrator"),value:_.DOMAIN_ADMIN,help:l("A user with privileges on one or more domain. He will be allowed to administer mailboxes and he can also have a mailbox.")}],u=[{label:l("Reseller"),value:_.RESELLER,help:l("An intermediate user who has the same privileges than a Domain administrator, plus the possibility to create domains and to assign resources.")}],t=[{label:l("Super administrator"),value:_.SUPER_ADMIN,help:l("A user with all privileges, can do anything. By default, such a user does not have a mailbox so he can't access end-user features.")}];return w({vFormRef:m,roleLabel:p}),(r,n)=>(y(),R(k,{ref_key:"vFormRef",ref:m},{default:h(()=>[d(H,null,{default:h(()=>[d(L,{cols:"7"},{default:h(()=>[d(s(q),{modelValue:c.value.role,"onUpdate:modelValue":n[0]||(n[0]=O=>c.value.role=O),label:s(l)("Choose a role"),choices:b.value,"choices-per-line":2},null,8,["modelValue","label","choices"])]),_:1}),d(L,{cols:"5"},{default:h(()=>[d(B,{color:"primary",class:"mt-11 ml-4 rounded-lg"},{default:h(()=>[U("h3",W,x(p.value),1),U("p",X,x(e.value),1),d(P,{color:"white",class:"float-right",size:"large",icon:"mdi-help-circle-outline"})]),_:1})]),_:1})]),_:1})]),_:1},512))}},Z={class:"m-label"},ee={class:"m-label"},ae={class:"m-label"},he={__name:"AccountGeneralForm",props:{modelValue:{type:Object,default:null},editing:{type:Boolean,default:!1}},setup(g,{expose:w}){const{$gettext:i}=S(),l=M(),v=g,m=V(),c=V({}),a=f(()=>v.modelValue),p=f(()=>a.value.role===_.USER?i("Enter an email address"):i("Enter a simple username or an email address")),e=f(()=>a.value.role===_.USER?"email":"text");function b(){a.value.username.indexOf("@")!==-1&&(a.value.mailbox.full_address=a.value.username,a.value.mailbox.message_limit=null)}return w({vFormRef:m,formErrors:c}),(A,o)=>(y(),R(k,{ref_key:"vFormRef",ref:m},{default:h(()=>[U("label",Z,x(s(i)("Username")),1),d(I,{ref:"username",modelValue:a.value.username,"onUpdate:modelValue":[o[0]||(o[0]=u=>a.value.username=u),b],placeholder:p.value,type:e.value,rules:e.value==="email"?[s(F).required,s(F).email]:[s(F).required],role:a.value.role,"error-msg":c.value.value?c.value.value.username:[]},null,8,["modelValue","placeholder","type","rules","role","error-msg"]),U("label",ee,x(s(i)("First name")),1),d(E,{modelValue:a.value.first_name,"onUpdate:modelValue":o[1]||(o[1]=u=>a.value.first_name=u),autocomplete:"new-password",variant:"outlined",density:"compact"},null,8,["modelValue"]),U("label",ae,x(s(i)("Last name")),1),d(E,{modelValue:a.value.last_name,"onUpdate:modelValue":o[2]||(o[2]=u=>a.value.last_name=u),autocomplete:"new-password",variant:"outlined",density:"compact"},null,8,["modelValue"]),s(l).authUser.pk!==a.value.pk?(y(),R(z,{key:0,ref:"passwordForm",modelValue:a.value,"onUpdate:modelValue":o[3]||(o[3]=u=>a.value=u),editing:g.editing,"form-errors":c.value},null,8,["modelValue","editing","form-errors"])):(y(),R(B,{key:1,type:"info",variant:"tonal",class:"py-2"},{default:h(()=>[N(x(s(i)("You can update your password from the Account section")),1)]),_:1})),d($,{modelValue:a.value.is_active,"onUpdate:modelValue":o[4]||(o[4]=u=>a.value.is_active=u),label:s(i)("Enabled"),density:"compact",color:"primary"},null,8,["modelValue","label"])]),_:1},512))}},le={class:"m-label"},oe={class:"m-label"},te={__name:"AccountMailboxForm",props:{modelValue:{type:Object,default:null}},emits:["update:modelValue"],setup(g,{expose:w,emit:i}){const{$gettext:l}=S(),v=i,m=g,c=K(),a=f(()=>c.domains),p=V(),e=V({mailbox:{}});D(m.modelValue,t=>{t?(e.value={...t},e.value.role===_.USER&&(e.value.mailbox||(e.value.mailbox={}),e.value.mailbox.full_address=e.value.username),e.value.mailbox.message_limit===""&&(e.value.mailbox.message_limit=null)):e.value={mailbox:{}}},{immediate:!0}),D(e,t=>{v("update:modelValue",t)},{deep:!0});const b=f(()=>{const t=e.value.mailbox.full_address;if(t&&t.indexOf("@")!==-1){const r=a.value.find(n=>n.name===t.split("@")[1]);if(r)return parseInt(r.default_mailbox_quota)}}),A=f(()=>{let t=l("Use domain default value");return b.value!==void 0&&(b.value===0?t+=` (${l("unlimited")})`:t+=` (${b.value} MB)`),t});function o(t){t&&delete e.value.mailbox.quota}function u(t){t===""&&(e.value.mailbox.message_limit=null)}return w({vFormRef:p}),(t,r)=>(y(),R(k,{ref_key:"vFormRef",ref:p},{default:h(()=>[U("label",le,x(s(l)("Quota")),1),d($,{modelValue:e.value.mailbox.use_domain_quota,"onUpdate:modelValue":[r[0]||(r[0]=n=>e.value.mailbox.use_domain_quota=n),o],label:A.value,color:"primary"},null,8,["modelValue","label"]),e.value.mailbox.use_domain_quota?j("",!0):(y(),R(E,{key:0,modelValue:e.value.mailbox.quota,"onUpdate:modelValue":r[1]||(r[1]=n=>e.value.mailbox.quota=n),placeholder:s(l)("Ex: 10MB. Leave empty for no limit"),hint:s(l)("Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators)."),"persistent-hint":"",variant:"outlined",density:"compact"},null,8,["modelValue","placeholder","hint"])),U("label",oe,x(s(l)("Daily message sending limit")),1),d(E,{modelValue:e.value.mailbox.message_limit,"onUpdate:modelValue":[r[2]||(r[2]=n=>e.value.mailbox.message_limit=n),u],placeholder:s(l)("Leave empty for no limit"),hint:s(l)("Number of messages this mailbox can send per day. Leave empty for no limit."),"persistent-hint":"",variant:"outlined",density:"compact",rules:[s(F).numericOrNull]},null,8,["modelValue","placeholder","hint","rules"]),d($,{modelValue:e.value.mailbox.is_send_only,"onUpdate:modelValue":r[3]||(r[3]=n=>e.value.mailbox.is_send_only=n),label:s(l)("Send only account"),density:"compact",color:"primary"},null,8,["modelValue","label"])]),_:1},512))}},xe=C(te,[["__scopeId","data-v-41714779"]]),ye={__name:"AccountAliasForm",props:{modelValue:{type:Object,default:null}},setup(g,{expose:w}){const{$gettext:i}=S(),l=g,v=f(()=>l.modelValue),m=V(""),c=V(),a=V(),p=V(!1),e=V([]);async function b(){if(e.value=[],p.value=!0,v.value.aliases.indexOf(m.value)!==-1){e.value=[i("Alias already added")],m.value="",p.value=!1;return}try{await Y.validate({aliases:[m.value],mailbox:v.value.mailbox}),v.value.aliases.push(m.value),m.value="",a.value.resetValidation()}catch(o){o.response.data.aliases?o.response.data.aliases:o.response.data.non_field_errors&&o.response.data.non_field_errors}finally{p.value=!1}}function A(o){v.value.aliases.splice(o,1)}return w({vFormRef:a}),(o,u)=>(y(),R(k,{ref_key:"vFormRef",ref:a},{default:h(()=>[d(s(I),{ref_key:"aliasField",ref:c,modelValue:m.value,"onUpdate:modelValue":u[0]||(u[0]=t=>m.value=t),placeholder:s(i)("Start typing a name here..."),hint:s(i)("Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld)."),"persistent-hint":"",loading:p.value,"error-msg":e.value,onDomainSelected:b},null,8,["modelValue","placeholder","hint","loading","error-msg"]),(y(!0),Q(T,null,G(v.value.aliases,(t,r)=>(y(),R(J,{key:r,class:"mr-2 mt-2",closable:"","onClick:close":n=>A(r)},{default:h(()=>[N(x(t),1)]),_:2},1032,["onClick:close"]))),128))]),_:1},512))}};export{xe as A,ye as _,he as a,Ve as b};
@@ -0,0 +1 @@
1
+ import{A as ee,h as c,c as m,o as t,w as e,e as _,a as l,t as s,f as n,b as W,u as le,n as ae,B as oe,q as te,i as D,j as I,d as se,z as ue,g as re,l as y,m as V,k as f,F as O,_ as ne}from"./index-B1bntsLR.js";import{b as de,a as ie,A as me,_ as fe}from"./AccountAliasForm-tLHotdIR.js";import{r as ce,V as _e}from"./VForm-DkphQD3e.js";import{V as ve}from"./VAutocomplete-Huaz_-hf.js";import{V as H}from"./VTextField-QXQFhKxm.js";import{u as X}from"./language.store-_-zrrEiS.js";import{_ as pe}from"./ResourcesForm-D0YBapCG.js";import{L as ge}from"./LoadingData-Tm56XNwj.js";import{a as J}from"./accounts-DqbBlaLK.js";import{p as ye}from"./parameters-BxAXBXU1.js";import{u as Ve}from"./permissions-cSkGqV3M.js";import{d as w,c as C,V as K}from"./VAvatar-JdJfoK0C.js";import{V as h,c as A,a as E,b as be}from"./VExpansionPanels-BeMgiS7A.js";import{V as v,a as i}from"./VRow-CuVZGqBj.js";import{V as ke,a as xe}from"./VToolbar-CyrYSqJZ.js";import"./ChoiceField-RDT6XcnX.js";import"./VAlert-CNys_LUS.js";import"./VProgressCircular-DTDGzl2O.js";import"./tag-BmV84V2s.js";import"./AccountPasswordSubForm-DpADntAL.js";import"./VSwitch-Dh_dserW.js";import"./VInput-CbqehdOu.js";import"./VSelectionControl-uKY9Zull.js";import"./VMenu-B6SCtOwT.js";import"./ssrBoot-05WtbG6H.js";import"./EmailField-DmPc4pyP.js";import"./domains.store-D4ZqCQ-O.js";import"./domains-CSxtTvUh.js";import"./VSelect-D5IXDPEX.js";import"./VCheckboxBtn-Ccl786Rg.js";import"./filter-DHKXX97M.js";import"./languages-CxjoT69j.js";import"./VContainer-DKMcKasC.js";/* empty css */const Fe={class:"m-label"},we={class:"m-label"},he={class:"m-label"},Ae={__name:"AccountProfileForm",props:{modelValue:{type:Object},modelModifiers:{}},emits:["update:modelValue"],setup(T,{expose:x}){const p=ee(T,"modelValue"),d=X(),U=c(""),$=c();return x({vFormRef:$}),(b,g)=>(t(),m(_e,{ref_key:"vFormRef",ref:$},{default:e(()=>[_("label",Fe,s(b.$gettext("Language")),1),l(ve,{modelValue:p.value.language,"onUpdate:modelValue":g[0]||(g[0]=k=>p.value.language=k),items:n(d).availableLanguages,"item-title":"label","item-value":"code",variant:"outlined",density:"compact","error-messages":U.value},null,8,["modelValue","items","error-messages"]),_("label",we,s(b.$gettext("Phone number")),1),l(H,{modelValue:p.value.phone_number,"onUpdate:modelValue":g[1]||(g[1]=k=>p.value.phone_number=k),variant:"outlined",density:"compact"},null,8,["modelValue"]),_("label",he,s(b.$gettext("Secondary email")),1),l(H,{modelValue:p.value.secondary_email,"onUpdate:modelValue":g[2]||(g[2]=k=>p.value.secondary_email=k),variant:"outlined",density:"compact",rules:[n(ce).emailOrNull]},null,8,["modelValue","rules"])]),_:1},512))}},Ee={key:1},Ue={key:0},$e={key:0},Re={class:"mr-2"},Se={class:"mr-2"},Ne={key:0},Le={class:"mr-2"},Pe={key:0},Ce={class:"mr-2"},Te={class:"mr-2"},Be={class:"mr-2"},Me={key:0},je={class:"mr-2"},De={key:0},Ie={class:"mr-2"},Oe={class:"mr-2"},qe={class:"mt-4 d-flex justify-end"},Ge={__name:"AccountEditForm",async setup(T){let x,p;const{$gettext:d}=W(),U=le(),{displayNotification:$}=ae(),b=X(),g=oe(),k=te(),{canSetRole:B}=Ve(),a=c({pk:g.params.id}),R=D(()=>a.value.username&&a.value.username.indexOf("@")!==-1),M=D(()=>{const o=j.value.params&&j.value.params.enable_admin_limits&&a.value.role!==I.USER&&a.value.role!==I.SUPER_ADMIN;return o===void 0?!1:o}),j=c({}),S=c(0),F=c(!1),N=c(!1),L=c(),q=c(),G=c(),Q=c(),P=c(),z=c(),Y=D(()=>{const o={roleForm:L,generalForm:q,profileForm:z};return R.value&&(o.aliasForm=Q,o.mailboxForm=G),M.value&&(o.resourcesForm=P),o});async function Z(){N.value=!1,S.value=[];for(const[o,r]of Object.entries(Y.value))if(r.value!=null){const{valid:u}=await r.value.vFormRef.validate();u||(N.value=!0,S.value.push(o))}if(!N.value){F.value=!0;try{const o={...a.value};R.value?o.mailbox.full_address=o.username:o.mailbox&&delete o.mailbox.full_address,o.new_password&&(o.password=o.new_password,delete o.new_password,delete o.password_confirmation),M.value&&P.value!==null&&(o.resources=P.value.getPayload()),o.aliases===null&&delete o.aliases,B.value||(a.value.pk===U.authUser.pk?o.role=U.authUser.role:o.role=I.USER),await J.patch(a.value.pk,o),$({msg:d("Account updated")}),k.push({name:"AccountDetail",params:{id:g.params.id}})}finally{F.value=!1}}}return se(()=>{J.get(g.params.id).then(o=>{a.value=o.data,F.value=!1}),B.value&&ye.getGlobalApplication("limits").then(o=>{j.value=o.data})}),ue(a,()=>{delete a.value.domains,a.value.mailbox===null&&delete a.value.mailbox},{deep:!0}),b.loaded||([x,p]=re(()=>b.getLanguages()),await x,p()),(o,r)=>F.value?(t(),m(ge,{key:0})):(t(),y("div",Ee,[l(be,{modelValue:S.value,"onUpdate:modelValue":r[6]||(r[6]=u=>S.value=u),multiple:N.value},{default:e(()=>[n(B)?(t(),m(h,{key:0,eager:"",value:"roleForm"},{default:e(()=>[l(A,null,{default:e(({expanded:u})=>[l(v,{"no-gutters":""},{default:e(()=>[l(i,{cols:"4"},{default:e(()=>[f(s(n(d)("Role")),1)]),_:1}),l(i,{cols:"8",class:"text-medium-emphasis"},{default:e(()=>[l(w,{"leave-absolute":""},{default:e(()=>[u?(t(),y("span",Ue)):(t(),m(v,{key:1,"no-gutters":"",style:{width:"100%"}},{default:e(()=>[L.value?(t(),m(i,{key:0,cols:"6"},{default:e(()=>[f(s(L.value.roleLabel),1)]),_:1})):V("",!0)]),_:1}))]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:1}),l(E,null,{default:e(()=>[l(de,{ref_key:"roleForm",ref:L,modelValue:a.value,"onUpdate:modelValue":r[0]||(r[0]=u=>a.value=u)},null,8,["modelValue"])]),_:1})]),_:1})):V("",!0),l(h,{eager:"",value:"generalForm"},{default:e(()=>[l(A,null,{default:e(({expanded:u})=>[l(v,{"no-gutters":""},{default:e(()=>[l(i,{cols:"4"},{default:e(()=>[f(s(n(d)("Account")),1)]),_:1}),l(i,{cols:"8",class:""},{default:e(()=>[l(w,{"leave-absolute":""},{default:e(()=>[u?(t(),y("span",$e)):(t(),m(v,{key:1,"no-gutters":"",style:{width:"100%"}},{default:e(()=>[l(i,{cols:"6"},{default:e(()=>[_("div",Re,s(n(d)("Username:"))+" "+s(a.value.username),1)]),_:1}),l(i,{cols:"6"},{default:e(()=>[_("div",Se,[f(s(n(d)("Enabled"))+" ",1),a.value.is_active?(t(),m(C,{key:0,color:"success"},{default:e(()=>[...r[8]||(r[8]=[f("mdi-check-circle-outline",-1)])]),_:1})):(t(),m(C,{key:1},{default:e(()=>[...r[9]||(r[9]=[f("mdi-close-circle-outline",-1)])]),_:1}))])]),_:1})]),_:1}))]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:1}),l(E,null,{default:e(()=>[l(ie,{ref_key:"generalForm",ref:q,modelValue:a.value,"onUpdate:modelValue":r[1]||(r[1]=u=>a.value=u),editing:""},null,8,["modelValue"])]),_:1})]),_:1}),l(h,{eager:"",value:"profileForm"},{default:e(()=>[l(A,null,{default:e(({expanded:u})=>[l(v,{"no-gutters":""},{default:e(()=>[l(i,{cols:"4"},{default:e(()=>[f(s(n(d)("Profile")),1)]),_:1}),l(i,{cols:"8",class:""},{default:e(()=>[l(w,{"leave-absolute":""},{default:e(()=>[u?(t(),y("span",Ne)):(t(),m(v,{key:1,"no-gutters":"",style:{width:"100%"}},{default:e(()=>[l(i,{cols:"6"},{default:e(()=>[_("div",Le,s(n(d)("Language:"))+" "+s(n(b).getLanguageLabel(a.value.language)),1)]),_:1})]),_:1}))]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:1}),l(E,null,{default:e(()=>[l(Ae,{ref_key:"profileForm",ref:z,modelValue:a.value,"onUpdate:modelValue":r[2]||(r[2]=u=>a.value=u)},null,8,["modelValue"])]),_:1})]),_:1}),R.value?(t(),m(h,{key:1,eager:"",value:"mailboxForm"},{default:e(()=>[l(A,null,{default:e(({expanded:u})=>[l(v,{"no-gutters":""},{default:e(()=>[l(i,{cols:"4"},{default:e(()=>[f(s(n(d)("Mailbox")),1)]),_:1}),l(i,{cols:"8",class:""},{default:e(()=>[l(w,{"leave-absolute":""},{default:e(()=>[u?(t(),y("span",Pe)):(t(),m(v,{key:1,"no-gutters":"",style:{width:"100%"}},{default:e(()=>[a.value.mailbox?(t(),y(O,{key:0},[a.value.mailbox.use_domain_quota?(t(),m(i,{key:0,cols:"6"},{default:e(()=>[_("div",Ce,s(n(d)("Quota: "))+" "+s(n(d)("domain's default value")),1)]),_:1})):(t(),m(i,{key:1,cols:"6"},{default:e(()=>[_("div",Te,s(n(d)("Quota: "))+" "+s(a.value.mailbox.quota),1)]),_:1})),l(i,{cols:"6"},{default:e(()=>[_("div",Be,[f(s(n(d)("Send only"))+" ",1),a.value.mailbox.is_send_only?(t(),m(C,{key:0,color:"success"},{default:e(()=>[...r[10]||(r[10]=[f("mdi-check-circle-outline",-1)])]),_:1})):(t(),m(C,{key:1},{default:e(()=>[...r[11]||(r[11]=[f("mdi-close-circle-outline",-1)])]),_:1}))])]),_:1})],64)):V("",!0)]),_:1}))]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:1}),l(E,null,{default:e(()=>[l(me,{ref_key:"mailboxForm",ref:G,modelValue:a.value,"onUpdate:modelValue":r[3]||(r[3]=u=>a.value=u)},null,8,["modelValue"])]),_:1})]),_:1})):V("",!0),R.value?(t(),m(h,{key:2,eager:"",value:"aliasForm"},{default:e(()=>[l(A,null,{default:e(({expanded:u})=>[l(v,{"no-gutters":""},{default:e(()=>[l(i,{cols:"4"},{default:e(()=>[f(s(n(d)("Alias")),1)]),_:1}),l(i,{cols:"8",class:""},{default:e(()=>[l(w,{"leave-absolute":""},{default:e(()=>[u?(t(),y("span",Me)):(t(),m(v,{key:1,"no-gutters":"",style:{width:"100%"}},{default:e(()=>[a.value.aliases?(t(),m(i,{key:0,cols:"6"},{default:e(()=>[_("div",je,s(n(d)("Number of associated alias:"))+" "+s(a.value.aliases.length),1)]),_:1})):V("",!0)]),_:1}))]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:1}),l(E,null,{default:e(()=>[l(fe,{ref_key:"aliasForm",ref:Q,modelValue:a.value,"onUpdate:modelValue":r[4]||(r[4]=u=>a.value=u)},null,8,["modelValue"])]),_:1})]),_:1})):V("",!0),M.value?(t(),m(h,{key:3,eager:"",value:"resourcesForm"},{default:e(()=>[l(A,null,{default:e(({expanded:u})=>[l(v,{"no-gutters":""},{default:e(()=>[l(i,{cols:"4"},{default:e(()=>[f(s(n(d)("Resources")),1)]),_:1}),l(i,{cols:"8",class:""},{default:e(()=>[l(w,{"leave-absolute":""},{default:e(()=>[u?(t(),y("span",De)):(t(),m(v,{key:1,"no-gutters":"",style:{width:"100%"}},{default:e(()=>[a.value.resources!=null&&a.value.resources.length==2?(t(),y(O,{key:0},[l(i,{cols:"6"},{default:e(()=>[_("div",Ie,s(n(d)("Number of allowed mailboxes:"))+" "+s(a.value.resources[0].max_value),1)]),_:1}),l(i,{cols:"6"},{default:e(()=>[_("div",Oe,s(n(d)("Number of allowed mailbox aliases:"))+" "+s(a.value.resources[1].max_value),1)]),_:1})],64)):V("",!0)]),_:1}))]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:1}),l(E,null,{default:e(()=>[l(pe,{ref_key:"resourcesForm",ref:P,modelValue:a.value.resources,"onUpdate:modelValue":r[5]||(r[5]=u=>a.value.resources=u)},null,8,["modelValue"])]),_:1})]),_:1})):V("",!0)]),_:1},8,["modelValue","multiple"]),_("div",qe,[l(K,{loading:F.value,variant:"outlined",onClick:r[7]||(r[7]=u=>o.$router.go(-1))},{default:e(()=>[f(s(n(d)("Cancel")),1)]),_:1},8,["loading"]),l(K,{class:"ml-4",color:"primary darken-1",variant:"outlined",loading:F.value,onClick:Z},{default:e(()=>[f(s(n(d)("Save")),1)]),_:1},8,["loading"])])]))}},Qe={__name:"AccountEditView",setup(T){const{$gettext:x}=W();return(p,d)=>(t(),y(O,null,[l(ke,{flat:""},{default:e(()=>[l(xe,null,{default:e(()=>[f(s(n(x)("Edit account")),1)]),_:1})]),_:1}),l(Ge)],64))}},Al=ne(Qe,[["__scopeId","data-v-4019c7f8"]]);export{Al as default};
@@ -0,0 +1 @@
1
+ import{u as n,b as c,h as u,i,c as l,o as f}from"./index-B1bntsLR.js";import{_}from"./ConnectedLayout-BHWaBAzH.js";import{p as h}from"./parameters-BxAXBXU1.js";import"./theme-myV4ekXo.js";import"./VContainer-DKMcKasC.js";/* empty css */import"./tag-BmV84V2s.js";import"./VApp-B0vRc3-6.js";import"./layout-CjSP_k58.js";import"./ssrBoot-05WtbG6H.js";import"./logos-95XYS6uH.js";import"./layout.store-CF5WRevH.js";import"./VAvatar-JdJfoK0C.js";import"./VProgressCircular-DTDGzl2O.js";import"./VMenu-B6SCtOwT.js";import"./global.store-DYMmGKpn.js";import"./VBadge-Cg5iu5LG.js";import"./VCard-BoH6kjPa.js";import"./VRow-CuVZGqBj.js";import"./VSheet-HeHw6g5_.js";const q={__name:"AccountLayout",setup(d){const s=n(),{$gettext:e}=c(),r=u([]),m=i(()=>s.authUser),p=i(()=>{const t=[],a={contacts:"mdi-contacts-outline",webmail:"mdi-at"};if(t.push({text:e("Settings"),to:{name:"AccountSettings"},icon:"mdi-cog"}),m.value.mailbox){t.push({text:e("Filters"),to:{name:"AccountFilters"},icon:"mdi-filter"});for(const o of r.value)t.push({icon:a[o.name],text:o.label,to:{name:"AccountParametersEdit",params:{app:o.name}}})}return t});return h.getUserApplications().then(t=>{r.value=t.data}),(t,a)=>(f(),l(_,{color:"grey","menu-items":p.value},null,8,["menu-items"]))}};export{q as default};
@@ -1 +1 @@
1
- import{b as P,n as _,i as b,l as m,o as n,m as p,a as o,F as V,e as v,t as y,f as l,w as u,c as h}from"./index-Be6X7UaJ.js";import{a as E}from"./accounts-CxGXJgEh.js";import{r as c}from"./VForm-DUC3-Taa.js";import{V as w}from"./VTextField-Dt3N956g.js";import{a as g,V as R}from"./VRow-Dnsej546.js";import{V as S}from"./VSwitch-bLRfr5zT.js";import{V as q}from"./VAlert-mUmhR_lW.js";import{V as A}from"./VAvatar-BAW2MRci.js";const F={class:"m-label"},N={class:"text-white mr-4"},H={__name:"AccountPasswordSubForm",props:{modelValue:{type:Object,default:null},withPasswordCheck:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},editing:{type:Boolean,default:!1},formErrors:{type:Object,required:!1,default:()=>{}}},setup(s){const{$gettext:t}=P(),k=_(),r=s,e=b(()=>r.modelValue),f=b(()=>!r.disabled&&(!r.editing||e.value.password)),x=i=>i===e.value.new_password||t("Password mismatch");function C(){navigator.clipboard.writeText(e.value.new_password).then(()=>{k.displayNotification({msg:t("Password copied to clipboard")})})}function B(i){i?E.getRandomPassword().then(a=>{e.value.new_password=a.data.password}):(e.value.new_password=null,e.value.password_confirmation=null)}return(i,a)=>(n(),m("div",null,[s.withPasswordCheck?(n(),m(V,{key:0},[v("label",F,y(l(t)("Current password")),1),o(w,{modelValue:e.value.password,"onUpdate:modelValue":a[0]||(a[0]=d=>e.value.password=d),autocomplete:"new-password",variant:"outlined",type:"password",density:"compact","validate-on":"submit",rules:s.disabled?[]:[l(c).required],disabled:s.disabled,"error-messages":r.formErrors?r.formErrors.password:[]},null,8,["modelValue","rules","disabled","error-messages"])],64)):p("",!0),o(R,{justify:"center"},{default:u(()=>[o(g,{cols:"auto"},{default:u(()=>[o(S,{modelValue:e.value.random_password,"onUpdate:modelValue":[a[1]||(a[1]=d=>e.value.random_password=d),B],label:l(t)("Random password"),density:"compact",color:"primary",class:"text-center",disabled:s.disabled},null,8,["modelValue","label","disabled"])]),_:1}),o(g,null,{default:u(()=>[e.value.random_password?(n(),h(q,{key:0,style:{"background-color":"#515d78"},class:"ml-6",density:"compact"},{default:u(()=>[v("span",N,y(e.value.new_password),1),o(A,{size:"small",color:"white",variant:"text",density:"compact",disabled:s.disabled,icon:"mdi-clipboard-multiple-outline",title:l(t)("Copy to clipboard"),onClick:C},null,8,["disabled","title"])]),_:1})):p("",!0)]),_:1})]),_:1}),e.value.random_password?p("",!0):(n(),m(V,{key:1},[o(w,{modelValue:e.value.new_password,"onUpdate:modelValue":a[2]||(a[2]=d=>e.value.new_password=d),variant:"outlined",label:l(t)("Password"),type:"password",autocomplete:"new-password",density:"compact",disabled:s.disabled,rules:f.value?[l(c).required]:[]},null,8,["modelValue","label","disabled","rules"]),o(w,{modelValue:e.value.password_confirmation,"onUpdate:modelValue":a[3]||(a[3]=d=>e.value.password_confirmation=d),variant:"outlined",type:"password",label:l(t)("Confirmation"),density:"compact",disabled:s.disabled,rules:f.value?[l(c).required,x]:[],"error-messages":r.formErrors?r.formErrors.new_password:[]},null,8,["modelValue","label","disabled","rules","error-messages"])],64))]))}};export{H as _};
1
+ import{b as P,n as _,i as b,l as m,o as n,m as p,a as o,F as V,e as v,t as y,f as l,w as u,c as h}from"./index-B1bntsLR.js";import{a as E}from"./accounts-DqbBlaLK.js";import{r as c}from"./VForm-DkphQD3e.js";import{V as w}from"./VTextField-QXQFhKxm.js";import{a as g,V as R}from"./VRow-CuVZGqBj.js";import{V as S}from"./VSwitch-Dh_dserW.js";import{V as q}from"./VAlert-CNys_LUS.js";import{V as A}from"./VAvatar-JdJfoK0C.js";const F={class:"m-label"},N={class:"text-white mr-4"},H={__name:"AccountPasswordSubForm",props:{modelValue:{type:Object,default:null},withPasswordCheck:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},editing:{type:Boolean,default:!1},formErrors:{type:Object,required:!1,default:()=>{}}},setup(s){const{$gettext:t}=P(),k=_(),r=s,e=b(()=>r.modelValue),f=b(()=>!r.disabled&&(!r.editing||e.value.password)),x=i=>i===e.value.new_password||t("Password mismatch");function C(){navigator.clipboard.writeText(e.value.new_password).then(()=>{k.displayNotification({msg:t("Password copied to clipboard")})})}function B(i){i?E.getRandomPassword().then(a=>{e.value.new_password=a.data.password}):(e.value.new_password=null,e.value.password_confirmation=null)}return(i,a)=>(n(),m("div",null,[s.withPasswordCheck?(n(),m(V,{key:0},[v("label",F,y(l(t)("Current password")),1),o(w,{modelValue:e.value.password,"onUpdate:modelValue":a[0]||(a[0]=d=>e.value.password=d),autocomplete:"new-password",variant:"outlined",type:"password",density:"compact","validate-on":"submit",rules:s.disabled?[]:[l(c).required],disabled:s.disabled,"error-messages":r.formErrors?r.formErrors.password:[]},null,8,["modelValue","rules","disabled","error-messages"])],64)):p("",!0),o(R,{justify:"center"},{default:u(()=>[o(g,{cols:"auto"},{default:u(()=>[o(S,{modelValue:e.value.random_password,"onUpdate:modelValue":[a[1]||(a[1]=d=>e.value.random_password=d),B],label:l(t)("Random password"),density:"compact",color:"primary",class:"text-center",disabled:s.disabled},null,8,["modelValue","label","disabled"])]),_:1}),o(g,null,{default:u(()=>[e.value.random_password?(n(),h(q,{key:0,style:{"background-color":"#515d78"},class:"ml-6",density:"compact"},{default:u(()=>[v("span",N,y(e.value.new_password),1),o(A,{size:"small",color:"white",variant:"text",density:"compact",disabled:s.disabled,icon:"mdi-clipboard-multiple-outline",title:l(t)("Copy to clipboard"),onClick:C},null,8,["disabled","title"])]),_:1})):p("",!0)]),_:1})]),_:1}),e.value.random_password?p("",!0):(n(),m(V,{key:1},[o(w,{modelValue:e.value.new_password,"onUpdate:modelValue":a[2]||(a[2]=d=>e.value.new_password=d),variant:"outlined",label:l(t)("Password"),type:"password",autocomplete:"new-password",density:"compact",disabled:s.disabled,rules:f.value?[l(c).required]:[]},null,8,["modelValue","label","disabled","rules"]),o(w,{modelValue:e.value.password_confirmation,"onUpdate:modelValue":a[3]||(a[3]=d=>e.value.password_confirmation=d),variant:"outlined",type:"password",label:l(t)("Confirmation"),density:"compact",disabled:s.disabled,rules:f.value?[l(c).required,x]:[],"error-messages":r.formErrors?r.formErrors.new_password:[]},null,8,["modelValue","label","disabled","rules","error-messages"])],64))]))}};export{H as _};
@@ -0,0 +1 @@
1
+ import{c as d,o,w as e,a as t,e as b,t as a,l as g,F as p,s as D,k as s,C as w,n as P,b as T,h as x,f,m as v,g as U,_ as G,B as z,j as L}from"./index-B1bntsLR.js";import{u as Q}from"./permissions-cSkGqV3M.js";import{a as H}from"./accounts-DqbBlaLK.js";import{p as J}from"./parameters-BxAXBXU1.js";import{c as A,V,a as C}from"./VCard-BoH6kjPa.js";import{V as K}from"./VSelect-D5IXDPEX.js";import{V as W}from"./VDataTable-BkLLfcQK.js";import{V as $,c as F,a as M}from"./VAvatar-JdJfoK0C.js";import{V as X}from"./VTextField-QXQFhKxm.js";import{u as Y}from"./language.store-_-zrrEiS.js";import{V as _,a as i}from"./VRow-CuVZGqBj.js";import{V as Z,a as ee}from"./VToolbar-CyrYSqJZ.js";import"./tag-BmV84V2s.js";import"./VInput-CbqehdOu.js";import"./VProgressCircular-DTDGzl2O.js";import"./VMenu-B6SCtOwT.js";import"./ssrBoot-05WtbG6H.js";import"./VCheckboxBtn-Ccl786Rg.js";import"./VSelectionControl-uKY9Zull.js";import"./VTable-gDsAUSLX.js";import"./filter-DHKXX97M.js";import"./languages-CxjoT69j.js";/* empty css */const te={class:"headline"},ae={__name:"AccountAliases",props:{account:{type:Object,default:null}},setup(l){return(r,m)=>(o(),d(C,null,{default:e(()=>[t(A,null,{default:e(()=>[b("span",te,a(r.$gettext("Aliases")),1)]),_:1}),t(V,null,{default:e(()=>[(o(!0),g(p,null,D(l.account.aliases,c=>(o(),d(K,{key:c,class:"mr-2 mt-2"},{default:e(()=>[s(a(c),1)]),_:2},1024))),128))]),_:1})]),_:1}))}},N="senderaddresses",B={getAll(){return w.get(`${N}/`)},getAllForMailbox(l){return w.get(`${N}/`,{params:{mailbox:l}})},create(l){return w.post(`${N}/`,l)},delete(l){return w.delete(`${N}/${l}/`)}},le={class:"headline"},ne={key:0},oe={__name:"AccountSenderAddresses",props:{account:{type:Object,default:null}},setup(l){const r=P(),{$gettext:m}=T(),c=l,n=x([]),y=x(!1),u=x(""),j=[{title:m("Address"),key:"address"},{title:"",key:"actions",align:"end",sortable:!1}];function E(){n.value.push({}),y.value=!0}function R(){B.getAllForMailbox(c.account.mailbox.pk).then(h=>{n.value=h.data})}function I(){const h={address:u.value,mailbox:c.account.mailbox.pk};B.create(h).then(()=>{R(),u.value=null,y.value=!1,r.displayNotification({msg:m("Sender address added")})})}function O(h){B.delete(h.pk).then(()=>{R(),r.displayNotification({msg:m("Sender address deleted")})})}return R(),(h,S)=>(o(),d(C,null,{default:e(()=>[t(A,null,{default:e(()=>[b("span",le,a(f(m)("Sender addresses")),1)]),_:1}),t(V,null,{default:e(()=>[t(W,{headers:j,items:n.value,"no-data-text":f(m)("No sender address defined for this account")},{"item.address":e(({item:k})=>[k.pk?(o(),g("span",ne,a(k.address),1)):(o(),d(X,{key:1,modelValue:u.value,"onUpdate:modelValue":S[0]||(S[0]=q=>u.value=q),label:f(m)("Specify an email address")},{append:e(()=>[u.value?(o(),d($,{key:0,icon:"mdi-content-save",color:"primary",variant:"text",onClick:I})):v("",!0)]),_:1},8,["modelValue","label"]))]),"item.actions":e(({item:k})=>[k.pk?(o(),d($,{key:0,icon:"mdi-delete-outline",color:"red",title:f(m)("Remove this address"),variant:"text",onClick:q=>O(k)},null,8,["title","onClick"])):v("",!0)]),bottom:e(()=>[...S[1]||(S[1]=[])]),_:2},1032,["items","no-data-text"]),y.value?v("",!0):(o(),d($,{key:0,size:"small",color:"primary",variant:"outlined",onClick:E},{default:e(()=>[t(F,{size:"small",icon:"mdi-plus"}),s(" "+a(f(m)("Add sender address")),1)]),_:1}))]),_:1})]),_:1}))}},se={class:"headline"},ue={__name:"AccountSummary",props:{account:{type:Object,default:null}},async setup(l){let r,m;const c=Y();return[r,m]=U(()=>c.getLanguages()),await r,m(),(n,y)=>(o(),d(C,null,{default:e(()=>[t(A,null,{default:e(()=>[b("span",se,a(n.$gettext("General information")),1)]),_:1}),t(V,null,{default:e(()=>[t(_,null,{default:e(()=>[t(i,{cols:"6"},{default:e(()=>[s(a(n.$gettext("Creation date")),1)]),_:1}),t(i,{cols:"6"},{default:e(()=>[s(a(n.$date(l.account.date_joined)),1)]),_:1})]),_:1}),t(_,null,{default:e(()=>[t(i,{cols:"6"},{default:e(()=>[s(a(n.$gettext("Last login date")),1)]),_:1}),l.account.last_login?(o(),d(i,{key:0,cols:"6"},{default:e(()=>[s(a(n.$date(l.account.last_login)),1)]),_:1})):(o(),d(i,{key:1,cols:"6"},{default:e(()=>[s(a(n.$gettext("Never logged-in")),1)]),_:1}))]),_:1}),t(_,null,{default:e(()=>[t(i,{cols:"6"},{default:e(()=>[s(a(n.$gettext("Full name")),1)]),_:1}),t(i,{cols:"6"},{default:e(()=>[s(a(l.account.first_name)+" "+a(l.account.last_name),1)]),_:1})]),_:1}),t(_,null,{default:e(()=>[t(i,{cols:"6"},{default:e(()=>[s(a(n.$gettext("Role")),1)]),_:1}),t(i,{cols:"6"},{default:e(()=>[s(a(l.account.role),1)]),_:1})]),_:1}),t(_,null,{default:e(()=>[t(i,{cols:"6"},{default:e(()=>[s(a(n.$gettext("Language")),1)]),_:1}),t(i,{cols:"6"},{default:e(()=>[s(a(f(c).getLanguageLabel(l.account.language)),1)]),_:1})]),_:1}),t(_,null,{default:e(()=>[t(i,{cols:"6"},{default:e(()=>[s(a(n.$gettext("Secondary email")),1)]),_:1}),t(i,{cols:"6"},{default:e(()=>[s(a(l.account.secondary_email),1)]),_:1})]),_:1}),t(_,null,{default:e(()=>[t(i,{cols:"6"},{default:e(()=>[s(a(n.$gettext("Phone number")),1)]),_:1}),t(i,{cols:"6"},{default:e(()=>[s(a(l.account.phone_number),1)]),_:1})]),_:1}),t(_,null,{default:e(()=>[t(i,{cols:"6"},{default:e(()=>[s(a(n.$gettext("Enabled")),1)]),_:1}),t(i,{cols:"6"},{default:e(()=>[t(F,{color:l.account.is_active?"success":"error",icon:l.account.is_active?"mdi-check-circle":"mdi-close-circle",variant:"flat"},null,8,["color","icon"])]),_:1})]),_:1}),l.account.mailbox?(o(),g(p,{key:0},[t(_,null,{default:e(()=>[t(i,{cols:"6"},{default:e(()=>[s(a(n.$gettext("Quota")),1)]),_:1}),l.account.mailbox.quota==="0"?(o(),d(i,{key:0,cols:"6"},{default:e(()=>[s(a(n.$gettext("Unlimited")),1)]),_:1})):(o(),d(i,{key:1,cols:"6"},{default:e(()=>[t(M,{color:l.account.mailbox.quota_usage<80?"primary":"warning","model-value":l.account.mailbox.quota_usage,height:"25",class:"white--text"},{default:e(({value:u})=>[s(a(Math.ceil(u))+"% ("+a(l.account.mailbox.quota)+" "+a(n.$gettext("MB"))+") ",1)]),_:1},8,["color","model-value"])]),_:1}))]),_:1}),l.account.mailbox.message_limit!==null&&l.account.mailbox.message_limit!==void 0?(o(),d(_,{key:0},{default:e(()=>[t(i,{cols:"6"},{default:e(()=>[s(a(n.$gettext("Daily sending limit")),1)]),_:1}),t(i,{cols:"6"},{default:e(()=>[l.account.mailbox.message_limit===0?(o(),g(p,{key:0},[s(a(n.$gettext("Sending forbidden")),1)],64)):(o(),d(M,{key:1,color:l.account.mailbox.sent_messages_in_percent<80?"primary":"warning","model-value":l.account.mailbox.sent_messages_in_percent,height:"25",class:"white--text"},{default:e(({value:u})=>[s(a(Math.ceil(u))+"% ("+a(l.account.mailbox.message_limit)+" "+a(n.$gettext("messages"))+") ",1)]),_:1},8,["color","model-value"]))]),_:1})]),_:1})):v("",!0)],64)):v("",!0)]),_:1})]),_:1}))}},ce={class:"headline"},ie={key:1},de={class:"text-disabled"},re={__name:"DomainAdminDomains",props:{account:{type:Object,default:null}},setup(l){const{$gettext:r}=T();return(m,c)=>(o(),d(C,null,{default:e(()=>[t(A,null,{default:e(()=>[b("span",ce,a(f(r)("Administered domains")),1)]),_:1}),t(V,null,{default:e(()=>[l.account.domains!==void 0&&l.account.domains.length?(o(!0),g(p,{key:0},D(l.account.domains,n=>(o(),d(_,{key:n},{default:e(()=>[t(i,{cols:"12"},{default:e(()=>[s(a(n),1)]),_:2},1024)]),_:2},1024))),128)):(o(),g("div",ie,a(f(r)("No domain managed")),1)),b("div",de,a(f(r)("Add/Remove from the domain page")),1)]),_:1})]),_:1}))}},me={class:"headline"},fe={__name:"ResourcesView",props:{resources:{type:Array,default:null}},setup(l){const{$gettext:r}=T(),m=n=>n.name==="quota"?r("No quota"):r("Creation denied");function c(n){return n<50?"primary":n<80?"warning":"error"}return(n,y)=>(o(),d(C,null,{default:e(()=>[t(A,null,{default:e(()=>[b("span",me,a(f(r)("Resources usage")),1)]),_:1}),t(V,null,{default:e(()=>[(o(!0),g(p,null,D(l.resources,u=>(o(),g("div",{key:u.name,class:"mt-4"},[u.max_value===-1?(o(),g(p,{key:0},[s(a(u.label)+" ("+a(f(r)("Unlimited"))+") ",1)],64)):u.max_value===0?(o(),g(p,{key:1},[s(a(u.label)+" ("+a(m(u))+") ",1)],64)):(o(),g(p,{key:2},[s(a(u.label)+" ("+a(Math.ceil(u.usage))+"%) ",1),t(M,{"model-value":u.usage,color:c(u.usage)},null,8,["model-value","color"])],64))]))),128))]),_:1})]),_:1}))}},_e={__name:"AccountView",setup(l){const r=z(),{canSetRole:m}=Q(),c=x({pk:r.params.id}),n=x({});function y(){H.get(r.params.id).then(u=>{c.value=u.data})}return m.value&&J.getGlobalApplication("limits").then(u=>{n.value=u.data}),y(),(u,j)=>(o(),g(p,null,[t(Z,{flat:""},{default:e(()=>[t(ee,null,{default:e(()=>[s(a(u.$gettext("Account"))+" "+a(c.value.username)+" ",1),t($,{color:"primary",icon:"mdi-circle-edit-outline",to:{name:"AccountEdit",params:{id:c.value.pk}}},null,8,["to"]),t($,{color:"primary",icon:"mdi-reload",onClick:y})]),_:1})]),_:1}),t(_,null,{default:e(()=>[t(i,{cols:"6"},{default:e(()=>[t(ue,{account:c.value},null,8,["account"]),c.value.role===f(L).DOMAIN_ADMIN?(o(),d(re,{key:0,class:"mt-2",account:c.value},null,8,["account"])):v("",!0)]),_:1}),t(i,{cols:"6"},{default:e(()=>[n.value.params&&n.value.params.enable_admin_limits&&c.value.role!==f(L).USER&&c.value.role!==f(L).SUPER_ADMIN?(o(),d(fe,{key:0,resources:c.value.resources},null,8,["resources"])):v("",!0),c.value.aliases?(o(),d(ae,{key:1,class:"mt-2",account:c.value},null,8,["account"])):v("",!0),c.value.mailbox?(o(),d(oe,{key:2,class:"mt-2",account:c.value},null,8,["account"])):v("",!0)]),_:1})]),_:1})],64))}},Fe=G(_e,[["__scopeId","data-v-388d62f6"]]);export{Fe as default};
@@ -0,0 +1 @@
1
+ import{E as ie,h as V,c as A,o as p,w as t,a as e,e as L,t as f,k as x,i as P,l as z,f as m,m as D,F as O,b as H,z as q,p as ee,s as X,B as me,n as ae,aB as ce,v as pe,q as oe}from"./index-B1bntsLR.js";import{c as B}from"./contacts-Df8ptuMn.js";import{p as fe}from"./parameters-BxAXBXU1.js";import{c as K,V as Q,b as W,a as J}from"./VCard-BoH6kjPa.js";import{V as ve}from"./VAlert-CNys_LUS.js";import{V as G}from"./VSpacer-BUxSSJbH.js";import{V as $}from"./VAvatar-JdJfoK0C.js";import{r as Y,V as te}from"./VForm-DkphQD3e.js";import{V as w}from"./VTextField-QXQFhKxm.js";import{a as _,V as ye}from"./VRow-CuVZGqBj.js";import{a as ne,V as Ve}from"./VSelect-D5IXDPEX.js";import{V as le}from"./VTextarea-Bdy4UKmV.js";import{V as ge}from"./VCheckbox-CCLOJFKF.js";import{_ as be}from"./MenuItems-dl38msRA.js";import{V as Ce}from"./VDataTable-BkLLfcQK.js";import{V as ke}from"./VMenu-B6SCtOwT.js";import{V as _e}from"./VToolbar-CyrYSqJZ.js";import{V as Z}from"./VDialog-DIUeAIpw.js";import{u as $e}from"./layout.store-CF5WRevH.js";import"./tag-BmV84V2s.js";import"./VProgressCircular-DTDGzl2O.js";/* empty css */import"./VInput-CbqehdOu.js";import"./VCheckboxBtn-Ccl786Rg.js";import"./VSelectionControl-uKY9Zull.js";import"./VTable-gDsAUSLX.js";import"./filter-DHKXX97M.js";import"./ssrBoot-05WtbG6H.js";const he=ie("contacts",()=>{const y=V(null);function U(i){y.value=i}async function s(){y.value=null}return{currentCategory:y,setCurrentCategory:U,$reset:s}}),xe={class:"headline"},Ue={__name:"AddressBookInfo",props:{addressBookUrl:{type:String,default:null}},emits:["close"],setup(y,{emit:U}){return(s,i)=>(p(),A(J,null,{default:t(()=>[e(K,null,{default:t(()=>[L("span",xe,f(s.$gettext("Address book information")),1)]),_:1}),e(Q,null,{default:t(()=>[L("p",null,f(s.$gettext("To access this address book from the outside (such as Mozilla Thunderbird or your smartphone), use the following URL:")),1),e(ve,{type:"info",class:"my-4",variant:"tonal"},{default:t(()=>[x(f(y.addressBookUrl),1)]),_:1}),L("p",null,f(s.$gettext("The credentials are the same than the ones you use to access Modoboa.")),1)]),_:1}),e(W,null,{default:t(()=>[e(G),e($,{onClick:i[0]||(i[0]=a=>s.$emit("close"))},{default:t(()=>[x(f(s.$gettext("Close")),1)]),_:1})]),_:1})]),_:1}))}},we={__name:"EmailField",props:{modelValue:{type:Object,default:null},errors:{type:Object,default:null},index:{type:Number,required:!0}},emits:["add","delete","update:modelValue"],setup(y,{emit:U}){const s=y,i=U,a=P({get(){return s.modelValue},set(r){i("update:modelValue",r)}}),l=["home","work","other"];return(r,n)=>(p(),z(O,null,[e(_,{cols:"6"},{default:t(()=>[e(w,{modelValue:a.value.address,"onUpdate:modelValue":n[0]||(n[0]=c=>a.value.address=c),label:r.$gettext("Address"),variant:"outlined","prepend-icon":"mdi-email",density:"compact",rules:[m(Y).required]},null,8,["modelValue","label","rules"])]),_:1}),e(_,{cols:"4",class:"pl-4"},{default:t(()=>[e(ne,{modelValue:a.value.type,"onUpdate:modelValue":n[1]||(n[1]=c=>a.value.type=c),items:l,density:"compact",variant:"outlined",rules:[m(Y).required]},null,8,["modelValue","rules"])]),_:1}),e(_,{cols:"2",class:"pl-4"},{default:t(()=>[e($,{icon:"mdi-plus",size:"x-small",flat:"",onClick:n[2]||(n[2]=c=>r.$emit("add"))}),y.index?(p(),A($,{key:0,icon:"mdi-trash-can",color:"red",size:"x-small",flat:"",variant:"text",onClick:n[3]||(n[3]=c=>r.$emit("delete",y.index))})):D("",!0)]),_:1})],64))}},Ae={__name:"PhoneNumberField",props:{errors:{type:Object,default:null},index:{type:Number,required:!0},modelValue:{type:Object,default:null}},emits:["add","delete","update:modelValue"],setup(y,{emit:U}){const s=y,i=U,a=P({get(){return s.modelValue},set(r){i("update:modelValue",r)}}),l=["cell","fax","home","main","pager","work","other"];return(r,n)=>(p(),z(O,null,[e(_,{cols:"6"},{default:t(()=>[e(w,{modelValue:a.value.number,"onUpdate:modelValue":n[0]||(n[0]=c=>a.value.number=c),label:r.$gettext("Phone number"),variant:"outlined","prepend-icon":"mdi-phone",density:"compact"},null,8,["modelValue","label"])]),_:1}),e(_,{cols:"4",class:"pl-4"},{default:t(()=>[e(ne,{modelValue:a.value.type,"onUpdate:modelValue":n[1]||(n[1]=c=>a.value.type=c),items:l,density:"compact",variant:"outlined"},null,8,["modelValue"])]),_:1}),e(_,{cols:"2",class:"pl-4"},{default:t(()=>[e($,{icon:"mdi-plus",size:"x-small",flat:"",onClick:n[2]||(n[2]=c=>r.$emit("add"))}),y.index?(p(),A($,{key:0,icon:"mdi-trash-can",color:"red",size:"x-small",flat:"",variant:"text",onClick:n[3]||(n[3]=c=>r.$emit("delete",y.index))})):D("",!0)]),_:1})],64))}},Fe={class:"headline"},Se={__name:"ContactForm",props:{contact:{type:Object,required:!1}},emits:["close","added","updated"],setup(y,{emit:U}){const s=U,i=y,{$gettext:a}=H(),l=V(v()),r=V(!1),n=V(),c=V({}),d=V(!1),F=P(()=>i.contact?a("Edit contact"):a("New contact")),h=P(()=>i.contact?a("Update"):a("Add"));function v(){return{emails:[{}],phone_numbers:[{}]}}function S(){l.value.emails.push({})}function T(N){l.value.emails.splice(N,1)}function j(){l.value.phone_numbers.push({})}function E(N){l.value.phone_numbers.splice(N,1)}async function I(){var u;const{valid:N}=await n.value.validate();if(!N)return;d.value=!0;const o=JSON.parse(JSON.stringify(l.value));Object.keys(o.phone_numbers[0]).length||o.phone_numbers.splice(0,1);try{let C;i.contact?(C=await B.updateContact(i.contact.pk,o),s("updated",C.data)):(C=await B.createContact(o),s("added",C.data)),s("close")}catch(C){((u=C.response)==null?void 0:u.status)===400&&(c.value=C.response.data)}finally{d.value=!1}}return q(()=>i.contact,N=>{N?(l.value=JSON.parse(JSON.stringify(N)),l.value.phone_numbers.length||(l.value.phone_numbers=[{}])):l.value=v()},{immediate:!0}),(N,o)=>(p(),A(J,null,{default:t(()=>[e(te,{ref_key:"formRef",ref:n,onSubmit:ee(I,["prevent"])},{default:t(()=>[e(K,null,{default:t(()=>[L("span",Fe,f(F.value),1)]),_:1}),e(Q,null,{default:t(()=>[e(ye,{"no-gutters":""},{default:t(()=>[e(_,{cols:"6"},{default:t(()=>[e(w,{modelValue:l.value.first_name,"onUpdate:modelValue":o[0]||(o[0]=u=>l.value.first_name=u),label:m(a)("First name"),variant:"outlined","prepend-icon":"mdi-account",density:"compact","error-messages":c.value.first_name},null,8,["modelValue","label","error-messages"])]),_:1}),e(_,{cols:"6",class:"pl-4"},{default:t(()=>[e(w,{modelValue:l.value.last_name,"onUpdate:modelValue":o[1]||(o[1]=u=>l.value.last_name=u),label:m(a)("Last name"),variant:"outlined",density:"compact","error-messages":c.value.last_name},null,8,["modelValue","label","error-messages"])]),_:1}),e(_,{cols:"12"},{default:t(()=>[e(w,{modelValue:l.value.display_name,"onUpdate:modelValue":o[2]||(o[2]=u=>l.value.display_name=u),label:m(a)("Display name"),variant:"outlined","prepend-icon":"toto",density:"compact","error-messages":c.value.display_name},null,8,["modelValue","label","error-messages"])]),_:1}),e(_,{cols:"6"},{default:t(()=>[e(w,{modelValue:l.value.company,"onUpdate:modelValue":o[3]||(o[3]=u=>l.value.company=u),label:m(a)("Company"),variant:"outlined","prepend-icon":"mdi-office-building",density:"compact"},null,8,["modelValue","label"])]),_:1}),e(_,{cols:"6",class:"pl-4"},{default:t(()=>[e(w,{modelValue:l.value.position,"onUpdate:modelValue":o[4]||(o[4]=u=>l.value.position=u),label:m(a)("Position"),variant:"outlined",density:"compact"},null,8,["modelValue","label"])]),_:1}),(p(!0),z(O,null,X(l.value.emails,(u,C)=>(p(),A(we,{key:`email-${C}`,modelValue:l.value.emails[C],"onUpdate:modelValue":M=>l.value.emails[C]=M,index:C,onAdd:S,onDelete:T},null,8,["modelValue","onUpdate:modelValue","index"]))),128)),(p(!0),z(O,null,X(l.value.phone_numbers,(u,C)=>(p(),A(Ae,{key:`phone-${C}`,modelValue:l.value.phone_numbers[C],"onUpdate:modelValue":M=>l.value.phone_numbers[C]=M,index:C,onAdd:j,onDelete:E},null,8,["modelValue","onUpdate:modelValue","index"]))),128)),r.value?(p(),z(O,{key:0},[e(_,{cols:"6"},{default:t(()=>[e(w,{modelValue:l.value.birth_date,"onUpdate:modelValue":o[5]||(o[5]=u=>l.value.birth_date=u),label:m(a)("Birth date"),type:"date","prepend-icon":"mdi-calendar",variant:"outlined",density:"compact"},null,8,["modelValue","label"])]),_:1}),e(_,{cols:"12"},{default:t(()=>[e(le,{modelValue:l.value.address,"onUpdate:modelValue":o[6]||(o[6]=u=>l.value.address=u),label:m(a)("Address"),"prepend-icon":"mdi-location",variant:"outlined",density:"compact",rows:"2"},null,8,["modelValue","label"])]),_:1}),e(_,{cols:"6"},{default:t(()=>[e(w,{modelValue:l.value.zipcode,"onUpdate:modelValue":o[7]||(o[7]=u=>l.value.zipcode=u),label:m(a)("Zip code"),"prepend-icon":"toto",variant:"outlined",density:"compact"},null,8,["modelValue","label"])]),_:1}),e(_,{cols:"6",class:"pl-4"},{default:t(()=>[e(w,{modelValue:l.value.city,"onUpdate:modelValue":o[8]||(o[8]=u=>l.value.city=u),label:m(a)("City"),variant:"outlined",density:"compact"},null,8,["modelValue","label"])]),_:1}),e(_,{cols:"6"},{default:t(()=>[e(w,{modelValue:l.value.country,"onUpdate:modelValue":o[9]||(o[9]=u=>l.value.country=u),label:m(a)("Country"),"prepend-icon":"toto",variant:"outlined",density:"compact"},null,8,["modelValue","label"])]),_:1}),e(_,{cols:"6",class:"pl-4"},{default:t(()=>[e(w,{modelValue:l.value.state,"onUpdate:modelValue":o[10]||(o[10]=u=>l.value.state=u),label:m(a)("State/Province"),variant:"outlined",density:"compact"},null,8,["modelValue","label"])]),_:1}),e(_,{cols:"12"},{default:t(()=>[e(le,{modelValue:l.value.note,"onUpdate:modelValue":o[11]||(o[11]=u=>l.value.note=u),label:m(a)("Note"),"prepend-icon":"mdi-file",variant:"outlined",density:"compact",rows:"2"},null,8,["modelValue","label"])]),_:1})],64)):D("",!0)]),_:1})]),_:1}),e(W,null,{default:t(()=>[r.value?(p(),A($,{key:1,onClick:o[13]||(o[13]=u=>r.value=!1)},{default:t(()=>[x(f(m(a)("Less")),1)]),_:1})):(p(),A($,{key:0,onClick:o[12]||(o[12]=u=>r.value=!0)},{default:t(()=>[x(f(m(a)("More")),1)]),_:1})),e(G),e($,{loading:d.value,onClick:o[14]||(o[14]=u=>s("close"))},{default:t(()=>[x(f(m(a)("Close")),1)]),_:1},8,["loading"]),e($,{color:"primary",type:"submit",loading:d.value},{default:t(()=>[x(f(h.value),1)]),_:1},8,["loading"])]),_:1})]),_:1},512)]),_:1}))}},Be={class:"headline"},Ne={__name:"ContactCategoriesForm",props:{contact:{type:Object,default:null}},emits:["close"],setup(y,{emit:U}){const s=y,i=U,a=V([]),l=V([]),r=V(!1);function n(){i("close","updated")}async function c(){const d={categories:l.value};r.value=!0;try{await B.updateContact(s.contact.pk,d),i("updated"),n()}finally{r.value=!1}}return q(()=>s.contact,d=>{d?l.value=d.categories:l.value=[]},{immediate:!0}),B.getCategories().then(d=>{a.value=d.data}),(d,F)=>(p(),A(J,null,{default:t(()=>[e(te,{ref:"formRef",onSubmit:ee(c,["prevent"])},{default:t(()=>[e(K,null,{default:t(()=>[L("span",Be,f(d.$gettext("Categories")),1)]),_:1}),e(Q,null,{default:t(()=>[(p(!0),z(O,null,X(a.value,h=>(p(),A(ge,{key:h.pk,modelValue:l.value,"onUpdate:modelValue":F[0]||(F[0]=v=>l.value=v),label:h.name,"hide-details":"",value:h.pk,color:"primary"},null,8,["modelValue","label","value"]))),128))]),_:1}),e(W,null,{default:t(()=>[e(G),e($,{loading:r.value,onClick:n},{default:t(()=>[x(f(d.$gettext("Close")),1)]),_:1},8,["loading"]),e($,{color:"primary",type:"submit",loading:r.value},{default:t(()=>[x(f(d.$gettext("Update")),1)]),_:1},8,["loading"])]),_:1})]),_:1},512)]),_:1}))}},ze={class:"text-right"},Oe={__name:"ContactList",emits:["editCategory"],setup(y,{emit:U}){const s=U,i=me(),{$gettext:a}=H(),{displayNotification:l}=ae(),r=V({}),n=V([]),c=V(""),d=V(null),F=V(!1),h=V(!1),v=V(!1),S=V({}),T=[{key:"display_name",title:a("Display name")},{key:"emails",title:a("E-mail")},{key:"phone_numbers",title:a("Phone")},{key:"actions",title:a("Actions"),align:"end"}],j=[{label:a("Categories"),icon:"mdi-label",onClick:M},{label:a("Edit"),icon:"mdi-circle-edit-outline",onClick:u},{label:a("Delete"),icon:"mdi-delete-outline",onClick:ue,color:"red"}];let E;ce(()=>{E&&clearInterval(E)});function I(){h.value=!1,d.value=null}function N(g){return g.map(k=>k.address).join(", ")}function o(g){return g.map(k=>k.number).join(", ")}function u(g){d.value=g,h.value=!0}function C(){s("editCategory")}function M(g){d.value=g,v.value=!0}function se(){v.value=!1,d.value=null}function ue(g){B.deleteContact(g.pk).then(()=>{R()})}function R(){B.getContacts(i.params).then(g=>{n.value=g.data})}function re(){B.synchronizeToAddressBook().then(()=>{l({msg:a("Synchronization started")})})}return B.getDefaultAddressBook().then(g=>{r.value=g.data}),fe.getUserApplication("contacts").then(g=>{S.value=g.data.params}),R(),q(S,g=>{g&&(E=setInterval(B.synchronizeFromAddressBook,g.sync_frequency*1e3))}),q(()=>i.params.category,()=>{R()}),(g,k)=>(p(),z(O,null,[e(J,{class:"mt-6"},{default:t(()=>[e(Ce,{headers:T,items:n.value},{top:t(()=>[e(_e,{color:"white",flat:""},{default:t(()=>[e(w,{modelValue:c.value,"onUpdate:modelValue":k[0]||(k[0]=b=>c.value=b),"prepend-inner-icon":"mdi-magnify",placeholder:m(a)("Search"),variant:"outlined","single-line":"",flat:"","hide-details":"",density:"compact",class:"flex-grow-0 w-33 mr-4"},null,8,["modelValue","placeholder"]),e($,{color:"primary",variant:"outlined",onClick:k[1]||(k[1]=b=>h.value=!0)},{default:t(()=>[x(f(m(a)("Add")),1)]),_:1}),S.value.enable_carddav_sync?(p(),z(O,{key:0},[e($,{icon:"mdi-information-outline",title:m(a)("Display address book information"),class:"ml-2",onClick:k[2]||(k[2]=b=>F.value=!0)},null,8,["title"]),r.value.last_sync?D("",!0):(p(),A($,{key:0,icon:"mdi-sync",color:"success",title:m(a)("Synchronize contacts with address book"),onClick:re},null,8,["title"]))],64)):D("",!0),g.$route.params.category?(p(),A(Ve,{key:1,class:"my-2 mx-4",label:"",size:"small",color:"green","prepend-icon":"mdi-label",onClick:C},{default:t(()=>[x(f(g.$route.params.category),1)]),_:1})):D("",!0),e(G)]),_:1})]),"item.display_name":t(({item:b})=>[b.display_name?(p(),z(O,{key:0},[x(f(b.display_name),1)],64)):(p(),z(O,{key:1},[x(f(b.first_name)+" "+f(b.last_name),1)],64))]),"item.emails":t(({item:b})=>[x(f(N(b.emails)),1)]),"item.phone_numbers":t(({item:b})=>[x(f(o(b.phone_numbers)),1)]),"item.actions":t(({item:b})=>[L("div",ze,[e(ke,{"offset-y":""},{activator:t(({props:de})=>[e($,pe({icon:"mdi-dots-horizontal",variant:"text"},de),null,16)]),default:t(()=>[e(m(be),{items:j,obj:b},null,8,["obj"])]),_:2},1024)])]),_:2},1032,["items"])]),_:1}),e(Z,{modelValue:h.value,"onUpdate:modelValue":k[3]||(k[3]=b=>h.value=b),persistent:"","max-width":"800px"},{default:t(()=>[e(Se,{contact:d.value,onClose:I,onAdded:R,onUpdated:R},null,8,["contact"])]),_:1},8,["modelValue"]),e(Z,{modelValue:v.value,"onUpdate:modelValue":k[4]||(k[4]=b=>v.value=b),persistent:"","max-width":"800px"},{default:t(()=>[e(Ne,{contact:d.value,onUpdated:R,onClose:se},null,8,["contact"])]),_:1},8,["modelValue"]),e(Z,{modelValue:F.value,"onUpdate:modelValue":k[6]||(k[6]=b=>F.value=b),persistent:"","max-width":"800px"},{default:t(()=>[e(Ue,{"address-book-url":r.value.url,onClose:k[5]||(k[5]=b=>F.value=!1)},null,8,["address-book-url"])]),_:1},8,["modelValue"])],64))}},Ee={class:"headline"},je={__name:"CategoryForm",props:{category:{type:Object,default:null}},emits:["close","updated"],setup(y,{emit:U}){const s=y,i=U,a=oe(),{$gettext:l}=H(),{displayNotification:r}=ae(),n=V({}),c=V(),d=V(!1),F=P(()=>s.category?l("Edit category"):l("Add category")),h=P(()=>s.category?l("Update"):l("Add"));function v(){n.value={},i("close")}async function S(){const{valid:j}=await c.value.validate();if(j){d.value=!0;try{s.category?await B.updateCategory(s.category.pk,n.value):await B.addCategory(n.value),i("updated"),i("close")}catch(E){console.log(E)}finally{d.value=!1}}}function T(){B.deleteCategory(s.category.pk).then(()=>{v(),i("updated"),r({msg:l("Category deleted")}),a.push({name:"ContactList"})})}return q(()=>s.category,j=>{j?n.value=JSON.parse(JSON.stringify(j)):n.value={}},{immediate:!0}),(j,E)=>(p(),A(J,null,{default:t(()=>[e(te,{ref_key:"formRef",ref:c,onSubmit:ee(S,["prevent"])},{default:t(()=>[e(K,null,{default:t(()=>[L("span",Ee,f(F.value),1)]),_:1}),e(Q,null,{default:t(()=>[e(w,{modelValue:n.value.name,"onUpdate:modelValue":E[0]||(E[0]=I=>n.value.name=I),label:m(l)("Name"),variant:"outlined",density:"compact",rules:[m(Y).required]},null,8,["modelValue","label","rules"])]),_:1}),e(W,null,{default:t(()=>[y.category?(p(),A($,{key:0,color:"red",onClick:T},{default:t(()=>[x(f(m(l)("Delete")),1)]),_:1})):D("",!0),e(G),e($,{loading:d.value,onClick:v},{default:t(()=>[x(f(m(l)("Close")),1)]),_:1},8,["loading"]),e($,{color:"primary",type:"submit",loading:d.value},{default:t(()=>[x(f(h.value),1)]),_:1},8,["loading"])]),_:1})]),_:1},512)]),_:1}))}},Le={class:"text-h5 ml-4"},ct={__name:"AddressBook",setup(y){const U=oe(),{$gettext:s}=H(),i=he(),a=$e(),l=V([]),r=V(!1),n=P(()=>{const v=[{icon:"mdi-contacts",text:s("Contacts"),to:{name:"ContactList"}},{text:s("Categories"),subheader:!0}];for(const S of l.value)v.push({icon:"mdi-label",text:S.name,action:()=>F(S)});return v.push({icon:"mdi-plus",text:s("Add a category"),action:c}),v});function c(){r.value=!0}function d(){r.value=!1}function F(v){i.setCurrentCategory(v),U.push({name:"ContactList",params:{category:v.name}})}function h(){B.getCategories().then(v=>{l.value=v.data})}return h(),q(n,v=>{a.setLeftMenuItems(v)}),(v,S)=>(p(),z(O,null,[L("div",Le,f(m(s)("Contacts")),1),e(Oe,{onEditCategory:c}),e(Z,{modelValue:r.value,"onUpdate:modelValue":S[0]||(S[0]=T=>r.value=T),persistent:"","max-width":"800px"},{default:t(()=>[e(je,{category:m(i).currentCategory,onClose:d,onAdded:h,onUpdated:h},null,8,["category"])]),_:1},8,["modelValue"])],64))}};export{ct as default};
@@ -0,0 +1 @@
1
+ import{b as D,u as g,h as l,i as p,j as t,g as c,c as b,o as x}from"./index-B1bntsLR.js";import{p as _}from"./parameters-BxAXBXU1.js";import{_ as N}from"./ConnectedLayout-BHWaBAzH.js";import{u as h}from"./parameters.store-CATOSoQZ.js";import{u as f}from"./global.store-DYMmGKpn.js";import"./theme-myV4ekXo.js";import"./VContainer-DKMcKasC.js";/* empty css */import"./tag-BmV84V2s.js";import"./VApp-B0vRc3-6.js";import"./layout-CjSP_k58.js";import"./ssrBoot-05WtbG6H.js";import"./logos-95XYS6uH.js";import"./layout.store-CF5WRevH.js";import"./VAvatar-JdJfoK0C.js";import"./VProgressCircular-DTDGzl2O.js";import"./VMenu-B6SCtOwT.js";import"./VBadge-Cg5iu5LG.js";import"./VCard-BoH6kjPa.js";import"./VRow-CuVZGqBj.js";import"./VSheet-HeHw6g5_.js";const W={__name:"AdminLayout",async setup(L){let a,e;const{$gettext:i}=D(),A=g(),s=f(),r=h(),n=l(!1),d=l("/rspamd"),u=l([]),M=p(()=>A.authUser),R=p(()=>r.imapMigrationEnabled),S=()=>{window.location=d.value},I=p(()=>{const o=[{text:i("Dashboard"),to:{name:"Dashboard"},exact:!0,icon:"mdi-view-dashboard-outline"},{text:i("Domains"),to:{name:"DomainList"},icon:"mdi-domain",roles:[t.DOMAIN_ADMIN,t.RESELLER,t.SUPER_ADMIN]},{text:i("Identities"),to:{name:"Identities"},icon:"mdi-account",roles:[t.DOMAIN_ADMIN,t.RESELLER,t.SUPER_ADMIN]},{text:i("Alarms"),to:{name:"Alarms"},icon:"mdi-bell"},{icon:"mdi-history",text:i("Monitoring"),roles:[t.SUPER_ADMIN,t.RESELLER,t.DOMAIN_ADMIN],children:[{text:i("Statistics"),to:{name:"Statistics"},roles:[t.SUPER_ADMIN]},{text:i("Audit trail"),to:{name:"AuditTrail"},roles:[t.SUPER_ADMIN]},{text:i("Messages"),to:{name:"MessageLog"},roles:[t.DOMAIN_ADMIN,t.RESELLER,t.SUPER_ADMIN]}]},{icon:"mdi-email-sync-outline",text:i("IMAP Migration"),roles:[t.SUPER_ADMIN,t.RESELLER],condition:()=>R.value,children:[{text:i("Email providers"),to:{name:"ProvidersList"},roles:[t.SUPER_ADMIN,t.RESELLER]},{text:i("Migrations"),to:{name:"MigrationsList"},roles:[t.RESELLER,t.SUPER_ADMIN]}]}],m=[];return u.value.forEach(E=>{m.push({text:E.label,to:{name:"ParametersEdit",params:{app:E.name}}})}),o.concat([{icon:"mdi-cog",text:i("Settings"),children:m,roles:[t.SUPER_ADMIN]},{icon:"mdi-email-check-outline",text:"Rspamd",action:S,roles:[t.SUPER_ADMIN],condition:()=>n.value},{icon:"mdi-information",text:i("Information"),roles:[t.SUPER_ADMIN],to:{name:"Information"},withBell:!0}])});if(M.value.role===t.SUPER_ADMIN){let o=([a,e]=c(()=>_.getGlobalApplications()),a=await a,e(),a);u.value=o.data,[a,e]=c(()=>s.fetchCapabilities()),await a,e(),s.capabilities.imap_migration&&r.imapMigrationEnabled===null&&(o=([a,e]=c(()=>_.getGlobalApplication("imap_migration")),a=await a,e(),a),r.imapMigrationEnabled=o.data.params.enabled_imapmigration),n.value="rspamd"in s.capabilities,n.value&&(d.value=s.capabilities.rspamd.location||"/rspamd")}return(o,m)=>(x(),b(N,{"menu-items":I.value},null,8,["menu-items"]))}};export{W as default};
@@ -0,0 +1 @@
1
+ import{d as G}from"./index-Bp9Fb67E.js";import{C as b,_ as E,b as H,n as J,h as d,B as K,c as A,w as a,a as s,e as Q,f as p,v as D,k as n,t as c,l as w,F as N,j as x,o as f}from"./index-B1bntsLR.js";import{_ as M}from"./MenuItems-dl38msRA.js";import{V as L,a as W}from"./VMenu-B6SCtOwT.js";import{V as T,c as X}from"./VAvatar-JdJfoK0C.js";import{V as B}from"./VSelect-D5IXDPEX.js";import{V as O,a as Y}from"./VToolbar-CyrYSqJZ.js";import{V as Z}from"./VTextField-QXQFhKxm.js";import{V as ee}from"./VDataTableServer-B_6fWBA3.js";import{a as te}from"./VCard-BoH6kjPa.js";import"./tag-BmV84V2s.js";import"./ssrBoot-05WtbG6H.js";import"./VProgressCircular-DTDGzl2O.js";import"./VInput-CbqehdOu.js";import"./VCheckboxBtn-Ccl786Rg.js";import"./VSelectionControl-uKY9Zull.js";import"./VDataTable-BkLLfcQK.js";import"./VTable-gDsAUSLX.js";import"./filter-DHKXX97M.js";const y="alarms",v={getAll(i){return b.get(`${y}/`,{params:i})},switchStatus(i,e){return b.patch(`${y}/${i}/switch/`,e)},delete(i){return b.delete(`${y}/${i}/`)},bulkDelete(i){return b.post(`${y}/bulk_delete/`,{ids:i})}},ae={class:"text-right"},le={__name:"AlarmList",setup(i){const{$gettext:e}=H(),V=K(),_=J(),C=d([]),$=d([{key:"status",order:"desc"}]),k=d(!1),u=d(""),g=d([]),S=d(0),R=[{title:e("Triggered"),key:"created"},{title:e("Status"),key:"status"},{title:e("Domain"),key:"domain.name",sortable:!1},{title:e("Mailbox"),key:"mailbox",sortable:!1},{title:e("Message"),key:"title"},{title:e("Actions"),key:"actions",sortable:!1,align:"right"}],z=[{value:10,title:"10"},{value:25,title:"25"},{value:50,title:"50"},{value:100,title:"100"}];function I(){const o=[];return g.value.length>0&&o.push({label:e("Delete"),icon:"mdi-delete-outline",onClick:U,color:"red"}),o.push({label:e("Reload"),icon:"mdi-reload",onClick:r}),o}function P(o){const l=[];return l.push({label:e("Delete"),icon:"mdi-delete-outline",onClick:j,color:"red"}),o.status===x.ALARM_OPENED?l.push({label:e("Close alarm"),icon:"mdi-check",onClick:F,color:"green"}):l.push({label:e("Reopen alarm"),icon:"mdi-alert-circle-outline",onClick:q,color:"orange"}),l}function r({page:o,itemsPerPage:l,sortBy:t}){const h={page:o||1,page_size:l||10};t&&t.length&&(h.ordering=t.map(m=>m.order!=="asc"?`-${m.key}`:m.key).join(",")),u.value!==""&&(h.search=u.value),k.value=!0,v.getAll(h).then(m=>{C.value=m.data.results,S.value=m.data.count,k.value=!1})}async function j(o,l=!0){v.delete(o.id).then(()=>{l&&(_.displayNotification({msg:e("Alarm deleted")}),r({}))})}async function U(){await v.bulkDelete(g.value),_.displayNotification({msg:e("Alarms deleted")}),g.value=[],r({})}async function F(o){v.switchStatus(o.id,{status:x.ALARM_CLOSED}).then(()=>{_.displayNotification({msg:e("Alarm closed")}),r({})})}async function q(o){v.switchStatus(o.id,{status:x.ALARM_OPENED}).then(()=>{_.displayNotification({msg:e("Alarm re-opened")}),r({})})}return V.query.search&&(u.value=V.query.search),r=G(r,500),(o,l)=>(f(),A(te,{class:"mt-6"},{default:a(()=>[s(ee,{modelValue:g.value,"onUpdate:modelValue":l[1]||(l[1]=t=>g.value=t),"sort-by":$.value,"onUpdate:sortBy":l[2]||(l[2]=t=>$.value=t),headers:R,items:C.value,search:u.value,"item-value":"id","items-length":S.value,"items-per-page-options":z,loading:k.value,elevation:"0","show-select":"","onUpdate:options":r},{top:a(()=>[s(O,{color:"white",flat:""},{default:a(()=>[s(Z,{modelValue:u.value,"onUpdate:modelValue":l[0]||(l[0]=t=>u.value=t),"prepend-inner-icon":"mdi-magnify",placeholder:p(e)("Search"),density:"compact",variant:"outlined","hide-details":"",flat:"","single-line":"",class:"flex-grow-0 w-33 mr-4"},null,8,["modelValue","placeholder"]),s(L,{location:"bottom"},{activator:a(({props:t})=>[s(T,D(t,{size:"small"}),{default:a(()=>[n(c(p(e)("Actions"))+" ",1),s(X,{right:""},{default:a(()=>[...l[3]||(l[3]=[n("mdi-chevron-down",-1)])]),_:1})]),_:1},16)]),default:a(()=>[s(W,{density:"compact"},{default:a(()=>[s(p(M),{items:I()},null,8,["items"])]),_:1})]),_:1})]),_:1})]),"item.status":a(({item:t})=>[t.status===1?(f(),A(B,{key:0,color:"warning",size:"small"},{default:a(()=>[n(c(p(e)("Opened")),1)]),_:1})):(f(),A(B,{key:1,color:"info",size:"small"},{default:a(()=>[n(c(p(e)("Closed")),1)]),_:1}))]),"item.mailbox":a(({item:t})=>[t.mailbox?(f(),w(N,{key:0},[n(c(t.mailbox.address)+"@"+c(t.domain.name),1)],64)):(f(),w(N,{key:1},[n(" / ")],64))]),"item.created":a(({item:t})=>[n(c(o.$date(t.created)),1)]),"item.actions":a(({item:t})=>[Q("div",ae,[s(L,{location:"bottom"},{activator:a(({props:h})=>[s(T,D({icon:"mdi-dots-horizontal"},h,{variant:"text"}),null,16)]),default:a(()=>[s(p(M),{items:P(t),obj:t},null,8,["items","obj"])]),_:2},1024)])]),_:2},1032,["modelValue","sort-by","items","search","items-length","loading"])]),_:1}))}},oe=E(le,[["__scopeId","data-v-4fccec74"]]),se={__name:"AlarmsView",setup(i){return(e,V)=>(f(),w("div",null,[s(O,{flat:""},{default:a(()=>[s(Y,null,{default:a(()=>[n(c(e.$gettext("Opened alarms")),1)]),_:1})]),_:1}),s(oe)]))}},we=E(se,[["__scopeId","data-v-eeff1c15"]]);export{we as default};
@@ -0,0 +1 @@
1
+ import{a as j,_ as G}from"./AliasRecipientForm-jjj5yJJw.js";import{L as I}from"./LoadingData-Tm56XNwj.js";import{b as C,n as M,B as q,q as z,h as m,d as O,c as p,l as v,o as s,a,e as E,w as e,k as i,t as n,f as u,F as R,s as H,_ as J}from"./index-B1bntsLR.js";import{a as w}from"./aliases-BtyF8GC8.js";import{d as b,c as A,V as h}from"./VAvatar-JdJfoK0C.js";import{V as B,c as T,a as $,b as K}from"./VExpansionPanels-BeMgiS7A.js";import{V as k,a as f}from"./VRow-CuVZGqBj.js";import{V as Q}from"./VSelect-D5IXDPEX.js";import{V as W,a as X}from"./VToolbar-CyrYSqJZ.js";import"./EmailField-DmPc4pyP.js";import"./VTextField-QXQFhKxm.js";import"./tag-BmV84V2s.js";import"./VInput-CbqehdOu.js";import"./VProgressCircular-DTDGzl2O.js";import"./VMenu-B6SCtOwT.js";import"./ssrBoot-05WtbG6H.js";import"./domains.store-D4ZqCQ-O.js";import"./domains-CSxtTvUh.js";import"./VForm-DkphQD3e.js";import"./VSwitch-Dh_dserW.js";import"./VSelectionControl-uKY9Zull.js";import"./VTextarea-Bdy4UKmV.js";import"./VContainer-DKMcKasC.js";/* empty css */import"./VCheckboxBtn-Ccl786Rg.js";const Y={key:1},Z={key:0},ee={class:"mr-2"},ae={key:0},te={class:"mt-4 d-flex justify-end"},le={__name:"AliasEditForm",setup(N){const{$gettext:o}=C(),{displayNotification:y}=M(),c=q(),P=z(),r=m({pk:c.params.id}),V=m(0),d=m(!0),g=m(!1),x=m(),F=m(),D={generalForm:x,recipientForm:F};async function L(){g.value=!1,V.value=[];for(const[_,t]of Object.entries(D))if(t.value!=null){const{valid:l}=await t.value.vFormRef.validate();l||(g.value=!0,V.value.push(_))}if(!g.value){d.value=!0;try{await w.patch(c.params.id,r.value),y({msg:o("Alias updated")}),P.push({name:"AliasDetail",params:{id:c.params.id}})}finally{d.value=!1}}}return O(()=>{w.get(c.params.id).then(_=>{r.value=_.data,d.value=!1})}),(_,t)=>d.value?(s(),p(I,{key:0})):(s(),v("div",Y,[a(K,{modelValue:V.value,"onUpdate:modelValue":t[2]||(t[2]=l=>V.value=l),multiple:g.value},{default:e(()=>[a(B,{eager:"",value:"generalForm"},{default:e(()=>[a(T,null,{default:e(({expanded:l})=>[a(k,{"no-gutters":""},{default:e(()=>[a(f,{cols:"4"},{default:e(()=>[i(n(u(o)("General")),1)]),_:1}),a(f,{cols:"8",class:"text-medium-emphasis"},{default:e(()=>[a(b,{"leave-absolute":""},{default:e(()=>[l?(s(),v("span",Z)):(s(),p(k,{key:1,"no-gutters":"",style:{width:"100%"}},{default:e(()=>[a(f,{cols:"6"},{default:e(()=>[i(n(u(o)("Address"))+": "+n(r.value.address),1)]),_:1}),a(f,{cols:"6"},{default:e(()=>[E("div",ee,n(u(o)("Enabled")),1),r.value.enabled?(s(),p(A,{key:0,color:"success"},{default:e(()=>[...t[4]||(t[4]=[i("mdi-check-circle-outline",-1)])]),_:1})):(s(),p(A,{key:1},{default:e(()=>[...t[5]||(t[5]=[i("mdi-close-circle-outline",-1)])]),_:1}))]),_:1})]),_:1}))]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:1}),a($,null,{default:e(()=>[a(j,{ref_key:"generalForm",ref:x,modelValue:r.value,"onUpdate:modelValue":t[0]||(t[0]=l=>r.value=l)},null,8,["modelValue"])]),_:1})]),_:1}),a(B,{eager:"",value:"recipientForm"},{default:e(()=>[a(T,null,{default:e(({expanded:l})=>[a(k,{"no-gutters":""},{default:e(()=>[a(f,{cols:"4"},{default:e(()=>[i(n(u(o)("Recipients")),1)]),_:1}),a(f,{cols:"8",class:"text-medium-emphasis"},{default:e(()=>[a(b,{"leave-absolute":""},{default:e(()=>[l?(s(),v("span",ae)):(s(),p(k,{key:1,"no-gutters":"",style:{width:"100%"}},{default:e(()=>[(s(!0),v(R,null,H(r.value.recipients,(S,U)=>(s(),p(Q,{key:U,size:"small"},{default:e(()=>[i(n(S),1)]),_:2},1024))),128))]),_:1}))]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:1}),a($,null,{default:e(()=>[a(u(G),{ref_key:"recipientForm",ref:F,modelValue:r.value.recipients,"onUpdate:modelValue":t[1]||(t[1]=l=>r.value.recipients=l)},null,8,["modelValue"])]),_:1})]),_:1})]),_:1},8,["modelValue","multiple"]),E("div",te,[a(h,{loading:d.value,variant:"outlined",onClick:t[3]||(t[3]=l=>_.$router.go(-1))},{default:e(()=>[i(n(u(o)("Cancel")),1)]),_:1},8,["loading"]),a(h,{class:"ml-4",color:"primary darken-1",variant:"outlined",loading:d.value,onClick:L},{default:e(()=>[i(n(u(o)("Save")),1)]),_:1},8,["loading"])])]))}},se={__name:"AliasEditView",setup(N){const{$gettext:o}=C();return(y,c)=>(s(),v(R,null,[a(W,{flat:""},{default:e(()=>[a(X,null,{default:e(()=>[i(n(u(o)("Edit alias")),1)]),_:1})]),_:1}),a(le)],64))}},$e=J(se,[["__scopeId","data-v-0edc6d33"]]);export{$e as default};