@ -0,0 +1,275 @@ |
|||||||
|
select.admin-autocomplete { |
||||||
|
width: 20em; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete.select2-container { |
||||||
|
min-height: 30px; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-selection--single, |
||||||
|
.select2-container--admin-autocomplete .select2-selection--multiple { |
||||||
|
min-height: 30px; |
||||||
|
padding: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete.select2-container--focus .select2-selection, |
||||||
|
.select2-container--admin-autocomplete.select2-container--open .select2-selection { |
||||||
|
border-color: var(--body-quiet-color); |
||||||
|
min-height: 30px; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete.select2-container--focus .select2-selection.select2-selection--single, |
||||||
|
.select2-container--admin-autocomplete.select2-container--open .select2-selection.select2-selection--single { |
||||||
|
padding: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete.select2-container--focus .select2-selection.select2-selection--multiple, |
||||||
|
.select2-container--admin-autocomplete.select2-container--open .select2-selection.select2-selection--multiple { |
||||||
|
padding: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-selection--single { |
||||||
|
background-color: var(--body-bg); |
||||||
|
border: 1px solid var(--border-color); |
||||||
|
border-radius: 4px; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-selection--single .select2-selection__rendered { |
||||||
|
color: var(--body-fg); |
||||||
|
line-height: 30px; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-selection--single .select2-selection__clear { |
||||||
|
cursor: pointer; |
||||||
|
float: right; |
||||||
|
font-weight: bold; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-selection--single .select2-selection__placeholder { |
||||||
|
color: var(--body-quiet-color); |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow { |
||||||
|
height: 26px; |
||||||
|
position: absolute; |
||||||
|
top: 1px; |
||||||
|
right: 1px; |
||||||
|
width: 20px; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow b { |
||||||
|
border-color: #888 transparent transparent transparent; |
||||||
|
border-style: solid; |
||||||
|
border-width: 5px 4px 0 4px; |
||||||
|
height: 0; |
||||||
|
left: 50%; |
||||||
|
margin-left: -4px; |
||||||
|
margin-top: -2px; |
||||||
|
position: absolute; |
||||||
|
top: 50%; |
||||||
|
width: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--single .select2-selection__clear { |
||||||
|
float: left; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--single .select2-selection__arrow { |
||||||
|
left: 1px; |
||||||
|
right: auto; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single { |
||||||
|
background-color: var(--darkened-bg); |
||||||
|
cursor: default; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single .select2-selection__clear { |
||||||
|
display: none; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete.select2-container--open .select2-selection--single .select2-selection__arrow b { |
||||||
|
border-color: transparent transparent #888 transparent; |
||||||
|
border-width: 0 4px 5px 4px; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-selection--multiple { |
||||||
|
background-color: var(--body-bg); |
||||||
|
border: 1px solid var(--border-color); |
||||||
|
border-radius: 4px; |
||||||
|
cursor: text; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered { |
||||||
|
box-sizing: border-box; |
||||||
|
list-style: none; |
||||||
|
margin: 0; |
||||||
|
padding: 0 10px 5px 5px; |
||||||
|
width: 100%; |
||||||
|
display: flex; |
||||||
|
flex-wrap: wrap; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered li { |
||||||
|
list-style: none; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__placeholder { |
||||||
|
color: var(--body-quiet-color); |
||||||
|
margin-top: 5px; |
||||||
|
float: left; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__clear { |
||||||
|
cursor: pointer; |
||||||
|
float: right; |
||||||
|
font-weight: bold; |
||||||
|
margin: 5px; |
||||||
|
position: absolute; |
||||||
|
right: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice { |
||||||
|
background-color: var(--darkened-bg); |
||||||
|
border: 1px solid var(--border-color); |
||||||
|
border-radius: 4px; |
||||||
|
cursor: default; |
||||||
|
float: left; |
||||||
|
margin-right: 5px; |
||||||
|
margin-top: 5px; |
||||||
|
padding: 0 5px; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove { |
||||||
|
color: var(--body-quiet-color); |
||||||
|
cursor: pointer; |
||||||
|
display: inline-block; |
||||||
|
font-weight: bold; |
||||||
|
margin-right: 2px; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove:hover { |
||||||
|
color: var(--body-fg); |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-search--inline { |
||||||
|
float: right; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice { |
||||||
|
margin-left: 5px; |
||||||
|
margin-right: auto; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { |
||||||
|
margin-left: 2px; |
||||||
|
margin-right: auto; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete.select2-container--focus .select2-selection--multiple { |
||||||
|
border: solid var(--body-quiet-color) 1px; |
||||||
|
outline: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--multiple { |
||||||
|
background-color: var(--darkened-bg); |
||||||
|
cursor: default; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete.select2-container--disabled .select2-selection__choice__remove { |
||||||
|
display: none; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete.select2-container--open.select2-container--above .select2-selection--single, .select2-container--admin-autocomplete.select2-container--open.select2-container--above .select2-selection--multiple { |
||||||
|
border-top-left-radius: 0; |
||||||
|
border-top-right-radius: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete.select2-container--open.select2-container--below .select2-selection--single, .select2-container--admin-autocomplete.select2-container--open.select2-container--below .select2-selection--multiple { |
||||||
|
border-bottom-left-radius: 0; |
||||||
|
border-bottom-right-radius: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-search--dropdown { |
||||||
|
background: var(--darkened-bg); |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-search--dropdown .select2-search__field { |
||||||
|
background: var(--body-bg); |
||||||
|
color: var(--body-fg); |
||||||
|
border: 1px solid var(--border-color); |
||||||
|
border-radius: 4px; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-search--inline .select2-search__field { |
||||||
|
background: transparent; |
||||||
|
color: var(--body-fg); |
||||||
|
border: none; |
||||||
|
outline: 0; |
||||||
|
box-shadow: none; |
||||||
|
-webkit-appearance: textfield; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-results > .select2-results__options { |
||||||
|
max-height: 200px; |
||||||
|
overflow-y: auto; |
||||||
|
color: var(--body-fg); |
||||||
|
background: var(--body-bg); |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-results__option[role=group] { |
||||||
|
padding: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-results__option[aria-disabled=true] { |
||||||
|
color: var(--body-quiet-color); |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-results__option[aria-selected=true] { |
||||||
|
background-color: var(--selected-bg); |
||||||
|
color: var(--body-fg); |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-results__option .select2-results__option { |
||||||
|
padding-left: 1em; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__group { |
||||||
|
padding-left: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option { |
||||||
|
margin-left: -1em; |
||||||
|
padding-left: 2em; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option { |
||||||
|
margin-left: -2em; |
||||||
|
padding-left: 3em; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { |
||||||
|
margin-left: -3em; |
||||||
|
padding-left: 4em; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { |
||||||
|
margin-left: -4em; |
||||||
|
padding-left: 5em; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { |
||||||
|
margin-left: -5em; |
||||||
|
padding-left: 6em; |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-results__option--highlighted[aria-selected] { |
||||||
|
background-color: var(--primary); |
||||||
|
color: var(--primary-fg); |
||||||
|
} |
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-results__group { |
||||||
|
cursor: default; |
||||||
|
display: block; |
||||||
|
padding: 6px; |
||||||
|
} |
@ -0,0 +1,328 @@ |
|||||||
|
/* CHANGELISTS */ |
||||||
|
|
||||||
|
#changelist { |
||||||
|
display: flex; |
||||||
|
align-items: flex-start; |
||||||
|
justify-content: space-between; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist .changelist-form-container { |
||||||
|
flex: 1 1 auto; |
||||||
|
min-width: 0; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist table { |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
.change-list .hiddenfields { display:none; } |
||||||
|
|
||||||
|
.change-list .filtered table { |
||||||
|
border-right: none; |
||||||
|
} |
||||||
|
|
||||||
|
.change-list .filtered { |
||||||
|
min-height: 400px; |
||||||
|
} |
||||||
|
|
||||||
|
.change-list .filtered .results, .change-list .filtered .paginator, |
||||||
|
.filtered #toolbar, .filtered div.xfull { |
||||||
|
width: auto; |
||||||
|
} |
||||||
|
|
||||||
|
.change-list .filtered table tbody th { |
||||||
|
padding-right: 1em; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist-form .results { |
||||||
|
overflow-x: auto; |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist .toplinks { |
||||||
|
border-bottom: 1px solid var(--hairline-color); |
||||||
|
} |
||||||
|
|
||||||
|
#changelist .paginator { |
||||||
|
color: var(--body-quiet-color); |
||||||
|
border-bottom: 1px solid var(--hairline-color); |
||||||
|
background: var(--body-bg); |
||||||
|
overflow: hidden; |
||||||
|
} |
||||||
|
|
||||||
|
/* CHANGELIST TABLES */ |
||||||
|
|
||||||
|
#changelist table thead th { |
||||||
|
padding: 0; |
||||||
|
white-space: nowrap; |
||||||
|
vertical-align: middle; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist table thead th.action-checkbox-column { |
||||||
|
width: 1.5em; |
||||||
|
text-align: center; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist table tbody td.action-checkbox { |
||||||
|
text-align: center; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist table tfoot { |
||||||
|
color: var(--body-quiet-color); |
||||||
|
} |
||||||
|
|
||||||
|
/* TOOLBAR */ |
||||||
|
|
||||||
|
#toolbar { |
||||||
|
padding: 8px 10px; |
||||||
|
margin-bottom: 15px; |
||||||
|
border-top: 1px solid var(--hairline-color); |
||||||
|
border-bottom: 1px solid var(--hairline-color); |
||||||
|
background: var(--darkened-bg); |
||||||
|
color: var(--body-quiet-color); |
||||||
|
} |
||||||
|
|
||||||
|
#toolbar form input { |
||||||
|
border-radius: 4px; |
||||||
|
font-size: 0.875rem; |
||||||
|
padding: 5px; |
||||||
|
color: var(--body-fg); |
||||||
|
} |
||||||
|
|
||||||
|
#toolbar #searchbar { |
||||||
|
height: 1.1875rem; |
||||||
|
border: 1px solid var(--border-color); |
||||||
|
padding: 2px 5px; |
||||||
|
margin: 0; |
||||||
|
vertical-align: top; |
||||||
|
font-size: 0.8125rem; |
||||||
|
max-width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
#toolbar #searchbar:focus { |
||||||
|
border-color: var(--body-quiet-color); |
||||||
|
} |
||||||
|
|
||||||
|
#toolbar form input[type="submit"] { |
||||||
|
border: 1px solid var(--border-color); |
||||||
|
font-size: 0.8125rem; |
||||||
|
padding: 4px 8px; |
||||||
|
margin: 0; |
||||||
|
vertical-align: middle; |
||||||
|
background: var(--body-bg); |
||||||
|
box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset; |
||||||
|
cursor: pointer; |
||||||
|
color: var(--body-fg); |
||||||
|
} |
||||||
|
|
||||||
|
#toolbar form input[type="submit"]:focus, |
||||||
|
#toolbar form input[type="submit"]:hover { |
||||||
|
border-color: var(--body-quiet-color); |
||||||
|
} |
||||||
|
|
||||||
|
#changelist-search img { |
||||||
|
vertical-align: middle; |
||||||
|
margin-right: 4px; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist-search .help { |
||||||
|
word-break: break-word; |
||||||
|
} |
||||||
|
|
||||||
|
/* FILTER COLUMN */ |
||||||
|
|
||||||
|
#changelist-filter { |
||||||
|
flex: 0 0 240px; |
||||||
|
order: 1; |
||||||
|
background: var(--darkened-bg); |
||||||
|
border-left: none; |
||||||
|
margin: 0 0 0 30px; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist-filter h2 { |
||||||
|
font-size: 0.875rem; |
||||||
|
text-transform: uppercase; |
||||||
|
letter-spacing: 0.5px; |
||||||
|
padding: 5px 15px; |
||||||
|
margin-bottom: 12px; |
||||||
|
border-bottom: none; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist-filter h3, |
||||||
|
#changelist-filter details summary { |
||||||
|
font-weight: 400; |
||||||
|
padding: 0 15px; |
||||||
|
margin-bottom: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist-filter details summary > * { |
||||||
|
display: inline; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist-filter details > summary { |
||||||
|
list-style-type: none; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist-filter details > summary::-webkit-details-marker { |
||||||
|
display: none; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist-filter details > summary::before { |
||||||
|
content: '→'; |
||||||
|
font-weight: bold; |
||||||
|
color: var(--link-hover-color); |
||||||
|
} |
||||||
|
|
||||||
|
#changelist-filter details[open] > summary::before { |
||||||
|
content: '↓'; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist-filter ul { |
||||||
|
margin: 5px 0; |
||||||
|
padding: 0 15px 15px; |
||||||
|
border-bottom: 1px solid var(--hairline-color); |
||||||
|
} |
||||||
|
|
||||||
|
#changelist-filter ul:last-child { |
||||||
|
border-bottom: none; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist-filter li { |
||||||
|
list-style-type: none; |
||||||
|
margin-left: 0; |
||||||
|
padding-left: 0; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist-filter a { |
||||||
|
display: block; |
||||||
|
color: var(--body-quiet-color); |
||||||
|
word-break: break-word; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist-filter li.selected { |
||||||
|
border-left: 5px solid var(--hairline-color); |
||||||
|
padding-left: 10px; |
||||||
|
margin-left: -15px; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist-filter li.selected a { |
||||||
|
color: var(--link-selected-fg); |
||||||
|
} |
||||||
|
|
||||||
|
#changelist-filter a:focus, #changelist-filter a:hover, |
||||||
|
#changelist-filter li.selected a:focus, |
||||||
|
#changelist-filter li.selected a:hover { |
||||||
|
color: var(--link-hover-color); |
||||||
|
} |
||||||
|
|
||||||
|
#changelist-filter #changelist-filter-clear a { |
||||||
|
font-size: 0.8125rem; |
||||||
|
padding-bottom: 10px; |
||||||
|
border-bottom: 1px solid var(--hairline-color); |
||||||
|
} |
||||||
|
|
||||||
|
/* DATE DRILLDOWN */ |
||||||
|
|
||||||
|
.change-list .toplinks { |
||||||
|
display: flex; |
||||||
|
padding-bottom: 5px; |
||||||
|
flex-wrap: wrap; |
||||||
|
gap: 3px 17px; |
||||||
|
font-weight: bold; |
||||||
|
} |
||||||
|
|
||||||
|
.change-list .toplinks a { |
||||||
|
font-size: 0.8125rem; |
||||||
|
} |
||||||
|
|
||||||
|
.change-list .toplinks .date-back { |
||||||
|
color: var(--body-quiet-color); |
||||||
|
} |
||||||
|
|
||||||
|
.change-list .toplinks .date-back:focus, |
||||||
|
.change-list .toplinks .date-back:hover { |
||||||
|
color: var(--link-hover-color); |
||||||
|
} |
||||||
|
|
||||||
|
/* ACTIONS */ |
||||||
|
|
||||||
|
.filtered .actions { |
||||||
|
border-right: none; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist table input { |
||||||
|
margin: 0; |
||||||
|
vertical-align: baseline; |
||||||
|
} |
||||||
|
|
||||||
|
/* 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); |
||||||
|
} |
||||||
|
|
||||||
|
#changelist .actions { |
||||||
|
padding: 10px; |
||||||
|
background: var(--body-bg); |
||||||
|
border-top: none; |
||||||
|
border-bottom: none; |
||||||
|
line-height: 1.5rem; |
||||||
|
color: var(--body-quiet-color); |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist .actions span.all, |
||||||
|
#changelist .actions span.action-counter, |
||||||
|
#changelist .actions span.clear, |
||||||
|
#changelist .actions span.question { |
||||||
|
font-size: 0.8125rem; |
||||||
|
margin: 0 0.5em; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist .actions:last-child { |
||||||
|
border-bottom: none; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist .actions select { |
||||||
|
vertical-align: top; |
||||||
|
height: 1.5rem; |
||||||
|
color: var(--body-fg); |
||||||
|
border: 1px solid var(--border-color); |
||||||
|
border-radius: 4px; |
||||||
|
font-size: 0.875rem; |
||||||
|
padding: 0 0 0 4px; |
||||||
|
margin: 0; |
||||||
|
margin-left: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist .actions select:focus { |
||||||
|
border-color: var(--body-quiet-color); |
||||||
|
} |
||||||
|
|
||||||
|
#changelist .actions label { |
||||||
|
display: inline-block; |
||||||
|
vertical-align: middle; |
||||||
|
font-size: 0.8125rem; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist .actions .button { |
||||||
|
font-size: 0.8125rem; |
||||||
|
border: 1px solid var(--border-color); |
||||||
|
border-radius: 4px; |
||||||
|
background: var(--body-bg); |
||||||
|
box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset; |
||||||
|
cursor: pointer; |
||||||
|
height: 1.5rem; |
||||||
|
line-height: 1; |
||||||
|
padding: 4px 8px; |
||||||
|
margin: 0; |
||||||
|
color: var(--body-fg); |
||||||
|
} |
||||||
|
|
||||||
|
#changelist .actions .button:focus, #changelist .actions .button:hover { |
||||||
|
border-color: var(--body-quiet-color); |
||||||
|
} |
@ -0,0 +1,137 @@ |
|||||||
|
@media (prefers-color-scheme: dark) { |
||||||
|
:root { |
||||||
|
--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; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
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; |
||||||
|
} |
||||||
|
|
||||||
|
.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); |
||||||
|
} |
@ -0,0 +1,29 @@ |
|||||||
|
/* DASHBOARD */ |
||||||
|
.dashboard td, .dashboard th { |
||||||
|
word-break: break-word; |
||||||
|
} |
||||||
|
|
||||||
|
.dashboard .module table th { |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
.dashboard .module table td { |
||||||
|
white-space: nowrap; |
||||||
|
} |
||||||
|
|
||||||
|
.dashboard .module table td a { |
||||||
|
display: block; |
||||||
|
padding-right: .6em; |
||||||
|
} |
||||||
|
|
||||||
|
/* RECENT ACTIONS MODULE */ |
||||||
|
|
||||||
|
.module ul.actionlist { |
||||||
|
margin-left: 0; |
||||||
|
} |
||||||
|
|
||||||
|
ul.actionlist li { |
||||||
|
list-style-type: none; |
||||||
|
overflow: hidden; |
||||||
|
text-overflow: ellipsis; |
||||||
|
} |
@ -0,0 +1,530 @@ |
|||||||
|
@import url('widgets.css'); |
||||||
|
|
||||||
|
/* FORM ROWS */ |
||||||
|
|
||||||
|
.form-row { |
||||||
|
overflow: hidden; |
||||||
|
padding: 10px; |
||||||
|
font-size: 0.8125rem; |
||||||
|
border-bottom: 1px solid var(--hairline-color); |
||||||
|
} |
||||||
|
|
||||||
|
.form-row img, .form-row input { |
||||||
|
vertical-align: middle; |
||||||
|
} |
||||||
|
|
||||||
|
.form-row label input[type="checkbox"] { |
||||||
|
margin-top: 0; |
||||||
|
vertical-align: 0; |
||||||
|
} |
||||||
|
|
||||||
|
form .form-row p { |
||||||
|
padding-left: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.flex-container { |
||||||
|
display: flex; |
||||||
|
flex-wrap: wrap; |
||||||
|
} |
||||||
|
|
||||||
|
.form-multiline > div { |
||||||
|
padding-bottom: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
/* FORM LABELS */ |
||||||
|
|
||||||
|
label { |
||||||
|
font-weight: normal; |
||||||
|
color: var(--body-quiet-color); |
||||||
|
font-size: 0.8125rem; |
||||||
|
} |
||||||
|
|
||||||
|
.required label, label.required { |
||||||
|
font-weight: bold; |
||||||
|
color: var(--body-fg); |
||||||
|
} |
||||||
|
|
||||||
|
/* RADIO BUTTONS */ |
||||||
|
|
||||||
|
form div.radiolist div { |
||||||
|
padding-right: 7px; |
||||||
|
} |
||||||
|
|
||||||
|
form div.radiolist.inline div { |
||||||
|
display: inline-block; |
||||||
|
} |
||||||
|
|
||||||
|
form div.radiolist label { |
||||||
|
width: auto; |
||||||
|
} |
||||||
|
|
||||||
|
form div.radiolist input[type="radio"] { |
||||||
|
margin: -2px 4px 0 0; |
||||||
|
padding: 0; |
||||||
|
} |
||||||
|
|
||||||
|
form ul.inline { |
||||||
|
margin-left: 0; |
||||||
|
padding: 0; |
||||||
|
} |
||||||
|
|
||||||
|
form ul.inline li { |
||||||
|
float: left; |
||||||
|
padding-right: 7px; |
||||||
|
} |
||||||
|
|
||||||
|
/* ALIGNED FIELDSETS */ |
||||||
|
|
||||||
|
.aligned label { |
||||||
|
display: block; |
||||||
|
padding: 4px 10px 0 0; |
||||||
|
width: 160px; |
||||||
|
word-wrap: break-word; |
||||||
|
line-height: 1; |
||||||
|
} |
||||||
|
|
||||||
|
.aligned label:not(.vCheckboxLabel):after { |
||||||
|
content: ''; |
||||||
|
display: inline-block; |
||||||
|
vertical-align: middle; |
||||||
|
height: 1.625rem; |
||||||
|
} |
||||||
|
|
||||||
|
.aligned label + p, .aligned .checkbox-row + div.help, .aligned label + div.readonly { |
||||||
|
padding: 6px 0; |
||||||
|
margin-top: 0; |
||||||
|
margin-bottom: 0; |
||||||
|
margin-left: 0; |
||||||
|
overflow-wrap: break-word; |
||||||
|
} |
||||||
|
|
||||||
|
.aligned ul label { |
||||||
|
display: inline; |
||||||
|
float: none; |
||||||
|
width: auto; |
||||||
|
} |
||||||
|
|
||||||
|
.aligned .form-row input { |
||||||
|
margin-bottom: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.colMS .aligned .vLargeTextField, .colMS .aligned .vXMLLargeTextField { |
||||||
|
width: 350px; |
||||||
|
} |
||||||
|
|
||||||
|
form .aligned ul { |
||||||
|
margin-left: 160px; |
||||||
|
padding-left: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
form .aligned div.radiolist { |
||||||
|
display: inline-block; |
||||||
|
margin: 0; |
||||||
|
padding: 0; |
||||||
|
} |
||||||
|
|
||||||
|
form .aligned p.help, |
||||||
|
form .aligned div.help { |
||||||
|
margin-top: 0; |
||||||
|
margin-left: 160px; |
||||||
|
padding-left: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
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, |
||||||
|
form .aligned div.help:last-child { |
||||||
|
margin-bottom: 0; |
||||||
|
padding-bottom: 0; |
||||||
|
} |
||||||
|
|
||||||
|
form .aligned input + p.help, |
||||||
|
form .aligned textarea + p.help, |
||||||
|
form .aligned select + p.help, |
||||||
|
form .aligned input + div.help, |
||||||
|
form .aligned textarea + div.help, |
||||||
|
form .aligned select + div.help { |
||||||
|
margin-left: 160px; |
||||||
|
padding-left: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
form .aligned ul li { |
||||||
|
list-style: none; |
||||||
|
} |
||||||
|
|
||||||
|
form .aligned table p { |
||||||
|
margin-left: 0; |
||||||
|
padding-left: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.aligned .vCheckboxLabel { |
||||||
|
float: none; |
||||||
|
width: auto; |
||||||
|
display: inline-block; |
||||||
|
vertical-align: -3px; |
||||||
|
padding: 0 0 5px 5px; |
||||||
|
} |
||||||
|
|
||||||
|
.aligned .vCheckboxLabel + p.help, |
||||||
|
.aligned .vCheckboxLabel + div.help { |
||||||
|
margin-top: -4px; |
||||||
|
} |
||||||
|
|
||||||
|
.colM .aligned .vLargeTextField, .colM .aligned .vXMLLargeTextField { |
||||||
|
width: 610px; |
||||||
|
} |
||||||
|
|
||||||
|
fieldset .fieldBox { |
||||||
|
margin-right: 20px; |
||||||
|
} |
||||||
|
|
||||||
|
/* WIDE FIELDSETS */ |
||||||
|
|
||||||
|
.wide label { |
||||||
|
width: 200px; |
||||||
|
} |
||||||
|
|
||||||
|
form .wide p, |
||||||
|
form .wide ul.errorlist, |
||||||
|
form .wide input + p.help, |
||||||
|
form .wide input + div.help { |
||||||
|
margin-left: 200px; |
||||||
|
} |
||||||
|
|
||||||
|
form .wide p.help, |
||||||
|
form .wide div.help { |
||||||
|
padding-left: 50px; |
||||||
|
} |
||||||
|
|
||||||
|
form div.help ul { |
||||||
|
padding-left: 0; |
||||||
|
margin-left: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.colM fieldset.wide .vLargeTextField, .colM fieldset.wide .vXMLLargeTextField { |
||||||
|
width: 450px; |
||||||
|
} |
||||||
|
|
||||||
|
/* COLLAPSED FIELDSETS */ |
||||||
|
|
||||||
|
fieldset.collapsed * { |
||||||
|
display: none; |
||||||
|
} |
||||||
|
|
||||||
|
fieldset.collapsed h2, fieldset.collapsed { |
||||||
|
display: block; |
||||||
|
} |
||||||
|
|
||||||
|
fieldset.collapsed { |
||||||
|
border: 1px solid var(--hairline-color); |
||||||
|
border-radius: 4px; |
||||||
|
overflow: hidden; |
||||||
|
} |
||||||
|
|
||||||
|
fieldset.collapsed h2 { |
||||||
|
background: var(--darkened-bg); |
||||||
|
color: var(--body-quiet-color); |
||||||
|
} |
||||||
|
|
||||||
|
fieldset .collapse-toggle { |
||||||
|
color: var(--header-link-color); |
||||||
|
} |
||||||
|
|
||||||
|
fieldset.collapsed .collapse-toggle { |
||||||
|
background: transparent; |
||||||
|
display: inline; |
||||||
|
color: var(--link-fg); |
||||||
|
} |
||||||
|
|
||||||
|
/* MONOSPACE TEXTAREAS */ |
||||||
|
|
||||||
|
fieldset.monospace textarea { |
||||||
|
font-family: var(--font-family-monospace); |
||||||
|
} |
||||||
|
|
||||||
|
/* SUBMIT ROW */ |
||||||
|
|
||||||
|
.submit-row { |
||||||
|
padding: 12px 14px 12px; |
||||||
|
margin: 0 0 20px; |
||||||
|
background: var(--darkened-bg); |
||||||
|
border: 1px solid var(--hairline-color); |
||||||
|
border-radius: 4px; |
||||||
|
overflow: hidden; |
||||||
|
display: flex; |
||||||
|
gap: 10px; |
||||||
|
flex-wrap: wrap; |
||||||
|
} |
||||||
|
|
||||||
|
body.popup .submit-row { |
||||||
|
overflow: auto; |
||||||
|
} |
||||||
|
|
||||||
|
.submit-row input { |
||||||
|
height: 2.1875rem; |
||||||
|
line-height: 0.9375rem; |
||||||
|
} |
||||||
|
|
||||||
|
.submit-row input, .submit-row a { |
||||||
|
margin: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.submit-row input.default { |
||||||
|
text-transform: uppercase; |
||||||
|
} |
||||||
|
|
||||||
|
.submit-row a.deletelink { |
||||||
|
margin-left: auto; |
||||||
|
} |
||||||
|
|
||||||
|
.submit-row a.deletelink { |
||||||
|
display: block; |
||||||
|
background: var(--delete-button-bg); |
||||||
|
border-radius: 4px; |
||||||
|
padding: 0.625rem 0.9375rem; |
||||||
|
height: 0.9375rem; |
||||||
|
line-height: 0.9375rem; |
||||||
|
color: var(--button-fg); |
||||||
|
} |
||||||
|
|
||||||
|
.submit-row a.closelink { |
||||||
|
display: inline-block; |
||||||
|
background: var(--close-button-bg); |
||||||
|
border-radius: 4px; |
||||||
|
padding: 10px 15px; |
||||||
|
height: 0.9375rem; |
||||||
|
line-height: 0.9375rem; |
||||||
|
color: var(--button-fg); |
||||||
|
} |
||||||
|
|
||||||
|
.submit-row a.deletelink:focus, |
||||||
|
.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 */ |
||||||
|
|
||||||
|
.vSelectMultipleField { |
||||||
|
vertical-align: top; |
||||||
|
} |
||||||
|
|
||||||
|
.vCheckboxField { |
||||||
|
border: none; |
||||||
|
} |
||||||
|
|
||||||
|
.vDateField, .vTimeField { |
||||||
|
margin-right: 2px; |
||||||
|
margin-bottom: 4px; |
||||||
|
} |
||||||
|
|
||||||
|
.vDateField { |
||||||
|
min-width: 6.85em; |
||||||
|
} |
||||||
|
|
||||||
|
.vTimeField { |
||||||
|
min-width: 4.7em; |
||||||
|
} |
||||||
|
|
||||||
|
.vURLField { |
||||||
|
width: 30em; |
||||||
|
} |
||||||
|
|
||||||
|
.vLargeTextField, .vXMLLargeTextField { |
||||||
|
width: 48em; |
||||||
|
} |
||||||
|
|
||||||
|
.flatpages-flatpage #id_content { |
||||||
|
height: 40.2em; |
||||||
|
} |
||||||
|
|
||||||
|
.module table .vPositiveSmallIntegerField { |
||||||
|
width: 2.2em; |
||||||
|
} |
||||||
|
|
||||||
|
.vIntegerField { |
||||||
|
width: 5em; |
||||||
|
} |
||||||
|
|
||||||
|
.vBigIntegerField { |
||||||
|
width: 10em; |
||||||
|
} |
||||||
|
|
||||||
|
.vForeignKeyRawIdAdminField { |
||||||
|
width: 5em; |
||||||
|
} |
||||||
|
|
||||||
|
.vTextField, .vUUIDField { |
||||||
|
width: 20em; |
||||||
|
} |
||||||
|
|
||||||
|
/* INLINES */ |
||||||
|
|
||||||
|
.inline-group { |
||||||
|
padding: 0; |
||||||
|
margin: 0 0 30px; |
||||||
|
} |
||||||
|
|
||||||
|
.inline-group thead th { |
||||||
|
padding: 8px 10px; |
||||||
|
} |
||||||
|
|
||||||
|
.inline-group .aligned label { |
||||||
|
width: 160px; |
||||||
|
} |
||||||
|
|
||||||
|
.inline-related { |
||||||
|
position: relative; |
||||||
|
} |
||||||
|
|
||||||
|
.inline-related h3 { |
||||||
|
margin: 0; |
||||||
|
color: var(--body-quiet-color); |
||||||
|
padding: 5px; |
||||||
|
font-size: 0.8125rem; |
||||||
|
background: var(--darkened-bg); |
||||||
|
border-top: 1px solid var(--hairline-color); |
||||||
|
border-bottom: 1px solid var(--hairline-color); |
||||||
|
} |
||||||
|
|
||||||
|
.inline-related h3 span.delete { |
||||||
|
float: right; |
||||||
|
} |
||||||
|
|
||||||
|
.inline-related h3 span.delete label { |
||||||
|
margin-left: 2px; |
||||||
|
font-size: 0.6875rem; |
||||||
|
} |
||||||
|
|
||||||
|
.inline-related fieldset { |
||||||
|
margin: 0; |
||||||
|
background: var(--body-bg); |
||||||
|
border: none; |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
.inline-related fieldset.module h3 { |
||||||
|
margin: 0; |
||||||
|
padding: 2px 5px 3px 5px; |
||||||
|
font-size: 0.6875rem; |
||||||
|
text-align: left; |
||||||
|
font-weight: bold; |
||||||
|
background: #bcd; |
||||||
|
color: var(--body-bg); |
||||||
|
} |
||||||
|
|
||||||
|
.inline-group .tabular fieldset.module { |
||||||
|
border: none; |
||||||
|
} |
||||||
|
|
||||||
|
.inline-related.tabular fieldset.module table { |
||||||
|
width: 100%; |
||||||
|
overflow-x: scroll; |
||||||
|
} |
||||||
|
|
||||||
|
.last-related fieldset { |
||||||
|
border: none; |
||||||
|
} |
||||||
|
|
||||||
|
.inline-group .tabular tr.has_original td { |
||||||
|
padding-top: 2em; |
||||||
|
} |
||||||
|
|
||||||
|
.inline-group .tabular tr td.original { |
||||||
|
padding: 2px 0 0 0; |
||||||
|
width: 0; |
||||||
|
_position: relative; |
||||||
|
} |
||||||
|
|
||||||
|
.inline-group .tabular th.original { |
||||||
|
width: 0px; |
||||||
|
padding: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.inline-group .tabular td.original p { |
||||||
|
position: absolute; |
||||||
|
left: 0; |
||||||
|
height: 1.1em; |
||||||
|
padding: 2px 9px; |
||||||
|
overflow: hidden; |
||||||
|
font-size: 0.5625rem; |
||||||
|
font-weight: bold; |
||||||
|
color: var(--body-quiet-color); |
||||||
|
_width: 700px; |
||||||
|
} |
||||||
|
|
||||||
|
.inline-group ul.tools { |
||||||
|
padding: 0; |
||||||
|
margin: 0; |
||||||
|
list-style: none; |
||||||
|
} |
||||||
|
|
||||||
|
.inline-group ul.tools li { |
||||||
|
display: inline; |
||||||
|
padding: 0 5px; |
||||||
|
} |
||||||
|
|
||||||
|
.inline-group div.add-row, |
||||||
|
.inline-group .tabular tr.add-row td { |
||||||
|
color: var(--body-quiet-color); |
||||||
|
background: var(--darkened-bg); |
||||||
|
padding: 8px 10px; |
||||||
|
border-bottom: 1px solid var(--hairline-color); |
||||||
|
} |
||||||
|
|
||||||
|
.inline-group .tabular tr.add-row td { |
||||||
|
padding: 8px 10px; |
||||||
|
border-bottom: 1px solid var(--hairline-color); |
||||||
|
} |
||||||
|
|
||||||
|
.inline-group ul.tools a.add, |
||||||
|
.inline-group div.add-row a, |
||||||
|
.inline-group .tabular tr.add-row td a { |
||||||
|
background: url(../img/icon-addlink.svg) 0 1px no-repeat; |
||||||
|
padding-left: 16px; |
||||||
|
font-size: 0.75rem; |
||||||
|
} |
||||||
|
|
||||||
|
.empty-form { |
||||||
|
display: none; |
||||||
|
} |
||||||
|
|
||||||
|
/* RELATED FIELD ADD ONE / LOOKUP */ |
||||||
|
|
||||||
|
.related-lookup { |
||||||
|
margin-left: 5px; |
||||||
|
display: inline-block; |
||||||
|
vertical-align: middle; |
||||||
|
background-repeat: no-repeat; |
||||||
|
background-size: 14px; |
||||||
|
} |
||||||
|
|
||||||
|
.related-lookup { |
||||||
|
width: 1rem; |
||||||
|
height: 1rem; |
||||||
|
background-image: url(../img/search.svg); |
||||||
|
} |
||||||
|
|
||||||
|
form .related-widget-wrapper ul { |
||||||
|
display: inline-block; |
||||||
|
margin-left: 0; |
||||||
|
padding-left: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.clearable-file-input input { |
||||||
|
margin-top: 0; |
||||||
|
} |
@ -0,0 +1,61 @@ |
|||||||
|
/* LOGIN FORM */ |
||||||
|
|
||||||
|
.login { |
||||||
|
background: var(--darkened-bg); |
||||||
|
height: auto; |
||||||
|
} |
||||||
|
|
||||||
|
.login #header { |
||||||
|
height: auto; |
||||||
|
padding: 15px 16px; |
||||||
|
justify-content: center; |
||||||
|
} |
||||||
|
|
||||||
|
.login #header h1 { |
||||||
|
font-size: 1.125rem; |
||||||
|
margin: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.login #header h1 a { |
||||||
|
color: var(--header-link-color); |
||||||
|
} |
||||||
|
|
||||||
|
.login #content { |
||||||
|
padding: 20px 20px 0; |
||||||
|
} |
||||||
|
|
||||||
|
.login #container { |
||||||
|
background: var(--body-bg); |
||||||
|
border: 1px solid var(--hairline-color); |
||||||
|
border-radius: 4px; |
||||||
|
overflow: hidden; |
||||||
|
width: 28em; |
||||||
|
min-width: 300px; |
||||||
|
margin: 100px auto; |
||||||
|
height: auto; |
||||||
|
} |
||||||
|
|
||||||
|
.login .form-row { |
||||||
|
padding: 4px 0; |
||||||
|
} |
||||||
|
|
||||||
|
.login .form-row label { |
||||||
|
display: block; |
||||||
|
line-height: 2em; |
||||||
|
} |
||||||
|
|
||||||
|
.login .form-row #id_username, .login .form-row #id_password { |
||||||
|
padding: 8px; |
||||||
|
width: 100%; |
||||||
|
box-sizing: border-box; |
||||||
|
} |
||||||
|
|
||||||
|
.login .submit-row { |
||||||
|
padding: 1em 0 0 0; |
||||||
|
margin: 0; |
||||||
|
text-align: center; |
||||||
|
} |
||||||
|
|
||||||
|
.login .password-reset-link { |
||||||
|
text-align: center; |
||||||
|
} |
@ -0,0 +1,144 @@ |
|||||||
|
.sticky { |
||||||
|
position: sticky; |
||||||
|
top: 0; |
||||||
|
max-height: 100vh; |
||||||
|
} |
||||||
|
|
||||||
|
.toggle-nav-sidebar { |
||||||
|
z-index: 20; |
||||||
|
left: 0; |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
justify-content: center; |
||||||
|
flex: 0 0 23px; |
||||||
|
width: 23px; |
||||||
|
border: 0; |
||||||
|
border-right: 1px solid var(--hairline-color); |
||||||
|
background-color: var(--body-bg); |
||||||
|
cursor: pointer; |
||||||
|
font-size: 1.25rem; |
||||||
|
color: var(--link-fg); |
||||||
|
padding: 0; |
||||||
|
} |
||||||
|
|
||||||
|
[dir="rtl"] .toggle-nav-sidebar { |
||||||
|
border-left: 1px solid var(--hairline-color); |
||||||
|
border-right: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.toggle-nav-sidebar:hover, |
||||||
|
.toggle-nav-sidebar:focus { |
||||||
|
background-color: var(--darkened-bg); |
||||||
|
} |
||||||
|
|
||||||
|
#nav-sidebar { |
||||||
|
z-index: 15; |
||||||
|
flex: 0 0 275px; |
||||||
|
left: -276px; |
||||||
|
margin-left: -276px; |
||||||
|
border-top: 1px solid transparent; |
||||||
|
border-right: 1px solid var(--hairline-color); |
||||||
|
background-color: var(--body-bg); |
||||||
|
overflow: auto; |
||||||
|
} |
||||||
|
|
||||||
|
[dir="rtl"] #nav-sidebar { |
||||||
|
border-left: 1px solid var(--hairline-color); |
||||||
|
border-right: 0; |
||||||
|
left: 0; |
||||||
|
margin-left: 0; |
||||||
|
right: -276px; |
||||||
|
margin-right: -276px; |
||||||
|
} |
||||||
|
|
||||||
|
.toggle-nav-sidebar::before { |
||||||
|
content: '\00BB'; |
||||||
|
} |
||||||
|
|
||||||
|
.main.shifted .toggle-nav-sidebar::before { |
||||||
|
content: '\00AB'; |
||||||
|
} |
||||||
|
|
||||||
|
.main > #nav-sidebar { |
||||||
|
visibility: hidden; |
||||||
|
} |
||||||
|
|
||||||
|
.main.shifted > #nav-sidebar { |
||||||
|
margin-left: 0; |
||||||
|
visibility: visible; |
||||||
|
} |
||||||
|
|
||||||
|
[dir="rtl"] .main.shifted > #nav-sidebar { |
||||||
|
margin-right: 0; |
||||||
|
} |
||||||
|
|
||||||
|
#nav-sidebar .module th { |
||||||
|
width: 100%; |
||||||
|
overflow-wrap: anywhere; |
||||||
|
} |
||||||
|
|
||||||
|
#nav-sidebar .module th, |
||||||
|
#nav-sidebar .module caption { |
||||||
|
padding-left: 16px; |
||||||
|
} |
||||||
|
|
||||||
|
#nav-sidebar .module td { |
||||||
|
white-space: nowrap; |
||||||
|
} |
||||||
|
|
||||||
|
[dir="rtl"] #nav-sidebar .module th, |
||||||
|
[dir="rtl"] #nav-sidebar .module caption { |
||||||
|
padding-left: 8px; |
||||||
|
padding-right: 16px; |
||||||
|
} |
||||||
|
|
||||||
|
#nav-sidebar .current-app .section:link, |
||||||
|
#nav-sidebar .current-app .section:visited { |
||||||
|
color: var(--header-color); |
||||||
|
font-weight: bold; |
||||||
|
} |
||||||
|
|
||||||
|
#nav-sidebar .current-model { |
||||||
|
background: var(--selected-row); |
||||||
|
} |
||||||
|
|
||||||
|
.main > #nav-sidebar + .content { |
||||||
|
max-width: calc(100% - 23px); |
||||||
|
} |
||||||
|
|
||||||
|
.main.shifted > #nav-sidebar + .content { |
||||||
|
max-width: calc(100% - 299px); |
||||||
|
} |
||||||
|
|
||||||
|
@media (max-width: 767px) { |
||||||
|
#nav-sidebar, #toggle-nav-sidebar { |
||||||
|
display: none; |
||||||
|
} |
||||||
|
|
||||||
|
.main > #nav-sidebar + .content, |
||||||
|
.main.shifted > #nav-sidebar + .content { |
||||||
|
max-width: 100%; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#nav-filter { |
||||||
|
width: 100%; |
||||||
|
box-sizing: border-box; |
||||||
|
padding: 2px 5px; |
||||||
|
margin: 5px 0; |
||||||
|
border: 1px solid var(--border-color); |
||||||
|
background-color: var(--darkened-bg); |
||||||
|
color: var(--body-fg); |
||||||
|
} |
||||||
|
|
||||||
|
#nav-filter:focus { |
||||||
|
border-color: var(--body-quiet-color); |
||||||
|
} |
||||||
|
|
||||||
|
#nav-filter.no-results { |
||||||
|
background: var(--message-error-bg); |
||||||
|
} |
||||||
|
|
||||||
|
#nav-sidebar table { |
||||||
|
width: 100%; |
||||||
|
} |
@ -0,0 +1,998 @@ |
|||||||
|
/* Tablets */ |
||||||
|
|
||||||
|
input[type="submit"], button { |
||||||
|
-webkit-appearance: none; |
||||||
|
appearance: none; |
||||||
|
} |
||||||
|
|
||||||
|
@media (max-width: 1024px) { |
||||||
|
/* Basic */ |
||||||
|
|
||||||
|
html { |
||||||
|
-webkit-text-size-adjust: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
td, th { |
||||||
|
padding: 10px; |
||||||
|
font-size: 0.875rem; |
||||||
|
} |
||||||
|
|
||||||
|
.small { |
||||||
|
font-size: 0.75rem; |
||||||
|
} |
||||||
|
|
||||||
|
/* Layout */ |
||||||
|
|
||||||
|
#container { |
||||||
|
min-width: 0; |
||||||
|
} |
||||||
|
|
||||||
|
#content { |
||||||
|
padding: 15px 20px 20px; |
||||||
|
} |
||||||
|
|
||||||
|
div.breadcrumbs { |
||||||
|
padding: 10px 30px; |
||||||
|
} |
||||||
|
|
||||||
|
/* Header */ |
||||||
|
|
||||||
|
#header { |
||||||
|
flex-direction: column; |
||||||
|
padding: 15px 30px; |
||||||
|
justify-content: flex-start; |
||||||
|
} |
||||||
|
|
||||||
|
#branding h1 { |
||||||
|
margin: 0 0 8px; |
||||||
|
line-height: 1.2; |
||||||
|
} |
||||||
|
|
||||||
|
#user-tools { |
||||||
|
margin: 0; |
||||||
|
font-weight: 400; |
||||||
|
line-height: 1.85; |
||||||
|
text-align: left; |
||||||
|
} |
||||||
|
|
||||||
|
#user-tools a { |
||||||
|
display: inline-block; |
||||||
|
line-height: 1.4; |
||||||
|
} |
||||||
|
|
||||||
|
/* Dashboard */ |
||||||
|
|
||||||
|
.dashboard #content { |
||||||
|
width: auto; |
||||||
|
} |
||||||
|
|
||||||
|
#content-related { |
||||||
|
margin-right: -290px; |
||||||
|
} |
||||||
|
|
||||||
|
.colSM #content-related { |
||||||
|
margin-left: -290px; |
||||||
|
} |
||||||
|
|
||||||
|
.colMS { |
||||||
|
margin-right: 290px; |
||||||
|
} |
||||||
|
|
||||||
|
.colSM { |
||||||
|
margin-left: 290px; |
||||||
|
} |
||||||
|
|
||||||
|
.dashboard .module table td a { |
||||||
|
padding-right: 0; |
||||||
|
} |
||||||
|
|
||||||
|
td .changelink, td .addlink { |
||||||
|
font-size: 0.8125rem; |
||||||
|
} |
||||||
|
|
||||||
|
/* Changelist */ |
||||||
|
|
||||||
|
#toolbar { |
||||||
|
border: none; |
||||||
|
padding: 15px; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist-search > div { |
||||||
|
display: flex; |
||||||
|
flex-wrap: nowrap; |
||||||
|
max-width: 480px; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist-search label { |
||||||
|
line-height: 1.375rem; |
||||||
|
} |
||||||
|
|
||||||
|
#toolbar form #searchbar { |
||||||
|
flex: 1 0 auto; |
||||||
|
width: 0; |
||||||
|
height: 1.375rem; |
||||||
|
margin: 0 10px 0 6px; |
||||||
|
} |
||||||
|
|
||||||
|
#toolbar form input[type=submit] { |
||||||
|
flex: 0 1 auto; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist-search .quiet { |
||||||
|
width: 0; |
||||||
|
flex: 1 0 auto; |
||||||
|
margin: 5px 0 0 25px; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist .actions { |
||||||
|
display: flex; |
||||||
|
flex-wrap: wrap; |
||||||
|
padding: 15px 0; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist .actions label { |
||||||
|
display: flex; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist .actions select { |
||||||
|
background: var(--body-bg); |
||||||
|
} |
||||||
|
|
||||||
|
#changelist .actions .button { |
||||||
|
min-width: 48px; |
||||||
|
margin: 0 10px; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist .actions span.all, |
||||||
|
#changelist .actions span.clear, |
||||||
|
#changelist .actions span.question, |
||||||
|
#changelist .actions span.action-counter { |
||||||
|
font-size: 0.6875rem; |
||||||
|
margin: 0 10px 0 0; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist-filter { |
||||||
|
flex-basis: 200px; |
||||||
|
} |
||||||
|
|
||||||
|
.change-list .filtered .results, |
||||||
|
.change-list .filtered .paginator, |
||||||
|
.filtered #toolbar, |
||||||
|
.filtered .actions, |
||||||
|
|
||||||
|
#changelist .paginator { |
||||||
|
border-top-color: var(--hairline-color); /* XXX Is this used at all? */ |
||||||
|
} |
||||||
|
|
||||||
|
#changelist .results + .paginator { |
||||||
|
border-top: none; |
||||||
|
} |
||||||
|
|
||||||
|
/* Forms */ |
||||||
|
|
||||||
|
label { |
||||||
|
font-size: 0.875rem; |
||||||
|
} |
||||||
|
|
||||||
|
.form-row input[type=text], |
||||||
|
.form-row input[type=password], |
||||||
|
.form-row input[type=email], |
||||||
|
.form-row input[type=url], |
||||||
|
.form-row input[type=tel], |
||||||
|
.form-row input[type=number], |
||||||
|
.form-row textarea, |
||||||
|
.form-row select, |
||||||
|
.form-row .vTextField { |
||||||
|
box-sizing: border-box; |
||||||
|
margin: 0; |
||||||
|
padding: 6px 8px; |
||||||
|
min-height: 2.25rem; |
||||||
|
font-size: 0.875rem; |
||||||
|
} |
||||||
|
|
||||||
|
.form-row select { |
||||||
|
height: 2.25rem; |
||||||
|
} |
||||||
|
|
||||||
|
.form-row select[multiple] { |
||||||
|
height: auto; |
||||||
|
min-height: 0; |
||||||
|
} |
||||||
|
|
||||||
|
fieldset .fieldBox + .fieldBox { |
||||||
|
margin-top: 10px; |
||||||
|
padding-top: 10px; |
||||||
|
border-top: 1px solid var(--hairline-color); |
||||||
|
} |
||||||
|
|
||||||
|
textarea { |
||||||
|
max-width: 100%; |
||||||
|
max-height: 120px; |
||||||
|
} |
||||||
|
|
||||||
|
.aligned label { |
||||||
|
padding-top: 6px; |
||||||
|
} |
||||||
|
|
||||||
|
.aligned .related-lookup, |
||||||
|
.aligned .datetimeshortcuts, |
||||||
|
.aligned .related-lookup + strong { |
||||||
|
align-self: center; |
||||||
|
margin-left: 15px; |
||||||
|
} |
||||||
|
|
||||||
|
form .aligned div.radiolist { |
||||||
|
margin-left: 2px; |
||||||
|
} |
||||||
|
|
||||||
|
.submit-row { |
||||||
|
padding: 8px; |
||||||
|
} |
||||||
|
|
||||||
|
.submit-row a.deletelink { |
||||||
|
padding: 10px 7px; |
||||||
|
} |
||||||
|
|
||||||
|
.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 { |
||||||
|
display: flex; |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
.selector .selector-filter { |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
} |
||||||
|
|
||||||
|
.selector .selector-filter label { |
||||||
|
margin: 0 8px 0 0; |
||||||
|
} |
||||||
|
|
||||||
|
.selector .selector-filter input { |
||||||
|
width: auto; |
||||||
|
min-height: 0; |
||||||
|
flex: 1 1; |
||||||
|
} |
||||||
|
|
||||||
|
.selector-available, .selector-chosen { |
||||||
|
width: auto; |
||||||
|
flex: 1 1; |
||||||
|
display: flex; |
||||||
|
flex-direction: column; |
||||||
|
} |
||||||
|
|
||||||
|
.selector select { |
||||||
|
width: 100%; |
||||||
|
flex: 1 0 auto; |
||||||
|
margin-bottom: 5px; |
||||||
|
} |
||||||
|
|
||||||
|
.selector ul.selector-chooser { |
||||||
|
width: 26px; |
||||||
|
height: 52px; |
||||||
|
padding: 2px 0; |
||||||
|
margin: auto 15px; |
||||||
|
border-radius: 20px; |
||||||
|
transform: translateY(-10px); |
||||||
|
} |
||||||
|
|
||||||
|
.selector-add, .selector-remove { |
||||||
|
width: 20px; |
||||||
|
height: 20px; |
||||||
|
background-size: 20px auto; |
||||||
|
} |
||||||
|
|
||||||
|
.selector-add { |
||||||
|
background-position: 0 -120px; |
||||||
|
} |
||||||
|
|
||||||
|
.selector-remove { |
||||||
|
background-position: 0 -80px; |
||||||
|
} |
||||||
|
|
||||||
|
a.selector-chooseall, a.selector-clearall { |
||||||
|
align-self: center; |
||||||
|
} |
||||||
|
|
||||||
|
.stacked { |
||||||
|
flex-direction: column; |
||||||
|
max-width: 480px; |
||||||
|
} |
||||||
|
|
||||||
|
.stacked > * { |
||||||
|
flex: 0 1 auto; |
||||||
|
} |
||||||
|
|
||||||
|
.stacked select { |
||||||
|
margin-bottom: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.stacked .selector-available, .stacked .selector-chosen { |
||||||
|
width: auto; |
||||||
|
} |
||||||
|
|
||||||
|
.stacked ul.selector-chooser { |
||||||
|
width: 52px; |
||||||
|
height: 26px; |
||||||
|
padding: 0 2px; |
||||||
|
margin: 15px auto; |
||||||
|
transform: none; |
||||||
|
} |
||||||
|
|
||||||
|
.stacked .selector-chooser li { |
||||||
|
padding: 3px; |
||||||
|
} |
||||||
|
|
||||||
|
.stacked .selector-add, .stacked .selector-remove { |
||||||
|
background-size: 20px auto; |
||||||
|
} |
||||||
|
|
||||||
|
.stacked .selector-add { |
||||||
|
background-position: 0 -40px; |
||||||
|
} |
||||||
|
|
||||||
|
.stacked .active.selector-add { |
||||||
|
background-position: 0 -40px; |
||||||
|
} |
||||||
|
|
||||||
|
.active.selector-add:focus, .active.selector-add:hover { |
||||||
|
background-position: 0 -140px; |
||||||
|
} |
||||||
|
|
||||||
|
.stacked .active.selector-add:focus, .stacked .active.selector-add:hover { |
||||||
|
background-position: 0 -60px; |
||||||
|
} |
||||||
|
|
||||||
|
.stacked .selector-remove { |
||||||
|
background-position: 0 0; |
||||||
|
} |
||||||
|
|
||||||
|
.stacked .active.selector-remove { |
||||||
|
background-position: 0 0; |
||||||
|
} |
||||||
|
|
||||||
|
.active.selector-remove:focus, .active.selector-remove:hover { |
||||||
|
background-position: 0 -100px; |
||||||
|
} |
||||||
|
|
||||||
|
.stacked .active.selector-remove:focus, .stacked .active.selector-remove:hover { |
||||||
|
background-position: 0 -20px; |
||||||
|
} |
||||||
|
|
||||||
|
.help-tooltip, .selector .help-icon { |
||||||
|
display: none; |
||||||
|
} |
||||||
|
|
||||||
|
.datetime input { |
||||||
|
width: 50%; |
||||||
|
max-width: 120px; |
||||||
|
} |
||||||
|
|
||||||
|
.datetime span { |
||||||
|
font-size: 0.8125rem; |
||||||
|
} |
||||||
|
|
||||||
|
.datetime .timezonewarning { |
||||||
|
display: block; |
||||||
|
font-size: 0.6875rem; |
||||||
|
color: var(--body-quiet-color); |
||||||
|
} |
||||||
|
|
||||||
|
.datetimeshortcuts { |
||||||
|
color: var(--border-color); /* XXX Redundant, .datetime span also sets #ccc */ |
||||||
|
} |
||||||
|
|
||||||
|
.form-row .datetime input.vDateField, .form-row .datetime input.vTimeField { |
||||||
|
width: 75%; |
||||||
|
} |
||||||
|
|
||||||
|
.inline-group { |
||||||
|
overflow: auto; |
||||||
|
} |
||||||
|
|
||||||
|
/* Messages */ |
||||||
|
|
||||||
|
ul.messagelist li { |
||||||
|
padding-left: 55px; |
||||||
|
background-position: 30px 12px; |
||||||
|
} |
||||||
|
|
||||||
|
ul.messagelist li.error { |
||||||
|
background-position: 30px 12px; |
||||||
|
} |
||||||
|
|
||||||
|
ul.messagelist li.warning { |
||||||
|
background-position: 30px 14px; |
||||||
|
} |
||||||
|
|
||||||
|
/* Login */ |
||||||
|
|
||||||
|
.login #header { |
||||||
|
padding: 15px 20px; |
||||||
|
} |
||||||
|
|
||||||
|
.login #branding h1 { |
||||||
|
margin: 0; |
||||||
|
} |
||||||
|
|
||||||
|
/* GIS */ |
||||||
|
|
||||||
|
div.olMap { |
||||||
|
max-width: calc(100vw - 30px); |
||||||
|
max-height: 300px; |
||||||
|
} |
||||||
|
|
||||||
|
.olMap + .clear_features { |
||||||
|
display: block; |
||||||
|
margin-top: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
/* Docs */ |
||||||
|
|
||||||
|
.module table.xfull { |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
pre.literal-block { |
||||||
|
overflow: auto; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/* Mobile */ |
||||||
|
|
||||||
|
@media (max-width: 767px) { |
||||||
|
/* Layout */ |
||||||
|
|
||||||
|
#header, #content, #footer { |
||||||
|
padding: 15px; |
||||||
|
} |
||||||
|
|
||||||
|
#footer:empty { |
||||||
|
padding: 0; |
||||||
|
} |
||||||
|
|
||||||
|
div.breadcrumbs { |
||||||
|
padding: 10px 15px; |
||||||
|
} |
||||||
|
|
||||||
|
/* Dashboard */ |
||||||
|
|
||||||
|
.colMS, .colSM { |
||||||
|
margin: 0; |
||||||
|
} |
||||||
|
|
||||||
|
#content-related, .colSM #content-related { |
||||||
|
width: 100%; |
||||||
|
margin: 0; |
||||||
|
} |
||||||
|
|
||||||
|
#content-related .module { |
||||||
|
margin-bottom: 0; |
||||||
|
} |
||||||
|
|
||||||
|
#content-related .module h2 { |
||||||
|
padding: 10px 15px; |
||||||
|
font-size: 1rem; |
||||||
|
} |
||||||
|
|
||||||
|
/* Changelist */ |
||||||
|
|
||||||
|
#changelist { |
||||||
|
align-items: stretch; |
||||||
|
flex-direction: column; |
||||||
|
} |
||||||
|
|
||||||
|
#toolbar { |
||||||
|
padding: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist-filter { |
||||||
|
margin-left: 0; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist .actions label { |
||||||
|
flex: 1 1; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist .actions select { |
||||||
|
flex: 1 0; |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist .actions span { |
||||||
|
flex: 1 0 100%; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist-filter { |
||||||
|
position: static; |
||||||
|
width: auto; |
||||||
|
margin-top: 30px; |
||||||
|
} |
||||||
|
|
||||||
|
.object-tools { |
||||||
|
float: none; |
||||||
|
margin: 0 0 15px; |
||||||
|
padding: 0; |
||||||
|
overflow: hidden; |
||||||
|
} |
||||||
|
|
||||||
|
.object-tools li { |
||||||
|
height: auto; |
||||||
|
margin-left: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.object-tools li + li { |
||||||
|
margin-left: 15px; |
||||||
|
} |
||||||
|
|
||||||
|
/* Forms */ |
||||||
|
|
||||||
|
.form-row { |
||||||
|
padding: 15px 0; |
||||||
|
} |
||||||
|
|
||||||
|
.aligned .form-row, |
||||||
|
.aligned .form-row > div { |
||||||
|
max-width: 100vw; |
||||||
|
} |
||||||
|
|
||||||
|
.aligned .form-row > div { |
||||||
|
width: calc(100vw - 30px); |
||||||
|
} |
||||||
|
|
||||||
|
.flex-container { |
||||||
|
flex-flow: column; |
||||||
|
} |
||||||
|
|
||||||
|
textarea { |
||||||
|
max-width: none; |
||||||
|
} |
||||||
|
|
||||||
|
.vURLField { |
||||||
|
width: auto; |
||||||
|
} |
||||||
|
|
||||||
|
fieldset .fieldBox + .fieldBox { |
||||||
|
margin-top: 15px; |
||||||
|
padding-top: 15px; |
||||||
|
} |
||||||
|
|
||||||
|
fieldset.collapsed .form-row { |
||||||
|
display: none; |
||||||
|
} |
||||||
|
|
||||||
|
.aligned label { |
||||||
|
width: 100%; |
||||||
|
padding: 0 0 10px; |
||||||
|
} |
||||||
|
|
||||||
|
.aligned label:after { |
||||||
|
max-height: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.aligned .form-row input, |
||||||
|
.aligned .form-row select, |
||||||
|
.aligned .form-row textarea { |
||||||
|
flex: 1 1 auto; |
||||||
|
max-width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
.aligned .checkbox-row { |
||||||
|
align-items: center; |
||||||
|
} |
||||||
|
|
||||||
|
.aligned .checkbox-row input { |
||||||
|
flex: 0 1 auto; |
||||||
|
margin: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.aligned .vCheckboxLabel { |
||||||
|
flex: 1 0; |
||||||
|
padding: 1px 0 0 5px; |
||||||
|
} |
||||||
|
|
||||||
|
.aligned label + p, |
||||||
|
.aligned label + div.help, |
||||||
|
.aligned label + div.readonly { |
||||||
|
padding: 0; |
||||||
|
margin-left: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.aligned p.file-upload { |
||||||
|
font-size: 0.8125rem; |
||||||
|
} |
||||||
|
|
||||||
|
span.clearable-file-input { |
||||||
|
margin-left: 15px; |
||||||
|
} |
||||||
|
|
||||||
|
span.clearable-file-input label { |
||||||
|
font-size: 0.8125rem; |
||||||
|
padding-bottom: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.aligned .timezonewarning { |
||||||
|
flex: 1 0 100%; |
||||||
|
margin-top: 5px; |
||||||
|
} |
||||||
|
|
||||||
|
form .aligned .form-row div.help { |
||||||
|
width: 100%; |
||||||
|
margin: 5px 0 0; |
||||||
|
padding: 0; |
||||||
|
} |
||||||
|
|
||||||
|
form .aligned ul, |
||||||
|
form .aligned ul.errorlist { |
||||||
|
margin-left: 0; |
||||||
|
padding-left: 0; |
||||||
|
} |
||||||
|
|
||||||
|
form .aligned div.radiolist { |
||||||
|
margin-top: 5px; |
||||||
|
margin-right: 15px; |
||||||
|
margin-bottom: -3px; |
||||||
|
} |
||||||
|
|
||||||
|
form .aligned div.radiolist:not(.inline) div + div { |
||||||
|
margin-top: 5px; |
||||||
|
} |
||||||
|
|
||||||
|
/* Related widget */ |
||||||
|
|
||||||
|
.related-widget-wrapper { |
||||||
|
width: 100%; |
||||||
|
display: flex; |
||||||
|
align-items: flex-start; |
||||||
|
} |
||||||
|
|
||||||
|
.related-widget-wrapper .selector { |
||||||
|
order: 1; |
||||||
|
} |
||||||
|
|
||||||
|
.related-widget-wrapper > a { |
||||||
|
order: 2; |
||||||
|
} |
||||||
|
|
||||||
|
.related-widget-wrapper .radiolist ~ a { |
||||||
|
align-self: flex-end; |
||||||
|
} |
||||||
|
|
||||||
|
.related-widget-wrapper > select ~ a { |
||||||
|
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; |
||||||
|
} |
||||||
|
|
||||||
|
.selector-available, .selector-chosen { |
||||||
|
margin-bottom: 0; |
||||||
|
flex: 1 1 auto; |
||||||
|
} |
||||||
|
|
||||||
|
.selector select { |
||||||
|
max-height: 96px; |
||||||
|
} |
||||||
|
|
||||||
|
.selector ul.selector-chooser { |
||||||
|
display: block; |
||||||
|
float: none; |
||||||
|
width: 52px; |
||||||
|
height: 26px; |
||||||
|
padding: 0 2px; |
||||||
|
margin: 15px auto 20px; |
||||||
|
transform: none; |
||||||
|
} |
||||||
|
|
||||||
|
.selector ul.selector-chooser li { |
||||||
|
float: left; |
||||||
|
} |
||||||
|
|
||||||
|
.selector-remove { |
||||||
|
background-position: 0 0; |
||||||
|
} |
||||||
|
|
||||||
|
.active.selector-remove:focus, .active.selector-remove:hover { |
||||||
|
background-position: 0 -20px; |
||||||
|
} |
||||||
|
|
||||||
|
.selector-add { |
||||||
|
background-position: 0 -40px; |
||||||
|
} |
||||||
|
|
||||||
|
.active.selector-add:focus, .active.selector-add:hover { |
||||||
|
background-position: 0 -60px; |
||||||
|
} |
||||||
|
|
||||||
|
/* Inlines */ |
||||||
|
|
||||||
|
.inline-group[data-inline-type="stacked"] .inline-related { |
||||||
|
border: 1px solid var(--hairline-color); |
||||||
|
border-radius: 4px; |
||||||
|
margin-top: 15px; |
||||||
|
overflow: auto; |
||||||
|
} |
||||||
|
|
||||||
|
.inline-group[data-inline-type="stacked"] .inline-related > * { |
||||||
|
box-sizing: border-box; |
||||||
|
} |
||||||
|
|
||||||
|
.inline-group[data-inline-type="stacked"] .inline-related .module { |
||||||
|
padding: 0 10px; |
||||||
|
} |
||||||
|
|
||||||
|
.inline-group[data-inline-type="stacked"] .inline-related .module .form-row { |
||||||
|
border-top: 1px solid var(--hairline-color); |
||||||
|
border-bottom: none; |
||||||
|
} |
||||||
|
|
||||||
|
.inline-group[data-inline-type="stacked"] .inline-related .module .form-row:first-child { |
||||||
|
border-top: none; |
||||||
|
} |
||||||
|
|
||||||
|
.inline-group[data-inline-type="stacked"] .inline-related h3 { |
||||||
|
padding: 10px; |
||||||
|
border-top-width: 0; |
||||||
|
border-bottom-width: 2px; |
||||||
|
display: flex; |
||||||
|
flex-wrap: wrap; |
||||||
|
align-items: center; |
||||||
|
} |
||||||
|
|
||||||
|
.inline-group[data-inline-type="stacked"] .inline-related h3 .inline_label { |
||||||
|
margin-right: auto; |
||||||
|
} |
||||||
|
|
||||||
|
.inline-group[data-inline-type="stacked"] .inline-related h3 span.delete { |
||||||
|
float: none; |
||||||
|
flex: 1 1 100%; |
||||||
|
margin-top: 5px; |
||||||
|
} |
||||||
|
|
||||||
|
.inline-group[data-inline-type="stacked"] .aligned .form-row > div:not([class]) { |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
.inline-group[data-inline-type="stacked"] .aligned label { |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
.inline-group[data-inline-type="stacked"] div.add-row { |
||||||
|
margin-top: 15px; |
||||||
|
border: 1px solid var(--hairline-color); |
||||||
|
border-radius: 4px; |
||||||
|
} |
||||||
|
|
||||||
|
.inline-group div.add-row, |
||||||
|
.inline-group .tabular tr.add-row td { |
||||||
|
padding: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.inline-group div.add-row a, |
||||||
|
.inline-group .tabular tr.add-row td a { |
||||||
|
display: block; |
||||||
|
padding: 8px 10px 8px 26px; |
||||||
|
background-position: 8px 9px; |
||||||
|
} |
||||||
|
|
||||||
|
/* Submit row */ |
||||||
|
|
||||||
|
.submit-row { |
||||||
|
padding: 10px; |
||||||
|
margin: 0 0 15px; |
||||||
|
flex-direction: column; |
||||||
|
gap: 8px; |
||||||
|
} |
||||||
|
|
||||||
|
.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 a.deletelink { |
||||||
|
margin: 0; |
||||||
|
} |
||||||
|
|
||||||
|
/* Messages */ |
||||||
|
|
||||||
|
ul.messagelist li { |
||||||
|
padding-left: 40px; |
||||||
|
background-position: 15px 12px; |
||||||
|
} |
||||||
|
|
||||||
|
ul.messagelist li.error { |
||||||
|
background-position: 15px 12px; |
||||||
|
} |
||||||
|
|
||||||
|
ul.messagelist li.warning { |
||||||
|
background-position: 15px 14px; |
||||||
|
} |
||||||
|
|
||||||
|
/* Paginator */ |
||||||
|
|
||||||
|
.paginator .this-page, .paginator a:link, .paginator a:visited { |
||||||
|
padding: 4px 10px; |
||||||
|
} |
||||||
|
|
||||||
|
/* Login */ |
||||||
|
|
||||||
|
body.login { |
||||||
|
padding: 0 15px; |
||||||
|
} |
||||||
|
|
||||||
|
.login #container { |
||||||
|
width: auto; |
||||||
|
max-width: 480px; |
||||||
|
margin: 50px auto; |
||||||
|
} |
||||||
|
|
||||||
|
.login #header, |
||||||
|
.login #content { |
||||||
|
padding: 15px; |
||||||
|
} |
||||||
|
|
||||||
|
.login #content-main { |
||||||
|
float: none; |
||||||
|
} |
||||||
|
|
||||||
|
.login .form-row { |
||||||
|
padding: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.login .form-row + .form-row { |
||||||
|
margin-top: 15px; |
||||||
|
} |
||||||
|
|
||||||
|
.login .form-row label { |
||||||
|
margin: 0 0 5px; |
||||||
|
line-height: 1.2; |
||||||
|
} |
||||||
|
|
||||||
|
.login .submit-row { |
||||||
|
padding: 15px 0 0; |
||||||
|
} |
||||||
|
|
||||||
|
.login br { |
||||||
|
display: none; |
||||||
|
} |
||||||
|
|
||||||
|
.login .submit-row input { |
||||||
|
margin: 0; |
||||||
|
text-transform: uppercase; |
||||||
|
} |
||||||
|
|
||||||
|
.errornote { |
||||||
|
margin: 0 0 20px; |
||||||
|
padding: 8px 12px; |
||||||
|
font-size: 0.8125rem; |
||||||
|
} |
||||||
|
|
||||||
|
/* Calendar and clock */ |
||||||
|
|
||||||
|
.calendarbox, .clockbox { |
||||||
|
position: fixed !important; |
||||||
|
top: 50% !important; |
||||||
|
left: 50% !important; |
||||||
|
transform: translate(-50%, -50%); |
||||||
|
margin: 0; |
||||||
|
border: none; |
||||||
|
overflow: visible; |
||||||
|
} |
||||||
|
|
||||||
|
.calendarbox:before, .clockbox:before { |
||||||
|
content: ''; |
||||||
|
position: fixed; |
||||||
|
top: 50%; |
||||||
|
left: 50%; |
||||||
|
width: 100vw; |
||||||
|
height: 100vh; |
||||||
|
background: rgba(0, 0, 0, 0.75); |
||||||
|
transform: translate(-50%, -50%); |
||||||
|
} |
||||||
|
|
||||||
|
.calendarbox > *, .clockbox > * { |
||||||
|
position: relative; |
||||||
|
z-index: 1; |
||||||
|
} |
||||||
|
|
||||||
|
.calendarbox > div:first-child { |
||||||
|
z-index: 2; |
||||||
|
} |
||||||
|
|
||||||
|
.calendarbox .calendar, .clockbox h2 { |
||||||
|
border-radius: 4px 4px 0 0; |
||||||
|
overflow: hidden; |
||||||
|
} |
||||||
|
|
||||||
|
.calendarbox .calendar-cancel, .clockbox .calendar-cancel { |
||||||
|
border-radius: 0 0 4px 4px; |
||||||
|
overflow: hidden; |
||||||
|
} |
||||||
|
|
||||||
|
.calendar-shortcuts { |
||||||
|
padding: 10px 0; |
||||||
|
font-size: 0.75rem; |
||||||
|
line-height: 0.75rem; |
||||||
|
} |
||||||
|
|
||||||
|
.calendar-shortcuts a { |
||||||
|
margin: 0 4px; |
||||||
|
} |
||||||
|
|
||||||
|
.timelist a { |
||||||
|
background: var(--body-bg); |
||||||
|
padding: 4px; |
||||||
|
} |
||||||
|
|
||||||
|
.calendar-cancel { |
||||||
|
padding: 8px 10px; |
||||||
|
} |
||||||
|
|
||||||
|
.clockbox h2 { |
||||||
|
padding: 8px 15px; |
||||||
|
} |
||||||
|
|
||||||
|
.calendar caption { |
||||||
|
padding: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
.calendarbox .calendarnav-previous, .calendarbox .calendarnav-next { |
||||||
|
z-index: 1; |
||||||
|
top: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
/* History */ |
||||||
|
|
||||||
|
table#change-history tbody th, table#change-history tbody td { |
||||||
|
font-size: 0.8125rem; |
||||||
|
word-break: break-word; |
||||||
|
} |
||||||
|
|
||||||
|
table#change-history tbody th { |
||||||
|
width: auto; |
||||||
|
} |
||||||
|
|
||||||
|
/* Docs */ |
||||||
|
|
||||||
|
table.model tbody th, table.model tbody td { |
||||||
|
font-size: 0.8125rem; |
||||||
|
word-break: break-word; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,81 @@ |
|||||||
|
/* TABLETS */ |
||||||
|
|
||||||
|
@media (max-width: 1024px) { |
||||||
|
[dir="rtl"] .colMS { |
||||||
|
margin-right: 0; |
||||||
|
} |
||||||
|
|
||||||
|
[dir="rtl"] #user-tools { |
||||||
|
text-align: right; |
||||||
|
} |
||||||
|
|
||||||
|
[dir="rtl"] #changelist .actions label { |
||||||
|
padding-left: 10px; |
||||||
|
padding-right: 0; |
||||||
|
} |
||||||
|
|
||||||
|
[dir="rtl"] #changelist .actions select { |
||||||
|
margin-left: 0; |
||||||
|
margin-right: 15px; |
||||||
|
} |
||||||
|
|
||||||
|
[dir="rtl"] .change-list .filtered .results, |
||||||
|
[dir="rtl"] .change-list .filtered .paginator, |
||||||
|
[dir="rtl"] .filtered #toolbar, |
||||||
|
[dir="rtl"] .filtered div.xfull, |
||||||
|
[dir="rtl"] .filtered .actions, |
||||||
|
[dir="rtl"] #changelist-filter { |
||||||
|
margin-left: 0; |
||||||
|
} |
||||||
|
|
||||||
|
[dir="rtl"] .inline-group ul.tools a.add, |
||||||
|
[dir="rtl"] .inline-group div.add-row a, |
||||||
|
[dir="rtl"] .inline-group .tabular tr.add-row td a { |
||||||
|
padding: 8px 26px 8px 10px; |
||||||
|
background-position: calc(100% - 8px) 9px; |
||||||
|
} |
||||||
|
|
||||||
|
[dir="rtl"] .related-widget-wrapper-link + .selector { |
||||||
|
margin-right: 0; |
||||||
|
margin-left: 15px; |
||||||
|
} |
||||||
|
|
||||||
|
[dir="rtl"] .selector .selector-filter label { |
||||||
|
margin-right: 0; |
||||||
|
margin-left: 8px; |
||||||
|
} |
||||||
|
|
||||||
|
[dir="rtl"] .object-tools li { |
||||||
|
float: right; |
||||||
|
} |
||||||
|
|
||||||
|
[dir="rtl"] .object-tools li + li { |
||||||
|
margin-left: 0; |
||||||
|
margin-right: 15px; |
||||||
|
} |
||||||
|
|
||||||
|
[dir="rtl"] .dashboard .module table td a { |
||||||
|
padding-left: 0; |
||||||
|
padding-right: 16px; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/* MOBILE */ |
||||||
|
|
||||||
|
@media (max-width: 767px) { |
||||||
|
[dir="rtl"] .aligned .related-lookup, |
||||||
|
[dir="rtl"] .aligned .datetimeshortcuts { |
||||||
|
margin-left: 0; |
||||||
|
margin-right: 15px; |
||||||
|
} |
||||||
|
|
||||||
|
[dir="rtl"] .aligned ul, |
||||||
|
[dir="rtl"] form .aligned ul.errorlist { |
||||||
|
margin-right: 0; |
||||||
|
} |
||||||
|
|
||||||
|
[dir="rtl"] #changelist-filter { |
||||||
|
margin-left: 0; |
||||||
|
margin-right: 0; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,288 @@ |
|||||||
|
/* GLOBAL */ |
||||||
|
|
||||||
|
th { |
||||||
|
text-align: right; |
||||||
|
} |
||||||
|
|
||||||
|
.module h2, .module caption { |
||||||
|
text-align: right; |
||||||
|
} |
||||||
|
|
||||||
|
.module ul, .module ol { |
||||||
|
margin-left: 0; |
||||||
|
margin-right: 1.5em; |
||||||
|
} |
||||||
|
|
||||||
|
.viewlink, .addlink, .changelink { |
||||||
|
padding-left: 0; |
||||||
|
padding-right: 16px; |
||||||
|
background-position: 100% 1px; |
||||||
|
} |
||||||
|
|
||||||
|
.deletelink { |
||||||
|
padding-left: 0; |
||||||
|
padding-right: 16px; |
||||||
|
background-position: 100% 1px; |
||||||
|
} |
||||||
|
|
||||||
|
.object-tools { |
||||||
|
float: left; |
||||||
|
} |
||||||
|
|
||||||
|
thead th:first-child, |
||||||
|
tfoot td:first-child { |
||||||
|
border-left: none; |
||||||
|
} |
||||||
|
|
||||||
|
/* LAYOUT */ |
||||||
|
|
||||||
|
#user-tools { |
||||||
|
right: auto; |
||||||
|
left: 0; |
||||||
|
text-align: left; |
||||||
|
} |
||||||
|
|
||||||
|
div.breadcrumbs { |
||||||
|
text-align: right; |
||||||
|
} |
||||||
|
|
||||||
|
#content-main { |
||||||
|
float: right; |
||||||
|
} |
||||||
|
|
||||||
|
#content-related { |
||||||
|
float: left; |
||||||
|
margin-left: -300px; |
||||||
|
margin-right: auto; |
||||||
|
} |
||||||
|
|
||||||
|
.colMS { |
||||||
|
margin-left: 300px; |
||||||
|
margin-right: 0; |
||||||
|
} |
||||||
|
|
||||||
|
/* SORTABLE TABLES */ |
||||||
|
|
||||||
|
table thead th.sorted .sortoptions { |
||||||
|
float: left; |
||||||
|
} |
||||||
|
|
||||||
|
thead th.sorted .text { |
||||||
|
padding-right: 0; |
||||||
|
padding-left: 42px; |
||||||
|
} |
||||||
|
|
||||||
|
/* dashboard styles */ |
||||||
|
|
||||||
|
.dashboard .module table td a { |
||||||
|
padding-left: .6em; |
||||||
|
padding-right: 16px; |
||||||
|
} |
||||||
|
|
||||||
|
/* changelists styles */ |
||||||
|
|
||||||
|
.change-list .filtered table { |
||||||
|
border-left: none; |
||||||
|
border-right: 0px none; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist-filter { |
||||||
|
border-left: none; |
||||||
|
border-right: none; |
||||||
|
margin-left: 0; |
||||||
|
margin-right: 30px; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist-filter li.selected { |
||||||
|
border-left: none; |
||||||
|
padding-left: 10px; |
||||||
|
margin-left: 0; |
||||||
|
border-right: 5px solid var(--hairline-color); |
||||||
|
padding-right: 10px; |
||||||
|
margin-right: -15px; |
||||||
|
} |
||||||
|
|
||||||
|
#changelist table tbody td:first-child, #changelist table tbody th:first-child { |
||||||
|
border-right: none; |
||||||
|
border-left: none; |
||||||
|
} |
||||||
|
|
||||||
|
/* FORMS */ |
||||||
|
|
||||||
|
.aligned label { |
||||||
|
padding: 0 0 3px 1em; |
||||||
|
} |
||||||
|
|
||||||
|
.submit-row a.deletelink { |
||||||
|
margin-left: 0; |
||||||
|
margin-right: auto; |
||||||
|
} |
||||||
|
|
||||||
|
.vDateField, .vTimeField { |
||||||
|
margin-left: 2px; |
||||||
|
} |
||||||
|
|
||||||
|
.aligned .form-row input { |
||||||
|
margin-left: 5px; |
||||||
|
} |
||||||
|
|
||||||
|
form .aligned ul { |
||||||
|
margin-right: 163px; |
||||||
|
padding-right: 10px; |
||||||
|
margin-left: 0; |
||||||
|
padding-left: 0; |
||||||
|
} |
||||||
|
|
||||||
|
form ul.inline li { |
||||||
|
float: right; |
||||||
|
padding-right: 0; |
||||||
|
padding-left: 7px; |
||||||
|
} |
||||||
|
|
||||||
|
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 { |
||||||
|
margin-left: 20px; |
||||||
|
margin-right: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.errorlist li { |
||||||
|
background-position: 100% 12px; |
||||||
|
padding: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.errornote { |
||||||
|
background-position: 100% 12px; |
||||||
|
padding: 10px 12px; |
||||||
|
} |
||||||
|
|
||||||
|
/* WIDGETS */ |
||||||
|
|
||||||
|
.calendarnav-previous { |
||||||
|
top: 0; |
||||||
|
left: auto; |
||||||
|
right: 10px; |
||||||
|
background: url(../img/calendar-icons.svg) 0 -30px no-repeat; |
||||||
|
} |
||||||
|
|
||||||
|
.calendarbox .calendarnav-previous:focus, |
||||||
|
.calendarbox .calendarnav-previous:hover { |
||||||
|
background-position: 0 -45px; |
||||||
|
} |
||||||
|
|
||||||
|
.calendarnav-next { |
||||||
|
top: 0; |
||||||
|
right: auto; |
||||||
|
left: 10px; |
||||||
|
background: url(../img/calendar-icons.svg) 0 0 no-repeat; |
||||||
|
} |
||||||
|
|
||||||
|
.calendarbox .calendarnav-next:focus, |
||||||
|
.calendarbox .calendarnav-next:hover { |
||||||
|
background-position: 0 -15px; |
||||||
|
} |
||||||
|
|
||||||
|
.calendar caption, .calendarbox h2 { |
||||||
|
text-align: center; |
||||||
|
} |
||||||
|
|
||||||
|
.selector { |
||||||
|
float: right; |
||||||
|
} |
||||||
|
|
||||||
|
.selector .selector-filter { |
||||||
|
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; |
||||||
|
} |
||||||
|
|
||||||
|
form .form-row p.datetime { |
||||||
|
overflow: hidden; |
||||||
|
} |
||||||
|
|
||||||
|
.related-widget-wrapper { |
||||||
|
float: right; |
||||||
|
} |
||||||
|
|
||||||
|
/* MISC */ |
||||||
|
|
||||||
|
.inline-related h2, .inline-group h2 { |
||||||
|
text-align: right |
||||||
|
} |
||||||
|
|
||||||
|
.inline-related h3 span.delete { |
||||||
|
padding-right: 20px; |
||||||
|
padding-left: inherit; |
||||||
|
left: 10px; |
||||||
|
right: inherit; |
||||||
|
float:left; |
||||||
|
} |
||||||
|
|
||||||
|
.inline-related h3 span.delete label { |
||||||
|
margin-left: inherit; |
||||||
|
margin-right: 2px; |
||||||
|
} |
@ -0,0 +1,21 @@ |
|||||||
|
The MIT License (MIT) |
||||||
|
|
||||||
|
Copyright (c) 2012-2017 Kevin Brown, Igor Vaynberg, and Select2 contributors |
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy |
||||||
|
of this software and associated documentation files (the "Software"), to deal |
||||||
|
in the Software without restriction, including without limitation the rights |
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
||||||
|
copies of the Software, and to permit persons to whom the Software is |
||||||
|
furnished to do so, subject to the following conditions: |
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in |
||||||
|
all copies or substantial portions of the Software. |
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
||||||
|
THE SOFTWARE. |
@ -0,0 +1,481 @@ |
|||||||
|
.select2-container { |
||||||
|
box-sizing: border-box; |
||||||
|
display: inline-block; |
||||||
|
margin: 0; |
||||||
|
position: relative; |
||||||
|
vertical-align: middle; } |
||||||
|
.select2-container .select2-selection--single { |
||||||
|
box-sizing: border-box; |
||||||
|
cursor: pointer; |
||||||
|
display: block; |
||||||
|
height: 28px; |
||||||
|
user-select: none; |
||||||
|
-webkit-user-select: none; } |
||||||
|
.select2-container .select2-selection--single .select2-selection__rendered { |
||||||
|
display: block; |
||||||
|
padding-left: 8px; |
||||||
|
padding-right: 20px; |
||||||
|
overflow: hidden; |
||||||
|
text-overflow: ellipsis; |
||||||
|
white-space: nowrap; } |
||||||
|
.select2-container .select2-selection--single .select2-selection__clear { |
||||||
|
position: relative; } |
||||||
|
.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { |
||||||
|
padding-right: 8px; |
||||||
|
padding-left: 20px; } |
||||||
|
.select2-container .select2-selection--multiple { |
||||||
|
box-sizing: border-box; |
||||||
|
cursor: pointer; |
||||||
|
display: block; |
||||||
|
min-height: 32px; |
||||||
|
user-select: none; |
||||||
|
-webkit-user-select: none; } |
||||||
|
.select2-container .select2-selection--multiple .select2-selection__rendered { |
||||||
|
display: inline-block; |
||||||
|
overflow: hidden; |
||||||
|
padding-left: 8px; |
||||||
|
text-overflow: ellipsis; |
||||||
|
white-space: nowrap; } |
||||||
|
.select2-container .select2-search--inline { |
||||||
|
float: left; } |
||||||
|
.select2-container .select2-search--inline .select2-search__field { |
||||||
|
box-sizing: border-box; |
||||||
|
border: none; |
||||||
|
font-size: 100%; |
||||||
|
margin-top: 5px; |
||||||
|
padding: 0; } |
||||||
|
.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button { |
||||||
|
-webkit-appearance: none; } |
||||||
|
|
||||||
|
.select2-dropdown { |
||||||
|
background-color: white; |
||||||
|
border: 1px solid #aaa; |
||||||
|
border-radius: 4px; |
||||||
|
box-sizing: border-box; |
||||||
|
display: block; |
||||||
|
position: absolute; |
||||||
|
left: -100000px; |
||||||
|
width: 100%; |
||||||
|
z-index: 1051; } |
||||||
|
|
||||||
|
.select2-results { |
||||||
|
display: block; } |
||||||
|
|
||||||
|
.select2-results__options { |
||||||
|
list-style: none; |
||||||
|
margin: 0; |
||||||
|
padding: 0; } |
||||||
|
|
||||||
|
.select2-results__option { |
||||||
|
padding: 6px; |
||||||
|
user-select: none; |
||||||
|
-webkit-user-select: none; } |
||||||
|
.select2-results__option[aria-selected] { |
||||||
|
cursor: pointer; } |
||||||
|
|
||||||
|
.select2-container--open .select2-dropdown { |
||||||
|
left: 0; } |
||||||
|
|
||||||
|
.select2-container--open .select2-dropdown--above { |
||||||
|
border-bottom: none; |
||||||
|
border-bottom-left-radius: 0; |
||||||
|
border-bottom-right-radius: 0; } |
||||||
|
|
||||||
|
.select2-container--open .select2-dropdown--below { |
||||||
|
border-top: none; |
||||||
|
border-top-left-radius: 0; |
||||||
|
border-top-right-radius: 0; } |
||||||
|
|
||||||
|
.select2-search--dropdown { |
||||||
|
display: block; |
||||||
|
padding: 4px; } |
||||||
|
.select2-search--dropdown .select2-search__field { |
||||||
|
padding: 4px; |
||||||
|
width: 100%; |
||||||
|
box-sizing: border-box; } |
||||||
|
.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button { |
||||||
|
-webkit-appearance: none; } |
||||||
|
.select2-search--dropdown.select2-search--hide { |
||||||
|
display: none; } |
||||||
|
|
||||||
|
.select2-close-mask { |
||||||
|
border: 0; |
||||||
|
margin: 0; |
||||||
|
padding: 0; |
||||||
|
display: block; |
||||||
|
position: fixed; |
||||||
|
left: 0; |
||||||
|
top: 0; |
||||||
|
min-height: 100%; |
||||||
|
min-width: 100%; |
||||||
|
height: auto; |
||||||
|
width: auto; |
||||||
|
opacity: 0; |
||||||
|
z-index: 99; |
||||||
|
background-color: #fff; |
||||||
|
filter: alpha(opacity=0); } |
||||||
|
|
||||||
|
.select2-hidden-accessible { |
||||||
|
border: 0 !important; |
||||||
|
clip: rect(0 0 0 0) !important; |
||||||
|
-webkit-clip-path: inset(50%) !important; |
||||||
|
clip-path: inset(50%) !important; |
||||||
|
height: 1px !important; |
||||||
|
overflow: hidden !important; |
||||||
|
padding: 0 !important; |
||||||
|
position: absolute !important; |
||||||
|
width: 1px !important; |
||||||
|
white-space: nowrap !important; } |
||||||
|
|
||||||
|
.select2-container--default .select2-selection--single { |
||||||
|
background-color: #fff; |
||||||
|
border: 1px solid #aaa; |
||||||
|
border-radius: 4px; } |
||||||
|
.select2-container--default .select2-selection--single .select2-selection__rendered { |
||||||
|
color: #444; |
||||||
|
line-height: 28px; } |
||||||
|
.select2-container--default .select2-selection--single .select2-selection__clear { |
||||||
|
cursor: pointer; |
||||||
|
float: right; |
||||||
|
font-weight: bold; } |
||||||
|
.select2-container--default .select2-selection--single .select2-selection__placeholder { |
||||||
|
color: #999; } |
||||||
|
.select2-container--default .select2-selection--single .select2-selection__arrow { |
||||||
|
height: 26px; |
||||||
|
position: absolute; |
||||||
|
top: 1px; |
||||||
|
right: 1px; |
||||||
|
width: 20px; } |
||||||
|
.select2-container--default .select2-selection--single .select2-selection__arrow b { |
||||||
|
border-color: #888 transparent transparent transparent; |
||||||
|
border-style: solid; |
||||||
|
border-width: 5px 4px 0 4px; |
||||||
|
height: 0; |
||||||
|
left: 50%; |
||||||
|
margin-left: -4px; |
||||||
|
margin-top: -2px; |
||||||
|
position: absolute; |
||||||
|
top: 50%; |
||||||
|
width: 0; } |
||||||
|
|
||||||
|
.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear { |
||||||
|
float: left; } |
||||||
|
|
||||||
|
.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow { |
||||||
|
left: 1px; |
||||||
|
right: auto; } |
||||||
|
|
||||||
|
.select2-container--default.select2-container--disabled .select2-selection--single { |
||||||
|
background-color: #eee; |
||||||
|
cursor: default; } |
||||||
|
.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear { |
||||||
|
display: none; } |
||||||
|
|
||||||
|
.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b { |
||||||
|
border-color: transparent transparent #888 transparent; |
||||||
|
border-width: 0 4px 5px 4px; } |
||||||
|
|
||||||
|
.select2-container--default .select2-selection--multiple { |
||||||
|
background-color: white; |
||||||
|
border: 1px solid #aaa; |
||||||
|
border-radius: 4px; |
||||||
|
cursor: text; } |
||||||
|
.select2-container--default .select2-selection--multiple .select2-selection__rendered { |
||||||
|
box-sizing: border-box; |
||||||
|
list-style: none; |
||||||
|
margin: 0; |
||||||
|
padding: 0 5px; |
||||||
|
width: 100%; } |
||||||
|
.select2-container--default .select2-selection--multiple .select2-selection__rendered li { |
||||||
|
list-style: none; } |
||||||
|
.select2-container--default .select2-selection--multiple .select2-selection__clear { |
||||||
|
cursor: pointer; |
||||||
|
float: right; |
||||||
|
font-weight: bold; |
||||||
|
margin-top: 5px; |
||||||
|
margin-right: 10px; |
||||||
|
padding: 1px; } |
||||||
|
.select2-container--default .select2-selection--multiple .select2-selection__choice { |
||||||
|
background-color: #e4e4e4; |
||||||
|
border: 1px solid #aaa; |
||||||
|
border-radius: 4px; |
||||||
|
cursor: default; |
||||||
|
float: left; |
||||||
|
margin-right: 5px; |
||||||
|
margin-top: 5px; |
||||||
|
padding: 0 5px; } |
||||||
|
.select2-container--default .select2-selection--multiple .select2-selection__choice__remove { |
||||||
|
color: #999; |
||||||
|
cursor: pointer; |
||||||
|
display: inline-block; |
||||||
|
font-weight: bold; |
||||||
|
margin-right: 2px; } |
||||||
|
.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { |
||||||
|
color: #333; } |
||||||
|
|
||||||
|
.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline { |
||||||
|
float: right; } |
||||||
|
|
||||||
|
.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice { |
||||||
|
margin-left: 5px; |
||||||
|
margin-right: auto; } |
||||||
|
|
||||||
|
.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { |
||||||
|
margin-left: 2px; |
||||||
|
margin-right: auto; } |
||||||
|
|
||||||
|
.select2-container--default.select2-container--focus .select2-selection--multiple { |
||||||
|
border: solid black 1px; |
||||||
|
outline: 0; } |
||||||
|
|
||||||
|
.select2-container--default.select2-container--disabled .select2-selection--multiple { |
||||||
|
background-color: #eee; |
||||||
|
cursor: default; } |
||||||
|
|
||||||
|
.select2-container--default.select2-container--disabled .select2-selection__choice__remove { |
||||||
|
display: none; } |
||||||
|
|
||||||
|
.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple { |
||||||
|
border-top-left-radius: 0; |
||||||
|
border-top-right-radius: 0; } |
||||||
|
|
||||||
|
.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple { |
||||||
|
border-bottom-left-radius: 0; |
||||||
|
border-bottom-right-radius: 0; } |
||||||
|
|
||||||
|
.select2-container--default .select2-search--dropdown .select2-search__field { |
||||||
|
border: 1px solid #aaa; } |
||||||
|
|
||||||
|
.select2-container--default .select2-search--inline .select2-search__field { |
||||||
|
background: transparent; |
||||||
|
border: none; |
||||||
|
outline: 0; |
||||||
|
box-shadow: none; |
||||||
|
-webkit-appearance: textfield; } |
||||||
|
|
||||||
|
.select2-container--default .select2-results > .select2-results__options { |
||||||
|
max-height: 200px; |
||||||
|
overflow-y: auto; } |
||||||
|
|
||||||
|
.select2-container--default .select2-results__option[role=group] { |
||||||
|
padding: 0; } |
||||||
|
|
||||||
|
.select2-container--default .select2-results__option[aria-disabled=true] { |
||||||
|
color: #999; } |
||||||
|
|
||||||
|
.select2-container--default .select2-results__option[aria-selected=true] { |
||||||
|
background-color: #ddd; } |
||||||
|
|
||||||
|
.select2-container--default .select2-results__option .select2-results__option { |
||||||
|
padding-left: 1em; } |
||||||
|
.select2-container--default .select2-results__option .select2-results__option .select2-results__group { |
||||||
|
padding-left: 0; } |
||||||
|
.select2-container--default .select2-results__option .select2-results__option .select2-results__option { |
||||||
|
margin-left: -1em; |
||||||
|
padding-left: 2em; } |
||||||
|
.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { |
||||||
|
margin-left: -2em; |
||||||
|
padding-left: 3em; } |
||||||
|
.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { |
||||||
|
margin-left: -3em; |
||||||
|
padding-left: 4em; } |
||||||
|
.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { |
||||||
|
margin-left: -4em; |
||||||
|
padding-left: 5em; } |
||||||
|
.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { |
||||||
|
margin-left: -5em; |
||||||
|
padding-left: 6em; } |
||||||
|
|
||||||
|
.select2-container--default .select2-results__option--highlighted[aria-selected] { |
||||||
|
background-color: #5897fb; |
||||||
|
color: white; } |
||||||
|
|
||||||
|
.select2-container--default .select2-results__group { |
||||||
|
cursor: default; |
||||||
|
display: block; |
||||||
|
padding: 6px; } |
||||||
|
|
||||||
|
.select2-container--classic .select2-selection--single { |
||||||
|
background-color: #f7f7f7; |
||||||
|
border: 1px solid #aaa; |
||||||
|
border-radius: 4px; |
||||||
|
outline: 0; |
||||||
|
background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%); |
||||||
|
background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%); |
||||||
|
background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%); |
||||||
|
background-repeat: repeat-x; |
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } |
||||||
|
.select2-container--classic .select2-selection--single:focus { |
||||||
|
border: 1px solid #5897fb; } |
||||||
|
.select2-container--classic .select2-selection--single .select2-selection__rendered { |
||||||
|
color: #444; |
||||||
|
line-height: 28px; } |
||||||
|
.select2-container--classic .select2-selection--single .select2-selection__clear { |
||||||
|
cursor: pointer; |
||||||
|
float: right; |
||||||
|
font-weight: bold; |
||||||
|
margin-right: 10px; } |
||||||
|
.select2-container--classic .select2-selection--single .select2-selection__placeholder { |
||||||
|
color: #999; } |
||||||
|
.select2-container--classic .select2-selection--single .select2-selection__arrow { |
||||||
|
background-color: #ddd; |
||||||
|
border: none; |
||||||
|
border-left: 1px solid #aaa; |
||||||
|
border-top-right-radius: 4px; |
||||||
|
border-bottom-right-radius: 4px; |
||||||
|
height: 26px; |
||||||
|
position: absolute; |
||||||
|
top: 1px; |
||||||
|
right: 1px; |
||||||
|
width: 20px; |
||||||
|
background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%); |
||||||
|
background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%); |
||||||
|
background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%); |
||||||
|
background-repeat: repeat-x; |
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); } |
||||||
|
.select2-container--classic .select2-selection--single .select2-selection__arrow b { |
||||||
|
border-color: #888 transparent transparent transparent; |
||||||
|
border-style: solid; |
||||||
|
border-width: 5px 4px 0 4px; |
||||||
|
height: 0; |
||||||
|
left: 50%; |
||||||
|
margin-left: -4px; |
||||||
|
margin-top: -2px; |
||||||
|
position: absolute; |
||||||
|
top: 50%; |
||||||
|
width: 0; } |
||||||
|
|
||||||
|
.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear { |
||||||
|
float: left; } |
||||||
|
|
||||||
|
.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow { |
||||||
|
border: none; |
||||||
|
border-right: 1px solid #aaa; |
||||||
|
border-radius: 0; |
||||||
|
border-top-left-radius: 4px; |
||||||
|
border-bottom-left-radius: 4px; |
||||||
|
left: 1px; |
||||||
|
right: auto; } |
||||||
|
|
||||||
|
.select2-container--classic.select2-container--open .select2-selection--single { |
||||||
|
border: 1px solid #5897fb; } |
||||||
|
.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow { |
||||||
|
background: transparent; |
||||||
|
border: none; } |
||||||
|
.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b { |
||||||
|
border-color: transparent transparent #888 transparent; |
||||||
|
border-width: 0 4px 5px 4px; } |
||||||
|
|
||||||
|
.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single { |
||||||
|
border-top: none; |
||||||
|
border-top-left-radius: 0; |
||||||
|
border-top-right-radius: 0; |
||||||
|
background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%); |
||||||
|
background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%); |
||||||
|
background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%); |
||||||
|
background-repeat: repeat-x; |
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } |
||||||
|
|
||||||
|
.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single { |
||||||
|
border-bottom: none; |
||||||
|
border-bottom-left-radius: 0; |
||||||
|
border-bottom-right-radius: 0; |
||||||
|
background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%); |
||||||
|
background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%); |
||||||
|
background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%); |
||||||
|
background-repeat: repeat-x; |
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); } |
||||||
|
|
||||||
|
.select2-container--classic .select2-selection--multiple { |
||||||
|
background-color: white; |
||||||
|
border: 1px solid #aaa; |
||||||
|
border-radius: 4px; |
||||||
|
cursor: text; |
||||||
|
outline: 0; } |
||||||
|
.select2-container--classic .select2-selection--multiple:focus { |
||||||
|
border: 1px solid #5897fb; } |
||||||
|
.select2-container--classic .select2-selection--multiple .select2-selection__rendered { |
||||||
|
list-style: none; |
||||||
|
margin: 0; |
||||||
|
padding: 0 5px; } |
||||||
|
.select2-container--classic .select2-selection--multiple .select2-selection__clear { |
||||||
|
display: none; } |
||||||
|
.select2-container--classic .select2-selection--multiple .select2-selection__choice { |
||||||
|
background-color: #e4e4e4; |
||||||
|
border: 1px solid #aaa; |
||||||
|
border-radius: 4px; |
||||||
|
cursor: default; |
||||||
|
float: left; |
||||||
|
margin-right: 5px; |
||||||
|
margin-top: 5px; |
||||||
|
padding: 0 5px; } |
||||||
|
.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove { |
||||||
|
color: #888; |
||||||
|
cursor: pointer; |
||||||
|
display: inline-block; |
||||||
|
font-weight: bold; |
||||||
|
margin-right: 2px; } |
||||||
|
.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { |
||||||
|
color: #555; } |
||||||
|
|
||||||
|
.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { |
||||||
|
float: right; |
||||||
|
margin-left: 5px; |
||||||
|
margin-right: auto; } |
||||||
|
|
||||||
|
.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { |
||||||
|
margin-left: 2px; |
||||||
|
margin-right: auto; } |
||||||
|
|
||||||
|
.select2-container--classic.select2-container--open .select2-selection--multiple { |
||||||
|
border: 1px solid #5897fb; } |
||||||
|
|
||||||
|
.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple { |
||||||
|
border-top: none; |
||||||
|
border-top-left-radius: 0; |
||||||
|
border-top-right-radius: 0; } |
||||||
|
|
||||||
|
.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple { |
||||||
|
border-bottom: none; |
||||||
|
border-bottom-left-radius: 0; |
||||||
|
border-bottom-right-radius: 0; } |
||||||
|
|
||||||
|
.select2-container--classic .select2-search--dropdown .select2-search__field { |
||||||
|
border: 1px solid #aaa; |
||||||
|
outline: 0; } |
||||||
|
|
||||||
|
.select2-container--classic .select2-search--inline .select2-search__field { |
||||||
|
outline: 0; |
||||||
|
box-shadow: none; } |
||||||
|
|
||||||
|
.select2-container--classic .select2-dropdown { |
||||||
|
background-color: white; |
||||||
|
border: 1px solid transparent; } |
||||||
|
|
||||||
|
.select2-container--classic .select2-dropdown--above { |
||||||
|
border-bottom: none; } |
||||||
|
|
||||||
|
.select2-container--classic .select2-dropdown--below { |
||||||
|
border-top: none; } |
||||||
|
|
||||||
|
.select2-container--classic .select2-results > .select2-results__options { |
||||||
|
max-height: 200px; |
||||||
|
overflow-y: auto; } |
||||||
|
|
||||||
|
.select2-container--classic .select2-results__option[role=group] { |
||||||
|
padding: 0; } |
||||||
|
|
||||||
|
.select2-container--classic .select2-results__option[aria-disabled=true] { |
||||||
|
color: grey; } |
||||||
|
|
||||||
|
.select2-container--classic .select2-results__option--highlighted[aria-selected] { |
||||||
|
background-color: #3875d7; |
||||||
|
color: white; } |
||||||
|
|
||||||
|
.select2-container--classic .select2-results__group { |
||||||
|
cursor: default; |
||||||
|
display: block; |
||||||
|
padding: 6px; } |
||||||
|
|
||||||
|
.select2-container--classic.select2-container--open .select2-dropdown { |
||||||
|
border-color: #5897fb; } |
@ -0,0 +1,603 @@ |
|||||||
|
/* SELECTOR (FILTER INTERFACE) */ |
||||||
|
|
||||||
|
.selector { |
||||||
|
width: 800px; |
||||||
|
float: left; |
||||||
|
display: flex; |
||||||
|
} |
||||||
|
|
||||||
|
.selector select { |
||||||
|
width: 380px; |
||||||
|
height: 17.2em; |
||||||
|
flex: 1 0 auto; |
||||||
|
} |
||||||
|
|
||||||
|
.selector-available, .selector-chosen { |
||||||
|
width: 380px; |
||||||
|
text-align: center; |
||||||
|
margin-bottom: 5px; |
||||||
|
display: flex; |
||||||
|
flex-direction: column; |
||||||
|
} |
||||||
|
|
||||||
|
.selector-available h2, .selector-chosen h2 { |
||||||
|
border: 1px solid var(--border-color); |
||||||
|
border-radius: 4px 4px 0 0; |
||||||
|
} |
||||||
|
|
||||||
|
.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(--primary); |
||||||
|
color: var(--header-link-color); |
||||||
|
} |
||||||
|
|
||||||
|
.selector .selector-available h2 { |
||||||
|
background: var(--darkened-bg); |
||||||
|
color: var(--body-quiet-color); |
||||||
|
} |
||||||
|
|
||||||
|
.selector .selector-filter { |
||||||
|
border: 1px solid var(--border-color); |
||||||
|
border-width: 0 1px; |
||||||
|
padding: 8px; |
||||||
|
color: var(--body-quiet-color); |
||||||
|
font-size: 0.625rem; |
||||||
|
margin: 0; |
||||||
|
text-align: left; |
||||||
|
} |
||||||
|
|
||||||
|
.selector .selector-filter label, |
||||||
|
.inline-group .aligned .selector .selector-filter label { |
||||||
|
float: left; |
||||||
|
margin: 7px 0 0; |
||||||
|
width: 18px; |
||||||
|
height: 18px; |
||||||
|
padding: 0; |
||||||
|
overflow: hidden; |
||||||
|
line-height: 1; |
||||||
|
} |
||||||
|
|
||||||
|
.selector .selector-available input, |
||||||
|
.selector .selector-chosen input { |
||||||
|
width: 320px; |
||||||
|
margin-left: 8px; |
||||||
|
} |
||||||
|
|
||||||
|
.selector ul.selector-chooser { |
||||||
|
align-self: center; |
||||||
|
width: 22px; |
||||||
|
background-color: var(--selected-bg); |
||||||
|
border-radius: 10px; |
||||||
|
margin: 0 5px; |
||||||
|
padding: 0; |
||||||
|
transform: translateY(-17px); |
||||||
|
} |
||||||
|
|
||||||
|
.selector-chooser li { |
||||||
|
margin: 0; |
||||||
|
padding: 3px; |
||||||
|
list-style-type: none; |
||||||
|
} |
||||||
|
|
||||||
|
.selector select { |
||||||
|
padding: 0 10px; |
||||||
|
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; |
||||||
|
height: 16px; |
||||||
|
display: block; |
||||||
|
text-indent: -3000px; |
||||||
|
overflow: hidden; |
||||||
|
cursor: default; |
||||||
|
opacity: 0.55; |
||||||
|
} |
||||||
|
|
||||||
|
.active.selector-add, .active.selector-remove { |
||||||
|
opacity: 1; |
||||||
|
} |
||||||
|
|
||||||
|
.active.selector-add:hover, .active.selector-remove:hover { |
||||||
|
cursor: pointer; |
||||||
|
} |
||||||
|
|
||||||
|
.selector-add { |
||||||
|
background: url(../img/selector-icons.svg) 0 -96px no-repeat; |
||||||
|
} |
||||||
|
|
||||||
|
.active.selector-add:focus, .active.selector-add:hover { |
||||||
|
background-position: 0 -112px; |
||||||
|
} |
||||||
|
|
||||||
|
.selector-remove { |
||||||
|
background: url(../img/selector-icons.svg) 0 -64px no-repeat; |
||||||
|
} |
||||||
|
|
||||||
|
.active.selector-remove:focus, .active.selector-remove:hover { |
||||||
|
background-position: 0 -80px; |
||||||
|
} |
||||||
|
|
||||||
|
a.selector-chooseall, a.selector-clearall { |
||||||
|
display: inline-block; |
||||||
|
height: 16px; |
||||||
|
text-align: left; |
||||||
|
margin: 1px auto 3px; |
||||||
|
overflow: hidden; |
||||||
|
font-weight: bold; |
||||||
|
line-height: 16px; |
||||||
|
color: var(--body-quiet-color); |
||||||
|
text-decoration: none; |
||||||
|
opacity: 0.55; |
||||||
|
} |
||||||
|
|
||||||
|
a.active.selector-chooseall:focus, a.active.selector-clearall:focus, |
||||||
|
a.active.selector-chooseall:hover, a.active.selector-clearall:hover { |
||||||
|
color: var(--link-fg); |
||||||
|
} |
||||||
|
|
||||||
|
a.active.selector-chooseall, a.active.selector-clearall { |
||||||
|
opacity: 1; |
||||||
|
} |
||||||
|
|
||||||
|
a.active.selector-chooseall:hover, a.active.selector-clearall:hover { |
||||||
|
cursor: pointer; |
||||||
|
} |
||||||
|
|
||||||
|
a.selector-chooseall { |
||||||
|
padding: 0 18px 0 0; |
||||||
|
background: url(../img/selector-icons.svg) right -160px no-repeat; |
||||||
|
cursor: default; |
||||||
|
} |
||||||
|
|
||||||
|
a.active.selector-chooseall:focus, a.active.selector-chooseall:hover { |
||||||
|
background-position: 100% -176px; |
||||||
|
} |
||||||
|
|
||||||
|
a.selector-clearall { |
||||||
|
padding: 0 0 0 18px; |
||||||
|
background: url(../img/selector-icons.svg) 0 -128px no-repeat; |
||||||
|
cursor: default; |
||||||
|
} |
||||||
|
|
||||||
|
a.active.selector-clearall:focus, a.active.selector-clearall:hover { |
||||||
|
background-position: 0 -144px; |
||||||
|
} |
||||||
|
|
||||||
|
/* STACKED SELECTORS */ |
||||||
|
|
||||||
|
.stacked { |
||||||
|
float: left; |
||||||
|
width: 490px; |
||||||
|
display: block; |
||||||
|
} |
||||||
|
|
||||||
|
.stacked select { |
||||||
|
width: 480px; |
||||||
|
height: 10.1em; |
||||||
|
} |
||||||
|
|
||||||
|
.stacked .selector-available, .stacked .selector-chosen { |
||||||
|
width: 480px; |
||||||
|
} |
||||||
|
|
||||||
|
.stacked .selector-available { |
||||||
|
margin-bottom: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.stacked .selector-available input { |
||||||
|
width: 422px; |
||||||
|
} |
||||||
|
|
||||||
|
.stacked ul.selector-chooser { |
||||||
|
height: 22px; |
||||||
|
width: 50px; |
||||||
|
margin: 0 0 10px 40%; |
||||||
|
background-color: #eee; |
||||||
|
border-radius: 10px; |
||||||
|
transform: none; |
||||||
|
} |
||||||
|
|
||||||
|
.stacked .selector-chooser li { |
||||||
|
float: left; |
||||||
|
padding: 3px 3px 3px 5px; |
||||||
|
} |
||||||
|
|
||||||
|
.stacked .selector-chooseall, .stacked .selector-clearall { |
||||||
|
display: none; |
||||||
|
} |
||||||
|
|
||||||
|
.stacked .selector-add { |
||||||
|
background: url(../img/selector-icons.svg) 0 -32px no-repeat; |
||||||
|
cursor: default; |
||||||
|
} |
||||||
|
|
||||||
|
.stacked .active.selector-add { |
||||||
|
background-position: 0 -32px; |
||||||
|
cursor: pointer; |
||||||
|
} |
||||||
|
|
||||||
|
.stacked .active.selector-add:focus, .stacked .active.selector-add:hover { |
||||||
|
background-position: 0 -48px; |
||||||
|
cursor: pointer; |
||||||
|
} |
||||||
|
|
||||||
|
.stacked .selector-remove { |
||||||
|
background: url(../img/selector-icons.svg) 0 0 no-repeat; |
||||||
|
cursor: default; |
||||||
|
} |
||||||
|
|
||||||
|
.stacked .active.selector-remove { |
||||||
|
background-position: 0 0px; |
||||||
|
cursor: pointer; |
||||||
|
} |
||||||
|
|
||||||
|
.stacked .active.selector-remove:focus, .stacked .active.selector-remove:hover { |
||||||
|
background-position: 0 -16px; |
||||||
|
cursor: pointer; |
||||||
|
} |
||||||
|
|
||||||
|
.selector .help-icon { |
||||||
|
background: url(../img/icon-unknown.svg) 0 0 no-repeat; |
||||||
|
display: inline-block; |
||||||
|
vertical-align: middle; |
||||||
|
margin: -2px 0 0 2px; |
||||||
|
width: 13px; |
||||||
|
height: 13px; |
||||||
|
} |
||||||
|
|
||||||
|
.selector .selector-chosen .help-icon { |
||||||
|
background: url(../img/icon-unknown-alt.svg) 0 0 no-repeat; |
||||||
|
} |
||||||
|
|
||||||
|
.selector .search-label-icon { |
||||||
|
background: url(../img/search.svg) 0 0 no-repeat; |
||||||
|
display: inline-block; |
||||||
|
height: 1.125rem; |
||||||
|
width: 1.125rem; |
||||||
|
} |
||||||
|
|
||||||
|
/* DATE AND TIME */ |
||||||
|
|
||||||
|
p.datetime { |
||||||
|
line-height: 20px; |
||||||
|
margin: 0; |
||||||
|
padding: 0; |
||||||
|
color: var(--body-quiet-color); |
||||||
|
font-weight: bold; |
||||||
|
} |
||||||
|
|
||||||
|
.datetime span { |
||||||
|
white-space: nowrap; |
||||||
|
font-weight: normal; |
||||||
|
font-size: 0.6875rem; |
||||||
|
color: var(--body-quiet-color); |
||||||
|
} |
||||||
|
|
||||||
|
.datetime input, .form-row .datetime input.vDateField, .form-row .datetime input.vTimeField { |
||||||
|
margin-left: 5px; |
||||||
|
margin-bottom: 4px; |
||||||
|
} |
||||||
|
|
||||||
|
table p.datetime { |
||||||
|
font-size: 0.6875rem; |
||||||
|
margin-left: 0; |
||||||
|
padding-left: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.datetimeshortcuts .clock-icon, .datetimeshortcuts .date-icon { |
||||||
|
position: relative; |
||||||
|
display: inline-block; |
||||||
|
vertical-align: middle; |
||||||
|
height: 16px; |
||||||
|
width: 16px; |
||||||
|
overflow: hidden; |
||||||
|
} |
||||||
|
|
||||||
|
.datetimeshortcuts .clock-icon { |
||||||
|
background: url(../img/icon-clock.svg) 0 0 no-repeat; |
||||||
|
} |
||||||
|
|
||||||
|
.datetimeshortcuts a:focus .clock-icon, |
||||||
|
.datetimeshortcuts a:hover .clock-icon { |
||||||
|
background-position: 0 -16px; |
||||||
|
} |
||||||
|
|
||||||
|
.datetimeshortcuts .date-icon { |
||||||
|
background: url(../img/icon-calendar.svg) 0 0 no-repeat; |
||||||
|
top: -1px; |
||||||
|
} |
||||||
|
|
||||||
|
.datetimeshortcuts a:focus .date-icon, |
||||||
|
.datetimeshortcuts a:hover .date-icon { |
||||||
|
background-position: 0 -16px; |
||||||
|
} |
||||||
|
|
||||||
|
.timezonewarning { |
||||||
|
font-size: 0.6875rem; |
||||||
|
color: var(--body-quiet-color); |
||||||
|
} |
||||||
|
|
||||||
|
/* URL */ |
||||||
|
|
||||||
|
p.url { |
||||||
|
line-height: 20px; |
||||||
|
margin: 0; |
||||||
|
padding: 0; |
||||||
|
color: var(--body-quiet-color); |
||||||
|
font-size: 0.6875rem; |
||||||
|
font-weight: bold; |
||||||
|
} |
||||||
|
|
||||||
|
.url a { |
||||||
|
font-weight: normal; |
||||||
|
} |
||||||
|
|
||||||
|
/* FILE UPLOADS */ |
||||||
|
|
||||||
|
p.file-upload { |
||||||
|
line-height: 20px; |
||||||
|
margin: 0; |
||||||
|
padding: 0; |
||||||
|
color: var(--body-quiet-color); |
||||||
|
font-size: 0.6875rem; |
||||||
|
font-weight: bold; |
||||||
|
} |
||||||
|
|
||||||
|
.file-upload a { |
||||||
|
font-weight: normal; |
||||||
|
} |
||||||
|
|
||||||
|
.file-upload .deletelink { |
||||||
|
margin-left: 5px; |
||||||
|
} |
||||||
|
|
||||||
|
span.clearable-file-input label { |
||||||
|
color: var(--body-fg); |
||||||
|
font-size: 0.6875rem; |
||||||
|
display: inline; |
||||||
|
float: none; |
||||||
|
} |
||||||
|
|
||||||
|
/* CALENDARS & CLOCKS */ |
||||||
|
|
||||||
|
.calendarbox, .clockbox { |
||||||
|
margin: 5px auto; |
||||||
|
font-size: 0.75rem; |
||||||
|
width: 19em; |
||||||
|
text-align: center; |
||||||
|
background: var(--body-bg); |
||||||
|
color: var(--body-fg); |
||||||
|
border: 1px solid var(--hairline-color); |
||||||
|
border-radius: 4px; |
||||||
|
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15); |
||||||
|
overflow: hidden; |
||||||
|
position: relative; |
||||||
|
} |
||||||
|
|
||||||
|
.clockbox { |
||||||
|
width: auto; |
||||||
|
} |
||||||
|
|
||||||
|
.calendar { |
||||||
|
margin: 0; |
||||||
|
padding: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.calendar table { |
||||||
|
margin: 0; |
||||||
|
padding: 0; |
||||||
|
border-collapse: collapse; |
||||||
|
background: white; |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
.calendar caption, .calendarbox h2 { |
||||||
|
margin: 0; |
||||||
|
text-align: center; |
||||||
|
border-top: none; |
||||||
|
font-weight: 700; |
||||||
|
font-size: 0.75rem; |
||||||
|
color: #333; |
||||||
|
background: var(--accent); |
||||||
|
} |
||||||
|
|
||||||
|
.calendar th { |
||||||
|
padding: 8px 5px; |
||||||
|
background: var(--darkened-bg); |
||||||
|
border-bottom: 1px solid var(--border-color); |
||||||
|
font-weight: 400; |
||||||
|
font-size: 0.75rem; |
||||||
|
text-align: center; |
||||||
|
color: var(--body-quiet-color); |
||||||
|
} |
||||||
|
|
||||||
|
.calendar td { |
||||||
|
font-weight: 400; |
||||||
|
font-size: 0.75rem; |
||||||
|
text-align: center; |
||||||
|
padding: 0; |
||||||
|
border-top: 1px solid var(--hairline-color); |
||||||
|
border-bottom: none; |
||||||
|
} |
||||||
|
|
||||||
|
.calendar td.selected a { |
||||||
|
background: var(--primary); |
||||||
|
color: var(--button-fg); |
||||||
|
} |
||||||
|
|
||||||
|
.calendar td.nonday { |
||||||
|
background: var(--darkened-bg); |
||||||
|
} |
||||||
|
|
||||||
|
.calendar td.today a { |
||||||
|
font-weight: 700; |
||||||
|
} |
||||||
|
|
||||||
|
.calendar td a, .timelist a { |
||||||
|
display: block; |
||||||
|
font-weight: 400; |
||||||
|
padding: 6px; |
||||||
|
text-decoration: none; |
||||||
|
color: var(--body-quiet-color); |
||||||
|
} |
||||||
|
|
||||||
|
.calendar td a:focus, .timelist a:focus, |
||||||
|
.calendar td a:hover, .timelist a:hover { |
||||||
|
background: var(--primary); |
||||||
|
color: white; |
||||||
|
} |
||||||
|
|
||||||
|
.calendar td a:active, .timelist a:active { |
||||||
|
background: var(--header-bg); |
||||||
|
color: white; |
||||||
|
} |
||||||
|
|
||||||
|
.calendarnav { |
||||||
|
font-size: 0.625rem; |
||||||
|
text-align: center; |
||||||
|
color: #ccc; |
||||||
|
margin: 0; |
||||||
|
padding: 1px 3px; |
||||||
|
} |
||||||
|
|
||||||
|
.calendarnav a:link, #calendarnav a:visited, |
||||||
|
#calendarnav a:focus, #calendarnav a:hover { |
||||||
|
color: var(--body-quiet-color); |
||||||
|
} |
||||||
|
|
||||||
|
.calendar-shortcuts { |
||||||
|
background: var(--body-bg); |
||||||
|
color: var(--body-quiet-color); |
||||||
|
font-size: 0.6875rem; |
||||||
|
line-height: 0.6875rem; |
||||||
|
border-top: 1px solid var(--hairline-color); |
||||||
|
padding: 8px 0; |
||||||
|
} |
||||||
|
|
||||||
|
.calendarbox .calendarnav-previous, .calendarbox .calendarnav-next { |
||||||
|
display: block; |
||||||
|
position: absolute; |
||||||
|
top: 8px; |
||||||
|
width: 15px; |
||||||
|
height: 15px; |
||||||
|
text-indent: -9999px; |
||||||
|
padding: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.calendarnav-previous { |
||||||
|
left: 10px; |
||||||
|
background: url(../img/calendar-icons.svg) 0 0 no-repeat; |
||||||
|
} |
||||||
|
|
||||||
|
.calendarbox .calendarnav-previous:focus, |
||||||
|
.calendarbox .calendarnav-previous:hover { |
||||||
|
background-position: 0 -15px; |
||||||
|
} |
||||||
|
|
||||||
|
.calendarnav-next { |
||||||
|
right: 10px; |
||||||
|
background: url(../img/calendar-icons.svg) 0 -30px no-repeat; |
||||||
|
} |
||||||
|
|
||||||
|
.calendarbox .calendarnav-next:focus, |
||||||
|
.calendarbox .calendarnav-next:hover { |
||||||
|
background-position: 0 -45px; |
||||||
|
} |
||||||
|
|
||||||
|
.calendar-cancel { |
||||||
|
margin: 0; |
||||||
|
padding: 4px 0; |
||||||
|
font-size: 0.75rem; |
||||||
|
background: #eee; |
||||||
|
border-top: 1px solid var(--border-color); |
||||||
|
color: var(--body-fg); |
||||||
|
} |
||||||
|
|
||||||
|
.calendar-cancel:focus, .calendar-cancel:hover { |
||||||
|
background: #ddd; |
||||||
|
} |
||||||
|
|
||||||
|
.calendar-cancel a { |
||||||
|
color: black; |
||||||
|
display: block; |
||||||
|
} |
||||||
|
|
||||||
|
ul.timelist, .timelist li { |
||||||
|
list-style-type: none; |
||||||
|
margin: 0; |
||||||
|
padding: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.timelist a { |
||||||
|
padding: 2px; |
||||||
|
} |
||||||
|
|
||||||
|
/* EDIT INLINE */ |
||||||
|
|
||||||
|
.inline-deletelink { |
||||||
|
float: right; |
||||||
|
text-indent: -9999px; |
||||||
|
background: url(../img/inline-delete.svg) 0 0 no-repeat; |
||||||
|
width: 16px; |
||||||
|
height: 16px; |
||||||
|
border: 0px none; |
||||||
|
} |
||||||
|
|
||||||
|
.inline-deletelink:focus, .inline-deletelink:hover { |
||||||
|
cursor: pointer; |
||||||
|
} |
||||||
|
|
||||||
|
/* RELATED WIDGET WRAPPER */ |
||||||
|
.related-widget-wrapper { |
||||||
|
float: left; /* display properly in form rows with multiple fields */ |
||||||
|
overflow: hidden; /* clear floated contents */ |
||||||
|
} |
||||||
|
|
||||||
|
.related-widget-wrapper-link { |
||||||
|
opacity: 0.3; |
||||||
|
} |
||||||
|
|
||||||
|
.related-widget-wrapper-link:link { |
||||||
|
opacity: .8; |
||||||
|
} |
||||||
|
|
||||||
|
.related-widget-wrapper-link:link:focus, |
||||||
|
.related-widget-wrapper-link:link:hover { |
||||||
|
opacity: 1; |
||||||
|
} |
||||||
|
|
||||||
|
select + .related-widget-wrapper-link, |
||||||
|
.related-widget-wrapper-link + .related-widget-wrapper-link { |
||||||
|
margin-left: 7px; |
||||||
|
} |
||||||
|
|
||||||
|
/* GIS MAPS */ |
||||||
|
.dj_map { |
||||||
|
width: 600px; |
||||||
|
height: 400px; |
||||||
|
} |
@ -0,0 +1,20 @@ |
|||||||
|
The MIT License (MIT) |
||||||
|
|
||||||
|
Copyright (c) 2014 Code Charm Ltd |
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of |
||||||
|
this software and associated documentation files (the "Software"), to deal in |
||||||
|
the Software without restriction, including without limitation the rights to |
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of |
||||||
|
the Software, and to permit persons to whom the Software is furnished to do so, |
||||||
|
subject to the following conditions: |
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all |
||||||
|
copies or substantial portions of the Software. |
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS |
||||||
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR |
||||||
|
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER |
||||||
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
||||||
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
@ -0,0 +1,7 @@ |
|||||||
|
All icons are taken from Font Awesome (http://fontawesome.io/) project. |
||||||
|
The Font Awesome font is licensed under the SIL OFL 1.1: |
||||||
|
- https://scripts.sil.org/OFL |
||||||
|
|
||||||
|
SVG icons source: https://github.com/encharm/Font-Awesome-SVG-PNG |
||||||
|
Font-Awesome-SVG-PNG is licensed under the MIT license (see file license |
||||||
|
in current folder). |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 331 B |
After Width: | Height: | Size: 504 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 380 B |
After Width: | Height: | Size: 677 B |
After Width: | Height: | Size: 392 B |
After Width: | Height: | Size: 560 B |
After Width: | Height: | Size: 655 B |
After Width: | Height: | Size: 655 B |
After Width: | Height: | Size: 581 B |
After Width: | Height: | Size: 436 B |
After Width: | Height: | Size: 560 B |
After Width: | Height: | Size: 458 B |
After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 331 B |
After Width: | Height: | Size: 280 B |
@ -0,0 +1,116 @@ |
|||||||
|
'use strict'; |
||||||
|
{ |
||||||
|
const SelectBox = { |
||||||
|
cache: {}, |
||||||
|
init: function(id) { |
||||||
|
const box = document.getElementById(id); |
||||||
|
SelectBox.cache[id] = []; |
||||||
|
const cache = SelectBox.cache[id]; |
||||||
|
for (const node of box.options) { |
||||||
|
cache.push({value: node.value, text: node.text, displayed: 1}); |
||||||
|
} |
||||||
|
}, |
||||||
|
redisplay: function(id) { |
||||||
|
// Repopulate HTML select box from cache
|
||||||
|
const box = document.getElementById(id); |
||||||
|
const scroll_value_from_top = box.scrollTop; |
||||||
|
box.innerHTML = ''; |
||||||
|
for (const node of SelectBox.cache[id]) { |
||||||
|
if (node.displayed) { |
||||||
|
const new_option = new Option(node.text, node.value, false, false); |
||||||
|
// Shows a tooltip when hovering over the option
|
||||||
|
new_option.title = node.text; |
||||||
|
box.appendChild(new_option); |
||||||
|
} |
||||||
|
} |
||||||
|
box.scrollTop = scroll_value_from_top; |
||||||
|
}, |
||||||
|
filter: function(id, text) { |
||||||
|
// Redisplay the HTML select box, displaying only the choices containing ALL
|
||||||
|
// the words in text. (It's an AND search.)
|
||||||
|
const tokens = text.toLowerCase().split(/\s+/); |
||||||
|
for (const node of SelectBox.cache[id]) { |
||||||
|
node.displayed = 1; |
||||||
|
const node_text = node.text.toLowerCase(); |
||||||
|
for (const token of tokens) { |
||||||
|
if (!node_text.includes(token)) { |
||||||
|
node.displayed = 0; |
||||||
|
break; // Once the first token isn't found we're done
|
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
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]; |
||||||
|
for (const [i, node] of cache.entries()) { |
||||||
|
if (node.value === value) { |
||||||
|
delete_index = i; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
cache.splice(delete_index, 1); |
||||||
|
}, |
||||||
|
add_to_cache: function(id, option) { |
||||||
|
SelectBox.cache[id].push({value: option.value, text: option.text, displayed: 1}); |
||||||
|
}, |
||||||
|
cache_contains: function(id, value) { |
||||||
|
// Check if an item is contained in the cache
|
||||||
|
for (const node of SelectBox.cache[id]) { |
||||||
|
if (node.value === value) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
||||||
|
return false; |
||||||
|
}, |
||||||
|
move: function(from, to) { |
||||||
|
const from_box = document.getElementById(from); |
||||||
|
for (const option of from_box.options) { |
||||||
|
const option_value = option.value; |
||||||
|
if (option.selected && SelectBox.cache_contains(from, option_value)) { |
||||||
|
SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1}); |
||||||
|
SelectBox.delete_from_cache(from, option_value); |
||||||
|
} |
||||||
|
} |
||||||
|
SelectBox.redisplay(from); |
||||||
|
SelectBox.redisplay(to); |
||||||
|
}, |
||||||
|
move_all: function(from, to) { |
||||||
|
const from_box = document.getElementById(from); |
||||||
|
for (const option of from_box.options) { |
||||||
|
const option_value = option.value; |
||||||
|
if (SelectBox.cache_contains(from, option_value)) { |
||||||
|
SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1}); |
||||||
|
SelectBox.delete_from_cache(from, option_value); |
||||||
|
} |
||||||
|
} |
||||||
|
SelectBox.redisplay(from); |
||||||
|
SelectBox.redisplay(to); |
||||||
|
}, |
||||||
|
sort: function(id) { |
||||||
|
SelectBox.cache[id].sort(function(a, b) { |
||||||
|
a = a.text.toLowerCase(); |
||||||
|
b = b.text.toLowerCase(); |
||||||
|
if (a > b) { |
||||||
|
return 1; |
||||||
|
} |
||||||
|
if (a < b) { |
||||||
|
return -1; |
||||||
|
} |
||||||
|
return 0; |
||||||
|
} ); |
||||||
|
}, |
||||||
|
select_all: function(id) { |
||||||
|
const box = document.getElementById(id); |
||||||
|
for (const option of box.options) { |
||||||
|
option.selected = true; |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
window.SelectBox = SelectBox; |
||||||
|
} |
@ -0,0 +1,283 @@ |
|||||||
|
/*global SelectBox, gettext, interpolate, quickElement, SelectFilter*/ |
||||||
|
/* |
||||||
|
SelectFilter2 - Turns a multiple-select box into a filter interface. |
||||||
|
|
||||||
|
Requires core.js and SelectBox.js. |
||||||
|
*/ |
||||||
|
'use strict'; |
||||||
|
{ |
||||||
|
window.SelectFilter = { |
||||||
|
init: function(field_id, field_name, is_stacked) { |
||||||
|
if (field_id.match(/__prefix__/)) { |
||||||
|
// Don't initialize on empty forms.
|
||||||
|
return; |
||||||
|
} |
||||||
|
const from_box = document.getElementById(field_id); |
||||||
|
from_box.id += '_from'; // change its ID
|
||||||
|
from_box.className = 'filtered'; |
||||||
|
|
||||||
|
for (const p of from_box.parentNode.getElementsByTagName('p')) { |
||||||
|
if (p.classList.contains("info")) { |
||||||
|
// Remove <p class="info">, because it just gets in the way.
|
||||||
|
from_box.parentNode.removeChild(p); |
||||||
|
} else if (p.classList.contains("help")) { |
||||||
|
// Move help text up to the top so it isn't below the select
|
||||||
|
// boxes or wrapped off on the side to the right of the add
|
||||||
|
// button:
|
||||||
|
from_box.parentNode.insertBefore(p, from_box.parentNode.firstChild); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// <div class="selector"> or <div class="selector stacked">
|
||||||
|
const selector_div = quickElement('div', from_box.parentNode); |
||||||
|
selector_div.className = is_stacked ? 'selector stacked' : 'selector'; |
||||||
|
|
||||||
|
// <div class="selector-available">
|
||||||
|
const selector_available = quickElement('div', selector_div); |
||||||
|
selector_available.className = 'selector-available'; |
||||||
|
const title_available = quickElement('h2', selector_available, interpolate(gettext('Available %s') + ' ', [field_name])); |
||||||
|
quickElement( |
||||||
|
'span', title_available, '', |
||||||
|
'class', 'help help-tooltip help-icon', |
||||||
|
'title', interpolate( |
||||||
|
gettext( |
||||||
|
'This is the list of available %s. You may choose some by ' + |
||||||
|
'selecting them in the box below and then clicking the ' + |
||||||
|
'"Choose" arrow between the two boxes.' |
||||||
|
), |
||||||
|
[field_name] |
||||||
|
) |
||||||
|
); |
||||||
|
|
||||||
|
const filter_p = quickElement('p', selector_available, '', 'id', field_id + '_filter'); |
||||||
|
filter_p.className = 'selector-filter'; |
||||||
|
|
||||||
|
const search_filter_label = quickElement('label', filter_p, '', 'for', field_id + '_input'); |
||||||
|
|
||||||
|
quickElement( |
||||||
|
'span', search_filter_label, '', |
||||||
|
'class', 'help-tooltip search-label-icon', |
||||||
|
'title', interpolate(gettext("Type into this box to filter down the list of available %s."), [field_name]) |
||||||
|
); |
||||||
|
|
||||||
|
filter_p.appendChild(document.createTextNode(' ')); |
||||||
|
|
||||||
|
const filter_input = quickElement('input', filter_p, '', 'type', 'text', 'placeholder', gettext("Filter")); |
||||||
|
filter_input.id = field_id + '_input'; |
||||||
|
|
||||||
|
selector_available.appendChild(from_box); |
||||||
|
const choose_all = quickElement('a', selector_available, gettext('Choose all'), 'title', interpolate(gettext('Click to choose all %s at once.'), [field_name]), 'href', '#', 'id', field_id + '_add_all_link'); |
||||||
|
choose_all.className = 'selector-chooseall'; |
||||||
|
|
||||||
|
// <ul class="selector-chooser">
|
||||||
|
const selector_chooser = quickElement('ul', selector_div); |
||||||
|
selector_chooser.className = 'selector-chooser'; |
||||||
|
const add_link = quickElement('a', quickElement('li', selector_chooser), gettext('Choose'), 'title', gettext('Choose'), 'href', '#', 'id', field_id + '_add_link'); |
||||||
|
add_link.className = 'selector-add'; |
||||||
|
const remove_link = quickElement('a', quickElement('li', selector_chooser), gettext('Remove'), 'title', gettext('Remove'), 'href', '#', 'id', field_id + '_remove_link'); |
||||||
|
remove_link.className = 'selector-remove'; |
||||||
|
|
||||||
|
// <div class="selector-chosen">
|
||||||
|
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( |
||||||
|
'span', title_chosen, '', |
||||||
|
'class', 'help help-tooltip help-icon', |
||||||
|
'title', interpolate( |
||||||
|
gettext( |
||||||
|
'This is the list of chosen %s. You may remove some by ' + |
||||||
|
'selecting them in the box below and then clicking the ' + |
||||||
|
'"Remove" arrow between the two boxes.' |
||||||
|
), |
||||||
|
[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'; |
||||||
|
|
||||||
|
from_box.name = from_box.name + '_old'; |
||||||
|
|
||||||
|
// Set up the JavaScript event handlers for the select box filter interface
|
||||||
|
const move_selection = function(e, elem, move_func, from, to) { |
||||||
|
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(); |
||||||
|
}; |
||||||
|
choose_all.addEventListener('click', function(e) { |
||||||
|
move_selection(e, this, SelectBox.move_all, field_id + '_from', field_id + '_to'); |
||||||
|
}); |
||||||
|
add_link.addEventListener('click', function(e) { |
||||||
|
move_selection(e, this, SelectBox.move, field_id + '_from', field_id + '_to'); |
||||||
|
}); |
||||||
|
remove_link.addEventListener('click', function(e) { |
||||||
|
move_selection(e, this, SelectBox.move, field_id + '_to', field_id + '_from'); |
||||||
|
}); |
||||||
|
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, '_from', '_to'); |
||||||
|
}); |
||||||
|
filter_input.addEventListener('keyup', function(e) { |
||||||
|
SelectFilter.filter_key_up(e, field_id, '_from'); |
||||||
|
}); |
||||||
|
filter_input.addEventListener('keydown', function(e) { |
||||||
|
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') { |
||||||
|
SelectFilter.refresh_icons(field_id); |
||||||
|
} |
||||||
|
}); |
||||||
|
selector_div.addEventListener('dblclick', function(e) { |
||||||
|
if (e.target.tagName === 'OPTION') { |
||||||
|
if (e.target.closest('select').id === field_id + '_to') { |
||||||
|
SelectBox.move(field_id + '_to', field_id + '_from'); |
||||||
|
} else { |
||||||
|
SelectBox.move(field_id + '_from', field_id + '_to'); |
||||||
|
} |
||||||
|
SelectFilter.refresh_icons(field_id); |
||||||
|
} |
||||||
|
}); |
||||||
|
from_box.closest('form').addEventListener('submit', function() { |
||||||
|
SelectBox.filter(field_id + '_to', ''); |
||||||
|
SelectBox.select_all(field_id + '_to'); |
||||||
|
}); |
||||||
|
SelectBox.init(field_id + '_from'); |
||||||
|
SelectBox.init(field_id + '_to'); |
||||||
|
// Move selected from_box options to to_box
|
||||||
|
SelectBox.move(field_id + '_from', field_id + '_to'); |
||||||
|
|
||||||
|
// Initial icon refresh
|
||||||
|
SelectFilter.refresh_icons(field_id); |
||||||
|
}, |
||||||
|
any_selected: function(field) { |
||||||
|
// Temporarily add the required attribute and check validity.
|
||||||
|
field.required = true; |
||||||
|
const any_selected = field.checkValidity(); |
||||||
|
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'); |
||||||
|
// Active if at least one item is selected
|
||||||
|
document.getElementById(field_id + '_add_link').classList.toggle('active', SelectFilter.any_selected(from)); |
||||||
|
document.getElementById(field_id + '_remove_link').classList.toggle('active', SelectFilter.any_selected(to)); |
||||||
|
// 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, 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)) { |
||||||
|
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, 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, 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 === 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)) { |
||||||
|
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)) { |
||||||
|
source_box.selectedIndex = (source_box.selectedIndex === 0) ? source_box.length - 1 : source_box.selectedIndex - 1; |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
window.addEventListener('load', function(e) { |
||||||
|
document.querySelectorAll('select.selectfilter, select.selectfilterstacked').forEach(function(el) { |
||||||
|
const data = el.dataset; |
||||||
|
SelectFilter.init(el.id, data.fieldName, parseInt(data.isStacked, 10)); |
||||||
|
}); |
||||||
|
}); |
||||||
|
} |
@ -0,0 +1,201 @@ |
|||||||
|
/*global gettext, interpolate, ngettext*/ |
||||||
|
'use strict'; |
||||||
|
{ |
||||||
|
function show(selector) { |
||||||
|
document.querySelectorAll(selector).forEach(function(el) { |
||||||
|
el.classList.remove('hidden'); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
function hide(selector) { |
||||||
|
document.querySelectorAll(selector).forEach(function(el) { |
||||||
|
el.classList.add('hidden'); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
function showQuestion(options) { |
||||||
|
hide(options.acrossClears); |
||||||
|
show(options.acrossQuestions); |
||||||
|
hide(options.allContainer); |
||||||
|
} |
||||||
|
|
||||||
|
function showClear(options) { |
||||||
|
show(options.acrossClears); |
||||||
|
hide(options.acrossQuestions); |
||||||
|
document.querySelector(options.actionContainer).classList.remove(options.selectedClass); |
||||||
|
show(options.allContainer); |
||||||
|
hide(options.counterContainer); |
||||||
|
} |
||||||
|
|
||||||
|
function reset(options) { |
||||||
|
hide(options.acrossClears); |
||||||
|
hide(options.acrossQuestions); |
||||||
|
hide(options.allContainer); |
||||||
|
show(options.counterContainer); |
||||||
|
} |
||||||
|
|
||||||
|
function clearAcross(options) { |
||||||
|
reset(options); |
||||||
|
const acrossInputs = document.querySelectorAll(options.acrossInput); |
||||||
|
acrossInputs.forEach(function(acrossInput) { |
||||||
|
acrossInput.value = 0; |
||||||
|
}); |
||||||
|
document.querySelector(options.actionContainer).classList.remove(options.selectedClass); |
||||||
|
} |
||||||
|
|
||||||
|
function checker(actionCheckboxes, options, checked) { |
||||||
|
if (checked) { |
||||||
|
showQuestion(options); |
||||||
|
} else { |
||||||
|
reset(options); |
||||||
|
} |
||||||
|
actionCheckboxes.forEach(function(el) { |
||||||
|
el.checked = checked; |
||||||
|
el.closest('tr').classList.toggle(options.selectedClass, checked); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
function updateCounter(actionCheckboxes, options) { |
||||||
|
const sel = Array.from(actionCheckboxes).filter(function(el) { |
||||||
|
return el.checked; |
||||||
|
}).length; |
||||||
|
const counter = document.querySelector(options.counterContainer); |
||||||
|
// data-actions-icnt is defined in the generated HTML
|
||||||
|
// and contains the total amount of objects in the queryset
|
||||||
|
const actions_icnt = Number(counter.dataset.actionsIcnt); |
||||||
|
counter.textContent = interpolate( |
||||||
|
ngettext('%(sel)s of %(cnt)s selected', '%(sel)s of %(cnt)s selected', sel), { |
||||||
|
sel: sel, |
||||||
|
cnt: actions_icnt |
||||||
|
}, true); |
||||||
|
const allToggle = document.getElementById(options.allToggleId); |
||||||
|
allToggle.checked = sel === actionCheckboxes.length; |
||||||
|
if (allToggle.checked) { |
||||||
|
showQuestion(options); |
||||||
|
} else { |
||||||
|
clearAcross(options); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
const defaults = { |
||||||
|
actionContainer: "div.actions", |
||||||
|
counterContainer: "span.action-counter", |
||||||
|
allContainer: "div.actions span.all", |
||||||
|
acrossInput: "div.actions input.select-across", |
||||||
|
acrossQuestions: "div.actions span.question", |
||||||
|
acrossClears: "div.actions span.clear", |
||||||
|
allToggleId: "action-toggle", |
||||||
|
selectedClass: "selected" |
||||||
|
}; |
||||||
|
|
||||||
|
window.Actions = function(actionCheckboxes, options) { |
||||||
|
options = Object.assign({}, defaults, options); |
||||||
|
let list_editable_changed = false; |
||||||
|
let lastChecked = null; |
||||||
|
let shiftPressed = false; |
||||||
|
|
||||||
|
document.addEventListener('keydown', (event) => { |
||||||
|
shiftPressed = event.shiftKey; |
||||||
|
}); |
||||||
|
|
||||||
|
document.addEventListener('keyup', (event) => { |
||||||
|
shiftPressed = event.shiftKey; |
||||||
|
}); |
||||||
|
|
||||||
|
document.getElementById(options.allToggleId).addEventListener('click', function(event) { |
||||||
|
checker(actionCheckboxes, options, this.checked); |
||||||
|
updateCounter(actionCheckboxes, options); |
||||||
|
}); |
||||||
|
|
||||||
|
document.querySelectorAll(options.acrossQuestions + " a").forEach(function(el) { |
||||||
|
el.addEventListener('click', function(event) { |
||||||
|
event.preventDefault(); |
||||||
|
const acrossInputs = document.querySelectorAll(options.acrossInput); |
||||||
|
acrossInputs.forEach(function(acrossInput) { |
||||||
|
acrossInput.value = 1; |
||||||
|
}); |
||||||
|
showClear(options); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
document.querySelectorAll(options.acrossClears + " a").forEach(function(el) { |
||||||
|
el.addEventListener('click', function(event) { |
||||||
|
event.preventDefault(); |
||||||
|
document.getElementById(options.allToggleId).checked = false; |
||||||
|
clearAcross(options); |
||||||
|
checker(actionCheckboxes, options, false); |
||||||
|
updateCounter(actionCheckboxes, options); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
function affectedCheckboxes(target, withModifier) { |
||||||
|
const multiSelect = (lastChecked && withModifier && lastChecked !== target); |
||||||
|
if (!multiSelect) { |
||||||
|
return [target]; |
||||||
|
} |
||||||
|
const checkboxes = Array.from(actionCheckboxes); |
||||||
|
const targetIndex = checkboxes.findIndex(el => el === target); |
||||||
|
const lastCheckedIndex = checkboxes.findIndex(el => el === lastChecked); |
||||||
|
const startIndex = Math.min(targetIndex, lastCheckedIndex); |
||||||
|
const endIndex = Math.max(targetIndex, lastCheckedIndex); |
||||||
|
const filtered = checkboxes.filter((el, index) => (startIndex <= index) && (index <= endIndex)); |
||||||
|
return filtered; |
||||||
|
}; |
||||||
|
|
||||||
|
Array.from(document.getElementById('result_list').tBodies).forEach(function(el) { |
||||||
|
el.addEventListener('change', function(event) { |
||||||
|
const target = event.target; |
||||||
|
if (target.classList.contains('action-select')) { |
||||||
|
const checkboxes = affectedCheckboxes(target, shiftPressed); |
||||||
|
checker(checkboxes, options, target.checked); |
||||||
|
updateCounter(actionCheckboxes, options); |
||||||
|
lastChecked = target; |
||||||
|
} else { |
||||||
|
list_editable_changed = true; |
||||||
|
} |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
document.querySelector('#changelist-form button[name=index]').addEventListener('click', function(event) { |
||||||
|
if (list_editable_changed) { |
||||||
|
const confirmed = confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost.")); |
||||||
|
if (!confirmed) { |
||||||
|
event.preventDefault(); |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
const el = document.querySelector('#changelist-form input[name=_save]'); |
||||||
|
// The button does not exist if no fields are editable.
|
||||||
|
if (el) { |
||||||
|
el.addEventListener('click', function(event) { |
||||||
|
if (document.querySelector('[name=action]').value) { |
||||||
|
const text = list_editable_changed |
||||||
|
? gettext("You have selected an action, but you haven’t saved your changes to individual fields yet. Please click OK to save. You’ll need to re-run the action.") |
||||||
|
: gettext("You have selected an action, and you haven’t made any changes on individual fields. You’re probably looking for the Go button rather than the Save button."); |
||||||
|
if (!confirm(text)) { |
||||||
|
event.preventDefault(); |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
// Call function fn when the DOM is loaded and ready. If it is already
|
||||||
|
// loaded, call the function now.
|
||||||
|
// http://youmightnotneedjquery.com/#ready
|
||||||
|
function ready(fn) { |
||||||
|
if (document.readyState !== 'loading') { |
||||||
|
fn(); |
||||||
|
} else { |
||||||
|
document.addEventListener('DOMContentLoaded', fn); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
ready(function() { |
||||||
|
const actionsEls = document.querySelectorAll('tr input.action-select'); |
||||||
|
if (actionsEls.length > 0) { |
||||||
|
Actions(actionsEls); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
@ -0,0 +1,408 @@ |
|||||||
|
/*global Calendar, findPosX, findPosY, get_format, gettext, gettext_noop, interpolate, ngettext, quickElement*/ |
||||||
|
// Inserts shortcut buttons after all of the following:
|
||||||
|
// <input type="text" class="vDateField">
|
||||||
|
// <input type="text" class="vTimeField">
|
||||||
|
'use strict'; |
||||||
|
{ |
||||||
|
const DateTimeShortcuts = { |
||||||
|
calendars: [], |
||||||
|
calendarInputs: [], |
||||||
|
clockInputs: [], |
||||||
|
clockHours: { |
||||||
|
default_: [ |
||||||
|
[gettext_noop('Now'), -1], |
||||||
|
[gettext_noop('Midnight'), 0], |
||||||
|
[gettext_noop('6 a.m.'), 6], |
||||||
|
[gettext_noop('Noon'), 12], |
||||||
|
[gettext_noop('6 p.m.'), 18] |
||||||
|
] |
||||||
|
}, |
||||||
|
dismissClockFunc: [], |
||||||
|
dismissCalendarFunc: [], |
||||||
|
calendarDivName1: 'calendarbox', // name of calendar <div> that gets toggled
|
||||||
|
calendarDivName2: 'calendarin', // name of <div> that contains calendar
|
||||||
|
calendarLinkName: 'calendarlink', // name of the link that is used to toggle
|
||||||
|
clockDivName: 'clockbox', // name of clock <div> that gets toggled
|
||||||
|
clockLinkName: 'clocklink', // name of the link that is used to toggle
|
||||||
|
shortCutsClass: 'datetimeshortcuts', // class of the clock and cal shortcuts
|
||||||
|
timezoneWarningClass: 'timezonewarning', // class of the warning for timezone mismatch
|
||||||
|
timezoneOffset: 0, |
||||||
|
init: function() { |
||||||
|
const serverOffset = document.body.dataset.adminUtcOffset; |
||||||
|
if (serverOffset) { |
||||||
|
const localOffset = new Date().getTimezoneOffset() * -60; |
||||||
|
DateTimeShortcuts.timezoneOffset = localOffset - serverOffset; |
||||||
|
} |
||||||
|
|
||||||
|
for (const inp of document.getElementsByTagName('input')) { |
||||||
|
if (inp.type === 'text' && inp.classList.contains('vTimeField')) { |
||||||
|
DateTimeShortcuts.addClock(inp); |
||||||
|
DateTimeShortcuts.addTimezoneWarning(inp); |
||||||
|
} |
||||||
|
else if (inp.type === 'text' && inp.classList.contains('vDateField')) { |
||||||
|
DateTimeShortcuts.addCalendar(inp); |
||||||
|
DateTimeShortcuts.addTimezoneWarning(inp); |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
// Return the current time while accounting for the server timezone.
|
||||||
|
now: function() { |
||||||
|
const serverOffset = document.body.dataset.adminUtcOffset; |
||||||
|
if (serverOffset) { |
||||||
|
const localNow = new Date(); |
||||||
|
const localOffset = localNow.getTimezoneOffset() * -60; |
||||||
|
localNow.setTime(localNow.getTime() + 1000 * (serverOffset - localOffset)); |
||||||
|
return localNow; |
||||||
|
} else { |
||||||
|
return new Date(); |
||||||
|
} |
||||||
|
}, |
||||||
|
// Add a warning when the time zone in the browser and backend do not match.
|
||||||
|
addTimezoneWarning: function(inp) { |
||||||
|
const warningClass = DateTimeShortcuts.timezoneWarningClass; |
||||||
|
let timezoneOffset = DateTimeShortcuts.timezoneOffset / 3600; |
||||||
|
|
||||||
|
// Only warn if there is a time zone mismatch.
|
||||||
|
if (!timezoneOffset) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
// Check if warning is already there.
|
||||||
|
if (inp.parentNode.querySelectorAll('.' + warningClass).length) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
let message; |
||||||
|
if (timezoneOffset > 0) { |
||||||
|
message = ngettext( |
||||||
|
'Note: You are %s hour ahead of server time.', |
||||||
|
'Note: You are %s hours ahead of server time.', |
||||||
|
timezoneOffset |
||||||
|
); |
||||||
|
} |
||||||
|
else { |
||||||
|
timezoneOffset *= -1; |
||||||
|
message = ngettext( |
||||||
|
'Note: You are %s hour behind server time.', |
||||||
|
'Note: You are %s hours behind server time.', |
||||||
|
timezoneOffset |
||||||
|
); |
||||||
|
} |
||||||
|
message = interpolate(message, [timezoneOffset]); |
||||||
|
|
||||||
|
const warning = document.createElement('div'); |
||||||
|
warning.classList.add('help', warningClass); |
||||||
|
warning.textContent = message; |
||||||
|
inp.parentNode.appendChild(warning); |
||||||
|
}, |
||||||
|
// Add clock widget to a given field
|
||||||
|
addClock: function(inp) { |
||||||
|
const num = DateTimeShortcuts.clockInputs.length; |
||||||
|
DateTimeShortcuts.clockInputs[num] = inp; |
||||||
|
DateTimeShortcuts.dismissClockFunc[num] = function() { DateTimeShortcuts.dismissClock(num); return true; }; |
||||||
|
|
||||||
|
// Shortcut links (clock icon and "Now" link)
|
||||||
|
const shortcuts_span = document.createElement('span'); |
||||||
|
shortcuts_span.className = DateTimeShortcuts.shortCutsClass; |
||||||
|
inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling); |
||||||
|
const now_link = document.createElement('a'); |
||||||
|
now_link.href = "#"; |
||||||
|
now_link.textContent = gettext('Now'); |
||||||
|
now_link.addEventListener('click', function(e) { |
||||||
|
e.preventDefault(); |
||||||
|
DateTimeShortcuts.handleClockQuicklink(num, -1); |
||||||
|
}); |
||||||
|
const clock_link = document.createElement('a'); |
||||||
|
clock_link.href = '#'; |
||||||
|
clock_link.id = DateTimeShortcuts.clockLinkName + num; |
||||||
|
clock_link.addEventListener('click', function(e) { |
||||||
|
e.preventDefault(); |
||||||
|
// avoid triggering the document click handler to dismiss the clock
|
||||||
|
e.stopPropagation(); |
||||||
|
DateTimeShortcuts.openClock(num); |
||||||
|
}); |
||||||
|
|
||||||
|
quickElement( |
||||||
|
'span', clock_link, '', |
||||||
|
'class', 'clock-icon', |
||||||
|
'title', gettext('Choose a Time') |
||||||
|
); |
||||||
|
shortcuts_span.appendChild(document.createTextNode('\u00A0')); |
||||||
|
shortcuts_span.appendChild(now_link); |
||||||
|
shortcuts_span.appendChild(document.createTextNode('\u00A0|\u00A0')); |
||||||
|
shortcuts_span.appendChild(clock_link); |
||||||
|
|
||||||
|
// Create clock link div
|
||||||
|
//
|
||||||
|
// Markup looks like:
|
||||||
|
// <div id="clockbox1" class="clockbox module">
|
||||||
|
// <h2>Choose a time</h2>
|
||||||
|
// <ul class="timelist">
|
||||||
|
// <li><a href="#">Now</a></li>
|
||||||
|
// <li><a href="#">Midnight</a></li>
|
||||||
|
// <li><a href="#">6 a.m.</a></li>
|
||||||
|
// <li><a href="#">Noon</a></li>
|
||||||
|
// <li><a href="#">6 p.m.</a></li>
|
||||||
|
// </ul>
|
||||||
|
// <p class="calendar-cancel"><a href="#">Cancel</a></p>
|
||||||
|
// </div>
|
||||||
|
|
||||||
|
const clock_box = document.createElement('div'); |
||||||
|
clock_box.style.display = 'none'; |
||||||
|
clock_box.style.position = 'absolute'; |
||||||
|
clock_box.className = 'clockbox module'; |
||||||
|
clock_box.id = DateTimeShortcuts.clockDivName + num; |
||||||
|
document.body.appendChild(clock_box); |
||||||
|
clock_box.addEventListener('click', function(e) { e.stopPropagation(); }); |
||||||
|
|
||||||
|
quickElement('h2', clock_box, gettext('Choose a time')); |
||||||
|
const time_list = quickElement('ul', clock_box); |
||||||
|
time_list.className = 'timelist'; |
||||||
|
// The list of choices can be overridden in JavaScript like this:
|
||||||
|
// DateTimeShortcuts.clockHours.name = [['3 a.m.', 3]];
|
||||||
|
// where name is the name attribute of the <input>.
|
||||||
|
const name = typeof DateTimeShortcuts.clockHours[inp.name] === 'undefined' ? 'default_' : inp.name; |
||||||
|
DateTimeShortcuts.clockHours[name].forEach(function(element) { |
||||||
|
const time_link = quickElement('a', quickElement('li', time_list), gettext(element[0]), 'href', '#'); |
||||||
|
time_link.addEventListener('click', function(e) { |
||||||
|
e.preventDefault(); |
||||||
|
DateTimeShortcuts.handleClockQuicklink(num, element[1]); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
const cancel_p = quickElement('p', clock_box); |
||||||
|
cancel_p.className = 'calendar-cancel'; |
||||||
|
const cancel_link = quickElement('a', cancel_p, gettext('Cancel'), 'href', '#'); |
||||||
|
cancel_link.addEventListener('click', function(e) { |
||||||
|
e.preventDefault(); |
||||||
|
DateTimeShortcuts.dismissClock(num); |
||||||
|
}); |
||||||
|
|
||||||
|
document.addEventListener('keyup', function(event) { |
||||||
|
if (event.which === 27) { |
||||||
|
// ESC key closes popup
|
||||||
|
DateTimeShortcuts.dismissClock(num); |
||||||
|
event.preventDefault(); |
||||||
|
} |
||||||
|
}); |
||||||
|
}, |
||||||
|
openClock: function(num) { |
||||||
|
const clock_box = document.getElementById(DateTimeShortcuts.clockDivName + num); |
||||||
|
const clock_link = document.getElementById(DateTimeShortcuts.clockLinkName + num); |
||||||
|
|
||||||
|
// Recalculate the clockbox position
|
||||||
|
// is it left-to-right or right-to-left layout ?
|
||||||
|
if (window.getComputedStyle(document.body).direction !== 'rtl') { |
||||||
|
clock_box.style.left = findPosX(clock_link) + 17 + 'px'; |
||||||
|
} |
||||||
|
else { |
||||||
|
// since style's width is in em, it'd be tough to calculate
|
||||||
|
// px value of it. let's use an estimated px for now
|
||||||
|
clock_box.style.left = findPosX(clock_link) - 110 + 'px'; |
||||||
|
} |
||||||
|
clock_box.style.top = Math.max(0, findPosY(clock_link) - 30) + 'px'; |
||||||
|
|
||||||
|
// Show the clock box
|
||||||
|
clock_box.style.display = 'block'; |
||||||
|
document.addEventListener('click', DateTimeShortcuts.dismissClockFunc[num]); |
||||||
|
}, |
||||||
|
dismissClock: function(num) { |
||||||
|
document.getElementById(DateTimeShortcuts.clockDivName + num).style.display = 'none'; |
||||||
|
document.removeEventListener('click', DateTimeShortcuts.dismissClockFunc[num]); |
||||||
|
}, |
||||||
|
handleClockQuicklink: function(num, val) { |
||||||
|
let d; |
||||||
|
if (val === -1) { |
||||||
|
d = DateTimeShortcuts.now(); |
||||||
|
} |
||||||
|
else { |
||||||
|
d = new Date(1970, 1, 1, val, 0, 0, 0); |
||||||
|
} |
||||||
|
DateTimeShortcuts.clockInputs[num].value = d.strftime(get_format('TIME_INPUT_FORMATS')[0]); |
||||||
|
DateTimeShortcuts.clockInputs[num].focus(); |
||||||
|
DateTimeShortcuts.dismissClock(num); |
||||||
|
}, |
||||||
|
// Add calendar widget to a given field.
|
||||||
|
addCalendar: function(inp) { |
||||||
|
const num = DateTimeShortcuts.calendars.length; |
||||||
|
|
||||||
|
DateTimeShortcuts.calendarInputs[num] = inp; |
||||||
|
DateTimeShortcuts.dismissCalendarFunc[num] = function() { DateTimeShortcuts.dismissCalendar(num); return true; }; |
||||||
|
|
||||||
|
// Shortcut links (calendar icon and "Today" link)
|
||||||
|
const shortcuts_span = document.createElement('span'); |
||||||
|
shortcuts_span.className = DateTimeShortcuts.shortCutsClass; |
||||||
|
inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling); |
||||||
|
const today_link = document.createElement('a'); |
||||||
|
today_link.href = '#'; |
||||||
|
today_link.appendChild(document.createTextNode(gettext('Today'))); |
||||||
|
today_link.addEventListener('click', function(e) { |
||||||
|
e.preventDefault(); |
||||||
|
DateTimeShortcuts.handleCalendarQuickLink(num, 0); |
||||||
|
}); |
||||||
|
const cal_link = document.createElement('a'); |
||||||
|
cal_link.href = '#'; |
||||||
|
cal_link.id = DateTimeShortcuts.calendarLinkName + num; |
||||||
|
cal_link.addEventListener('click', function(e) { |
||||||
|
e.preventDefault(); |
||||||
|
// avoid triggering the document click handler to dismiss the calendar
|
||||||
|
e.stopPropagation(); |
||||||
|
DateTimeShortcuts.openCalendar(num); |
||||||
|
}); |
||||||
|
quickElement( |
||||||
|
'span', cal_link, '', |
||||||
|
'class', 'date-icon', |
||||||
|
'title', gettext('Choose a Date') |
||||||
|
); |
||||||
|
shortcuts_span.appendChild(document.createTextNode('\u00A0')); |
||||||
|
shortcuts_span.appendChild(today_link); |
||||||
|
shortcuts_span.appendChild(document.createTextNode('\u00A0|\u00A0')); |
||||||
|
shortcuts_span.appendChild(cal_link); |
||||||
|
|
||||||
|
// Create calendarbox div.
|
||||||
|
//
|
||||||
|
// Markup looks like:
|
||||||
|
//
|
||||||
|
// <div id="calendarbox3" class="calendarbox module">
|
||||||
|
// <h2>
|
||||||
|
// <a href="#" class="link-previous">‹</a>
|
||||||
|
// <a href="#" class="link-next">›</a> February 2003
|
||||||
|
// </h2>
|
||||||
|
// <div class="calendar" id="calendarin3">
|
||||||
|
// <!-- (cal) -->
|
||||||
|
// </div>
|
||||||
|
// <div class="calendar-shortcuts">
|
||||||
|
// <a href="#">Yesterday</a> | <a href="#">Today</a> | <a href="#">Tomorrow</a>
|
||||||
|
// </div>
|
||||||
|
// <p class="calendar-cancel"><a href="#">Cancel</a></p>
|
||||||
|
// </div>
|
||||||
|
const cal_box = document.createElement('div'); |
||||||
|
cal_box.style.display = 'none'; |
||||||
|
cal_box.style.position = 'absolute'; |
||||||
|
cal_box.className = 'calendarbox module'; |
||||||
|
cal_box.id = DateTimeShortcuts.calendarDivName1 + num; |
||||||
|
document.body.appendChild(cal_box); |
||||||
|
cal_box.addEventListener('click', function(e) { e.stopPropagation(); }); |
||||||
|
|
||||||
|
// next-prev links
|
||||||
|
const cal_nav = quickElement('div', cal_box); |
||||||
|
const cal_nav_prev = quickElement('a', cal_nav, '<', 'href', '#'); |
||||||
|
cal_nav_prev.className = 'calendarnav-previous'; |
||||||
|
cal_nav_prev.addEventListener('click', function(e) { |
||||||
|
e.preventDefault(); |
||||||
|
DateTimeShortcuts.drawPrev(num); |
||||||
|
}); |
||||||
|
|
||||||
|
const cal_nav_next = quickElement('a', cal_nav, '>', 'href', '#'); |
||||||
|
cal_nav_next.className = 'calendarnav-next'; |
||||||
|
cal_nav_next.addEventListener('click', function(e) { |
||||||
|
e.preventDefault(); |
||||||
|
DateTimeShortcuts.drawNext(num); |
||||||
|
}); |
||||||
|
|
||||||
|
// main box
|
||||||
|
const cal_main = quickElement('div', cal_box, '', 'id', DateTimeShortcuts.calendarDivName2 + num); |
||||||
|
cal_main.className = 'calendar'; |
||||||
|
DateTimeShortcuts.calendars[num] = new Calendar(DateTimeShortcuts.calendarDivName2 + num, DateTimeShortcuts.handleCalendarCallback(num)); |
||||||
|
DateTimeShortcuts.calendars[num].drawCurrent(); |
||||||
|
|
||||||
|
// calendar shortcuts
|
||||||
|
const shortcuts = quickElement('div', cal_box); |
||||||
|
shortcuts.className = 'calendar-shortcuts'; |
||||||
|
let day_link = quickElement('a', shortcuts, gettext('Yesterday'), 'href', '#'); |
||||||
|
day_link.addEventListener('click', function(e) { |
||||||
|
e.preventDefault(); |
||||||
|
DateTimeShortcuts.handleCalendarQuickLink(num, -1); |
||||||
|
}); |
||||||
|
shortcuts.appendChild(document.createTextNode('\u00A0|\u00A0')); |
||||||
|
day_link = quickElement('a', shortcuts, gettext('Today'), 'href', '#'); |
||||||
|
day_link.addEventListener('click', function(e) { |
||||||
|
e.preventDefault(); |
||||||
|
DateTimeShortcuts.handleCalendarQuickLink(num, 0); |
||||||
|
}); |
||||||
|
shortcuts.appendChild(document.createTextNode('\u00A0|\u00A0')); |
||||||
|
day_link = quickElement('a', shortcuts, gettext('Tomorrow'), 'href', '#'); |
||||||
|
day_link.addEventListener('click', function(e) { |
||||||
|
e.preventDefault(); |
||||||
|
DateTimeShortcuts.handleCalendarQuickLink(num, +1); |
||||||
|
}); |
||||||
|
|
||||||
|
// cancel bar
|
||||||
|
const cancel_p = quickElement('p', cal_box); |
||||||
|
cancel_p.className = 'calendar-cancel'; |
||||||
|
const cancel_link = quickElement('a', cancel_p, gettext('Cancel'), 'href', '#'); |
||||||
|
cancel_link.addEventListener('click', function(e) { |
||||||
|
e.preventDefault(); |
||||||
|
DateTimeShortcuts.dismissCalendar(num); |
||||||
|
}); |
||||||
|
document.addEventListener('keyup', function(event) { |
||||||
|
if (event.which === 27) { |
||||||
|
// ESC key closes popup
|
||||||
|
DateTimeShortcuts.dismissCalendar(num); |
||||||
|
event.preventDefault(); |
||||||
|
} |
||||||
|
}); |
||||||
|
}, |
||||||
|
openCalendar: function(num) { |
||||||
|
const cal_box = document.getElementById(DateTimeShortcuts.calendarDivName1 + num); |
||||||
|
const cal_link = document.getElementById(DateTimeShortcuts.calendarLinkName + num); |
||||||
|
const inp = DateTimeShortcuts.calendarInputs[num]; |
||||||
|
|
||||||
|
// Determine if the current value in the input has a valid date.
|
||||||
|
// If so, draw the calendar with that date's year and month.
|
||||||
|
if (inp.value) { |
||||||
|
const format = get_format('DATE_INPUT_FORMATS')[0]; |
||||||
|
const selected = inp.value.strptime(format); |
||||||
|
const year = selected.getUTCFullYear(); |
||||||
|
const month = selected.getUTCMonth() + 1; |
||||||
|
const re = /\d{4}/; |
||||||
|
if (re.test(year.toString()) && month >= 1 && month <= 12) { |
||||||
|
DateTimeShortcuts.calendars[num].drawDate(month, year, selected); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Recalculate the clockbox position
|
||||||
|
// is it left-to-right or right-to-left layout ?
|
||||||
|
if (window.getComputedStyle(document.body).direction !== 'rtl') { |
||||||
|
cal_box.style.left = findPosX(cal_link) + 17 + 'px'; |
||||||
|
} |
||||||
|
else { |
||||||
|
// since style's width is in em, it'd be tough to calculate
|
||||||
|
// px value of it. let's use an estimated px for now
|
||||||
|
cal_box.style.left = findPosX(cal_link) - 180 + 'px'; |
||||||
|
} |
||||||
|
cal_box.style.top = Math.max(0, findPosY(cal_link) - 75) + 'px'; |
||||||
|
|
||||||
|
cal_box.style.display = 'block'; |
||||||
|
document.addEventListener('click', DateTimeShortcuts.dismissCalendarFunc[num]); |
||||||
|
}, |
||||||
|
dismissCalendar: function(num) { |
||||||
|
document.getElementById(DateTimeShortcuts.calendarDivName1 + num).style.display = 'none'; |
||||||
|
document.removeEventListener('click', DateTimeShortcuts.dismissCalendarFunc[num]); |
||||||
|
}, |
||||||
|
drawPrev: function(num) { |
||||||
|
DateTimeShortcuts.calendars[num].drawPreviousMonth(); |
||||||
|
}, |
||||||
|
drawNext: function(num) { |
||||||
|
DateTimeShortcuts.calendars[num].drawNextMonth(); |
||||||
|
}, |
||||||
|
handleCalendarCallback: function(num) { |
||||||
|
const format = get_format('DATE_INPUT_FORMATS')[0]; |
||||||
|
return function(y, m, d) { |
||||||
|
DateTimeShortcuts.calendarInputs[num].value = new Date(y, m - 1, d).strftime(format); |
||||||
|
DateTimeShortcuts.calendarInputs[num].focus(); |
||||||
|
document.getElementById(DateTimeShortcuts.calendarDivName1 + num).style.display = 'none'; |
||||||
|
}; |
||||||
|
}, |
||||||
|
handleCalendarQuickLink: function(num, offset) { |
||||||
|
const d = DateTimeShortcuts.now(); |
||||||
|
d.setDate(d.getDate() + offset); |
||||||
|
DateTimeShortcuts.calendarInputs[num].value = d.strftime(get_format('DATE_INPUT_FORMATS')[0]); |
||||||
|
DateTimeShortcuts.calendarInputs[num].focus(); |
||||||
|
DateTimeShortcuts.dismissCalendar(num); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
window.addEventListener('load', DateTimeShortcuts.init); |
||||||
|
window.DateTimeShortcuts = DateTimeShortcuts; |
||||||
|
} |
@ -0,0 +1,238 @@ |
|||||||
|
/*global SelectBox, interpolate*/ |
||||||
|
// Handles related-objects functionality: lookup link for raw_id_fields
|
||||||
|
// and Add Another links.
|
||||||
|
'use strict'; |
||||||
|
{ |
||||||
|
const $ = django.jQuery; |
||||||
|
let popupIndex = 0; |
||||||
|
const relatedWindows = []; |
||||||
|
|
||||||
|
function dismissChildPopups() { |
||||||
|
relatedWindows.forEach(function(win) { |
||||||
|
if(!win.closed) { |
||||||
|
win.dismissChildPopups(); |
||||||
|
win.close();
|
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
function setPopupIndex() { |
||||||
|
if(document.getElementsByName("_popup").length > 0) { |
||||||
|
const index = window.name.lastIndexOf("__") + 2; |
||||||
|
popupIndex = parseInt(window.name.substring(index));
|
||||||
|
} else { |
||||||
|
popupIndex = 0; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function addPopupIndex(name) { |
||||||
|
return name + "__" + (popupIndex + 1); |
||||||
|
} |
||||||
|
|
||||||
|
function removePopupIndex(name) { |
||||||
|
return name.replace(new RegExp("__" + (popupIndex + 1) + "$"), ''); |
||||||
|
} |
||||||
|
|
||||||
|
function showAdminPopup(triggeringLink, name_regexp, add_popup) { |
||||||
|
const name = addPopupIndex(triggeringLink.id.replace(name_regexp, '')); |
||||||
|
const href = new URL(triggeringLink.href); |
||||||
|
if (add_popup) { |
||||||
|
href.searchParams.set('_popup', 1); |
||||||
|
} |
||||||
|
const win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes'); |
||||||
|
relatedWindows.push(win); |
||||||
|
win.focus(); |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
function showRelatedObjectLookupPopup(triggeringLink) { |
||||||
|
return showAdminPopup(triggeringLink, /^lookup_/, true); |
||||||
|
} |
||||||
|
|
||||||
|
function dismissRelatedLookupPopup(win, chosenId) { |
||||||
|
const name = removePopupIndex(win.name); |
||||||
|
const elem = document.getElementById(name); |
||||||
|
if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) { |
||||||
|
elem.value += ',' + chosenId; |
||||||
|
} else { |
||||||
|
document.getElementById(name).value = chosenId; |
||||||
|
} |
||||||
|
const index = relatedWindows.indexOf(win); |
||||||
|
if (index > -1) { |
||||||
|
relatedWindows.splice(index, 1); |
||||||
|
} |
||||||
|
win.close(); |
||||||
|
} |
||||||
|
|
||||||
|
function showRelatedObjectPopup(triggeringLink) { |
||||||
|
return showAdminPopup(triggeringLink, /^(change|add|delete)_/, false); |
||||||
|
} |
||||||
|
|
||||||
|
function updateRelatedObjectLinks(triggeringLink) { |
||||||
|
const $this = $(triggeringLink); |
||||||
|
const siblings = $this.nextAll('.view-related, .change-related, .delete-related'); |
||||||
|
if (!siblings.length) { |
||||||
|
return; |
||||||
|
} |
||||||
|
const value = $this.val(); |
||||||
|
if (value) { |
||||||
|
siblings.each(function() { |
||||||
|
const elm = $(this); |
||||||
|
elm.attr('href', elm.attr('data-href-template').replace('__fk__', value)); |
||||||
|
}); |
||||||
|
} else { |
||||||
|
siblings.removeAttr('href'); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function updateRelatedSelectsOptions(currentSelect, win, objId, newRepr, newId) { |
||||||
|
// After create/edit a model from the options next to the current
|
||||||
|
// select (+ or :pencil:) update ForeignKey PK of the rest of selects
|
||||||
|
// in the page.
|
||||||
|
|
||||||
|
const path = win.location.pathname; |
||||||
|
// Extract the model from the popup url '.../<model>/add/' or
|
||||||
|
// '.../<model>/<id>/change/' depending the action (add or change).
|
||||||
|
const modelName = path.split('/')[path.split('/').length - (objId ? 4 : 3)]; |
||||||
|
// Exclude autocomplete selects.
|
||||||
|
const selectsRelated = document.querySelectorAll(`[data-model-ref="${modelName}"] select:not(.admin-autocomplete)`); |
||||||
|
|
||||||
|
selectsRelated.forEach(function(select) { |
||||||
|
if (currentSelect === select) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
let option = select.querySelector(`option[value="${objId}"]`); |
||||||
|
|
||||||
|
if (!option) { |
||||||
|
option = new Option(newRepr, newId); |
||||||
|
select.options.add(option); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
option.textContent = newRepr; |
||||||
|
option.value = newId; |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
function dismissAddRelatedObjectPopup(win, newId, newRepr) { |
||||||
|
const name = removePopupIndex(win.name); |
||||||
|
const elem = document.getElementById(name); |
||||||
|
if (elem) { |
||||||
|
const elemName = elem.nodeName.toUpperCase(); |
||||||
|
if (elemName === 'SELECT') { |
||||||
|
elem.options[elem.options.length] = new Option(newRepr, newId, true, true); |
||||||
|
updateRelatedSelectsOptions(elem, win, null, newRepr, newId); |
||||||
|
} else if (elemName === 'INPUT') { |
||||||
|
if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) { |
||||||
|
elem.value += ',' + newId; |
||||||
|
} else { |
||||||
|
elem.value = newId; |
||||||
|
} |
||||||
|
} |
||||||
|
// Trigger a change event to update related links if required.
|
||||||
|
$(elem).trigger('change'); |
||||||
|
} else { |
||||||
|
const toId = name + "_to"; |
||||||
|
const o = new Option(newRepr, newId); |
||||||
|
SelectBox.add_to_cache(toId, o); |
||||||
|
SelectBox.redisplay(toId); |
||||||
|
} |
||||||
|
const index = relatedWindows.indexOf(win); |
||||||
|
if (index > -1) { |
||||||
|
relatedWindows.splice(index, 1); |
||||||
|
} |
||||||
|
win.close(); |
||||||
|
} |
||||||
|
|
||||||
|
function dismissChangeRelatedObjectPopup(win, objId, newRepr, newId) { |
||||||
|
const id = removePopupIndex(win.name.replace(/^edit_/, '')); |
||||||
|
const selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]); |
||||||
|
const selects = $(selectsSelector); |
||||||
|
selects.find('option').each(function() { |
||||||
|
if (this.value === objId) { |
||||||
|
this.textContent = newRepr; |
||||||
|
this.value = newId; |
||||||
|
} |
||||||
|
}).trigger('change'); |
||||||
|
updateRelatedSelectsOptions(selects[0], win, objId, newRepr, newId); |
||||||
|
selects.next().find('.select2-selection__rendered').each(function() { |
||||||
|
// The element can have a clear button as a child.
|
||||||
|
// Use the lastChild to modify only the displayed value.
|
||||||
|
this.lastChild.textContent = newRepr; |
||||||
|
this.title = newRepr; |
||||||
|
}); |
||||||
|
const index = relatedWindows.indexOf(win); |
||||||
|
if (index > -1) { |
||||||
|
relatedWindows.splice(index, 1); |
||||||
|
} |
||||||
|
win.close(); |
||||||
|
} |
||||||
|
|
||||||
|
function dismissDeleteRelatedObjectPopup(win, objId) { |
||||||
|
const id = removePopupIndex(win.name.replace(/^delete_/, '')); |
||||||
|
const selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]); |
||||||
|
const selects = $(selectsSelector); |
||||||
|
selects.find('option').each(function() { |
||||||
|
if (this.value === objId) { |
||||||
|
$(this).remove(); |
||||||
|
} |
||||||
|
}).trigger('change'); |
||||||
|
const index = relatedWindows.indexOf(win); |
||||||
|
if (index > -1) { |
||||||
|
relatedWindows.splice(index, 1); |
||||||
|
} |
||||||
|
win.close(); |
||||||
|
} |
||||||
|
|
||||||
|
window.showRelatedObjectLookupPopup = showRelatedObjectLookupPopup; |
||||||
|
window.dismissRelatedLookupPopup = dismissRelatedLookupPopup; |
||||||
|
window.showRelatedObjectPopup = showRelatedObjectPopup; |
||||||
|
window.updateRelatedObjectLinks = updateRelatedObjectLinks; |
||||||
|
window.dismissAddRelatedObjectPopup = dismissAddRelatedObjectPopup; |
||||||
|
window.dismissChangeRelatedObjectPopup = dismissChangeRelatedObjectPopup; |
||||||
|
window.dismissDeleteRelatedObjectPopup = dismissDeleteRelatedObjectPopup; |
||||||
|
window.dismissChildPopups = dismissChildPopups; |
||||||
|
|
||||||
|
// Kept for backward compatibility
|
||||||
|
window.showAddAnotherPopup = showRelatedObjectPopup; |
||||||
|
window.dismissAddAnotherPopup = dismissAddRelatedObjectPopup; |
||||||
|
|
||||||
|
window.addEventListener('unload', function(evt) { |
||||||
|
window.dismissChildPopups(); |
||||||
|
}); |
||||||
|
|
||||||
|
$(document).ready(function() { |
||||||
|
setPopupIndex(); |
||||||
|
$("a[data-popup-opener]").on('click', function(event) { |
||||||
|
event.preventDefault(); |
||||||
|
opener.dismissRelatedLookupPopup(window, $(this).data("popup-opener")); |
||||||
|
}); |
||||||
|
$('body').on('click', '.related-widget-wrapper-link[data-popup="yes"]', function(e) { |
||||||
|
e.preventDefault(); |
||||||
|
if (this.href) { |
||||||
|
const event = $.Event('django:show-related', {href: this.href}); |
||||||
|
$(this).trigger(event); |
||||||
|
if (!event.isDefaultPrevented()) { |
||||||
|
showRelatedObjectPopup(this); |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
$('body').on('change', '.related-widget-wrapper select', function(e) { |
||||||
|
const event = $.Event('django:update-related'); |
||||||
|
$(this).trigger(event); |
||||||
|
if (!event.isDefaultPrevented()) { |
||||||
|
updateRelatedObjectLinks(this); |
||||||
|
} |
||||||
|
}); |
||||||
|
$('.related-widget-wrapper select').trigger('change'); |
||||||
|
$('body').on('click', '.related-lookup', function(e) { |
||||||
|
e.preventDefault(); |
||||||
|
const event = $.Event('django:lookup-related'); |
||||||
|
$(this).trigger(event); |
||||||
|
if (!event.isDefaultPrevented()) { |
||||||
|
showRelatedObjectLookupPopup(this); |
||||||
|
} |
||||||
|
}); |
||||||
|
}); |
||||||
|
} |
@ -0,0 +1,33 @@ |
|||||||
|
'use strict'; |
||||||
|
{ |
||||||
|
const $ = django.jQuery; |
||||||
|
|
||||||
|
$.fn.djangoAdminSelect2 = function() { |
||||||
|
$.each(this, function(i, element) { |
||||||
|
$(element).select2({ |
||||||
|
ajax: { |
||||||
|
data: (params) => { |
||||||
|
return { |
||||||
|
term: params.term, |
||||||
|
page: params.page, |
||||||
|
app_label: element.dataset.appLabel, |
||||||
|
model_name: element.dataset.modelName, |
||||||
|
field_name: element.dataset.fieldName |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
}); |
||||||
|
return this; |
||||||
|
}; |
||||||
|
|
||||||
|
$(function() { |
||||||
|
// Initialize all autocomplete widgets except the one in the template
|
||||||
|
// form used when a new formset is added.
|
||||||
|
$('.admin-autocomplete').not('[name*=__prefix__]').djangoAdminSelect2(); |
||||||
|
}); |
||||||
|
|
||||||
|
document.addEventListener('formset:added', (event) => { |
||||||
|
$(event.target).find('.admin-autocomplete').djangoAdminSelect2(); |
||||||
|
}); |
||||||
|
} |
@ -0,0 +1,221 @@ |
|||||||
|
/*global gettext, pgettext, get_format, quickElement, removeChildren*/ |
||||||
|
/* |
||||||
|
calendar.js - Calendar functions by Adrian Holovaty |
||||||
|
depends on core.js for utility functions like removeChildren or quickElement |
||||||
|
*/ |
||||||
|
'use strict'; |
||||||
|
{ |
||||||
|
// CalendarNamespace -- Provides a collection of HTML calendar-related helper functions
|
||||||
|
const CalendarNamespace = { |
||||||
|
monthsOfYear: [ |
||||||
|
gettext('January'), |
||||||
|
gettext('February'), |
||||||
|
gettext('March'), |
||||||
|
gettext('April'), |
||||||
|
gettext('May'), |
||||||
|
gettext('June'), |
||||||
|
gettext('July'), |
||||||
|
gettext('August'), |
||||||
|
gettext('September'), |
||||||
|
gettext('October'), |
||||||
|
gettext('November'), |
||||||
|
gettext('December') |
||||||
|
], |
||||||
|
monthsOfYearAbbrev: [ |
||||||
|
pgettext('abbrev. month January', 'Jan'), |
||||||
|
pgettext('abbrev. month February', 'Feb'), |
||||||
|
pgettext('abbrev. month March', 'Mar'), |
||||||
|
pgettext('abbrev. month April', 'Apr'), |
||||||
|
pgettext('abbrev. month May', 'May'), |
||||||
|
pgettext('abbrev. month June', 'Jun'), |
||||||
|
pgettext('abbrev. month July', 'Jul'), |
||||||
|
pgettext('abbrev. month August', 'Aug'), |
||||||
|
pgettext('abbrev. month September', 'Sep'), |
||||||
|
pgettext('abbrev. month October', 'Oct'), |
||||||
|
pgettext('abbrev. month November', 'Nov'), |
||||||
|
pgettext('abbrev. month December', 'Dec') |
||||||
|
], |
||||||
|
daysOfWeek: [ |
||||||
|
pgettext('one letter Sunday', 'S'), |
||||||
|
pgettext('one letter Monday', 'M'), |
||||||
|
pgettext('one letter Tuesday', 'T'), |
||||||
|
pgettext('one letter Wednesday', 'W'), |
||||||
|
pgettext('one letter Thursday', 'T'), |
||||||
|
pgettext('one letter Friday', 'F'), |
||||||
|
pgettext('one letter Saturday', 'S') |
||||||
|
], |
||||||
|
firstDayOfWeek: parseInt(get_format('FIRST_DAY_OF_WEEK')), |
||||||
|
isLeapYear: function(year) { |
||||||
|
return (((year % 4) === 0) && ((year % 100) !== 0 ) || ((year % 400) === 0)); |
||||||
|
}, |
||||||
|
getDaysInMonth: function(month, year) { |
||||||
|
let days; |
||||||
|
if (month === 1 || month === 3 || month === 5 || month === 7 || month === 8 || month === 10 || month === 12) { |
||||||
|
days = 31; |
||||||
|
} |
||||||
|
else if (month === 4 || month === 6 || month === 9 || month === 11) { |
||||||
|
days = 30; |
||||||
|
} |
||||||
|
else if (month === 2 && CalendarNamespace.isLeapYear(year)) { |
||||||
|
days = 29; |
||||||
|
} |
||||||
|
else { |
||||||
|
days = 28; |
||||||
|
} |
||||||
|
return days; |
||||||
|
}, |
||||||
|
draw: function(month, year, div_id, callback, selected) { // month = 1-12, year = 1-9999
|
||||||
|
const today = new Date(); |
||||||
|
const todayDay = today.getDate(); |
||||||
|
const todayMonth = today.getMonth() + 1; |
||||||
|
const todayYear = today.getFullYear(); |
||||||
|
let todayClass = ''; |
||||||
|
|
||||||
|
// Use UTC functions here because the date field does not contain time
|
||||||
|
// and using the UTC function variants prevent the local time offset
|
||||||
|
// from altering the date, specifically the day field. For example:
|
||||||
|
//
|
||||||
|
// ```
|
||||||
|
// var x = new Date('2013-10-02');
|
||||||
|
// var day = x.getDate();
|
||||||
|
// ```
|
||||||
|
//
|
||||||
|
// The day variable above will be 1 instead of 2 in, say, US Pacific time
|
||||||
|
// zone.
|
||||||
|
let isSelectedMonth = false; |
||||||
|
if (typeof selected !== 'undefined') { |
||||||
|
isSelectedMonth = (selected.getUTCFullYear() === year && (selected.getUTCMonth() + 1) === month); |
||||||
|
} |
||||||
|
|
||||||
|
month = parseInt(month); |
||||||
|
year = parseInt(year); |
||||||
|
const calDiv = document.getElementById(div_id); |
||||||
|
removeChildren(calDiv); |
||||||
|
const calTable = document.createElement('table'); |
||||||
|
quickElement('caption', calTable, CalendarNamespace.monthsOfYear[month - 1] + ' ' + year); |
||||||
|
const tableBody = quickElement('tbody', calTable); |
||||||
|
|
||||||
|
// 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]); |
||||||
|
} |
||||||
|
|
||||||
|
const startingPos = new Date(year, month - 1, 1 - CalendarNamespace.firstDayOfWeek).getDay(); |
||||||
|
const days = CalendarNamespace.getDaysInMonth(month, year); |
||||||
|
|
||||||
|
let nonDayCell; |
||||||
|
|
||||||
|
// Draw blanks before first of month
|
||||||
|
tableRow = quickElement('tr', tableBody); |
||||||
|
for (let i = 0; i < startingPos; i++) { |
||||||
|
nonDayCell = quickElement('td', tableRow, ' '); |
||||||
|
nonDayCell.className = "nonday"; |
||||||
|
} |
||||||
|
|
||||||
|
function calendarMonth(y, m) { |
||||||
|
function onClick(e) { |
||||||
|
e.preventDefault(); |
||||||
|
callback(y, m, this.textContent); |
||||||
|
} |
||||||
|
return onClick; |
||||||
|
} |
||||||
|
|
||||||
|
// Draw days of month
|
||||||
|
let currentDay = 1; |
||||||
|
for (let i = startingPos; currentDay <= days; i++) { |
||||||
|
if (i % 7 === 0 && currentDay !== 1) { |
||||||
|
tableRow = quickElement('tr', tableBody); |
||||||
|
} |
||||||
|
if ((currentDay === todayDay) && (month === todayMonth) && (year === todayYear)) { |
||||||
|
todayClass = 'today'; |
||||||
|
} else { |
||||||
|
todayClass = ''; |
||||||
|
} |
||||||
|
|
||||||
|
// use UTC function; see above for explanation.
|
||||||
|
if (isSelectedMonth && currentDay === selected.getUTCDate()) { |
||||||
|
if (todayClass !== '') { |
||||||
|
todayClass += " "; |
||||||
|
} |
||||||
|
todayClass += "selected"; |
||||||
|
} |
||||||
|
|
||||||
|
const cell = quickElement('td', tableRow, '', 'class', todayClass); |
||||||
|
const link = quickElement('a', cell, currentDay, 'href', '#'); |
||||||
|
link.addEventListener('click', calendarMonth(year, month)); |
||||||
|
currentDay++; |
||||||
|
} |
||||||
|
|
||||||
|
// Draw blanks after end of month (optional, but makes for valid code)
|
||||||
|
while (tableRow.childNodes.length < 7) { |
||||||
|
nonDayCell = quickElement('td', tableRow, ' '); |
||||||
|
nonDayCell.className = "nonday"; |
||||||
|
} |
||||||
|
|
||||||
|
calDiv.appendChild(calTable); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
// Calendar -- A calendar instance
|
||||||
|
function Calendar(div_id, callback, selected) { |
||||||
|
// div_id (string) is the ID of the element in which the calendar will
|
||||||
|
// be displayed
|
||||||
|
// callback (string) is the name of a JavaScript function that will be
|
||||||
|
// called with the parameters (year, month, day) when a day in the
|
||||||
|
// calendar is clicked
|
||||||
|
this.div_id = div_id; |
||||||
|
this.callback = callback; |
||||||
|
this.today = new Date(); |
||||||
|
this.currentMonth = this.today.getMonth() + 1; |
||||||
|
this.currentYear = this.today.getFullYear(); |
||||||
|
if (typeof selected !== 'undefined') { |
||||||
|
this.selected = selected; |
||||||
|
} |
||||||
|
} |
||||||
|
Calendar.prototype = { |
||||||
|
drawCurrent: function() { |
||||||
|
CalendarNamespace.draw(this.currentMonth, this.currentYear, this.div_id, this.callback, this.selected); |
||||||
|
}, |
||||||
|
drawDate: function(month, year, selected) { |
||||||
|
this.currentMonth = month; |
||||||
|
this.currentYear = year; |
||||||
|
|
||||||
|
if(selected) { |
||||||
|
this.selected = selected; |
||||||
|
} |
||||||
|
|
||||||
|
this.drawCurrent(); |
||||||
|
}, |
||||||
|
drawPreviousMonth: function() { |
||||||
|
if (this.currentMonth === 1) { |
||||||
|
this.currentMonth = 12; |
||||||
|
this.currentYear--; |
||||||
|
} |
||||||
|
else { |
||||||
|
this.currentMonth--; |
||||||
|
} |
||||||
|
this.drawCurrent(); |
||||||
|
}, |
||||||
|
drawNextMonth: function() { |
||||||
|
if (this.currentMonth === 12) { |
||||||
|
this.currentMonth = 1; |
||||||
|
this.currentYear++; |
||||||
|
} |
||||||
|
else { |
||||||
|
this.currentMonth++; |
||||||
|
} |
||||||
|
this.drawCurrent(); |
||||||
|
}, |
||||||
|
drawPreviousYear: function() { |
||||||
|
this.currentYear--; |
||||||
|
this.drawCurrent(); |
||||||
|
}, |
||||||
|
drawNextYear: function() { |
||||||
|
this.currentYear++; |
||||||
|
this.drawCurrent(); |
||||||
|
} |
||||||
|
}; |
||||||
|
window.Calendar = Calendar; |
||||||
|
window.CalendarNamespace = CalendarNamespace; |
||||||
|
} |
@ -0,0 +1,29 @@ |
|||||||
|
'use strict'; |
||||||
|
{ |
||||||
|
// Call function fn when the DOM is loaded and ready. If it is already
|
||||||
|
// loaded, call the function now.
|
||||||
|
// http://youmightnotneedjquery.com/#ready
|
||||||
|
function ready(fn) { |
||||||
|
if (document.readyState !== 'loading') { |
||||||
|
fn(); |
||||||
|
} else { |
||||||
|
document.addEventListener('DOMContentLoaded', fn); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
ready(function() { |
||||||
|
function handleClick(event) { |
||||||
|
event.preventDefault(); |
||||||
|
const params = new URLSearchParams(window.location.search); |
||||||
|
if (params.has('_popup')) { |
||||||
|
window.close(); // Close the popup.
|
||||||
|
} else { |
||||||
|
window.history.back(); // Otherwise, go back.
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
document.querySelectorAll('.cancel-link').forEach(function(el) { |
||||||
|
el.addEventListener('click', handleClick); |
||||||
|
}); |
||||||
|
}); |
||||||
|
} |
@ -0,0 +1,16 @@ |
|||||||
|
'use strict'; |
||||||
|
{ |
||||||
|
const inputTags = ['BUTTON', 'INPUT', 'SELECT', 'TEXTAREA']; |
||||||
|
const modelName = document.getElementById('django-admin-form-add-constants').dataset.modelName; |
||||||
|
if (modelName) { |
||||||
|
const form = document.getElementById(modelName + '_form'); |
||||||
|
for (const element of form.elements) { |
||||||
|
// HTMLElement.offsetParent returns null when the element is not
|
||||||
|
// rendered.
|
||||||
|
if (inputTags.includes(element.tagName) && !element.disabled && element.offsetParent) { |
||||||
|
element.focus(); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,43 @@ |
|||||||
|
/*global gettext*/ |
||||||
|
'use strict'; |
||||||
|
{ |
||||||
|
window.addEventListener('load', function() { |
||||||
|
// Add anchor tag for Show/Hide link
|
||||||
|
const fieldsets = document.querySelectorAll('fieldset.collapse'); |
||||||
|
for (const [i, elem] of fieldsets.entries()) { |
||||||
|
// Don't hide if fields in this fieldset have errors
|
||||||
|
if (elem.querySelectorAll('div.errors, ul.errorlist').length === 0) { |
||||||
|
elem.classList.add('collapsed'); |
||||||
|
const h2 = elem.querySelector('h2'); |
||||||
|
const link = document.createElement('a'); |
||||||
|
link.id = 'fieldsetcollapser' + i; |
||||||
|
link.className = 'collapse-toggle'; |
||||||
|
link.href = '#'; |
||||||
|
link.textContent = gettext('Show'); |
||||||
|
h2.appendChild(document.createTextNode(' (')); |
||||||
|
h2.appendChild(link); |
||||||
|
h2.appendChild(document.createTextNode(')')); |
||||||
|
} |
||||||
|
} |
||||||
|
// Add toggle to hide/show anchor tag
|
||||||
|
const toggleFunc = function(ev) { |
||||||
|
if (ev.target.matches('.collapse-toggle')) { |
||||||
|
ev.preventDefault(); |
||||||
|
ev.stopPropagation(); |
||||||
|
const fieldset = ev.target.closest('fieldset'); |
||||||
|
if (fieldset.classList.contains('collapsed')) { |
||||||
|
// Show
|
||||||
|
ev.target.textContent = gettext('Hide'); |
||||||
|
fieldset.classList.remove('collapsed'); |
||||||
|
} else { |
||||||
|
// Hide
|
||||||
|
ev.target.textContent = gettext('Show'); |
||||||
|
fieldset.classList.add('collapsed'); |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
document.querySelectorAll('fieldset.module').forEach(function(el) { |
||||||
|
el.addEventListener('click', toggleFunc); |
||||||
|
}); |
||||||
|
}); |
||||||
|
} |
@ -0,0 +1,170 @@ |
|||||||
|
// Core JavaScript helper functions
|
||||||
|
'use strict'; |
||||||
|
|
||||||
|
// quickElement(tagType, parentReference [, textInChildNode, attribute, attributeValue ...]);
|
||||||
|
function quickElement() { |
||||||
|
const obj = document.createElement(arguments[0]); |
||||||
|
if (arguments[2]) { |
||||||
|
const textNode = document.createTextNode(arguments[2]); |
||||||
|
obj.appendChild(textNode); |
||||||
|
} |
||||||
|
const len = arguments.length; |
||||||
|
for (let i = 3; i < len; i += 2) { |
||||||
|
obj.setAttribute(arguments[i], arguments[i + 1]); |
||||||
|
} |
||||||
|
arguments[1].appendChild(obj); |
||||||
|
return obj; |
||||||
|
} |
||||||
|
|
||||||
|
// "a" is reference to an object
|
||||||
|
function removeChildren(a) { |
||||||
|
while (a.hasChildNodes()) { |
||||||
|
a.removeChild(a.lastChild); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Find-position functions by PPK
|
||||||
|
// See https://www.quirksmode.org/js/findpos.html
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
function findPosX(obj) { |
||||||
|
let curleft = 0; |
||||||
|
if (obj.offsetParent) { |
||||||
|
while (obj.offsetParent) { |
||||||
|
curleft += obj.offsetLeft - obj.scrollLeft; |
||||||
|
obj = obj.offsetParent; |
||||||
|
} |
||||||
|
} else if (obj.x) { |
||||||
|
curleft += obj.x; |
||||||
|
} |
||||||
|
return curleft; |
||||||
|
} |
||||||
|
|
||||||
|
function findPosY(obj) { |
||||||
|
let curtop = 0; |
||||||
|
if (obj.offsetParent) { |
||||||
|
while (obj.offsetParent) { |
||||||
|
curtop += obj.offsetTop - obj.scrollTop; |
||||||
|
obj = obj.offsetParent; |
||||||
|
} |
||||||
|
} else if (obj.y) { |
||||||
|
curtop += obj.y; |
||||||
|
} |
||||||
|
return curtop; |
||||||
|
} |
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Date object extensions
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
{ |
||||||
|
Date.prototype.getTwelveHours = function() { |
||||||
|
return this.getHours() % 12 || 12; |
||||||
|
}; |
||||||
|
|
||||||
|
Date.prototype.getTwoDigitMonth = function() { |
||||||
|
return (this.getMonth() < 9) ? '0' + (this.getMonth() + 1) : (this.getMonth() + 1); |
||||||
|
}; |
||||||
|
|
||||||
|
Date.prototype.getTwoDigitDate = function() { |
||||||
|
return (this.getDate() < 10) ? '0' + this.getDate() : this.getDate(); |
||||||
|
}; |
||||||
|
|
||||||
|
Date.prototype.getTwoDigitTwelveHour = function() { |
||||||
|
return (this.getTwelveHours() < 10) ? '0' + this.getTwelveHours() : this.getTwelveHours(); |
||||||
|
}; |
||||||
|
|
||||||
|
Date.prototype.getTwoDigitHour = function() { |
||||||
|
return (this.getHours() < 10) ? '0' + this.getHours() : this.getHours(); |
||||||
|
}; |
||||||
|
|
||||||
|
Date.prototype.getTwoDigitMinute = function() { |
||||||
|
return (this.getMinutes() < 10) ? '0' + this.getMinutes() : this.getMinutes(); |
||||||
|
}; |
||||||
|
|
||||||
|
Date.prototype.getTwoDigitSecond = function() { |
||||||
|
return (this.getSeconds() < 10) ? '0' + this.getSeconds() : this.getSeconds(); |
||||||
|
}; |
||||||
|
|
||||||
|
Date.prototype.getAbbrevMonthName = function() { |
||||||
|
return typeof window.CalendarNamespace === "undefined" |
||||||
|
? this.getTwoDigitMonth() |
||||||
|
: window.CalendarNamespace.monthsOfYearAbbrev[this.getMonth()]; |
||||||
|
}; |
||||||
|
|
||||||
|
Date.prototype.getFullMonthName = function() { |
||||||
|
return typeof window.CalendarNamespace === "undefined" |
||||||
|
? this.getTwoDigitMonth() |
||||||
|
: window.CalendarNamespace.monthsOfYear[this.getMonth()]; |
||||||
|
}; |
||||||
|
|
||||||
|
Date.prototype.strftime = function(format) { |
||||||
|
const fields = { |
||||||
|
b: this.getAbbrevMonthName(), |
||||||
|
B: this.getFullMonthName(), |
||||||
|
c: this.toString(), |
||||||
|
d: this.getTwoDigitDate(), |
||||||
|
H: this.getTwoDigitHour(), |
||||||
|
I: this.getTwoDigitTwelveHour(), |
||||||
|
m: this.getTwoDigitMonth(), |
||||||
|
M: this.getTwoDigitMinute(), |
||||||
|
p: (this.getHours() >= 12) ? 'PM' : 'AM', |
||||||
|
S: this.getTwoDigitSecond(), |
||||||
|
w: '0' + this.getDay(), |
||||||
|
x: this.toLocaleDateString(), |
||||||
|
X: this.toLocaleTimeString(), |
||||||
|
y: ('' + this.getFullYear()).substr(2, 4), |
||||||
|
Y: '' + this.getFullYear(), |
||||||
|
'%': '%' |
||||||
|
}; |
||||||
|
let result = '', i = 0; |
||||||
|
while (i < format.length) { |
||||||
|
if (format.charAt(i) === '%') { |
||||||
|
result += fields[format.charAt(i + 1)]; |
||||||
|
++i; |
||||||
|
} |
||||||
|
else { |
||||||
|
result += format.charAt(i); |
||||||
|
} |
||||||
|
++i; |
||||||
|
} |
||||||
|
return result; |
||||||
|
}; |
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// String object extensions
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
String.prototype.strptime = function(format) { |
||||||
|
const split_format = format.split(/[.\-/]/); |
||||||
|
const date = this.split(/[.\-/]/); |
||||||
|
let i = 0; |
||||||
|
let day, month, year; |
||||||
|
while (i < split_format.length) { |
||||||
|
switch (split_format[i]) { |
||||||
|
case "%d": |
||||||
|
day = date[i]; |
||||||
|
break; |
||||||
|
case "%m": |
||||||
|
month = date[i] - 1; |
||||||
|
break; |
||||||
|
case "%Y": |
||||||
|
year = date[i]; |
||||||
|
break; |
||||||
|
case "%y": |
||||||
|
// A %y value in the range of [00, 68] is in the current
|
||||||
|
// century, while [69, 99] is in the previous century,
|
||||||
|
// according to the Open Group Specification.
|
||||||
|
if (parseInt(date[i], 10) >= 69) { |
||||||
|
year = date[i]; |
||||||
|
} else { |
||||||
|
year = (new Date(Date.UTC(date[i], 0))).getUTCFullYear() + 100; |
||||||
|
} |
||||||
|
break; |
||||||
|
} |
||||||
|
++i; |
||||||
|
} |
||||||
|
// Create Date object from UTC since the parsed value is supposed to be
|
||||||
|
// in UTC, not local time. Also, the calendar uses UTC functions for
|
||||||
|
// date extraction.
|
||||||
|
return new Date(Date.UTC(year, month, day)); |
||||||
|
}; |
||||||
|
} |
@ -0,0 +1,30 @@ |
|||||||
|
/** |
||||||
|
* Persist changelist filters state (collapsed/expanded). |
||||||
|
*/ |
||||||
|
'use strict'; |
||||||
|
{ |
||||||
|
// Init filters.
|
||||||
|
let filters = JSON.parse(sessionStorage.getItem('django.admin.filtersState')); |
||||||
|
|
||||||
|
if (!filters) { |
||||||
|
filters = {}; |
||||||
|
} |
||||||
|
|
||||||
|
Object.entries(filters).forEach(([key, value]) => { |
||||||
|
const detailElement = document.querySelector(`[data-filter-title='${CSS.escape(key)}']`); |
||||||
|
|
||||||
|
// Check if the filter is present, it could be from other view.
|
||||||
|
if (detailElement) { |
||||||
|
value ? detailElement.setAttribute('open', '') : detailElement.removeAttribute('open'); |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
// Save filter state when clicks.
|
||||||
|
const details = document.querySelectorAll('details'); |
||||||
|
details.forEach(detail => { |
||||||
|
detail.addEventListener('toggle', event => { |
||||||
|
filters[`${event.target.dataset.filterTitle}`] = detail.open; |
||||||
|
sessionStorage.setItem('django.admin.filtersState', JSON.stringify(filters)); |
||||||
|
}); |
||||||
|
}); |
||||||
|
} |
@ -0,0 +1,359 @@ |
|||||||
|
/*global DateTimeShortcuts, SelectFilter*/ |
||||||
|
/** |
||||||
|
* Django admin inlines |
||||||
|
* |
||||||
|
* Based on jQuery Formset 1.1 |
||||||
|
* @author Stanislaus Madueke (stan DOT madueke AT gmail DOT com) |
||||||
|
* @requires jQuery 1.2.6 or later |
||||||
|
* |
||||||
|
* Copyright (c) 2009, Stanislaus Madueke |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* Spiced up with Code from Zain Memon's GSoC project 2009 |
||||||
|
* and modified for Django by Jannis Leidel, Travis Swicegood and Julien Phalip. |
||||||
|
* |
||||||
|
* Licensed under the New BSD License |
||||||
|
* See: https://opensource.org/licenses/bsd-license.php
|
||||||
|
*/ |
||||||
|
'use strict'; |
||||||
|
{ |
||||||
|
const $ = django.jQuery; |
||||||
|
$.fn.formset = function(opts) { |
||||||
|
const options = $.extend({}, $.fn.formset.defaults, opts); |
||||||
|
const $this = $(this); |
||||||
|
const $parent = $this.parent(); |
||||||
|
const updateElementIndex = function(el, prefix, ndx) { |
||||||
|
const id_regex = new RegExp("(" + prefix + "-(\\d+|__prefix__))"); |
||||||
|
const replacement = prefix + "-" + ndx; |
||||||
|
if ($(el).prop("for")) { |
||||||
|
$(el).prop("for", $(el).prop("for").replace(id_regex, replacement)); |
||||||
|
} |
||||||
|
if (el.id) { |
||||||
|
el.id = el.id.replace(id_regex, replacement); |
||||||
|
} |
||||||
|
if (el.name) { |
||||||
|
el.name = el.name.replace(id_regex, replacement); |
||||||
|
} |
||||||
|
}; |
||||||
|
const totalForms = $("#id_" + options.prefix + "-TOTAL_FORMS").prop("autocomplete", "off"); |
||||||
|
let nextIndex = parseInt(totalForms.val(), 10); |
||||||
|
const maxForms = $("#id_" + options.prefix + "-MAX_NUM_FORMS").prop("autocomplete", "off"); |
||||||
|
const minForms = $("#id_" + options.prefix + "-MIN_NUM_FORMS").prop("autocomplete", "off"); |
||||||
|
let addButton; |
||||||
|
|
||||||
|
/** |
||||||
|
* The "Add another MyModel" button below the inline forms. |
||||||
|
*/ |
||||||
|
const addInlineAddButton = function() { |
||||||
|
if (addButton === null) { |
||||||
|
if ($this.prop("tagName") === "TR") { |
||||||
|
// If forms are laid out as table rows, insert the
|
||||||
|
// "add" button in a new table row:
|
||||||
|
const numCols = $this.eq(-1).children().length; |
||||||
|
$parent.append('<tr class="' + options.addCssClass + '"><td colspan="' + numCols + '"><a href="#">' + options.addText + "</a></tr>"); |
||||||
|
addButton = $parent.find("tr:last a"); |
||||||
|
} else { |
||||||
|
// Otherwise, insert it immediately after the last form:
|
||||||
|
$this.filter(":last").after('<div class="' + options.addCssClass + '"><a href="#">' + options.addText + "</a></div>"); |
||||||
|
addButton = $this.filter(":last").next().find("a"); |
||||||
|
} |
||||||
|
} |
||||||
|
addButton.on('click', addInlineClickHandler); |
||||||
|
}; |
||||||
|
|
||||||
|
const addInlineClickHandler = function(e) { |
||||||
|
e.preventDefault(); |
||||||
|
const template = $("#" + options.prefix + "-empty"); |
||||||
|
const row = template.clone(true); |
||||||
|
row.removeClass(options.emptyCssClass) |
||||||
|
.addClass(options.formCssClass) |
||||||
|
.attr("id", options.prefix + "-" + nextIndex); |
||||||
|
addInlineDeleteButton(row); |
||||||
|
row.find("*").each(function() { |
||||||
|
updateElementIndex(this, options.prefix, totalForms.val()); |
||||||
|
}); |
||||||
|
// Insert the new form when it has been fully edited.
|
||||||
|
row.insertBefore($(template)); |
||||||
|
// Update number of total forms.
|
||||||
|
$(totalForms).val(parseInt(totalForms.val(), 10) + 1); |
||||||
|
nextIndex += 1; |
||||||
|
// Hide the add button if there's a limit and it's been reached.
|
||||||
|
if ((maxForms.val() !== '') && (maxForms.val() - totalForms.val()) <= 0) { |
||||||
|
addButton.parent().hide(); |
||||||
|
} |
||||||
|
// Show the remove buttons if there are more than min_num.
|
||||||
|
toggleDeleteButtonVisibility(row.closest('.inline-group')); |
||||||
|
|
||||||
|
// Pass the new form to the post-add callback, if provided.
|
||||||
|
if (options.added) { |
||||||
|
options.added(row); |
||||||
|
} |
||||||
|
row.get(0).dispatchEvent(new CustomEvent("formset:added", { |
||||||
|
bubbles: true, |
||||||
|
detail: { |
||||||
|
formsetName: options.prefix |
||||||
|
} |
||||||
|
})); |
||||||
|
}; |
||||||
|
|
||||||
|
/** |
||||||
|
* The "X" button that is part of every unsaved inline. |
||||||
|
* (When saved, it is replaced with a "Delete" checkbox.) |
||||||
|
*/ |
||||||
|
const addInlineDeleteButton = function(row) { |
||||||
|
if (row.is("tr")) { |
||||||
|
// If the forms are laid out in table rows, insert
|
||||||
|
// the remove button into the last table cell:
|
||||||
|
row.children(":last").append('<div><a class="' + options.deleteCssClass + '" href="#">' + options.deleteText + "</a></div>"); |
||||||
|
} else if (row.is("ul") || row.is("ol")) { |
||||||
|
// If they're laid out as an ordered/unordered list,
|
||||||
|
// insert an <li> after the last list item:
|
||||||
|
row.append('<li><a class="' + options.deleteCssClass + '" href="#">' + options.deleteText + "</a></li>"); |
||||||
|
} else { |
||||||
|
// Otherwise, just insert the remove button as the
|
||||||
|
// last child element of the form's container:
|
||||||
|
row.children(":first").append('<span><a class="' + options.deleteCssClass + '" href="#">' + options.deleteText + "</a></span>"); |
||||||
|
} |
||||||
|
// Add delete handler for each row.
|
||||||
|
row.find("a." + options.deleteCssClass).on('click', inlineDeleteHandler.bind(this)); |
||||||
|
}; |
||||||
|
|
||||||
|
const inlineDeleteHandler = function(e1) { |
||||||
|
e1.preventDefault(); |
||||||
|
const deleteButton = $(e1.target); |
||||||
|
const row = deleteButton.closest('.' + options.formCssClass); |
||||||
|
const inlineGroup = row.closest('.inline-group'); |
||||||
|
// Remove the parent form containing this button,
|
||||||
|
// and also remove the relevant row with non-field errors:
|
||||||
|
const prevRow = row.prev(); |
||||||
|
if (prevRow.length && prevRow.hasClass('row-form-errors')) { |
||||||
|
prevRow.remove(); |
||||||
|
} |
||||||
|
row.remove(); |
||||||
|
nextIndex -= 1; |
||||||
|
// Pass the deleted form to the post-delete callback, if provided.
|
||||||
|
if (options.removed) { |
||||||
|
options.removed(row); |
||||||
|
} |
||||||
|
document.dispatchEvent(new CustomEvent("formset:removed", { |
||||||
|
detail: { |
||||||
|
formsetName: options.prefix |
||||||
|
} |
||||||
|
})); |
||||||
|
// Update the TOTAL_FORMS form count.
|
||||||
|
const forms = $("." + options.formCssClass); |
||||||
|
$("#id_" + options.prefix + "-TOTAL_FORMS").val(forms.length); |
||||||
|
// Show add button again once below maximum number.
|
||||||
|
if ((maxForms.val() === '') || (maxForms.val() - forms.length) > 0) { |
||||||
|
addButton.parent().show(); |
||||||
|
} |
||||||
|
// Hide the remove buttons if at min_num.
|
||||||
|
toggleDeleteButtonVisibility(inlineGroup); |
||||||
|
// Also, update names and ids for all remaining form controls so
|
||||||
|
// they remain in sequence:
|
||||||
|
let i, formCount; |
||||||
|
const updateElementCallback = function() { |
||||||
|
updateElementIndex(this, options.prefix, i); |
||||||
|
}; |
||||||
|
for (i = 0, formCount = forms.length; i < formCount; i++) { |
||||||
|
updateElementIndex($(forms).get(i), options.prefix, i); |
||||||
|
$(forms.get(i)).find("*").each(updateElementCallback); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
const toggleDeleteButtonVisibility = function(inlineGroup) { |
||||||
|
if ((minForms.val() !== '') && (minForms.val() - totalForms.val()) >= 0) { |
||||||
|
inlineGroup.find('.inline-deletelink').hide(); |
||||||
|
} else { |
||||||
|
inlineGroup.find('.inline-deletelink').show(); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
$this.each(function(i) { |
||||||
|
$(this).not("." + options.emptyCssClass).addClass(options.formCssClass); |
||||||
|
}); |
||||||
|
|
||||||
|
// Create the delete buttons for all unsaved inlines:
|
||||||
|
$this.filter('.' + options.formCssClass + ':not(.has_original):not(.' + options.emptyCssClass + ')').each(function() { |
||||||
|
addInlineDeleteButton($(this)); |
||||||
|
}); |
||||||
|
toggleDeleteButtonVisibility($this); |
||||||
|
|
||||||
|
// Create the add button, initially hidden.
|
||||||
|
addButton = options.addButton; |
||||||
|
addInlineAddButton(); |
||||||
|
|
||||||
|
// Show the add button if allowed to add more items.
|
||||||
|
// Note that max_num = None translates to a blank string.
|
||||||
|
const showAddButton = maxForms.val() === '' || (maxForms.val() - totalForms.val()) > 0; |
||||||
|
if ($this.length && showAddButton) { |
||||||
|
addButton.parent().show(); |
||||||
|
} else { |
||||||
|
addButton.parent().hide(); |
||||||
|
} |
||||||
|
|
||||||
|
return this; |
||||||
|
}; |
||||||
|
|
||||||
|
/* Setup plugin defaults */ |
||||||
|
$.fn.formset.defaults = { |
||||||
|
prefix: "form", // The form prefix for your django formset
|
||||||
|
addText: "add another", // Text for the add link
|
||||||
|
deleteText: "remove", // Text for the delete link
|
||||||
|
addCssClass: "add-row", // CSS class applied to the add link
|
||||||
|
deleteCssClass: "delete-row", // CSS class applied to the delete link
|
||||||
|
emptyCssClass: "empty-row", // CSS class applied to the empty row
|
||||||
|
formCssClass: "dynamic-form", // CSS class applied to each form in a formset
|
||||||
|
added: null, // Function called each time a new form is added
|
||||||
|
removed: null, // Function called each time a form is deleted
|
||||||
|
addButton: null // Existing add button to use
|
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
// Tabular inlines ---------------------------------------------------------
|
||||||
|
$.fn.tabularFormset = function(selector, options) { |
||||||
|
const $rows = $(this); |
||||||
|
|
||||||
|
const reinitDateTimeShortCuts = function() { |
||||||
|
// Reinitialize the calendar and clock widgets by force
|
||||||
|
if (typeof DateTimeShortcuts !== "undefined") { |
||||||
|
$(".datetimeshortcuts").remove(); |
||||||
|
DateTimeShortcuts.init(); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
const updateSelectFilter = function() { |
||||||
|
// If any SelectFilter widgets are a part of the new form,
|
||||||
|
// instantiate a new SelectFilter instance for it.
|
||||||
|
if (typeof SelectFilter !== 'undefined') { |
||||||
|
$('.selectfilter').each(function(index, value) { |
||||||
|
SelectFilter.init(value.id, this.dataset.fieldName, false); |
||||||
|
}); |
||||||
|
$('.selectfilterstacked').each(function(index, value) { |
||||||
|
SelectFilter.init(value.id, this.dataset.fieldName, true); |
||||||
|
}); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
const initPrepopulatedFields = function(row) { |
||||||
|
row.find('.prepopulated_field').each(function() { |
||||||
|
const field = $(this), |
||||||
|
input = field.find('input, select, textarea'), |
||||||
|
dependency_list = input.data('dependency_list') || [], |
||||||
|
dependencies = []; |
||||||
|
$.each(dependency_list, function(i, field_name) { |
||||||
|
dependencies.push('#' + row.find('.field-' + field_name).find('input, select, textarea').attr('id')); |
||||||
|
}); |
||||||
|
if (dependencies.length) { |
||||||
|
input.prepopulate(dependencies, input.attr('maxlength')); |
||||||
|
} |
||||||
|
}); |
||||||
|
}; |
||||||
|
|
||||||
|
$rows.formset({ |
||||||
|
prefix: options.prefix, |
||||||
|
addText: options.addText, |
||||||
|
formCssClass: "dynamic-" + options.prefix, |
||||||
|
deleteCssClass: "inline-deletelink", |
||||||
|
deleteText: options.deleteText, |
||||||
|
emptyCssClass: "empty-form", |
||||||
|
added: function(row) { |
||||||
|
initPrepopulatedFields(row); |
||||||
|
reinitDateTimeShortCuts(); |
||||||
|
updateSelectFilter(); |
||||||
|
}, |
||||||
|
addButton: options.addButton |
||||||
|
}); |
||||||
|
|
||||||
|
return $rows; |
||||||
|
}; |
||||||
|
|
||||||
|
// Stacked inlines ---------------------------------------------------------
|
||||||
|
$.fn.stackedFormset = function(selector, options) { |
||||||
|
const $rows = $(this); |
||||||
|
const updateInlineLabel = function(row) { |
||||||
|
$(selector).find(".inline_label").each(function(i) { |
||||||
|
const count = i + 1; |
||||||
|
$(this).html($(this).html().replace(/(#\d+)/g, "#" + count)); |
||||||
|
}); |
||||||
|
}; |
||||||
|
|
||||||
|
const reinitDateTimeShortCuts = function() { |
||||||
|
// Reinitialize the calendar and clock widgets by force, yuck.
|
||||||
|
if (typeof DateTimeShortcuts !== "undefined") { |
||||||
|
$(".datetimeshortcuts").remove(); |
||||||
|
DateTimeShortcuts.init(); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
const updateSelectFilter = function() { |
||||||
|
// If any SelectFilter widgets were added, instantiate a new instance.
|
||||||
|
if (typeof SelectFilter !== "undefined") { |
||||||
|
$(".selectfilter").each(function(index, value) { |
||||||
|
SelectFilter.init(value.id, this.dataset.fieldName, false); |
||||||
|
}); |
||||||
|
$(".selectfilterstacked").each(function(index, value) { |
||||||
|
SelectFilter.init(value.id, this.dataset.fieldName, true); |
||||||
|
}); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
const initPrepopulatedFields = function(row) { |
||||||
|
row.find('.prepopulated_field').each(function() { |
||||||
|
const field = $(this), |
||||||
|
input = field.find('input, select, textarea'), |
||||||
|
dependency_list = input.data('dependency_list') || [], |
||||||
|
dependencies = []; |
||||||
|
$.each(dependency_list, function(i, field_name) { |
||||||
|
// Dependency in a fieldset.
|
||||||
|
let field_element = row.find('.form-row .field-' + field_name); |
||||||
|
// Dependency without a fieldset.
|
||||||
|
if (!field_element.length) { |
||||||
|
field_element = row.find('.form-row.field-' + field_name); |
||||||
|
} |
||||||
|
dependencies.push('#' + field_element.find('input, select, textarea').attr('id')); |
||||||
|
}); |
||||||
|
if (dependencies.length) { |
||||||
|
input.prepopulate(dependencies, input.attr('maxlength')); |
||||||
|
} |
||||||
|
}); |
||||||
|
}; |
||||||
|
|
||||||
|
$rows.formset({ |
||||||
|
prefix: options.prefix, |
||||||
|
addText: options.addText, |
||||||
|
formCssClass: "dynamic-" + options.prefix, |
||||||
|
deleteCssClass: "inline-deletelink", |
||||||
|
deleteText: options.deleteText, |
||||||
|
emptyCssClass: "empty-form", |
||||||
|
removed: updateInlineLabel, |
||||||
|
added: function(row) { |
||||||
|
initPrepopulatedFields(row); |
||||||
|
reinitDateTimeShortCuts(); |
||||||
|
updateSelectFilter(); |
||||||
|
updateInlineLabel(row); |
||||||
|
}, |
||||||
|
addButton: options.addButton |
||||||
|
}); |
||||||
|
|
||||||
|
return $rows; |
||||||
|
}; |
||||||
|
|
||||||
|
$(document).ready(function() { |
||||||
|
$(".js-inline-admin-formset").each(function() { |
||||||
|
const data = $(this).data(), |
||||||
|
inlineOptions = data.inlineFormset; |
||||||
|
let selector; |
||||||
|
switch(data.inlineType) { |
||||||
|
case "stacked": |
||||||
|
selector = inlineOptions.name + "-group .inline-related"; |
||||||
|
$(selector).stackedFormset(selector, inlineOptions.options); |
||||||
|
break; |
||||||
|
case "tabular": |
||||||
|
selector = inlineOptions.name + "-group .tabular.inline-related tbody:first > tr.form-row"; |
||||||
|
$(selector).tabularFormset(selector, inlineOptions.options); |
||||||
|
break; |
||||||
|
} |
||||||
|
}); |
||||||
|
}); |
||||||
|
} |
@ -0,0 +1,8 @@ |
|||||||
|
/*global jQuery:false*/ |
||||||
|
'use strict'; |
||||||
|
/* Puts the included jQuery into our own namespace using noConflict and passing |
||||||
|
* it 'true'. This ensures that the included jQuery doesn't pollute the global |
||||||
|
* namespace (i.e. this preserves pre-existing values for both window.$ and |
||||||
|
* window.jQuery). |
||||||
|
*/ |
||||||
|
window.django = {jQuery: jQuery.noConflict(true)}; |
@ -0,0 +1,79 @@ |
|||||||
|
'use strict'; |
||||||
|
{ |
||||||
|
const toggleNavSidebar = document.getElementById('toggle-nav-sidebar'); |
||||||
|
if (toggleNavSidebar !== null) { |
||||||
|
const navSidebar = document.getElementById('nav-sidebar'); |
||||||
|
const main = document.getElementById('main'); |
||||||
|
let navSidebarIsOpen = localStorage.getItem('django.admin.navSidebarIsOpen'); |
||||||
|
if (navSidebarIsOpen === null) { |
||||||
|
navSidebarIsOpen = 'true'; |
||||||
|
} |
||||||
|
main.classList.toggle('shifted', navSidebarIsOpen === 'true'); |
||||||
|
navSidebar.setAttribute('aria-expanded', navSidebarIsOpen); |
||||||
|
|
||||||
|
toggleNavSidebar.addEventListener('click', function() { |
||||||
|
if (navSidebarIsOpen === 'true') { |
||||||
|
navSidebarIsOpen = 'false'; |
||||||
|
} else { |
||||||
|
navSidebarIsOpen = 'true'; |
||||||
|
} |
||||||
|
localStorage.setItem('django.admin.navSidebarIsOpen', navSidebarIsOpen); |
||||||
|
main.classList.toggle('shifted'); |
||||||
|
navSidebar.setAttribute('aria-expanded', navSidebarIsOpen); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
function initSidebarQuickFilter() { |
||||||
|
const options = []; |
||||||
|
const navSidebar = document.getElementById('nav-sidebar'); |
||||||
|
if (!navSidebar) { |
||||||
|
return; |
||||||
|
} |
||||||
|
navSidebar.querySelectorAll('th[scope=row] a').forEach((container) => { |
||||||
|
options.push({title: container.innerHTML, node: container}); |
||||||
|
}); |
||||||
|
|
||||||
|
function checkValue(event) { |
||||||
|
let filterValue = event.target.value; |
||||||
|
if (filterValue) { |
||||||
|
filterValue = filterValue.toLowerCase(); |
||||||
|
} |
||||||
|
if (event.key === 'Escape') { |
||||||
|
filterValue = ''; |
||||||
|
event.target.value = ''; // clear input
|
||||||
|
} |
||||||
|
let matches = false; |
||||||
|
for (const o of options) { |
||||||
|
let displayValue = ''; |
||||||
|
if (filterValue) { |
||||||
|
if (o.title.toLowerCase().indexOf(filterValue) === -1) { |
||||||
|
displayValue = 'none'; |
||||||
|
} else { |
||||||
|
matches = true; |
||||||
|
} |
||||||
|
} |
||||||
|
// show/hide parent <TR>
|
||||||
|
o.node.parentNode.parentNode.style.display = displayValue; |
||||||
|
} |
||||||
|
if (!filterValue || matches) { |
||||||
|
event.target.classList.remove('no-results'); |
||||||
|
} else { |
||||||
|
event.target.classList.add('no-results'); |
||||||
|
} |
||||||
|
sessionStorage.setItem('django.admin.navSidebarFilterValue', filterValue); |
||||||
|
} |
||||||
|
|
||||||
|
const nav = document.getElementById('nav-filter'); |
||||||
|
nav.addEventListener('change', checkValue, false); |
||||||
|
nav.addEventListener('input', checkValue, false); |
||||||
|
nav.addEventListener('keyup', checkValue, false); |
||||||
|
|
||||||
|
const storedValue = sessionStorage.getItem('django.admin.navSidebarFilterValue'); |
||||||
|
if (storedValue) { |
||||||
|
nav.value = storedValue; |
||||||
|
checkValue({target: nav, key: ''}); |
||||||
|
} |
||||||
|
} |
||||||
|
window.initSidebarQuickFilter = initSidebarQuickFilter; |
||||||
|
initSidebarQuickFilter(); |
||||||
|
} |
@ -0,0 +1,16 @@ |
|||||||
|
/*global opener */ |
||||||
|
'use strict'; |
||||||
|
{ |
||||||
|
const initData = JSON.parse(document.getElementById('django-admin-popup-response-constants').dataset.popupResponse); |
||||||
|
switch(initData.action) { |
||||||
|
case 'change': |
||||||
|
opener.dismissChangeRelatedObjectPopup(window, initData.value, initData.obj, initData.new_value); |
||||||
|
break; |
||||||
|
case 'delete': |
||||||
|
opener.dismissDeleteRelatedObjectPopup(window, initData.value); |
||||||
|
break; |
||||||
|
default: |
||||||
|
opener.dismissAddRelatedObjectPopup(window, initData.value, initData.obj); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,43 @@ |
|||||||
|
/*global URLify*/ |
||||||
|
'use strict'; |
||||||
|
{ |
||||||
|
const $ = django.jQuery; |
||||||
|
$.fn.prepopulate = function(dependencies, maxLength, allowUnicode) { |
||||||
|
/* |
||||||
|
Depends on urlify.js |
||||||
|
Populates a selected field with the values of the dependent fields, |
||||||
|
URLifies and shortens the string. |
||||||
|
dependencies - array of dependent fields ids |
||||||
|
maxLength - maximum length of the URLify'd string |
||||||
|
allowUnicode - Unicode support of the URLify'd string |
||||||
|
*/ |
||||||
|
return this.each(function() { |
||||||
|
const prepopulatedField = $(this); |
||||||
|
|
||||||
|
const populate = function() { |
||||||
|
// Bail if the field's value has been changed by the user
|
||||||
|
if (prepopulatedField.data('_changed')) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
const values = []; |
||||||
|
$.each(dependencies, function(i, field) { |
||||||
|
field = $(field); |
||||||
|
if (field.val().length > 0) { |
||||||
|
values.push(field.val()); |
||||||
|
} |
||||||
|
}); |
||||||
|
prepopulatedField.val(URLify(values.join(' '), maxLength, allowUnicode)); |
||||||
|
}; |
||||||
|
|
||||||
|
prepopulatedField.data('_changed', false); |
||||||
|
prepopulatedField.on('change', function() { |
||||||
|
prepopulatedField.data('_changed', true); |
||||||
|
}); |
||||||
|
|
||||||
|
if (!prepopulatedField.val()) { |
||||||
|
$(dependencies.join(',')).on('keyup change focus', populate); |
||||||
|
} |
||||||
|
}); |
||||||
|
}; |
||||||
|
} |
@ -0,0 +1,15 @@ |
|||||||
|
'use strict'; |
||||||
|
{ |
||||||
|
const $ = django.jQuery; |
||||||
|
const fields = $('#django-admin-prepopulated-fields-constants').data('prepopulatedFields'); |
||||||
|
$.each(fields, function(index, field) { |
||||||
|
$( |
||||||
|
'.empty-form .form-row .field-' + field.name + |
||||||
|
', .empty-form.form-row .field-' + field.name + |
||||||
|
', .empty-form .form-row.field-' + field.name |
||||||
|
).addClass('prepopulated_field'); |
||||||
|
$(field.id).data('dependency_list', field.dependency_list).prepopulate( |
||||||
|
field.dependency_ids, field.maxLength, field.allowUnicode |
||||||
|
); |
||||||
|
}); |
||||||
|
} |
@ -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(); |
||||||
|
}); |
||||||
|
} |
@ -0,0 +1,169 @@ |
|||||||
|
/*global XRegExp*/ |
||||||
|
'use strict'; |
||||||
|
{ |
||||||
|
const LATIN_MAP = { |
||||||
|
'À': 'A', 'Á': 'A', 'Â': 'A', 'Ã': 'A', 'Ä': 'A', 'Å': 'A', 'Æ': 'AE', |
||||||
|
'Ç': 'C', 'È': 'E', 'É': 'E', 'Ê': 'E', 'Ë': 'E', 'Ì': 'I', 'Í': 'I', |
||||||
|
'Î': 'I', 'Ï': 'I', 'Ð': 'D', 'Ñ': 'N', 'Ò': 'O', 'Ó': 'O', 'Ô': 'O', |
||||||
|
'Õ': 'O', 'Ö': 'O', 'Ő': 'O', 'Ø': 'O', 'Ù': 'U', 'Ú': 'U', 'Û': 'U', |
||||||
|
'Ü': 'U', 'Ű': 'U', 'Ý': 'Y', 'Þ': 'TH', 'Ÿ': 'Y', 'ß': 'ss', 'à': 'a', |
||||||
|
'á': 'a', 'â': 'a', 'ã': 'a', 'ä': 'a', 'å': 'a', 'æ': 'ae', 'ç': 'c', |
||||||
|
'è': 'e', 'é': 'e', 'ê': 'e', 'ë': 'e', 'ì': 'i', 'í': 'i', 'î': 'i', |
||||||
|
'ï': 'i', 'ð': 'd', 'ñ': 'n', 'ò': 'o', 'ó': 'o', 'ô': 'o', 'õ': 'o', |
||||||
|
'ö': 'o', 'ő': 'o', 'ø': 'o', 'ù': 'u', 'ú': 'u', 'û': 'u', 'ü': 'u', |
||||||
|
'ű': 'u', 'ý': 'y', 'þ': 'th', 'ÿ': 'y' |
||||||
|
}; |
||||||
|
const LATIN_SYMBOLS_MAP = { |
||||||
|
'©': '(c)' |
||||||
|
}; |
||||||
|
const GREEK_MAP = { |
||||||
|
'α': 'a', 'β': 'b', 'γ': 'g', 'δ': 'd', 'ε': 'e', 'ζ': 'z', 'η': 'h', |
||||||
|
'θ': '8', 'ι': 'i', 'κ': 'k', 'λ': 'l', 'μ': 'm', 'ν': 'n', 'ξ': '3', |
||||||
|
'ο': 'o', 'π': 'p', 'ρ': 'r', 'σ': 's', 'τ': 't', 'υ': 'y', 'φ': 'f', |
||||||
|
'χ': 'x', 'ψ': 'ps', 'ω': 'w', 'ά': 'a', 'έ': 'e', 'ί': 'i', 'ό': 'o', |
||||||
|
'ύ': 'y', 'ή': 'h', 'ώ': 'w', 'ς': 's', 'ϊ': 'i', 'ΰ': 'y', 'ϋ': 'y', |
||||||
|
'ΐ': 'i', 'Α': 'A', 'Β': 'B', 'Γ': 'G', 'Δ': 'D', 'Ε': 'E', 'Ζ': 'Z', |
||||||
|
'Η': 'H', 'Θ': '8', 'Ι': 'I', 'Κ': 'K', 'Λ': 'L', 'Μ': 'M', 'Ν': 'N', |
||||||
|
'Ξ': '3', 'Ο': 'O', 'Π': 'P', 'Ρ': 'R', 'Σ': 'S', 'Τ': 'T', 'Υ': 'Y', |
||||||
|
'Φ': 'F', 'Χ': 'X', 'Ψ': 'PS', 'Ω': 'W', 'Ά': 'A', 'Έ': 'E', 'Ί': 'I', |
||||||
|
'Ό': 'O', 'Ύ': 'Y', 'Ή': 'H', 'Ώ': 'W', 'Ϊ': 'I', 'Ϋ': 'Y' |
||||||
|
}; |
||||||
|
const TURKISH_MAP = { |
||||||
|
'ş': 's', 'Ş': 'S', 'ı': 'i', 'İ': 'I', 'ç': 'c', 'Ç': 'C', 'ü': 'u', |
||||||
|
'Ü': 'U', 'ö': 'o', 'Ö': 'O', 'ğ': 'g', 'Ğ': 'G' |
||||||
|
}; |
||||||
|
const ROMANIAN_MAP = { |
||||||
|
'ă': 'a', 'î': 'i', 'ș': 's', 'ț': 't', 'â': 'a', |
||||||
|
'Ă': 'A', 'Î': 'I', 'Ș': 'S', 'Ț': 'T', 'Â': 'A' |
||||||
|
}; |
||||||
|
const RUSSIAN_MAP = { |
||||||
|
'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'е': 'e', 'ё': 'yo', |
||||||
|
'ж': 'zh', 'з': 'z', 'и': 'i', 'й': 'j', 'к': 'k', 'л': 'l', 'м': 'm', |
||||||
|
'н': 'n', 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u', |
||||||
|
'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch', 'ш': 'sh', 'щ': 'sh', 'ъ': '', |
||||||
|
'ы': 'y', 'ь': '', 'э': 'e', 'ю': 'yu', 'я': 'ya', |
||||||
|
'А': 'A', 'Б': 'B', 'В': 'V', 'Г': 'G', 'Д': 'D', 'Е': 'E', 'Ё': 'Yo', |
||||||
|
'Ж': 'Zh', 'З': 'Z', 'И': 'I', 'Й': 'J', 'К': 'K', 'Л': 'L', 'М': 'M', |
||||||
|
'Н': 'N', 'О': 'O', 'П': 'P', 'Р': 'R', 'С': 'S', 'Т': 'T', 'У': 'U', |
||||||
|
'Ф': 'F', 'Х': 'H', 'Ц': 'C', 'Ч': 'Ch', 'Ш': 'Sh', 'Щ': 'Sh', 'Ъ': '', |
||||||
|
'Ы': 'Y', 'Ь': '', 'Э': 'E', 'Ю': 'Yu', 'Я': 'Ya' |
||||||
|
}; |
||||||
|
const UKRAINIAN_MAP = { |
||||||
|
'Є': 'Ye', 'І': 'I', 'Ї': 'Yi', 'Ґ': 'G', 'є': 'ye', 'і': 'i', |
||||||
|
'ї': 'yi', 'ґ': 'g' |
||||||
|
}; |
||||||
|
const CZECH_MAP = { |
||||||
|
'č': 'c', 'ď': 'd', 'ě': 'e', 'ň': 'n', 'ř': 'r', 'š': 's', 'ť': 't', |
||||||
|
'ů': 'u', 'ž': 'z', 'Č': 'C', 'Ď': 'D', 'Ě': 'E', 'Ň': 'N', 'Ř': 'R', |
||||||
|
'Š': 'S', 'Ť': 'T', 'Ů': 'U', 'Ž': 'Z' |
||||||
|
}; |
||||||
|
const SLOVAK_MAP = { |
||||||
|
'á': 'a', 'ä': 'a', 'č': 'c', 'ď': 'd', 'é': 'e', 'í': 'i', 'ľ': 'l', |
||||||
|
'ĺ': 'l', 'ň': 'n', 'ó': 'o', 'ô': 'o', 'ŕ': 'r', 'š': 's', 'ť': 't', |
||||||
|
'ú': 'u', 'ý': 'y', 'ž': 'z', |
||||||
|
'Á': 'a', 'Ä': 'A', 'Č': 'C', 'Ď': 'D', 'É': 'E', 'Í': 'I', 'Ľ': 'L', |
||||||
|
'Ĺ': 'L', 'Ň': 'N', 'Ó': 'O', 'Ô': 'O', 'Ŕ': 'R', 'Š': 'S', 'Ť': 'T', |
||||||
|
'Ú': 'U', 'Ý': 'Y', 'Ž': 'Z' |
||||||
|
}; |
||||||
|
const POLISH_MAP = { |
||||||
|
'ą': 'a', 'ć': 'c', 'ę': 'e', 'ł': 'l', 'ń': 'n', 'ó': 'o', 'ś': 's', |
||||||
|
'ź': 'z', 'ż': 'z', |
||||||
|
'Ą': 'A', 'Ć': 'C', 'Ę': 'E', 'Ł': 'L', 'Ń': 'N', 'Ó': 'O', 'Ś': 'S', |
||||||
|
'Ź': 'Z', 'Ż': 'Z' |
||||||
|
}; |
||||||
|
const LATVIAN_MAP = { |
||||||
|
'ā': 'a', 'č': 'c', 'ē': 'e', 'ģ': 'g', 'ī': 'i', 'ķ': 'k', 'ļ': 'l', |
||||||
|
'ņ': 'n', 'š': 's', 'ū': 'u', 'ž': 'z', |
||||||
|
'Ā': 'A', 'Č': 'C', 'Ē': 'E', 'Ģ': 'G', 'Ī': 'I', 'Ķ': 'K', 'Ļ': 'L', |
||||||
|
'Ņ': 'N', 'Š': 'S', 'Ū': 'U', 'Ž': 'Z' |
||||||
|
}; |
||||||
|
const ARABIC_MAP = { |
||||||
|
'أ': 'a', 'ب': 'b', 'ت': 't', 'ث': 'th', 'ج': 'g', 'ح': 'h', 'خ': 'kh', 'د': 'd', |
||||||
|
'ذ': 'th', 'ر': 'r', 'ز': 'z', 'س': 's', 'ش': 'sh', 'ص': 's', 'ض': 'd', 'ط': 't', |
||||||
|
'ظ': 'th', 'ع': 'aa', 'غ': 'gh', 'ف': 'f', 'ق': 'k', 'ك': 'k', 'ل': 'l', 'م': 'm', |
||||||
|
'ن': 'n', 'ه': 'h', 'و': 'o', 'ي': 'y' |
||||||
|
}; |
||||||
|
const LITHUANIAN_MAP = { |
||||||
|
'ą': 'a', 'č': 'c', 'ę': 'e', 'ė': 'e', 'į': 'i', 'š': 's', 'ų': 'u', |
||||||
|
'ū': 'u', 'ž': 'z', |
||||||
|
'Ą': 'A', 'Č': 'C', 'Ę': 'E', 'Ė': 'E', 'Į': 'I', 'Š': 'S', 'Ų': 'U', |
||||||
|
'Ū': 'U', 'Ž': 'Z' |
||||||
|
}; |
||||||
|
const SERBIAN_MAP = { |
||||||
|
'ђ': 'dj', 'ј': 'j', 'љ': 'lj', 'њ': 'nj', 'ћ': 'c', 'џ': 'dz', |
||||||
|
'đ': 'dj', 'Ђ': 'Dj', 'Ј': 'j', 'Љ': 'Lj', 'Њ': 'Nj', 'Ћ': 'C', |
||||||
|
'Џ': 'Dz', 'Đ': 'Dj' |
||||||
|
}; |
||||||
|
const AZERBAIJANI_MAP = { |
||||||
|
'ç': 'c', 'ə': 'e', 'ğ': 'g', 'ı': 'i', 'ö': 'o', 'ş': 's', 'ü': 'u', |
||||||
|
'Ç': 'C', 'Ə': 'E', 'Ğ': 'G', 'İ': 'I', 'Ö': 'O', 'Ş': 'S', 'Ü': 'U' |
||||||
|
}; |
||||||
|
const GEORGIAN_MAP = { |
||||||
|
'ა': 'a', 'ბ': 'b', 'გ': 'g', 'დ': 'd', 'ე': 'e', 'ვ': 'v', 'ზ': 'z', |
||||||
|
'თ': 't', 'ი': 'i', 'კ': 'k', 'ლ': 'l', 'მ': 'm', 'ნ': 'n', 'ო': 'o', |
||||||
|
'პ': 'p', 'ჟ': 'j', 'რ': 'r', 'ს': 's', 'ტ': 't', 'უ': 'u', 'ფ': 'f', |
||||||
|
'ქ': 'q', 'ღ': 'g', 'ყ': 'y', 'შ': 'sh', 'ჩ': 'ch', 'ც': 'c', 'ძ': 'dz', |
||||||
|
'წ': 'w', 'ჭ': 'ch', 'ხ': 'x', 'ჯ': 'j', 'ჰ': 'h' |
||||||
|
}; |
||||||
|
|
||||||
|
const ALL_DOWNCODE_MAPS = [ |
||||||
|
LATIN_MAP, |
||||||
|
LATIN_SYMBOLS_MAP, |
||||||
|
GREEK_MAP, |
||||||
|
TURKISH_MAP, |
||||||
|
ROMANIAN_MAP, |
||||||
|
RUSSIAN_MAP, |
||||||
|
UKRAINIAN_MAP, |
||||||
|
CZECH_MAP, |
||||||
|
SLOVAK_MAP, |
||||||
|
POLISH_MAP, |
||||||
|
LATVIAN_MAP, |
||||||
|
ARABIC_MAP, |
||||||
|
LITHUANIAN_MAP, |
||||||
|
SERBIAN_MAP, |
||||||
|
AZERBAIJANI_MAP, |
||||||
|
GEORGIAN_MAP |
||||||
|
]; |
||||||
|
|
||||||
|
const Downcoder = { |
||||||
|
'Initialize': function() { |
||||||
|
if (Downcoder.map) { // already made
|
||||||
|
return; |
||||||
|
} |
||||||
|
Downcoder.map = {}; |
||||||
|
for (const lookup of ALL_DOWNCODE_MAPS) { |
||||||
|
Object.assign(Downcoder.map, lookup); |
||||||
|
} |
||||||
|
Downcoder.regex = new RegExp(Object.keys(Downcoder.map).join('|'), 'g'); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
function downcode(slug) { |
||||||
|
Downcoder.Initialize(); |
||||||
|
return slug.replace(Downcoder.regex, function(m) { |
||||||
|
return Downcoder.map[m]; |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
function URLify(s, num_chars, allowUnicode) { |
||||||
|
// changes, e.g., "Petty theft" to "petty-theft"
|
||||||
|
if (!allowUnicode) { |
||||||
|
s = downcode(s); |
||||||
|
} |
||||||
|
s = s.toLowerCase(); // convert to lowercase
|
||||||
|
// if downcode doesn't hit, the char will be stripped here
|
||||||
|
if (allowUnicode) { |
||||||
|
// Keep Unicode letters including both lowercase and uppercase
|
||||||
|
// characters, whitespace, and dash; remove other characters.
|
||||||
|
s = XRegExp.replace(s, XRegExp('[^-_\\p{L}\\p{N}\\s]', 'g'), ''); |
||||||
|
} else { |
||||||
|
s = s.replace(/[^-\w\s]/g, ''); // remove unneeded chars
|
||||||
|
} |
||||||
|
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
|
||||||
|
return s.replace(/-+$/g, ''); // trim any trailing hyphens
|
||||||
|
} |
||||||
|
window.URLify = URLify; |
||||||
|
} |
@ -0,0 +1,20 @@ |
|||||||
|
Copyright OpenJS Foundation and other contributors, https://openjsf.org/ |
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining |
||||||
|
a copy of this software and associated documentation files (the |
||||||
|
"Software"), to deal in the Software without restriction, including |
||||||
|
without limitation the rights to use, copy, modify, merge, publish, |
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to |
||||||
|
permit persons to whom the Software is furnished to do so, subject to |
||||||
|
the following conditions: |
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be |
||||||
|
included in all copies or substantial portions of the Software. |
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE |
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
@ -0,0 +1,21 @@ |
|||||||
|
The MIT License (MIT) |
||||||
|
|
||||||
|
Copyright (c) 2012-2017 Kevin Brown, Igor Vaynberg, and Select2 contributors |
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy |
||||||
|
of this software and associated documentation files (the "Software"), to deal |
||||||
|
in the Software without restriction, including without limitation the rights |
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
||||||
|
copies of the Software, and to permit persons to whom the Software is |
||||||
|
furnished to do so, subject to the following conditions: |
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in |
||||||
|
all copies or substantial portions of the Software. |
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
||||||
|
THE SOFTWARE. |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/af",[],function(){return{errorLoading:function(){return"Die resultate kon nie gelaai word nie."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Verwyders asseblief "+n+" character";return 1!=n&&(r+="s"),r},inputTooShort:function(e){return"Voer asseblief "+(e.minimum-e.input.length)+" of meer karakters"},loadingMore:function(){return"Meer resultate word gelaai…"},maximumSelected:function(e){var n="Kies asseblief net "+e.maximum+" item";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"Geen resultate gevind"},searching:function(){return"Besig…"},removeAllItems:function(){return"Verwyder alle items"}}}),e.define,e.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ar",[],function(){return{errorLoading:function(){return"لا يمكن تحميل النتائج"},inputTooLong:function(n){return"الرجاء حذف "+(n.input.length-n.maximum)+" عناصر"},inputTooShort:function(n){return"الرجاء إضافة "+(n.minimum-n.input.length)+" عناصر"},loadingMore:function(){return"جاري تحميل نتائج إضافية..."},maximumSelected:function(n){return"تستطيع إختيار "+n.maximum+" بنود فقط"},noResults:function(){return"لم يتم العثور على أي نتائج"},searching:function(){return"جاري البحث…"},removeAllItems:function(){return"قم بإزالة كل العناصر"}}}),n.define,n.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/az",[],function(){return{inputTooLong:function(n){return n.input.length-n.maximum+" simvol silin"},inputTooShort:function(n){return n.minimum-n.input.length+" simvol daxil edin"},loadingMore:function(){return"Daha çox nəticə yüklənir…"},maximumSelected:function(n){return"Sadəcə "+n.maximum+" element seçə bilərsiniz"},noResults:function(){return"Nəticə tapılmadı"},searching:function(){return"Axtarılır…"},removeAllItems:function(){return"Bütün elementləri sil"}}}),n.define,n.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/bg",[],function(){return{inputTooLong:function(n){var e=n.input.length-n.maximum,u="Моля въведете с "+e+" по-малко символ";return e>1&&(u+="a"),u},inputTooShort:function(n){var e=n.minimum-n.input.length,u="Моля въведете още "+e+" символ";return e>1&&(u+="a"),u},loadingMore:function(){return"Зареждат се още…"},maximumSelected:function(n){var e="Можете да направите до "+n.maximum+" ";return n.maximum>1?e+="избора":e+="избор",e},noResults:function(){return"Няма намерени съвпадения"},searching:function(){return"Търсене…"},removeAllItems:function(){return"Премахнете всички елементи"}}}),n.define,n.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/bs",[],function(){function e(e,n,r,t){return e%10==1&&e%100!=11?n:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?r:t}return{errorLoading:function(){return"Preuzimanje nije uspijelo."},inputTooLong:function(n){var r=n.input.length-n.maximum,t="Obrišite "+r+" simbol";return t+=e(r,"","a","a")},inputTooShort:function(n){var r=n.minimum-n.input.length,t="Ukucajte bar još "+r+" simbol";return t+=e(r,"","a","a")},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(n){var r="Možete izabrati samo "+n.maximum+" stavk";return r+=e(n.maximum,"u","e","i")},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Uklonite sve stavke"}}}),e.define,e.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/ca",[],function(){return{errorLoading:function(){return"La càrrega ha fallat"},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Si us plau, elimina "+n+" car";return r+=1==n?"àcter":"àcters"},inputTooShort:function(e){var n=e.minimum-e.input.length,r="Si us plau, introdueix "+n+" car";return r+=1==n?"àcter":"àcters"},loadingMore:function(){return"Carregant més resultats…"},maximumSelected:function(e){var n="Només es pot seleccionar "+e.maximum+" element";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No s'han trobat resultats"},searching:function(){return"Cercant…"},removeAllItems:function(){return"Treu tots els elements"}}}),e.define,e.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/cs",[],function(){function e(e,n){switch(e){case 2:return n?"dva":"dvě";case 3:return"tři";case 4:return"čtyři"}return""}return{errorLoading:function(){return"Výsledky nemohly být načteny."},inputTooLong:function(n){var t=n.input.length-n.maximum;return 1==t?"Prosím, zadejte o jeden znak méně.":t<=4?"Prosím, zadejte o "+e(t,!0)+" znaky méně.":"Prosím, zadejte o "+t+" znaků méně."},inputTooShort:function(n){var t=n.minimum-n.input.length;return 1==t?"Prosím, zadejte ještě jeden znak.":t<=4?"Prosím, zadejte ještě další "+e(t,!0)+" znaky.":"Prosím, zadejte ještě dalších "+t+" znaků."},loadingMore:function(){return"Načítají se další výsledky…"},maximumSelected:function(n){var t=n.maximum;return 1==t?"Můžete zvolit jen jednu položku.":t<=4?"Můžete zvolit maximálně "+e(t,!1)+" položky.":"Můžete zvolit maximálně "+t+" položek."},noResults:function(){return"Nenalezeny žádné položky."},searching:function(){return"Vyhledávání…"},removeAllItems:function(){return"Odstraňte všechny položky"}}}),e.define,e.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/da",[],function(){return{errorLoading:function(){return"Resultaterne kunne ikke indlæses."},inputTooLong:function(e){return"Angiv venligst "+(e.input.length-e.maximum)+" tegn mindre"},inputTooShort:function(e){return"Angiv venligst "+(e.minimum-e.input.length)+" tegn mere"},loadingMore:function(){return"Indlæser flere resultater…"},maximumSelected:function(e){var n="Du kan kun vælge "+e.maximum+" emne";return 1!=e.maximum&&(n+="r"),n},noResults:function(){return"Ingen resultater fundet"},searching:function(){return"Søger…"},removeAllItems:function(){return"Fjern alle elementer"}}}),e.define,e.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/de",[],function(){return{errorLoading:function(){return"Die Ergebnisse konnten nicht geladen werden."},inputTooLong:function(e){return"Bitte "+(e.input.length-e.maximum)+" Zeichen weniger eingeben"},inputTooShort:function(e){return"Bitte "+(e.minimum-e.input.length)+" Zeichen mehr eingeben"},loadingMore:function(){return"Lade mehr Ergebnisse…"},maximumSelected:function(e){var n="Sie können nur "+e.maximum+" Element";return 1!=e.maximum&&(n+="e"),n+=" auswählen"},noResults:function(){return"Keine Übereinstimmungen gefunden"},searching:function(){return"Suche…"},removeAllItems:function(){return"Entferne alle Elemente"}}}),e.define,e.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/dsb",[],function(){var n=["znamuško","znamušce","znamuška","znamuškow"],e=["zapisk","zapiska","zapiski","zapiskow"],u=function(n,e){return 1===n?e[0]:2===n?e[1]:n>2&&n<=4?e[2]:n>=5?e[3]:void 0};return{errorLoading:function(){return"Wuslědki njejsu se dali zacytaś."},inputTooLong:function(e){var a=e.input.length-e.maximum;return"Pšosym lašuj "+a+" "+u(a,n)},inputTooShort:function(e){var a=e.minimum-e.input.length;return"Pšosym zapódaj nanejmjenjej "+a+" "+u(a,n)},loadingMore:function(){return"Dalšne wuslědki se zacytaju…"},maximumSelected:function(n){return"Móžoš jano "+n.maximum+" "+u(n.maximum,e)+"wubraś."},noResults:function(){return"Žedne wuslědki namakane"},searching:function(){return"Pyta se…"},removeAllItems:function(){return"Remove all items"}}}),n.define,n.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/el",[],function(){return{errorLoading:function(){return"Τα αποτελέσματα δεν μπόρεσαν να φορτώσουν."},inputTooLong:function(n){var e=n.input.length-n.maximum,u="Παρακαλώ διαγράψτε "+e+" χαρακτήρ";return 1==e&&(u+="α"),1!=e&&(u+="ες"),u},inputTooShort:function(n){return"Παρακαλώ συμπληρώστε "+(n.minimum-n.input.length)+" ή περισσότερους χαρακτήρες"},loadingMore:function(){return"Φόρτωση περισσότερων αποτελεσμάτων…"},maximumSelected:function(n){var e="Μπορείτε να επιλέξετε μόνο "+n.maximum+" επιλογ";return 1==n.maximum&&(e+="ή"),1!=n.maximum&&(e+="ές"),e},noResults:function(){return"Δεν βρέθηκαν αποτελέσματα"},searching:function(){return"Αναζήτηση…"},removeAllItems:function(){return"Καταργήστε όλα τα στοιχεία"}}}),n.define,n.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Please delete "+n+" character";return 1!=n&&(r+="s"),r},inputTooShort:function(e){return"Please enter "+(e.minimum-e.input.length)+" or more characters"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var n="You can only select "+e.maximum+" item";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No results found"},searching:function(){return"Searching…"},removeAllItems:function(){return"Remove all items"}}}),e.define,e.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/es",[],function(){return{errorLoading:function(){return"No se pudieron cargar los resultados"},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Por favor, elimine "+n+" car";return r+=1==n?"ácter":"acteres"},inputTooShort:function(e){var n=e.minimum-e.input.length,r="Por favor, introduzca "+n+" car";return r+=1==n?"ácter":"acteres"},loadingMore:function(){return"Cargando más resultados…"},maximumSelected:function(e){var n="Sólo puede seleccionar "+e.maximum+" elemento";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No se encontraron resultados"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Eliminar todos los elementos"}}}),e.define,e.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/et",[],function(){return{inputTooLong:function(e){var n=e.input.length-e.maximum,t="Sisesta "+n+" täht";return 1!=n&&(t+="e"),t+=" vähem"},inputTooShort:function(e){var n=e.minimum-e.input.length,t="Sisesta "+n+" täht";return 1!=n&&(t+="e"),t+=" rohkem"},loadingMore:function(){return"Laen tulemusi…"},maximumSelected:function(e){var n="Saad vaid "+e.maximum+" tulemus";return 1==e.maximum?n+="e":n+="t",n+=" valida"},noResults:function(){return"Tulemused puuduvad"},searching:function(){return"Otsin…"},removeAllItems:function(){return"Eemalda kõik esemed"}}}),e.define,e.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/eu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Idatzi ";return n+=1==t?"karaktere bat":t+" karaktere",n+=" gutxiago"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Idatzi ";return n+=1==t?"karaktere bat":t+" karaktere",n+=" gehiago"},loadingMore:function(){return"Emaitza gehiago kargatzen…"},maximumSelected:function(e){return 1===e.maximum?"Elementu bakarra hauta dezakezu":e.maximum+" elementu hauta ditzakezu soilik"},noResults:function(){return"Ez da bat datorrenik aurkitu"},searching:function(){return"Bilatzen…"},removeAllItems:function(){return"Kendu elementu guztiak"}}}),e.define,e.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/fi",[],function(){return{errorLoading:function(){return"Tuloksia ei saatu ladattua."},inputTooLong:function(n){return"Ole hyvä ja anna "+(n.input.length-n.maximum)+" merkkiä vähemmän"},inputTooShort:function(n){return"Ole hyvä ja anna "+(n.minimum-n.input.length)+" merkkiä lisää"},loadingMore:function(){return"Ladataan lisää tuloksia…"},maximumSelected:function(n){return"Voit valita ainoastaan "+n.maximum+" kpl"},noResults:function(){return"Ei tuloksia"},searching:function(){return"Haetaan…"},removeAllItems:function(){return"Poista kaikki kohteet"}}}),n.define,n.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/fr",[],function(){return{errorLoading:function(){return"Les résultats ne peuvent pas être chargés."},inputTooLong:function(e){var n=e.input.length-e.maximum;return"Supprimez "+n+" caractère"+(n>1?"s":"")},inputTooShort:function(e){var n=e.minimum-e.input.length;return"Saisissez au moins "+n+" caractère"+(n>1?"s":"")},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelected:function(e){return"Vous pouvez seulement sélectionner "+e.maximum+" élément"+(e.maximum>1?"s":"")},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"},removeAllItems:function(){return"Supprimer tous les éléments"}}}),e.define,e.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/gl",[],function(){return{errorLoading:function(){return"Non foi posíbel cargar os resultados."},inputTooLong:function(e){var n=e.input.length-e.maximum;return 1===n?"Elimine un carácter":"Elimine "+n+" caracteres"},inputTooShort:function(e){var n=e.minimum-e.input.length;return 1===n?"Engada un carácter":"Engada "+n+" caracteres"},loadingMore:function(){return"Cargando máis resultados…"},maximumSelected:function(e){return 1===e.maximum?"Só pode seleccionar un elemento":"Só pode seleccionar "+e.maximum+" elementos"},noResults:function(){return"Non se atoparon resultados"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Elimina todos os elementos"}}}),e.define,e.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/he",[],function(){return{errorLoading:function(){return"שגיאה בטעינת התוצאות"},inputTooLong:function(n){var e=n.input.length-n.maximum,r="נא למחוק ";return r+=1===e?"תו אחד":e+" תווים"},inputTooShort:function(n){var e=n.minimum-n.input.length,r="נא להכניס ";return r+=1===e?"תו אחד":e+" תווים",r+=" או יותר"},loadingMore:function(){return"טוען תוצאות נוספות…"},maximumSelected:function(n){var e="באפשרותך לבחור עד ";return 1===n.maximum?e+="פריט אחד":e+=n.maximum+" פריטים",e},noResults:function(){return"לא נמצאו תוצאות"},searching:function(){return"מחפש…"},removeAllItems:function(){return"הסר את כל הפריטים"}}}),n.define,n.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hr",[],function(){function n(n){var e=" "+n+" znak";return n%10<5&&n%10>0&&(n%100<5||n%100>19)?n%10>1&&(e+="a"):e+="ova",e}return{errorLoading:function(){return"Preuzimanje nije uspjelo."},inputTooLong:function(e){return"Unesite "+n(e.input.length-e.maximum)},inputTooShort:function(e){return"Unesite još "+n(e.minimum-e.input.length)},loadingMore:function(){return"Učitavanje rezultata…"},maximumSelected:function(n){return"Maksimalan broj odabranih stavki je "+n.maximum},noResults:function(){return"Nema rezultata"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Ukloni sve stavke"}}}),n.define,n.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hsb",[],function(){var n=["znamješko","znamješce","znamješka","znamješkow"],e=["zapisk","zapiskaj","zapiski","zapiskow"],u=function(n,e){return 1===n?e[0]:2===n?e[1]:n>2&&n<=4?e[2]:n>=5?e[3]:void 0};return{errorLoading:function(){return"Wuslědki njedachu so začitać."},inputTooLong:function(e){var a=e.input.length-e.maximum;return"Prošu zhašej "+a+" "+u(a,n)},inputTooShort:function(e){var a=e.minimum-e.input.length;return"Prošu zapodaj znajmjeńša "+a+" "+u(a,n)},loadingMore:function(){return"Dalše wuslědki so začitaja…"},maximumSelected:function(n){return"Móžeš jenož "+n.maximum+" "+u(n.maximum,e)+"wubrać"},noResults:function(){return"Žane wuslědki namakane"},searching:function(){return"Pyta so…"},removeAllItems:function(){return"Remove all items"}}}),n.define,n.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/hu",[],function(){return{errorLoading:function(){return"Az eredmények betöltése nem sikerült."},inputTooLong:function(e){return"Túl hosszú. "+(e.input.length-e.maximum)+" karakterrel több, mint kellene."},inputTooShort:function(e){return"Túl rövid. Még "+(e.minimum-e.input.length)+" karakter hiányzik."},loadingMore:function(){return"Töltés…"},maximumSelected:function(e){return"Csak "+e.maximum+" elemet lehet kiválasztani."},noResults:function(){return"Nincs találat."},searching:function(){return"Keresés…"},removeAllItems:function(){return"Távolítson el minden elemet"}}}),e.define,e.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hy",[],function(){return{errorLoading:function(){return"Արդյունքները հնարավոր չէ բեռնել։"},inputTooLong:function(n){return"Խնդրում ենք հեռացնել "+(n.input.length-n.maximum)+" նշան"},inputTooShort:function(n){return"Խնդրում ենք մուտքագրել "+(n.minimum-n.input.length)+" կամ ավել նշաններ"},loadingMore:function(){return"Բեռնվում են նոր արդյունքներ․․․"},maximumSelected:function(n){return"Դուք կարող եք ընտրել առավելագույնը "+n.maximum+" կետ"},noResults:function(){return"Արդյունքներ չեն գտնվել"},searching:function(){return"Որոնում․․․"},removeAllItems:function(){return"Հեռացնել բոլոր տարրերը"}}}),n.define,n.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/id",[],function(){return{errorLoading:function(){return"Data tidak boleh diambil."},inputTooLong:function(n){return"Hapuskan "+(n.input.length-n.maximum)+" huruf"},inputTooShort:function(n){return"Masukkan "+(n.minimum-n.input.length)+" huruf lagi"},loadingMore:function(){return"Mengambil data…"},maximumSelected:function(n){return"Anda hanya dapat memilih "+n.maximum+" pilihan"},noResults:function(){return"Tidak ada data yang sesuai"},searching:function(){return"Mencari…"},removeAllItems:function(){return"Hapus semua item"}}}),n.define,n.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/is",[],function(){return{inputTooLong:function(n){var t=n.input.length-n.maximum,e="Vinsamlegast styttið texta um "+t+" staf";return t<=1?e:e+"i"},inputTooShort:function(n){var t=n.minimum-n.input.length,e="Vinsamlegast skrifið "+t+" staf";return t>1&&(e+="i"),e+=" í viðbót"},loadingMore:function(){return"Sæki fleiri niðurstöður…"},maximumSelected:function(n){return"Þú getur aðeins valið "+n.maximum+" atriði"},noResults:function(){return"Ekkert fannst"},searching:function(){return"Leita…"},removeAllItems:function(){return"Fjarlægðu öll atriði"}}}),n.define,n.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/it",[],function(){return{errorLoading:function(){return"I risultati non possono essere caricati."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Per favore cancella "+n+" caratter";return t+=1!==n?"i":"e"},inputTooShort:function(e){return"Per favore inserisci "+(e.minimum-e.input.length)+" o più caratteri"},loadingMore:function(){return"Caricando più risultati…"},maximumSelected:function(e){var n="Puoi selezionare solo "+e.maximum+" element";return 1!==e.maximum?n+="i":n+="o",n},noResults:function(){return"Nessun risultato trovato"},searching:function(){return"Sto cercando…"},removeAllItems:function(){return"Rimuovi tutti gli oggetti"}}}),e.define,e.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ja",[],function(){return{errorLoading:function(){return"結果が読み込まれませんでした"},inputTooLong:function(n){return n.input.length-n.maximum+" 文字を削除してください"},inputTooShort:function(n){return"少なくとも "+(n.minimum-n.input.length)+" 文字を入力してください"},loadingMore:function(){return"読み込み中…"},maximumSelected:function(n){return n.maximum+" 件しか選択できません"},noResults:function(){return"対象が見つかりません"},searching:function(){return"検索しています…"},removeAllItems:function(){return"すべてのアイテムを削除"}}}),n.define,n.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ka",[],function(){return{errorLoading:function(){return"მონაცემების ჩატვირთვა შეუძლებელია."},inputTooLong:function(n){return"გთხოვთ აკრიფეთ "+(n.input.length-n.maximum)+" სიმბოლოთი ნაკლები"},inputTooShort:function(n){return"გთხოვთ აკრიფეთ "+(n.minimum-n.input.length)+" სიმბოლო ან მეტი"},loadingMore:function(){return"მონაცემების ჩატვირთვა…"},maximumSelected:function(n){return"თქვენ შეგიძლიათ აირჩიოთ არაუმეტეს "+n.maximum+" ელემენტი"},noResults:function(){return"რეზულტატი არ მოიძებნა"},searching:function(){return"ძიება…"},removeAllItems:function(){return"ამოიღე ყველა ელემენტი"}}}),n.define,n.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ko",[],function(){return{errorLoading:function(){return"결과를 불러올 수 없습니다."},inputTooLong:function(n){return"너무 깁니다. "+(n.input.length-n.maximum)+" 글자 지워주세요."},inputTooShort:function(n){return"너무 짧습니다. "+(n.minimum-n.input.length)+" 글자 더 입력해주세요."},loadingMore:function(){return"불러오는 중…"},maximumSelected:function(n){return"최대 "+n.maximum+"개까지만 선택 가능합니다."},noResults:function(){return"결과가 없습니다."},searching:function(){return"검색 중…"},removeAllItems:function(){return"모든 항목 삭제"}}}),n.define,n.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/lt",[],function(){function n(n,e,i,t){return n%10==1&&(n%100<11||n%100>19)?e:n%10>=2&&n%10<=9&&(n%100<11||n%100>19)?i:t}return{inputTooLong:function(e){var i=e.input.length-e.maximum,t="Pašalinkite "+i+" simbol";return t+=n(i,"į","ius","ių")},inputTooShort:function(e){var i=e.minimum-e.input.length,t="Įrašykite dar "+i+" simbol";return t+=n(i,"į","ius","ių")},loadingMore:function(){return"Kraunama daugiau rezultatų…"},maximumSelected:function(e){var i="Jūs galite pasirinkti tik "+e.maximum+" element";return i+=n(e.maximum,"ą","us","ų")},noResults:function(){return"Atitikmenų nerasta"},searching:function(){return"Ieškoma…"},removeAllItems:function(){return"Pašalinti visus elementus"}}}),n.define,n.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/lv",[],function(){function e(e,n,u,i){return 11===e?n:e%10==1?u:i}return{inputTooLong:function(n){var u=n.input.length-n.maximum,i="Lūdzu ievadiet par "+u;return(i+=" simbol"+e(u,"iem","u","iem"))+" mazāk"},inputTooShort:function(n){var u=n.minimum-n.input.length,i="Lūdzu ievadiet vēl "+u;return i+=" simbol"+e(u,"us","u","us")},loadingMore:function(){return"Datu ielāde…"},maximumSelected:function(n){var u="Jūs varat izvēlēties ne vairāk kā "+n.maximum;return u+=" element"+e(n.maximum,"us","u","us")},noResults:function(){return"Sakritību nav"},searching:function(){return"Meklēšana…"},removeAllItems:function(){return"Noņemt visus vienumus"}}}),e.define,e.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/mk",[],function(){return{inputTooLong:function(n){var e=(n.input.length,n.maximum,"Ве молиме внесете "+n.maximum+" помалку карактер");return 1!==n.maximum&&(e+="и"),e},inputTooShort:function(n){var e=(n.minimum,n.input.length,"Ве молиме внесете уште "+n.maximum+" карактер");return 1!==n.maximum&&(e+="и"),e},loadingMore:function(){return"Вчитување резултати…"},maximumSelected:function(n){var e="Можете да изберете само "+n.maximum+" ставк";return 1===n.maximum?e+="а":e+="и",e},noResults:function(){return"Нема пронајдено совпаѓања"},searching:function(){return"Пребарување…"},removeAllItems:function(){return"Отстрани ги сите предмети"}}}),n.define,n.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ms",[],function(){return{errorLoading:function(){return"Keputusan tidak berjaya dimuatkan."},inputTooLong:function(n){return"Sila hapuskan "+(n.input.length-n.maximum)+" aksara"},inputTooShort:function(n){return"Sila masukkan "+(n.minimum-n.input.length)+" atau lebih aksara"},loadingMore:function(){return"Sedang memuatkan keputusan…"},maximumSelected:function(n){return"Anda hanya boleh memilih "+n.maximum+" pilihan"},noResults:function(){return"Tiada padanan yang ditemui"},searching:function(){return"Mencari…"},removeAllItems:function(){return"Keluarkan semua item"}}}),n.define,n.require}(); |
@ -0,0 +1,3 @@ |
|||||||
|
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ |
||||||
|
|
||||||
|
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/nb",[],function(){return{errorLoading:function(){return"Kunne ikke hente resultater."},inputTooLong:function(e){return"Vennligst fjern "+(e.input.length-e.maximum)+" tegn"},inputTooShort:function(e){return"Vennligst skriv inn "+(e.minimum-e.input.length)+" tegn til"},loadingMore:function(){return"Laster flere resultater…"},maximumSelected:function(e){return"Du kan velge maks "+e.maximum+" elementer"},noResults:function(){return"Ingen treff"},searching:function(){return"Søker…"},removeAllItems:function(){return"Fjern alle elementer"}}}),e.define,e.require}(); |