accrete 0.0.103__py3-none-any.whl → 0.0.105__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 (251) hide show
  1. accrete/contrib/ui/__init__.py +6 -29
  2. accrete/contrib/ui/context.py +26 -294
  3. accrete/contrib/ui/filter.py +316 -324
  4. accrete/contrib/ui/middleware.py +44 -0
  5. accrete/contrib/ui/models.py +3 -0
  6. accrete/contrib/ui/static/bulma/README.md +4 -2
  7. accrete/contrib/ui/static/bulma/bulma.css +21551 -0
  8. accrete/contrib/ui/static/bulma/bulma.css.map +1 -0
  9. accrete/contrib/ui/static/bulma/bulma.scss +1 -1
  10. accrete/contrib/ui/static/bulma/css/bulma.css +1988 -2874
  11. accrete/contrib/ui/static/bulma/css/bulma.css.map +1 -1
  12. accrete/contrib/ui/static/bulma/css/bulma.min.css +2 -2
  13. accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.css +19648 -0
  14. accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.css.map +1 -0
  15. accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.min.css +2 -2
  16. accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.css +11136 -0
  17. accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.css.map +1 -0
  18. accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.min.css +2 -2
  19. accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.css +11136 -0
  20. accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.css.map +1 -0
  21. accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.min.css +2 -2
  22. accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.min.css +21550 -2
  23. accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.min.css.map +1 -1
  24. accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.min.min.css +3 -0
  25. accrete/contrib/ui/static/bulma/package.json +12 -11
  26. accrete/contrib/ui/static/bulma/sass/base/animations.css +15 -0
  27. accrete/contrib/ui/static/bulma/sass/base/animations.css.map +1 -0
  28. accrete/contrib/ui/static/bulma/sass/base/generic.css +196 -0
  29. accrete/contrib/ui/static/bulma/sass/base/generic.css.map +1 -0
  30. accrete/contrib/ui/static/bulma/sass/base/minireset.css +82 -0
  31. accrete/contrib/ui/static/bulma/sass/base/minireset.css.map +1 -0
  32. accrete/contrib/ui/static/bulma/sass/base/skeleton.css +113 -0
  33. accrete/contrib/ui/static/bulma/sass/base/skeleton.css.map +1 -0
  34. accrete/contrib/ui/static/bulma/sass/base/skeleton.scss +0 -12
  35. accrete/contrib/ui/static/bulma/sass/components/breadcrumb.css +108 -0
  36. accrete/contrib/ui/static/bulma/sass/components/breadcrumb.css.map +1 -0
  37. accrete/contrib/ui/static/bulma/sass/components/card.css +130 -0
  38. accrete/contrib/ui/static/bulma/sass/components/card.css.map +1 -0
  39. accrete/contrib/ui/static/bulma/sass/components/dropdown.css +119 -0
  40. accrete/contrib/ui/static/bulma/sass/components/dropdown.css.map +1 -0
  41. accrete/contrib/ui/static/bulma/sass/components/menu.css +119 -0
  42. accrete/contrib/ui/static/bulma/sass/components/menu.css.map +1 -0
  43. accrete/contrib/ui/static/bulma/sass/components/message.css +191 -0
  44. accrete/contrib/ui/static/bulma/sass/components/message.css.map +1 -0
  45. accrete/contrib/ui/static/bulma/sass/components/modal.css +194 -0
  46. accrete/contrib/ui/static/bulma/sass/components/modal.css.map +1 -0
  47. accrete/contrib/ui/static/bulma/sass/components/navbar.css +768 -0
  48. accrete/contrib/ui/static/bulma/sass/components/navbar.css.map +1 -0
  49. accrete/contrib/ui/static/bulma/sass/components/navbar.scss +41 -30
  50. accrete/contrib/ui/static/bulma/sass/components/pagination.css +302 -0
  51. accrete/contrib/ui/static/bulma/sass/components/pagination.css.map +1 -0
  52. accrete/contrib/ui/static/bulma/sass/components/panel.css +224 -0
  53. accrete/contrib/ui/static/bulma/sass/components/panel.css.map +1 -0
  54. accrete/contrib/ui/static/bulma/sass/components/panel.scss +2 -2
  55. accrete/contrib/ui/static/bulma/sass/components/tabs.css +192 -0
  56. accrete/contrib/ui/static/bulma/sass/components/tabs.css.map +1 -0
  57. accrete/contrib/ui/static/bulma/sass/elements/block.css +17 -0
  58. accrete/contrib/ui/static/bulma/sass/elements/block.css.map +1 -0
  59. accrete/contrib/ui/static/bulma/sass/elements/box.css +43 -0
  60. accrete/contrib/ui/static/bulma/sass/elements/box.css.map +1 -0
  61. accrete/contrib/ui/static/bulma/sass/elements/button.css +685 -0
  62. accrete/contrib/ui/static/bulma/sass/elements/button.css.map +1 -0
  63. accrete/contrib/ui/static/bulma/sass/elements/button.scss +9 -2
  64. accrete/contrib/ui/static/bulma/sass/elements/content.css +208 -0
  65. accrete/contrib/ui/static/bulma/sass/elements/content.css.map +1 -0
  66. accrete/contrib/ui/static/bulma/sass/elements/content.scss +8 -2
  67. accrete/contrib/ui/static/bulma/sass/elements/delete.css +60 -0
  68. accrete/contrib/ui/static/bulma/sass/elements/delete.css.map +1 -0
  69. accrete/contrib/ui/static/bulma/sass/elements/icon.css +51 -0
  70. accrete/contrib/ui/static/bulma/sass/elements/icon.css.map +1 -0
  71. accrete/contrib/ui/static/bulma/sass/elements/image.css +253 -0
  72. accrete/contrib/ui/static/bulma/sass/elements/image.css.map +1 -0
  73. accrete/contrib/ui/static/bulma/sass/elements/loader.css +14 -0
  74. accrete/contrib/ui/static/bulma/sass/elements/loader.css.map +1 -0
  75. accrete/contrib/ui/static/bulma/sass/elements/notification.css +213 -0
  76. accrete/contrib/ui/static/bulma/sass/elements/notification.css.map +1 -0
  77. accrete/contrib/ui/static/bulma/sass/elements/progress.css +119 -0
  78. accrete/contrib/ui/static/bulma/sass/elements/progress.css.map +1 -0
  79. accrete/contrib/ui/static/bulma/sass/elements/table.css +294 -0
  80. accrete/contrib/ui/static/bulma/sass/elements/table.css.map +1 -0
  81. accrete/contrib/ui/static/bulma/sass/elements/tag.css +252 -0
  82. accrete/contrib/ui/static/bulma/sass/elements/tag.css.map +1 -0
  83. accrete/contrib/ui/static/bulma/sass/elements/title.css +131 -0
  84. accrete/contrib/ui/static/bulma/sass/elements/title.css.map +1 -0
  85. accrete/contrib/ui/static/bulma/sass/form/checkbox-radio.css +72 -0
  86. accrete/contrib/ui/static/bulma/sass/form/checkbox-radio.css.map +1 -0
  87. accrete/contrib/ui/static/bulma/sass/form/checkbox-radio.scss +7 -3
  88. accrete/contrib/ui/static/bulma/sass/form/file.css +374 -0
  89. accrete/contrib/ui/static/bulma/sass/form/file.css.map +1 -0
  90. accrete/contrib/ui/static/bulma/sass/form/input-textarea.css +284 -0
  91. accrete/contrib/ui/static/bulma/sass/form/input-textarea.css.map +1 -0
  92. accrete/contrib/ui/static/bulma/sass/form/input-textarea.scss +0 -10
  93. accrete/contrib/ui/static/bulma/sass/form/select.css +347 -0
  94. accrete/contrib/ui/static/bulma/sass/form/select.css.map +1 -0
  95. accrete/contrib/ui/static/bulma/sass/form/select.scss +1 -0
  96. accrete/contrib/ui/static/bulma/sass/form/shared.css +48 -0
  97. accrete/contrib/ui/static/bulma/sass/form/shared.css.map +1 -0
  98. accrete/contrib/ui/static/bulma/sass/form/shared.scss +5 -1
  99. accrete/contrib/ui/static/bulma/sass/form/tools.css +356 -0
  100. accrete/contrib/ui/static/bulma/sass/form/tools.css.map +1 -0
  101. accrete/contrib/ui/static/bulma/sass/form/tools.scss +23 -12
  102. accrete/contrib/ui/static/bulma/sass/grid/columns-v2.css +1635 -0
  103. accrete/contrib/ui/static/bulma/sass/grid/columns-v2.css.map +1 -0
  104. accrete/contrib/ui/static/bulma/sass/grid/columns.css +1652 -0
  105. accrete/contrib/ui/static/bulma/sass/grid/columns.css.map +1 -0
  106. accrete/contrib/ui/static/bulma/sass/grid/columns.scss +109 -25
  107. accrete/contrib/ui/static/bulma/sass/grid/grid.css +3011 -0
  108. accrete/contrib/ui/static/bulma/sass/grid/grid.css.map +1 -0
  109. accrete/contrib/ui/static/bulma/sass/grid/grid.scss +3 -3
  110. accrete/contrib/ui/static/bulma/sass/helpers/aspect-ratio.css +61 -0
  111. accrete/contrib/ui/static/bulma/sass/helpers/aspect-ratio.css.map +1 -0
  112. accrete/contrib/ui/static/bulma/sass/helpers/border.css +17 -0
  113. accrete/contrib/ui/static/bulma/sass/helpers/border.css.map +1 -0
  114. accrete/contrib/ui/static/bulma/sass/helpers/color.css +5582 -0
  115. accrete/contrib/ui/static/bulma/sass/helpers/color.css.map +1 -0
  116. accrete/contrib/ui/static/bulma/sass/helpers/color.scss +166 -186
  117. accrete/contrib/ui/static/bulma/sass/helpers/flexbox.css +217 -0
  118. accrete/contrib/ui/static/bulma/sass/helpers/flexbox.css.map +1 -0
  119. accrete/contrib/ui/static/bulma/sass/helpers/float.css +37 -0
  120. accrete/contrib/ui/static/bulma/sass/helpers/float.css.map +1 -0
  121. accrete/contrib/ui/static/bulma/sass/helpers/gap.css +209 -0
  122. accrete/contrib/ui/static/bulma/sass/helpers/gap.css.map +1 -0
  123. accrete/contrib/ui/static/bulma/sass/helpers/other.css +34 -0
  124. accrete/contrib/ui/static/bulma/sass/helpers/other.css.map +1 -0
  125. accrete/contrib/ui/static/bulma/sass/helpers/overflow.css +65 -0
  126. accrete/contrib/ui/static/bulma/sass/helpers/overflow.css.map +1 -0
  127. accrete/contrib/ui/static/bulma/sass/helpers/position.css +45 -0
  128. accrete/contrib/ui/static/bulma/sass/helpers/position.css.map +1 -0
  129. accrete/contrib/ui/static/bulma/sass/helpers/spacing.css +489 -0
  130. accrete/contrib/ui/static/bulma/sass/helpers/spacing.css.map +1 -0
  131. accrete/contrib/ui/static/bulma/sass/helpers/typography.css +423 -0
  132. accrete/contrib/ui/static/bulma/sass/helpers/typography.css.map +1 -0
  133. accrete/contrib/ui/static/bulma/sass/helpers/visibility.css +485 -0
  134. accrete/contrib/ui/static/bulma/sass/helpers/visibility.css.map +1 -0
  135. accrete/contrib/ui/static/bulma/sass/layout/container.scss +16 -8
  136. accrete/contrib/ui/static/bulma/sass/layout/footer.css +9 -0
  137. accrete/contrib/ui/static/bulma/sass/layout/footer.css.map +1 -0
  138. accrete/contrib/ui/static/bulma/sass/layout/hero.css +534 -0
  139. accrete/contrib/ui/static/bulma/sass/layout/hero.css.map +1 -0
  140. accrete/contrib/ui/static/bulma/sass/layout/level.css +102 -0
  141. accrete/contrib/ui/static/bulma/sass/layout/level.css.map +1 -0
  142. accrete/contrib/ui/static/bulma/sass/layout/media.css +90 -0
  143. accrete/contrib/ui/static/bulma/sass/layout/media.css.map +1 -0
  144. accrete/contrib/ui/static/bulma/sass/layout/section.css +23 -0
  145. accrete/contrib/ui/static/bulma/sass/layout/section.css.map +1 -0
  146. accrete/contrib/ui/static/bulma/sass/layout/section.scss +4 -0
  147. accrete/contrib/ui/static/bulma/sass/themes/dark.css +3 -0
  148. accrete/contrib/ui/static/bulma/sass/themes/dark.css.map +1 -0
  149. accrete/contrib/ui/static/bulma/sass/themes/light.css +3 -0
  150. accrete/contrib/ui/static/bulma/sass/themes/light.css.map +1 -0
  151. accrete/contrib/ui/static/bulma/sass/themes/light.scss +1 -0
  152. accrete/contrib/ui/static/bulma/sass/themes/setup.css +3 -0
  153. accrete/contrib/ui/static/bulma/sass/themes/setup.css.map +1 -0
  154. accrete/contrib/ui/static/bulma/sass/utilities/controls.css +13 -0
  155. accrete/contrib/ui/static/bulma/sass/utilities/controls.css.map +1 -0
  156. accrete/contrib/ui/static/bulma/sass/utilities/css-variables.css +3 -0
  157. accrete/contrib/ui/static/bulma/sass/utilities/css-variables.css.map +1 -0
  158. accrete/contrib/ui/static/bulma/sass/utilities/css-variables.scss +3 -2
  159. accrete/contrib/ui/static/bulma/sass/utilities/derived-variables.css +3 -0
  160. accrete/contrib/ui/static/bulma/sass/utilities/derived-variables.css.map +1 -0
  161. accrete/contrib/ui/static/bulma/sass/utilities/extends.css +13 -0
  162. accrete/contrib/ui/static/bulma/sass/utilities/extends.css.map +1 -0
  163. accrete/contrib/ui/static/bulma/sass/utilities/functions.scss +2 -2
  164. accrete/contrib/ui/static/bulma/sass/utilities/initial-variables.css +3 -0
  165. accrete/contrib/ui/static/bulma/sass/utilities/initial-variables.css.map +1 -0
  166. accrete/contrib/ui/static/bulma/sass/utilities/initial-variables.scss +4 -4
  167. accrete/contrib/ui/static/bulma/sass/utilities/mixins.css +3 -0
  168. accrete/contrib/ui/static/bulma/sass/utilities/mixins.css.map +1 -0
  169. accrete/contrib/ui/static/bulma/sass/utilities/mixins.scss +1 -1
  170. accrete/contrib/ui/static/bulma/versions/bulma-no-dark-mode.css +19648 -0
  171. accrete/contrib/ui/static/bulma/versions/bulma-no-dark-mode.css.map +1 -0
  172. accrete/contrib/ui/static/bulma/versions/bulma-no-dark-mode.scss +2 -1
  173. accrete/contrib/ui/static/bulma/versions/bulma-no-helpers-prefixed.css +11136 -0
  174. accrete/contrib/ui/static/bulma/versions/bulma-no-helpers-prefixed.css.map +1 -0
  175. accrete/contrib/ui/static/bulma/versions/bulma-no-helpers-prefixed.scss +1 -1
  176. accrete/contrib/ui/static/bulma/versions/bulma-no-helpers.css +11136 -0
  177. accrete/contrib/ui/static/bulma/versions/bulma-no-helpers.css.map +1 -0
  178. accrete/contrib/ui/static/bulma/versions/bulma-no-helpers.scss +1 -1
  179. accrete/contrib/ui/static/bulma/versions/bulma-prefixed.css +21551 -0
  180. accrete/contrib/ui/static/bulma/versions/bulma-prefixed.css.map +1 -0
  181. accrete/contrib/ui/static/bulma/versions/bulma-prefixed.scss +1 -1
  182. accrete/contrib/ui/static/css/accrete.css +20757 -19997
  183. accrete/contrib/ui/static/css/accrete.css.map +1 -1
  184. accrete/contrib/ui/static/css/accrete.scss +185 -462
  185. accrete/contrib/ui/static/js/filter.js +97 -679
  186. accrete/contrib/ui/static/js/htmx.min.js +1 -1
  187. accrete/contrib/ui/templates/django/forms/widgets/date.html +5 -9
  188. accrete/contrib/ui/templates/django/forms/widgets/select.html +7 -5
  189. accrete/contrib/ui/templates/ui/content_right.html +7 -0
  190. accrete/contrib/ui/templates/ui/filter/filter.html +27 -0
  191. accrete/contrib/ui/templates/ui/filter/query_input.html +31 -0
  192. accrete/contrib/ui/templates/ui/filter/query_operator.html +11 -0
  193. accrete/contrib/ui/templates/ui/filter/query_params.html +106 -0
  194. accrete/contrib/ui/templates/ui/filter/query_tags.html +26 -0
  195. accrete/contrib/ui/templates/ui/layout.html +162 -233
  196. accrete/contrib/ui/templates/ui/list.html +39 -28
  197. accrete/contrib/ui/templates/ui/list_update.html +3 -0
  198. accrete/contrib/ui/templates/ui/message.html +13 -0
  199. accrete/contrib/ui/templates/ui/{partials/modal.html → modal.html} +9 -5
  200. accrete/contrib/ui/templates/ui/oob.html +3 -0
  201. accrete/contrib/ui/templates/ui/table.html +67 -71
  202. accrete/contrib/ui/templates/ui/table_row_update.html +14 -0
  203. accrete/contrib/ui/templates/ui/widgets/model_search_select.html +2 -2
  204. accrete/contrib/ui/templates/ui/widgets/model_search_select_multi.html +25 -14
  205. accrete/contrib/ui/templates/ui/widgets/model_search_select_options.html +1 -1
  206. accrete/contrib/ui/templatetags/{accrete_ui.py → ui.py} +68 -56
  207. accrete/contrib/ui/urls.py +3 -1
  208. accrete/contrib/ui/views.py +33 -3
  209. accrete/contrib/ui/widgets/__init__.py +1 -0
  210. accrete/contrib/ui/{forms/widgets.py → widgets/search_select.py} +7 -2
  211. accrete/contrib/user/templates/user/login.html +71 -23
  212. accrete/forms.py +0 -2
  213. accrete/managers.py +4 -4
  214. accrete/middleware.py +43 -66
  215. accrete/models.py +7 -1
  216. accrete/storage.py +4 -1
  217. accrete/tenant.py +9 -4
  218. accrete/utils/__init__.py +2 -0
  219. accrete/utils/models.py +9 -1
  220. accrete/utils/views.py +36 -20
  221. accrete/views.py +9 -5
  222. {accrete-0.0.103.dist-info → accrete-0.0.105.dist-info}/METADATA +2 -2
  223. accrete-0.0.105.dist-info/RECORD +370 -0
  224. {accrete-0.0.103.dist-info → accrete-0.0.105.dist-info}/WHEEL +1 -1
  225. accrete/contrib/ui/components/__init__.py +0 -1
  226. accrete/contrib/ui/components/search_select.py +0 -18
  227. accrete/contrib/ui/elements.py +0 -95
  228. accrete/contrib/ui/forms/__init__.py +0 -0
  229. accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.min.css.map +0 -1
  230. accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.min.css.map +0 -1
  231. accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.min.css.map +0 -1
  232. accrete/contrib/ui/static/bulma/sass/grid/columns-v2.scss +0 -957
  233. accrete/contrib/ui/static/js/ui.js +0 -30
  234. accrete/contrib/ui/templates/ui/dashboard.html +0 -7
  235. accrete/contrib/ui/templates/ui/detail.html +0 -19
  236. accrete/contrib/ui/templates/ui/form.html +0 -21
  237. accrete/contrib/ui/templates/ui/partials/filter.html +0 -146
  238. accrete/contrib/ui/templates/ui/partials/form_errors.html +0 -34
  239. accrete/contrib/ui/templates/ui/partials/header.html +0 -123
  240. accrete/contrib/ui/templates/ui/partials/modal_form.html +0 -46
  241. accrete/contrib/ui/templates/ui/partials/onchange_form.html +0 -1
  242. accrete/contrib/ui/templates/ui/partials/pagination_detail.html +0 -23
  243. accrete/contrib/ui/templates/ui/partials/pagination_list.html +0 -28
  244. accrete/contrib/ui/templates/ui/partials/table_field.html +0 -16
  245. accrete/contrib/ui/templates/ui/partials/table_field_float.html +0 -1
  246. accrete/contrib/ui/templates/ui/partials/table_field_monetary.html +0 -4
  247. accrete/contrib/ui/templates/ui/partials/table_field_string.html +0 -1
  248. accrete/contrib/ui/templates/ui/widgets/model_search_select_multi_selected_options.html +0 -3
  249. accrete/contrib/ui/templates/ui/widgets/model_search_select_multi_tags.html +0 -6
  250. accrete-0.0.103.dist-info/RECORD +0 -241
  251. {accrete-0.0.103.dist-info → accrete-0.0.105.dist-info}/licenses/LICENSE +0 -0
