django-smartbase-admin 0.2.47__py3-none-any.whl → 1.0.38__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 (188) hide show
  1. django_smartbase_admin/actions/admin_action_list.py +80 -51
  2. django_smartbase_admin/actions/advanced_filters.py +55 -20
  3. django_smartbase_admin/admin/admin_base.py +477 -89
  4. django_smartbase_admin/admin/site.py +104 -34
  5. django_smartbase_admin/admin/widgets.py +598 -26
  6. django_smartbase_admin/apps.py +2 -0
  7. django_smartbase_admin/engine/actions.py +34 -16
  8. django_smartbase_admin/engine/admin_base_view.py +253 -115
  9. django_smartbase_admin/engine/configuration.py +186 -4
  10. django_smartbase_admin/engine/const.py +7 -0
  11. django_smartbase_admin/engine/dashboard.py +44 -23
  12. django_smartbase_admin/engine/fake_inline.py +44 -7
  13. django_smartbase_admin/engine/field.py +54 -10
  14. django_smartbase_admin/engine/field_formatter.py +32 -9
  15. django_smartbase_admin/engine/filter_widgets.py +356 -21
  16. django_smartbase_admin/engine/menu_item.py +8 -5
  17. django_smartbase_admin/engine/modal_view.py +12 -7
  18. django_smartbase_admin/engine/request.py +2 -0
  19. django_smartbase_admin/integration/__init__.py +0 -0
  20. django_smartbase_admin/integration/django_cms.py +43 -0
  21. django_smartbase_admin/locale/sk/LC_MESSAGES/django.mo +0 -0
  22. django_smartbase_admin/locale/sk/LC_MESSAGES/django.po +268 -37
  23. django_smartbase_admin/migrations/0005_sbadminuserconfiguration.py +26 -0
  24. django_smartbase_admin/migrations/0006_alter_sbadminuserconfiguration_color_scheme.py +18 -0
  25. django_smartbase_admin/models.py +22 -0
  26. django_smartbase_admin/monkeypatch/admin_readonly_field_monkeypatch.py +96 -0
  27. django_smartbase_admin/monkeypatch/fake_inline_monkeypatch.py +1 -1
  28. django_smartbase_admin/querysets.py +3 -0
  29. django_smartbase_admin/services/configuration.py +30 -0
  30. django_smartbase_admin/services/thread_local.py +6 -19
  31. django_smartbase_admin/services/views.py +82 -27
  32. django_smartbase_admin/services/xlsx_export.py +6 -0
  33. django_smartbase_admin/static/sb_admin/build/tailwind.config.js +1 -0
  34. django_smartbase_admin/static/sb_admin/build/tailwind_config_partials/colors.js +4 -0
  35. django_smartbase_admin/static/sb_admin/build/tailwind_config_partials/spacing.js +1 -0
  36. django_smartbase_admin/static/sb_admin/build/webpack.common.js +11 -8
  37. django_smartbase_admin/static/sb_admin/css/ckeditor/ckeditor_content_dark.css +208 -0
  38. django_smartbase_admin/static/sb_admin/css/coloris/coloris.min.css +1 -0
  39. django_smartbase_admin/static/sb_admin/dist/calendar.js +1 -0
  40. django_smartbase_admin/static/sb_admin/dist/calendar_style.css +1 -0
  41. django_smartbase_admin/static/sb_admin/dist/calendar_style.js +0 -0
  42. django_smartbase_admin/static/sb_admin/dist/chart.js +1 -1
  43. django_smartbase_admin/static/sb_admin/dist/main.js +1 -1
  44. django_smartbase_admin/static/sb_admin/dist/main_style.css +1 -1
  45. django_smartbase_admin/static/sb_admin/dist/table.js +1 -1
  46. django_smartbase_admin/static/sb_admin/dist/table.js.LICENSE.txt +9 -0
  47. django_smartbase_admin/static/sb_admin/dist/tree_widget.js +1 -0
  48. django_smartbase_admin/static/sb_admin/dist/tree_widget_style.css +1 -0
  49. django_smartbase_admin/static/sb_admin/dist/tree_widget_style.js +0 -0
  50. django_smartbase_admin/static/sb_admin/fancytree/jquery.fancytree-all-deps.min.js +1 -0
  51. django_smartbase_admin/static/sb_admin/images/file_types/file-csv.svg +11 -0
  52. django_smartbase_admin/static/sb_admin/images/file_types/file-doc.svg +11 -0
  53. django_smartbase_admin/static/sb_admin/images/file_types/file-docx.svg +11 -0
  54. django_smartbase_admin/static/sb_admin/images/file_types/file-other.svg +13 -0
  55. django_smartbase_admin/static/sb_admin/images/file_types/file-pdf.svg +11 -0
  56. django_smartbase_admin/static/sb_admin/images/file_types/file-ppt.svg +11 -0
  57. django_smartbase_admin/static/sb_admin/images/file_types/file-xls.svg +11 -0
  58. django_smartbase_admin/static/sb_admin/images/file_types/file-xlsx.svg +11 -0
  59. django_smartbase_admin/static/sb_admin/images/file_types/file-zip.svg +18 -0
  60. django_smartbase_admin/static/sb_admin/images/flags/de-at.png +0 -0
  61. django_smartbase_admin/static/sb_admin/images/flags/de-ch.png +0 -0
  62. django_smartbase_admin/static/sb_admin/images/logo_light.svg +21 -0
  63. django_smartbase_admin/static/sb_admin/js/coloris/coloris.min.js +6 -0
  64. django_smartbase_admin/static/sb_admin/js/fullcalendar.min.js +14804 -0
  65. django_smartbase_admin/static/sb_admin/sprites/sb_admin/Bolt-one.svg +3 -0
  66. django_smartbase_admin/static/sb_admin/sprites/sb_admin/Calendar.svg +3 -0
  67. django_smartbase_admin/static/sb_admin/sprites/sb_admin/Caution.svg +3 -0
  68. django_smartbase_admin/static/sb_admin/sprites/sb_admin/Electric-drill.svg +3 -0
  69. django_smartbase_admin/static/sb_admin/sprites/sb_admin/Fire-extinguisher.svg +3 -0
  70. django_smartbase_admin/static/sb_admin/sprites/sb_admin/Gas.svg +3 -0
  71. django_smartbase_admin/static/sb_admin/sprites/sb_admin/Lightning-fill.svg +3 -0
  72. django_smartbase_admin/static/sb_admin/sprites/sb_admin/Moon.svg +3 -0
  73. django_smartbase_admin/static/sb_admin/sprites/sb_admin/Phone-telephone.svg +3 -0
  74. django_smartbase_admin/static/sb_admin/sprites/sb_admin/Printer.svg +3 -0
  75. django_smartbase_admin/static/sb_admin/sprites/sb_admin/Pull.svg +3 -0
  76. django_smartbase_admin/static/sb_admin/sprites/sb_admin/Sun-one.svg +3 -0
  77. django_smartbase_admin/static/sb_admin/sprites/sb_admin/Time.svg +3 -0
  78. django_smartbase_admin/static/sb_admin/src/css/_base.css +5 -1
  79. django_smartbase_admin/static/sb_admin/src/css/_colors.css +257 -82
  80. django_smartbase_admin/static/sb_admin/src/css/_components.css +66 -13
  81. django_smartbase_admin/static/sb_admin/src/css/_datepicker.css +8 -1
  82. django_smartbase_admin/static/sb_admin/src/css/_filer.css +60 -0
  83. django_smartbase_admin/static/sb_admin/src/css/_inlines.css +51 -10
  84. django_smartbase_admin/static/sb_admin/src/css/_tabulator.css +8 -2
  85. django_smartbase_admin/static/sb_admin/src/css/calendar.css +162 -0
  86. django_smartbase_admin/static/sb_admin/src/css/components/_button.css +41 -1
  87. django_smartbase_admin/static/sb_admin/src/css/components/_dropdown.css +26 -8
  88. django_smartbase_admin/static/sb_admin/src/css/components/_input.css +62 -20
  89. django_smartbase_admin/static/sb_admin/src/css/components/_modal.css +1 -1
  90. django_smartbase_admin/static/sb_admin/src/css/components/_query-builder.css +21 -2
  91. django_smartbase_admin/static/sb_admin/src/css/components/_toggle.css +12 -1
  92. django_smartbase_admin/static/sb_admin/src/css/components/_tooltip.css +8 -22
  93. django_smartbase_admin/static/sb_admin/src/css/style.css +17 -0
  94. django_smartbase_admin/static/sb_admin/src/css/tree_widget.css +411 -0
  95. django_smartbase_admin/static/sb_admin/src/js/autocomplete.js +63 -5
  96. django_smartbase_admin/static/sb_admin/src/js/calendar.js +56 -0
  97. django_smartbase_admin/static/sb_admin/src/js/chart.js +8 -22
  98. django_smartbase_admin/static/sb_admin/src/js/choices.js +18 -8
  99. django_smartbase_admin/static/sb_admin/src/js/datepicker.js +97 -336
  100. django_smartbase_admin/static/sb_admin/src/js/datepicker_plugins.js +357 -0
  101. django_smartbase_admin/static/sb_admin/src/js/main.js +307 -26
  102. django_smartbase_admin/static/sb_admin/src/js/multiselect.js +50 -41
  103. django_smartbase_admin/static/sb_admin/src/js/range.js +3 -2
  104. django_smartbase_admin/static/sb_admin/src/js/sb_ajax_params_tabulator_modifier.js +21 -0
  105. django_smartbase_admin/static/sb_admin/src/js/table.js +38 -13
  106. django_smartbase_admin/static/sb_admin/src/js/table_modules/advanced_filter_module.js +43 -20
  107. django_smartbase_admin/static/sb_admin/src/js/table_modules/data_edit_module.js +8 -10
  108. django_smartbase_admin/static/sb_admin/src/js/table_modules/filter_module.js +3 -3
  109. django_smartbase_admin/static/sb_admin/src/js/table_modules/header_tabs_module.js +11 -11
  110. django_smartbase_admin/static/sb_admin/src/js/table_modules/selection_module.js +28 -8
  111. django_smartbase_admin/static/sb_admin/src/js/table_modules/table_params_module.js +6 -0
  112. django_smartbase_admin/static/sb_admin/src/js/table_modules/views_module.js +19 -3
  113. django_smartbase_admin/static/sb_admin/src/js/tree_widget.js +406 -0
  114. django_smartbase_admin/static/sb_admin/src/js/utils.js +56 -21
  115. django_smartbase_admin/templates/sb_admin/actions/change_form.html +169 -117
  116. django_smartbase_admin/templates/sb_admin/actions/dashboard.html +2 -2
  117. django_smartbase_admin/templates/sb_admin/actions/delete_selected_confirmation.html +56 -32
  118. django_smartbase_admin/templates/sb_admin/actions/list.html +79 -42
  119. django_smartbase_admin/templates/sb_admin/actions/object_history.html +2 -2
  120. django_smartbase_admin/templates/sb_admin/actions/partials/action_link.html +14 -0
  121. django_smartbase_admin/templates/sb_admin/actions/partials/selected_rows_actions.html +2 -2
  122. django_smartbase_admin/templates/sb_admin/actions/partials/tabulator_header_v2.html +2 -2
  123. django_smartbase_admin/templates/sb_admin/actions/tree_list.html +63 -0
  124. django_smartbase_admin/templates/sb_admin/authentification/login_base.html +5 -1
  125. django_smartbase_admin/templates/sb_admin/components/columns.html +1 -1
  126. django_smartbase_admin/templates/sb_admin/components/filters_v2.html +99 -85
  127. django_smartbase_admin/templates/sb_admin/config/view.html +0 -1
  128. django_smartbase_admin/templates/sb_admin/dashboard/calendar_widget.html +69 -0
  129. django_smartbase_admin/templates/sb_admin/dashboard/chart_widget.html +21 -2
  130. django_smartbase_admin/templates/sb_admin/dashboard/list_widget.html +6 -0
  131. django_smartbase_admin/templates/sb_admin/dashboard/widget_base.html +1 -1
  132. django_smartbase_admin/templates/sb_admin/filter_widgets/advanced_filters/date_field.html +18 -8
  133. django_smartbase_admin/templates/sb_admin/filter_widgets/advanced_filters/multiple_choice_field.html +1 -1
  134. django_smartbase_admin/templates/sb_admin/filter_widgets/advanced_filters/tree_select_filter.html +2 -0
  135. django_smartbase_admin/templates/sb_admin/filter_widgets/date_field.html +18 -4
  136. django_smartbase_admin/templates/sb_admin/filter_widgets/multiple_choice_field.html +14 -0
  137. django_smartbase_admin/templates/sb_admin/filter_widgets/partials/clear.html +10 -5
  138. django_smartbase_admin/templates/sb_admin/filter_widgets/radio_choice_field.html +2 -2
  139. django_smartbase_admin/templates/sb_admin/filter_widgets/tree_select_filter.html +16 -0
  140. django_smartbase_admin/templates/sb_admin/includes/change_form_title.html +3 -1
  141. django_smartbase_admin/templates/sb_admin/includes/components.html +5 -1
  142. django_smartbase_admin/templates/sb_admin/includes/inline_fieldset.html +48 -39
  143. django_smartbase_admin/templates/sb_admin/includes/notifications.html +2 -1
  144. django_smartbase_admin/templates/sb_admin/includes/readonly_boolean_field.html +9 -0
  145. django_smartbase_admin/templates/sb_admin/includes/readonly_field.html +12 -0
  146. django_smartbase_admin/templates/sb_admin/includes/table_inline_delete_button.html +4 -5
  147. django_smartbase_admin/templates/sb_admin/inlines/stacked_inline.html +68 -40
  148. django_smartbase_admin/templates/sb_admin/inlines/table_inline.html +78 -36
  149. django_smartbase_admin/templates/sb_admin/integrations/filer/folder_list.html +18 -0
  150. django_smartbase_admin/templates/sb_admin/navigation.html +166 -158
  151. django_smartbase_admin/templates/sb_admin/partials/modal/modal_content.html +2 -6
  152. django_smartbase_admin/templates/sb_admin/sb_admin_base.html +49 -4
  153. django_smartbase_admin/templates/sb_admin/sb_admin_base_no_sidebar.html +35 -11
  154. django_smartbase_admin/templates/sb_admin/sb_admin_js_trans.html +3 -0
  155. django_smartbase_admin/templates/sb_admin/sprites/sb_admin.svg +1 -1
  156. django_smartbase_admin/templates/sb_admin/tailwind_whitelist.html +6 -3
  157. django_smartbase_admin/templates/sb_admin/widgets/array.html +0 -1
  158. django_smartbase_admin/templates/sb_admin/widgets/attributes.html +68 -0
  159. django_smartbase_admin/templates/sb_admin/widgets/autocomplete.html +13 -2
  160. django_smartbase_admin/templates/sb_admin/widgets/{checkbox_select.html → checkbox_dropdown.html} +2 -2
  161. django_smartbase_admin/templates/sb_admin/widgets/checkbox_group.html +15 -0
  162. django_smartbase_admin/templates/sb_admin/widgets/clearable_file_input.html +2 -2
  163. django_smartbase_admin/templates/sb_admin/widgets/color_field.html +30 -0
  164. django_smartbase_admin/templates/sb_admin/widgets/date.html +8 -1
  165. django_smartbase_admin/templates/sb_admin/widgets/filer_file.html +84 -0
  166. django_smartbase_admin/templates/sb_admin/widgets/html_read_only.html +1 -0
  167. django_smartbase_admin/templates/sb_admin/widgets/includes/related_item_buttons.html +38 -0
  168. django_smartbase_admin/templates/sb_admin/widgets/multiwidget.html +1 -1
  169. django_smartbase_admin/templates/sb_admin/widgets/radio.html +3 -2
  170. django_smartbase_admin/templates/sb_admin/widgets/radio_dropdown.html +30 -0
  171. django_smartbase_admin/templates/sb_admin/widgets/read_only_password_hash.html +3 -0
  172. django_smartbase_admin/templates/sb_admin/widgets/time.html +8 -1
  173. django_smartbase_admin/templates/sb_admin/widgets/toggle.html +1 -1
  174. django_smartbase_admin/templates/sb_admin/widgets/tree_base.html +59 -0
  175. django_smartbase_admin/templates/sb_admin/widgets/tree_select.html +24 -0
  176. django_smartbase_admin/templates/sb_admin/widgets/tree_select_inline.html +12 -0
  177. django_smartbase_admin/templatetags/sb_admin_tags.py +163 -4
  178. django_smartbase_admin/utils.py +22 -3
  179. django_smartbase_admin/views/dashboard_view.py +6 -0
  180. django_smartbase_admin/views/global_filter_view.py +8 -2
  181. django_smartbase_admin/views/translations_view.py +12 -5
  182. django_smartbase_admin/views/user_config_view.py +52 -0
  183. django_smartbase_admin-1.0.38.dist-info/METADATA +166 -0
  184. {django_smartbase_admin-0.2.47.dist-info → django_smartbase_admin-1.0.38.dist-info}/RECORD +186 -121
  185. {django_smartbase_admin-0.2.47.dist-info → django_smartbase_admin-1.0.38.dist-info}/WHEEL +1 -1
  186. django_smartbase_admin/templates/sb_admin/integrations/sorting/change_list.html +0 -401
  187. django_smartbase_admin-0.2.47.dist-info/METADATA +0 -25
  188. {django_smartbase_admin-0.2.47.dist-info → django_smartbase_admin-1.0.38.dist-info}/LICENSE.md +0 -0
