django-smartbase-admin 1.0.14__py3-none-any.whl → 1.0.15__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 (47) hide show
  1. django_smartbase_admin/admin/admin_base.py +14 -14
  2. django_smartbase_admin/admin/site.py +7 -1
  3. django_smartbase_admin/admin/widgets.py +13 -1
  4. django_smartbase_admin/engine/admin_base_view.py +14 -0
  5. django_smartbase_admin/locale/sk/LC_MESSAGES/django.mo +0 -0
  6. django_smartbase_admin/locale/sk/LC_MESSAGES/django.po +22 -13
  7. django_smartbase_admin/migrations/0005_sbadminuserconfiguration.py +26 -0
  8. django_smartbase_admin/models.py +33 -0
  9. django_smartbase_admin/services/configuration.py +13 -0
  10. django_smartbase_admin/static/sb_admin/build/tailwind_config_partials/colors.js +4 -0
  11. django_smartbase_admin/static/sb_admin/css/ckeditor/ckeditor_content_dark.css +208 -0
  12. django_smartbase_admin/static/sb_admin/dist/calendar.js +1 -1
  13. django_smartbase_admin/static/sb_admin/dist/calendar_style.css +1 -1
  14. django_smartbase_admin/static/sb_admin/dist/chart.js +1 -1
  15. django_smartbase_admin/static/sb_admin/dist/main.js +1 -1
  16. django_smartbase_admin/static/sb_admin/dist/main_style.css +1 -1
  17. django_smartbase_admin/static/sb_admin/dist/table.js +1 -1
  18. django_smartbase_admin/static/sb_admin/sprites/sb_admin/Moon.svg +3 -0
  19. django_smartbase_admin/static/sb_admin/sprites/sb_admin/Sun-one.svg +3 -0
  20. django_smartbase_admin/static/sb_admin/src/css/_base.css +1 -1
  21. django_smartbase_admin/static/sb_admin/src/css/_colors.css +257 -82
  22. django_smartbase_admin/static/sb_admin/src/css/_components.css +1 -1
  23. django_smartbase_admin/static/sb_admin/src/css/_tabulator.css +2 -2
  24. django_smartbase_admin/static/sb_admin/src/css/calendar.css +3 -3
  25. django_smartbase_admin/static/sb_admin/src/css/components/_button.css +1 -1
  26. django_smartbase_admin/static/sb_admin/src/css/components/_dropdown.css +25 -7
  27. django_smartbase_admin/static/sb_admin/src/css/components/_input.css +33 -2
  28. django_smartbase_admin/static/sb_admin/src/css/components/_modal.css +1 -1
  29. django_smartbase_admin/static/sb_admin/src/css/components/_query-builder.css +1 -7
  30. django_smartbase_admin/static/sb_admin/src/css/style.css +1 -1
  31. django_smartbase_admin/static/sb_admin/src/js/main.js +58 -15
  32. django_smartbase_admin/static/sb_admin/src/js/multiselect.js +10 -19
  33. django_smartbase_admin/static/sb_admin/src/js/utils.js +47 -23
  34. django_smartbase_admin/templates/sb_admin/filter_widgets/advanced_filters/multiple_choice_field.html +1 -1
  35. django_smartbase_admin/templates/sb_admin/filter_widgets/radio_choice_field.html +1 -1
  36. django_smartbase_admin/templates/sb_admin/navigation.html +9 -7
  37. django_smartbase_admin/templates/sb_admin/sb_admin_base_no_sidebar.html +1 -1
  38. django_smartbase_admin/templates/sb_admin/sprites/sb_admin.svg +1 -1
  39. django_smartbase_admin/templates/sb_admin/tailwind_whitelist.html +2 -1
  40. django_smartbase_admin/templates/sb_admin/widgets/{checkbox_select.html → checkbox_dropdown.html} +2 -2
  41. django_smartbase_admin/templates/sb_admin/widgets/radio.html +3 -2
  42. django_smartbase_admin/templates/sb_admin/widgets/radio_dropdown.html +30 -0
  43. django_smartbase_admin/views/user_config_view.py +35 -0
  44. {django_smartbase_admin-1.0.14.dist-info → django_smartbase_admin-1.0.15.dist-info}/METADATA +1 -1
  45. {django_smartbase_admin-1.0.14.dist-info → django_smartbase_admin-1.0.15.dist-info}/RECORD +47 -41
  46. {django_smartbase_admin-1.0.14.dist-info → django_smartbase_admin-1.0.15.dist-info}/LICENSE.md +0 -0
  47. {django_smartbase_admin-1.0.14.dist-info → django_smartbase_admin-1.0.15.dist-info}/WHEEL +0 -0
@@ -36,9 +36,6 @@ from django.utils.text import capfirst
36
36
  from django.utils.translation import gettext_lazy as _
37
37
  from django_admin_inline_paginator.admin import TabularInlinePaginated
38
38
  from django_htmx.http import trigger_client_event
