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,172 +1,180 @@
1
1
  {% load static sb_admin_tags widget_tweaks i18n %}
2
2
 
3
3
  {% block content %}
4
- <header class="flex items-center bg-light border-b border-dark-200 p-12 xl:hidden">
5
- <div class="js-sidebar-toggle mr-12" data-sidebar-target="main-navigation">
6
- <svg class="w-24 h-24">
7
- <use xlink:href="#Hamburger-button"></use>
8
- </svg>
9
- </div>
10
- <img src="{{ LAZY_LOAD_DEFAULT_IMAGE }}" data-src="{% static 'sb_admin/images/logo.svg' %}" class="lazyload h-32 w-auto"
11
- alt="SBAdmin" width="106" height="16">
12
- <div class="w-32 h-32 rounded-full leading-none flex-center flex-shrink-0 bg-dark-300 ml-auto">
13
- {{ username_data.initials }}
14
- </div>
15
- </header>
16
- <nav class="w-260 xl:fixed top-0 bottom-0 left-0 max-lg:sidebar border-r border-dark-200 overflow-hidden flex flex-col relative bg-dark-50 z-1"
17
- id="main-navigation">
18
- <header class="px-24 py-32 hidden xl:!block">
19
- <img src="{{ LAZY_LOAD_DEFAULT_IMAGE }}" data-src="{% static 'sb_admin/images/logo.svg' %}" class="lazyload h-32 w-auto"
20
- alt="SBAdmin" width="133" height="20">
21
- </header>
22
- <header class="px-16 py-8 flex items-center xl:hidden border-b border-dark-200 bg-light min-h-56">
23
- <div class="js-sidebar-toggle w-24 h-24 flex-center ml-auto" data-sidebar-target="main-navigation">
24
- <svg class="w-20 h-20 flex-shrink-0">
25
- <use xlink:href="#Close"></use>
4
+ {% if not sec_fetch_site or request.META.HTTP_SEC_FETCH_DEST == 'document' %}
5
+ <header class="flex items-center bg-light border-b border-dark-200 p-12 xl:hidden">
6
+ <div class="js-sidebar-toggle mr-12" data-sidebar-target="main-navigation">
7
+ <svg class="w-24 h-24">
8
+ <use xlink:href="#Hamburger-button"></use>
26
9
  </svg>
27
10
  </div>
11
+ <img src="{% static 'sb_admin/images/logo.svg' %}" class="h-32 w-auto dark:hidden"
12
+ alt="SBAdmin" width="106" height="16">
13
+ <img src="{% static 'sb_admin/images/logo_light.svg' %}" class="h-32 w-auto hidden dark:block"
14
+ alt="SBAdmin" width="106" height="16">
15
+ <div class="w-32 h-32 rounded-full leading-none flex-center flex-shrink-0 bg-dark-300 ml-auto">
16
+ {{ username_data.initials }}
17
+ </div>
28
18
  </header>