@@ -30,7 +30,7 @@
30
30
  <td class="p-16"><strong>{{ action.action_time|date:"DATETIME_FORMAT" }}</strong></td>
31
31
  <td class="p-16">{{ action.user.get_username }}{% if action.user.get_full_name %} (
32
32
  {{ action.user.get_full_name }}){% endif %}</td>
33
- <td class="p-16">{{ action.get_change_message }}</td>
33
+ <td class="p-16">{% get_log_entry_message action as entry_log %} {{ entry_log|linebreaks }}</td>
34
34
  </tr>
35
35
  {% endfor %}
36
36
  </tbody>
@@ -42,4 +42,4 @@
42
42
  {% endif %}
43
43
  </div>
44
44
 
45
- {% endblock %}
45
+ {% endblock %}
@@ -0,0 +1,14 @@
1
+ <a {% if action.open_in_modal %}
2
+ {% include 'sb_admin/actions/partials/open_modal_attrs.html' with action=action %}
3
+ hx-vals="js:{params: window.SBAdminTable['{{ view_id }}'].getAllUrlParams()}"
4
+ {% else %}
5
+ onclick="window.SBAdmin.executeListAction('{{ view_id }}', '{{ action.url }}', {{ action.no_params|yesno:'true,false' }}, {{ action.open_in_new_tab|default:False|yesno:'true,false'|lower }})"
6
+ {% endif %}
7
+ class="{{ extra_classes|default:'' }} {{ action.css_class|default_if_none:'' }}">
8
+ {% if action.icon %}
9
+ <svg class="w-16 h-16 mr-8">
10
+ <use xlink:href="#{{ action.icon }}"></use>
11
+ </svg>
12
+ {% endif %}
13
+ {{ action.title }}
14
+ </a>
@@ -33,7 +33,7 @@
33
33
  <li>