39
- from parler.admin import TranslatableAdmin
40
-
41
- from django_smartbase_admin.engine.field import SBAdminField
42
39
  from filer.fields.file import FilerFileField
43
40
  from filer.fields.image import AdminImageFormField, FilerImageField
44
41
  from nested_admin.formsets import NestedInlineFormSet
@@ -56,6 +53,8 @@ from django_smartbase_admin.utils import FormFieldsetMixin, is_modal
56
53
 
57
54
  parler_enabled = None
58
55
  try:
56
+ from parler.admin import TranslatableAdmin
57
+
59
58
  from parler.forms import (
60
59
  TranslatableModelForm,
61
60
  TranslatableModelFormMetaclass,
@@ -132,7 +131,6 @@ from django_smartbase_admin.engine.const import (
132
131
  OBJECT_ID_PLACEHOLDER,
133
132
  TRANSLATIONS_SELECTED_LANGUAGES,
134
133
  ROW_CLASS_FIELD,
135
- Action,
136
134
  )
137
135
  from django_smartbase_admin.services.translations import SBAdminTranslationsService
138
136
  from django_smartbase_admin.services.views import SBAdminViewService
@@ -1159,14 +1157,16 @@ class SBAdminGenericStackedInline(SBAdminInline, NestedGenericStackedInline):
1159
1157
  fieldset_template = "sb_admin/includes/inline_fieldset.html"
1160
1158
 
1161
1159
 
1162
- class SBTranslatableAdmin(SBAdmin, TranslatableAdmin):
1163
- def get_readonly_fields(self, request, obj=...):
1164
- readonly_fields = super().get_readonly_fields(request, obj)
1165
- if "sbadmin_translation_status" not in readonly_fields:
1166
- readonly_fields += ("sbadmin_translation_status",)
1167
- return readonly_fields
1160
+ if parler_enabled:
1168
1161
 
1169
- def get_fieldsets(self, request, obj=...):
1170
- fieldsets = super().get_fieldsets(request, obj)
1171
- fieldsets.append(SBAdminTranslationsService.get_translation_fieldset())
1172
- return fieldsets
1162
+ class SBTranslatableAdmin(SBAdmin, TranslatableAdmin):
1163
+ def get_readonly_fields(self, request, obj=...):
1164
+ readonly_fields = super().get_readonly_fields(request, obj)
1165
+ if "sbadmin_translation_status" not in readonly_fields:
1166
+ readonly_fields += ("sbadmin_translation_status",)
1167
+ return readonly_fields
1168
+
1169
+ def get_fieldsets(self, request, obj=...):
1170
+ fieldsets = super().get_fieldsets(request, obj)
1171
+ fieldsets.append(SBAdminTranslationsService.get_translation_fieldset())
1172
+ return fieldsets
@@ -33,8 +33,8 @@ class SBAdminSite(admin.AdminSite):
33
33
  pass
34
34
  request.sbadmin_selected_view = selected_view
35
35
  kwargs["view"] = selected_view.get_id() if selected_view else None
36
- request_data = SBAdminViewRequestData.from_request_and_kwargs(request, **kwargs)
37
36
  SBAdminThreadLocalService.set_request(request)
37
+ request_data = SBAdminViewRequestData.from_request_and_kwargs(request, **kwargs)
38
38
  if selected_view:
39
39
  # Initialize SBAdmin, ModelAdmin instances, class-based SBAdminEntrypointView are initialized with request_data
40
40
  selected_view.init_view_dynamic(
@@ -77,6 +77,7 @@ class SBAdminSite(admin.AdminSite):
77
77
  PasswordChangeView,
78
78
  PasswordChangeDoneView,
79
79
  )
80
+ from django_smartbase_admin.views.user_config_view import ColorSchemeView
80
81
 
81
82
  urls = [
82
83
  path(
@@ -152,6 +153,11 @@ class SBAdminSite(admin.AdminSite):
152
153
  self.admin_view(GlobalFilterView.as_view()),
153
154
  name="global_filter",
154
155
  ),
156
+ path(
157
+ "color-scheme",
158
+ self.admin_view(ColorSchemeView.as_view()),
159
+ name="color_scheme",
160
+ ),
155
161
  path(
156
162
  "<str:view>/<str:action>/<str:modifier>",
157
163
  self.admin_view(SBAdminEntrypointView.as_view()),
@@ -190,8 +190,20 @@ class SBAdminRadioWidget(SBAdminBaseWidget, forms.RadioSelect):
190
190
  )
191
191
 
192
192
 
193
+ class SBAdminRadioDropdownWidget(SBAdminBaseWidget, forms.RadioSelect):
194
+ template_name = "sb_admin/widgets/radio_dropdown.html"
195
+ option_template_name = "sb_admin/widgets/radio_option.html"
196
+
197
+ def __init__(self, form_field=None, attrs=None, choices=()):
198
+ super().__init__(
199
+ form_field,
200
+ attrs={"class": "radio radio-list", **(attrs or {})},
201
+ choices=choices,
202
+ )
203
+
204
+
193
205
  class SBAdminMultipleChoiceWidget(SBAdminBaseWidget, forms.CheckboxSelectMultiple):
194
- template_name = "sb_admin/widgets/checkbox_select.html"
206
+ template_name = "sb_admin/widgets/checkbox_dropdown.html"
195
207
  option_template_name = "sb_admin/widgets/checkbox_option.html"
196
208
 
197
209
  def __init__(self, form_field=None, attrs=None, choices=()):
@@ -38,6 +38,9 @@ from django_smartbase_admin.engine.const import (
38
38
  IGNORE_LIST_SELECTION,
39
39
  SUPPORTED_FILE_TYPE_ICONS,
40
40
  )
41
+ from django_smartbase_admin.services.configuration import (
42
+ SBAdminUserConfigurationService,
43
+ )
41
44
  from django_smartbase_admin.services.views import SBAdminViewService
42
45
  from django_smartbase_admin.services.xlsx_export import (
43
46
  SBAdminXLSXExportService,
@@ -208,6 +211,16 @@ class SBAdminBaseView(object):
208
211
  ) -> Iterable[SBAdminCustomAction] | None:
209
212
  return self.sbadmin_detail_actions
210
213
 
214
+ def get_color_scheme_context(self, request):
215
+ from django_smartbase_admin.views.user_config_view import ColorSchemeForm
216
+
217
+ user_config = SBAdminUserConfigurationService.get_user_config(request)
218
+ color_scheme_form = ColorSchemeForm(instance=user_config)
219
+ return {
220
+ "user_config": user_config,
221
+ "color_scheme_form": color_scheme_form,
222
+ }
223
+
211
224
  def get_global_context(
212
225
  self, request, object_id: int | str | None = None
213
226
  ) -> dict[str, Any]:
@@ -234,6 +247,7 @@ class SBAdminBaseView(object):
234
247
  "STATIC_BASE_PATH": static("sb_admin"),
235
248
  }
236
249
  ),
