django-smartbase-admin 0.2.54__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 (179) hide show
  1. django_smartbase_admin/actions/admin_action_list.py +74 -38
  2. django_smartbase_admin/actions/advanced_filters.py +24 -1
  3. django_smartbase_admin/admin/admin_base.py +401 -96
  4. django_smartbase_admin/admin/site.py +93 -35
  5. django_smartbase_admin/admin/widgets.py +589 -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 +44 -23
  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 +22 -8
  15. django_smartbase_admin/engine/filter_widgets.py +309 -20
  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/sprites/sb_admin/Bolt-one.svg +3 -0
  65. django_smartbase_admin/static/sb_admin/sprites/sb_admin/Calendar.svg +3 -0
  66. django_smartbase_admin/static/sb_admin/sprites/sb_admin/Caution.svg +3 -0
  67. django_smartbase_admin/static/sb_admin/sprites/sb_admin/Electric-drill.svg +3 -0
  68. django_smartbase_admin/static/sb_admin/sprites/sb_admin/Fire-extinguisher.svg +3 -0
  69. django_smartbase_admin/static/sb_admin/sprites/sb_admin/Gas.svg +3 -0
  70. django_smartbase_admin/static/sb_admin/sprites/sb_admin/Lightning-fill.svg +3 -0
  71. django_smartbase_admin/static/sb_admin/sprites/sb_admin/Moon.svg +3 -0
  72. django_smartbase_admin/static/sb_admin/sprites/sb_admin/Phone-telephone.svg +3 -0
  73. django_smartbase_admin/static/sb_admin/sprites/sb_admin/Printer.svg +3 -0
  74. django_smartbase_admin/static/sb_admin/sprites/sb_admin/Pull.svg +3 -0
  75. django_smartbase_admin/static/sb_admin/sprites/sb_admin/Sun-one.svg +3 -0
  76. django_smartbase_admin/static/sb_admin/sprites/sb_admin/Time.svg +3 -0
  77. django_smartbase_admin/static/sb_admin/src/css/_base.css +5 -1
  78. django_smartbase_admin/static/sb_admin/src/css/_colors.css +257 -82
  79. django_smartbase_admin/static/sb_admin/src/css/_components.css +61 -13
  80. django_smartbase_admin/static/sb_admin/src/css/_datepicker.css +8 -1
  81. django_smartbase_admin/static/sb_admin/src/css/_filer.css +60 -0
  82. django_smartbase_admin/static/sb_admin/src/css/_inlines.css +51 -10
  83. django_smartbase_admin/static/sb_admin/src/css/_tabulator.css +8 -2
  84. django_smartbase_admin/static/sb_admin/src/css/calendar.css +162 -0
  85. django_smartbase_admin/static/sb_admin/src/css/components/_button.css +41 -1
  86. django_smartbase_admin/static/sb_admin/src/css/components/_dropdown.css +26 -8
  87. django_smartbase_admin/static/sb_admin/src/css/components/_input.css +62 -20
  88. django_smartbase_admin/static/sb_admin/src/css/components/_modal.css +1 -1
  89. django_smartbase_admin/static/sb_admin/src/css/components/_query-builder.css +21 -2
  90. django_smartbase_admin/static/sb_admin/src/css/components/_toggle.css +12 -1
  91. django_smartbase_admin/static/sb_admin/src/css/components/_tooltip.css +8 -22
  92. django_smartbase_admin/static/sb_admin/src/css/style.css +17 -0
  93. django_smartbase_admin/static/sb_admin/src/css/tree_widget.css +411 -0
  94. django_smartbase_admin/static/sb_admin/src/js/autocomplete.js +63 -5
  95. django_smartbase_admin/static/sb_admin/src/js/calendar.js +56 -0
  96. django_smartbase_admin/static/sb_admin/src/js/chart.js +8 -22
  97. django_smartbase_admin/static/sb_admin/src/js/choices.js +18 -8
  98. django_smartbase_admin/static/sb_admin/src/js/datepicker.js +97 -336
  99. django_smartbase_admin/static/sb_admin/src/js/datepicker_plugins.js +357 -0
  100. django_smartbase_admin/static/sb_admin/src/js/main.js +304 -31
  101. django_smartbase_admin/static/sb_admin/src/js/multiselect.js +50 -41
  102. django_smartbase_admin/static/sb_admin/src/js/range.js +3 -2
  103. django_smartbase_admin/static/sb_admin/src/js/table.js +34 -5
  104. django_smartbase_admin/static/sb_admin/src/js/table_modules/advanced_filter_module.js +43 -20
  105. django_smartbase_admin/static/sb_admin/src/js/table_modules/data_edit_module.js +8 -10
  106. django_smartbase_admin/static/sb_admin/src/js/table_modules/filter_module.js +3 -3
  107. django_smartbase_admin/static/sb_admin/src/js/table_modules/header_tabs_module.js +11 -11
  108. django_smartbase_admin/static/sb_admin/src/js/table_modules/selection_module.js +28 -8
  109. django_smartbase_admin/static/sb_admin/src/js/table_modules/table_params_module.js +6 -0
  110. django_smartbase_admin/static/sb_admin/src/js/table_modules/views_module.js +6 -0
  111. django_smartbase_admin/static/sb_admin/src/js/tree_widget.js +406 -0
  112. django_smartbase_admin/static/sb_admin/src/js/utils.js +56 -21
  113. django_smartbase_admin/templates/sb_admin/actions/change_form.html +169 -114
  114. django_smartbase_admin/templates/sb_admin/actions/dashboard.html +2 -2
  115. django_smartbase_admin/templates/sb_admin/actions/list.html +79 -39
  116. django_smartbase_admin/templates/sb_admin/actions/partials/action_link.html +14 -0
  117. django_smartbase_admin/templates/sb_admin/actions/partials/tabulator_header_v2.html +2 -2
  118. django_smartbase_admin/templates/sb_admin/actions/tree_list.html +63 -0
  119. django_smartbase_admin/templates/sb_admin/authentification/login_base.html +5 -1
  120. django_smartbase_admin/templates/sb_admin/components/columns.html +1 -1
  121. django_smartbase_admin/templates/sb_admin/components/filters_v2.html +99 -85
  122. django_smartbase_admin/templates/sb_admin/dashboard/calendar_widget.html +69 -0
  123. django_smartbase_admin/templates/sb_admin/dashboard/chart_widget.html +21 -2
  124. django_smartbase_admin/templates/sb_admin/dashboard/list_widget.html +6 -0
  125. django_smartbase_admin/templates/sb_admin/dashboard/widget_base.html +1 -1
  126. django_smartbase_admin/templates/sb_admin/filter_widgets/advanced_filters/date_field.html +18 -8
  127. django_smartbase_admin/templates/sb_admin/filter_widgets/advanced_filters/multiple_choice_field.html +1 -1
  128. django_smartbase_admin/templates/sb_admin/filter_widgets/advanced_filters/tree_select_filter.html +2 -0
  129. django_smartbase_admin/templates/sb_admin/filter_widgets/date_field.html +18 -4
  130. django_smartbase_admin/templates/sb_admin/filter_widgets/multiple_choice_field.html +14 -0
  131. django_smartbase_admin/templates/sb_admin/filter_widgets/partials/clear.html +10 -5
  132. django_smartbase_admin/templates/sb_admin/filter_widgets/radio_choice_field.html +2 -2
  133. django_smartbase_admin/templates/sb_admin/filter_widgets/tree_select_filter.html +16 -0
  134. django_smartbase_admin/templates/sb_admin/includes/change_form_title.html +3 -1
  135. django_smartbase_admin/templates/sb_admin/includes/inline_fieldset.html +48 -39
  136. django_smartbase_admin/templates/sb_admin/includes/notifications.html +2 -1
  137. django_smartbase_admin/templates/sb_admin/includes/readonly_boolean_field.html +9 -0
  138. django_smartbase_admin/templates/sb_admin/includes/readonly_field.html +12 -0
  139. django_smartbase_admin/templates/sb_admin/includes/table_inline_delete_button.html +4 -5
  140. django_smartbase_admin/templates/sb_admin/inlines/stacked_inline.html +68 -40
  141. django_smartbase_admin/templates/sb_admin/inlines/table_inline.html +76 -34
  142. django_smartbase_admin/templates/sb_admin/integrations/filer/folder_list.html +18 -0
  143. django_smartbase_admin/templates/sb_admin/navigation.html +166 -158
  144. django_smartbase_admin/templates/sb_admin/partials/modal/modal_content.html +2 -6
  145. django_smartbase_admin/templates/sb_admin/sb_admin_base.html +49 -4
  146. django_smartbase_admin/templates/sb_admin/sb_admin_base_no_sidebar.html +27 -11
  147. django_smartbase_admin/templates/sb_admin/sb_admin_js_trans.html +3 -0
  148. django_smartbase_admin/templates/sb_admin/sprites/sb_admin.svg +1 -1
  149. django_smartbase_admin/templates/sb_admin/tailwind_whitelist.html +6 -3
  150. django_smartbase_admin/templates/sb_admin/widgets/array.html +0 -1
  151. django_smartbase_admin/templates/sb_admin/widgets/attributes.html +68 -0
  152. django_smartbase_admin/templates/sb_admin/widgets/autocomplete.html +13 -2
  153. django_smartbase_admin/templates/sb_admin/widgets/{checkbox_select.html → checkbox_dropdown.html} +2 -2
  154. django_smartbase_admin/templates/sb_admin/widgets/clearable_file_input.html +2 -2
  155. django_smartbase_admin/templates/sb_admin/widgets/color_field.html +30 -0
  156. django_smartbase_admin/templates/sb_admin/widgets/date.html +8 -1
  157. django_smartbase_admin/templates/sb_admin/widgets/filer_file.html +84 -0
  158. django_smartbase_admin/templates/sb_admin/widgets/includes/related_item_buttons.html +38 -0
  159. django_smartbase_admin/templates/sb_admin/widgets/multiwidget.html +1 -1
  160. django_smartbase_admin/templates/sb_admin/widgets/radio.html +3 -2
  161. django_smartbase_admin/templates/sb_admin/widgets/radio_dropdown.html +30 -0
  162. django_smartbase_admin/templates/sb_admin/widgets/read_only_password_hash.html +3 -0
  163. django_smartbase_admin/templates/sb_admin/widgets/time.html +8 -1
  164. django_smartbase_admin/templates/sb_admin/widgets/toggle.html +1 -1
  165. django_smartbase_admin/templates/sb_admin/widgets/tree_base.html +59 -0
  166. django_smartbase_admin/templates/sb_admin/widgets/tree_select.html +24 -0
  167. django_smartbase_admin/templates/sb_admin/widgets/tree_select_inline.html +12 -0
  168. django_smartbase_admin/templatetags/sb_admin_tags.py +85 -4
  169. django_smartbase_admin/utils.py +22 -3
  170. django_smartbase_admin/views/dashboard_view.py +6 -0
  171. django_smartbase_admin/views/global_filter_view.py +8 -2
  172. django_smartbase_admin/views/translations_view.py +12 -5
  173. django_smartbase_admin/views/user_config_view.py +52 -0
  174. django_smartbase_admin-1.0.38.dist-info/METADATA +166 -0
  175. {django_smartbase_admin-0.2.54.dist-info → django_smartbase_admin-1.0.38.dist-info}/RECORD +177 -115
  176. {django_smartbase_admin-0.2.54.dist-info → django_smartbase_admin-1.0.38.dist-info}/WHEEL +1 -1
  177. django_smartbase_admin/templates/sb_admin/integrations/sorting/change_list.html +0 -401
  178. django_smartbase_admin-0.2.54.dist-info/METADATA +0 -25
  179. {django_smartbase_admin-0.2.54.dist-info → django_smartbase_admin-1.0.38.dist-info}/LICENSE.md +0 -0