29
- <div class="h-full overflow-auto custom-scrollbar max-lg:py-16">
30
- <ul class="-my-2 px-16">
31
- {% for menu_item in request_data.menu_items %}
32
- <li class="py-2">
33
- {% if menu_item.sub_items %}
34
- <div class="menu-item">
35
- <a href="{{ menu_item.get_url|default:menu_item.sub_items.0.get_url }}"
36
- class="inline-flex w-full p-8 justify-start collapse-btn{% if not menu_item.is_active %} collapsed{% endif %}"
37
- aria-expanded="{% if menu_item.is_active %}true{% else %}false{% endif %}"
38
- >
39
- {% if menu_item.get_icon %}
40
- <svg class="w-20 h-20 mr-8 flex-shrink-0">
41
- <use xlink:href="#{{ menu_item.get_icon }}"></use>
42
- </svg>
43
- {% endif %}
44
- <span>{{ menu_item.get_label }}</span>
45
- </a>
46
- <ul id="{{ menu_item.get_id }}" class="collapse -mb-2 mt-2{% if menu_item.is_active %} show{% endif %}">
47
- {% for sub_menu_item in menu_item.sub_items %}
48
- <li class="py-2">
49
- <a href="{{ sub_menu_item.get_url }}"
50
- class="menu-item text-dark-600 leading-20 pl-36 py-8 pr-8{% if sub_menu_item.is_active %} active{% endif %}">
51
- <span>{{ sub_menu_item.get_label }}</span>
52
- </a>
53
- </li>
54
- {% endfor %}
55
- </ul>
56
- </div>
57
- {% else %}
58
- <div class="menu-item{% if menu_item.is_active %} active{% endif %}">
59
- <a href="{{ menu_item.get_url }}" class="inline-flex w-full p-8">
60
- {% if menu_item.get_icon %}
61
- <svg class="w-20 h-20 mr-8 flex-shrink-0">
62
- <use xlink:href="#{{ menu_item.get_icon }}"></use>
63
- </svg>
64
- {% endif %}
65
- <span>{{ menu_item.get_label }}</span>
66
- </a>
67
- </div>
68
- {% endif %}
69
- </li>
70
- {% endfor %}
71
- </ul>
72
- {# <hr class="my-32">#}
73
- {# <div class="text-14 mb-24 px-16">#}
74
- {# Pomoc a podpora#}
75
- {# </div>#}
76
- {# <ul class="-my-2 px-16">#}
77
- {# <li class="py-2">#}
78
- {# <div class="menu-item">#}
79
- {# <a href="#" class="inline-flex w-full p-8">#}
80
- {# <svg class="w-20 h-20 mr-8 flex-shrink-0">#}
81
- {# <use xlink:href="#Accept-email"></use>#}
82
- {# </svg>#}
83
- {# <span class="leading-20 line-clamp-1">Menu Item 8</span>#}
84
- {# </a>#}
85
- {# </div>#}
86
- {# </li>#}
87
- {# <li class="py-2">#}
88
- {# <div class="menu-item">#}
89
- {# <a href="#" class="inline-flex w-full p-8">#}
90
- {# <svg class="w-20 h-20 mr-8 flex-shrink-0">#}
91
- {# <use xlink:href="#Accept-email"></use>#}
92
- {# </svg>#}
93
- {# <span class="leading-20 line-clamp-1">Menu Item 8</span>#}
94
- {# </a>#}
95
- {# </div>#}
96
- {# </li>#}
97
- {# </ul>#}
98
- </div>
99
- <footer class="mt-auto border-t border-dark-200">
100
- {# Global Search #}
101
- {# <div class="flex p-16 gap-x-8 border-b border-dark-200 w-full">#}
102
- {# <div class="flex gap-x-4">#}
103
- {# <div class="key">#}
104
- {# ⌘#}
105
- {# </div>#}
106
- {# <div class="key">#}
107
- {# K#}
108
- {# </div>#}
109
- {# </div>#}
110
- {##}
111
- {# <div class="text-dark">#}
112
- {# Rýchla navigácia#}
113
- {# </div>#}
114
- {# </div>#}
115
- <div class="relative">
116
- <div class="dropdown-btn flex items-center w-full p-16 cursor-pointer min-h-72"
117
- data-bs-toggle="dropdown"
118
- data-bs-offset="[16,8]"
119
- data-bs-popper-placement="top-start">
120
- <div class="w-32 h-32 rounded-full leading-none flex-center flex-shrink-0 bg-dark-300">
121
- {{ username_data.initials }}
122
- </div>
123
- <div class="ml-8">
124
- <div class="text-14 text-dark-900">{{ username_data.full_name }}</div>
125
- <div class="text-12 leading-16 js-alias-domain-name hidden"></div>
126
- </div>
127
- <svg class="w-16 h-16 ml-auto flex-shrink-0">
128
- <use xlink:href="#Sort Alt"></use>
19
+ <nav class="w-260 xl:fixed top-0 bottom-0 left-0 max-lg:sidebar border-r border-dark-200 overflow-hidden flex flex-col relative bg-dark-50 z-1"
20
+ id="main-navigation">
21
+ <header class="px-24 py-32 hidden xl:!block">
22
+ <img src="{% static 'sb_admin/images/logo.svg' %}" class="h-32 w-auto dark:hidden"
23
+ alt="SBAdmin" width="133" height="20">
24
+ <img src="{% static 'sb_admin/images/logo_light.svg' %}" class="h-32 w-auto hidden dark:block"
25
+ alt="SBAdmin" width="133" height="20">
26
+ </header>
27
+ <header class="px-16 py-8 flex items-center xl:hidden border-b border-dark-200 bg-light min-h-56">
28
+ <div class="js-sidebar-toggle w-24 h-24 flex-center ml-auto" data-sidebar-target="main-navigation">
29
+ <svg class="w-20 h-20 flex-shrink-0">
30
+ <use xlink:href="#Close"></use>
129
31
  </svg>
130
32
  </div>
131
- <div class="dropdown-menu max-h-432">
132
- <form id="logout-form" method="post" action="{% url 'sb_admin:logout' %}" class="hidden">
133
- {% csrf_token %}
134
- </form>
135
-
136
- <ul>
137
- <li class="flex items-center p-12 text-dark-900 border-b border-dark-100 cursor-pointer hover:bg-dark-100"
138
- onclick="document.getElementById('logout-form').submit();">
139
- <svg class="w-16 h-16 flex-shrink-0 mr-8">
140
- <use xlink:href="#Logout"></use>
141
- </svg>
142
- {% trans 'Logout' %}
143
- </li>
144
- <li class="flex items-center p-12 text-dark-900 cursor-pointer hover:bg-dark-100" onclick="window.location='{% url "sb_admin:password_change" %}'">
145
- <svg class="w-16 h-16 flex-shrink-0 mr-8">
146
- <use xlink:href="#Lock"></use>
147
- </svg>
148
- {% trans 'Change password' %}
33
+ </header>
34
+ <div class="h-full overflow-auto custom-scrollbar max-lg:py-16">
35
+ <ul class="-my-2 px-16">
36
+ {% for menu_item in request_data.menu_items %}
37
+ <li class="py-2">
38
+ {% if menu_item.sub_items %}
39
+ <div class="menu-item">
40
+ <a href="{{ menu_item.get_url|default:menu_item.sub_items.0.get_url }}"
41
+ class="inline-flex w-full p-8 justify-start collapse-btn{% if not menu_item.is_active %} collapsed{% endif %}"
42
+ aria-expanded="{% if menu_item.is_active %}true{% else %}false{% endif %}"
43
+ >
44
+ {% if menu_item.get_icon %}
45
+ <svg class="w-20 h-20 mr-8 flex-shrink-0">
46
+ <use xlink:href="#{{ menu_item.get_icon }}"></use>
47
+ </svg>
48
+ {% endif %}
49
+ <span>{{ menu_item.get_label }}</span>
50
+ </a>
51
+ <ul id="{{ menu_item.get_id }}" class="collapse -mb-2 mt-2{% if menu_item.is_active %} show{% endif %}">
52
+ {% for sub_menu_item in menu_item.sub_items %}
53
+ <li class="py-2">
54
+ <a href="{{ sub_menu_item.get_url }}"
55
+ class="menu-item text-dark-600 leading-20 pl-36 py-8 pr-8{% if sub_menu_item.is_active %} active{% endif %}">
56
+ <span>{{ sub_menu_item.get_label }}</span>
57
+ </a>
58
+ </li>
59
+ {% endfor %}
60
+ </ul>
61
+ </div>
62
+ {% else %}
63
+ <div class="menu-item{% if menu_item.is_active %} active{% endif %}">
64
+ <a href="{{ menu_item.get_url }}" class="inline-flex w-full p-8">
65
+ {% if menu_item.get_icon %}
66
+ <svg class="w-20 h-20 mr-8 flex-shrink-0">
67
+ <use xlink:href="#{{ menu_item.get_icon }}"></use>
68
+ </svg>
69
+ {% endif %}
70
+ <span>{{ menu_item.get_label }}</span>
71
+ </a>
72
+ </div>
73
+ {% endif %}
149
74
  </li>
150
- {% if request_data.global_filter_instance %}
151
- <li class="p-12 text-dark-900">
152
- {% trans 'Choose domain' %}
75
+ {% endfor %}
76
+ </ul>
77
+ {# <hr class="my-32">#}
78
+ {# <div class="text-14 mb-24 px-16">#}
79
+ {# Pomoc a podpora#}
80
+ {# </div>#}
81
+ {# <ul class="-my-2 px-16">#}
82
+ {# <li class="py-2">#}
83
+ {# <div class="menu-item">#}
84
+ {# <a href="#" class="inline-flex w-full p-8">#}
85
+ {# <svg class="w-20 h-20 mr-8 flex-shrink-0">#}
86
+ {# <use xlink:href="#Accept-email"></use>#}
87
+ {# </svg>#}
88
+ {# <span class="leading-20 line-clamp-1">Menu Item 8</span>#}
89
+ {# </a>#}
90
+ {# </div>#}
91
+ {# </li>#}
92
+ {# <li class="py-2">#}
93
+ {# <div class="menu-item">#}
94
+ {# <a href="#" class="inline-flex w-full p-8">#}
95
+ {# <svg class="w-20 h-20 mr-8 flex-shrink-0">#}
96
+ {# <use xlink:href="#Accept-email"></use>#}
97
+ {# </svg>#}
98
+ {# <span class="leading-20 line-clamp-1">Menu Item 8</span>#}
99
+ {# </a>#}
100
+ {# </div>#}
101
+ {# </li>#}
102
+ {# </ul>#}
103
+ </div>
104
+ <footer class="mt-auto border-t border-dark-200">
105
+ {# Global Search #}
106
+ {# <div class="flex p-16 gap-x-8 border-b border-dark-200 w-full">#}
107
+ {# <div class="flex gap-x-4">#}
108
+ {# <div class="key">#}
109
+ {# ⌘#}
110
+ {# </div>#}
111
+ {# <div class="key">#}
112
+ {# K#}
113
+ {# </div>#}
114
+ {# </div>#}
115
+ {##}
116
+ {# <div class="text-dark">#}
117
+ {# Rýchla navigácia#}
118
+ {# </div>#}
119
+ {# </div>#}
120
+ <div class="relative">
121
+ <div class="dropdown-btn flex items-center w-full p-16 cursor-pointer min-h-72"
122
+ data-bs-toggle="dropdown"
123
+ data-bs-offset="[16,8]"
124
+ data-bs-popper-placement="top-start">
125
+ <div class="w-32 h-32 rounded-full leading-none flex-center flex-shrink-0 bg-dark-300">
126
+ {{ username_data.initials }}
127
+ </div>
128
+ <div class="ml-8">
129
+ <div class="text-14 text-dark-900">{{ username_data.full_name }}</div>
130
+ <div class="text-12 leading-16 js-alias-domain-name hidden"></div>
131
+ </div>
132
+ <svg class="w-16 h-16 ml-auto flex-shrink-0">
133
+ <use xlink:href="#Sort Alt"></use>
134
+ </svg>
135
+ </div>
136
+ <div class="dropdown-menu max-h-432">
137
+ <form id="logout-form" method="post" action="{% url 'sb_admin:logout' %}" class="hidden">
138
+ {% csrf_token %}
139
+ </form>
140
+
141
+ <ul>
142
+ <li class="flex items-center p-12 text-dark-900 border-b border-dark-100 cursor-pointer hover:bg-dark-100"
143
+ onclick="document.getElementById('logout-form').submit();">
144
+ <svg class="w-16 h-16 flex-shrink-0 mr-8">
145
+ <use xlink:href="#Logout"></use>
146
+ </svg>
147
+ {% trans 'Logout' %}
153
148
  </li>
154
- <li>
155
- <form hx-post="{% url 'sb_admin:global_filter' %}" hx-trigger="change" hx-swap="none" id="global_filter_form">
156
- {% for field in request_data.global_filter_instance %}
157
- <div class="relative">
158
- {{ field }}
159
- </div>
160
- {{ field.errors }}
161
- {% endfor %}
162
- </form>
149
+ <li class="flex items-center p-12 text-dark-900 cursor-pointer hover:bg-dark-100" onclick="window.location='{% url "sb_admin:password_change" %}'">
150
+ <svg class="w-16 h-16 flex-shrink-0 mr-8">
151
+ <use xlink:href="#Lock"></use>
152
+ </svg>
153
+ {% trans 'Change password' %}
163
154
  </li>
164
- {% endif %}
165
- </ul>
155
+ {% block color_scheme %}
156
+ <li class="border-t border-dark-100 pt-8">
157
+ <form hx-post="{% url 'sb_admin:color_scheme' %}" hx-trigger="change" hx-swap="none" id="color-schema-form" class="js-color-scheme-picker">
158
+ {{ color_scheme_form.color_scheme }}
159
+ </form>
160
+ </li>
161
+ {% endblock %}
162
+ {% if request_data.global_filter_instance %}
163
+ <li class="border-t border-dark-100 pt-8">
164
+ <form hx-post="{% url 'sb_admin:global_filter' %}" hx-trigger="change" hx-swap="none" id="global_filter_form">
165
+ {% for field in request_data.global_filter_instance %}
166
+ {{ field }}
167
+ {{ field.errors }}
168
+ {% endfor %}
169
+ </form>
170
+ </li>
171
+ {% endif %}
172
+ </ul>
173
+ </div>
166
174
  </div>
167
- </div>
168
175
 
169
- </footer>
170
- </nav>
171
- <div class="bg-filter js-sidebar-toggle" data-sidebar-target="main-navigation"></div>
176
+ </footer>
177
+ </nav>
178
+ <div class="bg-filter js-sidebar-toggle" data-sidebar-target="main-navigation"></div>
179
+ {% endif %}
172
180
  {% endblock %}
@@ -16,7 +16,7 @@
16
16
  </div>
17
17
  <div class="modal-body">
18
18
  {% block modal_body %}
19
- <form id="sb-admin-modal-form" hx-indicator=".sb-admin-modal-loading" hx-target="#sb-admin-modal" hx-post="{{ request.get_full_path }}" action="{{ request.get_full_path }}" method="post">
19
+ <form id="sb-admin-modal-form" enctype="multipart/form-data" hx-indicator=".sb-admin-modal-loading" hx-target="#sb-admin-modal" hx-post="{{ request.get_full_path }}" action="{{ request.get_full_path }}" method="post">
20
20
  {% if form.errors %}
21
21
  <div class="alert bg-negative-50 border border-negative-100 text-negative-900 mb-24">
22
22
  <div class="flex">
@@ -42,7 +42,7 @@
42
42
  </div>
43
43
  <div class="modal-footer">
44
44
  {% block modal_footer %}
45
- <button form="sb-admin-modal-form" type="button" class="btn btn-destructive mr-10" data-bs-dismiss="modal">{% trans 'Close' %}</button>
45
+ <button form="sb-admin-modal-form" type="button" class="btn btn-destructive" data-bs-dismiss="modal">{% trans 'Close' %}</button>
46
46
  <button form="sb-admin-modal-form" type="submit" class="btn btn-primary">{% trans 'Continue' %}</button>
47
47
  {% endblock %}
48
48
  </div>
@@ -51,10 +51,6 @@
51
51
  </div>
52
52
  <script>
53
53
  (function(){
54
- const choiceElements = document.getElementById('sb-admin-modal').querySelectorAll('.js-autocomplete');
55
- choiceElements.forEach((choiceInput) => {
56
- window.SBAdmin.autocomplete.initAutocomplete(choiceInput);
57
- })
58
54
  document.body.dispatchEvent(new Event('SBModalShown'));
59
55
  })();
60
56
  </script>
@@ -1,15 +1,60 @@
1
1
  {% extends 'sb_admin/sb_admin_base_no_sidebar.html' %}
2
+ {% load sb_admin_tags %}
2
3
 
3
4
  {% block main_wrapper %}
4
- <div class="w-full h-full min-h-full xl:pl-260">
5
+ {% get_item request.META 'HTTP_SEC_FETCH_SITE' as sec_fetch_site %}
6
+ <div class="w-full h-full min-h-full{% if not sec_fetch_site or request.META.HTTP_SEC_FETCH_DEST == 'document' %} xl:pl-260{% endif %}">
5
7
  {% include 'sb_admin/navigation.html' %}
6
- <div class="min-h-screen sm:p-24 relative flex flex-col {% block view_class %}{% endblock %}">
7
- {% include "sb_admin/includes/loading.html" %}
8
- {% include "sb_admin/includes/notifications.html" %}
8
+
9
+ {% if sbadmin_is_modal %}
10
+ <div id="modal-content" class="modal-dialog">
11
+ <div class="modal-content">
12
+ {% endif %}
13
+
14
+ <div id="content" class="relative flex flex-col{% if sbadmin_is_modal %} min-h-0 h-full{% else %} min-h-screen sm:p-24 {% block view_class %}{% endblock %}{% endif %}">
15
+ {% if sbadmin_is_modal %}
16
+ {# load media which are missing #}
17
+ <script>
18
+ (function(){
19
+ const mediaString = '{{ media|escapejs }}';
20
+ const mediaList = mediaString.split('\n');
21
+ const tmpEl = document.createElement('div');
22
+ function duplicateScript(script) {
23
+ const newScript = document.createElement('script');
24
+ for (let i = 0; i < script.attributes.length; i++) {
25
+ const attr = script.attributes[i];
26
+ newScript.setAttribute(attr.name, attr.value);
27
+ }
28
+ newScript.textContent = script.textContent;
29
+ newScript.async = false;
30
+ return newScript;
31
+ }
32
+ mediaList.forEach(media => {
33
+ tmpEl.innerHTML = media.trim();
34
+ const mediaEl = tmpEl.firstElementChild;
35
+ if(mediaEl.tagName === 'LINK' && !document.head.querySelector(`link[href="${mediaEl.getAttribute('href')}"]`)) {
36
+ document.head.appendChild(mediaEl);
37
+ return
38
+ }
39
+ if(mediaEl.tagName === 'SCRIPT' && !document.head.querySelector(`script[src="${mediaEl.getAttribute('src')}"]`)) {
40
+ document.head.appendChild(duplicateScript(mediaEl));
41
+ }
42
+ });
43
+ }());
44
+ </script>
45
+ {% else %}
46
+ {% include "sb_admin/includes/loading.html" %}
47
+ {% include "sb_admin/includes/notifications.html" %}
48
+ {% endif %}
9
49
 
10
50
  {% block content %}
11
51
  {% endblock %}
12
52
  {{ inner_content }}
13
53
  </div>
54
+
55
+ {% if sbadmin_is_modal %}
56
+ </div>
57
+ </div>
58
+ {% endif %}
14
59
  </div>
15
60
  {% endblock %}
@@ -1,7 +1,7 @@
1
1
  {% load static %}
2
2
 
3
3
  <!DOCTYPE html>
4
- <html lang="{{ request.LANGUAGE_CODE }}" data-theme="light" data-color-scheme="light">
4
+ <html lang="{{ request.LANGUAGE_CODE }}" data-theme="{{ user_config.color_scheme }}">
5
5
  <head>
6
6
  {% include 'sb_admin/fonts.html' %}
7
7
  <meta name="robots" content="noindex"/>
@@ -11,20 +11,24 @@
11
11
  <title>{% block title %}SBAdmin{% endblock %}</title>
12
12
 
13
13
  {% block icons %}
14
- <link rel="apple-touch-icon" sizes="180x180" href="{% static 'favicon/apple-touch-icon.png' %}">
15
- <link rel="icon" type="image/png" sizes="32x32" href="{% static 'favicon/favicon-32x32.png' %}">
16
- <link rel="icon" type="image/png" sizes="16x16" href="{% static 'favicon/favicon-16x16.png' %}">
17
- <link rel="manifest" href="{% static 'favicon/site.webmanifest' %}">
18
- <link rel="mask-icon" href="{% static 'favicon/safari-pinned-tab.svg' %}" color="#e0004d">
19
- <link rel="shortcut icon" href="{% static 'favicon/favicon.ico' %}">
14
+ <link rel="apple-touch-icon" sizes="180x180" href="{% static 'sb_admin/favicon/apple-touch-icon.png' %}">
15
+ <link rel="icon" type="image/png" sizes="32x32" href="{% static 'sb_admin/favicon/favicon-32x32.png' %}">
16
+ <link rel="icon" type="image/png" sizes="16x16" href="{% static 'sb_admin/favicon/favicon-16x16.png' %}">
17
+ <link rel="manifest" href="{% static 'sb_admin/favicon/site.webmanifest' %}">
18
+ <link rel="mask-icon" href="{% static 'sb_admin/favicon/safari-pinned-tab.svg' %}" color="#e0004d">
19
+ <link rel="shortcut icon" href="{% static 'sb_admin/favicon/favicon.ico' %}">
20
20
  <meta name="msapplication-TileColor" content="#e0004d">
21
- <meta name="msapplication-config" content="{% static 'favicon/browserconfig.xml' %}">
21
+ <meta name="msapplication-config" content="{% static 'sb_admin/favicon/browserconfig.xml' %}">
22
22
  <meta name="theme-color" content="#ffffff">
23
23
  {% endblock %}
24
24
  <link rel="stylesheet" href="{% static 'sb_admin/dist/main_style.css' %}">
25
25
  {% block style_init %}{% endblock %}
26
26
 
27
27
  <script>window.csrf_token = "{{ csrf_token }}"</script>
28
+
29
+ {% block jquery %}
30
+ <script src="{% static 'sb_admin/js/jquery-3.7.1.min.js' %}"></script>
31
+ {% endblock %}
28
32
  {% block js_init %}
29
33
  <script>
30
34
  {% if const %}
@@ -35,11 +39,23 @@
35
39
  }
36
40
  </script>
37
41
  {% endblock %}
38
- {% if content_context.is_jquery_required %}
39
- <script src="{% static 'sb_admin/js/jquery-3.7.1.min.js' %}"></script>
40
- {% endif %}
42
+ {% block tree_widget_static %}
43
+ <script src="{% static 'sb_admin/fancytree/jquery.fancytree-all-deps.min.js' %}"></script>
44
+ <script src="{% static 'sb_admin/dist/tree_widget.js' %}"></script>
45
+ <link rel="stylesheet" href="{% static 'sb_admin/dist/tree_widget_style.css' %}">
46
+ {% endblock %}
41
47
  {% block extrahead %}{% endblock %}
42
48
  <style>@media (min-width: 1200px){.xl\:\!block {display: block !important;}}</style>
49
+ {% if request.META.HTTP_SEC_FETCH_DEST == "iframe" %}
50
+ <style>
51
+ .detail-view-action-bar {
52
+ display: none !important;
53
+ }
54
+ .change-form {
55
+ margin-top: 0 !important;
56
+ }
57
+ </style>
58
+ {% endif %}
43
59
  </head>
44
60
  <body hx-ext="remove-me" class="{{ view_id }} {% block bodyclass %}{% endblock %}" hx-headers='{"X-CSRFToken": "{{ csrf_token }}"}'>
45
61
  <div class="hidden">
@@ -6,6 +6,9 @@
6
6
  window.sb_admin_translation_strings["up"] = '{% trans "Move up" %}';
7
7
  window.sb_admin_translation_strings["down"] = '{% trans "Move down" %}';
8
8
  window.sb_admin_translation_strings["reorder"] = '{% trans "Reorder" %}';
9
+ window.sb_admin_translation_strings["expand"] = '{% trans "Expand" %}';
10
+ window.sb_admin_translation_strings["collapse"] = '{% trans "Collapse" %}';
9
11
  window.sb_admin_translation_strings["page"] = '{% blocktrans %}<strong>${from} - ${to}</strong> of <strong>${total}</strong><span class="max-xs:hidden"> items</span>{% endblocktrans %}'
10
12
  window.sb_admin_translation_strings["page_empty"] = '{% blocktrans %}<strong>0</strong> items{% endblocktrans %}'
13
+ window.sb_admin_translation_strings["selected"] = '{% blocktrans %}${value} selected{% endblocktrans %}'
11
14
  </script>