django-microsys 2.1.3__tar.gz → 2.1.4__tar.gz

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 (278) hide show
  1. {django_microsys-2.1.3 → django_microsys-2.1.4}/PKG-INFO +1 -1
  2. {django_microsys-2.1.3 → django_microsys-2.1.4}/django_microsys.egg-info/PKG-INFO +1 -1
  3. {django_microsys-2.1.3 → django_microsys-2.1.4}/django_microsys.egg-info/SOURCES.txt +0 -1
  4. django_microsys-2.1.4/microsys/VERSION +1 -0
  5. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/forms.py +70 -37
  6. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/helpers/wizard/js/main.js +16 -4
  7. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/css/options.css +30 -12
  8. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/css/system_setup.css +50 -4
  9. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/js/options.js +12 -4
  10. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/tutorial/js/main.js +1 -1
  11. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/base.html +2 -2
  12. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/includes/options.html +11 -11
  13. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/includes/system_setup.html +1 -1
  14. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/utils.py +2733 -2733
  15. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/views/__init__.py +0 -3
  16. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/views/users.py +2 -134
  17. django_microsys-2.1.3/microsys/VERSION +0 -1
  18. django_microsys-2.1.3/microsys/templates/microsys/users/user_form.html +0 -37
  19. {django_microsys-2.1.3 → django_microsys-2.1.4}/LICENSE +0 -0
  20. {django_microsys-2.1.3 → django_microsys-2.1.4}/MANIFEST.in +0 -0
  21. {django_microsys-2.1.3 → django_microsys-2.1.4}/README.md +0 -0
  22. {django_microsys-2.1.3 → django_microsys-2.1.4}/django_microsys.egg-info/dependency_links.txt +0 -0
  23. {django_microsys-2.1.3 → django_microsys-2.1.4}/django_microsys.egg-info/entry_points.txt +0 -0
  24. {django_microsys-2.1.3 → django_microsys-2.1.4}/django_microsys.egg-info/requires.txt +0 -0
  25. {django_microsys-2.1.3 → django_microsys-2.1.4}/django_microsys.egg-info/top_level.txt +0 -0
  26. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/__init__.py +0 -0
  27. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/__main__.py +0 -0
  28. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/admin.py +0 -0
  29. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/api.py +0 -0
  30. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/apps.py +0 -0
  31. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/cli.py +0 -0
  32. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/constants.py +0 -0
  33. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/context_processors.py +0 -0
  34. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/discovery.py +0 -0
  35. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/fetcher.py +0 -0
  36. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/filters.py +0 -0
  37. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/formats/__init__.py +0 -0
  38. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/formats/ar/__init__.py +0 -0
  39. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/formats/ar/formats.py +0 -0
  40. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/formats/en/__init__.py +0 -0
  41. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/formats/en/formats.py +0 -0
  42. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/guards.py +0 -0
  43. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/management/commands/__init__.py +0 -0
  44. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/management/commands/microsys_check.py +0 -0
  45. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/management/commands/microsys_setup.py +0 -0
  46. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/management/commands/migrator.py +0 -0
  47. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/management/commands/seed_activity_log.py +0 -0
  48. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/managers.py +0 -0
  49. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/md2docx_v4.py +0 -0
  50. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/middleware.py +0 -0
  51. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/migrations/0001_initial.py +0 -0
  52. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/migrations/0002_public_registration.py +0 -0
  53. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/migrations/__init__.py +0 -0
  54. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/models.py +0 -0
  55. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/patches.py +0 -0
  56. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/registration.py +0 -0
  57. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold.py +0 -0
  58. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/app/README.md.tmpl +0 -0
  59. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/app/__init__.py.tmpl +0 -0
  60. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/app/apps.py.tmpl +0 -0
  61. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/app/filters.py.tmpl +0 -0
  62. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/app/forms.py.tmpl +0 -0
  63. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/app/migrations/__init__.py.tmpl +0 -0
  64. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/app/models.py.tmpl +0 -0
  65. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/app/tables.py.tmpl +0 -0
  66. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/app/templates/example_record_confirm_delete.html.tmpl +0 -0
  67. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/app/templates/example_record_detail.html.tmpl +0 -0
  68. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/app/templates/example_record_form.html.tmpl +0 -0
  69. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/app/templates/example_record_list.html.tmpl +0 -0
  70. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/app/tests/__init__.py.tmpl +0 -0
  71. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/app/tests/test_app.py.tmpl +0 -0
  72. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/app/translations.py.tmpl +0 -0
  73. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/app/urls.py.tmpl +0 -0
  74. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/app/views.py.tmpl +0 -0
  75. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/project/.nginx/nginx.conf.tmpl +0 -0
  76. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/project/.secrets/.env.tmpl +0 -0
  77. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/project/Dockerfile.tmpl +0 -0
  78. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/project/README.md.tmpl +0 -0
  79. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/project/compose.dev.yml.tmpl +0 -0
  80. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/project/compose.yml.tmpl +0 -0
  81. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/project/dockerignore.tmpl +0 -0
  82. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/project/docs/README.md.tmpl +0 -0
  83. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/project/entrypoint.sh.tmpl +0 -0
  84. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/project/gitattributes.tmpl +0 -0
  85. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/project/gitignore.tmpl +0 -0
  86. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/project/gunicorn.py.tmpl +0 -0
  87. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/project/manage.py.tmpl +0 -0
  88. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/project/package/__init__.py.tmpl +0 -0
  89. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/project/package/asgi.py.tmpl +0 -0
  90. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/project/package/celery.py.tmpl +0 -0
  91. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/project/package/settings.py.tmpl +0 -0
  92. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/project/package/urls.py.tmpl +0 -0
  93. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/project/package/wsgi.py.tmpl +0 -0
  94. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/project/req.txt.tmpl +0 -0
  95. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/project/start.ps1.tmpl +0 -0
  96. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/project/start.sh.tmpl +0 -0
  97. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/project/tests/__init__.py.tmpl +0 -0
  98. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/project/tests/test_scaffold.py.tmpl +0 -0
  99. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/scaffold_templates/project/tools/smtp_relay.py.tmpl +0 -0
  100. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/signals.py +0 -0
  101. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/bootstrap/bootstrap-icons.css +0 -0
  102. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/bootstrap/bootstrap-icons.woff +0 -0
  103. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/bootstrap/bootstrap-icons.woff2 +0 -0
  104. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/bootstrap/bootstrap.bundle.min.js +0 -0
  105. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/bootstrap/bootstrap.bundle.min.js.map +0 -0
  106. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/bootstrap/bootstrap.min.css +0 -0
  107. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/bootstrap/bootstrap.min.css.map +0 -0
  108. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/bootstrap/bootstrap.rtl.min.css +0 -0
  109. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/bootstrap/bootstrap.rtl.min.css.map +0 -0
  110. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/chart.js/chart.umd.min.js +0 -0
  111. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/favicon.ico +0 -0
  112. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/flatpickr/flatpickr.min.css +0 -0
  113. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/flatpickr/flatpickr.min.js +0 -0
  114. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/flatpickr/locale/ar.d.ts +0 -0
  115. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/flatpickr/locale/ar.js +0 -0
  116. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/img/base_logo.webp +0 -0
  117. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/img/default_profile.webp +0 -0
  118. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/img/login_logo.webp +0 -0
  119. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/accessibility/css/main.css +0 -0
  120. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/accessibility/js/main.js +0 -0
  121. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/activitylog/js/main.js +0 -0
  122. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/forms/css/file_field.css +0 -0
  123. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/forms/css/form_actions.css +0 -0
  124. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/forms/css/form_fields.css +0 -0
  125. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/forms/js/file_field.js +0 -0
  126. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/forms/js/filter_form.js +0 -0
  127. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/helpers/autofill/js/main.js +0 -0
  128. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/helpers/context_menu/css/main.css +0 -0
  129. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/helpers/context_menu/js/main.js +0 -0
  130. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/helpers/context_menu/js/section_manager.js +0 -0
  131. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/helpers/dynamic_modal/js/main.js +0 -0
  132. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/helpers/prevent_double_submit.js +0 -0
  133. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/helpers/scan_link/js/main.js +0 -0
  134. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/helpers/scan_link/js/scan_button.js +0 -0
  135. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/language/css/main.css +0 -0
  136. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/language/fonts/TwemojiCountryFlags.woff2 +0 -0
  137. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/language/js/main.js +0 -0
  138. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/language/js/translations.js +0 -0
  139. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/css/buttons.css +0 -0
  140. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/css/charts.css +0 -0
  141. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/css/doc_detail.css +0 -0
  142. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/css/dropdowns.css +0 -0
  143. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/css/gen_pdf.css +0 -0
  144. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/css/gen_report.css +0 -0
  145. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/css/index_cards.css +0 -0
  146. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/css/main.css +0 -0
  147. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/css/navtabs.css +0 -0
  148. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/css/pagination.css +0 -0
  149. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/css/selectors.css +0 -0
  150. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/css/tables.css +0 -0
  151. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/css/template_cleanup.css +0 -0
  152. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/css/titlebar.css +0 -0
  153. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/fonts/Amiri-Bold.woff2 +0 -0
  154. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/fonts/Amiri-BoldItalic.woff2 +0 -0
  155. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/fonts/Amiri-Italic.woff2 +0 -0
  156. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/fonts/Amiri-Regular.woff2 +0 -0
  157. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/fonts/Shabwa-Bold.woff2 +0 -0
  158. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/fonts/Shabwa-Medium.woff2 +0 -0
  159. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/fonts/Shabwa.woff2 +0 -0
  160. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/js/anime.min.js +0 -0
  161. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/js/base_head.js +0 -0
  162. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/js/base_runtime.js +0 -0
  163. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/js/dashboard.js +0 -0
  164. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/js/selectors.js +0 -0
  165. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/js/system_setup.js +0 -0
  166. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/main/js/tables.js +0 -0
  167. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/sections/js/manage_sections.js +0 -0
  168. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/sidebar/css/main.css +0 -0
  169. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/sidebar/css/reorder.css +0 -0
  170. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/sidebar/css/theme_picker.css +0 -0
  171. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/sidebar/js/main.js +0 -0
  172. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/sidebar/js/preload.js +0 -0
  173. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/sidebar/js/reorder.js +0 -0
  174. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/sidebar/js/theme_picker.js +0 -0
  175. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/themes/css/blue.css +0 -0
  176. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/themes/css/dark.css +0 -0
  177. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/themes/css/gold.css +0 -0
  178. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/themes/css/gothic.css +0 -0
  179. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/themes/css/green.css +0 -0
  180. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/themes/css/light.css +0 -0
  181. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/themes/css/main.css +0 -0
  182. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/themes/css/mono.css +0 -0
  183. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/themes/css/neon.css +0 -0
  184. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/themes/css/red.css +0 -0
  185. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/themes/css/retro.css +0 -0
  186. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/themes/js/main.js +0 -0
  187. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/tutorial/css/main.css +0 -0
  188. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/tutorial/js/driver.js +0 -0
  189. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/users/css/login.css +0 -0
  190. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/users/css/permissions.css +0 -0
  191. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/users/css/profile.css +0 -0
  192. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/users/css/user_hub.css +0 -0
  193. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/users/js/login.js +0 -0
  194. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/users/js/manage_users.js +0 -0
  195. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/users/js/permissions.js +0 -0
  196. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/users/js/profile_2fa.js +0 -0
  197. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/users/js/twofa_verify.js +0 -0
  198. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/users/js/user_hub.js +0 -0
  199. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/microsys/widgets/js/profile_image_widget.js +0 -0
  200. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/vanillajs-datepicker/ar.js +0 -0
  201. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/vanillajs-datepicker/datepicker-bs5.min.css +0 -0
  202. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/static/vanillajs-datepicker/datepicker.min.js +0 -0
  203. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/tables.py +0 -0
  204. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/bootstrap5/layout/field_file.html +0 -0
  205. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/2fa/verify.html +0 -0
  206. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/activitylog/activity_log.html +0 -0
  207. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/activitylog/activity_log_detail_modal.html +0 -0
  208. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/form_base.html +0 -0
  209. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/forms/assets_head.html +0 -0
  210. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/forms/assets_scripts.html +0 -0
  211. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/forms/checkbox_field.html +0 -0
  212. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/forms/crispy_file_field.html +0 -0
  213. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/forms/file_field.html +0 -0
  214. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/forms/file_input.html +0 -0
  215. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/forms/filter_assets_head.html +0 -0
  216. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/forms/filter_assets_scripts.html +0 -0
  217. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/helpers/dynamic_modal.html +0 -0
  218. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/helpers/dynamic_modal_combined.html +0 -0
  219. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/helpers/dynamic_modal_detail.html +0 -0
  220. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/helpers/dynamic_modal_form.html +0 -0
  221. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/helpers/dynamic_modal_list.html +0 -0
  222. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/helpers/global_list.html +0 -0
  223. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/helpers/micro_context_menu.html +0 -0
  224. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/helpers/scan_link.html +0 -0
  225. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/includes/dashboard.html +0 -0
  226. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/includes/language_catalog_editor.html +0 -0
  227. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/includes/language_previews.html +0 -0
  228. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/includes/sidebar_builder.html +0 -0
  229. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/includes/sidebar_density_previews.html +0 -0
  230. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/includes/sidebar_items.html +0 -0
  231. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/includes/system_names_editor.html +0 -0
  232. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/includes/table_density_previews.html +0 -0
  233. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/includes/theme_previews.html +0 -0
  234. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/includes/theme_settings_matrix.html +0 -0
  235. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/includes/titlebar.html +0 -0
  236. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/includes/translation_matrix_editor.html +0 -0
  237. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/includes/tutorial.html +0 -0
  238. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/list_base.html +0 -0
  239. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/registration/pending.html +0 -0
  240. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/scopes/scope_actions.html +0 -0
  241. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/scopes/scope_form.html +0 -0
  242. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/scopes/scope_manager.html +0 -0
  243. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/sections/manage_sections.html +0 -0
  244. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/sections/subsection_select.html +0 -0
  245. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/sidebar/auto.html +0 -0
  246. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/sidebar/extra_groups.html +0 -0
  247. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/sidebar/main.html +0 -0
  248. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/sidebar/tree.html +0 -0
  249. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/tables/table.html +0 -0
  250. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/users/grouped_permissions.html +0 -0
  251. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/users/manage_users.html +0 -0
  252. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/users/profile.html +0 -0
  253. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/users/user_detail_modal.html +0 -0
  254. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/users/user_hub.html +0 -0
  255. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/microsys/widgets/profile_image_widget.html +0 -0
  256. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/registration/email/verify_registration.txt +0 -0
  257. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/registration/login.html +0 -0
  258. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/registration/register.html +0 -0
  259. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/registration/register_sent.html +0 -0
  260. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templates/registration/register_verify.html +0 -0
  261. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templatetags/__init__.py +0 -0
  262. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templatetags/microsys_tags.py +0 -0
  263. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templatetags/microsys_translation.py +0 -0
  264. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/templatetags/sidebar_tags.py +0 -0
  265. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/themes.py +0 -0
  266. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/translations.py +0 -0
  267. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/urls.py +0 -0
  268. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/views/activitylog.py +0 -0
  269. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/views/general.py +0 -0
  270. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/views/profile.py +0 -0
  271. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/views/registration.py +0 -0
  272. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/views/scopes.py +0 -0
  273. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/views/sections.py +0 -0
  274. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/views/sidebar.py +0 -0
  275. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/views/twofa.py +0 -0
  276. {django_microsys-2.1.3 → django_microsys-2.1.4}/microsys/widgets.py +0 -0
  277. {django_microsys-2.1.3 → django_microsys-2.1.4}/pyproject.toml +0 -0
  278. {django_microsys-2.1.3 → django_microsys-2.1.4}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django_microsys