34
34
  {{ list_selection_action.items }}
35
35
  <a {% if list_selection_action.open_in_modal %}{% include 'sb_admin/actions/partials/open_modal_attrs.html' with action=list_selection_action %} hx-vals="js:{params: window.SBAdminTable['{{ view_id }}'].getAllUrlParams()}"
36
- {% else %}onclick="window.SBAdminTable['{{ view_id }}'].executeListAction('{{ list_action.url }}', {{ list_action.no_params|yesno:'true,false' }})"{% endif %}
36
+ {% else %}onclick="window.SBAdmin.executeListAction('{{ view_id }}', '{{ list_selection_action.url }}', {{ list_selection_action.no_params|yesno:'true,false' }})"{% endif %}
37
37
  class="dropdown-menu-link {{ list_selection_action.css_class|default_if_none:'' }}">{{ list_selection_action.title }}</a>
38
38
  </li>
39
39
  {% endfor %}
@@ -42,7 +42,7 @@
42
42
  {% else %}
43
43
  {# no group #}
44
44
  {% for list_selection_action in list_selection_action_group %}
45
- <button {% if list_selection_action.open_in_modal %}{% include 'sb_admin/actions/partials/open_modal_attrs.html' with action=list_selection_action %} hx-vals="js:{params: window.SBAdminTable['{{ view_id }}'].getAllUrlParams()}" {% else %}onclick="window.SBAdminTable['{{ view_id }}'].executeListAction('{{ list_action.url }}', {{ list_action.no_params|yesno:'true,false' }})"{% endif %}
45
+ <button {% if list_selection_action.open_in_modal %}{% include 'sb_admin/actions/partials/open_modal_attrs.html' with action=list_selection_action %} hx-vals="js:{params: window.SBAdminTable['{{ view_id }}'].getAllUrlParams()}" {% else %}onclick="window.SBAdmin.executeListAction('{{ view_id }}', '{{ list_selection_action.url }}', {{ list_selection_action.no_params|yesno:'true,false' }})"{% endif %}
46
46
  class="btn btn-small {{ list_selection_action.css_class|default_if_none:'' }}">{{ list_selection_action.title }}
47
47
  </button>
48
48
  {% endfor %}
@@ -7,7 +7,7 @@
7
7
  <input form="{{ view_id }}-filter-form"
8
8
  type="hidden"
9
9
  value=""
10
- id="id_{{ content_context.const.TABLE_PARAMS_SELECTED_FILTER_TYPE }}"
10
+ id="{{ view_id }}-{{ content_context.const.TABLE_PARAMS_SELECTED_FILTER_TYPE }}"
11
11
  name="{{ content_context.const.TABLE_PARAMS_SELECTED_FILTER_TYPE }}">
12
12
  {% block table_header_before_tabs_header %}
13
13
  {% endblock %}
@@ -85,7 +85,7 @@
85
85
  </svg>
86
86
  </div>
87
87
  </div>
88
- <button class="btn btn-primary">{% trans 'Search' %}</button>
88
+ <button type="button" class="btn btn-primary">{% trans 'Search' %}</button>
89
89
  </div>
90
90
  </div>
91
91
  </div>
@@ -0,0 +1,63 @@
1
+ {% extends "sb_admin/actions/list.html" %}
2
+ {% load static sb_admin_tags i18n %}
3
+
4
+ {% block extrahead %}
5
+ {{ block.super }}
6
+ <style>
7
+ #table-columns-dropdown-wrapper {
8
+ display: none;
9
+ }
10
+ </style>
11
+ {% endblock %}
12
+
13
+ {% block tabulator_card %}
14
+ {% with enable_table_filter=request.reorder_active|yesno:',True' %}
15
+ {% if enable_table_filter %}
16
+ {{ block.super }}
17
+ {% else %}
18
+ <div class="overflow-hidden pb-8 relative tree-list-view">
19
+ {{ block.super }}
20
+ </div>
21
+ {% endif %}
22
+ {% endwith %}
23
+ {% endblock %}
24
+
25
+ {% block tabulator_custom_header %}
26
+ {% if not request.reorder_active %}
27
+ {% include content_context.tabulator_header_template_name %}
28
+ {% endif %}
29
+ {% endblock %}
30
+ {% block tabulator_body %}
31
+ {% with view_id|add:'_tree' as tree_id %}
32
+ <div class="overflow-auto w-full relative">
33
+ {% include "sb_admin/widgets/tree_base.html" with tree_main_column_name=list_title tree_reorder_url=content_context.tabulator_definition.treeReorderUrl tree_additional_columns=additional_columns tree_component_id=tree_id tree_data_url=tree_json_url tree_detail_url=content_context.tabulator_definition.tableDetailUrl hide_tree_search=True filter_by_table_data=enable_table_filter tree_show_checkbox=enable_table_filter tree_multiselect=enable_table_filter search_wrapper_classes="py-16 md:p-16" %}
34
+ </div>
35
+ {% endwith %}
36
+ {% if not request.reorder_active %}
37
+ <div class="hidden">
38
+ {{ block.super }}
39
+ </div>
40
+ {% endif %}
41
+ {% endblock %}
42
+ {% block tabulator_custom_footer %}
43
+ {% endblock %}
44
+
45
+ {% block actions %}
46
+ {% with view_id|add:'_tree' as tree_id %}
47
+ {% if request.request_data.action == 'action_enter_reorder' %}
48
+ <li class="max-sm:hidden">
49
+ <button onclick="$.ui.fancytree.getTree('#' + '{{ tree_id }}' + '_tree').saveTreeOrder()"
50
+ class="btn btn-empty">
51
+ {% trans 'Save Order' %}
52
+ </button>
53
+ </li>
54
+ {% endif %}
55
+ {% endwith %}
56
+ {{ block.super }}
57
+ {% endblock %}
58
+
59
+ {% block additional_js %}
60
+ {% if not request.reorder_active %}
61
+ {{ block.super }}
62
+ {% endif %}
63
+ {% endblock %}
@@ -2,8 +2,12 @@
2
2
  {% load i18n static %}