@@ -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 %}
@@ -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>
@@ -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 %}
@@ -1,49 +1,58 @@
1
- {% if fieldset.name %}
2
- <header class="mb-24">
3
- <span class="text-dark-900">{{ fieldset.name }}</span>
4
- <div class="ml-auto flex items-center">
5
- {% for action in fieldset_context.actions %}
6
- <a href="{{ action.url }}" class="btn btn-small">{{ action.title }}</a>
7
- {% endfor %}
8
- {% if fieldset.description %}
9
- <div class="js-tooltip ml-8" data-bs-toggle="tooltip" data-bs-placement="bottom" title="{{ fieldset.description|safe }}">
10
- <svg class="w-20 h-20">
11
- <use xlink:href="#Help"></use>
12
- </svg>
1
+ {% load sb_admin_tags %}
2
+
3
+ {% block content %}
4
+ {% block header %}
5
+ {% if fieldset.name %}
6
+ <header class="mb-24 flex items-center">
7
+ <span class="text-dark-900">{{ fieldset.name }}</span>
8
+ {% block description %}
9
+ {% if fieldset.description %}
10
+ <div class="js-tooltip ml-8" data-bs-toggle="tooltip" data-bs-placement="bottom" title="{{ fieldset.description|safe }}">
11
+ <svg class="w-20 h-20">
12
+ <use xlink:href="#Help"></use>
13
+ </svg>
14
+ </div>
15
+ {% endif %}
16
+ {% endblock %}
17
+ <div class="ml-auto flex items-center gap-4">
18
+ {% block actions %}
19
+ {% for action in fieldset_context.actions %}
20
+ <a href="{{ action.url }}" class="btn btn-small">{{ action.title }}</a>
21
+ {% endfor %}
22
+ {% endblock %}
13
23
  </div>