3
- Version: 2.1.3
3
+ Version: 2.1.4
4
4
  Summary: Django microSYS (System Integration Service) - Multilingual Django Starter Pack, Packed with Features.
5
5
  Author-email: DeBeski <debeski1@gmail.com>
6
6
  License: NON-COMMERCIAL
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-microsys
3
- Version: 2.1.3
3
+ Version: 2.1.4
4
4
  Summary: Django microSYS (System Integration Service) - Multilingual Django Starter Pack, Packed with Features.
5
5
  Author-email: DeBeski <debeski1@gmail.com>
6
6
  License: NON-COMMERCIAL
@@ -251,7 +251,6 @@ microsys/templates/microsys/users/grouped_permissions.html
251
251
  microsys/templates/microsys/users/manage_users.html
252
252
  microsys/templates/microsys/users/profile.html
253
253
  microsys/templates/microsys/users/user_detail_modal.html
254
- microsys/templates/microsys/users/user_form.html
255
254
  microsys/templates/microsys/users/user_hub.html
256
255
  microsys/templates/microsys/widgets/profile_image_widget.html
257
256
  microsys/templates/registration/login.html
@@ -0,0 +1 @@
1
+ 2.1.4
@@ -70,6 +70,25 @@ from .widgets import MicrosysChoiceSelectorWidget
70
70
  User = get_user_model()
