Update statics

This commit is contained in:
Mauricio 2023-07-06 18:27:52 -06:00
parent 170ac1730d
commit 1603baff0e
24 changed files with 1117 additions and 576 deletions

View File

@ -2,93 +2,90 @@
DJANGO Admin styles DJANGO Admin styles
*/ */
@import url(fonts.css);
/* VARIABLE DEFINITIONS */ /* VARIABLE DEFINITIONS */
html[data-theme="light"],
:root { :root {
--primary: #79aec8; --primary: #79aec8;
--secondary: #417690; --secondary: #417690;
--accent: #f5dd5d; --accent: #f5dd5d;
--primary-fg: #fff; --primary-fg: #fff;
--body-fg: #333; --body-fg: #333;
--body-bg: #fff; --body-bg: #fff;
--body-quiet-color: #666; --body-quiet-color: #666;
--body-loud-color: #000; --body-loud-color: #000;
--header-color: #ffc; --header-color: #ffc;
--header-branding-color: var(--accent); --header-branding-color: var(--accent);
--header-bg: var(--secondary); --header-bg: var(--secondary);
--header-link-color: var(--primary-fg); --header-link-color: var(--primary-fg);
--breadcrumbs-fg: #c4dce8; --breadcrumbs-fg: #c4dce8;
--breadcrumbs-link-fg: var(--body-bg); --breadcrumbs-link-fg: var(--body-bg);
--breadcrumbs-bg: var(--primary);
--link-fg: #447e9b;
--link-hover-color: #036;
--link-selected-fg: #5b80b2;
--hairline-color: #e8e8e8;
--border-color: #ccc;
--error-fg: #ba2121;
--message-success-bg: #dfd;
--message-warning-bg: #ffc;
--message-error-bg: #ffefef;
--darkened-bg: #f8f8f8; /* A bit darker than --body-bg */
--selected-bg: #e4e4e4; /* E.g. selected table cells */
--selected-row: #ffc;
--button-fg: #fff;
--button-bg: var(--primary);
--button-hover-bg: #609ab6;
--default-button-bg: var(--secondary);
--default-button-hover-bg: #205067;
--close-button-bg: #888; /* Previously #bbb, contrast 1.92 */
--close-button-hover-bg: #747474;
--delete-button-bg: #ba2121;
--delete-button-hover-bg: #a41515;
--object-tools-fg: var(--button-fg);
--object-tools-bg: var(--close-button-bg);
--object-tools-hover-bg: var(--close-button-hover-bg);
}
@media (prefers-color-scheme: dark) {
:root {
--primary: #264b5d;
--primary-fg: #eee;
--body-fg: #eeeeee;
--body-bg: #121212;
--body-quiet-color: #e0e0e0;
--body-loud-color: #ffffff;
--breadcrumbs-link-fg: #e0e0e0;
--breadcrumbs-bg: var(--primary); --breadcrumbs-bg: var(--primary);
--link-fg: #81d4fa; --link-fg: #417893;
--link-hover-color: #4ac1f7; --link-hover-color: #036;
--link-selected-fg: #6f94c6; --link-selected-fg: #5b80b2;
--hairline-color: #272727; --hairline-color: #e8e8e8;
--border-color: #353535; --border-color: #ccc;
--error-fg: #e35f5f; --error-fg: #ba2121;
--message-success-bg: #006b1b;
--message-warning-bg: #583305;
--message-error-bg: #570808;
--darkened-bg: #212121; --message-success-bg: #dfd;
--selected-bg: #1b1b1b; --message-warning-bg: #ffc;
--selected-row: #00363a; --message-error-bg: #ffefef;
--close-button-bg: #333333; --darkened-bg: #f8f8f8; /* A bit darker than --body-bg */
--close-button-hover-bg: #666666; --selected-bg: #e4e4e4; /* E.g. selected table cells */
} --selected-row: #ffc;
--button-fg: #fff;
--button-bg: var(--primary);
--button-hover-bg: #609ab6;
--default-button-bg: var(--secondary);
--default-button-hover-bg: #205067;
--close-button-bg: #747474;
--close-button-hover-bg: #333;
--delete-button-bg: #ba2121;
--delete-button-hover-bg: #a41515;
--object-tools-fg: var(--button-fg);
--object-tools-bg: var(--close-button-bg);
--object-tools-hover-bg: var(--close-button-hover-bg);
--font-family-primary:
-apple-system,
BlinkMacSystemFont,
"Segoe UI",
system-ui,
Roboto,
"Helvetica Neue",
Arial,
sans-serif,
"Apple Color Emoji",
"Segoe UI Emoji",
"Segoe UI Symbol",
"Noto Color Emoji";
--font-family-monospace:
ui-monospace,
Menlo,
Monaco,
"Cascadia Mono",
"Segoe UI Mono",
"Roboto Mono",
"Oxygen Mono",
"Ubuntu Monospace",
"Source Code Pro",
"Fira Mono",
"Droid Sans Mono",
"Courier New",
monospace,
"Apple Color Emoji",
"Segoe UI Emoji",
"Segoe UI Symbol",
"Noto Color Emoji";
} }
html, body { html, body {
@ -98,8 +95,8 @@ html, body {
body { body {
margin: 0; margin: 0;
padding: 0; padding: 0;
font-size: 14px; font-size: 0.875rem;
font-family: "Roboto","Lucida Grande","DejaVu Sans","Bitstream Vera Sans",Verdana,Arial,sans-serif; font-family: var(--font-family-primary);
color: var(--body-fg); color: var(--body-fg);
background: var(--body-bg); background: var(--body-bg);
} }
@ -151,12 +148,12 @@ h1,h2,h3,h4,h5 {
h1 { h1 {
margin: 0 0 20px; margin: 0 0 20px;
font-weight: 300; font-weight: 300;
font-size: 20px; font-size: 1.25rem;
color: var(--body-quiet-color); color: var(--body-quiet-color);
} }
h2 { h2 {
font-size: 16px; font-size: 1rem;
margin: 1em 0 .5em 0; margin: 1em 0 .5em 0;
} }
@ -166,20 +163,20 @@ h2.subhead {
} }
h3 { h3 {
font-size: 14px; font-size: 0.875rem;
margin: .8em 0 .3em 0; margin: .8em 0 .3em 0;
color: var(--body-quiet-color); color: var(--body-quiet-color);
font-weight: bold; font-weight: bold;
} }
h4 { h4 {
font-size: 12px; font-size: 0.75rem;
margin: 1em 0 .8em 0; margin: 1em 0 .8em 0;
padding-bottom: 3px; padding-bottom: 3px;
} }
h5 { h5 {
font-size: 10px; font-size: 0.625rem;
margin: 1.5em 0 .5em 0; margin: 1.5em 0 .5em 0;
color: var(--body-quiet-color); color: var(--body-quiet-color);
text-transform: uppercase; text-transform: uppercase;
@ -196,8 +193,8 @@ li ul {
} }
li, dt, dd { li, dt, dd {
font-size: 13px; font-size: 0.8125rem;
line-height: 20px; line-height: 1.25rem;
} }
dt { dt {
@ -223,7 +220,7 @@ fieldset {
} }
blockquote { blockquote {
font-size: 11px; font-size: 0.6875rem;
color: #777; color: #777;
margin-left: 2px; margin-left: 2px;
padding-left: 10px; padding-left: 10px;
@ -231,9 +228,9 @@ blockquote {
} }
code, pre { code, pre {
font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace; font-family: var(--font-family-monospace);
color: var(--body-quiet-color); color: var(--body-quiet-color);
font-size: 12px; font-size: 0.75rem;
overflow-x: auto; overflow-x: auto;
} }
@ -255,22 +252,21 @@ hr {
border: none; border: none;
margin: 0; margin: 0;
padding: 0; padding: 0;
font-size: 1px;
line-height: 1px; line-height: 1px;
} }
/* TEXT STYLES & MODIFIERS */ /* TEXT STYLES & MODIFIERS */
.small { .small {
font-size: 11px; font-size: 0.6875rem;
} }
.mini { .mini {
font-size: 10px; font-size: 0.625rem;
} }
.help, p.help, form p.help, div.help, form div.help, div.help li { .help, p.help, form p.help, div.help, form div.help, div.help li {
font-size: 11px; font-size: 0.6875rem;
color: var(--body-quiet-color); color: var(--body-quiet-color);
} }
@ -300,7 +296,7 @@ p img, h1 img, h2 img, h3 img, h4 img, td img {
} }
.hidden { .hidden {
display: none; display: none !important;
} }
/* TABLES */ /* TABLES */
@ -311,8 +307,8 @@ table {
} }
td, th { td, th {
font-size: 13px; font-size: 0.8125rem;
line-height: 16px; line-height: 1rem;
border-bottom: 1px solid var(--hairline-color); border-bottom: 1px solid var(--hairline-color);
vertical-align: top; vertical-align: top;
padding: 8px; padding: 8px;
@ -327,7 +323,7 @@ thead th,
tfoot td { tfoot td {
color: var(--body-quiet-color); color: var(--body-quiet-color);
padding: 5px 10px; padding: 5px 10px;
font-size: 11px; font-size: 0.6875rem;
background: var(--body-bg); background: var(--body-bg);
border: none; border: none;
border-top: 1px solid var(--hairline-color); border-top: 1px solid var(--hairline-color);
@ -437,7 +433,7 @@ table thead th.sorted .sortoptions a.sortremove:after {
top: -6px; top: -6px;
left: 3px; left: 3px;
font-weight: 200; font-weight: 200;
font-size: 18px; font-size: 1.125rem;
color: var(--body-quiet-color); color: var(--body-quiet-color);
} }
@ -476,9 +472,9 @@ input, textarea, select, .form-row p, form .button {
margin: 2px 0; margin: 2px 0;
padding: 2px 3px; padding: 2px 3px;
vertical-align: middle; vertical-align: middle;
font-family: "Roboto", "Lucida Grande", Verdana, Arial, sans-serif; font-family: var(--font-family-primary);
font-weight: normal; font-weight: normal;
font-size: 13px; font-size: 0.8125rem;
} }
.form-row div.help { .form-row div.help {
padding: 2px 3px; padding: 2px 3px;
@ -505,7 +501,7 @@ textarea:focus, select:focus, .vTextField:focus {
} }
select { select {
height: 30px; height: 1.875rem;
} }
select[multiple] { select[multiple] {
@ -541,7 +537,6 @@ a.button {
} }
.button.default, input[type=submit].default, .submit-row input.default { .button.default, input[type=submit].default, .submit-row input.default {
float: right;
border: none; border: none;
font-weight: 400; font-weight: 400;
background: var(--default-button-bg); background: var(--default-button-bg);
@ -589,7 +584,7 @@ input[type=button][disabled].default {
margin: 0; margin: 0;
padding: 8px; padding: 8px;
font-weight: 400; font-weight: 400;
font-size: 13px; font-size: 0.8125rem;
text-align: left; text-align: left;
background: var(--primary); background: var(--primary);
color: var(--header-link-color); color: var(--header-link-color);
@ -597,7 +592,7 @@ input[type=button][disabled].default {
.module caption, .module caption,
.inline-group h2 { .inline-group h2 {
font-size: 12px; font-size: 0.75rem;
letter-spacing: 0.5px; letter-spacing: 0.5px;
text-transform: uppercase; text-transform: uppercase;
} }
@ -616,12 +611,13 @@ ul.messagelist {
ul.messagelist li { ul.messagelist li {
display: block; display: block;
font-weight: 400; font-weight: 400;
font-size: 13px; font-size: 0.8125rem;
padding: 10px 10px 10px 65px; padding: 10px 10px 10px 65px;
margin: 0 0 10px 0; margin: 0 0 10px 0;
background: var(--message-success-bg) url(../img/icon-yes.svg) 40px 12px no-repeat; background: var(--message-success-bg) url(../img/icon-yes.svg) 40px 12px no-repeat;
background-size: 16px auto; background-size: 16px auto;
color: var(--body-fg); color: var(--body-fg);
word-break: break-word;
} }
ul.messagelist li.warning { ul.messagelist li.warning {
@ -635,7 +631,7 @@ ul.messagelist li.error {
} }
.errornote { .errornote {
font-size: 14px; font-size: 0.875rem;
font-weight: 700; font-weight: 700;
display: block; display: block;
padding: 10px 12px; padding: 10px 12px;
@ -656,7 +652,7 @@ ul.errorlist {
} }
ul.errorlist li { ul.errorlist li {
font-size: 13px; font-size: 0.8125rem;
display: block; display: block;
margin-bottom: 4px; margin-bottom: 4px;
overflow-wrap: break-word; overflow-wrap: break-word;
@ -697,7 +693,7 @@ td ul.errorlist + input, td ul.errorlist + select, td ul.errorlist + textarea {
} }
.description { .description {
font-size: 12px; font-size: 0.75rem;
padding: 5px 0 0 12px; padding: 5px 0 0 12px;
} }
@ -753,7 +749,7 @@ a.deletelink:focus, a.deletelink:hover {
/* OBJECT TOOLS */ /* OBJECT TOOLS */
.object-tools { .object-tools {
font-size: 10px; font-size: 0.625rem;
font-weight: bold; font-weight: bold;
padding-left: 0; padding-left: 0;
float: right; float: right;
@ -765,7 +761,7 @@ a.deletelink:focus, a.deletelink:hover {
display: block; display: block;
float: left; float: left;
margin-left: 5px; margin-left: 5px;
height: 16px; height: 1rem;
} }
.object-tools a { .object-tools a {
@ -779,7 +775,7 @@ a.deletelink:focus, a.deletelink:hover {
background: var(--object-tools-bg); background: var(--object-tools-bg);
color: var(--object-tools-fg); color: var(--object-tools-fg);
font-weight: 400; font-weight: 400;
font-size: 11px; font-size: 0.6875rem;
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.5px; letter-spacing: 0.5px;
} }
@ -808,14 +804,21 @@ a.deletelink:focus, a.deletelink:hover {
/* OBJECT HISTORY */ /* OBJECT HISTORY */
table#change-history { #change-history table {
width: 100%; width: 100%;
} }
table#change-history tbody th { #change-history table tbody th {
width: 16em; width: 16em;
} }
#change-history .paginator {
color: var(--body-quiet-color);
border-bottom: 1px solid var(--hairline-color);
background: var(--body-bg);
overflow: hidden;
}
/* PAGE STRUCTURE */ /* PAGE STRUCTURE */
#container { #container {
@ -842,6 +845,20 @@ table#change-history tbody th {
max-width: 100%; max-width: 100%;
} }
.skip-to-content-link {
position: absolute;
top: -999px;
margin: 5px;
padding: 5px;
background: var(--body-bg);
z-index: 1;
}
.skip-to-content-link:focus {
left: 0px;
top: 0px;
}
#content { #content {
padding: 20px 40px; padding: 20px 40px;
} }
@ -905,7 +922,7 @@ table#change-history tbody th {
overflow: hidden; overflow: hidden;
} }
#header a:link, #header a:visited { #header a:link, #header a:visited, #logout-form button {
color: var(--header-link-color); color: var(--header-link-color);
} }
@ -914,24 +931,25 @@ table#change-history tbody th {
} }
#branding { #branding {
float: left; display: flex;
} }
#branding h1 { #branding h1 {
padding: 0; padding: 0;
margin: 0 20px 0 0; margin: 0;
margin-inline-end: 20px;
font-weight: 300; font-weight: 300;
font-size: 24px; font-size: 1.5rem;
color: var(--accent); color: var(--header-branding-color);
} }
#branding h1, #branding h1 a:link, #branding h1 a:visited { #branding h1 a:link, #branding h1 a:visited {
color: var(--accent); color: var(--accent);
} }
#branding h2 { #branding h2 {
padding: 0 10px; padding: 0 10px;
font-size: 14px; font-size: 0.875rem;
margin: -8px 0 8px 0; margin: -8px 0 8px 0;
font-weight: normal; font-weight: normal;
color: var(--header-color); color: var(--header-color);
@ -941,25 +959,43 @@ table#change-history tbody th {
text-decoration: none; text-decoration: none;
} }
#logout-form {
display: inline;
}
#logout-form button {
background: none;
border: 0;
cursor: pointer;
font-family: var(--font-family-primary);
}
#user-tools { #user-tools {
float: right; float: right;
padding: 0;
margin: 0 0 0 20px; margin: 0 0 0 20px;
font-weight: 300;
font-size: 11px;
letter-spacing: 0.5px;
text-transform: uppercase;
text-align: right; text-align: right;
} }
#user-tools a { #user-tools, #logout-form button{
padding: 0;
font-weight: 300;
font-size: 0.6875rem;
letter-spacing: 0.5px;
text-transform: uppercase;
}
#user-tools a, #logout-form button {
border-bottom: 1px solid rgba(255, 255, 255, 0.25); border-bottom: 1px solid rgba(255, 255, 255, 0.25);
} }
#user-tools a:focus, #user-tools a:hover { #user-tools a:focus, #user-tools a:hover,
#logout-form button:active, #logout-form button:hover {
text-decoration: none; text-decoration: none;
border-bottom-color: var(--primary); border-bottom: 0;
color: var(--primary); }
#logout-form button:active, #logout-form button:hover {
margin-bottom: 1px;
} }
/* SIDEBAR */ /* SIDEBAR */
@ -979,7 +1015,7 @@ table#change-history tbody th {
} }
#content-related h4 { #content-related h4 {
font-size: 13px; font-size: 0.8125rem;
} }
#content-related p { #content-related p {
@ -1003,7 +1039,7 @@ table#change-history tbody th {
padding: 16px; padding: 16px;
margin-bottom: 16px; margin-bottom: 16px;
border-bottom: 1px solid var(--hairline-color); border-bottom: 1px solid var(--hairline-color);
font-size: 18px; font-size: 1.125rem;
color: var(--body-fg); color: var(--body-fg);
} }
@ -1023,8 +1059,8 @@ table#change-history tbody th {
.delete-confirmation form .cancel-link { .delete-confirmation form .cancel-link {
display: inline-block; display: inline-block;
vertical-align: middle; vertical-align: middle;
height: 15px; height: 0.9375rem;
line-height: 15px; line-height: 0.9375rem;
border-radius: 4px; border-radius: 4px;
padding: 10px 15px; padding: 10px 15px;
color: var(--button-fg); color: var(--button-fg);
@ -1050,3 +1086,53 @@ table#change-history tbody th {
.popup #header { .popup #header {
padding: 10px 20px; padding: 10px 20px;
} }
/* PAGINATOR */
.paginator {
font-size: 0.8125rem;
padding-top: 10px;
padding-bottom: 10px;
line-height: 22px;
margin: 0;
border-top: 1px solid var(--hairline-color);
width: 100%;
}
.paginator a:link, .paginator a:visited {
padding: 2px 6px;
background: var(--button-bg);
text-decoration: none;
color: var(--button-fg);
}
.paginator a.showall {
border: none;
background: none;
color: var(--link-fg);
}
.paginator a.showall:focus, .paginator a.showall:hover {
background: none;
color: var(--link-hover-color);
}
.paginator .end {
margin-right: 6px;
}
.paginator .this-page {
padding: 2px 6px;
font-weight: bold;
font-size: 0.8125rem;
vertical-align: top;
}
.paginator a:focus, .paginator a:hover {
color: white;
background: var(--link-hover-color);
}
.base-svgs {
display: none;
}

