main
yaemiku 2024-01-04 01:40:33 +01:00
parent 59ef202862
commit e3b3b83ca0
Signed by: podlaskizbs
GPG Key ID: ADC039636B3E4AAB
34 changed files with 7297 additions and 5640 deletions

View File

@ -36,5 +36,6 @@ def load_config(request):
'memberships': Membership.objects.filter(published=True),
'youth': Youth.objects.filter(published=True),
'mbkb': MBKB.objects.filter(published=True),
'atus': Atu.objects.filter(published=True)
'atus': Atu.objects.filter(published=True),
'footer': Footer.Get()
}

View File

@ -87,8 +87,15 @@
>
{% block content %}{% endblock %}
</main>
<footer class="footer text-center font-light italic">
<h6 class="mb-4">&copy; {% now "Y" %} Nikola Kubiczek</h6>
{% if footer %}
<footer class="shadow-lg border-t border-slate-400 bg-white mt-8">
<ul class="lg:m-0 prose max-w-full w-full">
{% content footer %}
<div class="flex flex-wrap gap-4 justify-center items-center mb-4">
{% buttons footer.buttons %}
</div>
</ul>
</footer>
{% endif %}
</body>
</html>

View File

@ -20,3 +20,10 @@ class GrandPrixWAdmin(OrderableAdmin, admin.ModelAdmin):
ordering_field_hide_input = True
exclude = ['ordering']
@admin.register(Footer)
class FooterAdmin(OrderableAdmin, admin.ModelAdmin):
list_display = ('__str__', 'published', 'ordering')
list_editable = ['ordering']
ordering_field_hide_input = True
exclude = ['ordering']

View File

@ -0,0 +1,33 @@
# Generated by Django 5.0.1 on 2024-01-04 00:39
import tinymce.models
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('main', '0011_rename_year_grandprixw_id_alter_grandprixw_published_and_more'),
]
operations = [
migrations.CreateModel(
name='Footer',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('ordering', models.IntegerField(default=0, verbose_name='Kolejność')),
('published', models.BooleanField(default=False, verbose_name='Wpis opublikowany')),
('show_title', models.BooleanField(default=True, verbose_name='Pokaż tytuł')),
('title', models.CharField(blank=True, default='', max_length=250, verbose_name='Tytuł')),
('content', tinymce.models.HTMLField(blank=True, default='', verbose_name='Treść')),
('buttons', models.TextField(blank=True, default='', help_text='Tutaj można wpisać dowolną ilość przycisków w następującym formacie:<br /> <code><br /> tekst1 -> link<br /> teskt2 | link<br /> ...<br /> </code><br /> Symbol <code>-></code> oznacza, że link będzie otwarty w nowej karcie<br /> Symbol <code>|</code> oznacza, że link będzie otwarty w tej samej karcie<br /> Na przykład:<br /> <code><br /> pzbs -> https://pzbs.pl<br /> fotogaleria | https://galeria.podlaskizbs.pl<br /> cezar -> https://www.msc.com.pl/cezar<br /> </code><br /> PZBS i Cezar zostaną otwarte w nowej karcie<br /> <b>UWAGA !!</b><br /> Gdy nie podamy tekstu przyciku, nie pokaże on się, można to wykorzystać w taki sposób:<br /> <code><br /> -> link do wyników<br /> fotogaleria -> link do fotogalerii<br /> </code><br /> Wtedy pokaże się <b>tylko przycisk fotogalerii</b><br /> ', verbose_name='Przyciski')),
('created_at', models.DateTimeField(auto_now_add=True)),
],
options={
'verbose_name': 'Stopka',
'verbose_name_plural': 'Stopki',
'ordering': ['ordering'],
'abstract': False,
},
),
]

View File

@ -1,4 +1,4 @@
from django.db import models
from django.db import models, transaction
from django.urls.base import reverse_lazy
from django.utils.safestring import mark_safe
from tinymce.models import HTMLField
@ -55,3 +55,53 @@ class GrandPrixW(OrderableModel):
class Meta(OrderableModel.Meta):
verbose_name = 'Grand Prix Województwa'
verbose_name_plural = 'Grand Prix Województwa'
class PublishableModel(models.Model):
published = models.BooleanField("Wpis opublikowany", default=False)
@classmethod
def Published(cls):
return cls.objects.filter(published=True)
class Meta():
abstract = True
class SingletonModel(PublishableModel):
class Meta:
abstract = True
def save(self, *args, **kwargs):
if not self.published:
return super().save(*args, **kwargs)
with transaction.atomic():
self.__class__.objects.filter(published=True).update(published=False)
return super().save(*args, **kwargs)
@classmethod
def Get(cls):
return cls.objects.filter(published=True).first()
class PostableModel(PublishableModel, OrderableModel):
reverse_href = ""
show_title = models.BooleanField("Pokaż tytuł", default=True)
title = models.CharField("Tytuł", default="", blank=True, max_length=250)
content = HTMLField("Treść", default="", blank=True)
buttons = models.TextField(
"Przyciski", default="", blank=True, help_text=buttons_help_text
)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title or "(brak tytułu)"
class Meta(OrderableModel.Meta):
abstract = True
class Footer(PostableModel, SingletonModel):
class Meta(OrderableModel.Meta):
verbose_name = "Stopka"
verbose_name_plural = "Stopki"

View File