71
71
 
72
72
  THEME_CHOICES = get_theme_choices()
73
+ PERMISSION_UI_EXCLUDED_APP_LABELS = [
74
+ 'admin',
75
+ 'contenttypes',
76
+ 'sessions',
77
+ 'django_celery_beat',
78
+ 'health_check',
79
+ 'db',
80
+ 'corsheaders',
81
+ 'csp',
82
+ ]
83
+
84
+
85
+ def get_assignable_permissions_queryset():
86
+ return Permissions.objects.exclude(
87
+ Q(codename__regex=r'^(delete_)') |
88
+ Q(content_type__app_label__in=PERMISSION_UI_EXCLUDED_APP_LABELS) |
89
+ (Q(content_type__app_label='microsys') & ~Q(codename__in=['manage_staff', 'manage_scopes', 'view_activitylog']) & ~Q(content_type__model='section')) |
90
+ Q(content_type__app_label='auth', content_type__model__in=['group', 'user', 'permission'])
91
+ )
73
92
 
74
93
 
75
94
  class MicrosysAuthenticationForm(AuthenticationForm):
@@ -349,8 +368,8 @@ def build_settings_toggle_field(form, field_name, css_class=None, attrs=None):
349
368
  f"<div class='ms-settings-toggle-field__label fw-semibold'>{label}</div>"