View File

@ -84,18 +84,18 @@
#toolbar form input { #toolbar form input {
border-radius: 4px; border-radius: 4px;
font-size: 14px; font-size: 0.875rem;
padding: 5px; padding: 5px;
color: var(--body-fg); color: var(--body-fg);
} }
#toolbar #searchbar { #toolbar #searchbar {
height: 19px; height: 1.1875rem;
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
padding: 2px 5px; padding: 2px 5px;
margin: 0; margin: 0;
vertical-align: top; vertical-align: top;
font-size: 13px; font-size: 0.8125rem;
max-width: 100%; max-width: 100%;
} }
@ -105,7 +105,7 @@
#toolbar form input[type="submit"] { #toolbar form input[type="submit"] {
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
font-size: 13px; font-size: 0.8125rem;
padding: 4px 8px; padding: 4px 8px;
margin: 0; margin: 0;
vertical-align: middle; vertical-align: middle;
@ -125,6 +125,10 @@
margin-right: 4px; margin-right: 4px;
} }
#changelist-search .help {
word-break: break-word;
}
/* FILTER COLUMN */ /* FILTER COLUMN */
#changelist-filter { #changelist-filter {
@ -136,7 +140,7 @@
} }
#changelist-filter h2 { #changelist-filter h2 {
font-size: 14px; font-size: 0.875rem;
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.5px; letter-spacing: 0.5px;
padding: 5px 15px; padding: 5px 15px;
@ -144,12 +148,35 @@
border-bottom: none; border-bottom: none;
} }
#changelist-filter h3 { #changelist-filter h3,
#changelist-filter details summary {
font-weight: 400; font-weight: 400;
padding: 0 15px; padding: 0 15px;
margin-bottom: 10px; 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 { #changelist-filter ul {
margin: 5px 0; margin: 5px 0;
padding: 0 15px 15px; padding: 0 15px 15px;
@ -169,8 +196,7 @@
#changelist-filter a { #changelist-filter a {
display: block; display: block;
color: var(--body-quiet-color); color: var(--body-quiet-color);
text-overflow: ellipsis; word-break: break-word;
overflow-x: hidden;
} }
#changelist-filter li.selected { #changelist-filter li.selected {
@ -190,83 +216,34 @@
} }
#changelist-filter #changelist-filter-clear a { #changelist-filter #changelist-filter-clear a {
font-size: 13px; font-size: 0.8125rem;
padding-bottom: 10px; padding-bottom: 10px;
border-bottom: 1px solid var(--hairline-color); border-bottom: 1px solid var(--hairline-color);
} }
/* DATE DRILLDOWN */ /* DATE DRILLDOWN */
.change-list ul.toplinks { .change-list .toplinks {
display: block; display: flex;
float: left; padding-bottom: 5px;
padding: 0; flex-wrap: wrap;
margin: 0; gap: 3px 17px;
width: 100%;
}
.change-list ul.toplinks li {
padding: 3px 6px;
font-weight: bold; font-weight: bold;
list-style-type: none;
display: inline-block;
} }
.change-list ul.toplinks .date-back a { .change-list .toplinks a {
font-size: 0.8125rem;
}
.change-list .toplinks .date-back {
color: var(--body-quiet-color); color: var(--body-quiet-color);
} }
.change-list ul.toplinks .date-back a:focus, .change-list .toplinks .date-back:focus,
.change-list ul.toplinks .date-back a:hover { .change-list .toplinks .date-back:hover {
color: var(--link-hover-color); color: var(--link-hover-color);
} }
/* PAGINATOR */
.paginator {
font-size: 13px;
padding-top: 10px;
padding-bottom: 10px;
line-height: 22px;
margin: 0;
border-top: 1px solid var(--hairline-color);
width: 100%;
}
.paginator a:link, .paginator a:visited {
padding: 2px 6px;
background: var(--button-bg);
text-decoration: none;
color: var(--button-fg);
}
.paginator a.showall {
border: none;
background: none;
color: var(--link-fg);
}
.paginator a.showall:focus, .paginator a.showall:hover {
background: none;
color: var(--link-hover-color);
}
.paginator .end {
margin-right: 6px;
}
.paginator .this-page {
padding: 2px 6px;
font-weight: bold;
font-size: 13px;
vertical-align: top;
}
.paginator a:focus, .paginator a:hover {
color: white;
background: var(--link-hover-color);
}
/* ACTIONS */ /* ACTIONS */
.filtered .actions { .filtered .actions {
@ -278,7 +255,13 @@
vertical-align: baseline; vertical-align: baseline;
} }
#changelist table tbody tr.selected { /* Once the :has() pseudo-class is supported by all browsers, the tr.selected
selector and the JS adding the class can be removed. */
#changelist tbody tr.selected {
background-color: var(--selected-row);
}
#changelist tbody tr:has(.action-select:checked) {
background-color: var(--selected-row); background-color: var(--selected-row);
} }
@ -287,22 +270,16 @@
background: var(--body-bg); background: var(--body-bg);
border-top: none; border-top: none;
border-bottom: none; border-bottom: none;
line-height: 24px; line-height: 1.5rem;
color: var(--body-quiet-color); color: var(--body-quiet-color);
width: 100%; width: 100%;
} }
#changelist .actions.selected { /* XXX Probably unused? */
background: var(--body-bg);
border-top: 1px solid var(--body-bg);
border-bottom: 1px solid #edecd6;
}
#changelist .actions span.all, #changelist .actions span.all,
#changelist .actions span.action-counter, #changelist .actions span.action-counter,
#changelist .actions span.clear, #changelist .actions span.clear,
#changelist .actions span.question { #changelist .actions span.question {
font-size: 13px; font-size: 0.8125rem;
margin: 0 0.5em; margin: 0 0.5em;
} }
@ -312,11 +289,11 @@
#changelist .actions select { #changelist .actions select {
vertical-align: top; vertical-align: top;
height: 24px; height: 1.5rem;
color: var(--body-fg); color: var(--body-fg);
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
border-radius: 4px; border-radius: 4px;
font-size: 14px; font-size: 0.875rem;
padding: 0 0 0 4px; padding: 0 0 0 4px;
margin: 0; margin: 0;
margin-left: 10px; margin-left: 10px;
@ -329,17 +306,17 @@
#changelist .actions label { #changelist .actions label {
display: inline-block; display: inline-block;
vertical-align: middle; vertical-align: middle;
font-size: 13px; font-size: 0.8125rem;
} }
#changelist .actions .button { #changelist .actions .button {
font-size: 13px; font-size: 0.8125rem;
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
border-radius: 4px; border-radius: 4px;
background: var(--body-bg); background: var(--body-bg);
box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset; box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset;
cursor: pointer; cursor: pointer;
height: 24px; height: 1.5rem;
line-height: 1; line-height: 1;
padding: 4px 8px; padding: 4px 8px;
margin: 0; margin: 0;

