accrete 0.0.104__py3-none-any.whl → 0.0.106__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 (248) hide show
  1. accrete/contrib/ui/__init__.py +6 -29
  2. accrete/contrib/ui/context.py +26 -297
  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 +165 -232
  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 +24 -13
  205. accrete/contrib/ui/templates/ui/widgets/model_search_select_options.html +1 -1
  206. accrete/contrib/ui/templatetags/{accrete_ui.py → ui.py} +67 -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.104.dist-info → accrete-0.0.106.dist-info}/METADATA +3 -2
  223. accrete-0.0.106.dist-info/RECORD +370 -0
  224. {accrete-0.0.104.dist-info → accrete-0.0.106.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_tags.html +0 -17
  245. accrete/contrib/ui/templates/ui/widgets/model_search_select_multi_selected_options.html +0 -3
  246. accrete/contrib/ui/templates/ui/widgets/model_search_select_multi_tags.html +0 -6
  247. accrete-0.0.104.dist-info/RECORD +0 -238
  248. {accrete-0.0.104.dist-info → accrete-0.0.106.dist-info}/licenses/LICENSE +0 -0
@@ -1,266 +1,199 @@
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" x-data="{ showPanel: false, openPanel() { this.showPanel = window.innerWidth >= 1216 } }">
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 pr-2" x-on:click="$dispatch('toggle-panel')">
42
+ <button>
43
+ <i class="fa fa-indent" x-show="!showPanel"></i>
44
+ <i class="fa fa-outdent" x-show="showPanel"></i>
45
+ </button>
46
+ </div>
47
+ <div class="navbar-item is-unselectable pl-0"
48
+ onclick="document.getElementById('tenant-quick-switch').classList.toggle('is-invisible')"
49
+ >
50
+ {{ request.tenant.name }}
88
51
  </div>
89
- {% endblock %}
52
+
53
+ <a id="navbar-burger" role="button" class="navbar-burger"
54
+ aria-label="menu" aria-expanded="false"
55
+ onclick="this.classList.toggle('is-active'); document.getElementById('navbar-menu').classList.toggle('is-active');"
56
+ x-on:click="showPanel = false"
57
+ >
58
+ {# Display hamburger menu on mobile #}
59
+ <span aria-hidden="true"></span>
60
+ <span aria-hidden="true"></span>
61
+ <span aria-hidden="true"></span>
62
+ <span aria-hidden="true"></span>
63
+ </a>
64
+ </div>
90
65
 
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 %}
66
+ <div id="navbar-menu" class="navbar-menu is-fixed-top">
67
+ <div class="navbar-start">
68
+ {% combine_templates 'accrete_navbar.html' request %}
69
+ </div>
104
70
 
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>
71
+ <div class="navbar-end">
72
+ {% block navbar_end %}
73
+ <div class="navbar-item has-dropdown" onclick="this.classList.toggle('is-active');">
74
+ <a class="navbar-link is-arrowless">{{ user }}</a>
75
+ <div id="navbar-end-dropdown" class="navbar-dropdown is-right">
76
+ <a class="navbar-item" href="{% url 'teams:teams_list' %}">{% translate 'Teams' %}</a>
77
+ <hr class="navbar-divider">
78
+ <a class="navbar-item" href="{% url 'user:detail' %}">{% translate 'Preferences' %}</a>
79
+ {% if request.user.is_staff %}
80
+ <a class="navbar-item" hx-boost="false" href="/admin/">Admin</a>
181
81
  {% endif %}
182
- {% endfor %}
82
+ <hr class="navbar-divider">
83
+ <a class="navbar-item" hx-post="{% url 'user:logout' %}">{% translate "Log out" %}</a>
84
+ </div>
183
85
  </div>
86
+ {% endblock %}
87
+ </div>
88
+ </div>
89
+ </nav>
90
+
91
+ <div class="is-flex" style="padding-top: var(--bulma-navbar-height); height: 100svh;"
184
92
 
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' %}
93
+ x-init="openPanel();"
94
+ >
95
+ <div x-show="showPanel">
96
+ <div id="action-panel" x-show="showPanel"
97
+ @resize.debounce.100.window="openPanel()"
98
+ @toggle-panel.window="showPanel = !showPanel"
99
+ x-transition.duration.200ms
100
+ >
101
+ <nav class="px-1" style="height: 100%; overflow-y: auto; position: sticky; top: 0">
102
+ {% block panel %}{% endblock %}
103
+ {% if filter %}
104
+ <div class="mt-4">
105
+ <div class="mx-3 mb-1" style="border-bottom: 1px var(--bulma-grey) solid">
106
+ <span>{% translate 'Filter' %}</span>
107
+ </div>
108
+ <div class="p-3">
109
+ {% include 'ui/filter/filter.html' %}
192
110
  </div>
193
- {% endif %}
194
- {% endblock %}
111
+
112
+ </div>
113
+ {% endif %}
195
114
  </nav>
196
115
  </div>
116
+ </div>
197
117
 
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>
118
+ <div class="is-flex-grow-1" style="height: 100%; overflow-x: auto;">
119
+ <div id="content" x-ref="content" style="height: calc(100svh - var(--bulma-navbar-height))">
120
+ <div id="message" class="" style="position: fixed; top: calc(var(--bulma-navbar-height) + 5px); left: 50%; transform: translateX(-50%); z-index: 999"></div>
121
+
122
+ <div x-data="{showContentRight: false}"
123
+ class="is-flex is-flex-direction-row"
124
+ style="overflow: hidden; height: calc(100svh - var(--bulma-navbar-height))"
125
+ >
126
+
127
+ <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' : ''">
128
+ <div id="content-left-header">
129
+ <div class="is-flex is-justify-content-space-between is-flex-wrap-wrap">
130
+ <div class="is-flex is-flex-wrap-wrap is-flex-grow-5 is-align-self-center py-2">
131
+ {% block header_left %}
132
+ <div>
133
+ <p class="subtitle is-5 px-2 py-1 my-1">{{ title }}</p>
217
134
  </div>
218
- {% endfor %}
135
+ {% endblock %}
219
136
  </div>
220
- </div>
221
- {% endif %}
222
- {% endblock %}
223
- {% block content %}{% endblock %}
137
+ {% if page %}
138
+ <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">
139
+ {% partialdef pagination inline=True %}
140
+ <p class="control">
141
+ <button id="pagination-prev-button" class="button"
142
+ hx-get="{% if page.has_previous %}{% querystring page=page.previous_page_number %}{% else %}{% querystring page=page.paginator.num_pages %}{% endif %}"
143
+ hx-replace-url="true"
144
+ hx-select-oob="#content-left,#pagination"
145
+ >
146
+ &lt;
147
+ </button>
148
+ </p>
149
+ <p class="control is-expanded">
150
+ <button class="button is-fullwidth px-1" style="white-space: normal">
151
+ <span style="display: flex" class="is-flex-wrap-nowrap">
152
+ <span id="pagination-start-index" class="is-flex is-flex-wrap-nowrap"><span>{{ page.start_index }}</span><span class="mx-1"> - </span></span>
153
+ <span id="pagination-end-index">{{ page.end_index }}</span>
154
+ <span class="is-flex is-flex-wrap-nowrap"><span class="mx-1">/</span><span>{{ page.paginator.count }}</span></span>
155
+ </span>
156
+ </button>
157
+ </p>
158
+ <p class="control">
159
+ <button id="pagination-next-button" class="button"
160
+ hx-get="{% if page.has_next %}{% querystring page=page.next_page_number %}{% else %}{% querystring page=1 %}{% endif %}"
161
+ hx-replace-url="true"
162
+ hx-select-oob="#content-left,#pagination"
163
+ >
164
+ &gt;
165
+ </button>
166
+ </p>
167
+ {% endpartialdef %}
168
+ </div>
169
+ {% endif %}
170
+ </div>
171
+ </div>
172
+ <div id="content-left" class="is-flex-grow-1" style="overflow-y: auto;">
173
+ {% block content_left %}{% endblock %}
174
+ </div>
224
175
  </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' %}
176
+
177
+ <div id="content-right-container" x-show="showContentRight" style="display: none;"
178
+ x-transition:enter.duration.500ms x-transition:leave.duration.150ms
179
+ >
180
+ <div class="is-flex is-flex-direction-column" style="height: 100%">
181
+ <div class="is-flex is-flex-wrap-nowrap is-justify-content-space-between m-1">
182
+ <div id="content-right-header" class="is-flex is-flex-wrap-wrap">
183
+ {% block header_right %}{% endblock %}
230
184
  </div>
185
+ <button class="button is-light is-align-self-baseline m-1" style="border-radius: var(--bulma-radius-rounded)" x-on:click="showContentRight = false;">
186
+ <span class="icon"><i class="fa fa-xmark"></i></span>
187
+ </button>
231
188
  </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>
189
+ <div id="content-right" style="overflow-y: auto; flex-grow: 1">
190
+ {% block content_right %}{% endblock %}
238
191
  </div>
239
- {% endif %}
192
+ </div>
240
193
  </div>
241
194
  </div>
242
195
  </div>
243
196
  </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>
197
+ </div>
198
+ </body>
199
+ {% 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' }}>