@ -2,59 +2,88 @@
DJANGO Admin styles
*/
@import url(fonts.css);
/* VARIABLE DEFINITIONS */
html[data-theme="light"],
:root {
--primary: #79aec8;
--secondary: #417690;
--accent: #f5dd5d;
--primary-fg: #fff;
--primary: #79aec8;
--secondary: #417690;
--accent: #f5dd5d;
--primary-fg: #fff;
--body-fg: #333;
--body-bg: #fff;
--body-quiet-color: #666;
--body-loud-color: #000;
--body-fg: #333;
--body-bg: #fff;
--body-quiet-color: #666;
--body-loud-color: #000;
--header-color: #ffc;
--header-branding-color: var(--accent);
--header-bg: var(--secondary);
--header-link-color: var(--primary-fg);
--header-color: #ffc;
--header-branding-color: var(--accent);
--header-bg: var(--secondary);
--header-link-color: var(--primary-fg);
--breadcrumbs-fg: #c4dce8;
--breadcrumbs-link-fg: var(--body-bg);
--breadcrumbs-bg: var(--primary);
--breadcrumbs-fg: #c4dce8;
--breadcrumbs-link-fg: var(--body-bg);
--breadcrumbs-bg: #264b5d;
--link-fg: #447e9b;
--link-hover-color: #036;
--link-selected-fg: #5b80b2;
--link-fg: #417893;
--link-hover-color: #036;
--link-selected-fg: var(--secondary);
--hairline-color: #e8e8e8;
--border-color: #ccc;
--hairline-color: #e8e8e8;
--border-color: #ccc;
--error-fg: #ba2121;
--error-fg: #ba2121;
--message-success-bg: #dfd;
--message-warning-bg: #ffc;
--message-error-bg: #ffefef;
--message-success-bg: #dfd;
--message-warning-bg: #ffc;
--message-error-bg: #ffefef;
--darkened-bg: #f8f8f8; /* A bit darker than --body-bg */
--selected-bg: #e4e4e4; /* E.g. selected table cells */
--selected-row: #ffc;
--darkened-bg: #f8f8f8; /* A bit darker than --body-bg */
--selected-bg: #e4e4e4; /* E.g. selected table cells */
--selected-row: #ffc;
--button-fg: #fff;
--button-bg: var(--primary);
--button-hover-bg: #609ab6;
--default-button-bg: var(--secondary);
--default-button-hover-bg: #205067;
--close-button-bg: #888; /* Previously #bbb, contrast 1.92 */
--close-button-hover-bg: #747474;
--delete-button-bg: #ba2121;
--delete-button-hover-bg: #a41515;
--button-fg: #fff;
--button-bg: var(--secondary);
--button-hover-bg: #205067;
--default-button-bg: #205067;
--default-button-hover-bg: var(--secondary);
--close-button-bg: #747474;
--close-button-hover-bg: #333;
--delete-button-bg: #ba2121;
--delete-button-hover-bg: #a41515;
--object-tools-fg: var(--button-fg);
--object-tools-bg: var(--close-button-bg);
--object-tools-hover-bg: var(--close-button-hover-bg);
--object-tools-fg: var(--button-fg);
--object-tools-bg: var(--close-button-bg);
--object-tools-hover-bg: var(--close-button-hover-bg);
--font-family-primary:
"Segoe UI",
system-ui,
Roboto,
"Helvetica Neue",
Arial,
sans-serif,
"Apple Color Emoji",
"Segoe UI Emoji",
"Segoe UI Symbol",
"Noto Color Emoji";
--font-family-monospace:
ui-monospace,
Menlo,
Monaco,
"Cascadia Mono",
"Segoe UI Mono",
"Roboto Mono",
"Oxygen Mono",
"Ubuntu Monospace",
"Source Code Pro",
"Fira Mono",
"Droid Sans Mono",
"Courier New",
monospace,
"Apple Color Emoji",
"Segoe UI Emoji",
"Segoe UI Symbol",
"Noto Color Emoji";
}
html, body {
@ -65,7 +94,7 @@ body {
margin: 0;
padding: 0;
font-size: 0.875rem;
font-family: "Roboto","Lucida Grande","DejaVu Sans","Bitstream Vera Sans",Verdana,Arial,sans-serif;
font-family: var(--font-family-primary);
color: var(--body-fg);
background: var(--body-bg);
}
@ -73,7 +102,7 @@ body {
/* LINKS */
a:link, a:visited {
color: var(--link-fg);
color: var(--body-fg);
text-decoration: none;
transition: color 0.15s, background 0.15s;
}
@ -163,7 +192,7 @@ li ul {
li, dt, dd {
font-size: 0.8125rem;
line-height: 20px;
line-height: 1.25rem;
}
dt {
@ -197,7 +226,7 @@ blockquote {
}
code, pre {
font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace;
font-family: var(--font-family-monospace);
color: var(--body-quiet-color);
font-size: 0.75rem;
overflow-x: auto;
@ -277,7 +306,7 @@ table {
td, th {
font-size: 0.8125rem;
line-height: 16px;
line-height: 1rem;
border-bottom: 1px solid var(--hairline-color);
vertical-align: top;
padding: 8px;
@ -441,7 +470,7 @@ input, textarea, select, .form-row p, form .button {
margin: 2px 0;
padding: 2px 3px;
vertical-align: middle;
font-family: "Roboto", "Lucida Grande", Verdana, Arial, sans-serif;
font-family: var(--font-family-primary);
font-weight: normal;
font-size: 0.8125rem;
}
@ -470,7 +499,7 @@ textarea:focus, select:focus, .vTextField:focus {
}
select {
height: 30px;
height: 1.875rem;
}
select[multiple] {
@ -506,7 +535,6 @@ a.button {
}
.button.default, input[type=submit].default, .submit-row input.default {
float: right;
border: none;
font-weight: 400;
background: var(--default-button-bg);
@ -556,7 +584,7 @@ input[type=button][disabled].default {
font-weight: 400;
font-size: 0.8125rem;
text-align: left;
background: var(--primary);
background: var(--header-bg);
color: var(--header-link-color);
}
@ -692,6 +720,11 @@ div.breadcrumbs a:focus, div.breadcrumbs a:hover {
background: url(../img/icon-viewlink.svg) 0 1px no-repeat;
}
.hidelink {
padding-left: 16px;
background: url(../img/icon-hidelink.svg) 0 1px no-repeat;
}
.addlink {
padding-left: 16px;
background: url(../img/icon-addlink.svg) 0 1px no-repeat;
@ -731,7 +764,7 @@ a.deletelink:focus, a.deletelink:hover {
display: block;
float: left;
margin-left: 5px;
height: 16px;
height: 1rem;
}
.object-tools a {
@ -801,10 +834,6 @@ a.deletelink:focus, a.deletelink:hover {
height: 100%;
}
#container > div {
flex-shrink: 0;
}
#container > .main {
display: flex;
flex: 1 0 auto;
@ -815,6 +844,20 @@ a.deletelink:focus, a.deletelink:hover {
max-width: 100%;
}
.skip-to-content-link {
position: absolute;
top: -999px;
margin: 5px;
padding: 5px;
background: var(--body-bg);
z-index: 1;
}
.skip-to-content-link:focus {
left: 0px;
top: 0px;
}
#content {
padding: 20px 40px;
}
@ -875,7 +918,6 @@ a.deletelink:focus, a.deletelink:hover {
padding: 10px 40px;
background: var(--header-bg);
color: var(--header-color);
overflow: hidden;
}
#header a:link, #header a:visited, #logout-form button {
@ -887,18 +929,19 @@ a.deletelink:focus, a.deletelink:hover {
}
#branding {
float: left;
display: flex;
}
#branding h1 {
#site-name {
padding: 0;
margin: 0 20px 0 0;
margin: 0;
margin-inline-end: 20px;
font-weight: 300;
font-size: 1.5rem;
color: var(--header-branding-color);
}
#branding h1 a:link, #branding h1 a:visited {
#site-name a:link, #site-name a:visited {
color: var(--accent);
}
@ -922,7 +965,7 @@ a.deletelink:focus, a.deletelink:hover {
background: none;
border: 0;
cursor: pointer;
font-family: "Roboto","Lucida Grande","DejaVu Sans","Bitstream Vera Sans",Verdana,Arial,sans-serif;
font-family: var(--font-family-primary);
}
#user-tools {
@ -1014,8 +1057,8 @@ a.deletelink:focus, a.deletelink:hover {
.delete-confirmation form .cancel-link {
display: inline-block;
vertical-align: middle;
height: 15px;
line-height: 15px;
height: 0.9375rem;
line-height: 0.9375rem;
border-radius: 4px;
padding: 10px 15px;
color: var(--button-fg);
@ -1045,6 +1088,9 @@ a.deletelink:focus, a.deletelink:hover {
/* PAGINATOR */
.paginator {
display: flex;
align-items: center;
gap: 4px;
font-size: 0.8125rem;
padding-top: 10px;
padding-bottom: 10px;
@ -1087,3 +1133,24 @@ a.deletelink:focus, a.deletelink:hover {
color: white;
background: var(--link-hover-color);
}
.paginator input {
margin-left: auto;
}
.base-svgs {
display: none;
}
.visually-hidden {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
overflow: hidden;
clip: rect(0,0,0,0);
white-space: nowrap;
border: 0;
color: var(--body-fg);
background-color: var(--body-bg);
}

View File

@ -90,7 +90,7 @@
}
#toolbar #searchbar {
height: 19px;
height: 1.1875rem;
border: 1px solid var(--border-color);
padding: 2px 5px;
margin: 0;
@ -153,6 +153,7 @@
font-weight: 400;
padding: 0 15px;
margin-bottom: 10px;
cursor: pointer;
}
#changelist-filter details summary > * {
@ -215,35 +216,32 @@
color: var(--link-hover-color);
}
#changelist-filter #changelist-filter-clear a {
#changelist-filter #changelist-filter-extra-actions {
font-size: 0.8125rem;
padding-bottom: 10px;
margin-bottom: 10px;
border-bottom: 1px solid var(--hairline-color);
}
/* DATE DRILLDOWN */
.change-list ul.toplinks {
display: block;
float: left;
padding: 0;
margin: 0;
width: 100%;
}
.change-list ul.toplinks li {
padding: 3px 6px;
.change-list .toplinks {
display: flex;
padding-bottom: 5px;
flex-wrap: wrap;
gap: 3px 17px;
font-weight: bold;
list-style-type: none;
display: inline-block;
}
.change-list ul.toplinks .date-back a {
.change-list .toplinks a {
font-size: 0.8125rem;
}
.change-list .toplinks .date-back {
color: var(--body-quiet-color);
}
.change-list ul.toplinks .date-back a:focus,
.change-list ul.toplinks .date-back a:hover {
.change-list .toplinks .date-back:focus,
.change-list .toplinks .date-back:hover {
color: var(--link-hover-color);
}
@ -258,16 +256,31 @@
vertical-align: baseline;
}
#changelist table tbody tr.selected {
/* Once the :has() pseudo-class is supported by all browsers, the tr.selected
selector and the JS adding the class can be removed. */
#changelist tbody tr.selected {
background-color: var(--selected-row);
}
#changelist tbody tr:has(.action-select:checked) {
background-color: var(--selected-row);
}
@media (forced-colors: active) {
#changelist tbody tr.selected {
background-color: SelectedItem;
}
#changelist tbody tr:has(.action-select:checked) {
background-color: SelectedItem;
}
}
#changelist .actions {
padding: 10px;
background: var(--body-bg);
border-top: none;
border-bottom: none;
line-height: 24px;
line-height: 1.5rem;
color: var(--body-quiet-color);
width: 100%;
}
@ -286,7 +299,7 @@
#changelist .actions select {
vertical-align: top;
height: 24px;
height: 1.5rem;
color: var(--body-fg);
border: 1px solid var(--border-color);
border-radius: 4px;
@ -313,7 +326,7 @@
background: var(--body-bg);
box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset;
cursor: pointer;
height: 24px;
height: 1.5rem;
line-height: 1;
padding: 4px 8px;
margin: 0;

View File

@ -31,3 +31,94 @@
--close-button-hover-bg: #666666;
}
}
html[data-theme="dark"] {
--primary: #264b5d;
--primary-fg: #f7f7f7;
--body-fg: #eeeeee;
--body-bg: #121212;
--body-quiet-color: #e0e0e0;
--body-loud-color: #ffffff;
--breadcrumbs-link-fg: #e0e0e0;
--breadcrumbs-bg: var(--primary);
--link-fg: #81d4fa;
--link-hover-color: #4ac1f7;
--link-selected-fg: #6f94c6;
--hairline-color: #272727;
--border-color: #353535;
--error-fg: #e35f5f;
--message-success-bg: #006b1b;
--message-warning-bg: #583305;
--message-error-bg: #570808;
--darkened-bg: #212121;
--selected-bg: #1b1b1b;
--selected-row: #00363a;
--close-button-bg: #333333;
--close-button-hover-bg: #666666;
}
/* THEME SWITCH */
.theme-toggle {
cursor: pointer;
border: none;
padding: 0;
background: transparent;
vertical-align: middle;
margin-inline-start: 5px;
margin-top: -1px;
}
.theme-toggle svg {
vertical-align: middle;
height: 1rem;
width: 1rem;
display: none;
}
/*
Fully hide screen reader text so we only show the one matching the current
theme.
*/
.theme-toggle .visually-hidden {
display: none;
}
html[data-theme="auto"] .theme-toggle .theme-label-when-auto {
display: block;
}
html[data-theme="dark"] .theme-toggle .theme-label-when-dark {
display: block;
}
html[data-theme="light"] .theme-toggle .theme-label-when-light {
display: block;
}
/* ICONS */
.theme-toggle svg.theme-icon-when-auto,
.theme-toggle svg.theme-icon-when-dark,
.theme-toggle svg.theme-icon-when-light {
fill: var(--header-link-color);
color: var(--header-bg);
}
html[data-theme="auto"] .theme-toggle svg.theme-icon-when-auto {
display: block;
}
html[data-theme="dark"] .theme-toggle svg.theme-icon-when-dark {
display: block;
}
html[data-theme="light"] .theme-toggle svg.theme-icon-when-light {
display: block;
}

View File

@ -1,4 +1,7 @@
/* DASHBOARD */
.dashboard td, .dashboard th {
word-break: break-word;
}
.dashboard .module table th {
width: 100%;

View File

@ -22,6 +22,18 @@ form .form-row p {
padding-left: 0;
}
.flex-container {
display: flex;
}
.form-multiline {
flex-wrap: wrap;
}
.form-multiline > div {
padding-bottom: 10px;
}
/* FORM LABELS */
label {
@ -69,7 +81,7 @@ form ul.inline li {
.aligned label {
display: block;
padding: 4px 10px 0 0;
float: left;
min-width: 160px;
width: 160px;
word-wrap: break-word;
line-height: 1;
@ -79,14 +91,14 @@ form ul.inline li {
content: '';
display: inline-block;
vertical-align: middle;
height: 26px;
height: 1.625rem;
}
.aligned label + p, .aligned label + div.help, .aligned label + div.readonly {
.aligned label + p, .aligned .checkbox-row + div.help, .aligned label + div.readonly {
padding: 6px 0;
margin-top: 0;
margin-bottom: 0;
margin-left: 170px;
margin-left: 0;
overflow-wrap: break-word;
}
@ -117,16 +129,17 @@ form .aligned div.radiolist {
form .aligned p.help,
form .aligned div.help {
clear: left;
margin-top: 0;
margin-left: 160px;
padding-left: 10px;
}
form .aligned label + p.help,
form .aligned label + div.help {
form .aligned p.date div.help.timezonewarning,
form .aligned p.datetime div.help.timezonewarning,
form .aligned p.time div.help.timezonewarning {
margin-left: 0;
padding-left: 0;
font-weight: normal;
}
form .aligned p.help:last-child,
@ -171,14 +184,7 @@ form .aligned table p {
width: 610px;
}
.checkbox-row p.help,
.checkbox-row div.help {
margin-left: 0;
padding-left: 0;
}
fieldset .fieldBox {
float: left;
margin-right: 20px;
}
@ -189,6 +195,7 @@ fieldset .fieldBox {
}
form .wide p,
form .wide ul.errorlist,
form .wide input + p.help,
form .wide input + div.help {
margin-left: 200px;
@ -196,7 +203,7 @@ form .wide input + div.help {
form .wide p.help,
form .wide div.help {
padding-left: 38px;
padding-left: 50px;
}
form div.help ul {
@ -242,19 +249,21 @@ fieldset.collapsed .collapse-toggle {
/* MONOSPACE TEXTAREAS */
fieldset.monospace textarea {
font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace;
font-family: var(--font-family-monospace);
}
/* SUBMIT ROW */
.submit-row {
padding: 12px 14px 7px;
padding: 12px 14px 12px;
margin: 0 0 20px;
background: var(--darkened-bg);
border: 1px solid var(--hairline-color);
border-radius: 4px;
text-align: right;
overflow: hidden;
display: flex;
gap: 10px;
flex-wrap: wrap;
}
body.popup .submit-row {
@ -262,33 +271,29 @@ body.popup .submit-row {
}
.submit-row input {
height: 35px;
line-height: 15px;
margin: 0 0 5px 5px;
height: 2.1875rem;
line-height: 0.9375rem;
}
.submit-row input, .submit-row a {
margin: 0;
}
.submit-row input.default {
margin: 0 0 5px 8px;
text-transform: uppercase;
}
.submit-row p {
margin: 0.3em;
}
.submit-row p.deletelink-box {
float: left;
margin: 0;
.submit-row a.deletelink {
margin-left: auto;
}
.submit-row a.deletelink {
display: block;
background: var(--delete-button-bg);
border-radius: 4px;
padding: 10px 15px;
height: 15px;
line-height: 15px;
margin-bottom: 5px;
padding: 0.625rem 0.9375rem;
height: 0.9375rem;
line-height: 0.9375rem;
color: var(--button-fg);
}
@ -297,9 +302,8 @@ body.popup .submit-row {
background: var(--close-button-bg);
border-radius: 4px;
padding: 10px 15px;
height: 15px;
line-height: 15px;
margin: 0 0 0 5px;
height: 0.9375rem;
line-height: 0.9375rem;
color: var(--button-fg);
}
@ -307,12 +311,14 @@ body.popup .submit-row {
.submit-row a.deletelink:hover,
.submit-row a.deletelink:active {
background: var(--delete-button-hover-bg);
text-decoration: none;
}
.submit-row a.closelink:focus,
.submit-row a.closelink:hover,
.submit-row a.closelink:active {
background: var(--close-button-hover-bg);
text-decoration: none;
}
/* CUSTOM FORM FIELDS */
@ -512,8 +518,8 @@ body.popup .submit-row {
}
.related-lookup {
width: 16px;
height: 16px;
width: 1rem;
height: 1rem;
background-image: url(../img/search.svg);
}

View File

@ -59,8 +59,13 @@
content: '\00AB';
}
.main > #nav-sidebar {
visibility: hidden;
}
.main.shifted > #nav-sidebar {
margin-left: 0;
visibility: visible;
}
[dir="rtl"] .main.shifted > #nav-sidebar {
@ -97,6 +102,12 @@
background: var(--selected-row);
}
@media (forced-colors: active) {
#nav-sidebar .current-model {
background-color: SelectedItem;
}
}
.main > #nav-sidebar + .content {
max-width: calc(100% - 23px);
}

View File

@ -43,7 +43,7 @@ input[type="submit"], button {
justify-content: flex-start;
}
#branding h1 {
#site-name {
margin: 0 0 8px;
line-height: 1.2;
}
@ -104,13 +104,13 @@ input[type="submit"], button {
}
#changelist-search label {
line-height: 22px;
line-height: 1.375rem;
}
#toolbar form #searchbar {
flex: 1 0 auto;
width: 0;
height: 22px;
height: 1.375rem;
margin: 0 10px 0 6px;
}
@ -186,12 +186,12 @@ input[type="submit"], button {
box-sizing: border-box;
margin: 0;
padding: 6px 8px;
min-height: 36px;
min-height: 2.25rem;
font-size: 0.875rem;
}
.form-row select {
height: 36px;
height: 2.25rem;
}
.form-row select[multiple] {
@ -199,12 +199,6 @@ input[type="submit"], button {
min-height: 0;
}
fieldset .fieldBox {
float: none;
margin: 0 -10px;
padding: 0 10px;
}
fieldset .fieldBox + .fieldBox {
margin-top: 10px;
padding-top: 10px;
@ -232,37 +226,17 @@ input[type="submit"], button {
}
.submit-row {
padding: 8px 8px 3px 8px;
padding: 8px;
}
.submit-row a.deletelink {
padding: 10px 7px;
}
.submit-row input.default {
margin: 0 0 5px 5px;
}
.button, input[type=submit], input[type=button], .submit-row input, a.button {
padding: 7px;
}
/* Related widget */
.related-widget-wrapper {
float: none;
}
.related-widget-wrapper-link + .selector {
max-width: calc(100% - 30px);
margin-right: 15px;
}
select + .related-widget-wrapper-link,
.related-widget-wrapper-link + .related-widget-wrapper-link {
margin-left: 10px;
}
/* Selector */
.selector {
@ -280,7 +254,7 @@ input[type="submit"], button {
}
.selector .selector-filter input {
width: auto;
width: 100%;
min-height: 0;
flex: 1 1;
}
@ -302,7 +276,6 @@ input[type="submit"], button {
width: 26px;
height: 52px;
padding: 2px 0;
margin: auto 15px;
border-radius: 20px;
transform: translateY(-10px);
}
@ -346,7 +319,6 @@ input[type="submit"], button {
width: 52px;
height: 26px;
padding: 0 2px;
margin: 15px auto;
transform: none;
}
@ -394,10 +366,6 @@ input[type="submit"], button {
display: none;
}
form .form-row p.datetime {
width: 100%;
}
.datetime input {
width: 50%;
max-width: 120px;
@ -446,7 +414,7 @@ input[type="submit"], button {
padding: 15px 20px;
}
.login #branding h1 {
.login #site-name {
margin: 0;
}
@ -568,8 +536,6 @@ input[type="submit"], button {
.aligned .form-row,
.aligned .form-row > div {
display: flex;
flex-wrap: wrap;
max-width: 100vw;
}
@ -577,6 +543,14 @@ input[type="submit"], button {
width: calc(100vw - 30px);
}
.flex-container {
flex-flow: column;
}
.flex-container.checkbox-row {
flex-flow: row;
}
textarea {
max-width: none;
}
@ -596,6 +570,7 @@ input[type="submit"], button {
.aligned label {
width: 100%;
min-width: auto;
padding: 0 0 10px;
}
@ -610,10 +585,6 @@ input[type="submit"], button {
max-width: 100%;
}
.aligned .checkbox-row {
align-items: center;
}
.aligned .checkbox-row input {
flex: 0 1 auto;
margin: 0;
@ -632,7 +603,6 @@ input[type="submit"], button {
}
.aligned p.file-upload {
margin-left: 0;
font-size: 0.8125rem;
}
@ -656,7 +626,8 @@ input[type="submit"], button {
padding: 0;
}
form .aligned ul {
form .aligned ul,
form .aligned ul.errorlist {
margin-left: 0;
padding-left: 0;
}
@ -695,23 +666,14 @@ input[type="submit"], button {
align-self: center;
}
select + .related-widget-wrapper-link,
.related-widget-wrapper-link + .related-widget-wrapper-link {
margin-left: 15px;
}
/* Selector */
.selector {
flex-direction: column;
}
.selector > * {
float: none;
gap: 10px 0;
}
.selector-available, .selector-chosen {
margin-bottom: 0;
flex: 1 1 auto;
}
@ -721,11 +683,9 @@ input[type="submit"], button {
.selector ul.selector-chooser {
display: block;
float: none;
width: 52px;
height: 26px;
padding: 0 2px;
margin: 15px auto 20px;
transform: none;
}
@ -823,28 +783,23 @@ input[type="submit"], button {
/* Submit row */
.submit-row {
padding: 10px 10px 5px;
padding: 10px;
margin: 0 0 15px;
display: flex;
flex-direction: column;
gap: 8px;
}
.submit-row > * {
width: 100%;
}
.submit-row input, .submit-row input.default, .submit-row a, .submit-row a.closelink {
float: none;
margin: 0 0 10px;
.submit-row input, .submit-row input.default, .submit-row a {
text-align: center;
}
.submit-row a.closelink {
padding: 10px 0;
text-align: center;
}
.submit-row p.deletelink-box {
order: 4;
.submit-row a.deletelink {
margin: 0;
}
/* Messages */
@ -966,7 +921,7 @@ input[type="submit"], button {
.calendar-shortcuts {
padding: 10px 0;
font-size: 0.75rem;
line-height: 12px;
line-height: 0.75rem;
}
.calendar-shortcuts a {

View File

@ -69,7 +69,8 @@
margin-right: 15px;
}
[dir="rtl"] .aligned ul {
[dir="rtl"] .aligned ul,
[dir="rtl"] form .aligned ul.errorlist {
margin-right: 0;
}
@ -77,4 +78,7 @@
margin-left: 0;
margin-right: 0;
}
[dir="rtl"] .aligned .vCheckboxLabel {
padding: 1px 5px 0 0;
}
}

View File

@ -13,7 +13,7 @@ th {
margin-right: 1.5em;
}
.viewlink, .addlink, .changelink {
.viewlink, .addlink, .changelink, .hidelink {
padding-left: 0;
padding-right: 16px;
background-position: 100% 1px;
@ -107,23 +107,25 @@ thead th.sorted .text {
border-left: none;
}
.paginator .end {
margin-left: 6px;
margin-right: 0;
}
.paginator input {
margin-left: 0;
margin-right: auto;
}
/* FORMS */
.aligned label {
padding: 0 0 3px 1em;
float: right;
}
.submit-row {
text-align: left
}
.submit-row p.deletelink-box {
float: right;
}
.submit-row input.default {
.submit-row a.deletelink {
margin-left: 0;
margin-right: auto;
}
.vDateField, .vTimeField {
@ -134,13 +136,11 @@ thead th.sorted .text {
margin-left: 5px;
}
form .aligned p.help, form .aligned div.help {
clear: right;
}
form .aligned ul {
margin-right: 163px;
padding-right: 10px;
margin-left: 0;
padding-left: 0;
}
form ul.inline li {
@ -149,12 +149,39 @@ form ul.inline li {
padding-left: 7px;
}
input[type=submit].default, .submit-row input.default {
float: left;
form .aligned p.help,
form .aligned div.help {
margin-right: 160px;
padding-right: 10px;
}
form div.help ul,
form .aligned .checkbox-row + .help,
form .aligned p.date div.help.timezonewarning,
form .aligned p.datetime div.help.timezonewarning,
form .aligned p.time div.help.timezonewarning {
margin-right: 0;
padding-right: 0;
}
form .wide p.help, form .wide div.help {
padding-left: 0;
padding-right: 50px;
}
form .wide p,
form .wide ul.errorlist,
form .wide input + p.help,
form .wide input + div.help {
margin-right: 200px;
margin-left: 0px;
}
.submit-row {
text-align: right;
}
fieldset .fieldBox {
float: right;
margin-left: 20px;
margin-right: 0;
}
@ -207,6 +234,38 @@ fieldset .fieldBox {
text-align: right;
}
.selector-add {
background: url(../img/selector-icons.svg) 0 -64px no-repeat;
}
.active.selector-add:focus, .active.selector-add:hover {
background-position: 0 -80px;
}
.selector-remove {
background: url(../img/selector-icons.svg) 0 -96px no-repeat;
}
.active.selector-remove:focus, .active.selector-remove:hover {
background-position: 0 -112px;
}
a.selector-chooseall {
background: url(../img/selector-icons.svg) right -128px no-repeat;
}
a.active.selector-chooseall:focus, a.active.selector-chooseall:hover {
background-position: 100% -144px;
}
a.selector-clearall {
background: url(../img/selector-icons.svg) 0 -160px no-repeat;
}
a.active.selector-clearall:focus, a.active.selector-clearall:hover {
background-position: 0 -176px;
}
.inline-deletelink {
float: left;
}
@ -237,3 +296,7 @@ form .form-row p.datetime {
margin-left: inherit;
margin-right: 2px;
}
.selector .selector-chooser {
margin: 0;
}

View File

@ -1,27 +1,23 @@
/* SELECTOR (FILTER INTERFACE) */
.selector {
width: 800px;
float: left;
display: flex;
flex-grow: 1;
gap: 0 10px;
}
.selector select {
width: 380px;
height: 17.2em;
flex: 1 0 auto;
overflow: scroll;
width: 100%;
}
.selector-available, .selector-chosen {
width: 380px;
text-align: center;
margin-bottom: 5px;
display: flex;
flex-direction: column;
}
.selector-chosen select {
border-top: none;
flex: 1 1;
}
.selector-available h2, .selector-chosen h2 {
@ -29,9 +25,24 @@
border-radius: 4px 4px 0 0;
}
.selector-chosen h2 {
.selector-chosen .list-footer-display {
border: 1px solid var(--border-color);
border-top: none;
border-radius: 0 0 4px 4px;
margin: 0 0 10px;
padding: 8px;
text-align: center;
background: var(--primary);
color: var(--header-link-color);
cursor: pointer;
}
.selector-chosen .list-footer-display__clear {
color: var(--breadcrumbs-fg);
}
.selector-chosen h2 {
background: var(--secondary);
color: var(--header-link-color);
}
.selector .selector-available h2 {
@ -47,6 +58,7 @@
font-size: 0.625rem;
margin: 0;
text-align: left;
display: flex;
}
.selector .selector-filter label,
@ -58,10 +70,15 @@
padding: 0;
overflow: hidden;
line-height: 1;
min-width: auto;
}
.selector .selector-available input {
width: 320px;
.selector-filter input {
flex-grow: 1;
}
.selector .selector-available input,
.selector .selector-chosen input {
margin-left: 8px;
}
@ -70,7 +87,7 @@
width: 22px;
background-color: var(--selected-bg);
border-radius: 10px;
margin: 0 5px;
margin: 0;
padding: 0;
transform: translateY(-17px);
}
@ -86,6 +103,15 @@
margin: 0 0 10px;
border-radius: 0 0 4px 4px;
}
.selector .selector-chosen--with-filtered select {
margin: 0;
border-radius: 0;
height: 14em;
}
.selector .selector-chosen:not(.selector-chosen--with-filtered) .list-footer-display {
display: none;
}
.selector-add, .selector-remove {
width: 16px;
@ -125,7 +151,7 @@ a.selector-chooseall, a.selector-clearall {
display: inline-block;
height: 16px;
text-align: left;
margin: 1px auto 3px;
margin: 0 auto;
overflow: hidden;
font-weight: bold;
line-height: 16px;
@ -256,8 +282,8 @@ a.active.selector-clearall:focus, a.active.selector-clearall:hover {
.selector .search-label-icon {
background: url(../img/search.svg) 0 0 no-repeat;
display: inline-block;
height: 18px;
width: 18px;
height: 1.125rem;
width: 1.125rem;
}
/* DATE AND TIME */
@ -347,10 +373,6 @@ p.file-upload {
font-weight: bold;
}
.aligned p.file-upload {
margin-left: 170px;
}
.file-upload a {
font-weight: normal;
}
@ -429,7 +451,7 @@ span.clearable-file-input label {
}
.calendar td.selected a {
background: var(--primary);
background: var(--secondary);
color: var(--button-fg);
}
@ -477,7 +499,7 @@ span.clearable-file-input label {
background: var(--body-bg);
color: var(--body-quiet-color);
font-size: 0.6875rem;
line-height: 11px;
line-height: 0.6875rem;
border-top: 1px solid var(--hairline-color);
padding: 8px 0;
}
@ -516,17 +538,17 @@ span.clearable-file-input label {
margin: 0;
padding: 4px 0;
font-size: 0.75rem;
background: #eee;
background: var(--close-button-bg);
border-top: 1px solid var(--border-color);
color: var(--body-fg);
color: var(--button-fg);
}
.calendar-cancel:focus, .calendar-cancel:hover {
background: #ddd;
background: var(--close-button-hover-bg);
}
.calendar-cancel a {
color: black;
color: var(--button-fg);
display: block;
}
@ -557,24 +579,25 @@ ul.timelist, .timelist li {
/* RELATED WIDGET WRAPPER */
.related-widget-wrapper {
float: left; /* display properly in form rows with multiple fields */
overflow: hidden; /* clear floated contents */
display: flex;
gap: 0 10px;
flex-grow: 1;
flex-wrap: wrap;
margin-bottom: 5px;
}
.related-widget-wrapper-link {
opacity: 0.3;
opacity: .6;
filter: grayscale(1);
}
.related-widget-wrapper-link:link {
opacity: .8;
}
.related-widget-wrapper-link:link:focus,
.related-widget-wrapper-link:link:hover {
opacity: 1;
filter: grayscale(0);
}
select + .related-widget-wrapper-link,
.related-widget-wrapper-link + .related-widget-wrapper-link {
margin-left: 7px;
/* GIS MAPS */
.dj_map {
width: 600px;
height: 400px;
}

View File

@ -0,0 +1,3 @@
<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
<path fill="#2b70bf" d="m555 1335 78-141q-87-63-136-159t-49-203q0-121 61-225-229 117-381 353 167 258 427 375zm389-759q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm363-191q0 7-1 9-105 188-315 566t-316 567l-49 89q-10 16-28 16-12 0-134-70-16-10-16-28 0-12 44-87-143-65-263.5-173T20 1029Q0 998 0 960t20-69q153-235 380-371t496-136q89 0 180 17l54-97q10-16 28-16 5 0 18 6t31 15.5 33 18.5 31.5 18.5T1291 358q16 10 16 27zm37 447q0 139-79 253.5T1056 1250l280-502q8 45 8 84zm448 128q0 35-20 69-39 64-109 145-150 172-347.5 267T896 1536l74-132q212-18 392.5-137T1664 960q-115-179-282-294l63-112q95 64 182.5 153T1772 891q20 34 20 69z"/>
</svg>

After

Width:  |  Height:  |  Size: 784 B

View File

@ -41,6 +41,10 @@
}
SelectBox.redisplay(id);
},
get_hidden_node_count(id) {
const cache = SelectBox.cache[id] || [];
return cache.filter(node => node.displayed === 0).length;
},
delete_from_cache: function(id, value) {
let delete_index = null;
const cache = SelectBox.cache[id];

View File

@ -30,6 +30,9 @@ Requires core.js and SelectBox.js.
// <div class="selector"> or <div class="selector stacked">
const selector_div = quickElement('div', from_box.parentNode);
// Make sure the selector div is at the beginning so that the
// add link would be displayed to the right of the widget.
from_box.parentNode.prepend(selector_div);
selector_div.className = is_stacked ? 'selector stacked' : 'selector';
// <div class="selector-available">
@ -78,7 +81,7 @@ Requires core.js and SelectBox.js.
remove_link.className = 'selector-remove';
// <div class="selector-chosen">
const selector_chosen = quickElement('div', selector_div);
const selector_chosen = quickElement('div', selector_div, '', 'id', field_id + '_selector_chosen');
selector_chosen.className = 'selector-chosen';
const title_chosen = quickElement('h2', selector_chosen, interpolate(gettext('Chosen %s') + ' ', [field_name]));
quickElement(
@ -93,9 +96,30 @@ Requires core.js and SelectBox.js.
[field_name]
)
);
const filter_selected_p = quickElement('p', selector_chosen, '', 'id', field_id + '_filter_selected');
filter_selected_p.className = 'selector-filter';
const search_filter_selected_label = quickElement('label', filter_selected_p, '', 'for', field_id + '_selected_input');
quickElement(
'span', search_filter_selected_label, '',
'class', 'help-tooltip search-label-icon',
'title', interpolate(gettext("Type into this box to filter down the list of selected %s."), [field_name])
);
filter_selected_p.appendChild(document.createTextNode(' '));
const filter_selected_input = quickElement('input', filter_selected_p, '', 'type', 'text', 'placeholder', gettext("Filter"));
filter_selected_input.id = field_id + '_selected_input';
const to_box = quickElement('select', selector_chosen, '', 'id', field_id + '_to', 'multiple', '', 'size', from_box.size, 'name', from_box.name);
to_box.className = 'filtered';
const warning_footer = quickElement('div', selector_chosen, '', 'class', 'list-footer-display');
quickElement('span', warning_footer, '', 'id', field_id + '_list-footer-display-text');
quickElement('span', warning_footer, ' (click to clear)', 'class', 'list-footer-display__clear');
const clear_all = quickElement('a', selector_chosen, gettext('Remove all'), 'title', interpolate(gettext('Click to remove all chosen %s at once.'), [field_name]), 'href', '#', 'id', field_id + '_remove_all_link');
clear_all.className = 'selector-clearall';
@ -106,6 +130,8 @@ Requires core.js and SelectBox.js.
if (elem.classList.contains('active')) {
move_func(from, to);
SelectFilter.refresh_icons(field_id);
SelectFilter.refresh_filtered_selects(field_id);
SelectFilter.refresh_filtered_warning(field_id);
}
e.preventDefault();
};
@ -121,14 +147,29 @@ Requires core.js and SelectBox.js.
clear_all.addEventListener('click', function(e) {
move_selection(e, this, SelectBox.move_all, field_id + '_to', field_id + '_from');
});
warning_footer.addEventListener('click', function(e) {
filter_selected_input.value = '';
SelectBox.filter(field_id + '_to', '');
SelectFilter.refresh_filtered_warning(field_id);
SelectFilter.refresh_icons(field_id);
});
filter_input.addEventListener('keypress', function(e) {
SelectFilter.filter_key_press(e, field_id);
SelectFilter.filter_key_press(e, field_id, '_from', '_to');
});
filter_input.addEventListener('keyup', function(e) {
SelectFilter.filter_key_up(e, field_id);
SelectFilter.filter_key_up(e, field_id, '_from');
});
filter_input.addEventListener('keydown', function(e) {
SelectFilter.filter_key_down(e, field_id);
SelectFilter.filter_key_down(e, field_id, '_from', '_to');
});
filter_selected_input.addEventListener('keypress', function(e) {
SelectFilter.filter_key_press(e, field_id, '_to', '_from');
});
filter_selected_input.addEventListener('keyup', function(e) {
SelectFilter.filter_key_up(e, field_id, '_to', '_selected_input');
});
filter_selected_input.addEventListener('keydown', function(e) {
SelectFilter.filter_key_down(e, field_id, '_to', '_from');
});
selector_div.addEventListener('change', function(e) {
if (e.target.tagName === 'SELECT') {
@ -146,6 +187,7 @@ Requires core.js and SelectBox.js.
}
});
from_box.closest('form').addEventListener('submit', function() {
SelectBox.filter(field_id + '_to', '');
SelectBox.select_all(field_id + '_to');
});
SelectBox.init(field_id + '_from');
@ -163,6 +205,24 @@ Requires core.js and SelectBox.js.
field.required = false;
return any_selected;
},
refresh_filtered_warning: function(field_id) {
const count = SelectBox.get_hidden_node_count(field_id + '_to');
const selector = document.getElementById(field_id + '_selector_chosen');
const warning = document.getElementById(field_id + '_list-footer-display-text');
selector.className = selector.className.replace('selector-chosen--with-filtered', '');
warning.textContent = interpolate(ngettext(
'%s selected option not visible',
'%s selected options not visible',
count
), [count]);
if(count > 0) {
selector.className += ' selector-chosen--with-filtered';
}
},
refresh_filtered_selects: function(field_id) {
SelectBox.filter(field_id + '_from', document.getElementById(field_id + "_input").value);
SelectBox.filter(field_id + '_to', document.getElementById(field_id + "_selected_input").value);
},
refresh_icons: function(field_id) {
const from = document.getElementById(field_id + '_from');
const to = document.getElementById(field_id + '_to');
@ -172,39 +232,47 @@ Requires core.js and SelectBox.js.
// Active if the corresponding box isn't empty
document.getElementById(field_id + '_add_all_link').classList.toggle('active', from.querySelector('option'));
document.getElementById(field_id + '_remove_all_link').classList.toggle('active', to.querySelector('option'));
SelectFilter.refresh_filtered_warning(field_id);
},
filter_key_press: function(event, field_id) {
const from = document.getElementById(field_id + '_from');
filter_key_press: function(event, field_id, source, target) {
const source_box = document.getElementById(field_id + source);
// don't submit form if user pressed Enter
if ((event.which && event.which === 13) || (event.keyCode && event.keyCode === 13)) {
from.selectedIndex = 0;
SelectBox.move(field_id + '_from', field_id + '_to');
from.selectedIndex = 0;
source_box.selectedIndex = 0;
SelectBox.move(field_id + source, field_id + target);
source_box.selectedIndex = 0;
event.preventDefault();
}
},
filter_key_up: function(event, field_id) {
const from = document.getElementById(field_id + '_from');
const temp = from.selectedIndex;
SelectBox.filter(field_id + '_from', document.getElementById(field_id + '_input').value);
from.selectedIndex = temp;
filter_key_up: function(event, field_id, source, filter_input) {
const input = filter_input || '_input';
const source_box = document.getElementById(field_id + source);
const temp = source_box.selectedIndex;
SelectBox.filter(field_id + source, document.getElementById(field_id + input).value);
source_box.selectedIndex = temp;
SelectFilter.refresh_filtered_warning(field_id);
SelectFilter.refresh_icons(field_id);
},
filter_key_down: function(event, field_id) {
const from = document.getElementById(field_id + '_from');
filter_key_down: function(event, field_id, source, target) {
const source_box = document.getElementById(field_id + source);
// right key (39) or left key (37)
const direction = source === '_from' ? 39 : 37;
// right arrow -- move across
if ((event.which && event.which === 39) || (event.keyCode && event.keyCode === 39)) {
const old_index = from.selectedIndex;
SelectBox.move(field_id + '_from', field_id + '_to');
from.selectedIndex = (old_index === from.length) ? from.length - 1 : old_index;
if ((event.which && event.which === direction) || (event.keyCode && event.keyCode === direction)) {
const old_index = source_box.selectedIndex;
SelectBox.move(field_id + source, field_id + target);
SelectFilter.refresh_filtered_selects(field_id);
SelectFilter.refresh_filtered_warning(field_id);
source_box.selectedIndex = (old_index === source_box.length) ? source_box.length - 1 : old_index;
return;
}
// down arrow -- wrap around
if ((event.which && event.which === 40) || (event.keyCode && event.keyCode === 40)) {
from.selectedIndex = (from.length === from.selectedIndex + 1) ? 0 : from.selectedIndex + 1;
source_box.selectedIndex = (source_box.length === source_box.selectedIndex + 1) ? 0 : source_box.selectedIndex + 1;
}
// up arrow -- wrap around
if ((event.which && event.which === 38) || (event.keyCode && event.keyCode === 38)) {
from.selectedIndex = (from.selectedIndex === 0) ? from.length - 1 : from.selectedIndex - 1;
source_box.selectedIndex = (source_box.selectedIndex === 0) ? source_box.length - 1 : source_box.selectedIndex - 1;
}
}
};

View File

@ -179,6 +179,9 @@
}
});
}
// Sync counter when navigating to the page, such as through the back
// button.
window.addEventListener('pageshow', (event) => updateCounter(actionCheckboxes, options));
};
// Call function fn when the DOM is loaded and ready. If it is already

View File

@ -90,10 +90,9 @@
}
message = interpolate(message, [timezoneOffset]);
const warning = document.createElement('span');
warning.className = warningClass;
const warning = document.createElement('div');
warning.classList.add('help', warningClass);
warning.textContent = message;
inp.parentNode.appendChild(document.createElement('br'));
inp.parentNode.appendChild(warning);
},
// Add clock widget to a given field

View File

@ -26,13 +26,11 @@
}
function addPopupIndex(name) {
name = name + "__" + (popupIndex + 1);
return name;
return name + "__" + (popupIndex + 1);
}
function removePopupIndex(name) {
name = name.replace(new RegExp("__" + (popupIndex + 1) + "$"), '');
return name;
return name.replace(new RegExp("__" + (popupIndex + 1) + "$"), '');
}
function showAdminPopup(triggeringLink, name_regexp, add_popup) {
@ -81,9 +79,11 @@
siblings.each(function() {
const elm = $(this);
elm.attr('href', elm.attr('data-href-template').replace('__fk__', value));
elm.removeAttr('aria-disabled');
});
} else {
siblings.removeAttr('href');
siblings.attr('aria-disabled', true);
}
}

View File

@ -36,6 +36,24 @@ depends on core.js for utility functions like removeChildren or quickElement
pgettext('abbrev. month December', 'Dec')
],
daysOfWeek: [
gettext('Sunday'),
gettext('Monday'),
gettext('Tuesday'),
gettext('Wednesday'),
gettext('Thursday'),
gettext('Friday'),
gettext('Saturday')
],
daysOfWeekAbbrev: [
pgettext('abbrev. day Sunday', 'Sun'),
pgettext('abbrev. day Monday', 'Mon'),
pgettext('abbrev. day Tuesday', 'Tue'),
pgettext('abbrev. day Wednesday', 'Wed'),
pgettext('abbrev. day Thursday', 'Thur'),
pgettext('abbrev. day Friday', 'Fri'),
pgettext('abbrev. day Saturday', 'Sat')
],
daysOfWeekInitial: [
pgettext('one letter Sunday', 'S'),
pgettext('one letter Monday', 'M'),
pgettext('one letter Tuesday', 'T'),
@ -98,7 +116,7 @@ depends on core.js for utility functions like removeChildren or quickElement
// Draw days-of-week header
let tableRow = quickElement('tr', tableBody);
for (let i = 0; i < 7; i++) {
quickElement('th', tableRow, CalendarNamespace.daysOfWeek[(i + CalendarNamespace.firstDayOfWeek) % 7]);
quickElement('th', tableRow, CalendarNamespace.daysOfWeekInitial[(i + CalendarNamespace.firstDayOfWeek) % 7]);
}
const startingPos = new Date(year, month - 1, 1 - CalendarNamespace.firstDayOfWeek).getDay();

View File

@ -85,6 +85,18 @@ function findPosY(obj) {
return (this.getSeconds() < 10) ? '0' + this.getSeconds() : this.getSeconds();
};
Date.prototype.getAbbrevDayName = function() {
return typeof window.CalendarNamespace === "undefined"
? '0' + this.getDay()
: window.CalendarNamespace.daysOfWeekAbbrev[this.getDay()];
};
Date.prototype.getFullDayName = function() {
return typeof window.CalendarNamespace === "undefined"
? '0' + this.getDay()
: window.CalendarNamespace.daysOfWeek[this.getDay()];
};
Date.prototype.getAbbrevMonthName = function() {
return typeof window.CalendarNamespace === "undefined"
? this.getTwoDigitMonth()
@ -99,6 +111,8 @@ function findPosY(obj) {
Date.prototype.strftime = function(format) {
const fields = {
a: this.getAbbrevDayName(),
A: this.getFullDayName(),
b: this.getAbbrevMonthName(),
B: this.getFullMonthName(),
c: this.toString(),
@ -119,11 +133,11 @@ function findPosY(obj) {
let result = '', i = 0;
while (i < format.length) {
if (format.charAt(i) === '%') {
result = result + fields[format.charAt(i + 1)];
result += fields[format.charAt(i + 1)];
++i;
}
else {
result = result + format.charAt(i);
result += format.charAt(i);
}
++i;
}

View File

@ -11,7 +11,7 @@
}
Object.entries(filters).forEach(([key, value]) => {
const detailElement = document.querySelector(`[data-filter-title='${key}']`);
const detailElement = document.querySelector(`[data-filter-title='${CSS.escape(key)}']`);
// Check if the filter is present, it could be from other view.
if (detailElement) {

View File

@ -2,47 +2,24 @@
{
const toggleNavSidebar = document.getElementById('toggle-nav-sidebar');
if (toggleNavSidebar !== null) {
const navLinks = document.querySelectorAll('#nav-sidebar a');
function disableNavLinkTabbing() {
for (const navLink of navLinks) {
navLink.tabIndex = -1;
}
}
function enableNavLinkTabbing() {
for (const navLink of navLinks) {
navLink.tabIndex = 0;
}
}
function disableNavFilterTabbing() {
document.getElementById('nav-filter').tabIndex = -1;
}
function enableNavFilterTabbing() {
document.getElementById('nav-filter').tabIndex = 0;
}
const navSidebar = document.getElementById('nav-sidebar');
const main = document.getElementById('main');
let navSidebarIsOpen = localStorage.getItem('django.admin.navSidebarIsOpen');
if (navSidebarIsOpen === null) {
navSidebarIsOpen = 'true';
}
if (navSidebarIsOpen === 'false') {
disableNavLinkTabbing();
disableNavFilterTabbing();
}
main.classList.toggle('shifted', navSidebarIsOpen === 'true');
navSidebar.setAttribute('aria-expanded', navSidebarIsOpen);
toggleNavSidebar.addEventListener('click', function() {
if (navSidebarIsOpen === 'true') {
navSidebarIsOpen = 'false';
disableNavLinkTabbing();
disableNavFilterTabbing();
} else {
navSidebarIsOpen = 'true';
enableNavLinkTabbing();
enableNavFilterTabbing();
}
localStorage.setItem('django.admin.navSidebarIsOpen', navSidebarIsOpen);
main.classList.toggle('shifted');
navSidebar.setAttribute('aria-expanded', navSidebarIsOpen);
});
}

View File

@ -0,0 +1,56 @@
'use strict';
{
window.addEventListener('load', function(e) {
function setTheme(mode) {
if (mode !== "light" && mode !== "dark" && mode !== "auto") {
console.error(`Got invalid theme mode: ${mode}. Resetting to auto.`);
mode = "auto";
}
document.documentElement.dataset.theme = mode;
localStorage.setItem("theme", mode);
}
function cycleTheme() {
const currentTheme = localStorage.getItem("theme") || "auto";
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
if (prefersDark) {
// Auto (dark) -> Light -> Dark
if (currentTheme === "auto") {
setTheme("light");
} else if (currentTheme === "light") {
setTheme("dark");
} else {
setTheme("auto");
}
} else {
// Auto (light) -> Dark -> Light
if (currentTheme === "auto") {
setTheme("dark");
} else if (currentTheme === "dark") {
setTheme("light");
} else {
setTheme("auto");
}
}
}
function initTheme() {
// set theme defined in localStorage if there is one, or fallback to auto mode
const currentTheme = localStorage.getItem("theme");
currentTheme ? setTheme(currentTheme) : setTheme("auto");
}
function setupTheme() {
// Attach event handlers for toggling themes
const buttons = document.getElementsByClassName("theme-toggle");
Array.from(buttons).forEach((btn) => {
btn.addEventListener("click", cycleTheme);
});
initTheme();
}
setupTheme();
});
}

View File

@ -163,8 +163,7 @@
s = s.replace(/^\s+|\s+$/g, ''); // trim leading/trailing spaces
s = s.replace(/[-\s]+/g, '-'); // convert spaces to hyphens
s = s.substring(0, num_chars); // trim to first num_chars chars
s = s.replace(/-+$/g, ''); // trim any trailing hyphens
return s;
return s.replace(/-+$/g, ''); // trim any trailing hyphens
}
window.URLify = URLify;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,6 @@
The MIT License
Copyright (c) 2007-2017 Steven Levithan <http://xregexp.com/>
Copyright (c) 2007-present Steven Levithan <http://xregexp.com/>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1295,38 +1295,31 @@ select {
margin: 1rem;
}
.m-0 {
margin: 0px;
}
.mx-auto {
margin-left: auto;
margin-right: auto;
}
.my-0 {
margin-top: 0px;
margin-bottom: 0px;
}
.my-2 {
margin-top: 0.5rem;
margin-bottom: 0.5rem;
}
.my-5 {
margin-top: 1.25rem;
margin-bottom: 1.25rem;
.my-0 {
margin-top: 0px;
margin-bottom: 0px;
}
.my-3 {
margin-top: 0.75rem;
margin-bottom: 0.75rem;
.mb-4 {
margin-bottom: 1rem;
}
.my-6 {
margin-top: 1.5rem;
margin-bottom: 1.5rem;
.mt-2 {
margin-top: 0.5rem;
}
.mt-8 {
margin-top: 2rem;
}
.mb-2 {
@ -1341,18 +1334,6 @@ select {
margin-top: 1.5rem;
}
.mb-4 {
margin-bottom: 1rem;
}
.mt-2 {
margin-top: 0.5rem;
}
.ml-2 {
margin-left: 0.5rem;
}
.block {
display: block;
}
@ -1377,8 +1358,8 @@ select {
display: none;
}
.h-auto {
height: auto;
.h-full {
height: 100%;
}
.h-screen {
@ -1405,18 +1386,26 @@ select {
width: 9rem;
}
.max-w-screen-lg {
max-width: 1024px;
}
.max-w-full {
max-width: 100%;
}
.max-w-sm {
max-width: 24rem;
}
.max-w-screen-lg {
max-width: 1024px;
}
.max-w-screen-md {
max-width: 768px;
}
.basis-1\/3 {
flex-basis: 33.333333%;
}
.basis-1\/2 {
flex-basis: 50%;
}
@ -1445,6 +1434,10 @@ select {
place-items: center;
}
.content-start {
align-content: flex-start;
}
.items-center {
align-items: center;
}
@ -1461,22 +1454,22 @@ select {
justify-content: space-around;
}
.gap-6 {
gap: 1.5rem;
.gap-4 {
gap: 1rem;
}
.gap-3 {
gap: 0.75rem;
}
.gap-4 {
gap: 1rem;
}
.gap-8 {
gap: 2rem;
}
.gap-6 {
gap: 1.5rem;
}
.self-center {
align-self: center;
}
@ -1493,35 +1486,44 @@ select {
border-bottom-width: 1px;
}
.border-t {
border-top-width: 1px;
}
.border-dashed {
border-style: dashed;
}
.border-blue-100 {
--tw-border-opacity: 1;
border-color: rgb(219 234 254 / var(--tw-border-opacity));
}
.border-stone-200 {
--tw-border-opacity: 1;
border-color: rgb(231 229 228 / var(--tw-border-opacity));
}
.border-slate-400 {
--tw-border-opacity: 1;
border-color: rgb(148 163 184 / var(--tw-border-opacity));
}
.border-stone-200 {
--tw-border-opacity: 1;
border-color: rgb(231 229 228 / var(--tw-border-opacity));
}
.border-stone-300 {
--tw-border-opacity: 1;
border-color: rgb(214 211 209 / var(--tw-border-opacity));
}
.border-blue-100 {
--tw-border-opacity: 1;
border-color: rgb(219 234 254 / var(--tw-border-opacity));
}
.bg-white {
--tw-bg-opacity: 1;
background-color: rgb(255 255 255 / var(--tw-bg-opacity));
}
.bg-green-100 {
--tw-bg-opacity: 1;
background-color: rgb(220 252 231 / var(--tw-bg-opacity));
}
.bg-blue-50 {
--tw-bg-opacity: 1;
background-color: rgb(239 246 255 / var(--tw-bg-opacity));
@ -1532,48 +1534,43 @@ select {
background-color: rgb(250 250 249 / var(--tw-bg-opacity));
}
.bg-green-100 {
--tw-bg-opacity: 1;
background-color: rgb(220 252 231 / var(--tw-bg-opacity));
}
.bg-gray-50 {
--tw-bg-opacity: 1;
background-color: rgb(249 250 251 / var(--tw-bg-opacity));
}
.p-4 {
padding: 1rem;
}
.p-2 {
padding: 0.5rem;
}
.p-4 {
padding: 1rem;
}
.p-8 {
padding: 2rem;
}
.px-4 {
padding-left: 1rem;
padding-right: 1rem;
}
.py-3 {
padding-top: 0.75rem;
padding-bottom: 0.75rem;
}
.py-4 {
padding-top: 1rem;
padding-bottom: 1rem;
}
.px-4 {
padding-left: 1rem;
padding-right: 1rem;
}
.py-2 {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
}
.py-3 {
padding-top: 0.75rem;
padding-bottom: 0.75rem;
}
.pb-1 {
padding-bottom: 0.25rem;
}
@ -1594,6 +1591,19 @@ select {
font-family: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;
}
.text-\[15px\] {
font-size: 15px;
}
.text-\[2\.25rem\] {
font-size: 2.25rem;
}
.text-xl {
font-size: 1.25rem;
line-height: 1.75rem;
}
.text-2xl {
font-size: 1.5rem;
line-height: 2rem;
@ -1609,24 +1619,15 @@ select {
line-height: 1rem;
}
.text-xl {
font-size: 1.25rem;
line-height: 1.75rem;
}
.text-\[15px\] {
font-size: 15px;
}
.text-\[2\.25rem\] {
font-size: 2.25rem;
}
.text-5xl {
font-size: 3rem;
line-height: 1;
}
.font-medium {
font-weight: 500;
}
.font-light {
font-weight: 300;
}
@ -1635,10 +1636,6 @@ select {
font-weight: 400;
}
.font-medium {
font-weight: 500;
}
.font-semibold {
font-weight: 600;
}
@ -1663,11 +1660,22 @@ select {
letter-spacing: 0em;
}
.text-white {
--tw-text-opacity: 1;
color: rgb(255 255 255 / var(--tw-text-opacity));
}
.antialiased {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.shadow-lg {
--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.shadow-md {
--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);
@ -1872,14 +1880,14 @@ h4 {
margin: 0px;
}
.lg\:w-screen {
width: 100vw;
}
.lg\:w-40 {
width: 10rem;
}
.lg\:w-screen {
width: 100vw;
}
.lg\:flex-row {
flex-direction: row;
}

View File

@ -1295,38 +1295,31 @@ select {
margin: 1rem;
}
.m-0 {
margin: 0px;
}
.mx-auto {
margin-left: auto;
margin-right: auto;
}
.my-0 {
margin-top: 0px;
margin-bottom: 0px;
}
.my-2 {
margin-top: 0.5rem;
margin-bottom: 0.5rem;
}
.my-5 {
margin-top: 1.25rem;
margin-bottom: 1.25rem;
.my-0 {
margin-top: 0px;
margin-bottom: 0px;
}
.my-3 {
margin-top: 0.75rem;
margin-bottom: 0.75rem;
.mb-4 {
margin-bottom: 1rem;
}
.my-6 {
margin-top: 1.5rem;
margin-bottom: 1.5rem;
.mt-2 {
margin-top: 0.5rem;
}
.mt-8 {
margin-top: 2rem;
}
.mb-2 {
@ -1341,18 +1334,6 @@ select {
margin-top: 1.5rem;
}
.mb-4 {
margin-bottom: 1rem;
}
.mt-2 {
margin-top: 0.5rem;
}
.ml-2 {
margin-left: 0.5rem;
}
.block {
display: block;
}
@ -1377,8 +1358,8 @@ select {
display: none;
}
.h-auto {
height: auto;
.h-full {
height: 100%;
}
.h-screen {
@ -1405,18 +1386,26 @@ select {
width: 9rem;
}
.max-w-screen-lg {
max-width: 1024px;
}
.max-w-full {
max-width: 100%;
}
.max-w-sm {
max-width: 24rem;
}
.max-w-screen-lg {
max-width: 1024px;
}
.max-w-screen-md {
max-width: 768px;
}
.basis-1\/3 {
flex-basis: 33.333333%;
}
.basis-1\/2 {
flex-basis: 50%;
}
@ -1445,6 +1434,10 @@ select {
place-items: center;
}
.content-start {
align-content: flex-start;
}
.items-center {
align-items: center;
}
@ -1461,22 +1454,22 @@ select {
justify-content: space-around;
}
.gap-6 {
gap: 1.5rem;
.gap-4 {
gap: 1rem;
}
.gap-3 {
gap: 0.75rem;
}
.gap-4 {
gap: 1rem;
}
.gap-8 {
gap: 2rem;
}
.gap-6 {
gap: 1.5rem;
}
.self-center {
align-self: center;
}
@ -1493,35 +1486,44 @@ select {
border-bottom-width: 1px;
}
.border-t {
border-top-width: 1px;
}
.border-dashed {
border-style: dashed;
}
.border-blue-100 {
--tw-border-opacity: 1;
border-color: rgb(219 234 254 / var(--tw-border-opacity));
}
.border-stone-200 {
--tw-border-opacity: 1;
border-color: rgb(231 229 228 / var(--tw-border-opacity));
}
.border-slate-400 {
--tw-border-opacity: 1;
border-color: rgb(148 163 184 / var(--tw-border-opacity));
}
.border-stone-200 {
--tw-border-opacity: 1;
border-color: rgb(231 229 228 / var(--tw-border-opacity));
}
.border-stone-300 {
--tw-border-opacity: 1;
border-color: rgb(214 211 209 / var(--tw-border-opacity));
}
.border-blue-100 {
--tw-border-opacity: 1;
border-color: rgb(219 234 254 / var(--tw-border-opacity));
}
.bg-white {
--tw-bg-opacity: 1;
background-color: rgb(255 255 255 / var(--tw-bg-opacity));
}
.bg-green-100 {
--tw-bg-opacity: 1;
background-color: rgb(220 252 231 / var(--tw-bg-opacity));
}
.bg-blue-50 {
--tw-bg-opacity: 1;
background-color: rgb(239 246 255 / var(--tw-bg-opacity));
@ -1532,48 +1534,43 @@ select {
background-color: rgb(250 250 249 / var(--tw-bg-opacity));
}
.bg-green-100 {
--tw-bg-opacity: 1;
background-color: rgb(220 252 231 / var(--tw-bg-opacity));
}
.bg-gray-50 {
--tw-bg-opacity: 1;
background-color: rgb(249 250 251 / var(--tw-bg-opacity));
}
.p-4 {
padding: 1rem;
}
.p-2 {
padding: 0.5rem;
}
.p-4 {
padding: 1rem;
}
.p-8 {
padding: 2rem;
}
.px-4 {
padding-left: 1rem;
padding-right: 1rem;
}
.py-3 {
padding-top: 0.75rem;
padding-bottom: 0.75rem;
}
.py-4 {
padding-top: 1rem;
padding-bottom: 1rem;
}
.px-4 {
padding-left: 1rem;
padding-right: 1rem;
}
.py-2 {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
}
.py-3 {
padding-top: 0.75rem;
padding-bottom: 0.75rem;
}
.pb-1 {
padding-bottom: 0.25rem;
}
@ -1594,6 +1591,19 @@ select {
font-family: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;
}
.text-\[15px\] {
font-size: 15px;
}
.text-\[2\.25rem\] {
font-size: 2.25rem;
}
.text-xl {
font-size: 1.25rem;
line-height: 1.75rem;
}
.text-2xl {
font-size: 1.5rem;
line-height: 2rem;
@ -1609,24 +1619,15 @@ select {
line-height: 1rem;
}
.text-xl {
font-size: 1.25rem;
line-height: 1.75rem;
}
.text-\[15px\] {
font-size: 15px;
}
.text-\[2\.25rem\] {
font-size: 2.25rem;
}
.text-5xl {
font-size: 3rem;
line-height: 1;
}
.font-medium {
font-weight: 500;
}
.font-light {
font-weight: 300;
}
@ -1635,10 +1636,6 @@ select {
font-weight: 400;
}
.font-medium {
font-weight: 500;
}
.font-semibold {
font-weight: 600;
}
@ -1663,11 +1660,22 @@ select {
letter-spacing: 0em;
}
.text-white {
--tw-text-opacity: 1;
color: rgb(255 255 255 / var(--tw-text-opacity));
}
.antialiased {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.shadow-lg {
--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.shadow-md {
--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);
@ -1872,14 +1880,14 @@ h4 {
margin: 0px;
}
.lg\:w-screen {
width: 100vw;
}
.lg\:w-40 {
width: 10rem;
}
.lg\:w-screen {
width: 100vw;
}
.lg\:flex-row {
flex-direction: row;
}