django-smartbase-admin 0.2.54__py3-none-any.whl → 1.0.42__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 (184) hide show
  1. django_smartbase_admin/actions/admin_action_list.py +79 -38
  2. django_smartbase_admin/actions/advanced_filters.py +24 -1
  3. django_smartbase_admin/admin/admin_base.py +402 -97
  4. django_smartbase_admin/admin/site.py +93 -35
  5. django_smartbase_admin/admin/widgets.py +636 -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 +252 -115
  9. django_smartbase_admin/engine/configuration.py +186 -4
  10. django_smartbase_admin/engine/const.py +6 -0
  11. django_smartbase_admin/engine/dashboard.py +49 -24
  12. django_smartbase_admin/engine/fake_inline.py +15 -11
  13. django_smartbase_admin/engine/field.py +42 -12
  14. django_smartbase_admin/engine/field_formatter.py +38 -14
  15. django_smartbase_admin/engine/filter_widgets.py +348 -24
  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 +80 -13
  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/tree_widget.js +1 -0
  47. django_smartbase_admin/static/sb_admin/dist/tree_widget_style.css +1 -0
  48. django_smartbase_admin/static/sb_admin/dist/tree_widget_style.js +0 -0
  49. django_smartbase_admin/static/sb_admin/fancytree/jquery.fancytree-all-deps.min.js +1 -0
  50. django_smartbase_admin/static/sb_admin/images/file_types/file-csv.svg +11 -0
  51. django_smartbase_admin/static/sb_admin/images/file_types/file-doc.svg +11 -0
  52. django_smartbase_admin/static/sb_admin/images/file_types/file-docx.svg +11 -0
  53. django_smartbase_admin/static/sb_admin/images/file_types/file-other.svg +13 -0
  54. django_smartbase_admin/static/sb_admin/images/file_types/file-pdf.svg +11 -0
  55. django_smartbase_admin/static/sb_admin/images/file_types/file-ppt.svg +11 -0
  56. django_smartbase_admin/static/sb_admin/images/file_types/file-xls.svg +11 -0
  57. django_smartbase_admin/static/sb_admin/images/file_types/file-xlsx.svg +11 -0
  58. django_smartbase_admin/static/sb_admin/images/file_types/file-zip.svg +18 -0
  59. django_smartbase_admin/static/sb_admin/images/flags/de-at.png +0 -0
  60. django_smartbase_admin/static/sb_admin/images/flags/de-ch.png +0 -0
  61. django_smartbase_admin/static/sb_admin/images/logo_light.svg +21 -0
  62. django_smartbase_admin/static/sb_admin/js/coloris/coloris.min.js +6 -0
  63. django_smartbase_admin/static/sb_admin/js/fullcalendar.min.js +14804 -0
  64. django_smartbase_admin/static/sb_admin/js/sbadmin_prepopulated_fields_init.js +25 -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 +61 -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 +31 -7
  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 +69 -11
  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 +306 -31
  102. django_smartbase_admin/static/sb_admin/src/js/multiselect.js +50 -41
  103. django_smartbase_admin/static/sb_admin/src/js/radio.js +31 -0
  104. django_smartbase_admin/static/sb_admin/src/js/range.js +3 -2
  105. django_smartbase_admin/static/sb_admin/src/js/table.js +34 -5
  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/detail_view_module.js +50 -1
  109. django_smartbase_admin/static/sb_admin/src/js/table_modules/filter_module.js +10 -3
  110. django_smartbase_admin/static/sb_admin/src/js/table_modules/header_tabs_module.js +11 -11
  111. django_smartbase_admin/static/sb_admin/src/js/table_modules/selection_module.js +28 -8
  112. django_smartbase_admin/static/sb_admin/src/js/table_modules/table_params_module.js +6 -0
  113. django_smartbase_admin/static/sb_admin/src/js/table_modules/views_module.js +6 -0
  114. django_smartbase_admin/static/sb_admin/src/js/tree_widget.js +406 -0
  115. django_smartbase_admin/static/sb_admin/src/js/utils.js +56 -21
  116. django_smartbase_admin/templates/sb_admin/actions/change_form.html +176 -116
  117. django_smartbase_admin/templates/sb_admin/actions/dashboard.html +2 -2
  118. django_smartbase_admin/templates/sb_admin/actions/list.html +79 -39
  119. django_smartbase_admin/templates/sb_admin/actions/partials/action_link.html +14 -0
  120. django_smartbase_admin/templates/sb_admin/actions/partials/tabulator_header_v2.html +2 -2
  121. django_smartbase_admin/templates/sb_admin/actions/tree_list.html +63 -0
  122. django_smartbase_admin/templates/sb_admin/authentification/login_base.html +5 -1
  123. django_smartbase_admin/templates/sb_admin/components/columns.html +1 -1
  124. django_smartbase_admin/templates/sb_admin/components/filters.html +1 -0
  125. django_smartbase_admin/templates/sb_admin/components/filters_v2.html +99 -85
  126. django_smartbase_admin/templates/sb_admin/dashboard/calendar_widget.html +69 -0
  127. django_smartbase_admin/templates/sb_admin/dashboard/chart_widget.html +21 -2
  128. django_smartbase_admin/templates/sb_admin/dashboard/list_widget.html +6 -0
  129. django_smartbase_admin/templates/sb_admin/dashboard/widget_base.html +1 -1
  130. django_smartbase_admin/templates/sb_admin/filter_widgets/advanced_filters/date_field.html +18 -8
  131. django_smartbase_admin/templates/sb_admin/filter_widgets/advanced_filters/multiple_choice_field.html +1 -1
  132. django_smartbase_admin/templates/sb_admin/filter_widgets/advanced_filters/tree_select_filter.html +2 -0
  133. django_smartbase_admin/templates/sb_admin/filter_widgets/boolean_field.html +1 -14
  134. django_smartbase_admin/templates/sb_admin/filter_widgets/date_field.html +18 -4
  135. django_smartbase_admin/templates/sb_admin/filter_widgets/multiple_choice_field.html +14 -0
  136. django_smartbase_admin/templates/sb_admin/filter_widgets/partials/clear.html +12 -6
  137. django_smartbase_admin/templates/sb_admin/filter_widgets/radio_choice_field.html +5 -3
  138. django_smartbase_admin/templates/sb_admin/filter_widgets/tree_select_filter.html +16 -0
  139. django_smartbase_admin/templates/sb_admin/includes/change_form_title.html +3 -1
  140. django_smartbase_admin/templates/sb_admin/includes/inline_fieldset.html +48 -39
  141. django_smartbase_admin/templates/sb_admin/includes/notifications.html +2 -1
  142. django_smartbase_admin/templates/sb_admin/includes/readonly_boolean_field.html +9 -0
  143. django_smartbase_admin/templates/sb_admin/includes/readonly_field.html +12 -0
  144. django_smartbase_admin/templates/sb_admin/includes/table_inline_delete_button.html +4 -5
  145. django_smartbase_admin/templates/sb_admin/inlines/stacked_inline.html +68 -40
  146. django_smartbase_admin/templates/sb_admin/inlines/table_inline.html +76 -34
  147. django_smartbase_admin/templates/sb_admin/integrations/filer/folder_list.html +18 -0
  148. django_smartbase_admin/templates/sb_admin/navigation.html +166 -158
  149. django_smartbase_admin/templates/sb_admin/partials/modal/modal_content.html +2 -6
  150. django_smartbase_admin/templates/sb_admin/sb_admin_base.html +49 -4
  151. django_smartbase_admin/templates/sb_admin/sb_admin_base_no_sidebar.html +27 -11
  152. django_smartbase_admin/templates/sb_admin/sb_admin_js_trans.html +3 -0
  153. django_smartbase_admin/templates/sb_admin/sprites/sb_admin.svg +1 -1
  154. django_smartbase_admin/templates/sb_admin/tailwind_whitelist.html +6 -3
  155. django_smartbase_admin/templates/sb_admin/widgets/array.html +0 -1
  156. django_smartbase_admin/templates/sb_admin/widgets/attributes.html +68 -0
  157. django_smartbase_admin/templates/sb_admin/widgets/autocomplete.html +13 -2
  158. django_smartbase_admin/templates/sb_admin/widgets/{checkbox_select.html → checkbox_dropdown.html} +2 -2
  159. django_smartbase_admin/templates/sb_admin/widgets/clearable_file_input.html +2 -2
  160. django_smartbase_admin/templates/sb_admin/widgets/color_field.html +30 -0
  161. django_smartbase_admin/templates/sb_admin/widgets/date.html +8 -1
  162. django_smartbase_admin/templates/sb_admin/widgets/filer_file.html +84 -0
  163. django_smartbase_admin/templates/sb_admin/widgets/includes/related_item_buttons.html +38 -0
  164. django_smartbase_admin/templates/sb_admin/widgets/multiwidget.html +1 -1
  165. django_smartbase_admin/templates/sb_admin/widgets/radio.html +3 -2
  166. django_smartbase_admin/templates/sb_admin/widgets/radio_dropdown.html +30 -0
  167. django_smartbase_admin/templates/sb_admin/widgets/read_only_password_hash.html +3 -0
  168. django_smartbase_admin/templates/sb_admin/widgets/time.html +8 -1
  169. django_smartbase_admin/templates/sb_admin/widgets/toggle.html +1 -1
  170. django_smartbase_admin/templates/sb_admin/widgets/tree_base.html +59 -0
  171. django_smartbase_admin/templates/sb_admin/widgets/tree_select.html +24 -0
  172. django_smartbase_admin/templates/sb_admin/widgets/tree_select_inline.html +12 -0
  173. django_smartbase_admin/templatetags/sb_admin_tags.py +115 -4
  174. django_smartbase_admin/utils.py +22 -3
  175. django_smartbase_admin/views/dashboard_view.py +6 -0
  176. django_smartbase_admin/views/global_filter_view.py +8 -2
  177. django_smartbase_admin/views/translations_view.py +12 -5
  178. django_smartbase_admin/views/user_config_view.py +52 -0
  179. django_smartbase_admin-1.0.42.dist-info/METADATA +166 -0
  180. {django_smartbase_admin-0.2.54.dist-info → django_smartbase_admin-1.0.42.dist-info}/RECORD +182 -118
  181. {django_smartbase_admin-0.2.54.dist-info → django_smartbase_admin-1.0.42.dist-info}/WHEEL +1 -1
  182. django_smartbase_admin/templates/sb_admin/integrations/sorting/change_list.html +0 -401
  183. django_smartbase_admin-0.2.54.dist-info/METADATA +0 -25
  184. {django_smartbase_admin-0.2.54.dist-info → django_smartbase_admin-1.0.42.dist-info}/LICENSE.md +0 -0