View File

@ -31,3 +31,107 @@
--close-button-hover-bg: #666666; --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);
}

View File

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

View File

@ -5,7 +5,7 @@
.form-row { .form-row {
overflow: hidden; overflow: hidden;
padding: 10px; padding: 10px;
font-size: 13px; font-size: 0.8125rem;
border-bottom: 1px solid var(--hairline-color); border-bottom: 1px solid var(--hairline-color);
} }
@ -22,12 +22,21 @@ form .form-row p {
padding-left: 0; padding-left: 0;
} }
.flex-container {
display: flex;
flex-wrap: wrap;
}
.form-multiline > div {
padding-bottom: 10px;
}
/* FORM LABELS */ /* FORM LABELS */
label { label {
font-weight: normal; font-weight: normal;
color: var(--body-quiet-color); color: var(--body-quiet-color);
font-size: 13px; font-size: 0.8125rem;
} }
.required label, label.required { .required label, label.required {
@ -37,16 +46,19 @@ label {
/* RADIO BUTTONS */ /* RADIO BUTTONS */
form ul.radiolist li { form div.radiolist div {
list-style-type: none; padding-right: 7px;
} }
form ul.radiolist label { form div.radiolist.inline div {
float: none; display: inline-block;
display: inline;
} }
form ul.radiolist input[type="radio"] { form div.radiolist label {
width: auto;
}
form div.radiolist input[type="radio"] {
margin: -2px 4px 0 0; margin: -2px 4px 0 0;
padding: 0; padding: 0;
} }
@ -66,7 +78,6 @@ form ul.inline li {
.aligned label { .aligned label {
display: block; display: block;
padding: 4px 10px 0 0; padding: 4px 10px 0 0;
float: left;
width: 160px; width: 160px;
word-wrap: break-word; word-wrap: break-word;
line-height: 1; line-height: 1;
@ -76,14 +87,15 @@ form ul.inline li {
content: ''; content: '';
display: inline-block; display: inline-block;
vertical-align: middle; vertical-align: middle;
height: 26px; height: 1.625rem;
} }
.aligned label + p, .aligned label + div.help, .aligned label + div.readonly { .aligned label + p, .aligned .checkbox-row + div.help, .aligned label + div.readonly {
padding: 6px 0; padding: 6px 0;
margin-top: 0; margin-top: 0;
margin-bottom: 0; margin-bottom: 0;
margin-left: 170px; margin-left: 0;
overflow-wrap: break-word;
} }
.aligned ul label { .aligned ul label {
@ -105,7 +117,7 @@ form .aligned ul {
padding-left: 10px; padding-left: 10px;
} }
form .aligned ul.radiolist { form .aligned div.radiolist {
display: inline-block; display: inline-block;
margin: 0; margin: 0;
padding: 0; padding: 0;
@ -113,16 +125,17 @@ form .aligned ul.radiolist {
form .aligned p.help, form .aligned p.help,
form .aligned div.help { form .aligned div.help {
clear: left;
margin-top: 0; margin-top: 0;
margin-left: 160px; margin-left: 160px;
padding-left: 10px; padding-left: 10px;
} }
form .aligned label + p.help, form .aligned p.date div.help.timezonewarning,
form .aligned label + div.help { form .aligned p.datetime div.help.timezonewarning,
form .aligned p.time div.help.timezonewarning {
margin-left: 0; margin-left: 0;
padding-left: 0; padding-left: 0;
font-weight: normal;
} }
form .aligned p.help:last-child, form .aligned p.help:last-child,
@ -167,14 +180,7 @@ form .aligned table p {
width: 610px; width: 610px;
} }
.checkbox-row p.help,
.checkbox-row div.help {
margin-left: 0;
padding-left: 0;
}
fieldset .fieldBox { fieldset .fieldBox {
float: left;
margin-right: 20px; margin-right: 20px;
} }
@ -185,6 +191,7 @@ fieldset .fieldBox {
} }
form .wide p, form .wide p,
form .wide ul.errorlist,
form .wide input + p.help, form .wide input + p.help,
form .wide input + div.help { form .wide input + div.help {
margin-left: 200px; margin-left: 200px;
@ -192,7 +199,7 @@ form .wide input + div.help {
form .wide p.help, form .wide p.help,
form .wide div.help { form .wide div.help {
padding-left: 38px; padding-left: 50px;
} }
form div.help ul { form div.help ul {
@ -238,19 +245,21 @@ fieldset.collapsed .collapse-toggle {
/* MONOSPACE TEXTAREAS */ /* MONOSPACE TEXTAREAS */
fieldset.monospace textarea { fieldset.monospace textarea {
font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace; font-family: var(--font-family-monospace);
} }
/* SUBMIT ROW */ /* SUBMIT ROW */
.submit-row { .submit-row {
padding: 12px 14px; padding: 12px 14px 12px;
margin: 0 0 20px; margin: 0 0 20px;
background: var(--darkened-bg); background: var(--darkened-bg);
border: 1px solid var(--hairline-color); border: 1px solid var(--hairline-color);
border-radius: 4px; border-radius: 4px;
text-align: right;
overflow: hidden; overflow: hidden;
display: flex;
gap: 10px;
flex-wrap: wrap;
} }
body.popup .submit-row { body.popup .submit-row {
@ -258,32 +267,29 @@ body.popup .submit-row {
} }
.submit-row input { .submit-row input {
height: 35px; height: 2.1875rem;
line-height: 15px; line-height: 0.9375rem;
margin: 0 0 0 5px; }
.submit-row input, .submit-row a {
margin: 0;
} }
.submit-row input.default { .submit-row input.default {
margin: 0 0 0 8px;
text-transform: uppercase; text-transform: uppercase;
} }
.submit-row p { .submit-row a.deletelink {
margin: 0.3em; margin-left: auto;
}
.submit-row p.deletelink-box {
float: left;
margin: 0;
} }
.submit-row a.deletelink { .submit-row a.deletelink {
display: block; display: block;
background: var(--delete-button-bg); background: var(--delete-button-bg);
border-radius: 4px; border-radius: 4px;
padding: 10px 15px; padding: 0.625rem 0.9375rem;
height: 15px; height: 0.9375rem;
line-height: 15px; line-height: 0.9375rem;
color: var(--button-fg); color: var(--button-fg);
} }
@ -292,9 +298,8 @@ body.popup .submit-row {
background: var(--close-button-bg); background: var(--close-button-bg);
border-radius: 4px; border-radius: 4px;
padding: 10px 15px; padding: 10px 15px;
height: 15px; height: 0.9375rem;
line-height: 15px; line-height: 0.9375rem;
margin: 0 0 0 5px;
color: var(--button-fg); color: var(--button-fg);
} }
@ -302,12 +307,14 @@ body.popup .submit-row {
.submit-row a.deletelink:hover, .submit-row a.deletelink:hover,
.submit-row a.deletelink:active { .submit-row a.deletelink:active {
background: var(--delete-button-hover-bg); background: var(--delete-button-hover-bg);
text-decoration: none;
} }
.submit-row a.closelink:focus, .submit-row a.closelink:focus,
.submit-row a.closelink:hover, .submit-row a.closelink:hover,
.submit-row a.closelink:active { .submit-row a.closelink:active {
background: var(--close-button-hover-bg); background: var(--close-button-hover-bg);
text-decoration: none;
} }
/* CUSTOM FORM FIELDS */ /* CUSTOM FORM FIELDS */
@ -349,10 +356,6 @@ body.popup .submit-row {
width: 2.2em; width: 2.2em;
} }
.vTextField, .vUUIDField {
width: 20em;
}
.vIntegerField { .vIntegerField {
width: 5em; width: 5em;
} }
@ -365,6 +368,10 @@ body.popup .submit-row {
width: 5em; width: 5em;
} }
.vTextField, .vUUIDField {
width: 20em;
}
/* INLINES */ /* INLINES */
.inline-group { .inline-group {
@ -388,7 +395,7 @@ body.popup .submit-row {
margin: 0; margin: 0;
color: var(--body-quiet-color); color: var(--body-quiet-color);
padding: 5px; padding: 5px;
font-size: 13px; font-size: 0.8125rem;
background: var(--darkened-bg); background: var(--darkened-bg);
border-top: 1px solid var(--hairline-color); border-top: 1px solid var(--hairline-color);
border-bottom: 1px solid var(--hairline-color); border-bottom: 1px solid var(--hairline-color);
@ -400,7 +407,7 @@ body.popup .submit-row {
.inline-related h3 span.delete label { .inline-related h3 span.delete label {
margin-left: 2px; margin-left: 2px;
font-size: 11px; font-size: 0.6875rem;
} }
.inline-related fieldset { .inline-related fieldset {
@ -413,7 +420,7 @@ body.popup .submit-row {
.inline-related fieldset.module h3 { .inline-related fieldset.module h3 {
margin: 0; margin: 0;
padding: 2px 5px 3px 5px; padding: 2px 5px 3px 5px;
font-size: 11px; font-size: 0.6875rem;
text-align: left; text-align: left;
font-weight: bold; font-weight: bold;
background: #bcd; background: #bcd;
@ -454,7 +461,7 @@ body.popup .submit-row {
height: 1.1em; height: 1.1em;
padding: 2px 9px; padding: 2px 9px;
overflow: hidden; overflow: hidden;
font-size: 9px; font-size: 0.5625rem;
font-weight: bold; font-weight: bold;
color: var(--body-quiet-color); color: var(--body-quiet-color);
_width: 700px; _width: 700px;
@ -489,7 +496,7 @@ body.popup .submit-row {
.inline-group .tabular tr.add-row td a { .inline-group .tabular tr.add-row td a {
background: url(../img/icon-addlink.svg) 0 1px no-repeat; background: url(../img/icon-addlink.svg) 0 1px no-repeat;
padding-left: 16px; padding-left: 16px;
font-size: 12px; font-size: 0.75rem;
} }
.empty-form { .empty-form {
@ -507,8 +514,8 @@ body.popup .submit-row {
} }
.related-lookup { .related-lookup {
width: 16px; width: 1rem;
height: 16px; height: 1rem;
background-image: url(../img/search.svg); background-image: url(../img/search.svg);
} }

View File

@ -12,7 +12,8 @@
} }
.login #header h1 { .login #header h1 {
font-size: 18px; font-size: 1.125rem;
margin: 0;
} }
.login #header h1 a { .login #header h1 a {

View File

@ -16,7 +16,7 @@
border-right: 1px solid var(--hairline-color); border-right: 1px solid var(--hairline-color);
background-color: var(--body-bg); background-color: var(--body-bg);
cursor: pointer; cursor: pointer;
font-size: 20px; font-size: 1.25rem;
color: var(--link-fg); color: var(--link-fg);
padding: 0; padding: 0;
} }
@ -59,14 +59,16 @@
content: '\00AB'; content: '\00AB';
} }
.main > #nav-sidebar {
visibility: hidden;
}
.main.shifted > #nav-sidebar { .main.shifted > #nav-sidebar {
left: 24px;
margin-left: 0; margin-left: 0;
visibility: visible;
} }
[dir="rtl"] .main.shifted > #nav-sidebar { [dir="rtl"] .main.shifted > #nav-sidebar {
left: 0;
right: 24px;
margin-right: 0; margin-right: 0;
} }
@ -118,3 +120,25 @@
max-width: 100%; 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%;
}

View File

@ -14,11 +14,11 @@ input[type="submit"], button {
td, th { td, th {
padding: 10px; padding: 10px;
font-size: 14px; font-size: 0.875rem;
} }
.small { .small {
font-size: 12px; font-size: 0.75rem;
} }
/* Layout */ /* Layout */
@ -28,7 +28,7 @@ input[type="submit"], button {
} }
#content { #content {
padding: 20px 30px 30px; padding: 15px 20px 20px;
} }
div.breadcrumbs { div.breadcrumbs {
@ -45,7 +45,6 @@ input[type="submit"], button {
#branding h1 { #branding h1 {
margin: 0 0 8px; margin: 0 0 8px;
font-size: 20px;
line-height: 1.2; line-height: 1.2;
} }
@ -88,7 +87,7 @@ input[type="submit"], button {
} }
td .changelink, td .addlink { td .changelink, td .addlink {
font-size: 13px; font-size: 0.8125rem;
} }
/* Changelist */ /* Changelist */
@ -105,13 +104,13 @@ input[type="submit"], button {
} }
#changelist-search label { #changelist-search label {
line-height: 22px; line-height: 1.375rem;
} }
#toolbar form #searchbar { #toolbar form #searchbar {
flex: 1 0 auto; flex: 1 0 auto;
width: 0; width: 0;
height: 22px; height: 1.375rem;
margin: 0 10px 0 6px; margin: 0 10px 0 6px;
} }
@ -131,10 +130,6 @@ input[type="submit"], button {
padding: 15px 0; padding: 15px 0;
} }
#changelist .actions.selected {
border: none;
}
#changelist .actions label { #changelist .actions label {
display: flex; display: flex;
} }
@ -152,7 +147,7 @@ input[type="submit"], button {
#changelist .actions span.clear, #changelist .actions span.clear,
#changelist .actions span.question, #changelist .actions span.question,
#changelist .actions span.action-counter { #changelist .actions span.action-counter {
font-size: 11px; font-size: 0.6875rem;
margin: 0 10px 0 0; margin: 0 10px 0 0;
} }
@ -176,7 +171,7 @@ input[type="submit"], button {
/* Forms */ /* Forms */
label { label {
font-size: 14px; font-size: 0.875rem;
} }
.form-row input[type=text], .form-row input[type=text],
@ -191,12 +186,12 @@ input[type="submit"], button {
box-sizing: border-box; box-sizing: border-box;
margin: 0; margin: 0;
padding: 6px 8px; padding: 6px 8px;
min-height: 36px; min-height: 2.25rem;
font-size: 14px; font-size: 0.875rem;
} }
.form-row select { .form-row select {
height: 36px; height: 2.25rem;
} }
.form-row select[multiple] { .form-row select[multiple] {
@ -204,12 +199,6 @@ input[type="submit"], button {
min-height: 0; min-height: 0;
} }
fieldset .fieldBox {
float: none;
margin: 0 -10px;
padding: 0 10px;
}
fieldset .fieldBox + .fieldBox { fieldset .fieldBox + .fieldBox {
margin-top: 10px; margin-top: 10px;
padding-top: 10px; padding-top: 10px;
@ -232,10 +221,22 @@ input[type="submit"], button {
margin-left: 15px; margin-left: 15px;
} }
form .aligned ul.radiolist { form .aligned div.radiolist {
margin-left: 2px; 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 */
.related-widget-wrapper { .related-widget-wrapper {
@ -383,22 +384,18 @@ input[type="submit"], button {
display: none; display: none;
} }
form .form-row p.datetime {
width: 100%;
}
.datetime input { .datetime input {
width: 50%; width: 50%;
max-width: 120px; max-width: 120px;
} }
.datetime span { .datetime span {
font-size: 13px; font-size: 0.8125rem;
} }
.datetime .timezonewarning { .datetime .timezonewarning {
display: block; display: block;
font-size: 11px; font-size: 0.6875rem;
color: var(--body-quiet-color); color: var(--body-quiet-color);
} }
@ -496,7 +493,7 @@ input[type="submit"], button {
#content-related .module h2 { #content-related .module h2 {
padding: 10px 15px; padding: 10px 15px;
font-size: 16px; font-size: 1rem;
} }
/* Changelist */ /* Changelist */
@ -557,8 +554,6 @@ input[type="submit"], button {
.aligned .form-row, .aligned .form-row,
.aligned .form-row > div { .aligned .form-row > div {
display: flex;
flex-wrap: wrap;
max-width: 100vw; max-width: 100vw;
} }
@ -566,6 +561,10 @@ input[type="submit"], button {
width: calc(100vw - 30px); width: calc(100vw - 30px);
} }
.flex-container {
flex-flow: column;
}
textarea { textarea {
max-width: none; max-width: none;
} }
@ -621,8 +620,7 @@ input[type="submit"], button {
} }
.aligned p.file-upload { .aligned p.file-upload {
margin-left: 0; font-size: 0.8125rem;
font-size: 13px;
} }
span.clearable-file-input { span.clearable-file-input {
@ -630,7 +628,7 @@ input[type="submit"], button {
} }
span.clearable-file-input label { span.clearable-file-input label {
font-size: 13px; font-size: 0.8125rem;
padding-bottom: 0; padding-bottom: 0;
} }
@ -645,17 +643,19 @@ input[type="submit"], button {
padding: 0; padding: 0;
} }
form .aligned ul { form .aligned ul,
form .aligned ul.errorlist {
margin-left: 0; margin-left: 0;
padding-left: 0; padding-left: 0;
} }
form .aligned ul.radiolist { form .aligned div.radiolist {
margin-top: 5px;
margin-right: 15px; margin-right: 15px;
margin-bottom: -3px; margin-bottom: -3px;
} }
form .aligned ul.radiolist:not(.inline) li + li { form .aligned div.radiolist:not(.inline) div + div {
margin-top: 5px; margin-top: 5px;
} }
@ -811,28 +811,23 @@ input[type="submit"], button {
/* Submit row */ /* Submit row */
.submit-row { .submit-row {
padding: 10px 10px 0; padding: 10px;
margin: 0 0 15px; margin: 0 0 15px;
display: flex;
flex-direction: column; flex-direction: column;
gap: 8px;
} }
.submit-row > * { .submit-row input, .submit-row input.default, .submit-row a {
width: 100%;
}
.submit-row input, .submit-row input.default, .submit-row a, .submit-row a.closelink {
float: none;
margin: 0 0 10px;
text-align: center; text-align: center;
} }
.submit-row a.closelink { .submit-row a.closelink {
padding: 10px 0; padding: 10px 0;
text-align: center;
} }
.submit-row p.deletelink-box { .submit-row a.deletelink {
order: 4; margin: 0;
} }
/* Messages */ /* Messages */
@ -906,7 +901,7 @@ input[type="submit"], button {
.errornote { .errornote {
margin: 0 0 20px; margin: 0 0 20px;
padding: 8px 12px; padding: 8px 12px;
font-size: 13px; font-size: 0.8125rem;
} }
/* Calendar and clock */ /* Calendar and clock */
@ -953,8 +948,8 @@ input[type="submit"], button {
.calendar-shortcuts { .calendar-shortcuts {
padding: 10px 0; padding: 10px 0;
font-size: 12px; font-size: 0.75rem;
line-height: 12px; line-height: 0.75rem;
} }
.calendar-shortcuts a { .calendar-shortcuts a {
@ -986,7 +981,7 @@ input[type="submit"], button {
/* History */ /* History */
table#change-history tbody th, table#change-history tbody td { table#change-history tbody th, table#change-history tbody td {
font-size: 13px; font-size: 0.8125rem;
word-break: break-word; word-break: break-word;
} }
@ -997,7 +992,7 @@ input[type="submit"], button {
/* Docs */ /* Docs */
table.model tbody th, table.model tbody td { table.model tbody th, table.model tbody td {
font-size: 13px; font-size: 0.8125rem;
word-break: break-word; word-break: break-word;
} }
} }

View File

@ -69,7 +69,8 @@
margin-right: 15px; margin-right: 15px;
} }
[dir="rtl"] .aligned ul { [dir="rtl"] .aligned ul,
[dir="rtl"] form .aligned ul.errorlist {
margin-right: 0; margin-right: 0;
} }

View File

@ -111,19 +111,11 @@ thead th.sorted .text {
.aligned label { .aligned label {
padding: 0 0 3px 1em; padding: 0 0 3px 1em;
float: right;
} }
.submit-row { .submit-row a.deletelink {
text-align: left
}
.submit-row p.deletelink-box {
float: right;
}
.submit-row input.default {
margin-left: 0; margin-left: 0;
margin-right: auto;
} }
.vDateField, .vTimeField { .vDateField, .vTimeField {
@ -134,13 +126,11 @@ thead th.sorted .text {
margin-left: 5px; margin-left: 5px;
} }
form .aligned p.help, form .aligned div.help {
clear: right;
}
form .aligned ul { form .aligned ul {
margin-right: 163px; margin-right: 163px;
padding-right: 10px;
margin-left: 0; margin-left: 0;
padding-left: 0;
} }
form ul.inline li { form ul.inline li {
@ -149,12 +139,39 @@ form ul.inline li {
padding-left: 7px; padding-left: 7px;
} }
input[type=submit].default, .submit-row input.default { form .aligned p.help,
float: left; 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 { fieldset .fieldBox {
float: right;
margin-left: 20px; margin-left: 20px;
margin-right: 0; margin-right: 0;
} }
@ -175,12 +192,24 @@ fieldset .fieldBox {
top: 0; top: 0;
left: auto; left: auto;
right: 10px; 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 { .calendarnav-next {
top: 0; top: 0;
right: auto; right: auto;
left: 10px; 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 { .calendar caption, .calendarbox h2 {
@ -195,6 +224,38 @@ fieldset .fieldBox {
text-align: right; 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 { .inline-deletelink {
float: left; float: left;
} }

View File

@ -3,22 +3,21 @@
.selector { .selector {
width: 800px; width: 800px;
float: left; float: left;
display: flex;
} }
.selector select { .selector select {
width: 380px; width: 380px;
height: 17.2em; height: 17.2em;
flex: 1 0 auto;
} }
.selector-available, .selector-chosen { .selector-available, .selector-chosen {
float: left;
width: 380px; width: 380px;
text-align: center; text-align: center;
margin-bottom: 5px; margin-bottom: 5px;
} display: flex;
flex-direction: column;
.selector-chosen select {
border-top: none;
} }
.selector-available h2, .selector-chosen h2 { .selector-available h2, .selector-chosen h2 {
@ -26,6 +25,21 @@
border-radius: 4px 4px 0 0; 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 { .selector-chosen h2 {
background: var(--primary); background: var(--primary);
color: var(--header-link-color); color: var(--header-link-color);
@ -41,7 +55,7 @@
border-width: 0 1px; border-width: 0 1px;
padding: 8px; padding: 8px;
color: var(--body-quiet-color); color: var(--body-quiet-color);
font-size: 10px; font-size: 0.625rem;
margin: 0; margin: 0;
text-align: left; text-align: left;
} }
@ -57,18 +71,20 @@
line-height: 1; line-height: 1;
} }
.selector .selector-available input { .selector .selector-available input,
.selector .selector-chosen input {
width: 320px; width: 320px;
margin-left: 8px; margin-left: 8px;
} }
.selector ul.selector-chooser { .selector ul.selector-chooser {
float: left; align-self: center;
width: 22px; width: 22px;
background-color: var(--selected-bg); background-color: var(--selected-bg);
border-radius: 10px; border-radius: 10px;
margin: 10em 5px 0 5px; margin: 0 5px;
padding: 0; padding: 0;
transform: translateY(-17px);
} }
.selector-chooser li { .selector-chooser li {
@ -82,6 +98,15 @@
margin: 0 0 10px; margin: 0 0 10px;
border-radius: 0 0 4px 4px; 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 { .selector-add, .selector-remove {
width: 16px; width: 16px;
@ -168,6 +193,7 @@ a.active.selector-clearall:focus, a.active.selector-clearall:hover {
.stacked { .stacked {
float: left; float: left;
width: 490px; width: 490px;
display: block;
} }
.stacked select { .stacked select {
@ -193,6 +219,7 @@ a.active.selector-clearall:focus, a.active.selector-clearall:hover {
margin: 0 0 10px 40%; margin: 0 0 10px 40%;
background-color: #eee; background-color: #eee;
border-radius: 10px; border-radius: 10px;
transform: none;
} }
.stacked .selector-chooser li { .stacked .selector-chooser li {
@ -250,8 +277,8 @@ a.active.selector-clearall:focus, a.active.selector-clearall:hover {
.selector .search-label-icon { .selector .search-label-icon {
background: url(../img/search.svg) 0 0 no-repeat; background: url(../img/search.svg) 0 0 no-repeat;
display: inline-block; display: inline-block;
height: 18px; height: 1.125rem;
width: 18px; width: 1.125rem;
} }
/* DATE AND TIME */ /* DATE AND TIME */
@ -267,7 +294,7 @@ p.datetime {
.datetime span { .datetime span {
white-space: nowrap; white-space: nowrap;
font-weight: normal; font-weight: normal;
font-size: 11px; font-size: 0.6875rem;
color: var(--body-quiet-color); color: var(--body-quiet-color);
} }
@ -277,7 +304,7 @@ p.datetime {
} }
table p.datetime { table p.datetime {
font-size: 11px; font-size: 0.6875rem;
margin-left: 0; margin-left: 0;
padding-left: 0; padding-left: 0;
} }
@ -311,7 +338,7 @@ table p.datetime {
} }
.timezonewarning { .timezonewarning {
font-size: 11px; font-size: 0.6875rem;
color: var(--body-quiet-color); color: var(--body-quiet-color);
} }
@ -322,7 +349,7 @@ p.url {
margin: 0; margin: 0;
padding: 0; padding: 0;
color: var(--body-quiet-color); color: var(--body-quiet-color);
font-size: 11px; font-size: 0.6875rem;
font-weight: bold; font-weight: bold;
} }
@ -337,14 +364,10 @@ p.file-upload {
margin: 0; margin: 0;
padding: 0; padding: 0;
color: var(--body-quiet-color); color: var(--body-quiet-color);
font-size: 11px; font-size: 0.6875rem;
font-weight: bold; font-weight: bold;
} }
.aligned p.file-upload {
margin-left: 170px;
}
.file-upload a { .file-upload a {
font-weight: normal; font-weight: normal;
} }
@ -355,7 +378,7 @@ p.file-upload {
span.clearable-file-input label { span.clearable-file-input label {
color: var(--body-fg); color: var(--body-fg);
font-size: 11px; font-size: 0.6875rem;
display: inline; display: inline;
float: none; float: none;
} }
@ -364,7 +387,7 @@ span.clearable-file-input label {
.calendarbox, .clockbox { .calendarbox, .clockbox {
margin: 5px auto; margin: 5px auto;
font-size: 12px; font-size: 0.75rem;
width: 19em; width: 19em;
text-align: center; text-align: center;
background: var(--body-bg); background: var(--body-bg);
@ -398,7 +421,7 @@ span.clearable-file-input label {
text-align: center; text-align: center;
border-top: none; border-top: none;
font-weight: 700; font-weight: 700;
font-size: 12px; font-size: 0.75rem;
color: #333; color: #333;
background: var(--accent); background: var(--accent);
} }
@ -408,14 +431,14 @@ span.clearable-file-input label {
background: var(--darkened-bg); background: var(--darkened-bg);
border-bottom: 1px solid var(--border-color); border-bottom: 1px solid var(--border-color);
font-weight: 400; font-weight: 400;
font-size: 12px; font-size: 0.75rem;
text-align: center; text-align: center;
color: var(--body-quiet-color); color: var(--body-quiet-color);
} }
.calendar td { .calendar td {
font-weight: 400; font-weight: 400;
font-size: 12px; font-size: 0.75rem;
text-align: center; text-align: center;
padding: 0; padding: 0;
border-top: 1px solid var(--hairline-color); border-top: 1px solid var(--hairline-color);
@ -455,7 +478,7 @@ span.clearable-file-input label {
} }
.calendarnav { .calendarnav {
font-size: 10px; font-size: 0.625rem;
text-align: center; text-align: center;
color: #ccc; color: #ccc;
margin: 0; margin: 0;
@ -470,8 +493,8 @@ span.clearable-file-input label {
.calendar-shortcuts { .calendar-shortcuts {
background: var(--body-bg); background: var(--body-bg);
color: var(--body-quiet-color); color: var(--body-quiet-color);
font-size: 11px; font-size: 0.6875rem;
line-height: 11px; line-height: 0.6875rem;
border-top: 1px solid var(--hairline-color); border-top: 1px solid var(--hairline-color);
padding: 8px 0; padding: 8px 0;
} }
@ -509,7 +532,7 @@ span.clearable-file-input label {
.calendar-cancel { .calendar-cancel {
margin: 0; margin: 0;
padding: 4px 0; padding: 4px 0;
font-size: 12px; font-size: 0.75rem;
background: #eee; background: #eee;
border-top: 1px solid var(--border-color); border-top: 1px solid var(--border-color);
color: var(--body-fg); color: var(--body-fg);
@ -572,3 +595,9 @@ select + .related-widget-wrapper-link,
.related-widget-wrapper-link + .related-widget-wrapper-link { .related-widget-wrapper-link + .related-widget-wrapper-link {
margin-left: 7px; margin-left: 7px;
} }
/* GIS MAPS */
.dj_map {
width: 600px;
height: 400px;
}

View File

@ -41,6 +41,10 @@
} }
SelectBox.redisplay(id); 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) { delete_from_cache: function(id, value) {
let delete_index = null; let delete_index = null;
const cache = SelectBox.cache[id]; const cache = SelectBox.cache[id];

View File

@ -78,7 +78,7 @@ Requires core.js and SelectBox.js.
remove_link.className = 'selector-remove'; remove_link.className = 'selector-remove';
// <div class="selector-chosen"> // <div class="selector-chosen">
const selector_chosen = quickElement('div', selector_div); const selector_chosen = quickElement('div', selector_div, '', 'id', field_id + '_selector_chosen');
selector_chosen.className = 'selector-chosen'; selector_chosen.className = 'selector-chosen';
const title_chosen = quickElement('h2', selector_chosen, interpolate(gettext('Chosen %s') + ' ', [field_name])); const title_chosen = quickElement('h2', selector_chosen, interpolate(gettext('Chosen %s') + ' ', [field_name]));
quickElement( quickElement(
@ -93,9 +93,30 @@ Requires core.js and SelectBox.js.
[field_name] [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); const to_box = quickElement('select', selector_chosen, '', 'id', field_id + '_to', 'multiple', '', 'size', from_box.size, 'name', from_box.name);
to_box.className = 'filtered'; 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'); 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'; clear_all.className = 'selector-clearall';
@ -106,6 +127,8 @@ Requires core.js and SelectBox.js.
if (elem.classList.contains('active')) { if (elem.classList.contains('active')) {
move_func(from, to); move_func(from, to);
SelectFilter.refresh_icons(field_id); SelectFilter.refresh_icons(field_id);
SelectFilter.refresh_filtered_selects(field_id);
SelectFilter.refresh_filtered_warning(field_id);
} }
e.preventDefault(); e.preventDefault();
}; };
@ -121,14 +144,29 @@ Requires core.js and SelectBox.js.
clear_all.addEventListener('click', function(e) { clear_all.addEventListener('click', function(e) {
move_selection(e, this, SelectBox.move_all, field_id + '_to', field_id + '_from'); 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) { filter_input.addEventListener('keypress', function(e) {
SelectFilter.filter_key_press(e, field_id); SelectFilter.filter_key_press(e, field_id, '_from', '_to');
}); });
filter_input.addEventListener('keyup', function(e) { filter_input.addEventListener('keyup', function(e) {
SelectFilter.filter_key_up(e, field_id); SelectFilter.filter_key_up(e, field_id, '_from');
}); });
filter_input.addEventListener('keydown', function(e) { filter_input.addEventListener('keydown', function(e) {
SelectFilter.filter_key_down(e, field_id); SelectFilter.filter_key_down(e, field_id, '_from', '_to');
});
filter_selected_input.addEventListener('keypress', function(e) {
SelectFilter.filter_key_press(e, field_id, '_to', '_from');
});
filter_selected_input.addEventListener('keyup', function(e) {
SelectFilter.filter_key_up(e, field_id, '_to', '_selected_input');
});
filter_selected_input.addEventListener('keydown', function(e) {
SelectFilter.filter_key_down(e, field_id, '_to', '_from');
}); });
selector_div.addEventListener('change', function(e) { selector_div.addEventListener('change', function(e) {
if (e.target.tagName === 'SELECT') { if (e.target.tagName === 'SELECT') {
@ -146,6 +184,7 @@ Requires core.js and SelectBox.js.
} }
}); });
from_box.closest('form').addEventListener('submit', function() { from_box.closest('form').addEventListener('submit', function() {
SelectBox.filter(field_id + '_to', '');
SelectBox.select_all(field_id + '_to'); SelectBox.select_all(field_id + '_to');
}); });
SelectBox.init(field_id + '_from'); SelectBox.init(field_id + '_from');
@ -163,6 +202,24 @@ Requires core.js and SelectBox.js.
field.required = false; field.required = false;
return any_selected; 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) { refresh_icons: function(field_id) {
const from = document.getElementById(field_id + '_from'); const from = document.getElementById(field_id + '_from');
const to = document.getElementById(field_id + '_to'); const to = document.getElementById(field_id + '_to');
@ -172,39 +229,47 @@ Requires core.js and SelectBox.js.
// Active if the corresponding box isn't empty // 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 + '_add_all_link').classList.toggle('active', from.querySelector('option'));
document.getElementById(field_id + '_remove_all_link').classList.toggle('active', to.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) { filter_key_press: function(event, field_id, source, target) {
const from = document.getElementById(field_id + '_from'); const source_box = document.getElementById(field_id + source);
// don't submit form if user pressed Enter // don't submit form if user pressed Enter
if ((event.which && event.which === 13) || (event.keyCode && event.keyCode === 13)) { if ((event.which && event.which === 13) || (event.keyCode && event.keyCode === 13)) {
from.selectedIndex = 0; source_box.selectedIndex = 0;
SelectBox.move(field_id + '_from', field_id + '_to'); SelectBox.move(field_id + source, field_id + target);
from.selectedIndex = 0; source_box.selectedIndex = 0;
event.preventDefault(); event.preventDefault();
} }
}, },
filter_key_up: function(event, field_id) { filter_key_up: function(event, field_id, source, filter_input) {
const from = document.getElementById(field_id + '_from'); const input = filter_input || '_input';
const temp = from.selectedIndex; const source_box = document.getElementById(field_id + source);
SelectBox.filter(field_id + '_from', document.getElementById(field_id + '_input').value); const temp = source_box.selectedIndex;
from.selectedIndex = temp; 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) { filter_key_down: function(event, field_id, source, target) {
const from = document.getElementById(field_id + '_from'); 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 // right arrow -- move across
if ((event.which && event.which === 39) || (event.keyCode && event.keyCode === 39)) { if ((event.which && event.which === direction) || (event.keyCode && event.keyCode === direction)) {
const old_index = from.selectedIndex; const old_index = source_box.selectedIndex;
SelectBox.move(field_id + '_from', field_id + '_to'); SelectBox.move(field_id + source, field_id + target);
from.selectedIndex = (old_index === from.length) ? from.length - 1 : old_index; 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; return;
} }
// down arrow -- wrap around // down arrow -- wrap around
if ((event.which && event.which === 40) || (event.keyCode && event.keyCode === 40)) { if ((event.which && event.which === 40) || (event.keyCode && event.keyCode === 40)) {
from.selectedIndex = (from.length === from.selectedIndex + 1) ? 0 : from.selectedIndex + 1; source_box.selectedIndex = (source_box.length === source_box.selectedIndex + 1) ? 0 : source_box.selectedIndex + 1;
} }
// up arrow -- wrap around // up arrow -- wrap around
if ((event.which && event.which === 38) || (event.keyCode && event.keyCode === 38)) { if ((event.which && event.which === 38) || (event.keyCode && event.keyCode === 38)) {
from.selectedIndex = (from.selectedIndex === 0) ? from.length - 1 : from.selectedIndex - 1; source_box.selectedIndex = (source_box.selectedIndex === 0) ? source_box.length - 1 : source_box.selectedIndex - 1;
} }
} }
}; };

View File

@ -156,7 +156,7 @@
}); });
}); });
document.querySelector('#changelist-form button[name=index]').addEventListener('click', function() { document.querySelector('#changelist-form button[name=index]').addEventListener('click', function(event) {
if (list_editable_changed) { 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.")); 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) { if (!confirmed) {

View File

@ -90,10 +90,9 @@
} }
message = interpolate(message, [timezoneOffset]); message = interpolate(message, [timezoneOffset]);
const warning = document.createElement('span'); const warning = document.createElement('div');
warning.className = warningClass; warning.classList.add('help', warningClass);
warning.textContent = message; warning.textContent = message;
inp.parentNode.appendChild(document.createElement('br'));
inp.parentNode.appendChild(warning); inp.parentNode.appendChild(warning);
}, },
// Add clock widget to a given field // Add clock widget to a given field
@ -388,13 +387,7 @@
DateTimeShortcuts.calendars[num].drawNextMonth(); DateTimeShortcuts.calendars[num].drawNextMonth();
}, },
handleCalendarCallback: function(num) { handleCalendarCallback: function(num) {
let format = get_format('DATE_INPUT_FORMATS')[0]; const format = get_format('DATE_INPUT_FORMATS')[0];
// the format needs to be escaped a little
format = format.replace('\\', '\\\\')
.replace('\r', '\\r')
.replace('\n', '\\n')
.replace('\t', '\\t')
.replace("'", "\\'");
return function(y, m, d) { return function(y, m, d) {
DateTimeShortcuts.calendarInputs[num].value = new Date(y, m - 1, d).strftime(format); DateTimeShortcuts.calendarInputs[num].value = new Date(y, m - 1, d).strftime(format);
DateTimeShortcuts.calendarInputs[num].focus(); DateTimeShortcuts.calendarInputs[num].focus();

View File

@ -4,14 +4,43 @@
'use strict'; 'use strict';
{ {
const $ = django.jQuery; 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) { function showAdminPopup(triggeringLink, name_regexp, add_popup) {
const name = triggeringLink.id.replace(name_regexp, ''); const name = addPopupIndex(triggeringLink.id.replace(name_regexp, ''));
const href = new URL(triggeringLink.href); const href = new URL(triggeringLink.href);
if (add_popup) { if (add_popup) {
href.searchParams.set('_popup', 1); href.searchParams.set('_popup', 1);
} }
const win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes'); const win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes');
relatedWindows.push(win);
win.focus(); win.focus();
return false; return false;
} }
@ -21,13 +50,17 @@
} }
function dismissRelatedLookupPopup(win, chosenId) { function dismissRelatedLookupPopup(win, chosenId) {
const name = win.name; const name = removePopupIndex(win.name);
const elem = document.getElementById(name); const elem = document.getElementById(name);
if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) { if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) {
elem.value += ',' + chosenId; elem.value += ',' + chosenId;
} else { } else {
document.getElementById(name).value = chosenId; document.getElementById(name).value = chosenId;
} }
const index = relatedWindows.indexOf(win);
if (index > -1) {
relatedWindows.splice(index, 1);
}
win.close(); win.close();
} }
@ -52,13 +85,44 @@
} }
} }
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) { function dismissAddRelatedObjectPopup(win, newId, newRepr) {
const name = win.name; const name = removePopupIndex(win.name);
const elem = document.getElementById(name); const elem = document.getElementById(name);
if (elem) { if (elem) {
const elemName = elem.nodeName.toUpperCase(); const elemName = elem.nodeName.toUpperCase();
if (elemName === 'SELECT') { if (elemName === 'SELECT') {
elem.options[elem.options.length] = new Option(newRepr, newId, true, true); elem.options[elem.options.length] = new Option(newRepr, newId, true, true);
updateRelatedSelectsOptions(elem, win, null, newRepr, newId);
} else if (elemName === 'INPUT') { } else if (elemName === 'INPUT') {
if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) { if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) {
elem.value += ',' + newId; elem.value += ',' + newId;
@ -74,11 +138,15 @@
SelectBox.add_to_cache(toId, o); SelectBox.add_to_cache(toId, o);
SelectBox.redisplay(toId); SelectBox.redisplay(toId);
} }
const index = relatedWindows.indexOf(win);
if (index > -1) {
relatedWindows.splice(index, 1);
}
win.close(); win.close();
} }
function dismissChangeRelatedObjectPopup(win, objId, newRepr, newId) { function dismissChangeRelatedObjectPopup(win, objId, newRepr, newId) {
const id = win.name.replace(/^edit_/, ''); const id = removePopupIndex(win.name.replace(/^edit_/, ''));
const selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]); const selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]);
const selects = $(selectsSelector); const selects = $(selectsSelector);
selects.find('option').each(function() { selects.find('option').each(function() {
@ -86,18 +154,23 @@
this.textContent = newRepr; this.textContent = newRepr;
this.value = newId; this.value = newId;
} }
}); }).trigger('change');
updateRelatedSelectsOptions(selects[0], win, objId, newRepr, newId);
selects.next().find('.select2-selection__rendered').each(function() { selects.next().find('.select2-selection__rendered').each(function() {
// The element can have a clear button as a child. // The element can have a clear button as a child.
// Use the lastChild to modify only the displayed value. // Use the lastChild to modify only the displayed value.
this.lastChild.textContent = newRepr; this.lastChild.textContent = newRepr;
this.title = newRepr; this.title = newRepr;
}); });
const index = relatedWindows.indexOf(win);
if (index > -1) {
relatedWindows.splice(index, 1);
}
win.close(); win.close();
} }
function dismissDeleteRelatedObjectPopup(win, objId) { function dismissDeleteRelatedObjectPopup(win, objId) {
const id = win.name.replace(/^delete_/, ''); const id = removePopupIndex(win.name.replace(/^delete_/, ''));
const selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]); const selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]);
const selects = $(selectsSelector); const selects = $(selectsSelector);
selects.find('option').each(function() { selects.find('option').each(function() {
@ -105,6 +178,10 @@
$(this).remove(); $(this).remove();
} }
}).trigger('change'); }).trigger('change');
const index = relatedWindows.indexOf(win);
if (index > -1) {
relatedWindows.splice(index, 1);
}
win.close(); win.close();
} }
@ -115,17 +192,23 @@
window.dismissAddRelatedObjectPopup = dismissAddRelatedObjectPopup; window.dismissAddRelatedObjectPopup = dismissAddRelatedObjectPopup;
window.dismissChangeRelatedObjectPopup = dismissChangeRelatedObjectPopup; window.dismissChangeRelatedObjectPopup = dismissChangeRelatedObjectPopup;
window.dismissDeleteRelatedObjectPopup = dismissDeleteRelatedObjectPopup; window.dismissDeleteRelatedObjectPopup = dismissDeleteRelatedObjectPopup;
window.dismissChildPopups = dismissChildPopups;
// Kept for backward compatibility // Kept for backward compatibility
window.showAddAnotherPopup = showRelatedObjectPopup; window.showAddAnotherPopup = showRelatedObjectPopup;
window.dismissAddAnotherPopup = dismissAddRelatedObjectPopup; window.dismissAddAnotherPopup = dismissAddRelatedObjectPopup;
window.addEventListener('unload', function(evt) {
window.dismissChildPopups();
});
$(document).ready(function() { $(document).ready(function() {
setPopupIndex();
$("a[data-popup-opener]").on('click', function(event) { $("a[data-popup-opener]").on('click', function(event) {
event.preventDefault(); event.preventDefault();
opener.dismissRelatedLookupPopup(window, $(this).data("popup-opener")); opener.dismissRelatedLookupPopup(window, $(this).data("popup-opener"));
}); });
$('body').on('click', '.related-widget-wrapper-link', function(e) { $('body').on('click', '.related-widget-wrapper-link[data-popup="yes"]', function(e) {
e.preventDefault(); e.preventDefault();
if (this.href) { if (this.href) {
const event = $.Event('django:show-related', {href: this.href}); const event = $.Event('django:show-related', {href: this.href});

View File

@ -1,28 +1,22 @@
'use strict'; 'use strict';
{ {
const $ = django.jQuery; const $ = django.jQuery;
const init = function($element, options) {
const settings = $.extend({
ajax: {
data: function(params) {
return {
term: params.term,
page: params.page,
app_label: $element.data('app-label'),
model_name: $element.data('model-name'),
field_name: $element.data('field-name')
};
}
}
}, options);
$element.select2(settings);
};
$.fn.djangoAdminSelect2 = function(options) { $.fn.djangoAdminSelect2 = function() {
const settings = $.extend({}, options);
$.each(this, function(i, element) { $.each(this, function(i, element) {
const $element = $(element); $(element).select2({
init($element, settings); 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; return this;
}; };
@ -33,9 +27,7 @@
$('.admin-autocomplete').not('[name*=__prefix__]').djangoAdminSelect2(); $('.admin-autocomplete').not('[name*=__prefix__]').djangoAdminSelect2();
}); });
$(document).on('formset:added', (function() { document.addEventListener('formset:added', (event) => {
return function(event, $newFormset) { $(event.target).find('.admin-autocomplete').djangoAdminSelect2();
return $newFormset.find('.admin-autocomplete').djangoAdminSelect2(); });
};
})(this));
} }

View File

@ -1,4 +1,4 @@
// Core javascript helper functions // Core JavaScript helper functions
'use strict'; 'use strict';
// quickElement(tagType, parentReference [, textInChildNode, attribute, attributeValue ...]); // quickElement(tagType, parentReference [, textInChildNode, attribute, attributeValue ...]);
@ -119,11 +119,11 @@ function findPosY(obj) {
let result = '', i = 0; let result = '', i = 0;
while (i < format.length) { while (i < format.length) {
if (format.charAt(i) === '%') { if (format.charAt(i) === '%') {
result = result + fields[format.charAt(i + 1)]; result += fields[format.charAt(i + 1)];
++i; ++i;
} }
else { else {
result = result + format.charAt(i); result += format.charAt(i);
} }
++i; ++i;
} }

View File

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

View File

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

View File

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

View File

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

View File

@ -1,5 +1,5 @@
/*! /*!
* jQuery JavaScript Library v3.6.0 * jQuery JavaScript Library v3.6.4
* https://jquery.com/ * https://jquery.com/
* *
* Includes Sizzle.js * Includes Sizzle.js
@ -9,7 +9,7 @@
* Released under the MIT license * Released under the MIT license
* https://jquery.org/license * https://jquery.org/license
* *
* Date: 2021-03-02T17:08Z * Date: 2023-03-08T15:28Z
*/ */
( function( global, factory ) { ( function( global, factory ) {
@ -23,7 +23,7 @@
// (such as Node.js), expose a factory as module.exports. // (such as Node.js), expose a factory as module.exports.
// This accentuates the need for the creation of a real `window`. // This accentuates the need for the creation of a real `window`.
// e.g. var jQuery = require("jquery")(window); // e.g. var jQuery = require("jquery")(window);
// See ticket #14549 for more info. // See ticket trac-14549 for more info.
module.exports = global.document ? module.exports = global.document ?
factory( global, true ) : factory( global, true ) :
function( w ) { function( w ) {
@ -151,7 +151,7 @@ function toType( obj ) {
var var
version = "3.6.0", version = "3.6.4",
// Define a local copy of jQuery // Define a local copy of jQuery
jQuery = function( selector, context ) { jQuery = function( selector, context ) {
@ -522,14 +522,14 @@ function isArrayLike( obj ) {
} }
var Sizzle = var Sizzle =
/*! /*!
* Sizzle CSS Selector Engine v2.3.6 * Sizzle CSS Selector Engine v2.3.10
* https://sizzlejs.com/ * https://sizzlejs.com/
* *
* Copyright JS Foundation and other contributors * Copyright JS Foundation and other contributors
* Released under the MIT license * Released under the MIT license
* https://js.foundation/ * https://js.foundation/
* *
* Date: 2021-02-16 * Date: 2023-02-14
*/ */
( function( window ) { ( function( window ) {
var i, var i,
@ -633,7 +633,7 @@ var i,
whitespace + "+$", "g" ), whitespace + "+$", "g" ),
rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + rleadingCombinator = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace +
"*" ), "*" ),
rdescend = new RegExp( whitespace + "|>" ), rdescend = new RegExp( whitespace + "|>" ),
@ -850,7 +850,7 @@ function Sizzle( selector, context, results, seed ) {
// as such selectors are not recognized by querySelectorAll. // as such selectors are not recognized by querySelectorAll.
// Thanks to Andrew Dupont for this technique. // Thanks to Andrew Dupont for this technique.
if ( nodeType === 1 && if ( nodeType === 1 &&
( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { ( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) {
// Expand context for sibling selectors // Expand context for sibling selectors
newContext = rsibling.test( selector ) && testContext( context.parentNode ) || newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
@ -1174,6 +1174,24 @@ setDocument = Sizzle.setDocument = function( node ) {
!el.querySelectorAll( ":scope fieldset div" ).length; !el.querySelectorAll( ":scope fieldset div" ).length;
} ); } );
// Support: Chrome 105 - 110+, Safari 15.4 - 16.3+
// Make sure the the `:has()` argument is parsed unforgivingly.
// We include `*` in the test to detect buggy implementations that are
// _selectively_ forgiving (specifically when the list includes at least
// one valid selector).
// Note that we treat complete lack of support for `:has()` as if it were
// spec-compliant support, which is fine because use of `:has()` in such
// environments will fail in the qSA path and fall back to jQuery traversal
// anyway.
support.cssHas = assert( function() {
try {
document.querySelector( ":has(*,:jqfake)" );
return false;
} catch ( e ) {
return true;
}
} );
/* Attributes /* Attributes
---------------------------------------------------------------------- */ ---------------------------------------------------------------------- */
@ -1440,6 +1458,17 @@ setDocument = Sizzle.setDocument = function( node ) {
} ); } );
} }
if ( !support.cssHas ) {
// Support: Chrome 105 - 110+, Safari 15.4 - 16.3+
// Our regular `try-catch` mechanism fails to detect natively-unsupported
// pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`)
// in browsers that parse the `:has()` argument as a forgiving selector list.
// https://drafts.csswg.org/selectors/#relational now requires the argument
// to be parsed unforgivingly, but browsers have not yet fully adjusted.
rbuggyQSA.push( ":has" );
}
rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) );
@ -1452,7 +1481,14 @@ setDocument = Sizzle.setDocument = function( node ) {
// As in, an element does not contain itself // As in, an element does not contain itself
contains = hasCompare || rnative.test( docElem.contains ) ? contains = hasCompare || rnative.test( docElem.contains ) ?
function( a, b ) { function( a, b ) {
var adown = a.nodeType === 9 ? a.documentElement : a,
// Support: IE <9 only
// IE doesn't have `contains` on `document` so we need to check for
// `documentElement` presence.
// We need to fall back to `a` when `documentElement` is missing
// as `ownerDocument` of elements within `<template/>` may have
// a null one - a default behavior of all modern browsers.
var adown = a.nodeType === 9 && a.documentElement || a,
bup = b && b.parentNode; bup = b && b.parentNode;
return a === bup || !!( bup && bup.nodeType === 1 && ( return a === bup || !!( bup && bup.nodeType === 1 && (
adown.contains ? adown.contains ?
@ -2242,7 +2278,7 @@ Expr = Sizzle.selectors = {
return elem.nodeName.toLowerCase() === "input" && return elem.nodeName.toLowerCase() === "input" &&
elem.type === "text" && elem.type === "text" &&
// Support: IE<8 // Support: IE <10 only
// New HTML5 attribute values (e.g., "search") appear with elem.type === "text" // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
( ( attr = elem.getAttribute( "type" ) ) == null || ( ( attr = elem.getAttribute( "type" ) ) == null ||
attr.toLowerCase() === "text" ); attr.toLowerCase() === "text" );
@ -2342,7 +2378,7 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
matched = false; matched = false;
// Combinators // Combinators
if ( ( match = rcombinators.exec( soFar ) ) ) { if ( ( match = rleadingCombinator.exec( soFar ) ) ) {
matched = match.shift(); matched = match.shift();
tokens.push( { tokens.push( {
value: matched, value: matched,
@ -3129,8 +3165,8 @@ jQuery.fn.extend( {
var rootjQuery, var rootjQuery,
// A simple way to check for HTML strings // A simple way to check for HTML strings
// Prioritize #id over <tag> to avoid XSS via location.hash (#9521) // Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521)
// Strict HTML recognition (#11290: must start with <) // Strict HTML recognition (trac-11290: must start with <)
// Shortcut simple #id case for speed // Shortcut simple #id case for speed
rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
@ -4087,7 +4123,7 @@ jQuery.extend( {
isReady: false, isReady: false,
// A counter to track how many items to wait for before // A counter to track how many items to wait for before
// the ready event fires. See #6781 // the ready event fires. See trac-6781
readyWait: 1, readyWait: 1,
// Handle when the DOM is ready // Handle when the DOM is ready
@ -4215,7 +4251,7 @@ function fcamelCase( _all, letter ) {
// Convert dashed to camelCase; used by the css and data modules // Convert dashed to camelCase; used by the css and data modules
// Support: IE <=9 - 11, Edge 12 - 15 // Support: IE <=9 - 11, Edge 12 - 15
// Microsoft forgot to hump their vendor prefix (#9572) // Microsoft forgot to hump their vendor prefix (trac-9572)
function camelCase( string ) { function camelCase( string ) {
return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
} }
@ -4251,7 +4287,7 @@ Data.prototype = {
value = {}; value = {};
// We can accept data for non-element nodes in modern browsers, // We can accept data for non-element nodes in modern browsers,
// but we should not, see #8335. // but we should not, see trac-8335.
// Always return an empty object. // Always return an empty object.
if ( acceptData( owner ) ) { if ( acceptData( owner ) ) {
@ -4490,7 +4526,7 @@ jQuery.fn.extend( {
while ( i-- ) { while ( i-- ) {
// Support: IE 11 only // Support: IE 11 only
// The attrs elements can be null (#14894) // The attrs elements can be null (trac-14894)
if ( attrs[ i ] ) { if ( attrs[ i ] ) {
name = attrs[ i ].name; name = attrs[ i ].name;
if ( name.indexOf( "data-" ) === 0 ) { if ( name.indexOf( "data-" ) === 0 ) {
@ -4913,9 +4949,9 @@ var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
input = document.createElement( "input" ); input = document.createElement( "input" );
// Support: Android 4.0 - 4.3 only // Support: Android 4.0 - 4.3 only
// Check state lost if the name is set (#11217) // Check state lost if the name is set (trac-11217)
// Support: Windows Web Apps (WWA) // Support: Windows Web Apps (WWA)
// `name` and `type` must use .setAttribute for WWA (#14901) // `name` and `type` must use .setAttribute for WWA (trac-14901)
input.setAttribute( "type", "radio" ); input.setAttribute( "type", "radio" );
input.setAttribute( "checked", "checked" ); input.setAttribute( "checked", "checked" );
input.setAttribute( "name", "t" ); input.setAttribute( "name", "t" );
@ -4939,7 +4975,7 @@ var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
} )(); } )();
// We have to close these tags to support XHTML (#13200) // We have to close these tags to support XHTML (trac-13200)
var wrapMap = { var wrapMap = {
// XHTML parsers do not magically insert elements in the // XHTML parsers do not magically insert elements in the
@ -4965,7 +5001,7 @@ if ( !support.option ) {
function getAll( context, tag ) { function getAll( context, tag ) {
// Support: IE <=9 - 11 only // Support: IE <=9 - 11 only
// Use typeof to avoid zero-argument method invocation on host objects (#15151) // Use typeof to avoid zero-argument method invocation on host objects (trac-15151)
var ret; var ret;
if ( typeof context.getElementsByTagName !== "undefined" ) { if ( typeof context.getElementsByTagName !== "undefined" ) {
@ -5048,7 +5084,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
// Remember the top-level container // Remember the top-level container
tmp = fragment.firstChild; tmp = fragment.firstChild;
// Ensure the created nodes are orphaned (#12392) // Ensure the created nodes are orphaned (trac-12392)
tmp.textContent = ""; tmp.textContent = "";
} }
} }
@ -5469,15 +5505,15 @@ jQuery.event = {
for ( ; cur !== this; cur = cur.parentNode || this ) { for ( ; cur !== this; cur = cur.parentNode || this ) {
// Don't check non-elements (#13208) // Don't check non-elements (trac-13208)
// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764)
if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
matchedHandlers = []; matchedHandlers = [];
matchedSelectors = {}; matchedSelectors = {};
for ( i = 0; i < delegateCount; i++ ) { for ( i = 0; i < delegateCount; i++ ) {
handleObj = handlers[ i ]; handleObj = handlers[ i ];
// Don't conflict with Object.prototype properties (#13203) // Don't conflict with Object.prototype properties (trac-13203)
sel = handleObj.selector + " "; sel = handleObj.selector + " ";
if ( matchedSelectors[ sel ] === undefined ) { if ( matchedSelectors[ sel ] === undefined ) {
@ -5731,7 +5767,7 @@ jQuery.Event = function( src, props ) {
// Create target properties // Create target properties
// Support: Safari <=6 - 7 only // Support: Safari <=6 - 7 only
// Target should not be a text node (#504, #13143) // Target should not be a text node (trac-504, trac-13143)
this.target = ( src.target && src.target.nodeType === 3 ) ? this.target = ( src.target && src.target.nodeType === 3 ) ?
src.target.parentNode : src.target.parentNode :
src.target; src.target;
@ -5854,10 +5890,10 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTyp
return true; return true;
}, },
// Suppress native focus or blur as it's already being fired // Suppress native focus or blur if we're currently inside
// in leverageNative. // a leveraged native-event stack
_default: function() { _default: function( event ) {
return true; return dataPriv.get( event.target, type );
}, },
delegateType: delegateType delegateType: delegateType
@ -5956,7 +5992,8 @@ var
// checked="checked" or checked // checked="checked" or checked
rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
rcleanScript = /^\s*<!\[CDATA\[|\]\]>\s*$/g;
// Prefer a tbody over its parent table for containing new rows // Prefer a tbody over its parent table for containing new rows
function manipulationTarget( elem, content ) { function manipulationTarget( elem, content ) {
@ -6070,7 +6107,7 @@ function domManip( collection, args, callback, ignored ) {
// Use the original fragment for the last item // Use the original fragment for the last item
// instead of the first because it can end up // instead of the first because it can end up
// being emptied incorrectly in certain situations (#8070). // being emptied incorrectly in certain situations (trac-8070).
for ( ; i < l; i++ ) { for ( ; i < l; i++ ) {
node = fragment; node = fragment;
@ -6111,6 +6148,12 @@ function domManip( collection, args, callback, ignored ) {
}, doc ); }, doc );
} }
} else { } else {
// Unwrap a CDATA section containing script contents. This shouldn't be
// needed as in XML documents they're already not visible when
// inspecting element contents and in HTML documents they have no
// meaning but we're preserving that logic for backwards compatibility.
// This will be removed completely in 4.0. See gh-4904.
DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
} }
} }
@ -6393,9 +6436,12 @@ jQuery.each( {
} ); } );
var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
var rcustomProp = /^--/;
var getStyles = function( elem ) { var getStyles = function( elem ) {
// Support: IE <=11 only, Firefox <=30 (#15098, #14150) // Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150)
// IE throws on elements created in popups // IE throws on elements created in popups
// FF meanwhile throws on frame elements through "defaultView.getComputedStyle" // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
var view = elem.ownerDocument.defaultView; var view = elem.ownerDocument.defaultView;
@ -6430,6 +6476,15 @@ var swap = function( elem, options, callback ) {
var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
var whitespace = "[\\x20\\t\\r\\n\\f]";
var rtrimCSS = new RegExp(
"^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$",
"g"
);
( function() { ( function() {
@ -6495,7 +6550,7 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
} }
// Support: IE <=9 - 11 only // Support: IE <=9 - 11 only
// Style of cloned element affects source element cloned (#8908) // Style of cloned element affects source element cloned (trac-8908)
div.style.backgroundClip = "content-box"; div.style.backgroundClip = "content-box";
div.cloneNode( true ).style.backgroundClip = ""; div.cloneNode( true ).style.backgroundClip = "";
support.clearCloneStyle = div.style.backgroundClip === "content-box"; support.clearCloneStyle = div.style.backgroundClip === "content-box";
@ -6575,6 +6630,7 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
function curCSS( elem, name, computed ) { function curCSS( elem, name, computed ) {
var width, minWidth, maxWidth, ret, var width, minWidth, maxWidth, ret,
isCustomProp = rcustomProp.test( name ),
// Support: Firefox 51+ // Support: Firefox 51+
// Retrieving style before computed somehow // Retrieving style before computed somehow
@ -6585,11 +6641,42 @@ function curCSS( elem, name, computed ) {
computed = computed || getStyles( elem ); computed = computed || getStyles( elem );
// getPropertyValue is needed for: // getPropertyValue is needed for:
// .css('filter') (IE 9 only, #12537) // .css('filter') (IE 9 only, trac-12537)
// .css('--customProperty) (#3144) // .css('--customProperty) (gh-3144)
if ( computed ) { if ( computed ) {
// Support: IE <=9 - 11+
// IE only supports `"float"` in `getPropertyValue`; in computed styles
// it's only available as `"cssFloat"`. We no longer modify properties
// sent to `.css()` apart from camelCasing, so we need to check both.
// Normally, this would create difference in behavior: if
// `getPropertyValue` returns an empty string, the value returned
// by `.css()` would be `undefined`. This is usually the case for
// disconnected elements. However, in IE even disconnected elements
// with no styles return `"none"` for `getPropertyValue( "float" )`
ret = computed.getPropertyValue( name ) || computed[ name ]; ret = computed.getPropertyValue( name ) || computed[ name ];
if ( isCustomProp && ret ) {
// Support: Firefox 105+, Chrome <=105+
// Spec requires trimming whitespace for custom properties (gh-4926).
// Firefox only trims leading whitespace. Chrome just collapses
// both leading & trailing whitespace to a single space.
//
// Fall back to `undefined` if empty string returned.
// This collapses a missing definition with property defined
// and set to an empty string but there's no standard API
// allowing us to differentiate them without a performance penalty
// and returning `undefined` aligns with older jQuery.
//
// rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED
// as whitespace while CSS does not, but this is not a problem
// because CSS preprocessing replaces them with U+000A LINE FEED
// (which *is* CSS whitespace)
// https://www.w3.org/TR/css-syntax-3/#input-preprocessing
ret = ret.replace( rtrimCSS, "$1" ) || undefined;
}
if ( ret === "" && !isAttached( elem ) ) { if ( ret === "" && !isAttached( elem ) ) {
ret = jQuery.style( elem, name ); ret = jQuery.style( elem, name );
} }
@ -6685,7 +6772,6 @@ var
// except "table", "table-cell", or "table-caption" // except "table", "table-cell", or "table-caption"
// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
rdisplayswap = /^(none|table(?!-c[ea]).+)/, rdisplayswap = /^(none|table(?!-c[ea]).+)/,
rcustomProp = /^--/,
cssShow = { position: "absolute", visibility: "hidden", display: "block" }, cssShow = { position: "absolute", visibility: "hidden", display: "block" },
cssNormalTransform = { cssNormalTransform = {
letterSpacing: "0", letterSpacing: "0",
@ -6921,15 +7007,15 @@ jQuery.extend( {
if ( value !== undefined ) { if ( value !== undefined ) {
type = typeof value; type = typeof value;
// Convert "+=" or "-=" to relative numbers (#7345) // Convert "+=" or "-=" to relative numbers (trac-7345)
if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
value = adjustCSS( elem, name, ret ); value = adjustCSS( elem, name, ret );
// Fixes bug #9237 // Fixes bug trac-9237
type = "number"; type = "number";
} }
// Make sure that null and NaN values aren't set (#7116) // Make sure that null and NaN values aren't set (trac-7116)
if ( value == null || value !== value ) { if ( value == null || value !== value ) {
return; return;
} }
@ -7553,7 +7639,7 @@ function Animation( elem, properties, options ) {
remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
// Support: Android 2.3 only // Support: Android 2.3 only
// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497)
temp = remaining / animation.duration || 0, temp = remaining / animation.duration || 0,
percent = 1 - temp, percent = 1 - temp,
index = 0, index = 0,
@ -7943,7 +8029,6 @@ jQuery.fx.speeds = {
// Based off of the plugin by Clint Helfers, with permission. // Based off of the plugin by Clint Helfers, with permission.
// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
jQuery.fn.delay = function( time, type ) { jQuery.fn.delay = function( time, type ) {
time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
type = type || "fx"; type = type || "fx";
@ -8168,8 +8253,7 @@ jQuery.extend( {
// Support: IE <=9 - 11 only // Support: IE <=9 - 11 only
// elem.tabIndex doesn't always return the // elem.tabIndex doesn't always return the
// correct value when it hasn't been explicitly set // correct value when it hasn't been explicitly set
// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ // Use proper attribute retrieval (trac-12072)
// Use proper attribute retrieval(#12072)
var tabindex = jQuery.find.attr( elem, "tabindex" ); var tabindex = jQuery.find.attr( elem, "tabindex" );
if ( tabindex ) { if ( tabindex ) {
@ -8273,8 +8357,7 @@ function classesToArray( value ) {
jQuery.fn.extend( { jQuery.fn.extend( {
addClass: function( value ) { addClass: function( value ) {
var classes, elem, cur, curValue, clazz, j, finalValue, var classNames, cur, curValue, className, i, finalValue;
i = 0;
if ( isFunction( value ) ) { if ( isFunction( value ) ) {
return this.each( function( j ) { return this.each( function( j ) {
@ -8282,36 +8365,35 @@ jQuery.fn.extend( {
} ); } );
} }
classes = classesToArray( value ); classNames = classesToArray( value );
if ( classes.length ) { if ( classNames.length ) {
while ( ( elem = this[ i++ ] ) ) { return this.each( function() {
curValue = getClass( elem ); curValue = getClass( this );
cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
if ( cur ) { if ( cur ) {
j = 0; for ( i = 0; i < classNames.length; i++ ) {
while ( ( clazz = classes[ j++ ] ) ) { className = classNames[ i ];
if ( cur.indexOf( " " + clazz + " " ) < 0 ) { if ( cur.indexOf( " " + className + " " ) < 0 ) {
cur += clazz + " "; cur += className + " ";
} }
} }
// Only assign if different to avoid unneeded rendering. // Only assign if different to avoid unneeded rendering.
finalValue = stripAndCollapse( cur ); finalValue = stripAndCollapse( cur );
if ( curValue !== finalValue ) { if ( curValue !== finalValue ) {
elem.setAttribute( "class", finalValue ); this.setAttribute( "class", finalValue );
} }
} }
} } );
} }
return this; return this;
}, },
removeClass: function( value ) { removeClass: function( value ) {
var classes, elem, cur, curValue, clazz, j, finalValue, var classNames, cur, curValue, className, i, finalValue;
i = 0;
if ( isFunction( value ) ) { if ( isFunction( value ) ) {
return this.each( function( j ) { return this.each( function( j ) {
@ -8323,45 +8405,42 @@ jQuery.fn.extend( {
return this.attr( "class", "" ); return this.attr( "class", "" );
} }
classes = classesToArray( value ); classNames = classesToArray( value );
if ( classes.length ) { if ( classNames.length ) {
while ( ( elem = this[ i++ ] ) ) { return this.each( function() {
curValue = getClass( elem ); curValue = getClass( this );
// This expression is here for better compressibility (see addClass) // This expression is here for better compressibility (see addClass)
cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
if ( cur ) { if ( cur ) {
j = 0; for ( i = 0; i < classNames.length; i++ ) {
while ( ( clazz = classes[ j++ ] ) ) { className = classNames[ i ];
// Remove *all* instances // Remove *all* instances
while ( cur.indexOf( " " + clazz + " " ) > -1 ) { while ( cur.indexOf( " " + className + " " ) > -1 ) {
cur = cur.replace( " " + clazz + " ", " " ); cur = cur.replace( " " + className + " ", " " );
} }
} }
// Only assign if different to avoid unneeded rendering. // Only assign if different to avoid unneeded rendering.
finalValue = stripAndCollapse( cur ); finalValue = stripAndCollapse( cur );
if ( curValue !== finalValue ) { if ( curValue !== finalValue ) {
elem.setAttribute( "class", finalValue ); this.setAttribute( "class", finalValue );
} }
} }
} } );
} }
return this; return this;
}, },
toggleClass: function( value, stateVal ) { toggleClass: function( value, stateVal ) {
var type = typeof value, var classNames, className, i, self,
type = typeof value,
isValidValue = type === "string" || Array.isArray( value ); isValidValue = type === "string" || Array.isArray( value );
if ( typeof stateVal === "boolean" && isValidValue ) {
return stateVal ? this.addClass( value ) : this.removeClass( value );
}
if ( isFunction( value ) ) { if ( isFunction( value ) ) {
return this.each( function( i ) { return this.each( function( i ) {
jQuery( this ).toggleClass( jQuery( this ).toggleClass(
@ -8371,17 +8450,20 @@ jQuery.fn.extend( {
} ); } );
} }
return this.each( function() { if ( typeof stateVal === "boolean" && isValidValue ) {
var className, i, self, classNames; return stateVal ? this.addClass( value ) : this.removeClass( value );
}
classNames = classesToArray( value );
return this.each( function() {
if ( isValidValue ) { if ( isValidValue ) {
// Toggle individual class names // Toggle individual class names
i = 0;
self = jQuery( this ); self = jQuery( this );
classNames = classesToArray( value );
while ( ( className = classNames[ i++ ] ) ) { for ( i = 0; i < classNames.length; i++ ) {
className = classNames[ i ];
// Check each className given, space separated list // Check each className given, space separated list
if ( self.hasClass( className ) ) { if ( self.hasClass( className ) ) {
@ -8515,7 +8597,7 @@ jQuery.extend( {
val : val :
// Support: IE <=10 - 11 only // Support: IE <=10 - 11 only
// option.text throws exceptions (#14686, #14858) // option.text throws exceptions (trac-14686, trac-14858)
// Strip and collapse whitespace // Strip and collapse whitespace
// https://html.spec.whatwg.org/#strip-and-collapse-whitespace // https://html.spec.whatwg.org/#strip-and-collapse-whitespace
stripAndCollapse( jQuery.text( elem ) ); stripAndCollapse( jQuery.text( elem ) );
@ -8542,7 +8624,7 @@ jQuery.extend( {
option = options[ i ]; option = options[ i ];
// Support: IE <=9 only // Support: IE <=9 only
// IE8-9 doesn't update selected after form reset (#2551) // IE8-9 doesn't update selected after form reset (trac-2551)
if ( ( option.selected || i === index ) && if ( ( option.selected || i === index ) &&
// Don't return options that are disabled or in a disabled optgroup // Don't return options that are disabled or in a disabled optgroup
@ -8685,8 +8767,8 @@ jQuery.extend( jQuery.event, {
return; return;
} }
// Determine event propagation path in advance, per W3C events spec (#9951) // Determine event propagation path in advance, per W3C events spec (trac-9951)
// Bubble up to document, then to window; watch for a global ownerDocument var (#9724) // Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724)
if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
bubbleType = special.delegateType || type; bubbleType = special.delegateType || type;
@ -8738,7 +8820,7 @@ jQuery.extend( jQuery.event, {
acceptData( elem ) ) { acceptData( elem ) ) {
// Call a native DOM method on the target with the same name as the event. // Call a native DOM method on the target with the same name as the event.
// Don't do default actions on window, that's where global variables be (#6170) // Don't do default actions on window, that's where global variables be (trac-6170)
if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
// Don't re-trigger an onFOO event when we call its FOO() method // Don't re-trigger an onFOO event when we call its FOO() method
@ -9012,7 +9094,7 @@ var
rantiCache = /([?&])_=[^&]*/, rantiCache = /([?&])_=[^&]*/,
rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
// #7653, #8125, #8152: local protocol detection // trac-7653, trac-8125, trac-8152: local protocol detection
rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
rnoContent = /^(?:GET|HEAD)$/, rnoContent = /^(?:GET|HEAD)$/,
rprotocol = /^\/\//, rprotocol = /^\/\//,
@ -9035,7 +9117,7 @@ var
*/ */
transports = {}, transports = {},
// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression // Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression
allTypes = "*/".concat( "*" ), allTypes = "*/".concat( "*" ),
// Anchor tag for parsing the document origin // Anchor tag for parsing the document origin
@ -9106,7 +9188,7 @@ function inspectPrefiltersOrTransports( structure, options, originalOptions, jqX
// A special extend for ajax options // A special extend for ajax options
// that takes "flat" options (not to be deep extended) // that takes "flat" options (not to be deep extended)
// Fixes #9887 // Fixes trac-9887
function ajaxExtend( target, src ) { function ajaxExtend( target, src ) {
var key, deep, var key, deep,
flatOptions = jQuery.ajaxSettings.flatOptions || {}; flatOptions = jQuery.ajaxSettings.flatOptions || {};
@ -9517,12 +9599,12 @@ jQuery.extend( {
deferred.promise( jqXHR ); deferred.promise( jqXHR );
// Add protocol if not provided (prefilters might expect it) // Add protocol if not provided (prefilters might expect it)
// Handle falsy url in the settings object (#10093: consistency with old signature) // Handle falsy url in the settings object (trac-10093: consistency with old signature)
// We also use the url parameter if available // We also use the url parameter if available
s.url = ( ( url || s.url || location.href ) + "" ) s.url = ( ( url || s.url || location.href ) + "" )
.replace( rprotocol, location.protocol + "//" ); .replace( rprotocol, location.protocol + "//" );
// Alias method option to type as per ticket #12004 // Alias method option to type as per ticket trac-12004
s.type = options.method || options.type || s.method || s.type; s.type = options.method || options.type || s.method || s.type;
// Extract dataTypes list // Extract dataTypes list
@ -9565,7 +9647,7 @@ jQuery.extend( {
} }
// We can fire global events as of now if asked to // We can fire global events as of now if asked to
// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118)
fireGlobals = jQuery.event && s.global; fireGlobals = jQuery.event && s.global;
// Watch for a new set of requests // Watch for a new set of requests
@ -9594,7 +9676,7 @@ jQuery.extend( {
if ( s.data && ( s.processData || typeof s.data === "string" ) ) { if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
// #9682: remove data so that it's not used in an eventual retry // trac-9682: remove data so that it's not used in an eventual retry
delete s.data; delete s.data;
} }
@ -9867,7 +9949,7 @@ jQuery._evalUrl = function( url, options, doc ) {
return jQuery.ajax( { return jQuery.ajax( {
url: url, url: url,
// Make this explicit, since user can override this through ajaxSetup (#11264) // Make this explicit, since user can override this through ajaxSetup (trac-11264)
type: "GET", type: "GET",
dataType: "script", dataType: "script",
cache: true, cache: true,
@ -9976,7 +10058,7 @@ var xhrSuccessStatus = {
0: 200, 0: 200,
// Support: IE <=9 only // Support: IE <=9 only
// #1450: sometimes IE returns 1223 when it should be 204 // trac-1450: sometimes IE returns 1223 when it should be 204
1223: 204 1223: 204
}, },
xhrSupported = jQuery.ajaxSettings.xhr(); xhrSupported = jQuery.ajaxSettings.xhr();
@ -10048,7 +10130,7 @@ jQuery.ajaxTransport( function( options ) {
} else { } else {
complete( complete(
// File: protocol always yields status 0; see #8605, #14207 // File: protocol always yields status 0; see trac-8605, trac-14207
xhr.status, xhr.status,
xhr.statusText xhr.statusText
); );
@ -10109,7 +10191,7 @@ jQuery.ajaxTransport( function( options ) {
xhr.send( options.hasContent && options.data || null ); xhr.send( options.hasContent && options.data || null );
} catch ( e ) { } catch ( e ) {
// #14683: Only rethrow if this hasn't been notified as an error yet // trac-14683: Only rethrow if this hasn't been notified as an error yet
if ( callback ) { if ( callback ) {
throw e; throw e;
} }
@ -10753,7 +10835,9 @@ jQuery.each(
// Support: Android <=4.0 only // Support: Android <=4.0 only
// Make sure we trim BOM and NBSP // Make sure we trim BOM and NBSP
var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; // Require that the "whitespace run" starts from a non-whitespace
// to avoid O(N^2) behavior when the engine would try matching "\s+$" at each space position.
var rtrim = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g;
// Bind a function to a context, optionally partially applying any // Bind a function to a context, optionally partially applying any
// arguments. // arguments.
@ -10820,7 +10904,7 @@ jQuery.isNumeric = function( obj ) {
jQuery.trim = function( text ) { jQuery.trim = function( text ) {
return text == null ? return text == null ?
"" : "" :
( text + "" ).replace( rtrim, "" ); ( text + "" ).replace( rtrim, "$1" );
}; };
@ -10868,8 +10952,8 @@ jQuery.noConflict = function( deep ) {
}; };
// Expose jQuery and $ identifiers, even in AMD // Expose jQuery and $ identifiers, even in AMD
// (#7102#comment:10, https://github.com/jquery/jquery/pull/557) // (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557)
// and CommonJS for browser emulators (#13566) // and CommonJS for browser emulators (trac-13566)
if ( typeof noGlobal === "undefined" ) { if ( typeof noGlobal === "undefined" ) {
window.jQuery = window.$ = jQuery; window.jQuery = window.$ = jQuery;
} }

File diff suppressed because one or more lines are too long