3
3
 
4
4
  {% block main_wrapper %}
5
+ {% include "sb_admin/includes/notifications.html" with classes="top-16 xl:!left-0" %}
5
6
  <div class="flex items-center max-h-screen">
6
- <img loading="lazy" src="{% static "sb_admin/images/logo.svg" %}" alt="Logo" class="max-h-40 absolute md:left-40 md:top-40 left-24 top-24">
7
+ <img loading="lazy" src="{% static "sb_admin/images/logo.svg" %}" alt="Logo"
8
+ class="max-h-40 absolute md:left-40 md:top-40 left-24 top-24 dark:hidden">
9
+ <img loading="lazy" src="{% static "sb_admin/images/logo_light.svg" %}" alt="Logo"
10
+ class="max-h-40 absolute md:left-40 md:top-40 left-24 top-24 hidden dark:block">
7
11
  <div class="md:max-w-640 w-full flex justify-center items-center h-screen">
8
12
  <div class="max-w-370 w-full mx-24">
9
13
  {% block content %}{% endblock %}
@@ -1,6 +1,6 @@
1
1
  {% load i18n %}
2
2
 
3
- <div class="inline-flex relative js-select-all-wrapper">
3
+ <div id="table-columns-dropdown-wrapper" class="inline-flex relative js-select-all-wrapper">
4
4
  <button