@@ -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"
@@ -8,6 +8,7 @@
8
8
  <button
9
9
  data-bs-toggle="dropdown"
10
10
  aria-expanded="false"
11
+ {% if filter_field.filter_widget.close_dropdown_on_change %}data-sbadmin-close-on-change="1"{% endif %}
11
12
  class="js-filter-dropdown-button empty {% if default_button %}btn{% else %}filter-dropdown-button{% endif %}">
12
13
  <span>
13
14
  {{ filter_field.title|capfirst }}: <span
@@ -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 %}
@@ -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,14 +1 @@
1
- {% load i18n %}
2
-
3
- <div class="dropdown-menu">
4
- <div class="px-12 py-8 relative">
5
- <select form="{{ filter_widget.view_id }}-filter-form" class="input pl-10 pr-38"
6
- id="{{ filter_widget.input_id }}" name="{{ filter_widget.input_name }}"
7
- {% if not all_filters_visible %}disabled{% endif %}>
8
- <option value="true">{% trans 'Yes' %}</option>
9
- <option value="false">{% trans 'No' %}</option>
10
- </select>
11
- </div>
12
- {% include "sb_admin/filter_widgets/partials/clear.html" %}
13
- </div>
14
-
1
+ {% include "sb_admin/filter_widgets/radio_choice_field.html" %}
@@ -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">
@@ -1,5 +1,5 @@
1
1
  {% load i18n %}