250
+ **self.get_color_scheme_context(request),
237
251
  }
238
252
 
239
253
  def get_model_path(self) -> str:
@@ -7,7 +7,7 @@ msgid ""
7
7
  msgstr ""
8
8
  "Project-Id-Version: \n"
9
9
  "Report-Msgid-Bugs-To: \n"
10
- "POT-Creation-Date: 2025-02-11 13:28+0100\n"
10
+ "POT-Creation-Date: 2025-07-29 12:46+0200\n"
11
11
  "PO-Revision-Date: 2023-11-15 15:21+0100\n"
12
12
  "Last-Translator: \n"
13
13
  "Language-Team: \n"
@@ -206,6 +206,18 @@ msgctxt "Tree widget"
206
206
  msgid "No data."
207
207
  msgstr "Žiadne dáta."
208
208
 
209
+ msgid "System"
210
+ msgstr "Systém"
211
+
212
+ msgid "Dark"
213
+ msgstr "Tmavá"
214
+
215
+ msgid "Light"
216
+ msgstr "Svetlá"
217
+
218
+ msgid "Theme"
219
+ msgstr "Téma"
220
+
209
221
  msgid "Translations"
210
222
  msgstr "Preklady"
211
223
 
@@ -221,15 +233,21 @@ msgstr[0] "Opravte chybu nižšie."
221
233
  msgstr[1] "Opravte chyby nižšie."
222
234
  msgstr[2] "Opravte chyby nižšie."
223
235
 
236
+ msgid "Save"
237
+ msgstr "Uložiť"
238
+
239
+ msgid "Close"
240
+ msgstr "Zatvoriť"
241
+
224
242
  msgid "Prev"
225
- msgstr ""
243
+ msgstr "Pred."
226
244
 
227
245
  #, python-format
228
246
  msgid "<strong>%(current_index)s</strong> / %(all_objects_count)s"
229
247
  msgstr ""
230
248
 
231
249
  msgid "Next"
232
- msgstr ""
250
+ msgstr "Ďal."
233
251
 
234
252
  msgid "Back"
235
253
  msgstr "Naspäť"
@@ -326,9 +344,6 @@ msgstr "Vyhľadať"
326
344
  msgid "Copy"
327
345
  msgstr "Kopírovať"
328
346
 
329
- msgid "Save"
330
- msgstr "Uložiť"
331
-
332
347
  msgid "Show translations"
333
348
  msgstr "Zobraziť preklady"
334
349
 
@@ -337,7 +352,7 @@ msgstr "Uložiť zoradenie"
337
352
 
338
353
  #, python-format
339
354
  msgid "You are authenticated as %(username)s, but are not authorized to access this page. Would you like to login to a different account?"
340
- msgstr ""
355
+ msgstr "Ste prihlásený ako %(username)s, ale k tejto stránke nemáte prístup. Chcete sa prihlásiť pod iným účtom?"
341
356
 