5
5
  data-bs-toggle="dropdown"
6
6
  aria-expanded="false"
@@ -19,92 +19,106 @@
19
19
  <div class="query-builder-wrapper p-24 flex md:flex-wrap gap-8 max-sm:overflow-x-auto">
20
20
  <div id="{{ view_id }}-advanced-filter" class="query-builder-advanced"></div>
21
21
  <script>
22
- window.addEventListener("SBinitOrUpdateQueryBuilder", (event) => {
23
- const SBTable = event.detail.SBTable.table;
24
- const filterData = event.detail.filterData;
25
- const queryBuilderEl$ = $("#{{ view_id }}-advanced-filter");
26
- if (!queryBuilderEl$[0].queryBuilder) {
27
- queryBuilderEl$.on("afterCreateRuleInput.queryBuilder", function(event, rule) {
28
- setTimeout(() => {
29
- //next tick
30
- SBTable.moduleInstances.advancedFilterModule.initFilters(event, rule)
31
- }, 0)
32
- })
33
- queryBuilderEl$.on("afterUpdateRuleOperator.queryBuilder", function(event, rule, previousOperator) {
34
- setTimeout(() => {
35
- SBTable.moduleInstances.advancedFilterModule.afterUpdateRuleOperator(event, rule, previousOperator)
36
- }, 0)
37
- })
38
- let customOptions = document.getElementById('query-builder-custom-options')
39
- if(customOptions) {
40
- customOptions = JSON.parse(customOptions.textContent)
22
+ (function(){
23
+ // used to prevent calling initFilters on page load
24
+ // because afterUpdateRuleOperator is also called at that time
25
+ // and filters would be initiated twice, causing date field to have no value
26
+ let init = true;
27
+
28
+ window.addEventListener("SBinitOrUpdateQueryBuilder", (event) => {
29
+ const SBTable = event.detail.SBTable.table;
30
+ const filterData = event.detail.filterData;
31
+ const queryBuilderEl$ = $("#{{ view_id }}-advanced-filter");
32
+ init = true;
33
+ if (!queryBuilderEl$[0].queryBuilder) {
34
+ queryBuilderEl$.on("afterCreateRuleInput.queryBuilder", function(event, rule) {
35
+ setTimeout(() => {
36
+ //next tick
37
+ SBTable.moduleInstances.advancedFilterModule.initFilters(event, rule);
38
+ }, 0);
39
+ })
40
+ queryBuilderEl$.on("afterSetRules.queryBuilder", function(event, rule) {
41
+ init = false;
42
+ });
43
+ queryBuilderEl$.on("afterUpdateRuleOperator.queryBuilder", function(event, rule, previousOperator) {
44
+ if(init) {
45
+ return;
46
+ };
47
+ setTimeout(() => {
48
+ SBTable.moduleInstances.advancedFilterModule.afterUpdateRuleOperator(event, rule, previousOperator);
49
+ }, 0);
50
+ });
51
+ let customOptions = document.getElementById('query-builder-custom-options');
52
+ if(customOptions) {
53
+ customOptions = JSON.parse(customOptions.textContent);
54
+ };
55
+ queryBuilderEl$.queryBuilder({
56
+ operators: {{ content_context.advanced_filters_data.all_operators|safe }},
57
+ templates: {
58
+ group: function({ group_id, level, conditions, icons, settings, translate, builder }) {
59
+ return `
60
+ <div id="${group_id}" class="rules-group-container">
61
+ <div class="rules-group-header">
62
+ <div class="btn-group group-conditions">
63
+ ${conditions.map(condition => `
64
+ <label class="btn btn-sm btn-primary">
65
+ <input type="radio" name="${group_id}_cond" value="${condition}"> ${translate("conditions", condition)}
66
+ </label>
67
+ `).join("\n")}
68
+ </div>
69
+ ${settings.display_errors ? `
70
+ <div class="error-container"><i class="${icons.error}"></i></div>
71
+ ` : ""}
72
+ </div>
73
+ <div class=rules-group-body>
74
+ <div class=rules-list></div>
75
+ </div>
76
+ <div class="btn-group float-end group-actions">
77
+ <button type="button" class="btn btn-sm btn-success" data-add="rule">
78
+ <i class="${icons.add_rule}"></i> ${translate("add_rule")}
79
+ </button>
80
+ ${settings.allow_groups === -1 || settings.allow_groups >= level ? `
81
+ <button type="button" class="btn btn-sm" data-add="group">
82
+ <i class="${icons.add_group}"></i> ${translate("add_group")}
83
+ </button>
84
+ ` : ""}
85
+ ${level > 1 ? `
86
+ <button type="button" class="btn btn-sm btn-danger" data-delete="group">
87
+ <i class="${icons.remove_group}"></i> ${translate("delete_group")}
88
+ </button>
89
+ ` : ""}
90
+ <button type="button" class="btn btn-sm btn-primary" data-execute>
91
+ ${translate("view_results")}
92
+ </button>
93
+ </div>
94
+ </div>`
95
+ }
96
+ },
97
+ allow_groups: false,
98
+ allow_empty: true,
99
+ filters: [
100
+ {% for filter in content_context.advanced_filters_data.filters %}
101
+ {
102
+ id: '{{ filter.id }}',
103
+ field: '{{ filter.field }}',
104
+ type: '{{ filter.type }}',
105
+ label: '{{ filter.label }}',
106
+ operators: {{ filter.operators|safe }},
107
+ input: function(rule, name) {
108
+ return `{{ filter.input|safe }}`.replaceAll(
109
+ '{{ content_context.advanced_filters_data.prefix_to_replace }}',
110
+ name
111
+ )
112
+ }
113
+ },
114
+ {% endfor %}
115
+ ],
116
+ ...customOptions
117
+ })
41
118
  }
42
- queryBuilderEl$.queryBuilder({
43
- operators: {{ content_context.advanced_filters_data.all_operators|safe }},
44
- templates: {
45
- group: function({ group_id, level, conditions, icons, settings, translate, builder }) {
46
- return `
47
- <div id="${group_id}" class="rules-group-container">
48
- <div class="rules-group-header">
49
- <div class="btn-group group-conditions">
50
- ${conditions.map(condition => `
51
- <label class="btn btn-sm btn-primary">
52
- <input type="radio" name="${group_id}_cond" value="${condition}"> ${translate("conditions", condition)}
53
- </label>
54
- `).join("\n")}
55
- </div>
56
- ${settings.display_errors ? `
57
- <div class="error-container"><i class="${icons.error}"></i></div>
58
- ` : ""}
59
- </div>
60
- <div class=rules-group-body>
61
- <div class=rules-list></div>
62
- </div>
63
- <div class="btn-group float-end group-actions">
64
- <button type="button" class="btn btn-sm btn-success" data-add="rule">
65
- <i class="${icons.add_rule}"></i> ${translate("add_rule")}
66
- </button>
67
- ${settings.allow_groups === -1 || settings.allow_groups >= level ? `
68
- <button type="button" class="btn btn-sm" data-add="group">
69
- <i class="${icons.add_group}"></i> ${translate("add_group")}
70
- </button>
71
- ` : ""}
72
- ${level > 1 ? `
73
- <button type="button" class="btn btn-sm btn-danger" data-delete="group">
74
- <i class="${icons.remove_group}"></i> ${translate("delete_group")}
75
- </button>
76
- ` : ""}
77
- <button type="button" class="btn btn-sm btn-primary" data-execute>
78
- ${translate("view_results")}
79
- </button>
80
- </div>
81
- </div>`
82
- }
83
- },
84
- allow_groups: false,
85
- allow_empty: true,
86
- filters: [
87
- {% for filter in content_context.advanced_filters_data.filters %}
88
- {
89
- id: '{{ filter.id }}',
90
- field: '{{ filter.field }}',
91
- type: '{{ filter.type }}',
92
- label: '{{ filter.label }}',
93
- operators: {{ filter.operators|safe }},
94
- input: function(rule, name) {
95
- return `{{ filter.input|safe }}`.replaceAll(
96
- '{{ content_context.advanced_filters_data.prefix_to_replace }}',
97
- name
98
- )
99
- }
100
- },
101
- {% endfor %}
102
- ],
103
- ...customOptions
104
- })
105
- }
106
- queryBuilderEl$.queryBuilder("setRules", filterData)
107
- })
119
+ queryBuilderEl$.queryBuilder("setRules", filterData);
120
+ });
121
+ }());
108
122
  </script>
109
123
  </div>
110
124
  {% endblock %}
@@ -78,4 +78,3 @@
78
78
  id="{{ content_context.const.URL_PARAMS_NAME }}" form="view_form">
79
79
 
80
80
  </form>
81
- {% include 'sb_admin/includes/confirmation.html' %}
@@ -0,0 +1,69 @@
1
+ {% extends "sb_admin/dashboard/widget_base.html" %}
2
+ {% load sb_admin_tags static i18n %}
3
+
4
+ {% block filters %}{% endblock %}
5
+
6
+ {% block content_inner %}
7
+ <div id="{{ widget_id }}" class="card p-16 pb-0 col-span-12">
8
+ <div class="p-8 flex items-center justify-between">
9
+ <div class="flex flex-col">
10
+ <div class="text-18 text-dark-900 font-semibold">
11
+ {% trans 'Calendar' %}
12
+ </div>
13
+ <div class="text-14">
14
+ <span id="{{ widget_id }}-date-from"></span>
15
+ -
16
+ <span id="{{ widget_id }}-date-to"></span>
17
+ </div>
18
+ </div>
19
+
20
+ <div class="flex gap-16 items-center">
21
+ {% include 'sb_admin/components/filters.html' with filters=settings all_filters_visible=True %}
22
+ <div class="btn-group">
23
+ <button class="btn p-0 w-40" onclick="window.SBAdminCalendar['{{ widget_id }}'].calendar.prev();">
24
+ <svg><use href="#Left-small"></use></svg>
25
+ </button>
26
+ <div class="btn pointer-events-none" id="{{ widget_id }}-selected-month" style="width: 150px;"></div>
27
+ <button class="btn p-0 w-40" onclick="window.SBAdminCalendar['{{ widget_id }}'].calendar.next();">
28
+ <svg><use href="#Right-small"></use></svg>
29
+ </button>
30
+ </div>
31
+ </div>
32
+ </div>
33
+ <div class="mt-16 -mx-16">
34
+ <script type="text/javascript" src="{% static 'sb_admin/js/fullcalendar.min.js' %}"></script>
35
+ <link rel="stylesheet" href="{% static 'sb_admin/dist/calendar_style.css' %}">
36
+ <script type="text/javascript" src="{% static 'sb_admin/dist/calendar.js' %}"></script>
37
+
38
+ <script>
39
+ document.addEventListener('DOMContentLoaded', function() {
40
+ const selectedMonth = document.getElementById('{{ widget_id }}-selected-month');
41
+ const dateFrom = document.getElementById('{{ widget_id }}-date-from');
42
+ const dateTo = document.getElementById('{{ widget_id }}-date-to');
43
+
44
+ window.SBAdminCalendar = window.SBAdminCalendar || {};
45
+ window.SBAdminCalendar["{{ widget_id }}"] = new window.SBAdminCalendarClass({
46
+ "widgetId": "{{ widget_id }}",
47
+ "calendarOptions": {
48
+ initialView: 'dayGridMonth',
49
+ events: {
50
+ url: "{{ ajax_url }}",
51
+ },
52
+ dayMaxEvents: 3,
53
+ height: 'auto',
54
+ locale: '{{request.LANGUAGE_CODE}}',
55
+ headerToolbar: false,
56
+ fixedWeekCount: false,
57
+ datesSet: function(info) {
58
+ selectedMonth.innerText = info.view.title;
59
+ dateFrom.innerText = info.view.currentStart.toLocaleDateString('{{request.LANGUAGE_CODE}}', {day: 'numeric', month: 'long', year: 'numeric'});
60
+ dateTo.innerText = new Date(info.view.currentStart.getFullYear(), info.view.currentStart.getMonth() + 1, 0).toLocaleDateString('{{request.LANGUAGE_CODE}}', {day: 'numeric', month: 'long', year: 'numeric'});
61
+ }
62
+ }
63
+ });
64
+ });
65
+ </script>
66
+ <div id="{{ widget_id }}-calendar"></div>
67
+ </div>
68
+ </div>
69
+ {% endblock %}
@@ -2,7 +2,7 @@
2
2
  {% load sb_admin_tags static %}
3
3
 
4
4
  {% block content_inner %}
5
- <div class="card sm:mb-24 p-16">
5
+ <div id="{{ widget_id }}" class="card p-16 col-span-12">
6
6
  <div class="mt-16">
7
7
  <script type="text/javascript" src="{% static 'sb_admin/dist/chart.js' %}"></script>
8
8
  <div class="flex flex-wrap -m-8 mb-16">
@@ -17,9 +17,28 @@
17
17
  <script>
18
18
  window.SBAdminChart = window.SBAdminChart || {};
19
19
  window.SBAdminChart["{{ widget_id }}"] = new window.SBAdminChartClass({
20
+ "formId": "{{ widget_id }}-filter-form",
20
21
  "widgetId": "{{ widget_id }}",
21
22
  "ajaxUrl": "{{ ajax_url }}",
22
- "chartType": "{{ chart_type }}"
23
+ "chartType": "{{ chart_type }}",
24
+ "chartOptions": {
25
+ scales: {
26
+ x: {
27
+ ticks: {
28
+ font: {
29
+ weight: 600,
30
+ }
31
+ }
32
+ },
33
+ y: {
34
+ ticks: {
35
+ font: {
36
+ weight: 600,
37
+ }
38
+ }
39
+ }
40
+ }
41
+ }
23
42
  });
24
43
  </script>
25
44
  </div>
@@ -2,3 +2,9 @@
2
2
 
3
3
  {% block page_header %}{% endblock %}
4
4
  {% block tabulator_custom_header_controls %}{% endblock %}
5
+
6
+ {% block content %}
7
+ <div id="{{ widget_id }}" class="col-span-12">
8
+ {{ block.super }}
9
+ </div>
10
+ {% endblock %}
@@ -3,7 +3,7 @@
3
3
  </form>
4
4
 
5
5
  {% block filters %}
6
- <div class="flex max-sm:flex-wrap max-xs:py-16 sm:mb-24 gap-y-8 justify-between">
6
+ <div class="dashboard-filter flex max-sm:flex-wrap max-xs:pt-16 gap-y-8 justify-between col-span-12">
7
7
  <div class="min-w-0 sm:-mx-16 -my-12">
8
8
  {% include 'sb_admin/components/filters.html' with filters=settings all_filters_visible=True default_button=True %}
9
9
  </div>
@@ -1,8 +1,18 @@
1
- <input
2
- type="text"
3
- autocomplete="off"
4
- class="input pl-10 js-datepicker-not-inline"
5
- id="{{ filter_widget.input_id }}"
6
- name="{{ filter_widget.input_name }}"
7
- data-sbadmin-datepicker="{{ filter_widget.get_data }}"
8
- >
1
+ <div class="relative">
2
+ <input
3
+ type="hidden"
4
+ autocomplete="off"
5
+ id="{{ filter_widget.input_id }}"
6
+ name="{{ filter_widget.input_name }}"
7
+ >
8
+ <input
9
+ type="text"
10
+ autocomplete="off"
11
+ class="input pl-10 js-datepicker-dynamic"
12
+ id="{{ filter_widget.input_id }}_picker"
13
+ name="{{ filter_widget.input_name }}_picker"
14
+ data-sbadmin-datepicker-real-input-id="{{ filter_widget.input_id }}"
15
+ data-sbadmin-datepicker="{{ filter_widget.get_data }}"
16
+ data-sbadmin-datepicker-shortcuts-dict="{{ filter_widget.get_shortcuts_dict_data }}"
17
+ >
18
+ </div>
@@ -7,7 +7,7 @@
7
7
  data-bs-auto-close="outside"
8
8
  class="btn !rounded px-10 font-normal w-full"
9
9
  >
10
- <span id="{{ filter_widget.input_id }}-value" class="js-value"></span>
10
+ <span id="{{ filter_widget.input_id }}-value"></span>
11
11
  <svg class="ml-8">
12
12
  <use xlink:href="#Down"></use>
13
13
  </svg>
@@ -0,0 +1,2 @@
1
+ {% include 'sb_admin/filter_widgets/tree_select_filter.html' %}
2
+
@@ -1,8 +1,22 @@
1
- <div class="dropdown-menu dropdown-menu-datepicker" style="max-width: none; width: auto; height: auto; max-height: none;">
1
+ <div class="dropdown-menu dropdown-menu-datepicker"
2
+ style="max-width: none; width: auto; height: auto; max-height: none;">
2
3
  <div class="px-12 py-8">
3
- <input form="{{ filter_widget.view_id }}-filter-form" type="text" class="input pl-10 js-datepicker-range"
4
- id="{{ filter_widget.input_id }}" name="{{ filter_widget.input_name }}" data-sbadmin-datepicker="{{ filter_widget.get_data }}"
5
- {% if not all_filters_visible %}disabled{% endif %}{% if filter_widget.get_default_value %} value="{{ filter_widget.get_default_value }}"{% endif %}>
4
+ <input
5
+ type="hidden"
6
+ autocomplete="off"
7
+ id="{{ filter_widget.input_id }}"
8
+ name="{{ filter_widget.input_name }}"
9
+ form="{{ filter_widget.view_id }}-filter-form"
10
+ {% if filter_widget.get_default_value %}value="{{ filter_widget.get_default_value }}" data-label="{{ filter_widget.get_default_label }}"{% endif %}
11
+ {% if not all_filters_visible %}disabled{% endif %}
12
+ >
13
+ <input type="text"
14
+ class="input pl-10 js-datepicker-range"
15
+ id="{{ filter_widget.input_id }}_picker"
16
+ name="{{ filter_widget.input_name }}_picker"
17
+ data-sbadmin-datepicker-real-input-id="{{ filter_widget.input_id }}"
18
+ data-sbadmin-datepicker="{{ filter_widget.get_data }}"
19
+ data-sbadmin-datepicker-shortcuts="{{ filter_widget.get_shortcuts_data }}">
6
20
  </div>
7
21
  {% include "sb_admin/filter_widgets/partials/clear.html" %}
8
22
  </div>
@@ -6,6 +6,20 @@
6
6
  {% if not all_filters_visible %}disabled{% endif %}{% if filter_widget.get_default_value %}
7
7
  value="{{ filter_widget.get_default_value }}"{% endif %}>
8
8
  <ul class="relative py-8">
9
+ {% if filter_widget.enable_select_all %}
10
+ <li>
11
+ <div class="relative px-12 py-8">
12
+ <input type="checkbox"
13
+ value="{{ filter_widget.select_all_keyword }}"
14
+ name="{{ filter_widget.input_name }}_dummy"
15
+ class="checkbox js-simple-multiselect-all"
16
+ id="{{ filter_widget.input_id }}_all" {% if filter_widget.get_default_value == filter_widget.select_all_keyword %} checked{% endif %} data-label="{{ filter_widget.select_all_label }}">
17
+ <label for="{{ filter_widget.input_id }}_all">
18
+ {{ filter_widget.select_all_label }}
19
+ </label>
20
+ </div>
21
+ </li>
22
+ {% endif %}
9
23
  {% for choice in filter_widget.choices %}
10
24
  <li>
11
25
  <div class="relative px-12 py-8">
@@ -8,9 +8,14 @@
8
8
  {% trans 'Remove' %}
9
9
  </button>
10
10
  {% endif %}
11
- <button type="button"
12
- class="text-primary ml-auto"
13
- onclick="window.SBAdminTable['{{ view_id }}'].moduleInstances.filterModule.clearFilter('{{ filter_field.filter_field }}')">
14
- {% trans 'Clear' %}
15
- </button>
11
+ <button type="button"
12
+ class="text-primary ml-auto"
13
+ {% if view_id %}
14
+ onclick="window.SBAdminTable['{{ view_id }}'].moduleInstances.filterModule.clearFilter('{{ filter_field.filter_field }}')"
15
+ {% else %}
16
+ onclick="window.SBAdmin.clearFilter('{{ filter_field.filter_widget.input_id }}')"
17
+ {% endif %}
18
+ >
19
+ {% trans 'Clear' %}
20
+ </button>
16
21
  </div>
@@ -7,8 +7,8 @@
7
7
  {% for choice in filter_widget.choices %}
8
8
  <li>
9
9
  <div class="relative">
10
- <input onchange="document.getElementById('{{ filter_widget.input_id }}').value = event.target.value;document.getElementById('{{ filter_widget.input_id }}').dispatchEvent(new Event('change'))" type="radio" value="{{ choice.0 }}" name="{{ filter_widget.input_name }}_dummy" class="radio" id="{{ filter_widget.input_id }}_{{ forloop.counter0 }}" {% if filter_widget.get_default_value == choice.0 %} checked{% endif %} data-label="{{ choice.1 }}">
11
- <label for="{{ filter_widget.input_id }}_{{ forloop.counter0 }}">
10
+ <input onchange="document.getElementById('{{ filter_widget.input_id }}').value = event.target.value;document.getElementById('{{ filter_widget.input_id }}').dispatchEvent(new Event('change'))" type="radio" value="{{ choice.0 }}" name="{{ filter_widget.input_name }}_dummy" class="radio radio-list" id="{{ filter_widget.input_id }}_{{ choice.0 }}" {% if filter_widget.get_default_value == choice.0 %} checked{% endif %} data-label="{{ choice.1 }}">
11
+ <label for="{{ filter_widget.input_id }}_{{ choice.0 }}">
12
12
  {{ choice.1|safe }}
13
13
  </label>
14
14
  </div>