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.
- django_smartbase_admin/actions/admin_action_list.py +74 -38
- django_smartbase_admin/actions/advanced_filters.py +24 -1
- django_smartbase_admin/admin/admin_base.py +401 -96
- django_smartbase_admin/admin/site.py +93 -35
- django_smartbase_admin/admin/widgets.py +589 -26
- django_smartbase_admin/apps.py +2 -0
- django_smartbase_admin/engine/actions.py +34 -16
- django_smartbase_admin/engine/admin_base_view.py +252 -115
- django_smartbase_admin/engine/configuration.py +186 -4
- django_smartbase_admin/engine/const.py +6 -0
- django_smartbase_admin/engine/dashboard.py +44 -23
- django_smartbase_admin/engine/fake_inline.py +15 -11
- django_smartbase_admin/engine/field.py +42 -12
- django_smartbase_admin/engine/field_formatter.py +22 -8
- django_smartbase_admin/engine/filter_widgets.py +309 -20
- django_smartbase_admin/engine/menu_item.py +8 -5
- django_smartbase_admin/engine/modal_view.py +12 -7
- django_smartbase_admin/engine/request.py +2 -0
- django_smartbase_admin/integration/__init__.py +0 -0
- django_smartbase_admin/integration/django_cms.py +43 -0
- django_smartbase_admin/locale/sk/LC_MESSAGES/django.mo +0 -0
- django_smartbase_admin/locale/sk/LC_MESSAGES/django.po +268 -37
- django_smartbase_admin/migrations/0005_sbadminuserconfiguration.py +26 -0
- django_smartbase_admin/migrations/0006_alter_sbadminuserconfiguration_color_scheme.py +18 -0
- django_smartbase_admin/models.py +22 -0
- django_smartbase_admin/monkeypatch/admin_readonly_field_monkeypatch.py +96 -0
- django_smartbase_admin/monkeypatch/fake_inline_monkeypatch.py +1 -1
- django_smartbase_admin/querysets.py +3 -0
- django_smartbase_admin/services/configuration.py +30 -0
- django_smartbase_admin/services/thread_local.py +6 -19
- django_smartbase_admin/services/views.py +80 -13
- django_smartbase_admin/services/xlsx_export.py +6 -0
- django_smartbase_admin/static/sb_admin/build/tailwind.config.js +1 -0
- django_smartbase_admin/static/sb_admin/build/tailwind_config_partials/colors.js +4 -0
- django_smartbase_admin/static/sb_admin/build/tailwind_config_partials/spacing.js +1 -0
- django_smartbase_admin/static/sb_admin/build/webpack.common.js +11 -8
- django_smartbase_admin/static/sb_admin/css/ckeditor/ckeditor_content_dark.css +208 -0
- django_smartbase_admin/static/sb_admin/css/coloris/coloris.min.css +1 -0
- django_smartbase_admin/static/sb_admin/dist/calendar.js +1 -0
- django_smartbase_admin/static/sb_admin/dist/calendar_style.css +1 -0
- django_smartbase_admin/static/sb_admin/dist/calendar_style.js +0 -0
- django_smartbase_admin/static/sb_admin/dist/chart.js +1 -1
- django_smartbase_admin/static/sb_admin/dist/main.js +1 -1
- django_smartbase_admin/static/sb_admin/dist/main_style.css +1 -1
- django_smartbase_admin/static/sb_admin/dist/table.js +1 -1
- django_smartbase_admin/static/sb_admin/dist/tree_widget.js +1 -0
- django_smartbase_admin/static/sb_admin/dist/tree_widget_style.css +1 -0
- django_smartbase_admin/static/sb_admin/dist/tree_widget_style.js +0 -0
- django_smartbase_admin/static/sb_admin/fancytree/jquery.fancytree-all-deps.min.js +1 -0
- django_smartbase_admin/static/sb_admin/images/file_types/file-csv.svg +11 -0
- django_smartbase_admin/static/sb_admin/images/file_types/file-doc.svg +11 -0
- django_smartbase_admin/static/sb_admin/images/file_types/file-docx.svg +11 -0
- django_smartbase_admin/static/sb_admin/images/file_types/file-other.svg +13 -0
- django_smartbase_admin/static/sb_admin/images/file_types/file-pdf.svg +11 -0
- django_smartbase_admin/static/sb_admin/images/file_types/file-ppt.svg +11 -0
- django_smartbase_admin/static/sb_admin/images/file_types/file-xls.svg +11 -0
- django_smartbase_admin/static/sb_admin/images/file_types/file-xlsx.svg +11 -0
- django_smartbase_admin/static/sb_admin/images/file_types/file-zip.svg +18 -0
- django_smartbase_admin/static/sb_admin/images/flags/de-at.png +0 -0
- django_smartbase_admin/static/sb_admin/images/flags/de-ch.png +0 -0
- django_smartbase_admin/static/sb_admin/images/logo_light.svg +21 -0
- django_smartbase_admin/static/sb_admin/js/coloris/coloris.min.js +6 -0
- django_smartbase_admin/static/sb_admin/js/fullcalendar.min.js +14804 -0
- django_smartbase_admin/static/sb_admin/sprites/sb_admin/Bolt-one.svg +3 -0
- django_smartbase_admin/static/sb_admin/sprites/sb_admin/Calendar.svg +3 -0
- django_smartbase_admin/static/sb_admin/sprites/sb_admin/Caution.svg +3 -0
- django_smartbase_admin/static/sb_admin/sprites/sb_admin/Electric-drill.svg +3 -0
- django_smartbase_admin/static/sb_admin/sprites/sb_admin/Fire-extinguisher.svg +3 -0
- django_smartbase_admin/static/sb_admin/sprites/sb_admin/Gas.svg +3 -0
- django_smartbase_admin/static/sb_admin/sprites/sb_admin/Lightning-fill.svg +3 -0
- django_smartbase_admin/static/sb_admin/sprites/sb_admin/Moon.svg +3 -0
- django_smartbase_admin/static/sb_admin/sprites/sb_admin/Phone-telephone.svg +3 -0
- django_smartbase_admin/static/sb_admin/sprites/sb_admin/Printer.svg +3 -0
- django_smartbase_admin/static/sb_admin/sprites/sb_admin/Pull.svg +3 -0
- django_smartbase_admin/static/sb_admin/sprites/sb_admin/Sun-one.svg +3 -0
- django_smartbase_admin/static/sb_admin/sprites/sb_admin/Time.svg +3 -0
- django_smartbase_admin/static/sb_admin/src/css/_base.css +5 -1
- django_smartbase_admin/static/sb_admin/src/css/_colors.css +257 -82
- django_smartbase_admin/static/sb_admin/src/css/_components.css +61 -13
- django_smartbase_admin/static/sb_admin/src/css/_datepicker.css +8 -1
- django_smartbase_admin/static/sb_admin/src/css/_filer.css +60 -0
- django_smartbase_admin/static/sb_admin/src/css/_inlines.css +51 -10
- django_smartbase_admin/static/sb_admin/src/css/_tabulator.css +8 -2
- django_smartbase_admin/static/sb_admin/src/css/calendar.css +162 -0
- django_smartbase_admin/static/sb_admin/src/css/components/_button.css +41 -1
- django_smartbase_admin/static/sb_admin/src/css/components/_dropdown.css +26 -8
- django_smartbase_admin/static/sb_admin/src/css/components/_input.css +62 -20
- django_smartbase_admin/static/sb_admin/src/css/components/_modal.css +1 -1
- django_smartbase_admin/static/sb_admin/src/css/components/_query-builder.css +21 -2
- django_smartbase_admin/static/sb_admin/src/css/components/_toggle.css +12 -1
- django_smartbase_admin/static/sb_admin/src/css/components/_tooltip.css +8 -22
- django_smartbase_admin/static/sb_admin/src/css/style.css +17 -0
- django_smartbase_admin/static/sb_admin/src/css/tree_widget.css +411 -0
- django_smartbase_admin/static/sb_admin/src/js/autocomplete.js +63 -5
- django_smartbase_admin/static/sb_admin/src/js/calendar.js +56 -0
- django_smartbase_admin/static/sb_admin/src/js/chart.js +8 -22
- django_smartbase_admin/static/sb_admin/src/js/choices.js +18 -8
- django_smartbase_admin/static/sb_admin/src/js/datepicker.js +97 -336
- django_smartbase_admin/static/sb_admin/src/js/datepicker_plugins.js +357 -0
- django_smartbase_admin/static/sb_admin/src/js/main.js +304 -31
- django_smartbase_admin/static/sb_admin/src/js/multiselect.js +50 -41
- django_smartbase_admin/static/sb_admin/src/js/range.js +3 -2
- django_smartbase_admin/static/sb_admin/src/js/table.js +34 -5
- django_smartbase_admin/static/sb_admin/src/js/table_modules/advanced_filter_module.js +43 -20
- django_smartbase_admin/static/sb_admin/src/js/table_modules/data_edit_module.js +8 -10
- django_smartbase_admin/static/sb_admin/src/js/table_modules/filter_module.js +3 -3
- django_smartbase_admin/static/sb_admin/src/js/table_modules/header_tabs_module.js +11 -11
- django_smartbase_admin/static/sb_admin/src/js/table_modules/selection_module.js +28 -8
- django_smartbase_admin/static/sb_admin/src/js/table_modules/table_params_module.js +6 -0
- django_smartbase_admin/static/sb_admin/src/js/table_modules/views_module.js +6 -0
- django_smartbase_admin/static/sb_admin/src/js/tree_widget.js +406 -0
- django_smartbase_admin/static/sb_admin/src/js/utils.js +56 -21
- django_smartbase_admin/templates/sb_admin/actions/change_form.html +169 -114
- django_smartbase_admin/templates/sb_admin/actions/dashboard.html +2 -2
- django_smartbase_admin/templates/sb_admin/actions/list.html +79 -39
- django_smartbase_admin/templates/sb_admin/actions/partials/action_link.html +14 -0
- django_smartbase_admin/templates/sb_admin/actions/partials/tabulator_header_v2.html +2 -2
- django_smartbase_admin/templates/sb_admin/actions/tree_list.html +63 -0
- django_smartbase_admin/templates/sb_admin/authentification/login_base.html +5 -1
- django_smartbase_admin/templates/sb_admin/components/columns.html +1 -1
- django_smartbase_admin/templates/sb_admin/components/filters_v2.html +99 -85
- django_smartbase_admin/templates/sb_admin/dashboard/calendar_widget.html +69 -0
- django_smartbase_admin/templates/sb_admin/dashboard/chart_widget.html +21 -2
- django_smartbase_admin/templates/sb_admin/dashboard/list_widget.html +6 -0
- django_smartbase_admin/templates/sb_admin/dashboard/widget_base.html +1 -1
- django_smartbase_admin/templates/sb_admin/filter_widgets/advanced_filters/date_field.html +18 -8
- django_smartbase_admin/templates/sb_admin/filter_widgets/advanced_filters/multiple_choice_field.html +1 -1
- django_smartbase_admin/templates/sb_admin/filter_widgets/advanced_filters/tree_select_filter.html +2 -0
- django_smartbase_admin/templates/sb_admin/filter_widgets/date_field.html +18 -4
- django_smartbase_admin/templates/sb_admin/filter_widgets/multiple_choice_field.html +14 -0
- django_smartbase_admin/templates/sb_admin/filter_widgets/partials/clear.html +10 -5
- django_smartbase_admin/templates/sb_admin/filter_widgets/radio_choice_field.html +2 -2
- django_smartbase_admin/templates/sb_admin/filter_widgets/tree_select_filter.html +16 -0
- django_smartbase_admin/templates/sb_admin/includes/change_form_title.html +3 -1
- django_smartbase_admin/templates/sb_admin/includes/inline_fieldset.html +48 -39
- django_smartbase_admin/templates/sb_admin/includes/notifications.html +2 -1
- django_smartbase_admin/templates/sb_admin/includes/readonly_boolean_field.html +9 -0
- django_smartbase_admin/templates/sb_admin/includes/readonly_field.html +12 -0
- django_smartbase_admin/templates/sb_admin/includes/table_inline_delete_button.html +4 -5
- django_smartbase_admin/templates/sb_admin/inlines/stacked_inline.html +68 -40
- django_smartbase_admin/templates/sb_admin/inlines/table_inline.html +76 -34
- django_smartbase_admin/templates/sb_admin/integrations/filer/folder_list.html +18 -0
- django_smartbase_admin/templates/sb_admin/navigation.html +166 -158
- django_smartbase_admin/templates/sb_admin/partials/modal/modal_content.html +2 -6
- django_smartbase_admin/templates/sb_admin/sb_admin_base.html +49 -4
- django_smartbase_admin/templates/sb_admin/sb_admin_base_no_sidebar.html +27 -11
- django_smartbase_admin/templates/sb_admin/sb_admin_js_trans.html +3 -0
- django_smartbase_admin/templates/sb_admin/sprites/sb_admin.svg +1 -1
- django_smartbase_admin/templates/sb_admin/tailwind_whitelist.html +6 -3
- django_smartbase_admin/templates/sb_admin/widgets/array.html +0 -1
- django_smartbase_admin/templates/sb_admin/widgets/attributes.html +68 -0
- django_smartbase_admin/templates/sb_admin/widgets/autocomplete.html +13 -2
- django_smartbase_admin/templates/sb_admin/widgets/{checkbox_select.html → checkbox_dropdown.html} +2 -2
- django_smartbase_admin/templates/sb_admin/widgets/clearable_file_input.html +2 -2
- django_smartbase_admin/templates/sb_admin/widgets/color_field.html +30 -0
- django_smartbase_admin/templates/sb_admin/widgets/date.html +8 -1
- django_smartbase_admin/templates/sb_admin/widgets/filer_file.html +84 -0
- django_smartbase_admin/templates/sb_admin/widgets/includes/related_item_buttons.html +38 -0
- django_smartbase_admin/templates/sb_admin/widgets/multiwidget.html +1 -1
- django_smartbase_admin/templates/sb_admin/widgets/radio.html +3 -2
- django_smartbase_admin/templates/sb_admin/widgets/radio_dropdown.html +30 -0
- django_smartbase_admin/templates/sb_admin/widgets/read_only_password_hash.html +3 -0
- django_smartbase_admin/templates/sb_admin/widgets/time.html +8 -1
- django_smartbase_admin/templates/sb_admin/widgets/toggle.html +1 -1
- django_smartbase_admin/templates/sb_admin/widgets/tree_base.html +59 -0
- django_smartbase_admin/templates/sb_admin/widgets/tree_select.html +24 -0
- django_smartbase_admin/templates/sb_admin/widgets/tree_select_inline.html +12 -0
- django_smartbase_admin/templatetags/sb_admin_tags.py +85 -4
- django_smartbase_admin/utils.py +22 -3
- django_smartbase_admin/views/dashboard_view.py +6 -0
- django_smartbase_admin/views/global_filter_view.py +8 -2
- django_smartbase_admin/views/translations_view.py +12 -5
- django_smartbase_admin/views/user_config_view.py +52 -0
- django_smartbase_admin-1.0.38.dist-info/METADATA +166 -0
- {django_smartbase_admin-0.2.54.dist-info → django_smartbase_admin-1.0.38.dist-info}/RECORD +177 -115
- {django_smartbase_admin-0.2.54.dist-info → django_smartbase_admin-1.0.38.dist-info}/WHEEL +1 -1
- django_smartbase_admin/templates/sb_admin/integrations/sorting/change_list.html +0 -401
- django_smartbase_admin-0.2.54.dist-info/METADATA +0 -25
- {django_smartbase_admin-0.2.54.dist-info → django_smartbase_admin-1.0.38.dist-info}/LICENSE.md +0 -0
|
@@ -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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
queryBuilderEl
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
44
|
-
|
|
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
|
|
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>
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
</form>
|
|
4
4
|
|
|
5
5
|
{% block filters %}
|
|
6
|
-
<div class="flex max-sm:flex-wrap max-xs:
|
|
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
|
-
<
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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>
|
django_smartbase_admin/templates/sb_admin/filter_widgets/advanced_filters/multiple_choice_field.html
CHANGED
|
@@ -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"
|
|
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>
|
|
@@ -1,8 +1,22 @@
|
|
|
1
|
-
<div class="dropdown-menu dropdown-menu-datepicker"
|
|
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
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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 }}_{{
|
|
11
|
-
<label for="{{ filter_widget.input_id }}_{{
|
|
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
|
-
{%
|
|
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
|
-
{%
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
{%
|
|
33
|
-
|
|
34
|
-
|
|
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
|
-
|
|
40
|
-
|
|
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"
|
|
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>
|