342
357
  msgid "Welcome back"
343
358
  msgstr "Vitajte späť"
@@ -650,9 +665,6 @@ msgstr "Zobraziť menu"
650
665
  msgid "Change current folder details"
651
666
  msgstr "Zmeniť detaily priečinka"
652
667
 
653
- msgid "Close"
654
- msgstr "Zatvoriť"
655
-
656
668
  msgid "Limit"
657
669
  msgstr "Limit"
658
670
 
@@ -704,9 +716,6 @@ msgstr "Poradie sa upravuje, prosím čakajte"
704
716
  msgid "Logout"
705
717
  msgstr "Odhlásiť sa"
706
718
 
707
- msgid "Choose domain"
708
- msgstr "Zvoľte si doménu"
709
-
710
719
  msgid "Continue"
711
720
  msgstr "Pokračovať"
712
721
 
@@ -0,0 +1,26 @@
1
+ # Generated by Django 5.0.3 on 2025-07-29 08:28
2
+
3
+ import django.db.models.deletion
4
+ from django.conf import settings
5
+ from django.db import migrations, models
6
+
7
+
8
+ class Migration(migrations.Migration):
9
+
10
+ dependencies = [
11
+ ('django_smartbase_admin', '0004_alter_sbadminlistviewconfiguration_action_and_more'),
12
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
13
+ ]
14
+
15
+ operations = [
16
+ migrations.CreateModel(
17
+ name='SBAdminUserConfiguration',
18
+ fields=[
19
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
20
+ ('created_at', models.DateTimeField(auto_now_add=True)),
21
+ ('updated_at', models.DateTimeField(auto_now=True)),
22
+ ('color_scheme', models.CharField(choices=[('auto', '<span class="flex gap-8"><svg class="w-20 h-20"><use href="#Translation"></use></svg><span>System</span></span>'), ('dark', '<span class="flex gap-8"><svg class="w-20 h-20"><use href="#Moon"></use></svg><span>Dark</span></span>'), ('light', '<span class="flex gap-8"><svg class="w-20 h-20"><use href="#Sun-one"></use></svg><span>Light</span></span>')], default='auto', max_length=255, verbose_name='Theme')),
23
+ ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
24
+ ],
25
+ ),
26
+ ]
@@ -1,8 +1,26 @@
1
1
  from django.conf import settings
2
2
  from django.db import models
3
+ from django.utils.html import format_html
4
+ from django.utils.translation import gettext_lazy as _
3
5
 
4
6
  from django_smartbase_admin.querysets import SBAdminListViewConfigurationQueryset
5
7
 
8
+ AUTO_LABEL = _("System")
9
+ DARK_LABEL = _("Dark")
10
+ LIGHT_LABEL = _("Light")
11
+
12
+
13
+ class ColorScheme(models.TextChoices):
14
+ AUTO = "auto", format_html(
15
+ f'<span class="flex gap-8"><svg class="w-20 h-20"><use href="#Translation"></use></svg><span>{AUTO_LABEL}</span></span>'
16
+ )
17
+ DARK = "dark", format_html(
18
+ f'<span class="flex gap-8"><svg class="w-20 h-20"><use href="#Moon"></use></svg><span>{DARK_LABEL}</span></span>'
19
+ )
20
+ LIGHT = "light", format_html(
21
+ f'<span class="flex gap-8"><svg class="w-20 h-20"><use href="#Sun-one"></use></svg><span>{LIGHT_LABEL}</span></span>'
22
+ )
23
+
6
24
 
7
25
  class SBAdminListViewConfiguration(models.Model):
8
26
  created_at = models.DateTimeField(auto_now_add=True)
@@ -18,3 +36,18 @@ class SBAdminListViewConfiguration(models.Model):
18
36
  url_params = models.TextField()
19
37
 
20
38
  objects = SBAdminListViewConfigurationQueryset.as_manager()
39
+
40
+
41
+ class SBAdminUserConfiguration(models.Model):
42
+ created_at = models.DateTimeField(auto_now_add=True)
43
+ updated_at = models.DateTimeField(auto_now=True)
44
+ user = models.ForeignKey(
45
+ to=settings.AUTH_USER_MODEL,
46
+ on_delete=models.CASCADE,
47
+ )
48
+ color_scheme = models.CharField(
49
+ max_length=255,
50
+ choices=ColorScheme.choices,
51
+ default=ColorScheme.AUTO,
52
+ verbose_name=_("Theme"),
53
+ )
@@ -20,3 +20,16 @@ class SBAdminConfigurationService(object):
20
20
  return slugify(view_id)
21
21
  else:
22
22
  return view_id