2
-
2
+ {% if filter_field.filter_widget.allow_clear %}
3
3
  <div class="relative px-12 py-8 flex">
4
4
  {% if not all_filters_visible %}
5
5
  <button type="button"
@@ -8,9 +8,15 @@
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>
22
+ {% endif %}
@@ -1,18 +1,20 @@
1
- <div class="dropdown-menu">
1
+ <div class="dropdown-menu js-radio-choice-widget-wrapper">
2
2
  <ul class="relative">
3
3
  <input form="{{ filter_widget.view_id }}-filter-form" type="hidden"
4
+ class="js-radio-choice-widget"
4
5
  id="{{ filter_widget.input_id }}" name="{{ filter_widget.input_name }}"
5
6
  {% if not all_filters_visible %}disabled{% endif %}{% if filter_widget.get_default_value %}
6
7
  value="{{ filter_widget.get_default_value }}"{% endif %}>
7
8
  {% for choice in filter_widget.choices %}
8
9
  <li>
9
10
  <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 }}">
11
+ <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 }}">
12
+ <label for="{{ filter_widget.input_id }}_{{ choice.0 }}">
12
13
  {{ choice.1|safe }}
13
14
  </label>
14
15
  </div>
15
16
  </li>
16
17
  {% endfor %}
17
18
  </ul>
