django-unfold 0.12.0__py3-none-any.whl → 0.13.0__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_unfold-0.12.0.dist-info → django_unfold-0.13.0.dist-info}/METADATA +209 -102
- {django_unfold-0.12.0.dist-info → django_unfold-0.13.0.dist-info}/RECORD +32 -13
- unfold/admin.py +26 -6
- unfold/contrib/guardian/__init__.py +0 -0
- unfold/contrib/guardian/apps.py +6 -0
- unfold/contrib/guardian/templates/admin/guardian/model/change_form.html +13 -0
- unfold/contrib/guardian/templates/admin/guardian/model/field.html +11 -0
- unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage.html +35 -0
- unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage_group.html +55 -0
- unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage_user.html +56 -0
- unfold/contrib/guardian/templates/unfold/guardian/group_form.html +72 -0
- unfold/contrib/guardian/templates/unfold/guardian/user_form.html +72 -0
- unfold/contrib/simple_history/__init__.py +0 -0
- unfold/contrib/simple_history/apps.py +6 -0
- unfold/contrib/simple_history/templates/simple_history/_object_history_list.html +80 -0
- unfold/contrib/simple_history/templates/simple_history/object_history.html +21 -0
- unfold/contrib/simple_history/templates/simple_history/object_history_form.html +55 -0
- unfold/contrib/simple_history/templates/simple_history/submit_line.html +25 -0
- unfold/settings.py +1 -0
- unfold/sites.py +4 -0
- unfold/static/unfold/css/styles.css +1 -1
- unfold/styles.css +134 -66
- unfold/templates/admin/edit_inline/tabular.html +1 -1
- unfold/templates/admin/includes/fieldset.html +3 -7
- unfold/templates/admin/widgets/radio.html +20 -0
- unfold/templates/admin/widgets/radio_option.html +12 -0
- unfold/templates/unfold/helpers/field_readonly.html +9 -0
- unfold/templates/unfold/helpers/submit.html +3 -0
- unfold/templatetags/unfold.py +14 -0
- unfold/widgets.py +19 -0
- /django_unfold-0.12.0.dist-info/LICENSE → /django_unfold-0.13.0.dist-info/LICENSE.md +0 -0
- {django_unfold-0.12.0.dist-info → django_unfold-0.13.0.dist-info}/WHEEL +0 -0
unfold/styles.css
CHANGED
@@ -5,16 +5,17 @@
|
|
5
5
|
@tailwind utilities;
|
6
6
|
|
7
7
|
html {
|
8
|
-
--color-primary-50: theme(
|
9
|
-
--color-primary-100: theme(
|
10
|
-
--color-primary-200: theme(
|
11
|
-
--color-primary-300: theme(
|
12
|
-
--color-primary-400: theme(
|
13
|
-
--color-primary-500: theme(
|
14
|
-
--color-primary-600: theme(
|
15
|
-
--color-primary-700: theme(
|
16
|
-
--color-primary-800: theme(
|
17
|
-
--color-primary-900: theme(
|
8
|
+
--color-primary-50: theme("colors.purple.50");
|
9
|
+
--color-primary-100: theme("colors.purple.100");
|
10
|
+
--color-primary-200: theme("colors.purple.200");
|
11
|
+
--color-primary-300: theme("colors.purple.300");
|
12
|
+
--color-primary-400: theme("colors.purple.400");
|
13
|
+
--color-primary-500: theme("colors.purple.500");
|
14
|
+
--color-primary-600: theme("colors.purple.600");
|
15
|
+
--color-primary-700: theme("colors.purple.700");
|
16
|
+
--color-primary-800: theme("colors.purple.800");
|
17
|
+
--color-primary-900: theme("colors.purple.900");
|
18
|
+
--color-primary-950: theme("colors.purple.950");
|
18
19
|
}
|
19
20
|
|
20
21
|
/*******************************************************
|
@@ -34,7 +35,7 @@ html {
|
|
34
35
|
}
|
35
36
|
|
36
37
|
.material-symbols-outlined {
|
37
|
-
font-family:
|
38
|
+
font-family: "Material Symbols Outlined";
|
38
39
|
font-weight: normal;
|
39
40
|
font-style: normal;
|
40
41
|
font-size: 18px;
|
@@ -45,13 +46,13 @@ html {
|
|
45
46
|
white-space: nowrap;
|
46
47
|
word-wrap: normal;
|
47
48
|
direction: ltr;
|
48
|
-
-moz-font-feature-settings:
|
49
|
+
-moz-font-feature-settings: "liga";
|
49
50
|
-moz-osx-font-smoothing: grayscale;
|
50
51
|
}
|
51
52
|
|
52
53
|
.scrollable-top:after {
|
53
|
-
|
54
|
-
|
54
|
+
@apply absolute bg-gradient-to-t from-gray-100 h-4 left-0 right-0 -top-4 dark:bg-none;
|
55
|
+
content: "";
|
55
56
|
}
|
56
57
|
}
|
57
58
|
|
@@ -71,41 +72,68 @@ html {
|
|
71
72
|
}
|
72
73
|
|
73
74
|
/*******************************************************
|
74
|
-
|
75
|
+
Select
|
75
76
|
*******************************************************/
|
76
77
|
select:not([class*="bg-none"]):not([multiple]) {
|
77
78
|
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 48 48'%3e%3cpath fill='#6B7280' d='M24 31.4 11.3 18.7l2.85-2.8L24 25.8l9.85-9.85 2.85 2.8Z'/%3e%3c/svg%3e");
|
78
|
-
background-position: right .
|
79
|
+
background-position: right 0.7rem center;
|
79
80
|
background-repeat: no-repeat;
|
80
81
|
background-size: 1.125rem 1.125rem;
|
81
82
|
}
|
82
83
|
|
83
84
|
select:after {
|
84
|
-
content:
|
85
|
+
content: "";
|
85
86
|
display: block;
|
86
87
|
}
|
87
88
|
|
88
|
-
|
89
|
+
/*******************************************************
|
90
|
+
Checkbox
|
91
|
+
*******************************************************/
|
92
|
+
#page input[type="checkbox"] {
|
89
93
|
@apply appearance-none bg-white block border border-gray-300 cursor-pointer h-4 relative rounded w-4 dark:bg-gray-700 dark:border-gray-500 hover:border-gray-400;
|
90
|
-
@apply focus:outline focus:outline-1 focus:outline-offset-2 focus:outline-primary-500
|
94
|
+
@apply focus:outline focus:outline-1 focus:outline-offset-2 focus:outline-primary-500;
|
91
95
|
}
|
92
96
|
|
93
|
-
#page input[type=checkbox]:after {
|
97
|
+
#page input[type="checkbox"]:after {
|
94
98
|
@apply absolute flex h-4 items-center justify-center leading-none -ml-px -mt-px text-white transition-all text-sm w-4 dark:text-gray-700;
|
95
99
|
|
96
100
|
content: "done";
|
97
101
|
font-family: "Material Symbols Outlined";
|
98
102
|
}
|
99
103
|
|
100
|
-
#page input[type=checkbox]:checked {
|
104
|
+
#page input[type="checkbox"]:checked {
|
101
105
|
@apply bg-primary-600 border-primary-600 transition-all;
|
102
106
|
}
|
103
107
|
|
104
|
-
#page input[type=checkbox]:checked:after {
|
108
|
+
#page input[type="checkbox"]:checked:after {
|
105
109
|
@apply text-white;
|
106
110
|
}
|
107
111
|
|
108
|
-
#page input[type=checkbox].hidden {
|
112
|
+
#page input[type="checkbox"].hidden {
|
113
|
+
display: none;
|
114
|
+
}
|
115
|
+
|
116
|
+
/*******************************************************
|
117
|
+
Radio
|
118
|
+
*******************************************************/
|
119
|
+
#page input[type="radio"] {
|
120
|
+
@apply appearance-none bg-white block border border-gray-300 cursor-pointer h-4 relative rounded-full w-4 dark:bg-gray-700 dark:border-gray-500 hover:border-gray-400;
|
121
|
+
@apply focus:outline focus:outline-1 focus:outline-offset-2 focus:outline-primary-500;
|
122
|
+
}
|
123
|
+
|
124
|
+
#page input[type="radio"]:after {
|
125
|
+
@apply absolute bg-white content-[''] flex h-2 items-center justify-center leading-none left-1/2 rounded-full text-white top-1/2 transition-all -translate-x-1/2 -translate-y-1/2 text-sm w-2 dark:text-gray-700 dark:bg-transparent;
|
126
|
+
}
|
127
|
+
|
128
|
+
#page input[type="radio"]:checked {
|
129
|
+
@apply bg-primary-600 border-primary-600 transition-all;
|
130
|
+
}
|
131
|
+
|
132
|
+
#page input[type="radio"]:checked:after {
|
133
|
+
@apply bg-white dark:bg-gray-200;
|
134
|
+
}
|
135
|
+
|
136
|
+
#page input[type="radio"].hidden {
|
109
137
|
display: none;
|
110
138
|
}
|
111
139
|
|
@@ -117,7 +145,7 @@ table select {
|
|
117
145
|
|
118
146
|
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="rgb(156, 163, 175)"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M7 10l5 5 5-5H7z"/></svg>');
|
119
147
|
background-size: 1.125rem 1.125rem;
|
120
|
-
background-position: right .5rem center;
|
148
|
+
background-position: right 0.5rem center;
|
121
149
|
}
|
122
150
|
|
123
151
|
table select:focus {
|
@@ -145,7 +173,7 @@ table tr.selected {
|
|
145
173
|
|
146
174
|
.datetimeshortcuts a:first-child:after {
|
147
175
|
@apply border-l flex h-9 items-center justify-center leading-none material-symbols-outlined py-2 text-base text-center w-9 hover:text-gray-700 dark:border-gray-700 dark:hover:text-white;
|
148
|
-
content:
|
176
|
+
content: "timer";
|
149
177
|
}
|
150
178
|
|
151
179
|
.datetimeshortcuts a:first-child:after {
|
@@ -158,7 +186,7 @@ table tr.selected {
|
|
158
186
|
|
159
187
|
.date-icon:after {
|
160
188
|
@apply border-l h-9 items-center justify-center leading-none material-symbols-outlined py-2 text-base text-center w-9 hover:text-gray-700 dark:border-gray-700;
|
161
|
-
content:
|
189
|
+
content: "edit";
|
162
190
|
}
|
163
191
|
|
164
192
|
.date-icon:after {
|
@@ -171,7 +199,7 @@ table tr.selected {
|
|
171
199
|
|
172
200
|
.clock-icon:after {
|
173
201
|
@apply border-l h-9 items-center justify-center material-symbols-outlined py-2 text-base text-center w-9 hover:text-gray-700 dark:border-gray-700 dark:hover:text-white;
|
174
|
-
content:
|
202
|
+
content: "edit";
|
175
203
|
}
|
176
204
|
|
177
205
|
.clock-icon:after {
|
@@ -241,11 +269,11 @@ table tr.selected {
|
|
241
269
|
}
|
242
270
|
|
243
271
|
.selector-add:after {
|
244
|
-
content:
|
272
|
+
content: "arrow_forward";
|
245
273
|
}
|
246
274
|
|
247
275
|
.selector-remove:after {
|
248
|
-
content:
|
276
|
+
content: "arrow_back";
|
249
277
|
}
|
250
278
|
|
251
279
|
.related-widget-wrapper-link {
|
@@ -302,52 +330,73 @@ h3 span:nth-child(3) {
|
|
302
330
|
@apply border-red-600;
|
303
331
|
}
|
304
332
|
|
305
|
-
.select2-container.select2-container--admin-autocomplete
|
333
|
+
.select2-container.select2-container--admin-autocomplete
|
334
|
+
.select2-selection--single {
|
306
335
|
@apply h-auto;
|
307
336
|
}
|
308
337
|
|
309
|
-
.select2-container.select2-container--admin-autocomplete
|
310
|
-
|
338
|
+
.select2-container.select2-container--admin-autocomplete
|
339
|
+
.select2-selection--single
|
340
|
+
.select2-selection__rendered {
|
341
|
+
@apply font-medium h-9 px-3 py-2 text-gray-500 text-sm dark:text-gray-400;
|
311
342
|
}
|
312
343
|
|
313
|
-
.select2-container.select2-container--admin-autocomplete
|
314
|
-
.select2-
|
344
|
+
.select2-container.select2-container--admin-autocomplete
|
345
|
+
.select2-selection--multiple
|
346
|
+
.select2-selection__clear,
|
347
|
+
.select2-container.select2-container--admin-autocomplete
|
348
|
+
.select2-selection--single
|
349
|
+
.select2-selection__clear {
|
315
350
|
@apply flex items-center mr-5 h-9 -mt-2 text-0;
|
316
351
|
}
|
317
352
|
|
318
|
-
.select2-container.select2-container--admin-autocomplete
|
319
|
-
.select2-
|
353
|
+
.select2-container.select2-container--admin-autocomplete
|
354
|
+
.select2-selection--multiple
|
355
|
+
.select2-selection__clear:after,
|
356
|
+
.select2-container.select2-container--admin-autocomplete
|
357
|
+
.select2-selection--single
|
358
|
+
.select2-selection__clear:after {
|
320
359
|
@apply material-symbols-outlined text-gray-500;
|
321
360
|
content: "close";
|
322
361
|
font-size: 14px;
|
323
362
|
}
|
324
363
|
|
325
|
-
.select2-container.select2-container--admin-autocomplete
|
364
|
+
.select2-container.select2-container--admin-autocomplete
|
365
|
+
.select2-selection--single
|
366
|
+
.select2-selection__arrow {
|
326
367
|
@apply flex h-9 items-center mr-2 -mt-px;
|
327
368
|
}
|
328
369
|
|
329
|
-
.select2-container.select2-container--admin-autocomplete
|
370
|
+
.select2-container.select2-container--admin-autocomplete
|
371
|
+
.select2-selection--single
|
372
|
+
.select2-selection__arrow:after {
|
330
373
|
@apply left-0 leading-none m-0 material-symbols-outlined text-gray-500 text-lg;
|
331
374
|
content: "expand_more";
|
332
375
|
}
|
333
376
|
|
334
|
-
.select2-container.select2-container--admin-autocomplete
|
377
|
+
.select2-container.select2-container--admin-autocomplete
|
378
|
+
.select2-selection--single
|
379
|
+
.select2-selection__arrow
|
380
|
+
b {
|
335
381
|
@apply hidden;
|
336
382
|
}
|
337
383
|
|
338
|
-
.select2-container.select2-container--admin-autocomplete
|
384
|
+
.select2-container.select2-container--admin-autocomplete
|
385
|
+
.select2-search--dropdown {
|
339
386
|
@apply flex px-3 py-2;
|
340
387
|
}
|
341
388
|
|
342
|
-
.select2-container.select2-container--admin-autocomplete
|
389
|
+
.select2-container.select2-container--admin-autocomplete
|
390
|
+
.select2-search--dropdown
|
391
|
+
.select2-search__field {
|
343
392
|
@apply bg-gray-50 border border-gray-200 border-solid flex-grow font-medium mx-0 outline-none px-3 py-2 rounded-md shadow-sm text-gray-500 text-sm w-auto dark:bg-gray-800 dark:border-gray-800 dark:text-gray-400;
|
344
393
|
}
|
345
394
|
|
346
|
-
.select2-container.select2-container--admin-autocomplete.select2-container--open.select2-container--above
|
395
|
+
.select2-container.select2-container--admin-autocomplete.select2-container--open.select2-container--above {
|
347
396
|
@apply rounded-t-none;
|
348
397
|
}
|
349
398
|
|
350
|
-
.select2-container.select2-container--admin-autocomplete.select2-container--open.select2-container--below
|
399
|
+
.select2-container.select2-container--admin-autocomplete.select2-container--open.select2-container--below {
|
351
400
|
@apply rounded-b-none;
|
352
401
|
}
|
353
402
|
|
@@ -363,38 +412,55 @@ h3 span:nth-child(3) {
|
|
363
412
|
@apply rounded-b-none rounded-t-md after:bottom-0 after:-mb-1 after:mt-0 after:top-auto;
|
364
413
|
}
|
365
414
|
|
366
|
-
.select2-container.select2-container--admin-autocomplete
|
415
|
+
.select2-container.select2-container--admin-autocomplete
|
416
|
+
.select2-results__option {
|
367
417
|
@apply block px-3 py-2 text-gray-500 text-sm transition-all dark:text-gray-400;
|
368
418
|
}
|
369
419
|
|
370
|
-
.select2-container.select2-container--admin-autocomplete
|
420
|
+
.select2-container.select2-container--admin-autocomplete
|
421
|
+
.select2-results__option--highlighted[aria-selected] {
|
371
422
|
@apply text-primary-500;
|
372
423
|
}
|
373
424
|
|
374
|
-
.select2-container.select2-container--admin-autocomplete
|
425
|
+
.select2-container.select2-container--admin-autocomplete
|
426
|
+
.select2-selection--multiple
|
427
|
+
.select2-selection__clear {
|
375
428
|
@apply m-0 mr-2 top-0;
|
376
429
|
}
|
377
430
|
|
378
|
-
.select2-container.select2-container--admin-autocomplete
|
431
|
+
.select2-container.select2-container--admin-autocomplete
|
432
|
+
.select2-selection--multiple
|
433
|
+
.select2-selection__rendered {
|
379
434
|
@apply pl-1 pr-6 py-0 pt-1;
|
380
435
|
}
|
381
436
|
|
382
|
-
.select2-container--admin-autocomplete
|
437
|
+
.select2-container--admin-autocomplete
|
438
|
+
.select2-selection--multiple
|
439
|
+
li.select2-selection__choice {
|
383
440
|
@apply bg-gray-100 block font-medium h-7 leading-7 m-0 mr-1 mb-1 px-2 shadow-inner text-sm text-gray-500 truncate dark:bg-gray-800 dark:text-gray-400 dark:hover:text-gray-200;
|
384
441
|
}
|
385
442
|
|
386
|
-
.select2-container--admin-autocomplete
|
443
|
+
.select2-container--admin-autocomplete
|
444
|
+
.select2-selection--multiple
|
445
|
+
li.select2-selection__choice
|
446
|
+
.select2-selection__choice__remove {
|
387
447
|
@apply align-top text-0 hover:text-gray-600 dark:hover:text-gray-200;
|
388
448
|
}
|
389
449
|
|
390
|
-
.select2-container--admin-autocomplete
|
450
|
+
.select2-container--admin-autocomplete
|
451
|
+
.select2-selection--multiple
|
452
|
+
li.select2-selection__choice
|
453
|
+
.select2-selection__choice__remove:after {
|
391
454
|
@apply h-7 !leading-7 material-symbols-outlined;
|
392
455
|
|
393
456
|
content: "close";
|
394
457
|
font-size: 14px;
|
395
458
|
}
|
396
459
|
|
397
|
-
.select2-container--admin-autocomplete
|
460
|
+
.select2-container--admin-autocomplete
|
461
|
+
.select2-selection--multiple
|
462
|
+
li.select2-search--inline
|
463
|
+
.select2-search__field {
|
398
464
|
@apply m-0 h-7 text-gray-500 text-sm;
|
399
465
|
}
|
400
466
|
|
@@ -406,25 +472,27 @@ h3 span:nth-child(3) {
|
|
406
472
|
Collapsed
|
407
473
|
*******************************************************/
|
408
474
|
fieldset.collapsed > div {
|
409
|
-
|
475
|
+
display: none;
|
410
476
|
}
|
411
477
|
|
412
478
|
fieldset.collapse {
|
413
|
-
|
479
|
+
@apply visible;
|
414
480
|
}
|
415
481
|
|
416
|
-
fieldset.collapsed h2,
|
417
|
-
|
482
|
+
fieldset.collapsed h2,
|
483
|
+
fieldset.collapsed {
|
484
|
+
@apply block;
|
418
485
|
}
|
419
486
|
|
420
487
|
fieldset.collapsed .collapse-toggle {
|
421
|
-
|
488
|
+
@apply inline;
|
422
489
|
}
|
423
490
|
|
424
491
|
/*******************************************************
|
425
492
|
Calendar
|
426
493
|
*******************************************************/
|
427
|
-
.calendarbox,
|
494
|
+
.calendarbox,
|
495
|
+
.clockbox {
|
428
496
|
@apply bg-white border rounded-md shadow-sm text-gray-500 text-sm w-80 z-50 dark:bg-gray-800 dark:border-gray-700 !fixed !left-1/2 !top-1/2 -translate-x-1/2 -translate-y-1/2;
|
429
497
|
}
|
430
498
|
|
@@ -476,7 +544,7 @@ fieldset.collapsed .collapse-toggle {
|
|
476
544
|
.calendarnav-previous:after {
|
477
545
|
@apply border flex h-7 items-center justify-center material-symbols-outlined rounded-full text-gray-400 transition-all w-7 hover:border-primary-600 hover:text-primary-500 dark:bg-gray-800 dark:border-gray-700 dark:hover:border-gray-800;
|
478
546
|
|
479
|
-
content:
|
547
|
+
content: "navigate_before";
|
480
548
|
display: flex;
|
481
549
|
}
|
482
550
|
|
@@ -490,7 +558,7 @@ fieldset.collapsed .collapse-toggle {
|
|
490
558
|
}
|
491
559
|
|
492
560
|
.calendarnav-next:after {
|
493
|
-
content:
|
561
|
+
content: "navigate_next";
|
494
562
|
display: flex;
|
495
563
|
}
|
496
564
|
|
@@ -520,31 +588,31 @@ fieldset.collapsed .collapse-toggle {
|
|
520
588
|
*******************************************************/
|
521
589
|
.htmx-swapping:before {
|
522
590
|
@apply absolute bg-white bottom-0 left-0 opacity-80 transition-all right-0 top-0;
|
523
|
-
content:
|
591
|
+
content: "";
|
524
592
|
}
|
525
593
|
|
526
594
|
.htmx-swapping:after {
|
527
595
|
@apply absolute animate-spin h-4 inset-1/2 material-symbols-outlined md-16 text-gray-400 w-4;
|
528
|
-
content:
|
596
|
+
content: "sync";
|
529
597
|
}
|
530
598
|
|
531
599
|
/*******************************************************
|
532
600
|
Filters
|
533
601
|
*******************************************************/
|
534
602
|
#changelist-filter .admin-numeric-filter-slider .noUi-handle {
|
535
|
-
|
603
|
+
@apply bg-white border border-gray-200 cursor-pointer h-4 -right-4 rounded-full shadow-sm w-4 dark:bg-gray-200 dark:border-gray-200;
|
536
604
|
}
|
537
605
|
|
538
606
|
#changelist-filter .admin-numeric-filter-slider .noUi-handle-upper {
|
539
|
-
|
607
|
+
@apply right-0;
|
540
608
|
}
|
541
609
|
|
542
610
|
#changelist-filter .admin-numeric-filter-slider .noUi-handle:after {
|
543
|
-
|
611
|
+
content: none;
|
544
612
|
}
|
545
613
|
|
546
614
|
#changelist-filter .admin-numeric-filter-slider .noUi-handle:before {
|
547
|
-
|
615
|
+
content: none;
|
548
616
|
}
|
549
617
|
|
550
618
|
#changelist-filter .admin-numeric-filter-slider.noUi-target {
|
@@ -556,7 +624,7 @@ fieldset.collapsed .collapse-toggle {
|
|
556
624
|
}
|
557
625
|
|
558
626
|
#changelist-filter .admin-numeric-filter-slider-tooltips {
|
559
|
-
|
627
|
+
@apply flex flex-row font-medium mb-5 space-x-4 text-gray-500 text-sm;
|
560
628
|
}
|
561
629
|
|
562
630
|
/*******************************************************
|
@@ -111,7 +111,7 @@
|
|
111
111
|
{% if field.is_readonly or not field.field.is_hidden %}
|
112
112
|
<td{% if field.field.name %} class="field-{{ field.field.name }}{% if field.field.errors|length > 0 %} errors{% endif %}{% if inline_admin_form.original %} p-3 lg:py-3{% else %} py-3{% endif %}{% if field.is_checkbox %} align-middle{% else %} align-top{% endif %} {% if is_last_row and not inline_admin_formset.has_add_permission %}{% if is_last_col %}border-0 {% else %}border-b lg:border-0{% endif %}{% else %}border-b{% endif %} border-gray-200 flex items-center before:capitalize before:content-[attr(data-label)] before:mr-auto before:text-gray-500 before:w-72 lg:before:hidden font-normal px-3 text-left text-sm lg:table-cell dark:border-gray-800"{% endif %} data-label="{{ field.field.label }}">
|
113
113
|
{% if field.is_readonly %}
|
114
|
-
<p class="bg-gray-50 border font-medium px-3 py-2 rounded-md shadow-sm text-gray-500 text-sm
|
114
|
+
<p class="bg-gray-50 border font-medium max-w-lg px-3 py-2 rounded-md shadow-sm text-gray-500 text-sm truncate whitespace-nowrap dark:border-gray-700 dark:text-gray-400 dark:bg-gray-800">
|
115
115
|
{{ field.contents }}
|
116
116
|
</p>
|
117
117
|
{% else %}
|
@@ -1,3 +1,5 @@
|
|
1
|
+
{% load unfold %}
|
2
|
+
|
1
3
|
<fieldset class="module {{ fieldset.classes }}">
|
2
4
|
{% if fieldset.name %}
|
3
5
|
<h2 class="bg-gray-100 border border-transparent font-semibold mb-6 px-4 py-3 rounded-md text-gray-900 text-sm lg:-mx-4 dark:bg-white/[.02] dark:border dark:border-gray-800 dark:text-gray-200">
|
@@ -26,13 +28,7 @@
|
|
26
28
|
</div>
|
27
29
|
|
28
30
|
{% if field.is_readonly %}
|
29
|
-
<div class="readonly bg-gray-50 border font-medium max-w-2xl px-3 py-2 rounded-md shadow-sm text-gray-500 text-sm dark:border-gray-700 dark:text-gray-400 dark:bg-gray-800">
|
30
|
-
{% if field.contents %}
|
31
|
-
{{ field.contents }}
|
32
|
-
{% else %}
|
33
|
-
-
|
34
|
-
{% endif %}
|
35
|
-
</div>
|
31
|
+
<div class="readonly bg-gray-50 border font-medium max-w-2xl px-3 py-2 rounded-md shadow-sm text-gray-500 text-sm dark:border-gray-700 dark:text-gray-400 dark:bg-gray-800 {% if field.is_json %}whitespace-pre{% endif %}">{% if field.contents %}{{ field.contents }}{% else %}-{% endif %}</div>
|
36
32
|
{% else %}
|
37
33
|
{{ field.field }}
|
38
34
|
{% endif %}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
{% with id=widget.attrs.id %}
|
2
|
+
<div{% if id %} id="{{ id }}"{% endif %} class="flex gap-2 {% if radio_style == 1 %} flex-row{% else %} flex-col{% endif %}">
|
3
|
+
{% for group, options, index in widget.optgroups %}
|
4
|
+
{% if group %}
|
5
|
+
<div>
|
6
|
+
<label>{{ group }}</label>
|
7
|
+
{% endif %}
|
8
|
+
|
9
|
+
{% for option in options %}
|
10
|
+
<div>
|
11
|
+
{% include option.template_name with widget=option %}
|
12
|
+
</div>
|
13
|
+
{% endfor %}
|
14
|
+
|
15
|
+
{% if group %}
|
16
|
+
</div>
|
17
|
+
{% endif %}
|
18
|
+
{% endfor %}
|
19
|
+
</div>
|
20
|
+
{% endwith %}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
{% if widget.wrap_label %}
|
2
|
+
<label{% if widget.attrs.id %} for="{{ widget.attrs.id }}"{% endif %} class="flex flex-row items-center gap-2">
|
3
|
+
{% endif %}
|
4
|
+
|
5
|
+
{% include "django/forms/widgets/input.html" %}
|
6
|
+
|
7
|
+
{% if widget.wrap_label %}
|
8
|
+
<span class="text-sm text-gray-900 dark:text-gray-200">
|
9
|
+
{{ widget.label }}
|
10
|
+
</span>
|
11
|
+
</label>
|
12
|
+
{% endif %}
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<div class="flex group mb-6 flex-col last:mb-4">
|
2
|
+
<label class="block font-medium mb-2 text-gray-900 text-sm dark:text-gray-200">
|
3
|
+
{{ title }}
|
4
|
+
</label>
|
5
|
+
|
6
|
+
<div class="readonly bg-gray-50 border font-medium max-w-2xl px-3 py-2 rounded-md shadow-sm text-gray-500 text-sm dark:border-gray-700 dark:bg-gray-800 dark:text-gray-400">
|
7
|
+
{{ value }}
|
8
|
+
</div>
|
9
|
+
</div>
|
unfold/templatetags/unfold.py
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
from typing import Any, Dict, Mapping, Union
|
2
2
|
|
3
|
+
from django.forms import Field
|
3
4
|
from django.template import Library, Node, TemplateSyntaxError
|
4
5
|
from django.template.base import NodeList, Parser, Token
|
5
6
|
from django.template.loader import render_to_string
|
@@ -107,3 +108,16 @@ def do_capture(parser: Parser, token: Token) -> CaptureNode:
|
|
107
108
|
nodelist = parser.parse(("endcapture",))
|
108
109
|
parser.delete_first_token()
|
109
110
|
return CaptureNode(nodelist, var, silent)
|
111
|
+
|
112
|
+
|
113
|
+
@register.filter
|
114
|
+
def add_css_class(field: Field, classes: Union[list, tuple]) -> Field:
|
115
|
+
if type(classes) in (list, tuple):
|
116
|
+
classes = " ".join(classes)
|
117
|
+
|
118
|
+
if "class" in field.field.widget.attrs:
|
119
|
+
field.field.widget.attrs["class"] += f" {classes}"
|
120
|
+
else:
|
121
|
+
field.field.widget.attrs["class"] = classes
|
122
|
+
|
123
|
+
return field
|
unfold/widgets.py
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
from typing import Any, Callable, Dict, Optional, Tuple, Union
|
2
2
|
|
3
|
+
from django.contrib.admin.options import VERTICAL
|
3
4
|
from django.contrib.admin.widgets import (
|
4
5
|
AdminBigIntegerFieldWidget,
|
5
6
|
AdminDateWidget,
|
6
7
|
AdminEmailInputWidget,
|
7
8
|
AdminFileWidget,
|
8
9
|
AdminIntegerFieldWidget,
|
10
|
+
AdminRadioSelect,
|
9
11
|
AdminSplitDateTime,
|
10
12
|
AdminTextareaWidget,
|
11
13
|
AdminTextInputWidget,
|
@@ -319,6 +321,23 @@ class UnfoldAdminSelect(Select):
|
|
319
321
|
super().__init__(attrs, choices)
|
320
322
|
|
321
323
|
|
324
|
+
class UnfoldAdminRadioSelectWidget(AdminRadioSelect):
|
325
|
+
option_template_name = "admin/widgets/radio_option.html"
|
326
|
+
|
327
|
+
def __init__(self, radio_style: Optional[int] = None, *args, **kwargs):
|
328
|
+
super().__init__(*args, **kwargs)
|
329
|
+
|
330
|
+
if radio_style is None:
|
331
|
+
radio_style = VERTICAL
|
332
|
+
|
333
|
+
self.radio_style = radio_style
|
334
|
+
|
335
|
+
def get_context(self, *args, **kwargs) -> Dict[str, Any]:
|
336
|
+
context = super().get_context(*args, **kwargs)
|
337
|
+
context.update({"radio_style": self.radio_style})
|
338
|
+
return context
|
339
|
+
|
340
|
+
|
322
341
|
try:
|
323
342
|
from djmoney.forms.widgets import MoneyWidget
|
324
343
|
from djmoney.settings import CURRENCY_CHOICES
|
File without changes
|
File without changes
|