@@ -1,266 +1,195 @@
1
1
  <!doctype html>
2
2
  {% load static %}
3
3
  {% load i18n %}
4
- {% load accrete_ui %}
4
+ {% load partials %}
5
+ {% load ui %}
5
6
 
6
- <html lang="en" style="overflow: hidden" data-theme="light">
7
+ <html lang="en" style="overflow: hidden">
7
8
 
8
9
  <head>
9
- {% block head %}
10
- <meta charset="utf-8">
11
- <meta name="viewport" content="width=device-width, initial-scale=1">
12
- {% block favicon %}<link rel="icon" type="image/svg" href="{% static 'icons/accrete.svg' %}"/>{% endblock %}
13
- {% block style %}
14
- <link rel="stylesheet" type="text/css" href="{% static "css/accrete.css" %}?v=0.0.103">
10
+ {% block head %}
11
+ <meta charset="utf-8">
12
+ <meta name="viewport" content="width=device-width, initial-scale=1">
13
+ {% block favicon %}<link rel="icon" type="image/svg" href="{% static 'icons/Logo.svg' %}"/>{% endblock %}
14
+ <link rel="stylesheet" type="text/css" href="{% static "css/accrete.css" %}?v=1">
15
15
  <link rel="stylesheet" type="text/css" href="{% static "css/icons.css" %}">