19
+ {% include "sb_admin/filter_widgets/partials/clear.html" %}
18
20
  </div>
@@ -0,0 +1,16 @@
1
+ {% load sb_admin_tags %}
2
+
3
+ <div class="dropdown-menu max-h-none w-248">
4
+ <div class="px-12 pt-8 border-b border-dark-200">
5
+ {% with tree_widget_id=filter_widget.view_id|add:"-"|add:filter_widget.input_id|add:"_tree" %}
6
+ <div class="relative -mx-12">
7
+ <input form="{{ filter_widget.view_id }}-filter-form" type="hidden"
8
+ id="{{ filter_widget.input_id }}" name="{{ filter_widget.input_name }}"
9
+ {% if not all_filters_visible %}disabled{% endif %}{% if filter_widget.get_default_value %} value="{{ filter_widget.get_default_value|get_json }}"{% endif %}>
10
+ {% include "sb_admin/widgets/tree_base.html" with tree_additional_columns=filter_widget.additional_columns tree_strings=filter_widget.tree_strings tree_filter=True tree_value=filter_widget.get_default_value tree_multiselect=filter_widget.multiselect tree_component_id=filter_widget.input_id tree_data_url=filter_widget.to_json.autocomplete_url tree_show_checkbox=True search_wrapper_classes="pb-8 px-12" table_wrapper_classes="max-h-432 overflow-auto custom-scrollbar" %}
11
+ </div>
12
+ {% endwith %}
13
+ </div>
14
+ {% include "sb_admin/filter_widgets/partials/clear.html" %}
15
+ </div>
16
+
@@ -1,7 +1,9 @@
1
1
  {% load i18n %}
2
2
 
3
3
  {% if add %}
4
- {% blocktrans with name=opts.verbose_name %}Add {{ name }}{% endblocktrans %}
4
+ {% trans 'Add' %}{% if add_label %} {{ add_label }}{% endif %}
5
+ {% elif change_label %}
6
+ {{ change_label }}
5
7
  {% else %}
6
8
  {{ original|truncatewords:"18" }}
7
9
  {% endif %}