350
369
  f"{help_html}"
351
370
  f"</div>"
352
- f"<div class='ms-settings-toggle-field__control form-check form-switch flex-shrink-0 ms-2'>"
353
- f"<input class='form-check-input' type='checkbox' id='{conditional_escape(bound_field.auto_id)}' "
371
+ f"<div class='ms-settings-toggle-field__control form-switch'>"
372
+ f"<input class='form-check-input ms-settings-toggle-field__input' type='checkbox' id='{conditional_escape(bound_field.auto_id)}' "
354
373
  f"name='{conditional_escape(bound_field.html_name)}' aria-label='{label}'{checked_attr}{disabled_attr}>"
355
374
  f"</div>"
356
375
  f"</div>"
@@ -359,6 +378,34 @@ def build_settings_toggle_field(form, field_name, css_class=None, attrs=None):
359
378
  return Div(HTML(wrapper_html), css_class=css_class, **(attrs or {}))
360
379
  return HTML(wrapper_html)
361
380
 
381
+
382
+ def build_email_toggle_field(form, field_name, css_class=None, attrs=None):
383
+ bound_field = form[field_name]
384
+ field = bound_field.field
385
+ label = conditional_escape(field.label or field_name.replace('_', ' ').title())
386
+ help_text = str(field.help_text or '').strip()
387
+ help_html = (
388
+ f"<div class='ms-email-toggle-field__help small text-muted mt-1'>{conditional_escape(help_text)}</div>"
389
+ if help_text else
390
+ ""
391
+ )
392
+ checked_attr = ' checked' if _boolean_field_checked(form, field_name) else ''
393
+ disabled_attr = ' disabled' if bool(getattr(field, 'disabled', False)) else ''
394
+ wrapper_html = mark_safe(
395
+ f"<div class='ms-email-toggle-field border rounded bg-light px-3 py-2 h-100' "
396
+ f"data-ms-email-toggle-field='{conditional_escape(field_name)}'>"
397
+ f"<div class='ms-email-toggle-field__row d-flex align-items-center justify-content-between gap-3'>"
398
+ f"<div class='ms-email-toggle-field__label fw-semibold'>{label}</div>"
399
+ f"<input class='form-check-input ms-email-toggle-field__input' type='checkbox' id='{conditional_escape(bound_field.auto_id)}' "
400
+ f"name='{conditional_escape(bound_field.html_name)}' aria-label='{label}'{checked_attr}{disabled_attr}>"
401
+ f"</div>"
402
+ f"{help_html}"
403
+ f"</div>"
404
+ )
405
+ if css_class:
406
+ return Div(HTML(wrapper_html), css_class=css_class, **(attrs or {}))
407
+ return HTML(wrapper_html)
408
+
362
409
  class GroupedPermissionWidget(ChoiceWidget):
363
410
  template_name = 'microsys/users/grouped_permissions.html'
364
411
  allow_multiple_selected = True
@@ -405,21 +452,25 @@ class GroupedPermissionWidget(ChoiceWidget):
405
452
  model_name = perm.content_type.model
406
453
  codename = perm.codename
407
454
 
408
- # --- Mapping manage_staff to the dedicated staff-access UI ---
409
- if app_label == 'microsys' and codename == 'manage_staff':
455
+ # Keep staff-delegation permissions together in the dedicated staff-access UI.
456
+ if app_label == 'microsys' and codename in {'manage_staff', 'manage_scopes'}:
410
457
  model_name = 'staff_access'
411
458
  # Force model_verbose_name to match what _attach_is_staff_permission uses
412
459
  # "perm_staff_access" string usually "Staff Permissions"
413
460
 
414
- # Use real verbose name from model class if available
461
+ model_label_key = None
462
+ model_label_fallback = None
415
463
  if app_label == 'microsys' and model_name == 'staff_access':
416
- model_verbose_name = s.get('perm_staff_access', "Staff Permissions")
464
+ model_label_key = 'perm_staff_access'
465
+ model_label_fallback = "Staff Permissions"
417
466
  elif app_label == 'microsys' and model_name == 'profile':
418
- model_verbose_name = s.get('perm_manage_users', "User Management")
419
- # elif app_label == 'auth' and model_name == 'section':
420
- # model_verbose_name = "إدارة الأقسام الفرعية"
421
- # else:
467
+ model_label_key = 'model_user'
468
+
422
469
  model_class = perm.content_type.model_class()
470
+ if model_class is None and not (
471
+ app_label == 'microsys' and model_name in {'staff_access', 'profile'}
472
+ ):
473
+ continue
423
474
  if model_class:
424
475
  # prefer plural verbose name if possible, or just verbose name
425
476
  # But here we want to use our translation keys if available
@@ -427,9 +478,11 @@ class GroupedPermissionWidget(ChoiceWidget):
427
478
  else:
428
479
  default_verbose = perm.content_type.name
429
480
 