23
+
24
+
25
+ class SBAdminUserConfigurationService(object):
26
+ @classmethod
27
+ def get_user_config(cls, request):
28
+ if not request.user:
29
+ return None
30
+ from django_smartbase_admin.models import SBAdminUserConfiguration
31
+
32
+ user_config, created = SBAdminUserConfiguration.objects.get_or_create(
33
+ user_id=request.user.id
34
+ )
35
+ return user_config
@@ -25,7 +25,11 @@ module.exports = {
25
25
  colors: {
26
26
  current: 'currentColor',
27
27
  light: 'var(--color-light)',
28
+ 'light-a': 'rgb(var(--color-light-a) / <alpha-value>)',
28
29
  'transparent': 'var(--color-transparent)',
29
30
  ...createColorConfig(),
31
+ 'bg': 'var(--color-bg)',
32
+ 'bg-elevated': 'var(--color-bg-elevated)',
33
+ 'bg-input': 'var(--color-bg-input)',
30
34
  }
31
35
  }
@@ -0,0 +1,208 @@
1
+ body
2
+ {
3
+ /* Font */
4
+ /* Emoji fonts are added to visualise them nicely in Internet Explorer. */
5
+ font-family: sans-serif, Arial, Verdana, "Trebuchet MS", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
6
+ font-size: 12px;
7
+
8
+ /* Text color */
9
+ color: #ffffff;
10
+
11
+ /* Remove the background color to make it transparent. */
12
+ background-color: #2B3645;
13
+
14
+ margin: 20px;
15
+ }
16
+
17
+ .cke_panel_listItem.cke_selected a, .cke_panel_listItem a:hover, .cke_panel_listItem a:focus, .cke_panel_listItem a:active {
18
+ background-color: #111827;
19
+ }
20
+
21
+
22
+ .cke_editable
23
+ {
24
+ font-size: 13px;
25
+ line-height: 1.6;
26
+
27
+ /* Fix for missing scrollbars with RTL texts. (#10488) */
28
+ word-wrap: break-word;
29
+ }
30
+
31
+ blockquote
32
+ {
33
+ font-style: italic;
34
+ font-family: Georgia, Times, "Times New Roman", serif;
35
+ padding: 2px 0;
36
+ border-style: solid;
37
+ border-color: #ccc;
38
+ border-width: 0;
39
+ }
40
+
41
+ .cke_contents_ltr blockquote
42
+ {
43
+ padding-left: 20px;
44
+ padding-right: 8px;
45
+ border-left-width: 5px;
46
+ }
47
+
48
+ .cke_contents_rtl blockquote
49
+ {
50
+ padding-left: 8px;
51
+ padding-right: 20px;
52
+ border-right-width: 5px;
53
+ }
54
+
55
+ a
56
+ {
57
+ color: #0782C1;
58
+ }
59
+
60
+ ol,ul,dl
61
+ {
62
+ /* IE7: reset rtl list margin. (#7334) */
63
+ *margin-right: 0px;
64
+ /* Preserved spaces for list items with text direction different than the list. (#6249,#8049)*/
65
+ padding: 0 40px;
66
+ }
67
+
68
+ h1,h2,h3,h4,h5,h6
69
+ {
70
+ font-weight: normal;
71
+ line-height: 1.2;
72
+ }
73
+
74
+ hr
75
+ {
76
+ border: 0px;
77
+ border-top: 1px solid #ccc;
78
+ }
79
+
80
+ img.right
81
+ {
82
+ border: 1px solid #ccc;
83
+ float: right;
84
+ margin-left: 15px;
85
+ padding: 5px;
86
+ }
87
+
88
+ img.left
89
+ {
90
+ border: 1px solid #ccc;
91
+ float: left;
92
+ margin-right: 15px;
93
+ padding: 5px;
94
+ }
95
+
96
+ pre
97
+ {
98
+ white-space: pre-wrap; /* CSS 2.1 */
99
+ word-wrap: break-word; /* IE7 */
100
+ -moz-tab-size: 4;
101
+ tab-size: 4;
102
+ }
103
+
104
+ .marker
105
+ {
106
+ background-color: Yellow;
107
+ }
108
+
109
+ span[lang]
110
+ {
111
+ font-style: italic;
112
+ }
113
+
114
+ figure
115
+ {
116
+ text-align: center;
117
+ outline: solid 1px #ccc;
118
+ background: rgba(0,0,0,0.05);
119
+ padding: 10px;
120
+ margin: 10px 20px;
121
+ display: inline-block;
122
+ }
123
+
124
+ figure > figcaption
125
+ {
126
+ text-align: center;
127
+ display: block; /* For IE8 */
128
+ }
129
+
130
+ a > img {
131
+ padding: 1px;
132
+ margin: 1px;
133
+ border: none;
134
+ outline: 1px solid #0782C1;
135
+ }
136
+
137
+ /* Widget Styles */
138
+ .code-featured
139
+ {
140
+ border: 5px solid red;
141
+ }
142
+
143
+ .math-featured
144
+ {
145
+ padding: 20px;
146
+ box-shadow: 0 0 2px rgba(200, 0, 0, 1);
147
+ background-color: rgba(255, 0, 0, 0.05);
148
+ margin: 10px;
149
+ }
150
+
151
+ .image-clean
152
+ {
153
+ border: 0;
154
+ background: none;
155
+ padding: 0;
156
+ }
157
+
158
+ .image-clean > figcaption
159
+ {
160
+ font-size: .9em;
161
+ text-align: right;
162
+ }
163
+
164
+ .image-grayscale
165
+ {
166
+ background-color: white;
167
+ color: #666;
168
+ }
169
+
170
+ .image-grayscale img, img.image-grayscale
171
+ {
172
+ filter: grayscale(100%);
173
+ }
174
+
175
+ .embed-240p
176
+ {
177
+ max-width: 426px;
178
+ max-height: 240px;
179
+ margin:0 auto;
180
+ }
181
+
182
+ .embed-360p
183
+ {
184
+ max-width: 640px;
185
+ max-height: 360px;
186
+ margin:0 auto;
187
+ }
188
+
189
+ .embed-480p
190
+ {
191
+ max-width: 854px;
192
+ max-height: 480px;
193
+ margin:0 auto;
194
+ }
195
+
196
+ .embed-720p
197
+ {
198
+ max-width: 1280px;
199
+ max-height: 720px;
200
+ margin:0 auto;
201
+ }
202
+
203
+ .embed-1080p
204
+ {
205
+ max-width: 1920px;
206
+ max-height: 1080px;
207
+ margin:0 auto;
208
+ }
@@ -1 +1 @@
1
- (()=>{"use strict";const e=e=>{const t=e.dataset.filterId||e.id,n=e.dataset.labelSeparator||", ",s=document.querySelector(`#${t}-value`);if(!s)return;const r=e.dataset.label;if(r)return s.innerHTML=r,s;const i=(e=>{try{return JSON.parse(e)}catch(e){}return e})(e.value);if(""===e.value||"[]"===e.value)return e.dataset.emptyLabel?s.innerHTML=e.dataset.emptyLabel:s.innerHTML="",s;if("object"==typeof i){const e=[],t=Object.values(i);let r=!1;for(let[n,s]of t.entries()){if(n===window.sb_admin_const.MULTISELECT_FILTER_MAX_CHOICES_SHOWN)break;if(!(t.length>1&&s.value===window.sb_admin_const.SELECT_ALL_KEYWORD)){if(n===window.sb_admin_const.MULTISELECT_FILTER_MAX_CHOICES_SHOWN-2&&t[n+2]){e.push(s.label),r=!0;break}e.push(s.label)}}let a=e.join(n);r&&(a=a.substring(0,a.length),a+="... +"+(t.length-window.sb_admin_const.MULTISELECT_FILTER_MAX_CHOICES_SHOWN+1)),s.innerHTML=a}else try{s.innerHTML=e.options[e.selectedIndex].text}catch(t){const n=document.querySelector(`label[for=${e.id}]`);if(n)s.innerHTML=n.innerText;else{let t;try{t=document.querySelector(`label[for=${e.id}_${e.value}]`)}catch(e){t=null}s.innerHTML=t?t.innerText:i}}return s};window.SBAdminCalendarClass=class{constructor(e){if(this.options=e,this.calendar=null,this.options.calendarOptions=this.options.calendarOptions||{},!Object.hasOwn(this.options.calendarOptions,"events")||!this.options.calendarOptions.events)throw Error("Missing events property!");"string"==typeof this.options.calendarOptions.events&&(this.options.calendarOptions.events={url:this.options.calendarOptions.events}),this.options.calendarOptions.events.extraParams=this.options.calendarOptions.events.extraParams||{},this.options.calendarOptions.events.extraParams=()=>({...this.options.calendarOptions.events.extraParams||{},...this.getFilterData()}),this.initCalendar(),this.initFilters()}initCalendar(){const e=document.getElementById(`${this.options.widgetId}-calendar`);this.calendar=new FullCalendar.Calendar(e,this.options.calendarOptions||{}),this.calendar.render()}getFilterData(){const e=document.querySelector(`#${this.options.widgetId}-filter-form`),t=new FormData(e).entries(),n={};for(const[e,s]of t)s&&(n[e]=s);return n}initFilters(){var t,n;t=`[form="${this.options.widgetId}-filter-form"]`,n=t=>{this.calendar.refetchEvents(),e(t.target)},document.querySelectorAll(t).forEach((e=>{e.addEventListener("change",n),e.addEventListener("keypress",(t=>{if(13===t.keyCode)return e.blur(),t.preventDefault(),e.focus(),!0})),e.addEventListener("SBAutocompleteChange",n)}))}}})();
1
+ (()=>{"use strict";const e=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:", ";const n=[],s=Object.values(e);let r=!1;for(let[e,t]of s.entries()){if(e===window.sb_admin_const.MULTISELECT_FILTER_MAX_CHOICES_SHOWN)break;if(!(s.length>1&&t.value===window.sb_admin_const.SELECT_ALL_KEYWORD)){if(e===window.sb_admin_const.MULTISELECT_FILTER_MAX_CHOICES_SHOWN-2&&s[e+2]){n.push(t.label),r=!0;break}n.push(t.label)}}let i=n.join(t);return r&&(i=i.substring(0,i.length),i+="... +"+(s.length-window.sb_admin_const.MULTISELECT_FILTER_MAX_CHOICES_SHOWN+1)),i},t=t=>{const n=t.dataset.filterId||t.id,s=t.dataset.labelSeparator||", ",r=document.querySelector(`#${n}-value`);if(!r)return;const i=t.dataset.label;if(i)return r.innerHTML=i,r;const a=(e=>{try{return JSON.parse(e)}catch(e){}return e})(t.value);if(""===t.value||"[]"===t.value)return t.dataset.emptyLabel?r.innerHTML=t.dataset.emptyLabel:r.innerHTML="",r;if("object"==typeof a)r.innerHTML=e(a,s);else try{r.innerHTML=t.options[t.selectedIndex].text}catch(e){const n=document.querySelector(`label[for=${t.id}]`);if(n)r.innerHTML=n.innerText;else{let e;try{e=document.querySelector(`label[for=${t.id}_${t.value}]`)}catch(t){e=null}r.innerHTML=e?e.innerText:a}}return r};window.SBAdminCalendarClass=class{constructor(e){if(this.options=e,this.calendar=null,this.options.calendarOptions=this.options.calendarOptions||{},!Object.hasOwn(this.options.calendarOptions,"events")||!this.options.calendarOptions.events)throw Error("Missing events property!");"string"==typeof this.options.calendarOptions.events&&(this.options.calendarOptions.events={url:this.options.calendarOptions.events}),this.options.calendarOptions.events.extraParams=this.options.calendarOptions.events.extraParams||{},this.options.calendarOptions.events.extraParams=()=>({...this.options.calendarOptions.events.extraParams||{},...this.getFilterData()}),this.initCalendar(),this.initFilters()}initCalendar(){const e=document.getElementById(`${this.options.widgetId}-calendar`);this.calendar=new FullCalendar.Calendar(e,this.options.calendarOptions||{}),this.calendar.render()}getFilterData(){const e=document.querySelector(`#${this.options.widgetId}-filter-form`),t=new FormData(e).entries(),n={};for(const[e,s]of t)s&&(n[e]=s);return n}initFilters(){var e,n;e=`[form="${this.options.widgetId}-filter-form"]`,n=e=>{this.calendar.refetchEvents(),t(e.target)},document.querySelectorAll(e).forEach((e=>{e.addEventListener("change",n),e.addEventListener("keypress",(t=>{if(13===t.keyCode)return e.blur(),t.preventDefault(),e.focus(),!0})),e.addEventListener("SBAutocompleteChange",n)}))}}})();
@@ -1 +1 @@
1
- :root{--fc-small-font-size:.75rem;--fc-border-color:var(--color-dark-200);--fc-today-bg-color:var(--color-primary-50);--fc-neutral-bg-color:var(--color-dark-100)}.fc-theme-standard th.fc-col-header-cell{background-color:var(--color-dark-100);padding:.5rem 1.5rem}.fc-theme-standard td.fc-daygrid-day{padding:.5rem}.fc table{font-size:.75rem;line-height:1.25rem}.fc .fc-col-header-cell-cushion{font-size:.875rem;font-weight:500;line-height:1.25rem;padding:0}.fc .fc-daygrid-day{height:9rem}.fc .fc-day-other{background-color:var(--color-dark-100)}.fc .fc-day-other .fc-daygrid-day-top{opacity:1}.fc .fc-day-other .fc-daygrid-day-top .fc-daygrid-day-number{color:var(--color-dark)}.fc .fc-day-other .fc-daygrid-day-events{opacity:.6}.fc .fc-daygrid-day-bottom:after,.fc .fc-daygrid-day-bottom:before,.fc .fc-daygrid-day-events:after,.fc .fc-daygrid-day-events:before,.fc .fc-daygrid-day-frame:after,.fc .fc-daygrid-day-frame:before,.fc .fc-daygrid-event-harness:after,.fc .fc-daygrid-event-harness:before{display:none}.fc .fc-daygrid-day-events,.fc .fc-daygrid-day-frame{display:flex;flex-direction:column;gap:.25rem}.fc .fc-daygrid-day-events{margin:0}.fc .fc-daygrid-day-top{flex-direction:row}.fc .fc-daygrid-day-number{align-items:center;color:var(--color-dark-900);display:flex;font-weight:600;height:1.5rem;justify-content:center;line-height:1;padding:.25rem;width:1.5rem}.fc .fc-day-today .fc-daygrid-day-number{background-color:var(--color-primary);border-radius:9999px;color:var(--color-light)}.fc .fc-daygrid-event{display:flex;gap:.25rem;margin:0!important}.fc .fc-daygrid-dot-event{border-color:var(--color-dark-200);border-radius:6px;border-width:1px;height:1.5rem;padding:0 .5rem}.fc .fc-daygrid-dot-event .fc-event-time{display:none}.fc .fc-daygrid-dot-event .fc-event-title{color:var(--color-dark-900);font-weight:400;line-height:1rem;text-overflow:ellipsis}.fc .fc-daygrid-event-dot{border-color:currentColor;border-radius:9999px;border-width:2px;box-sizing:border-box;flex-shrink:0;height:.75rem;margin:0;width:.75rem}.fc .fc-daygrid-day-bottom{font-size:.75rem;line-height:1.25rem;margin:0!important}.fc .fc-daygrid-more-link{margin:0;padding:0}.fc .fc-daygrid-more-link:hover{background:none}.fc .fc-daygrid-body-unbalanced .fc-daygrid-day-events{margin-bottom:0;min-height:4rem}.fc .fc-daygrid-day-bg{display:none}.fc .fc-popover{z-index:10}.fc .fc-popover .fc-popover-header{padding:.25rem}.fc .fc-popover .fc-popover-title{font-size:.875rem;line-height:1.25rem}.fc .fc-popover .fc-popover-body{display:flex;flex-direction:column;gap:.25rem;padding:.5rem}.fc .fc-scrollgrid{border-left-width:0}.fc .fc-scrollgrid-section>td,.fc .fc-scrollgrid-section>th{border:0}
1
+ :root{--fc-small-font-size:.75rem;--fc-border-color:var(--color-dark-200);--fc-today-bg-color:var(--color-primary-50);--fc-neutral-bg-color:var(--color-bg-elevated)}.fc-theme-standard th.fc-col-header-cell{background-color:var(--color-bg);padding:.5rem 1.5rem}.fc-theme-standard td.fc-daygrid-day{padding:.5rem}.fc table{font-size:.75rem;line-height:1.25rem}.fc .fc-col-header-cell-cushion{font-size:.875rem;font-weight:500;line-height:1.25rem;padding:0}.fc .fc-daygrid-day{height:9rem}.fc .fc-day-other{background-color:var(--color-bg)}.fc .fc-day-other .fc-daygrid-day-top{opacity:1}.fc .fc-day-other .fc-daygrid-day-top .fc-daygrid-day-number{color:var(--color-dark)}.fc .fc-day-other .fc-daygrid-day-events{opacity:.6}.fc .fc-daygrid-day-bottom:after,.fc .fc-daygrid-day-bottom:before,.fc .fc-daygrid-day-events:after,.fc .fc-daygrid-day-events:before,.fc .fc-daygrid-day-frame:after,.fc .fc-daygrid-day-frame:before,.fc .fc-daygrid-event-harness:after,.fc .fc-daygrid-event-harness:before{display:none}.fc .fc-daygrid-day-events,.fc .fc-daygrid-day-frame{display:flex;flex-direction:column;gap:.25rem}.fc .fc-daygrid-day-events{margin:0}.fc .fc-daygrid-day-top{flex-direction:row}.fc .fc-daygrid-day-number{align-items:center;color:var(--color-dark-900);display:flex;font-weight:600;height:1.5rem;justify-content:center;line-height:1;padding:.25rem;width:1.5rem}.fc .fc-day-today .fc-daygrid-day-number{background-color:var(--color-primary);border-radius:9999px;color:var(--color-light)}.fc .fc-daygrid-event{display:flex;gap:.25rem;margin:0!important}.fc .fc-daygrid-dot-event{border-color:var(--color-dark-200);border-radius:6px;border-width:1px;height:1.5rem;padding:0 .5rem}.fc .fc-daygrid-dot-event .fc-event-time{display:none}.fc .fc-daygrid-dot-event .fc-event-title{color:var(--color-dark-900);font-weight:400;line-height:1rem;text-overflow:ellipsis}.fc .fc-daygrid-event-dot{border-color:currentColor;border-radius:9999px;border-width:2px;box-sizing:border-box;flex-shrink:0;height:.75rem;margin:0;width:.75rem}.fc .fc-daygrid-day-bottom{font-size:.75rem;line-height:1.25rem;margin:0!important}.fc .fc-daygrid-more-link{margin:0;padding:0}.fc .fc-daygrid-more-link:hover{background:none}.fc .fc-daygrid-body-unbalanced .fc-daygrid-day-events{margin-bottom:0;min-height:4rem}.fc .fc-daygrid-day-bg{display:none}.fc .fc-popover{z-index:10}.fc .fc-popover .fc-popover-header{padding:.25rem}.fc .fc-popover .fc-popover-title{font-size:.875rem;line-height:1.25rem}.fc .fc-popover .fc-popover-body{display:flex;flex-direction:column;gap:.25rem;padding:.5rem}.fc .fc-scrollgrid{border-left-width:0}.fc .fc-scrollgrid-section>td,.fc .fc-scrollgrid-section>th{border:0}