16
16
  <link rel="stylesheet" type="text/css" href="{% static "css/fa.css" %}">
17
- {% endblock %}
18
- {% block script %}
17
+
18
+ <script src="{% static "js/filter.js" %}" type="text/javascript"></script>
19
19
  <script src="{% static "js/htmx.min.js" %}" defer type="text/javascript"></script>
20
- <script src="{% static "js/ui.js" %}" defer type="text/javascript"></script>
21
20
  <script src="{% static "js/alpine-sort3.14.1.js" %}" defer type="text/javascript"></script>
22
21
  <script src="{% static "js/alpine3.14.1.js" %}" defer type="text/javascript"></script>
22
+ <script defer>
23
+ document.addEventListener("setTenant", function(evt){
24
+ document.body.setAttribute("data-tenant-id", evt.detail.value);
25
+ })
26
+ document.addEventListener('htmx:configRequest', function (evt) {
27
+ evt.detail.headers['X-TENANT-ID'] = getTenant();
28
+ })
29
+ function getTenant() {
30
+ return document.body.getAttribute('data-tenant-id')
31
+ }
32
+ </script>
33
+ <title>{% block title %}{{ title }} | HRP{% endblock %}</title>
23
34
  {% endblock %}
24
- {% block title_tag %}<title id="head-page-title">{% block title %}{{ title }}{% endblock %}</title>{% endblock %}
25
- {% endblock %}
26
35
  </head>