14
- {% endif %}
15
- </div>
16
- </header>
17
- {% endif %}
18
- {% for line in fieldset %}
19
- <div class="field{% if forloop.last %} -mb-24{% endif %}{% if line.fields|length == 1 and line.errors %} errors{% endif %}{% if not line.has_visible_field %} hidden{% endif %}{% for field in line %}{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% endfor %}">
20
- {% if line.fields|length > 1 %}
21
- <div class="flex max-xs:flex-wrap gap-x-16">{% endif %}
24
+ </header>
25
+ {% endif %}
26
+ {% endblock %}
22
27
 
23
- {% for field in line %}
24
- <div class="mb-16 sm:mb-24 max-xs:w-full sm:flex-1{% if field.field.is_hidden %} hidden{% endif %}">
25
- {% if field.is_readonly %}
26
- <div class="flex flex-wrap w-full">
27
- {% if field.field.label %}
28
- <label class="inline-flex text-dark-900 text-14 leading-18 font-medium mr-8">{{ field.field.label }}:</label>
28
+ {% block lines %}
29
+ {% for line in fieldset %}
30
+ <div class="field{% if forloop.last %} -mb-24{% endif %}{% if line.fields|length == 1 and line.errors %} errors{% endif %}{% if not line.has_visible_field %} hidden{% endif %}{% for field in line %}{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% endfor %}">
31
+ {% if line.fields|length > 1 %}
32
+ <div class="flex max-xs:flex-wrap gap-x-16">{% endif %}
33
+
34
+ {% for field in line %}
35
+ <div class="mb-16 sm:mb-24 max-xs:w-full sm:flex-1{% if field.field.is_hidden or field.field|is_row_class_field %} hidden{% endif %}">
36
+ {% if field.is_readonly %}
37
+ {% call_method field "contents" request %}
38
+ {% else %}
39
+ {{ field.field }}
40
+ {% if not line.fields|length == 1 %}{{ field.errors }}{% endif %}
29
41
  {% endif %}