430
- # Try translation key 'model_modelname' (e.g. model_user)
431
- # Override for specific known models if needed, though they should be in translations now
432
- model_verbose_name = s.get(f"model_{model_name}", default_verbose)
481
+ if model_label_key:
482
+ model_verbose_name = s.get(model_label_key, model_label_fallback or default_verbose)
483
+ else:
484
+ # Try translation key 'model_modelname' (e.g. model_user)
485
+ model_verbose_name = s.get(f"model_{model_name}", default_verbose)
433
486
 
434
487
  # Fetch verbose app name
435
488
  try:
@@ -552,17 +605,7 @@ class CustomUserCreationForm(UserCreationForm):
552
605
  scope = forms.ModelChoiceField(queryset=None, required=False, label="Scope")
553
606
 
554
607
  permissions = forms.ModelMultipleChoiceField(
555
- queryset=Permissions.objects.exclude(
556
- Q(codename__regex=r'^(delete_)') |
557
- Q(content_type__app_label__in=[
558
- 'admin',
559
- 'contenttypes',
560
- 'sessions',
561
- 'django_celery_beat',
562
- ]) |
563
- (Q(content_type__app_label='microsys') & ~Q(codename__in=['manage_staff', 'manage_scopes', 'view_activitylog']) & ~Q(content_type__model='section')) |
564
- Q(content_type__app_label='auth', content_type__model__in=['group', 'user', 'permission'])
565
- ),
608
+ queryset=get_assignable_permissions_queryset(),
566
609
  required=False,
567
610
  widget=GroupedPermissionWidget,
568
611
  label="Permissions"
@@ -888,17 +931,7 @@ class CustomUserPermissionsForm(UserChangeForm):
888
931
  refresh_parent = True
889
932
 
890
933
  permissions = forms.ModelMultipleChoiceField(
891
- queryset=Permissions.objects.exclude(
892
- Q(codename__regex=r'^(delete_)') |
893
- Q(content_type__app_label__in=[
894
- 'admin',
895
- 'contenttypes',
896
- 'sessions',
897
- 'django_celery_beat',
898
- ]) |
899
- (Q(content_type__app_label='microsys') & ~Q(codename__in=['manage_staff', 'manage_scopes', 'view_activitylog']) & ~Q(content_type__model='section')) |
900
- Q(content_type__app_label='auth', content_type__model__in=['group', 'user', 'permission'])
901
- ),
934
+ queryset=get_assignable_permissions_queryset(),
902
935
  required=False,
903
936
  widget=GroupedPermissionWidget,
904
937
  label="Permissions"
@@ -2205,8 +2238,8 @@ class SystemSettingsForm(forms.ModelForm):
2205
2238
  Row(
2206
2239
  Div(Field('email_config_host'), css_class='col-lg-4'),
2207
2240
  Div(Field('email_config_port'), css_class='col-lg-2'),
2208
- build_settings_toggle_field(self, 'email_config_use_tls', css_class='col-lg-2'),
2209
- build_settings_toggle_field(self, 'email_config_use_ssl', css_class='col-lg-2'),
2241
+ build_email_toggle_field(self, 'email_config_use_tls', css_class='col-lg-2'),
2242
+ build_email_toggle_field(self, 'email_config_use_ssl', css_class='col-lg-2'),
2210
2243
  Div(Field('email_config_username'), css_class='col-lg-2'),
2211
2244
  ),
2212
2245
  Row(
@@ -59,15 +59,27 @@
59
59
  currentStep = resolvedStep;
60
60
  }
61
61
 
62
+ function setButtonVisibility(button, isVisible) {
63
+ if (!button) {
64
+ return;
65
+ }
66
+ button.classList.toggle('d-none', !isVisible);
67
+ button.style.display = isVisible ? '' : 'none';
68
+ button.setAttribute('aria-hidden', isVisible ? 'false' : 'true');
69
+ }
70
+
62
71
  function showStep(index) {
63
72
  steps.forEach(function(step, i) {
64
- step.style.display = (i === index) ? '' : 'none';
73
+ const isActive = i === index;
74
+ step.classList.toggle('d-none', !isActive);
75
+ step.style.display = isActive ? '' : 'none';
76
+ step.setAttribute('aria-hidden', isActive ? 'false' : 'true');
65
77
  });
66
78
 
67
79
  // Button visibility
68
- btnPrev.style.display = (index === 0) ? 'none' : '';
69
- btnNext.style.display = (index === steps.length - 1) ? 'none' : '';
70
- btnSubmit.style.display = (index === steps.length - 1) ? '' : 'none';
80
+ setButtonVisibility(btnPrev, index !== 0);
81
+ setButtonVisibility(btnNext, index !== steps.length - 1);
82
+ setButtonVisibility(btnSubmit, index === steps.length - 1);
71
83
 
72
84
  currentStep = index;
73
85
  }
@@ -1,12 +1,14 @@
1
1
  .ms-options-grid {
2
+ --ms-options-grid-gap: 1.35rem;
2
3
  display: grid;
3
4
  grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
4
- gap: 1.35rem;
5
+ gap: var(--ms-options-grid-gap);
5
6
  align-items: stretch;
6
7
  grid-auto-flow: row dense;
7
8
  }
8
9
 
9
10
  .ms-options-card {
11
+ position: relative;
10
12
  min-width: 0;
11
13
  }
12
14
 
@@ -26,7 +28,7 @@
26
28
  linear-gradient(160deg, rgba(255, 255, 255, 0.94), rgba(var(--primal-rgb), 0.055));
27
29
  box-shadow:
28
30
  inset 0 1px 0 rgba(255, 255, 255, 0.45),
29
- 0 24px 48px -38px rgba(15, 23, 42, 0.42);
31
+ 0 16px 30px -28px rgba(15, 23, 42, 0.28);
30
32
  transition:
31
33
  transform 0.2s ease,
32
34
  border-color 0.2s ease,
@@ -123,25 +125,27 @@
123
125
  box-shadow:
124
126
  inset 0 1px 0 rgba(255, 255, 255, 0.45),
125
127
  0 0 0 0.16rem rgba(var(--primal-rgb), 0.08),
126
- 0 24px 48px -38px rgba(15, 23, 42, 0.42);
128
+ 0 18px 34px -28px rgba(15, 23, 42, 0.3);
127
129
  }
128
130
 
129
- .ms-options-card.is-drag-over-before .ms-options-panel::after,
130
- .ms-options-card.is-drag-over-after .ms-options-panel::after {
131
+ .ms-options-card.is-drag-over-before::after,
132
+ .ms-options-card.is-drag-over-after::after {
131
133
  content: "";
132
134
  position: absolute;
133
- inset-inline: 1rem;
134
- height: 3px;
135
+ inset-block: 1rem;
136
+ width: 3px;
135
137
  border-radius: 999px;
136
138
  background: rgba(var(--primal-rgb), 0.78);
139
+ z-index: 3;
140
+ pointer-events: none;
137
141
  }
138
142
 
139
- .ms-options-card.is-drag-over-before .ms-options-panel::after {
140
- top: 0.65rem;
143
+ .ms-options-card.is-drag-over-before::after {
144
+ inset-inline-start: calc((var(--ms-options-grid-gap) / -2) - 1.5px);
141
145
  }
142
146
 
143
- .ms-options-card.is-drag-over-after .ms-options-panel::after {
144
- bottom: 0.65rem;
147
+ .ms-options-card.is-drag-over-after::after {
148
+ inset-inline-end: calc((var(--ms-options-grid-gap) / -2) - 1.5px);
145
149
  }
146
150
 
147
151
  .ms-options-switch-list {
@@ -194,10 +198,24 @@
194
198
  max-width: 100%;
195
199
  }
196
200
 
201
+ .ms-options-system-info-table .table {
202
+ --bs-table-bg: transparent;
203
+ --bs-table-accent-bg: transparent;
204
+ --bs-table-striped-bg: transparent;
205
+ --bs-table-hover-bg: transparent;
206
+ margin-bottom: 0;
207
+ }
208
+
197
209
  .ms-options-system-info-table th,
198
210
  .ms-options-system-info-table td {
199
211
  overflow-wrap: anywhere;
200
212
  word-break: normal;
213
+ background: transparent !important;
214
+ }
215
+
216
+ .ms-options-system-info-table .progress {
217
+ background: rgba(var(--primal-rgb), 0.1);
218
+ box-shadow: inset 0 0 0 1px rgba(var(--primal-rgb), 0.08);
201
219
  }
202
220
 
203
221
  .ms-system-settings-actions .ms-system-settings-action {
@@ -361,8 +379,8 @@
361
379
 
362
380
  @media (max-width: 576px) {
363
381
  .ms-options-grid {
382
+ --ms-options-grid-gap: 1rem;
364
383
  grid-template-columns: 1fr;
365
- gap: 1rem;
366
384
  }
367
385
 
368
386
  .ms-options-panel {
@@ -27,17 +27,58 @@
27
27
 
28
28
  .ms-settings-toggle-field__label,
29
29
  .ms-settings-toggle-field__help {
30
- overflow-wrap: anywhere;
30
+ overflow-wrap: break-word;
31
+ word-break: normal;
31
32
  }
32
33
 
33
34
  .ms-settings-toggle-field__control {
34
35
  margin-inline-start: auto;
35
- padding-inline-start: 0.25rem;
36
+ padding: 0;
37
+ min-height: 0;
38
+ display: flex;
39
+ align-items: flex-start;
40
+ justify-content: flex-end;
36
41
  align-self: flex-start;
42
+ flex: 0 0 auto;
43
+ }
44
+
45
+ .ms-settings-toggle-field__control.form-switch {
46
+ padding-inline-start: 0;
37
47
  }
38
48
 
39
- .ms-settings-toggle-field__control .form-check-input {
49
+ .ms-settings-toggle-field__input.form-check-input {
40
50
  max-width: 100%;
51
+ margin: 0;
52
+ float: none;
53
+ position: static;
54
+ }
55
+
56
+ .ms-email-toggle-field {
57
+ width: 100%;
58
+ min-width: 0;
59
+ }
60
+
61
+ .ms-email-toggle-field__row {
62
+ min-width: 0;
63
+ }
64
+
65
+ .ms-email-toggle-field__label,
66
+ .ms-email-toggle-field__help {
67
+ overflow-wrap: break-word;
68
+ word-break: normal;
69
+ }
70
+
71
+ .ms-email-toggle-field__label {
72
+ flex: 1 1 auto;
73
+ min-width: 0;
74
+ line-height: 1.2;
75
+ }
76
+
77
+ .ms-email-toggle-field__input.form-check-input {
78
+ margin: 0;
79
+ float: none;
80
+ position: static;
81
+ flex: 0 0 auto;
41
82
  }
42
83
 
43
84
  @container (max-width: 14rem) {
@@ -61,13 +102,18 @@
61
102
  .ms-settings-toggle-field__control {
62
103
  width: 100%;
63
104
  margin-inline-start: 0;
64
- padding-inline-start: 0;
65
105
  display: flex;
66
106
  justify-content: flex-end;
67
107
  align-self: stretch;
68
108
  }
69
109
  }
70
110
 
111
+ @media (max-width: 991.98px) {
112
+ .ms-email-toggle-field {
113
+ min-height: auto;
114
+ }
115
+ }
116
+
71
117
  .ms-sidebar-dependent-settings.is-disabled {
72
118
  opacity: 0.58;
73
119
  }
@@ -290,13 +290,22 @@
290
290
  });
291
291
  }
292
292
 
293
+ function shouldInsertBefore(targetCard, event) {
294
+ const rect = targetCard.getBoundingClientRect();
295
+ const direction = window.getComputedStyle(targetCard).direction || document.documentElement.dir || 'ltr';
296
+ const midpoint = rect.left + (rect.width / 2);
297
+ if (direction === 'rtl') {
298
+ return event.clientX > midpoint;
299
+ }
300
+ return event.clientX < midpoint;
301
+ }
302
+
293
303
  function placeDraggedCard(targetCard, event) {
294
304
  if (!draggedCard || !targetCard || draggedCard === targetCard) {
295
305
  return;
296
306
  }
297
307
 
298
- const rect = targetCard.getBoundingClientRect();
299
- const insertBefore = event.clientY < rect.top + (rect.height / 2);
308
+ const insertBefore = shouldInsertBefore(targetCard, event);
300
309
  targetCard.classList.toggle('is-drag-over-before', insertBefore);
301
310
  targetCard.classList.toggle('is-drag-over-after', !insertBefore);
302
311
  }
@@ -355,8 +364,7 @@
355
364
  }
356
365
  event.preventDefault();
357
366
 
358
- const rect = card.getBoundingClientRect();
359
- const insertBefore = event.clientY < rect.top + (rect.height / 2);
367
+ const insertBefore = shouldInsertBefore(card, event);
360
368
  if (insertBefore) {
361
369
  grid.insertBefore(draggedCard, card);
362
370
  } else {
@@ -43,7 +43,7 @@ document.addEventListener("DOMContentLoaded", function () {
43
43
  steps = [
44
44
  sidebarStep,
45
45
  { element: 'input[name="keyword"]', popover: { title: t.search_title || 'Search', description: t.search_desc || 'Search users.', side: "right", align: 'center' }},
46
- { element: 'a[href*="create_user"]', popover: { title: t.users_add_btn_title || 'Add User', description: t.users_add_btn_desc || 'Add new user.', side: "bottom", align: 'end' }},
46
+ { element: '[data-dynamic-modal][data-modal-title]', popover: { title: t.users_add_btn_title || 'Add User', description: t.users_add_btn_desc || 'Add new user.', side: "bottom", align: 'end' }},
47
47
  { element: '#btn-manage-scopes, #toggleScopes', popover: { title: t.users_scopes_title || 'Scopes', description: t.users_scopes_desc || 'Manage scopes.', side: "bottom", align: 'center' }},
48
48
  { element: '.badge', popover: { title: t.users_roles_title || 'User Roles', description: t.users_roles_desc || 'Role indicators.', side: "bottom", align: 'center' }},
49
49
  { element: '.table tbody tr', popover: { title: t.users_row_title || 'User Details', description: t.users_row_desc || 'Double click row.', side: "bottom", align: 'center' }},
@@ -27,7 +27,7 @@
27
27
  <link rel="stylesheet" href="{% static 'microsys/main/css/template_cleanup.css' %}?v=20260506a">
28
28
 
29
29
  <link rel="stylesheet" href="{% static 'microsys/main/css/pagination.css' %}">
30
- <link rel="stylesheet" href="{% static 'microsys/main/css/system_setup.css' %}?v=20260506f">
30
+ <link rel="stylesheet" href="{% static 'microsys/main/css/system_setup.css' %}?v=20260508d">
31
31
  {% for theme in MICROSYS_THEMES %}
32
32
  <link rel="stylesheet" href="{% static theme.css_path %}?v=20260501b">
33
33
  {% endfor %}
@@ -50,7 +50,7 @@
50
50
  <script src="{% static 'microsys/helpers/autofill/js/main.js' %}" nonce="{{ request.csp_nonce }}" defer></script>
51
51
  <script src="{% static 'microsys/helpers/prevent_double_submit.js' %}" nonce="{{ request.csp_nonce }}" defer></script>
52
52
  <script src="{% static 'microsys/users/js/user_hub.js' %}" nonce="{{ request.csp_nonce }}" defer></script>
53
- <script src="{% static 'microsys/helpers/wizard/js/main.js' %}?v=20260417c" nonce="{{ request.csp_nonce }}" defer></script>
53
+ <script src="{% static 'microsys/helpers/wizard/js/main.js' %}?v=20260508a" nonce="{{ request.csp_nonce }}" defer></script>
54
54
  <script src="{% static 'microsys/main/js/tables.js' %}?v=20260423a" nonce="{{ request.csp_nonce }}" defer></script>
55
55
  <script src="{% static 'microsys/main/js/selectors.js' %}?v=20260422a" nonce="{{ request.csp_nonce }}" defer></script>
56
56
  <script src="{% static 'microsys/main/js/system_setup.js' %}?v=20260506d" nonce="{{ request.csp_nonce }}" defer></script>
@@ -5,7 +5,7 @@
5
5
 
6
6
  {% block extra_head %}
7
7
  {% include "microsys/forms/assets_head.html" %}
8
- <link rel="stylesheet" href="{% static 'microsys/main/css/options.css' %}?v=20260506a">
8
+ <link rel="stylesheet" href="{% static 'microsys/main/css/options.css' %}?v=20260508e">
9
9
  {% endblock %}
10
10
 
11
11
  {% block content %}
@@ -22,7 +22,7 @@
22
22
  data-options-card-handle
23
23
  aria-label="{{ MS_TRANS.sidebar_reorder|default:'Reorder' }}"
24
24
  title="{{ MS_TRANS.sidebar_reorder|default:'Reorder' }}">
25
- <i class="bi bi-grip-vertical"></i>
25
+ <i class="bi bi-arrow-left-right"></i>
26
26
  </button>
27
27
  <h4 class="mb-3"><i class="bi bi-eye me-2"></i> {{ MS_TRANS.accessibility }}</h4>
28
28
  <p class="text-muted small mb-4">{{ MS_TRANS.accessibility_desc }}</p>
@@ -71,7 +71,7 @@
71
71
  data-options-card-handle
72
72
  aria-label="{{ MS_TRANS.sidebar_reorder|default:'Reorder' }}"
73
73
  title="{{ MS_TRANS.sidebar_reorder|default:'Reorder' }}">
74
- <i class="bi bi-grip-vertical"></i>
74
+ <i class="bi bi-arrow-left-right"></i>
75
75
  </button>
76
76
  <h4 class="mb-3"><i class="bi bi-info-circle me-2"></i> {{ MS_TRANS.system_info }}</h4>
77
77
  <div class="table-responsive ms-options-system-info-table">
@@ -217,7 +217,7 @@
217
217
  data-options-card-handle
218
218
  aria-label="{{ MS_TRANS.sidebar_reorder|default:'Reorder' }}"
219
219
  title="{{ MS_TRANS.sidebar_reorder|default:'Reorder' }}">
220
- <i class="bi bi-grip-vertical"></i>
220
+ <i class="bi bi-arrow-left-right"></i>
221
221
  </button>
222
222
  <h4 class="mb-3"><i class="bi bi-palette me-2"></i> {{ MS_TRANS.themes }}</h4>
223
223
  <p class="text-muted small mb-4">{{ MS_TRANS.themes_desc }}</p>
@@ -234,7 +234,7 @@
234
234
  data-options-card-handle
235
235
  aria-label="{{ MS_TRANS.sidebar_reorder|default:'Reorder' }}"
236
236
  title="{{ MS_TRANS.sidebar_reorder|default:'Reorder' }}">
237
- <i class="bi bi-grip-vertical"></i>
237
+ <i class="bi bi-arrow-left-right"></i>
238
238
  </button>
239
239
  <h4 class="mb-3"><i class="bi bi-translate me-2"></i> {{ MS_TRANS.language }}</h4>
240
240
  <p class="text-muted small mb-4">{{ MS_TRANS.language_desc }}</p>
@@ -255,7 +255,7 @@
255
255
  data-options-card-handle
256
256
  aria-label="{{ MS_TRANS.sidebar_reorder|default:'Reorder' }}"
257
257
  title="{{ MS_TRANS.sidebar_reorder|default:'Reorder' }}">
258
- <i class="bi bi-grip-vertical"></i>
258
+ <i class="bi bi-arrow-left-right"></i>
259
259
  </button>
260
260
 
261
261
  {% if config.allow_user_theme_override and MICROSYS_THEMES|length > 1 %}
@@ -298,7 +298,7 @@
298
298
  data-options-card-handle
299
299
  aria-label="{{ MS_TRANS.sidebar_reorder|default:'Reorder' }}"
300
300
  title="{{ MS_TRANS.sidebar_reorder|default:'Reorder' }}">
301
- <i class="bi bi-grip-vertical"></i>
301
+ <i class="bi bi-arrow-left-right"></i>
302
302
  </button>
303
303
  <h4 class="mb-3"><i class="bi bi-table me-2"></i> {{ MS_TRANS.table_density|default:"Table Density" }}</h4>
304
304
  <p class="text-muted small mb-4">{{ MS_TRANS.table_density_desc|default:"Control how much vertical space data tables use while you work." }}</p>
@@ -315,7 +315,7 @@
315
315
  data-options-card-handle
316
316
  aria-label="{{ MS_TRANS.sidebar_reorder|default:'Reorder' }}"
317
317
  title="{{ MS_TRANS.sidebar_reorder|default:'Reorder' }}">
318
- <i class="bi bi-grip-vertical"></i>
318
+ <i class="bi bi-arrow-left-right"></i>
319
319
  </button>
320
320
  <h4 class="mb-3"><i class="bi bi-layout-sidebar-inset me-2"></i> {{ MS_TRANS.sidebar_density|default:"Sidebar Density" }}</h4>
321
321
  <p class="text-muted small mb-4">{{ MS_TRANS.sidebar_density_desc|default:"Control how much vertical space the sidebar navigation uses while you work." }}</p>
@@ -332,7 +332,7 @@
332
332
  data-options-card-handle
333
333
  aria-label="{{ MS_TRANS.sidebar_reorder|default:'Reorder' }}"
334
334
  title="{{ MS_TRANS.sidebar_reorder|default:'Reorder' }}">
335
- <i class="bi bi-grip-vertical"></i>
335
+ <i class="bi bi-arrow-left-right"></i>
336
336
  </button>
337
337
  <h4 class="mb-3"><i class="bi bi-magic me-2"></i> {{ MS_TRANS.autofill }}</h4>
338
338
  <p class="text-muted small mb-4">{{ MS_TRANS.autofill_desc }}</p>
@@ -361,7 +361,7 @@
361
361
  data-options-card-handle
362
362
  aria-label="{{ MS_TRANS.sidebar_reorder|default:'Reorder' }}"
363
363
  title="{{ MS_TRANS.sidebar_reorder|default:'Reorder' }}">
364
- <i class="bi bi-grip-vertical"></i>
364
+ <i class="bi bi-arrow-left-right"></i>
365
365
  </button>
366
366
  <h4 class="mb-3 text-danger"><i class="bi bi-arrow-counterclockwise me-2"></i> {{ MS_TRANS.reset_defaults }}</h4>
367
367
  <p class="text-muted small mb-4">{{ MS_TRANS.reset_desc }}</p>
@@ -392,7 +392,7 @@
392
392
  data-options-card-handle
393
393
  aria-label="{{ MS_TRANS.sidebar_reorder|default:'Reorder' }}"
394
394
  title="{{ MS_TRANS.sidebar_reorder|default:'Reorder' }}">
395
- <i class="bi bi-grip-vertical"></i>
395
+ <i class="bi bi-arrow-left-right"></i>
396
396
  </button>
397
397
  <h4 class="mb-3"><i class="bi bi-sliders me-2"></i> {{ MS_TRANS.system_settings_label }}</h4>
398
398
  <p class="text-muted small mb-4">{{ MS_TRANS.system_settings_desc }}</p>
@@ -6,7 +6,7 @@
6
6
 
7
7
  {% block extra_head %}
8
8
  {{ block.super }}
9
- <link rel="stylesheet" href="{% static 'microsys/main/css/system_setup.css' %}?v=20260426b">
9
+ <link rel="stylesheet" href="{% static 'microsys/main/css/system_setup.css' %}?v=20260508d">
10
10
  {% endblock %}
11
11
 
12
12
  {% block layout %}