27
36
 
28
-
29
- <body {% block body_attrs %}hx-headers='{"X-CSRFToken": "{{ csrf_token }}"}' hx-boost="true" hx-history="false" {% endblock %}>
30
- {% block body %}
31
- {% block navbar %}
32
- <nav id="navbar" class="navbar is-success is-fixed-top" role="navigation" aria-label="main navigation">
33
- <div class="navbar-brand">
34
- {% block navbar_brand %}
35
- <div class="navbar-item is-unselectable"
36
- onclick="document.getElementById('tenant-quick-switch').classList.toggle('is-invisible')"
37
- >
38
- {{ request.tenant.name }}
39
- </div>
40
- {% endblock %}
41
- <a id="navbar-burger" role="button" class="navbar-burger"
42
- aria-label="menu" aria-expanded="false"
43
- onclick="this.classList.toggle('is-active'); document.getElementById('navbar-menu').classList.toggle('is-active');"
44
- >
45
- {# Display hamburger menu on mobile #}
46
- <span aria-hidden="true"></span>
47
- <span aria-hidden="true"></span>
48
- <span aria-hidden="true"></span>
49
- <span aria-hidden="true"></span>
50
- </a>
51
- </div>
52
-
53
- <div id="navbar-menu" class="navbar-menu is-fixed-top">
54
- <div class="navbar-start">
55
- {% block navbar_start %}
56
- {% combine_templates 'accrete_menu.html' %}
57
- {% endblock %}
58
- </div>
59
-
60
- <div class="navbar-end">
61
- {% block navbar_end %}
62
- <div class="navbar-item has-dropdown is-hoverable" onclick="this.classList.toggle('is-active');">
63
- <a class="navbar-link is-arrowless {% if request.member.name %}is-size-7 has-text-centered-desktop{% endif %}">
64
- {% if request.member.name %}
65
- {{ request.member }}
66
- {% else %}
67
- {{ user }}
68
- {% endif %}
69
- </a>
70
- <div id="navbar-end-dropdown" class="navbar-dropdown is-right">
71
- {% combine_templates 'accrete_navbar_end_dropdown.html' request=request %}
72
- </div>
73
- </div>
74
- {% endblock %}
75
- </div>
76
- </div>
77
- </nav>
78
- <div id="tenant-quick-switch" class="navbar-brand-dropdown is-invisible box py-3 px-0 is-flex is-flex-direction-column" style="min-width: 200px">
79
- {% for tenant in request.user.all_tenants %}
80
- <a class="navbar-brand-dropdown-item px-4 py-1 mb-1" href="{% block tenant_switch_url %}/{% endblock %}?tenant_id={{ tenant.id }}">
81
- <span class=""
82
- onclick="document.getElementById('tenant-quick-switch').classList.toggle('is-invisible')"
83
- >
84
- {{ tenant }}
85
- </span>
86
- </a>
87
- {% endfor %}
37
+ {% block body %}
38
+ <body hx-headers='{"X-CSRFToken": "{{ csrf_token }}"}' data-tenant-id="{{ tenant.id }}" hx-boost="true" hx-history="false">
39
+ <nav id="navbar" class="navbar is-success is-fixed-top" role="navigation" aria-label="main navigation">
40
+ <div class="navbar-brand">
41
+ <div class="navbar-item is-hidden-widescreen" x-data="" x-on:click="$dispatch('toggle-panel')">
42
+ <button><i class="fa fa-right-to-bracket"></i></button>
43
+ </div>
44
+ <div class="navbar-item is-unselectable"
45
+ onclick="document.getElementById('tenant-quick-switch').classList.toggle('is-invisible')"
46
+ >
47
+ {{ request.tenant.name }}
88
48
  </div>
89
- {% endblock %}
49
+
50
+ <a id="navbar-burger" role="button" class="navbar-burger"
51
+ aria-label="menu" aria-expanded="false"
52
+ onclick="this.classList.toggle('is-active'); document.getElementById('navbar-menu').classList.toggle('is-active');"
53
+ >
54
+ {# Display hamburger menu on mobile #}
55
+ <span aria-hidden="true"></span>
56
+ <span aria-hidden="true"></span>
57
+ <span aria-hidden="true"></span>
58
+ <span aria-hidden="true"></span>
59
+ </a>
60
+ </div>
90
61
 
91
- <div id="main" class="is-flex is-flex-direction-row" style="padding-top: var(--bulma-navbar-height); height: 100svh">
92
- <div class="side-panel is-hidden-touch is-hidden-desktop-only is-hidden-widescreen-only p-0">
93
- <nav class="pb-5" style="height: 100%; overflow-y: auto; position: sticky; top: 0">
94
- {% if list_page.paginator %}
95
- <div class="side-panel-action">
96
- {% include 'ui/partials/pagination_list.html' %}
97
- </div>
98
- {% endif %}
99
- {% if detail_page %}
100
- <div class="side-panel-action">
101
- {% include 'ui/partials/pagination_detail.html' %}
102
- </div>
103
- {% endif %}
62
+ <div id="navbar-menu" class="navbar-menu is-fixed-top">
63
+ <div class="navbar-start">
64
+ {% combine_templates 'accrete_navbar.html' request %}
65
+ </div>
104
66
 
105
- <div id="panel-actions">
106
- {% for action in actions %}
107
- {% if action.actions %}
108
- <div class="dropdown" style="width: 100%" onclick="setDropDown(this)">
109
- <div class="dropdown-trigger" style="width: 100%">
110
- <div class="side-panel-action" style="width: 292px">
111
- <button class="button side-panel-action-content" aria-haspopup="true" style="width: 100%">
112
- <span>{{ action.name }}</span>
113
- <span class="icon is-small">
114
- <i class="fas fa-angle-down" aria-hidden="true"></i>
115
- </span>
116
- </button>
117
- </div>
118
- </div>
119
- <div class="dropdown-menu side-panel-action" role="menu">
120
- <div class="dropdown-content">
121
- {% for group_action in action.actions %}
122
- {% if group_action.submit %}
123
- <div class="dropdown-item">
124
- <button class="button is-fullwidth {{ group_action.class_list|join:' ' }}"
125
- type="submit" form={{ group_action.form_id }} value="{{ group_action.name }}"
126
- {{ group_action.attrs_str }}
127
- >
128
- <div class="side-panel-action-content level"><span>{{ group_action.name }}</span>
129
- {% if group_action.icon %}<i class="{{ group_action.icon.value }}"></i>{% endif %}
130
- </div>
131
- </button>
132
- </div>
133
- {% else %}
134
- <div class="dropdown-item">
135
- <a class="button is-fullwidth {{ group_action.class_list|join:' ' }}"
136
- {% if group_action.url %}
137
- {{ group_action.method.value }}="{{ group_action.url }}"
138
- {% endif %}
139
- {{ group_action.attrs_str }}
140
- >
141
- <div class="side-panel-action-content level">
142
- <span>{{ group_action.name }}</span>
143
- {% if group_action.icon %}<i class="{{ group_action.icon.value }}"></i>{% endif %}
144
- </div>
145
- </a>
146
- </div>
147
- {% endif %}
148
- {% endfor %}
149
- </div>
150
- </div>
151
- </div>
152
- {% elif action.submit %}
153
- <div class="side-panel-action">
154
- <button class="button is-fullwidth {{ action.class_list|join:' ' }}"
155
- type="submit" form={{ action.form_id }} value="{{ action.name }}"
156
- {{ action.attrs_str }}
157
- >
158
- <div class="side-panel-action-content level"><span>{{ action.name }}</span>
159
- {% if action.icon %}<i class="{{ action.icon.value }}"></i>{% endif %}
160
- </div>
161
- </button>
162
- </div>
163
- {% else %}
164
- <div class="side-panel-action">
165
- <a class="button is-fullwidth {{ action.class_list|join:' ' }}"
166
- {% if action.url %}
167
- {{ action.method.value }}="{{ action.url }}"
168
- {% endif %}
169
- {{ action.attrs_str }}
170
- >
171
- <div class="side-panel-action-content level">
172
- <span>{{ action.name }}</span>
173
- {% if action.icon %}
174
- <span class="icon is-small">
175
- <i class="{{ action.icon.value }}" aria-hidden="true"></i>
176
- </span>
177
- {% endif %}
178
- </div>
179
- </a>
180
- </div>
67
+ <div class="navbar-end">
68
+ {% block navbar_end %}
69
+ <div class="navbar-item has-dropdown" onclick="this.classList.toggle('is-active');">
70
+ <a class="navbar-link is-arrowless">{{ user }}</a>
71
+ <div id="navbar-end-dropdown" class="navbar-dropdown is-right">
72
+ <a class="navbar-item" href="{% url 'teams:teams_list' %}">{% translate 'Teams' %}</a>
73
+ <hr class="navbar-divider">
74
+ <a class="navbar-item" href="{% url 'user:detail' %}">{% translate 'Preferences' %}</a>
75
+ {% if request.user.is_staff %}
76
+ <a class="navbar-item" hx-boost="false" href="/admin/">Admin</a>
181
77
  {% endif %}
182
- {% endfor %}
78
+ <hr class="navbar-divider">
79
+ <a class="navbar-item" hx-post="{% url 'user:logout' %}">{% translate "Log out" %}</a>
80
+ </div>
183
81
  </div>
184
-
185
- {% block filter %}
186
- {% if filter %}
187
- <div id="filter-panel" class="mt-2">
188
- <div class="panel-list mx-3 mb-1 has-text-centered" style="border-bottom: 1px #ccc solid">
189
- <span>{% translate 'Filter' %}</span>
190
- </div>
191
- {% include 'ui/partials/filter.html' %}
82
+ {% endblock %}
83
+ </div>
84
+ </div>
85
+ </nav>
86
+
87
+ <div class="is-flex" style="padding-top: var(--bulma-navbar-height); height: 100svh;"
88
+ x-data="{ showPanel: false, openPanel() { this.showPanel = window.innerWidth >= 1216 } }"
89
+ x-init="openPanel();"
90
+ >
91
+ <div x-show="showPanel">
92
+ <div id="action-panel" x-show="showPanel"
93
+ @resize.debounce.100.window="openPanel()"
94
+ @toggle-panel.window="showPanel = !showPanel"
95
+ x-transition.duration.200ms
96
+ >
97
+ <nav class="px-1" style="height: 100%; overflow-y: auto; position: sticky; top: 0">
98
+ {% block panel %}{% endblock %}
99
+ {% if filter %}
100
+ <div class="mt-4">
101
+ <div class="mx-3 mb-1" style="border-bottom: 1px var(--bulma-grey) solid">
102
+ <span>{% translate 'Filter' %}</span>
192
103
  </div>
193
- {% endif %}
194
- {% endblock %}
104
+ <div class="p-3">
105
+ {% include 'ui/filter/filter.html' %}
106
+ </div>
107
+
108
+ </div>
109
+ {% endif %}
195
110
  </nav>
196
111
  </div>
112
+ </div>
197
113
 
198
- <div class="is-flex-grow-1" style="overflow-x: auto">
199
- <div class="is-flex is-flex-direction-column" style="height: 100%; overflow: hidden">
200
- <div>
201
- {% block header %}
202
- {% include 'ui/partials/header.html' %}
203
- {% endblock %}
204
- </div>
205
- <div id="content" class="px-3 pb-4" style="overflow: auto; flex-grow: 1">
206
- {% block messages %}
207
- {% if messages %}
208
- <div class="columns is-desktop">
209
- <div class="column">
210
- {% for message in messages %}
211
- <div class="columns py-0">
212
- <div class="column is-12">
213
- <div class="notification {{ message|message_class }} is-light">
214
- <p>{{ message }}</p>
215
- </div>
216
- </div>
114
+ <div class="is-flex-grow-1" style="height: 100%; overflow-x: auto;">
115
+ <div id="content" x-ref="content" style="height: calc(100svh - var(--bulma-navbar-height))">
116
+ <div id="message" class="" style="position: fixed; top: calc(var(--bulma-navbar-height) + 5px); left: 50%; transform: translateX(-50%); z-index: 999"></div>
117
+
118
+ <div x-data="{showContentRight: false}"
119
+ class="is-flex is-flex-direction-row"
120
+ style="overflow: hidden; height: calc(100svh - var(--bulma-navbar-height))"
121
+ >
122
+
123
+ <div id="content-left-container" class="table-container is-flex is-flex-grow-1 is-flex-direction-column mb-1" x-bind:class="showContentRight ? 'is-hidden-mobile' : ''">
124
+ <div id="content-left-header">
125
+ <div class="is-flex is-justify-content-space-between is-flex-wrap-wrap">
126
+ <div class="is-flex is-flex-wrap-wrap is-flex-grow-5 is-align-self-center py-2">
127
+ {% block header_left %}
128
+ <div>
129
+ <p class="subtitle is-5 px-2 py-1 my-1">{{ title }}</p>
217
130
  </div>
218
- {% endfor %}
131
+ {% endblock %}
219
132
  </div>
220
- </div>
221
- {% endif %}
222
- {% endblock %}
223
- {% block content %}{% endblock %}
133
+ {% if page %}
134
+ <div id="pagination" class="field has-addons is-flex-grow-1 is-flex-wrap-nowrap is-align-self-center py-2 mx-2" style="width: 200px">
135
+ {% partialdef pagination inline=True %}
136
+ <p class="control">
137
+ <button id="pagination-prev-button" class="button"
138
+ hx-get="{% if page.has_previous %}{% querystring page=page.previous_page_number %}{% else %}{% querystring page=page.paginator.num_pages %}{% endif %}"
139
+ hx-replace-url="true"
140
+ hx-select-oob="#content-left,#pagination"
141
+ >
142
+ &lt;
143
+ </button>
144
+ </p>
145
+ <p class="control is-expanded">
146
+ <button class="button is-fullwidth px-1" style="white-space: normal">
147
+ <span style="display: flex" class="is-flex-wrap-nowrap">
148
+ <span id="pagination-start-index" class="is-flex is-flex-wrap-nowrap"><span>{{ page.start_index }}</span><span class="mx-1"> - </span></span>
149
+ <span id="pagination-end-index">{{ page.end_index }}</span>
150
+ <span class="is-flex is-flex-wrap-nowrap"><span class="mx-1">/</span><span>{{ page.paginator.count }}</span></span>
151
+ </span>
152
+ </button>
153
+ </p>
154
+ <p class="control">
155
+ <button id="pagination-next-button" class="button"
156
+ hx-get="{% if page.has_next %}{% querystring page=page.next_page_number %}{% else %}{% querystring page=1 %}{% endif %}"
157
+ hx-replace-url="true"
158
+ hx-select-oob="#content-left,#pagination"
159
+ >
160
+ &gt;
161
+ </button>
162
+ </p>
163
+ {% endpartialdef %}
164
+ </div>
165
+ {% endif %}
166
+ </div>
167
+ </div>
168
+ <div id="content-left" class="is-flex-grow-1" style="overflow-y: auto;">
169
+ {% block content_left %}{% endblock %}
170
+ </div>
224
171
  </div>
225
- <div>
226
- {% if list_page.paginator %}
227
- <div class="level is-hidden-tablet is-align-self-flex-start m-3">
228
- <div class="level-item is-align-content-flex-start" style="width: 100%">
229
- {% include 'ui/partials/pagination_list.html' %}
172
+
173
+ <div id="content-right-container" x-show="showContentRight" style="display: none;"
174
+ x-transition:enter.duration.500ms x-transition:leave.duration.150ms
175
+ >
176
+ <div class="is-flex is-flex-direction-column" style="height: 100%">
177
+ <div class="is-flex is-flex-wrap-nowrap is-justify-content-space-between m-1">
178
+ <div id="content-right-header" class="is-flex is-flex-wrap-wrap">
179
+ {% block header_right %}{% endblock %}
230
180
  </div>
181
+ <button class="button is-light is-align-self-baseline m-1" style="border-radius: var(--bulma-radius-rounded)" x-on:click="showContentRight = false;">
182
+ <span class="icon"><i class="fa fa-xmark"></i></span>
183
+ </button>
231
184
  </div>
232
- {% endif %}
233
- {% if detail_page %}
234
- <div class="level is-hidden-tablet is-align-self-flex-start m-3">
235
- <div class="level-item is-align-content-flex-start" style="width: 100%">
236
- {% include 'ui/partials/pagination_detail.html' %}
237
- </div>
185
+ <div id="content-right" style="overflow-y: auto; flex-grow: 1">
186
+ {% block content_right %}{% endblock %}
238
187
  </div>
239
- {% endif %}
188
+ </div>
240
189
  </div>
241
190
  </div>
242
191
  </div>
243
192
  </div>
244
-
245
- {% if filter %}
246
- <div id="filter-modal" class="modal">
247
- <div class="modal-background filter-modal-close" onclick="hideFilterModal()"></div>
248
- <div class="modal-card" style="height: 100%">
249
- <header class="modal-card-head">
250
- <p class="modal-card-title">
251
- {% block search_modal_title %}{% translate 'Filter' %}{% endblock %}</p>
252
- <button class="delete filter-modal-close" aria-label="close" onclick="hideFilterModal()"></button>
253
- </header>
254
- <section id="modal-content" class="modal-card-body px-0">
255
- </section>
256
- <footer class="modal-card-foot">
257
- <button id="applyFilterFromModalButton"
258
- class="button is-fullwidth is-success ml-1"
259
- onclick="hideFilterModal()"
260
- >{% translate 'Filter' %}</button>
261
- </footer>
262
- </div>
263
- </div>
264
- {% endif %}
265
- {% endblock %}
266
- </body>
193
+ </div>
194
+ </body>
195
+ {% endblock %}
@@ -1,35 +1,46 @@
1
1
  {% extends 'ui/layout.html' %}
2
- {% load static %}
3
2
  {% load i18n %}
3
+ {% load ui %}
4
+ {% load partials %}
4
5
 
5
- {% block tenant_switch_url %}{% endblock %}
6
+ {% block header_left %}
7
+ {{ block.super }}
8
+ {% endblock %}
9
+
10
+ {% block content_left %}
11
+ <div class="fixed-grid has-{{ column_count }}-cols has-1-cols-mobile m-2">
12
+ <div id="list-grid" class="grid m-0">
13
+ {% for object in page.object_list %}
14
+ <div id="list-entry-{{ object.pk }}" class="list-entry cell pb-0" style="height: {{ column_height }}{{ column_height_unit }}">
15
+ <div class="box is-hoverable p-3"
16
+ style="word-break: break-word; height: 100%; border: var(--accrete-box-border); overflow-y: auto; {% if obj.get_absolute_url %}cursor:pointer;{% endif %}"
17
+ {% if object.get_absolute_url %}hx-get="{{ object.get_absolute_url }}{% querystring %}" hx-target="#content-right-header" hx-select="#content-right-header" hx-select-oob="#content-right" hx-swap="outerHTML"{% endif %}
18
+ x-data=""
19
+ {% if detail_enabled %}
20
+ x-on:click="showContentRight = true; $nextTick(() => { $el.scrollIntoView( {block: 'nearest'} ) });"
21
+ {% endif %}
22
+ >
6
23
 
7
- {% block content %}
8
- <div class="columns is-multiline">
9
- {% for obj in list_page %}
10
- <div class="list-column column pb-0 is-{{ column_width }}-fullhd is-{{ column_width_widescreen }}-widescreen is-{{ column_width_desktop }}-desktop is-12-touch"
11
- style="height: {{ column_height }}{{ column_height_unit }}"
12
- {% if endless_scroll and forloop.last and list_page.has_next %}
13
- hx-get="{{ pagination_param_str }}&page={{ list_page.next_page_number }}"
14
- hx-trigger="intersect once"
15
- hx-select=".list-column"
16
- hx-select-oob="#list-pagination-end-index,#list-pagination-next-button,#list-pagination-prev-button"
17
- hx-swap="afterend"
18
- hx-indicator="#endless-scroll-indicator"
19
- {% endif %}
20
- >
21
- <div class="box is-hoverable p-3"
22
- style="word-break: break-word; height: 100%; border: var(--accrete-box-border); overflow-y: auto; {% if obj.get_absolute_url %}cursor:pointer;{% endif %}"
23
- {% if obj.get_absolute_url %}hx-get="{{ obj.get_absolute_url }}{{ object_param_str }}" hx-target="body" hx-push-url="true" {% endif %}
24
- >
25
- {% block data %}
26
- {{ obj }}
27
- {% endblock %}
24
+ <div id="list-data-{{ object.pk }}">
25
+ {% block data %}
26
+ {{ object }}
27
+ {% endblock %}
28
+ </div>
29
+ </div>
28
30
  </div>
29
- </div>
30
- {% endfor %}
31
+ {% endfor %}
32
+ </div>
33
+ {% if endless_scroll and page.has_next %}
34
+ <div id="endless-scroller"
35
+ hx-get="{% querystring page=page.next_page_number %}"
36
+ hx-target="#list-grid"
37
+ hx-trigger="intersect once"
38
+ hx-select=".list-entry"
39
+ hx-select-oob="#pagination-next-button,#pagination-end-index,#endless-scroller"
40
+ hx-swap="beforeend"
41
+ hx-replace-url="true"
42
+ hx-indicator="#endless-scroll-indicator"></div>
43
+ <progress id="endless-scroll-indicator" class="htmx-indicator progress is-small is-success" max="100">15%</progress>
44
+ {% endif %}
31
45
  </div>
32
- {% if endless_scroll %}
33
- <progress id="endless-scroll-indicator" class="htmx-indicator progress is-small is-success" max="100">15%</progress>
34
- {% endif %}
35
46
  {% endblock %}
@@ -0,0 +1,3 @@
1
+ <div hx-swap-oob="innerHTML:#list-data-{{ object.pk }}">
2
+ {% include template with object=object %}
3
+ </div>
@@ -0,0 +1,13 @@
1
+ {% load ui %}
2
+
3
+ {% if messages %}
4
+ {% for message in messages %}
5
+ <div hx-swap-oob="beforeend:#message">
6
+ <div class="mb-2" style="min-width: 330px; max-width: 330px" x-data="{ show: false }" x-show="show" x-cloak="" x-init="show = true; setTimeout(() => show = false, 4000)" x-transition.duration.200ms>
7
+ <div class="notification is-light {{ message|message_class }}">
8
+ <p>{{ message }}</p>
9
+ </div>
10
+ </div>
11
+ </div>
12
+ {% endfor %}
13
+ {% endif %}
@@ -1,6 +1,9 @@
1
1
  {% load i18n %}
2
+ {% load ui %}
2
3
 
3
4
  <div id="{{ modal_id }}" x-data="{close() {$refs.modal.remove()} }" x-ref="modal" class="modal is-active"
5
+ @close-modal-{{ modal_id }}.window="$refs.modal.remove()"
6
+ @keyup.escape.window="if (! $refs.{{ modal_id|xrefsave }}Indicator.classList.contains('htmx-request')) {$dispatch('close-modal-{{ modal_id }}')}"
4
7
  {% if blocking %}
5
8
  hx-indicator="#{{ modal_id }}-indicator"
6
9
  hx-disabled-elt="#{{ modal_id }}-background"
@@ -21,14 +24,15 @@
21
24
  {% block modal_footer %}
22
25
  <div class="buttons" style="width: 100%">
23
26
  {% block modal_buttons %}
27
+ <button type="button" class="button is-light" @click="$refs.modal.remove()">
28
+ {% translate 'Close' %}
29
+ </button>
24
30
  {% endblock %}
25
31
  </div>
26
32
  {% endblock %}
27
33
  </footer>
28
- {% if blocking %}
29
- <div id="{{ modal_id }}-indicator" class="htmx-indicator modal-request-overlay" style="position: absolute; inset: 0; background: rgba(47, 47, 62, 0.2)">
30
- <progress class="progress is-success" max="100" style="position: fixed; inset: 0; min-width: 300px; max-width: 20vw; margin: auto;"></progress>
31
- </div>
32
- {% endif %}
34
+ <div id="{{ modal_id }}-indicator" x-ref="{{ modal_id|xrefsave }}Indicator" class="htmx-indicator modal-request-overlay" style="position: absolute; inset: 0; background: rgba(47, 47, 62, 0.2)">
35
+ <progress class="progress is-success" max="100" style="position: fixed; inset: 0; min-width: 300px; max-width: 20vw; margin: auto;"></progress>
36
+ </div>
33
37
  </div>
34
38
  </div>
@@ -0,0 +1,3 @@
1
+ <{{ oob.tag|default_if_none:'div' }} {% if oob.id %}id="{{ oob.id }}"{% endif %} hx-swap-oob="{{ oob.swap|default_if_none:'true' }}" {% if oob.select %}hx-select-oob="{{ oob.select }}"{% endif %}>
2
+ {% include oob.template %}
3
+ </{{ oob.tag|default_if_none:'div' }}>