30
- <div class="text-14 w-full break-all">{{ field.contents }}</div>
31
42
  </div>
32
- {% else %}
33
- {{ field.field }}
34
- {% if not line.fields|length == 1 %}{{ field.errors }}{% endif %}
43
+ {% endfor %}
44
+
45
+ {% if line.fields|length == 1 and line.errors %}
46
+ <div class="-mt-16 mb-24">
47
+ {{ line.errors }}
48
+ </div>
35
49
  {% endif %}
50
+ {% if line.fields|length > 1 %}</div>{% endif %}
36
51
  </div>
37
52
  {% endfor %}
38
53
 
39
- {% if line.fields|length == 1 and line.errors %}
40
- <div class="-mt-16 mb-24">
41
- {{ line.errors }}
42
- </div>
43
- {% endif %}
44
- {% if line.fields|length > 1 %}</div>{% endif %}
45
- </div>
46
- {% endfor %}
47
- {% block additional_fields %}
54
+ {% endblock %}
55
+ {% block additional_fields %}
48
56
 
57
+ {% endblock %}
49
58
  {% endblock %}
@@ -1,4 +1,5 @@
1
- <div id="notification-messages" hx-swap-oob="beforeend" class="z-1000 fixed right-0 left-0 xl:left-260 mx-24">
1
+ <div id="notification-messages" hx-swap-oob="beforeend"
2
+ class="messagelist z-1000 fixed right-0 left-0 xl:left-260 mx-24{% if classes %} {{ classes }}{% endif %}">
2
3
  {% for message in messages %}
3
4
  {% if message.level == DEFAULT_MESSAGE_LEVELS.SUCCESS %}
4
5
  {% include 'sb_admin/partials/messages/alert_success.html' with text=message %}
@@ -0,0 +1,9 @@
1
+ <div class="w-full">
2
+ <div class="text-14 w-full break-all">
3
+ <div class="relative">
4
+ <input type="checkbox" name="{{ field_name }}" id="id_{{ field_name }}" form="#" class="toggle"{% if value %} checked{% endif %} readonly disabled>
5
+ <label for="id_{{ field_name }}"></label>
6
+ <label for="id_{{ field_name }}">{{ field_label }}</label>
7
+ </div>
8
+ </div>
9
+ </div>
@@ -0,0 +1,12 @@
1
+ {% load sb_admin_tags %}
2
+
3
+ <div class="w-full">
4
+ {% if field_label %}
5
+ <label class="inline-flex text-dark-900 text-14 leading-18 font-medium mb-8">
6
+ {{ field_label }}{{ field_label_suffix }}
7
+ </label>
8
+ {% endif %}
9
+ <div class="text-14 w-full break-all">
10
+ {{ readonly_content }}
11
+ </div>
12
+ </div>