diff --git a/Plan/src/main/resources/assets/plan/plan/web/css/sb-admin-2.css b/Plan/src/main/resources/assets/plan/plan/web/css/sb-admin-2.css index 4cb0b3754..c86fe89d9 100644 --- a/Plan/src/main/resources/assets/plan/plan/web/css/sb-admin-2.css +++ b/Plan/src/main/resources/assets/plan/plan/web/css/sb-admin-2.css @@ -1,1550 +1,31 @@ /*! - * Start Bootstrap - SB Admin 2 v4.1.3 (https://startbootstrap.com/theme/sb-admin-2) - * Copyright 2013-2020 Start Bootstrap - * Licensed under MIT (https://github.com/StartBootstrap/startbootstrap-sb-admin-2/blob/master/LICENSE) + * SB Admin 2 custom changes + * Compiled from a diff between SB Admin 2 + * and Plan's version of SB Admin 2 */ - -/*! - * Bootstrap v4.5.3 (https://getbootstrap.com/) - * Copyright 2011-2020 The Bootstrap Authors - * Copyright 2011-2020 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -:root { - --blue: #4e73df; - --indigo: #6610f2; - --purple: #6f42c1; - --pink: #e83e8c; - --red: #e74a3b; - --orange: #fd7e14; - --yellow: #f6c23e; - --green: #1cc88a; - --teal: #20c9a6; - --cyan: #36b9cc; - --white: #fff; - --gray: #858796; - --gray-dark: #5a5c69; - --primary: #4e73df; - --secondary: #858796; - --success: #1cc88a; - --info: #36b9cc; - --warning: #f6c23e; - --danger: #e74a3b; - --light: #f8f9fc; - --dark: #5a5c69; - --breakpoint-xs: 0; - --breakpoint-sm: 576px; - --breakpoint-md: 768px; - --breakpoint-lg: 1100px; - --breakpoint-xl: 1400px; - --font-family-sans-serif: "Nunito", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; -} - -*, -*::before, -*::after { - box-sizing: border-box; -} - -html { - font-family: sans-serif; - line-height: 1.15; - -webkit-text-size-adjust: 100%; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} - -article, aside, figcaption, figure, footer, header, hgroup, main, nav, section { - display: block; -} - -body { - margin: 0; - font-family: "Nunito", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #858796; - text-align: left; - background-color: #fff; -} - -[tabindex="-1"]:focus:not(:focus-visible) { - outline: 0 !important; -} - -hr { - box-sizing: content-box; - height: 0; - overflow: visible; -} - -h1, h2, h3, h4, h5, h6 { - margin-top: 0; - margin-bottom: 0.5rem; -} - -p { - margin-top: 0; - margin-bottom: 1rem; -} - -abbr[title], -abbr[data-original-title] { - text-decoration: underline; - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; - cursor: help; - border-bottom: 0; - -webkit-text-decoration-skip-ink: none; - text-decoration-skip-ink: none; -} - -address { - margin-bottom: 1rem; - font-style: normal; - line-height: inherit; -} - -ol, -ul, -dl { - margin-top: 0; - margin-bottom: 1rem; -} - -ol ol, -ul ul, -ol ul, -ul ol { - margin-bottom: 0; -} - -dt { - font-weight: 700; -} - -dd { - margin-bottom: .5rem; - margin-left: 0; -} - -blockquote { - margin: 0 0 1rem; -} - -b, -strong { - font-weight: bolder; -} - -small { - font-size: 80%; -} - -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} - -sub { - bottom: -.25em; -} - -sup { - top: -.5em; -} - -a { - color: #4e73df; - text-decoration: none; - background-color: transparent; -} - -a:hover { - color: #224abe; - text-decoration: underline; -} - -a:not([href]):not([class]) { - color: inherit; - text-decoration: none; -} - -a:not([href]):not([class]):hover { - color: inherit; - text-decoration: none; -} - -pre, -code, -kbd, -samp { - font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - font-size: 1em; -} - -pre { - margin-top: 0; - margin-bottom: 1rem; - overflow: auto; - -ms-overflow-style: scrollbar; -} - -figure { - margin: 0 0 1rem; -} - img { - vertical-align: middle; - border-style: none; -} - -svg { - overflow: hidden; - vertical-align: middle; -} - -table { - border-collapse: collapse; -} - -caption { - padding-top: 0.75rem; - padding-bottom: 0.75rem; - color: #858796; - text-align: left; - caption-side: bottom; -} - -th { - text-align: inherit; - text-align: -webkit-match-parent; -} - -label { - display: inline-block; - margin-bottom: 0.5rem; -} - -button { - border-radius: 0; -} - -button:focus { - outline: 1px dotted; - outline: 5px auto -webkit-focus-ring-color; -} - -input, -button, -select, -optgroup, -textarea { - margin: 0; - font-family: inherit; - font-size: inherit; - line-height: inherit; -} - -button, -input { - overflow: visible; -} - -button, -select { - text-transform: none; -} - -[role="button"] { - cursor: pointer; -} - -select { - word-wrap: normal; -} - -button, -[type="button"], -[type="reset"], -[type="submit"] { - -webkit-appearance: button; -} - -button:not(:disabled), -[type="button"]:not(:disabled), -[type="reset"]:not(:disabled), -[type="submit"]:not(:disabled) { - cursor: pointer; -} - -button::-moz-focus-inner, -[type="button"]::-moz-focus-inner, -[type="reset"]::-moz-focus-inner, -[type="submit"]::-moz-focus-inner { - padding: 0; - border-style: none; -} - -input[type="radio"], -input[type="checkbox"] { - box-sizing: border-box; - padding: 0; -} - -textarea { - overflow: auto; - resize: vertical; -} - -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0; -} - -legend { - display: block; - width: 100%; - max-width: 100%; - padding: 0; - margin-bottom: .5rem; - font-size: 1.5rem; - line-height: inherit; - color: inherit; - white-space: normal; -} - -progress { - vertical-align: baseline; -} - -[type="number"]::-webkit-inner-spin-button, -[type="number"]::-webkit-outer-spin-button { height: auto; } -[type="search"] { - outline-offset: -2px; - -webkit-appearance: none; -} - -[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -::-webkit-file-upload-button { - font: inherit; - -webkit-appearance: button; -} - -output { - display: inline-block; -} - -summary { - display: list-item; - cursor: pointer; -} - -template { - display: none; -} - -[hidden] { - display: none !important; -} - -h1, h2, h3, h4, h5, h6, -.h1, .h2, .h3, .h4, .h5, .h6 { - margin-bottom: 0.5rem; - font-weight: 400; - line-height: 1.2; -} - -h1, .h1 { - font-size: 2.5rem; -} - -h2, .h2 { - font-size: 2rem; -} - -h3, .h3 { - font-size: 1.75rem; -} - -h4, .h4 { - font-size: 1.5rem; -} - -h5, .h5 { - font-size: 1.25rem; -} - -h6, .h6 { - font-size: 1rem; -} - -.lead { - font-size: 1.25rem; - font-weight: 300; -} - -.display-1 { - font-size: 6rem; - font-weight: 300; - line-height: 1.2; -} - -.display-2 { - font-size: 5.5rem; - font-weight: 300; - line-height: 1.2; -} - -.display-3 { - font-size: 4.5rem; - font-weight: 300; - line-height: 1.2; -} - -.display-4 { - font-size: 3.5rem; - font-weight: 300; - line-height: 1.2; -} - -hr { - margin-top: 1rem; - margin-bottom: 1rem; - border: 0; - border-top: 1px solid rgba(0, 0, 0, 0.1); -} - -small, -.small { - font-size: 80%; - font-weight: 400; -} - -mark, -.mark { - padding: 0.2em; - background-color: #fcf8e3; -} - -.list-unstyled { - padding-left: 0; - list-style: none; -} - -.list-inline { - padding-left: 0; - list-style: none; -} - -.list-inline-item { - display: inline-block; -} - -.list-inline-item:not(:last-child) { - margin-right: 0.5rem; -} - -.initialism { - font-size: 90%; - text-transform: uppercase; -} - -.blockquote { - margin-bottom: 1rem; - font-size: 1.25rem; -} - -.blockquote-footer { - display: block; - font-size: 80%; - color: #858796; -} - -.blockquote-footer::before { - content: "\2014\00A0"; -} - -.img-fluid { - max-width: 100%; - height: auto; -} - -.img-thumbnail { - padding: 0.25rem; - background-color: #fff; - border: 1px solid #dddfeb; - border-radius: 0.35rem; - max-width: 100%; - height: auto; -} - -.figure { - display: inline-block; -} - -.figure-img { - margin-bottom: 0.5rem; - line-height: 1; -} - -.figure-caption { - font-size: 90%; - color: #858796; -} - -code { - font-size: 87.5%; - color: #e83e8c; - word-wrap: break-word; -} - -a > code { - color: inherit; -} - -kbd { - padding: 0.2rem 0.4rem; - font-size: 87.5%; - color: #fff; - background-color: #3a3b45; - border-radius: 0.2rem; -} - -kbd kbd { - padding: 0; - font-size: 100%; - font-weight: 700; -} - -pre { - display: block; - font-size: 87.5%; - color: #3a3b45; -} - -pre code { - font-size: inherit; - color: inherit; - word-break: normal; -} - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} - -.container, -.container-fluid, -.container-sm, -.container-md, -.container-lg, -.container-xl { - width: 100%; - padding-right: 0.75rem; - padding-left: 0.75rem; - margin-right: auto; - margin-left: auto; -} - -@media (min-width: 576px) { - .container, .container-sm { - max-width: 540px; - } -} - -@media (min-width: 768px) { - .container, .container-sm, .container-md { - max-width: 720px; - } -} - -@media (min-width: 1100px) { - .container, .container-sm, .container-md, .container-lg { - max-width: 960px; - } -} - -@media (min-width: 1400px) { - .container, .container-sm, .container-md, .container-lg, .container-xl { - max-width: 1140px; - } -} - -.row { - display: flex; - flex-wrap: wrap; - margin-right: -0.75rem; - margin-left: -0.75rem; -} - -.no-gutters { - margin-right: 0; - margin-left: 0; -} - -.no-gutters > .col, -.no-gutters > [class*="col-"] { - padding-right: 0; - padding-left: 0; -} - -.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, -.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, -.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, -.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, -.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl, -.col-xl-auto { - position: relative; - width: 100%; - padding-right: 0.75rem; - padding-left: 0.75rem; -} - -.col { - flex-basis: 0; - flex-grow: 1; - max-width: 100%; -} - -.row-cols-1 > * { - flex: 0 0 100%; - max-width: 100%; -} - -.row-cols-2 > * { - flex: 0 0 50%; - max-width: 50%; -} - -.row-cols-3 > * { - flex: 0 0 33.33333%; - max-width: 33.33333%; -} - -.row-cols-4 > * { - flex: 0 0 25%; - max-width: 25%; -} - -.row-cols-5 > * { - flex: 0 0 20%; - max-width: 20%; -} - -.row-cols-6 > * { - flex: 0 0 16.66667%; - max-width: 16.66667%; -} - -.col-auto { - flex: 0 0 auto; - width: auto; - max-width: 100%; -} - -.col-1 { - flex: 0 0 8.33333%; - max-width: 8.33333%; -} - -.col-2 { - flex: 0 0 16.66667%; - max-width: 16.66667%; -} - -.col-3 { - flex: 0 0 25%; - max-width: 25%; -} - -.col-4 { - flex: 0 0 33.33333%; - max-width: 33.33333%; -} - -.col-5 { - flex: 0 0 41.66667%; - max-width: 41.66667%; -} - -.col-6 { - flex: 0 0 50%; - max-width: 50%; -} - -.col-7 { - flex: 0 0 58.33333%; - max-width: 58.33333%; -} - -.col-8 { - flex: 0 0 66.66667%; - max-width: 66.66667%; -} - -.col-9 { - flex: 0 0 75%; - max-width: 75%; -} - -.col-10 { - flex: 0 0 83.33333%; - max-width: 83.33333%; -} - -.col-11 { - flex: 0 0 91.66667%; - max-width: 91.66667%; -} - -.col-12 { - flex: 0 0 100%; - max-width: 100%; -} - -.order-first { - order: -1; -} - -.order-last { - order: 13; -} - -.order-0 { - order: 0; -} - -.order-1 { - order: 1; -} - -.order-2 { - order: 2; -} - -.order-3 { - order: 3; -} - -.order-4 { - order: 4; -} - -.order-5 { - order: 5; -} - -.order-6 { - order: 6; -} - -.order-7 { - order: 7; -} - -.order-8 { - order: 8; -} - -.order-9 { - order: 9; -} - -.order-10 { - order: 10; -} - -.order-11 { - order: 11; -} - -.order-12 { - order: 12; -} - -.offset-1 { - margin-left: 8.33333%; -} - -.offset-2 { - margin-left: 16.66667%; -} - -.offset-3 { - margin-left: 25%; -} - -.offset-4 { - margin-left: 33.33333%; -} - -.offset-5 { - margin-left: 41.66667%; -} - -.offset-6 { - margin-left: 50%; -} - -.offset-7 { - margin-left: 58.33333%; -} - -.offset-8 { - margin-left: 66.66667%; -} - -.offset-9 { - margin-left: 75%; -} - -.offset-10 { - margin-left: 83.33333%; -} - -.offset-11 { - margin-left: 91.66667%; -} - -@media (min-width: 576px) { - .col-sm { - flex-basis: 0; - flex-grow: 1; - max-width: 100%; - } - - .row-cols-sm-1 > * { - flex: 0 0 100%; - max-width: 100%; - } - - .row-cols-sm-2 > * { - flex: 0 0 50%; - max-width: 50%; - } - - .row-cols-sm-3 > * { - flex: 0 0 33.33333%; - max-width: 33.33333%; - } - - .row-cols-sm-4 > * { - flex: 0 0 25%; - max-width: 25%; - } - - .row-cols-sm-5 > * { - flex: 0 0 20%; - max-width: 20%; - } - - .row-cols-sm-6 > * { - flex: 0 0 16.66667%; - max-width: 16.66667%; - } - - .col-sm-auto { - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - - .col-sm-1 { - flex: 0 0 8.33333%; - max-width: 8.33333%; - } - - .col-sm-2 { - flex: 0 0 16.66667%; - max-width: 16.66667%; - } - .col-sm-3 { - flex: 0 0 25%; - max-width: 25%; - } - .col-sm-4 { - flex: 0 0 33.33333%; - max-width: 33.33333%; - } - .col-sm-5 { - flex: 0 0 41.66667%; - max-width: 41.66667%; - } - .col-sm-6 { - flex: 0 0 50%; - max-width: 50%; - } - .col-sm-7 { - flex: 0 0 58.33333%; - max-width: 58.33333%; - } - .col-sm-8 { - flex: 0 0 66.66667%; - max-width: 66.66667%; - } - .col-sm-9 { - flex: 0 0 75%; - max-width: 75%; - } - .col-sm-10 { - flex: 0 0 83.33333%; - max-width: 83.33333%; - } - .col-sm-11 { - flex: 0 0 91.66667%; - max-width: 91.66667%; - } - .col-sm-12 { - flex: 0 0 100%; - max-width: 100%; - } - .order-sm-first { - order: -1; - } - .order-sm-last { - order: 13; - } - .order-sm-0 { - order: 0; - } - .order-sm-1 { - order: 1; - } - .order-sm-2 { - order: 2; - } - .order-sm-3 { - order: 3; - } - .order-sm-4 { - order: 4; - } - .order-sm-5 { - order: 5; - } - .order-sm-6 { - order: 6; - } - .order-sm-7 { - order: 7; - } - .order-sm-8 { - order: 8; - } - .order-sm-9 { - order: 9; - } - .order-sm-10 { - order: 10; - } - .order-sm-11 { - order: 11; - } - .order-sm-12 { - order: 12; - } - .offset-sm-0 { - margin-left: 0; - } - .offset-sm-1 { - margin-left: 8.33333%; - } - .offset-sm-2 { - margin-left: 16.66667%; - } - .offset-sm-3 { - margin-left: 25%; - } - .offset-sm-4 { - margin-left: 33.33333%; - } - .offset-sm-5 { - margin-left: 41.66667%; - } - .offset-sm-6 { - margin-left: 50%; - } - .offset-sm-7 { - margin-left: 58.33333%; - } - .offset-sm-8 { - margin-left: 66.66667%; - } - .offset-sm-9 { - margin-left: 75%; - } - .offset-sm-10 { - margin-left: 83.33333%; - } - .offset-sm-11 { - margin-left: 91.66667%; - } -} - -@media (min-width: 768px) { - .col-md { - flex-basis: 0; - flex-grow: 1; - max-width: 100%; - } - - .row-cols-md-1 > * { - flex: 0 0 100%; - max-width: 100%; - } - - .row-cols-md-2 > * { - flex: 0 0 50%; - max-width: 50%; - } - - .row-cols-md-3 > * { - flex: 0 0 33.33333%; - max-width: 33.33333%; - } - - .row-cols-md-4 > * { - flex: 0 0 25%; - max-width: 25%; - } - - .row-cols-md-5 > * { - flex: 0 0 20%; - max-width: 20%; - } - - .row-cols-md-6 > * { - flex: 0 0 16.66667%; - max-width: 16.66667%; - } - - .col-md-auto { - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - - .col-md-1 { - flex: 0 0 8.33333%; - max-width: 8.33333%; - } - - .col-md-2 { - flex: 0 0 16.66667%; - max-width: 16.66667%; - } - .col-md-3 { - flex: 0 0 25%; - max-width: 25%; - } - .col-md-4 { - flex: 0 0 33.33333%; - max-width: 33.33333%; - } - .col-md-5 { - flex: 0 0 41.66667%; - max-width: 41.66667%; - } - .col-md-6 { - flex: 0 0 50%; - max-width: 50%; - } - .col-md-7 { - flex: 0 0 58.33333%; - max-width: 58.33333%; - } - .col-md-8 { - flex: 0 0 66.66667%; - max-width: 66.66667%; - } - .col-md-9 { - flex: 0 0 75%; - max-width: 75%; - } - .col-md-10 { - flex: 0 0 83.33333%; - max-width: 83.33333%; - } - .col-md-11 { - flex: 0 0 91.66667%; - max-width: 91.66667%; - } - .col-md-12 { - flex: 0 0 100%; - max-width: 100%; - } - .order-md-first { - order: -1; - } - .order-md-last { - order: 13; - } - .order-md-0 { - order: 0; - } - .order-md-1 { - order: 1; - } - .order-md-2 { - order: 2; - } - .order-md-3 { - order: 3; - } - .order-md-4 { - order: 4; - } - .order-md-5 { - order: 5; - } - .order-md-6 { - order: 6; - } - .order-md-7 { - order: 7; - } - .order-md-8 { - order: 8; - } - .order-md-9 { - order: 9; - } - .order-md-10 { - order: 10; - } - .order-md-11 { - order: 11; - } - .order-md-12 { - order: 12; - } - .offset-md-0 { - margin-left: 0; - } - .offset-md-1 { - margin-left: 8.33333%; - } - .offset-md-2 { - margin-left: 16.66667%; - } - .offset-md-3 { - margin-left: 25%; - } - .offset-md-4 { - margin-left: 33.33333%; - } - .offset-md-5 { - margin-left: 41.66667%; - } - .offset-md-6 { - margin-left: 50%; - } - .offset-md-7 { - margin-left: 58.33333%; - } - .offset-md-8 { - margin-left: 66.66667%; - } - .offset-md-9 { - margin-left: 75%; - } - .offset-md-10 { - margin-left: 83.33333%; - } - .offset-md-11 { - margin-left: 91.66667%; - } -} - -@media (min-width: 1100px) { - .col-lg { - flex-basis: 0; - flex-grow: 1; - max-width: 100%; - } - - .row-cols-lg-1 > * { - flex: 0 0 100%; - max-width: 100%; - } - - .row-cols-lg-2 > * { - flex: 0 0 50%; - max-width: 50%; - } - - .row-cols-lg-3 > * { - flex: 0 0 33.33333%; - max-width: 33.33333%; - } - - .row-cols-lg-4 > * { - flex: 0 0 25%; - max-width: 25%; - } - - .row-cols-lg-5 > * { - flex: 0 0 20%; - max-width: 20%; - } - - .row-cols-lg-6 > * { - flex: 0 0 16.66667%; - max-width: 16.66667%; - } - - .col-lg-auto { - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - - .col-lg-1 { - flex: 0 0 8.33333%; - max-width: 8.33333%; - } - - .col-lg-2 { - flex: 0 0 16.66667%; - max-width: 16.66667%; - } - .col-lg-3 { - flex: 0 0 25%; - max-width: 25%; - } - .col-lg-4 { - flex: 0 0 33.33333%; - max-width: 33.33333%; - } - .col-lg-5 { - flex: 0 0 41.66667%; - max-width: 41.66667%; - } - .col-lg-6 { - flex: 0 0 50%; - max-width: 50%; - } - .col-lg-7 { - flex: 0 0 58.33333%; - max-width: 58.33333%; - } - .col-lg-8 { - flex: 0 0 66.66667%; - max-width: 66.66667%; - } - .col-lg-9 { - flex: 0 0 75%; - max-width: 75%; - } - .col-lg-10 { - flex: 0 0 83.33333%; - max-width: 83.33333%; - } - .col-lg-11 { - flex: 0 0 91.66667%; - max-width: 91.66667%; - } - .col-lg-12 { - flex: 0 0 100%; - max-width: 100%; - } - .order-lg-first { - order: -1; - } - .order-lg-last { - order: 13; - } - .order-lg-0 { - order: 0; - } - .order-lg-1 { - order: 1; - } - .order-lg-2 { - order: 2; - } - .order-lg-3 { - order: 3; - } - .order-lg-4 { - order: 4; - } - .order-lg-5 { - order: 5; - } - .order-lg-6 { - order: 6; - } - .order-lg-7 { - order: 7; - } - .order-lg-8 { - order: 8; - } - .order-lg-9 { - order: 9; - } - .order-lg-10 { - order: 10; - } - .order-lg-11 { - order: 11; - } - .order-lg-12 { - order: 12; - } - .offset-lg-0 { - margin-left: 0; - } - .offset-lg-1 { - margin-left: 8.33333%; - } - .offset-lg-2 { - margin-left: 16.66667%; - } - .offset-lg-3 { - margin-left: 25%; - } - .offset-lg-4 { - margin-left: 33.33333%; - } - .offset-lg-5 { - margin-left: 41.66667%; - } - .offset-lg-6 { - margin-left: 50%; - } - .offset-lg-7 { - margin-left: 58.33333%; - } - .offset-lg-8 { - margin-left: 66.66667%; - } - .offset-lg-9 { - margin-left: 75%; - } - .offset-lg-10 { - margin-left: 83.33333%; - } - .offset-lg-11 { - margin-left: 91.66667%; - } -} - -@media (min-width: 1400px) { - .col-xl { - flex-basis: 0; - flex-grow: 1; - max-width: 100%; - } - - .row-cols-xl-1 > * { - flex: 0 0 100%; - max-width: 100%; - } - - .row-cols-xl-2 > * { - flex: 0 0 50%; - max-width: 50%; - } - - .row-cols-xl-3 > * { - flex: 0 0 33.33333%; - max-width: 33.33333%; - } - - .row-cols-xl-4 > * { - flex: 0 0 25%; - max-width: 25%; - } - - .row-cols-xl-5 > * { - flex: 0 0 20%; - max-width: 20%; - } - - .row-cols-xl-6 > * { - flex: 0 0 16.66667%; - max-width: 16.66667%; - } - - .col-xl-auto { - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - - .col-xl-1 { - flex: 0 0 8.33333%; - max-width: 8.33333%; - } - - .col-xl-2 { - flex: 0 0 16.66667%; - max-width: 16.66667%; - } - .col-xl-3 { - flex: 0 0 25%; - max-width: 25%; - } - .col-xl-4 { - flex: 0 0 33.33333%; - max-width: 33.33333%; - } - .col-xl-5 { - flex: 0 0 41.66667%; - max-width: 41.66667%; - } - .col-xl-6 { - flex: 0 0 50%; - max-width: 50%; - } - .col-xl-7 { - flex: 0 0 58.33333%; - max-width: 58.33333%; - } - .col-xl-8 { - flex: 0 0 66.66667%; - max-width: 66.66667%; - } - .col-xl-9 { - flex: 0 0 75%; - max-width: 75%; - } - .col-xl-10 { - flex: 0 0 83.33333%; - max-width: 83.33333%; - } - .col-xl-11 { - flex: 0 0 91.66667%; - max-width: 91.66667%; - } - .col-xl-12 { - flex: 0 0 100%; - max-width: 100%; - } - .order-xl-first { - order: -1; - } - .order-xl-last { - order: 13; - } - .order-xl-0 { - order: 0; - } - .order-xl-1 { - order: 1; - } - .order-xl-2 { - order: 2; - } - .order-xl-3 { - order: 3; - } - .order-xl-4 { - order: 4; - } - .order-xl-5 { - order: 5; - } - .order-xl-6 { - order: 6; - } - .order-xl-7 { - order: 7; - } - .order-xl-8 { - order: 8; - } - .order-xl-9 { - order: 9; - } - .order-xl-10 { - order: 10; - } - .order-xl-11 { - order: 11; - } - .order-xl-12 { - order: 12; - } - .offset-xl-0 { - margin-left: 0; - } - .offset-xl-1 { - margin-left: 8.33333%; - } - .offset-xl-2 { - margin-left: 16.66667%; - } - .offset-xl-3 { - margin-left: 25%; - } - .offset-xl-4 { - margin-left: 33.33333%; - } - .offset-xl-5 { - margin-left: 41.66667%; - } - .offset-xl-6 { - margin-left: 50%; - } - .offset-xl-7 { - margin-left: 58.33333%; - } - .offset-xl-8 { - margin-left: 66.66667%; - } - .offset-xl-9 { - margin-left: 75%; - } - .offset-xl-10 { - margin-left: 83.33333%; - } - .offset-xl-11 { - margin-left: 91.66667%; - } -} - .table { - width: 100%; + margin-bottom: unset; + color: unset; background-color: transparent; } .table th, .table td { - padding: 0.75rem; - vertical-align: top; border-top: 1px solid #dddfeb; } .table thead th { - vertical-align: bottom; - border-bottom: 2px solid #dddfeb; + border-bottom: 2px solid #dddfeb !important; } .table tbody + tbody { border-top: 2px solid #dddfeb; } -.table-sm th, -.table-sm td { - padding: 0.3rem; -} - .table-bordered { border: 1px solid #dddfeb; } @@ -1554,25 +35,10 @@ pre code { border: 1px solid #dddfeb; } -.table-bordered thead th, -.table-bordered thead td { - border-bottom-width: 2px; -} - -.table-borderless th, -.table-borderless td, -.table-borderless thead th, -.table-borderless tbody + tbody { - border: 0; -} - -.table-striped tbody tr:nth-of-type(odd) { - background-color: rgba(0, 0, 0, 0.05); -} +/* SB Admin 2 table changes start */ .table-hover tbody tr:hover { color: #858796; - background-color: rgba(0, 0, 0, 0.075); } .table-primary, @@ -1707,12 +173,6 @@ pre code { background-color: #f5b7b1; } -.table-light, -.table-light > th, -.table-light > td { - background-color: #fdfdfe; -} - .table-light th, .table-light td, .table-light thead th, @@ -1720,15 +180,6 @@ pre code { border-color: #fbfcfd; } -.table-hover .table-light:hover { - background-color: #ececf6; -} - -.table-hover .table-light:hover > td, -.table-hover .table-light:hover > th { - background-color: #ececf6; -} - .table-dark, .table-dark > th, .table-dark > td { @@ -1751,23 +202,9 @@ pre code { background-color: #c4c4c9; } -.table-active, -.table-active > th, -.table-active > td { - background-color: rgba(0, 0, 0, 0.075); -} - -.table-hover .table-active:hover { - background-color: rgba(0, 0, 0, 0.075); -} - -.table-hover .table-active:hover > td, -.table-hover .table-active:hover > th { - background-color: rgba(0, 0, 0, 0.075); -} +/* SB Admin 2 table changes end */ .table .thead-dark th { - color: #fff; background-color: #3a3b45; border-color: #4b4d5a; } @@ -1786,266 +223,189 @@ pre code { .table-dark th, .table-dark td, .table-dark thead th { - border-color: #4b4d5a; -} - -.table-dark.table-bordered { - border: 0; -} - -.table-dark.table-striped tbody tr:nth-of-type(odd) { - background-color: rgba(255, 255, 255, 0.05); + border-color: #4b4d5a !important; } .table-dark.table-hover tbody tr:hover { - background-color: rgba(255, 255, 255, 0.075); + color: unset; } -@media (max-width: 575.98px) { - .table-responsive-sm { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + background-color: unset; +} + +.page-item.active .page-link { + background-color: #368F17; + border-color: #368F17; +} + +.modal-footer { + border-top: 1px solid #eaecf4; +} + +.bg-white { + background-color: unset; +} + +@media print { + .table-dark th, + .table-dark td, + .table-dark thead th, + .table-dark tbody + tbody { + border-color: #dddfeb; } - .table-responsive-sm > .table-bordered { - border: 0; + .table .thead-dark th { + border-color: #dddfeb; } } -@media (max-width: 767.98px) { - .table-responsive-md { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } - .table-responsive-md > .table-bordered { - border: 0; - } -} - -@media (max-width: 991.98px) { - .table-responsive-lg { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } - .table-responsive-lg > .table-bordered { - border: 0; - } -} - -@media (max-width: 1199.98px) { - .table-responsive-xl { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } - .table-responsive-xl > .table-bordered { - border: 0; - } -} - -.table-responsive { - display: block; +.chart-area { + position: relative; + height: 22rem; width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; + padding: 0.5rem; + text-align: center; } -.table-responsive > .table-bordered { - border: 0; +.chart-bar { + position: relative; + height: 20rem; + width: 100%; +} + +.chart-pie { + position: relative; + height: calc(20rem - 43px); + width: 100%; +} + +/*! + * Start Bootstrap - SB Admin 2 v4.1.3 (https://startbootstrap.com/theme/sb-admin-2) + * Copyright 2013-2020 Start Bootstrap + * Licensed under MIT (https://github.com/StartBootstrap/startbootstrap-sb-admin-2/blob/master/LICENSE) + * Changes compiled from SB Admin/Bootstrap diff + */ + +:root { + --bs-blue: #4e73df; + --bs-red: #e74a3b; + --bs-yellow: #f6c23e; + --bs-green: #1cc88a; + --bs-teal: #20c9a6; + --bs-cyan: #36b9cc; + --bs-gray: #858796; + --bs-gray-dark: #5a5c69; + --bs-primary: #4e73df; + --bs-secondary: #858796; + --bs-success: #1cc88a; + --bs-info: #36b9cc; + --bs-warning: #f6c23e; + --bs-danger: #e74a3b; + --bs-light: #f8f9fc; + --bs-dark: #5a5c69; + --bs-font-sans-serif: "Nunito", system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"; +} + +html { + position: relative; + min-height: 100%; +} + +body { + font-family: "Nunito", system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"; + height: 100%; + color: #858796; +} + +a { + color: #4e73df; +} + +a:hover { + color: #224abe; +} + +a:focus { + outline: none; +} + +caption { + color: #858796; +} + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + font-weight: 400; +} + +.blockquote-footer { + color: #858796; +} + +.img-thumbnail { + border: 1px solid #dddfeb; + border-radius: 0.35rem; +} + +.figure-caption { + color: #858796; +} + +kbd { + background-color: #3a3b45; +} + +pre { + color: #3a3b45; } .form-control { - display: block; - width: 100%; - height: calc(1.5em + 0.75rem + 2px); - padding: 0.375rem 0.75rem; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; color: #6e707e; - background-color: #fff; - background-clip: padding-box; border: 1px solid #d1d3e2; border-radius: 0.35rem; - transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} - -@media (prefers-reduced-motion: reduce) { - .form-control { - transition: none; - } -} - -.form-control::-ms-expand { - background-color: transparent; - border: 0; } .form-control:-moz-focusring { - color: transparent; text-shadow: 0 0 0 #6e707e; } .form-control:focus { color: #6e707e; - background-color: #fff; border-color: #bac8f3; - outline: 0; box-shadow: 0 0 0 0.2rem rgba(78, 115, 223, 0.25); } .form-control::-webkit-input-placeholder { color: #858796; - opacity: 1; } .form-control::-moz-placeholder { color: #858796; - opacity: 1; } .form-control:-ms-input-placeholder { color: #858796; - opacity: 1; } .form-control::-ms-input-placeholder { color: #858796; - opacity: 1; } .form-control::placeholder { color: #858796; - opacity: 1; } .form-control:disabled, .form-control[readonly] { background-color: #eaecf4; - opacity: 1; -} - -input[type="date"].form-control, -input[type="time"].form-control, -input[type="datetime-local"].form-control, -input[type="month"].form-control { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; } select.form-control:focus::-ms-value { color: #6e707e; - background-color: #fff; -} - -.form-control-file, -.form-control-range { - display: block; - width: 100%; -} - -.col-form-label { - padding-top: calc(0.375rem + 1px); - padding-bottom: calc(0.375rem + 1px); - margin-bottom: 0; - font-size: inherit; - line-height: 1.5; -} - -.col-form-label-lg { - padding-top: calc(0.5rem + 1px); - padding-bottom: calc(0.5rem + 1px); - font-size: 1.25rem; - line-height: 1.5; -} - -.col-form-label-sm { - padding-top: calc(0.25rem + 1px); - padding-bottom: calc(0.25rem + 1px); - font-size: 0.875rem; - line-height: 1.5; } .form-control-plaintext { - display: block; - width: 100%; - padding: 0.375rem 0; - margin-bottom: 0; - font-size: 1rem; - line-height: 1.5; color: #858796; - background-color: transparent; - border: solid transparent; - border-width: 1px 0; -} - -.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { - padding-right: 0; - padding-left: 0; -} - -.form-control-sm { - height: calc(1.5em + 0.5rem + 2px); - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - line-height: 1.5; - border-radius: 0.2rem; -} - -.form-control-lg { - height: calc(1.5em + 1rem + 2px); - padding: 0.5rem 1rem; - font-size: 1.25rem; - line-height: 1.5; - border-radius: 0.3rem; -} - -select.form-control[size], select.form-control[multiple] { - height: auto; -} - -textarea.form-control { - height: auto; -} - -.form-group { - margin-bottom: 1rem; -} - -.form-text { - display: block; - margin-top: 0.25rem; -} - -.form-row { - display: flex; - flex-wrap: wrap; - margin-right: -5px; - margin-left: -5px; -} - -.form-row > .col, -.form-row > [class*="col-"] { - padding-right: 5px; - padding-left: 5px; -} - -.form-check { - position: relative; - display: block; - padding-left: 1.25rem; -} - -.form-check-input { - position: absolute; - margin-top: 0.3rem; - margin-left: -1.25rem; } .form-check-input[disabled] ~ .form-check-label, @@ -2053,62 +413,18 @@ textarea.form-control { color: #858796; } -.form-check-label { - margin-bottom: 0; -} - -.form-check-inline { - display: inline-flex; - align-items: center; - padding-left: 0; - margin-right: 0.75rem; -} - -.form-check-inline .form-check-input { - position: static; - margin-top: 0; - margin-right: 0.3125rem; - margin-left: 0; -} - .valid-feedback { - display: none; - width: 100%; - margin-top: 0.25rem; - font-size: 80%; color: #1cc88a; } .valid-tooltip { - position: absolute; - top: 100%; - left: 0; - z-index: 5; - display: none; - max-width: 100%; - padding: 0.25rem 0.5rem; - margin-top: .1rem; - font-size: 0.875rem; - line-height: 1.5; - color: #fff; background-color: rgba(28, 200, 138, 0.9); border-radius: 0.35rem; } -.was-validated :valid ~ .valid-feedback, -.was-validated :valid ~ .valid-tooltip, -.is-valid ~ .valid-feedback, -.is-valid ~ .valid-tooltip { - display: block; -} - .was-validated .form-control:valid, .form-control.is-valid { border-color: #1cc88a; - padding-right: calc(1.5em + 0.75rem); background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%231cc88a' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); - background-repeat: no-repeat; - background-position: right calc(0.375em + 0.1875rem) center; - background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } .was-validated .form-control:valid:focus, .form-control.is-valid:focus { @@ -2116,18 +432,12 @@ textarea.form-control { box-shadow: 0 0 0 0.2rem rgba(28, 200, 138, 0.25); } -.was-validated textarea.form-control:valid, textarea.form-control.is-valid { - padding-right: calc(1.5em + 0.75rem); - background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); -} - -.was-validated .custom-select:valid, .custom-select.is-valid { +.was-validated .form-select:valid, .form-select.is-valid { border-color: #1cc88a; - padding-right: calc(0.75em + 2.3125rem); background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%235a5c69' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%231cc88a' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } -.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus { +.was-validated .form-select:valid:focus, .form-select.is-valid:focus { border-color: #1cc88a; box-shadow: 0 0 0 0.2rem rgba(28, 200, 138, 0.25); } @@ -2136,80 +446,18 @@ textarea.form-control { color: #1cc88a; } -.was-validated .form-check-input:valid ~ .valid-feedback, -.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback, -.form-check-input.is-valid ~ .valid-tooltip { - display: block; -} - -.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label { - color: #1cc88a; -} - -.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before { - border-color: #1cc88a; -} - -.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before { - border-color: #34e3a4; - background-color: #34e3a4; -} - -.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before { - box-shadow: 0 0 0 0.2rem rgba(28, 200, 138, 0.25); -} - -.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before { - border-color: #1cc88a; -} - -.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label { - border-color: #1cc88a; -} - -.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label { - border-color: #1cc88a; - box-shadow: 0 0 0 0.2rem rgba(28, 200, 138, 0.25); -} - .invalid-feedback { - display: none; - width: 100%; - margin-top: 0.25rem; - font-size: 80%; color: #e74a3b; } .invalid-tooltip { - position: absolute; - top: 100%; - left: 0; - z-index: 5; - display: none; - max-width: 100%; - padding: 0.25rem 0.5rem; - margin-top: .1rem; - font-size: 0.875rem; - line-height: 1.5; - color: #fff; background-color: rgba(231, 74, 59, 0.9); border-radius: 0.35rem; } -.was-validated :invalid ~ .invalid-feedback, -.was-validated :invalid ~ .invalid-tooltip, -.is-invalid ~ .invalid-feedback, -.is-invalid ~ .invalid-tooltip { - display: block; -} - .was-validated .form-control:invalid, .form-control.is-invalid { border-color: #e74a3b; - padding-right: calc(1.5em + 0.75rem); background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23e74a3b' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23e74a3b' stroke='none'/%3e%3c/svg%3e"); - background-repeat: no-repeat; - background-position: right calc(0.375em + 0.1875rem) center; - background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } .was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { @@ -2217,18 +465,12 @@ textarea.form-control { box-shadow: 0 0 0 0.2rem rgba(231, 74, 59, 0.25); } -.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { - padding-right: calc(1.5em + 0.75rem); - background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); -} - -.was-validated .custom-select:invalid, .custom-select.is-invalid { +.was-validated .form-select:invalid, .form-select.is-invalid { border-color: #e74a3b; - padding-right: calc(0.75em + 2.3125rem); background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%235a5c69' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23e74a3b' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23e74a3b' stroke='none'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } -.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus { +.was-validated .form-select:invalid:focus, .form-select.is-invalid:focus { border-color: #e74a3b; box-shadow: 0 0 0 0.2rem rgba(231, 74, 59, 0.25); } @@ -2237,12 +479,6 @@ textarea.form-control { color: #e74a3b; } -.was-validated .form-check-input:invalid ~ .invalid-feedback, -.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback, -.form-check-input.is-invalid ~ .invalid-tooltip { - display: block; -} - .was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label { color: #e74a3b; } @@ -2273,141 +509,42 @@ textarea.form-control { box-shadow: 0 0 0 0.2rem rgba(231, 74, 59, 0.25); } -.form-inline { - display: flex; - flex-flow: row wrap; - align-items: center; -} - -.form-inline .form-check { - width: 100%; -} - -@media (min-width: 576px) { - .form-inline label { - display: flex; - align-items: center; - justify-content: center; - margin-bottom: 0; - } - .form-inline .form-group { - display: flex; - flex: 0 0 auto; - flex-flow: row wrap; - align-items: center; - margin-bottom: 0; - } - .form-inline .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .form-inline .form-control-plaintext { - display: inline-block; - } - .form-inline .input-group, - .form-inline .custom-select { - width: auto; - } - .form-inline .form-check { - display: flex; - align-items: center; - justify-content: center; - width: auto; - padding-left: 0; - } - .form-inline .form-check-input { - position: relative; - flex-shrink: 0; - margin-top: 0; - margin-right: 0.25rem; - margin-left: 0; - } - .form-inline .custom-control { - align-items: center; - justify-content: center; - } - .form-inline .custom-control-label { - margin-bottom: 0; - } -} - .btn { - display: inline-block; - font-weight: 400; color: #858796; - text-align: center; - vertical-align: middle; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-color: transparent; - border: 1px solid transparent; - padding: 0.375rem 0.75rem; - font-size: 1rem; - line-height: 1.5; border-radius: 0.35rem; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} - -@media (prefers-reduced-motion: reduce) { - .btn { - transition: none; - } } .btn:hover { color: #858796; - text-decoration: none; } .btn:focus, .btn.focus { - outline: 0; box-shadow: 0 0 0 0.2rem rgba(78, 115, 223, 0.25); } -.btn.disabled, .btn:disabled { - opacity: 0.65; -} - -.btn:not(:disabled):not(.disabled) { - cursor: pointer; -} - -a.btn.disabled, -fieldset:disabled a.btn { - pointer-events: none; -} - .btn-primary { - color: #fff; background-color: #4e73df; border-color: #4e73df; } .btn-primary:hover { - color: #fff; background-color: #2e59d9; border-color: #2653d4; } .btn-primary:focus, .btn-primary.focus { - color: #fff; background-color: #2e59d9; border-color: #2653d4; box-shadow: 0 0 0 0.2rem rgba(105, 136, 228, 0.5); } .btn-primary.disabled, .btn-primary:disabled { - color: #fff; background-color: #4e73df; border-color: #4e73df; } .btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active, .show > .btn-primary.dropdown-toggle { - color: #fff; background-color: #2653d4; border-color: #244ec9; } @@ -2418,33 +555,28 @@ fieldset:disabled a.btn { } .btn-secondary { - color: #fff; background-color: #858796; border-color: #858796; } .btn-secondary:hover { - color: #fff; background-color: #717384; border-color: #6b6d7d; } .btn-secondary:focus, .btn-secondary.focus { - color: #fff; background-color: #717384; border-color: #6b6d7d; box-shadow: 0 0 0 0.2rem rgba(151, 153, 166, 0.5); } .btn-secondary.disabled, .btn-secondary:disabled { - color: #fff; background-color: #858796; border-color: #858796; } .btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active, .show > .btn-secondary.dropdown-toggle { - color: #fff; background-color: #6b6d7d; border-color: #656776; } @@ -2455,33 +587,28 @@ fieldset:disabled a.btn { } .btn-success { - color: #fff; background-color: #1cc88a; border-color: #1cc88a; } .btn-success:hover { - color: #fff; background-color: #17a673; border-color: #169b6b; } .btn-success:focus, .btn-success.focus { - color: #fff; background-color: #17a673; border-color: #169b6b; box-shadow: 0 0 0 0.2rem rgba(62, 208, 156, 0.5); } .btn-success.disabled, .btn-success:disabled { - color: #fff; background-color: #1cc88a; border-color: #1cc88a; } .btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active, .show > .btn-success.dropdown-toggle { - color: #fff; background-color: #169b6b; border-color: #149063; } @@ -2492,33 +619,28 @@ fieldset:disabled a.btn { } .btn-info { - color: #fff; background-color: #36b9cc; border-color: #36b9cc; } .btn-info:hover { - color: #fff; background-color: #2c9faf; border-color: #2a96a5; } .btn-info:focus, .btn-info.focus { - color: #fff; background-color: #2c9faf; border-color: #2a96a5; box-shadow: 0 0 0 0.2rem rgba(84, 196, 212, 0.5); } .btn-info.disabled, .btn-info:disabled { - color: #fff; background-color: #36b9cc; border-color: #36b9cc; } .btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active, .show > .btn-info.dropdown-toggle { - color: #fff; background-color: #2a96a5; border-color: #278c9b; } @@ -2566,33 +688,28 @@ fieldset:disabled a.btn { } .btn-danger { - color: #fff; background-color: #e74a3b; border-color: #e74a3b; } .btn-danger:hover { - color: #fff; background-color: #e02d1b; border-color: #d52a1a; } .btn-danger:focus, .btn-danger.focus { - color: #fff; background-color: #e02d1b; border-color: #d52a1a; box-shadow: 0 0 0 0.2rem rgba(235, 101, 88, 0.5); } .btn-danger.disabled, .btn-danger:disabled { - color: #fff; background-color: #e74a3b; border-color: #e74a3b; } .btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active, .show > .btn-danger.dropdown-toggle { - color: #fff; background-color: #d52a1a; border-color: #ca2819; } @@ -2640,33 +757,28 @@ fieldset:disabled a.btn { } .btn-dark { - color: #fff; background-color: #5a5c69; border-color: #5a5c69; } .btn-dark:hover { - color: #fff; background-color: #484a54; border-color: #42444e; } .btn-dark:focus, .btn-dark.focus { - color: #fff; background-color: #484a54; border-color: #42444e; box-shadow: 0 0 0 0.2rem rgba(115, 116, 128, 0.5); } .btn-dark.disabled, .btn-dark:disabled { - color: #fff; background-color: #5a5c69; border-color: #5a5c69; } .btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active, .show > .btn-dark.dropdown-toggle { - color: #fff; background-color: #42444e; border-color: #3d3e47; } @@ -2682,7 +794,6 @@ fieldset:disabled a.btn { } .btn-outline-primary:hover { - color: #fff; background-color: #4e73df; border-color: #4e73df; } @@ -2693,12 +804,10 @@ fieldset:disabled a.btn { .btn-outline-primary.disabled, .btn-outline-primary:disabled { color: #4e73df; - background-color: transparent; } .btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active, .show > .btn-outline-primary.dropdown-toggle { - color: #fff; background-color: #4e73df; border-color: #4e73df; } @@ -2714,7 +823,6 @@ fieldset:disabled a.btn { } .btn-outline-secondary:hover { - color: #fff; background-color: #858796; border-color: #858796; } @@ -2725,12 +833,10 @@ fieldset:disabled a.btn { .btn-outline-secondary.disabled, .btn-outline-secondary:disabled { color: #858796; - background-color: transparent; } .btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active, .show > .btn-outline-secondary.dropdown-toggle { - color: #fff; background-color: #858796; border-color: #858796; } @@ -2746,7 +852,6 @@ fieldset:disabled a.btn { } .btn-outline-success:hover { - color: #fff; background-color: #1cc88a; border-color: #1cc88a; } @@ -2757,12 +862,10 @@ fieldset:disabled a.btn { .btn-outline-success.disabled, .btn-outline-success:disabled { color: #1cc88a; - background-color: transparent; } .btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active, .show > .btn-outline-success.dropdown-toggle { - color: #fff; background-color: #1cc88a; border-color: #1cc88a; } @@ -2778,7 +881,6 @@ fieldset:disabled a.btn { } .btn-outline-info:hover { - color: #fff; background-color: #36b9cc; border-color: #36b9cc; } @@ -2789,12 +891,10 @@ fieldset:disabled a.btn { .btn-outline-info.disabled, .btn-outline-info:disabled { color: #36b9cc; - background-color: transparent; } .btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active, .show > .btn-outline-info.dropdown-toggle { - color: #fff; background-color: #36b9cc; border-color: #36b9cc; } @@ -2821,7 +921,6 @@ fieldset:disabled a.btn { .btn-outline-warning.disabled, .btn-outline-warning:disabled { color: #f6c23e; - background-color: transparent; } .btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active, @@ -2842,7 +941,6 @@ fieldset:disabled a.btn { } .btn-outline-danger:hover { - color: #fff; background-color: #e74a3b; border-color: #e74a3b; } @@ -2853,12 +951,10 @@ fieldset:disabled a.btn { .btn-outline-danger.disabled, .btn-outline-danger:disabled { color: #e74a3b; - background-color: transparent; } .btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active, .show > .btn-outline-danger.dropdown-toggle { - color: #fff; background-color: #e74a3b; border-color: #e74a3b; } @@ -2885,7 +981,6 @@ fieldset:disabled a.btn { .btn-outline-light.disabled, .btn-outline-light:disabled { color: #f8f9fc; - background-color: transparent; } .btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active, @@ -2906,7 +1001,6 @@ fieldset:disabled a.btn { } .btn-outline-dark:hover { - color: #fff; background-color: #5a5c69; border-color: #5a5c69; } @@ -2917,12 +1011,10 @@ fieldset:disabled a.btn { .btn-outline-dark.disabled, .btn-outline-dark:disabled { color: #5a5c69; - background-color: transparent; } .btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active, .show > .btn-outline-dark.dropdown-toggle { - color: #fff; background-color: #5a5c69; border-color: #5a5c69; } @@ -2933,880 +1025,89 @@ fieldset:disabled a.btn { } .btn-link { - font-weight: 400; color: #4e73df; - text-decoration: none; } .btn-link:hover { color: #224abe; - text-decoration: underline; -} - -.btn-link:focus, .btn-link.focus { - text-decoration: underline; } .btn-link:disabled, .btn-link.disabled { color: #858796; - pointer-events: none; -} - -.btn-lg, .btn-group-lg > .btn { - padding: 0.5rem 1rem; - font-size: 1.25rem; - line-height: 1.5; - border-radius: 0.3rem; -} - -.btn-sm, .btn-group-sm > .btn { - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - line-height: 1.5; - border-radius: 0.2rem; -} - -.btn-block { - display: block; - width: 100%; -} - -.btn-block + .btn-block { - margin-top: 0.5rem; -} - -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} - -.fade { - transition: opacity 0.15s linear; -} - -@media (prefers-reduced-motion: reduce) { - .fade { - transition: none; - } -} - -.fade:not(.show) { - opacity: 0; -} - -.collapse:not(.show) { - display: none; } .collapsing { - position: relative; - height: 0; - overflow: hidden; transition: height 0.15s ease; } -@media (prefers-reduced-motion: reduce) { - .collapsing { - transition: none; - } -} - -.dropup, -.dropright, -.dropdown, -.dropleft { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; -} - -.dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid; - border-right: 0.3em solid transparent; - border-bottom: 0; - border-left: 0.3em solid transparent; -} - -.dropdown-toggle:empty::after { - margin-left: 0; -} - .dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 10rem; - padding: 0.5rem 0; - margin: 0.125rem 0 0; font-size: 0.85rem; color: #858796; - text-align: left; - list-style: none; - background-color: #fff; - background-clip: padding-box; border: 1px solid #e3e6f0; border-radius: 0.35rem; } -.dropdown-menu-left { - right: auto; - left: 0; -} - -.dropdown-menu-right { - right: 0; - left: auto; -} - -@media (min-width: 576px) { - .dropdown-menu-sm-left { - right: auto; - left: 0; - } - - .dropdown-menu-sm-right { - right: 0; - left: auto; - } -} - -@media (min-width: 768px) { - .dropdown-menu-md-left { - right: auto; - left: 0; - } - - .dropdown-menu-md-right { - right: 0; - left: auto; - } -} - -@media (min-width: 1100px) { - .dropdown-menu-lg-left { - right: auto; - left: 0; - } - - .dropdown-menu-lg-right { - right: 0; - left: auto; - } -} - -@media (min-width: 1400px) { - .dropdown-menu-xl-left { - right: auto; - left: 0; - } - - .dropdown-menu-xl-right { - right: 0; - left: auto; - } -} - -.dropup .dropdown-menu { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: 0.125rem; -} - -.dropup .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0; - border-right: 0.3em solid transparent; - border-bottom: 0.3em solid; - border-left: 0.3em solid transparent; -} - -.dropup .dropdown-toggle:empty::after { - margin-left: 0; -} - -.dropright .dropdown-menu { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: 0.125rem; -} - -.dropright .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid transparent; - border-right: 0; - border-bottom: 0.3em solid transparent; - border-left: 0.3em solid; -} - -.dropright .dropdown-toggle:empty::after { - margin-left: 0; -} - -.dropright .dropdown-toggle::after { - vertical-align: 0; -} - -.dropleft .dropdown-menu { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: 0.125rem; -} - -.dropleft .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; -} - -.dropleft .dropdown-toggle::after { - display: none; -} - -.dropleft .dropdown-toggle::before { - display: inline-block; - margin-right: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid transparent; - border-right: 0.3em solid; - border-bottom: 0.3em solid transparent; -} - -.dropleft .dropdown-toggle:empty::after { - margin-left: 0; -} - -.dropleft .dropdown-toggle::before { - vertical-align: 0; -} - -.dropdown-menu[x-placement^="top"], .dropdown-menu[x-placement^="right"], .dropdown-menu[x-placement^="bottom"], .dropdown-menu[x-placement^="left"] { - right: auto; - bottom: auto; -} - .dropdown-divider { - height: 0; - margin: 0.5rem 0; - overflow: hidden; border-top: 1px solid #eaecf4; } .dropdown-item { - display: block; - width: 100%; - padding: 0.25rem 1.5rem; - clear: both; - font-weight: 400; color: #3a3b45; - text-align: inherit; - white-space: nowrap; - background-color: transparent; - border: 0; } .dropdown-item:hover, .dropdown-item:focus { color: #2e2f37; - text-decoration: none; background-color: #f8f9fc; } .dropdown-item.active, .dropdown-item:active { - color: #fff; - text-decoration: none; background-color: #4e73df; } .dropdown-item.disabled, .dropdown-item:disabled { color: #858796; - pointer-events: none; - background-color: transparent; -} - -.dropdown-menu.show { - display: block; } .dropdown-header { - display: block; - padding: 0.5rem 1.5rem; - margin-bottom: 0; - font-size: 0.875rem; color: #858796; - white-space: nowrap; } .dropdown-item-text { - display: block; - padding: 0.25rem 1.5rem; color: #3a3b45; } -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; -} - -.btn-group > .btn, -.btn-group-vertical > .btn { - position: relative; - flex: 1 1 auto; -} - -.btn-group > .btn:hover, -.btn-group-vertical > .btn:hover { - z-index: 1; -} - -.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, -.btn-group-vertical > .btn:focus, -.btn-group-vertical > .btn:active, -.btn-group-vertical > .btn.active { - z-index: 1; -} - -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; -} - -.btn-toolbar .input-group { - width: auto; -} - -.btn-group > .btn:not(:first-child), -.btn-group > .btn-group:not(:first-child) { - margin-left: -1px; -} - -.btn-group > .btn:not(:last-child):not(.dropdown-toggle), -.btn-group > .btn-group:not(:last-child) > .btn { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.btn-group > .btn:not(:first-child), -.btn-group > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} - -.dropdown-toggle-split { - padding-right: 0.5625rem; - padding-left: 0.5625rem; -} - -.dropdown-toggle-split::after, -.dropup .dropdown-toggle-split::after, -.dropright .dropdown-toggle-split::after { - margin-left: 0; -} - -.dropleft .dropdown-toggle-split::before { - margin-right: 0; -} - -.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { - padding-right: 0.375rem; - padding-left: 0.375rem; -} - -.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { - padding-right: 0.75rem; - padding-left: 0.75rem; -} - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; -} - -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group { - width: 100%; -} - -.btn-group-vertical > .btn:not(:first-child), -.btn-group-vertical > .btn-group:not(:first-child) { - margin-top: -1px; -} - -.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), -.btn-group-vertical > .btn-group:not(:last-child) > .btn { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.btn-group-vertical > .btn:not(:first-child), -.btn-group-vertical > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.btn-group-toggle > .btn, -.btn-group-toggle > .btn-group > .btn { - margin-bottom: 0; -} - -.btn-group-toggle > .btn input[type="radio"], -.btn-group-toggle > .btn input[type="checkbox"], -.btn-group-toggle > .btn-group > .btn input[type="radio"], -.btn-group-toggle > .btn-group > .btn input[type="checkbox"] { - position: absolute; - clip: rect(0, 0, 0, 0); - pointer-events: none; -} - -.input-group { - position: relative; - display: flex; - flex-wrap: wrap; - align-items: stretch; - width: 100%; -} - -.input-group > .form-control, -.input-group > .form-control-plaintext, -.input-group > .custom-select, -.input-group > .custom-file { - position: relative; - flex: 1 1 auto; - width: 1%; - min-width: 0; - margin-bottom: 0; -} - -.input-group > .form-control + .form-control, -.input-group > .form-control + .custom-select, -.input-group > .form-control + .custom-file, -.input-group > .form-control-plaintext + .form-control, -.input-group > .form-control-plaintext + .custom-select, -.input-group > .form-control-plaintext + .custom-file, -.input-group > .custom-select + .form-control, -.input-group > .custom-select + .custom-select, -.input-group > .custom-select + .custom-file, -.input-group > .custom-file + .form-control, -.input-group > .custom-file + .custom-select, -.input-group > .custom-file + .custom-file { - margin-left: -1px; -} - -.input-group > .form-control:focus, -.input-group > .custom-select:focus, -.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label { - z-index: 3; -} - -.input-group > .custom-file .custom-file-input:focus { - z-index: 4; -} - -.input-group > .form-control:not(:last-child), -.input-group > .custom-select:not(:last-child) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.input-group > .form-control:not(:first-child), -.input-group > .custom-select:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} - -.input-group > .custom-file { - display: flex; - align-items: center; -} - -.input-group > .custom-file:not(:last-child) .custom-file-label, -.input-group > .custom-file:not(:last-child) .custom-file-label::after { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.input-group > .custom-file:not(:first-child) .custom-file-label { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} - -.input-group-prepend, -.input-group-append { - display: flex; -} - -.input-group-prepend .btn, -.input-group-append .btn { - position: relative; - z-index: 2; -} - -.input-group-prepend .btn:focus, -.input-group-append .btn:focus { - z-index: 3; -} - -.input-group-prepend .btn + .btn, -.input-group-prepend .btn + .input-group-text, -.input-group-prepend .input-group-text + .input-group-text, -.input-group-prepend .input-group-text + .btn, -.input-group-append .btn + .btn, -.input-group-append .btn + .input-group-text, -.input-group-append .input-group-text + .input-group-text, -.input-group-append .input-group-text + .btn { - margin-left: -1px; -} - -.input-group-prepend { - margin-right: -1px; -} - -.input-group-append { - margin-left: -1px; -} - .input-group-text { - display: flex; - align-items: center; - padding: 0.375rem 0.75rem; - margin-bottom: 0; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; color: #6e707e; - text-align: center; - white-space: nowrap; background-color: #eaecf4; border: 1px solid #d1d3e2; border-radius: 0.35rem; } -.input-group-text input[type="radio"], -.input-group-text input[type="checkbox"] { - margin-top: 0; -} - -.input-group-lg > .form-control:not(textarea), -.input-group-lg > .custom-select { - height: calc(1.5em + 1rem + 2px); -} - -.input-group-lg > .form-control, -.input-group-lg > .custom-select, -.input-group-lg > .input-group-prepend > .input-group-text, -.input-group-lg > .input-group-append > .input-group-text, -.input-group-lg > .input-group-prepend > .btn, -.input-group-lg > .input-group-append > .btn { - padding: 0.5rem 1rem; - font-size: 1.25rem; - line-height: 1.5; - border-radius: 0.3rem; -} - -.input-group-sm > .form-control:not(textarea), -.input-group-sm > .custom-select { - height: calc(1.5em + 0.5rem + 2px); -} - -.input-group-sm > .form-control, -.input-group-sm > .custom-select, -.input-group-sm > .input-group-prepend > .input-group-text, -.input-group-sm > .input-group-append > .input-group-text, -.input-group-sm > .input-group-prepend > .btn, -.input-group-sm > .input-group-append > .btn { - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - line-height: 1.5; - border-radius: 0.2rem; -} - -.input-group-lg > .custom-select, -.input-group-sm > .custom-select { - padding-right: 1.75rem; -} - -.input-group > .input-group-prepend > .btn, -.input-group > .input-group-prepend > .input-group-text, -.input-group > .input-group-append:not(:last-child) > .btn, -.input-group > .input-group-append:not(:last-child) > .input-group-text, -.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle), -.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.input-group > .input-group-append > .btn, -.input-group > .input-group-append > .input-group-text, -.input-group > .input-group-prepend:not(:first-child) > .btn, -.input-group > .input-group-prepend:not(:first-child) > .input-group-text, -.input-group > .input-group-prepend:first-child > .btn:not(:first-child), -.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} - -.custom-control { - position: relative; - z-index: 1; - display: block; - min-height: 1.5rem; - padding-left: 1.5rem; - -webkit-print-color-adjust: exact; - color-adjust: exact; -} - -.custom-control-inline { - display: inline-flex; - margin-right: 1rem; -} - -.custom-control-input { - position: absolute; - left: 0; - z-index: -1; - width: 1rem; - height: 1.25rem; - opacity: 0; -} - -.custom-control-input:checked ~ .custom-control-label::before { - color: #fff; - border-color: #4e73df; - background-color: #4e73df; -} - -.custom-control-input:focus ~ .custom-control-label::before { - box-shadow: 0 0 0 0.2rem rgba(78, 115, 223, 0.25); -} - -.custom-control-input:focus:not(:checked) ~ .custom-control-label::before { - border-color: #bac8f3; -} - -.custom-control-input:not(:disabled):active ~ .custom-control-label::before { - color: #fff; - background-color: #e5ebfa; - border-color: #e5ebfa; -} - -.custom-control-input[disabled] ~ .custom-control-label, .custom-control-input:disabled ~ .custom-control-label { - color: #858796; -} - -.custom-control-input[disabled] ~ .custom-control-label::before, .custom-control-input:disabled ~ .custom-control-label::before { - background-color: #eaecf4; -} - -.custom-control-label { - position: relative; - margin-bottom: 0; - vertical-align: top; -} - -.custom-control-label::before { - position: absolute; - top: 0.25rem; - left: -1.5rem; - display: block; - width: 1rem; - height: 1rem; - pointer-events: none; - content: ""; - background-color: #fff; - border: #b7b9cc solid 1px; -} - -.custom-control-label::after { - position: absolute; - top: 0.25rem; - left: -1.5rem; - display: block; - width: 1rem; - height: 1rem; - content: ""; - background: no-repeat 50% / 50% 50%; -} - -.custom-checkbox .custom-control-label::before { - border-radius: 0.35rem; -} - -.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e"); -} - -.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before { - border-color: #4e73df; - background-color: #4e73df; -} - -.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e"); -} - -.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before { - background-color: rgba(78, 115, 223, 0.5); -} - -.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before { - background-color: rgba(78, 115, 223, 0.5); -} - -.custom-radio .custom-control-label::before { - border-radius: 50%; -} - -.custom-radio .custom-control-input:checked ~ .custom-control-label::after { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); -} - -.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before { - background-color: rgba(78, 115, 223, 0.5); -} - -.custom-switch { - padding-left: 2.25rem; -} - -.custom-switch .custom-control-label::before { - left: -2.25rem; - width: 1.75rem; - pointer-events: all; - border-radius: 0.5rem; -} - -.custom-switch .custom-control-label::after { - top: calc(0.25rem + 2px); - left: calc(-2.25rem + 2px); - width: calc(1rem - 4px); - height: calc(1rem - 4px); - background-color: #b7b9cc; - border-radius: 0.5rem; - transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} - -@media (prefers-reduced-motion: reduce) { - .custom-switch .custom-control-label::after { - transition: none; - } -} - -.custom-switch .custom-control-input:checked ~ .custom-control-label::after { - background-color: #fff; - transform: translateX(0.75rem); -} - -.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before { - background-color: rgba(78, 115, 223, 0.5); -} - -.custom-select { - display: inline-block; - width: 100%; - height: calc(1.5em + 0.75rem + 2px); - padding: 0.375rem 1.75rem 0.375rem 0.75rem; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; +.form-select { color: #6e707e; - vertical-align: middle; background: #fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%235a5c69' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px; border: 1px solid #d1d3e2; border-radius: 0.35rem; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; } -.custom-select:focus { +.form-select:focus { border-color: #bac8f3; - outline: 0; box-shadow: 0 0 0 0.2rem rgba(78, 115, 223, 0.25); } -.custom-select:focus::-ms-value { +.form-select:focus::-ms-value { color: #6e707e; - background-color: #fff; } -.custom-select[multiple], .custom-select[size]:not([size="1"]) { - height: auto; - padding-right: 0.75rem; - background-image: none; -} - -.custom-select:disabled { +.form-select:disabled { color: #858796; background-color: #eaecf4; } -.custom-select::-ms-expand { - display: none; -} - -.custom-select:-moz-focusring { - color: transparent; +.form-select:-moz-focusring { text-shadow: 0 0 0 #6e707e; } -.custom-select-sm { - height: calc(1.5em + 0.5rem + 2px); - padding-top: 0.25rem; - padding-bottom: 0.25rem; - padding-left: 0.5rem; - font-size: 0.875rem; -} - -.custom-select-lg { - height: calc(1.5em + 1rem + 2px); - padding-top: 0.5rem; - padding-bottom: 0.5rem; - padding-left: 1rem; - font-size: 1.25rem; -} - -.custom-file { - position: relative; - display: inline-block; - width: 100%; - height: calc(1.5em + 0.75rem + 2px); - margin-bottom: 0; -} - -.custom-file-input { - position: relative; - z-index: 2; - width: 100%; - height: calc(1.5em + 0.75rem + 2px); - margin: 0; - opacity: 0; -} - .custom-file-input:focus ~ .custom-file-label { border-color: #bac8f3; box-shadow: 0 0 0 0.2rem rgba(78, 115, 223, 0.25); @@ -3817,61 +1118,18 @@ input[type="button"].btn-block { background-color: #eaecf4; } -.custom-file-input:lang(en) ~ .custom-file-label::after { - content: "Browse"; -} - -.custom-file-input ~ .custom-file-label[data-browse]::after { - content: attr(data-browse); -} - .custom-file-label { - position: absolute; - top: 0; - right: 0; - left: 0; - z-index: 1; - height: calc(1.5em + 0.75rem + 2px); - padding: 0.375rem 0.75rem; - font-weight: 400; - line-height: 1.5; color: #6e707e; - background-color: #fff; border: 1px solid #d1d3e2; border-radius: 0.35rem; } .custom-file-label::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - z-index: 3; - display: block; - height: calc(1.5em + 0.75rem); - padding: 0.375rem 0.75rem; - line-height: 1.5; color: #6e707e; - content: "Browse"; background-color: #eaecf4; - border-left: inherit; border-radius: 0 0.35rem 0.35rem 0; } -.custom-range { - width: 100%; - height: 1.4rem; - padding: 0; - background-color: transparent; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; -} - -.custom-range:focus { - outline: none; -} - .custom-range:focus::-webkit-slider-thumb { box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(78, 115, 223, 0.25); } @@ -3884,28 +1142,8 @@ input[type="button"].btn-block { box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(78, 115, 223, 0.25); } -.custom-range::-moz-focus-outer { - border: 0; -} - .custom-range::-webkit-slider-thumb { - width: 1rem; - height: 1rem; - margin-top: -0.25rem; background-color: #4e73df; - border: 0; - border-radius: 1rem; - -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - -webkit-appearance: none; - appearance: none; -} - -@media (prefers-reduced-motion: reduce) { - .custom-range::-webkit-slider-thumb { - -webkit-transition: none; - transition: none; - } } .custom-range::-webkit-slider-thumb:active { @@ -3913,32 +1151,11 @@ input[type="button"].btn-block { } .custom-range::-webkit-slider-runnable-track { - width: 100%; - height: 0.5rem; - color: transparent; - cursor: pointer; background-color: #dddfeb; - border-color: transparent; - border-radius: 1rem; } .custom-range::-moz-range-thumb { - width: 1rem; - height: 1rem; background-color: #4e73df; - border: 0; - border-radius: 1rem; - -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - -moz-appearance: none; - appearance: none; -} - -@media (prefers-reduced-motion: reduce) { - .custom-range::-moz-range-thumb { - -moz-transition: none; - transition: none; - } } .custom-range::-moz-range-thumb:active { @@ -3946,128 +1163,46 @@ input[type="button"].btn-block { } .custom-range::-moz-range-track { - width: 100%; - height: 0.5rem; - color: transparent; - cursor: pointer; background-color: #dddfeb; - border-color: transparent; - border-radius: 1rem; } .custom-range::-ms-thumb { - width: 1rem; - height: 1rem; - margin-top: 0; - margin-right: 0.2rem; - margin-left: 0.2rem; background-color: #4e73df; - border: 0; - border-radius: 1rem; - -ms-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - appearance: none; -} - -@media (prefers-reduced-motion: reduce) { - .custom-range::-ms-thumb { - -ms-transition: none; - transition: none; - } } .custom-range::-ms-thumb:active { background-color: #e5ebfa; } -.custom-range::-ms-track { - width: 100%; - height: 0.5rem; - color: transparent; - cursor: pointer; - background-color: transparent; - border-color: transparent; - border-width: 0.5rem; -} - .custom-range::-ms-fill-lower { background-color: #dddfeb; - border-radius: 1rem; } .custom-range::-ms-fill-upper { - margin-right: 15px; background-color: #dddfeb; - border-radius: 1rem; } .custom-range:disabled::-webkit-slider-thumb { background-color: #b7b9cc; } -.custom-range:disabled::-webkit-slider-runnable-track { - cursor: default; -} - .custom-range:disabled::-moz-range-thumb { background-color: #b7b9cc; } -.custom-range:disabled::-moz-range-track { - cursor: default; -} - .custom-range:disabled::-ms-thumb { background-color: #b7b9cc; } -.custom-control-label::before, -.custom-file-label, -.custom-select { - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} - -@media (prefers-reduced-motion: reduce) { - .custom-control-label::before, - .custom-file-label, - .custom-select { - transition: none; - } -} - -.nav { - display: flex; - flex-wrap: wrap; - padding-left: 0; - margin-bottom: 0; - list-style: none; -} - -.nav-link { - display: block; - padding: 0.5rem 1rem; -} - -.nav-link:hover, .nav-link:focus { - text-decoration: none; -} - .nav-link.disabled { color: #858796; - pointer-events: none; - cursor: default; } .nav-tabs { border-bottom: 1px solid #dddfeb; } -.nav-tabs .nav-item { - margin-bottom: -1px; -} - .nav-tabs .nav-link { - border: 1px solid transparent; border-top-left-radius: 0.35rem; border-top-right-radius: 0.35rem; } @@ -4078,496 +1213,38 @@ input[type="button"].btn-block { .nav-tabs .nav-link.disabled { color: #858796; - background-color: transparent; - border-color: transparent; } .nav-tabs .nav-link.active, .nav-tabs .nav-item.show .nav-link { color: #6e707e; - background-color: #fff; border-color: #dddfeb #dddfeb #fff; } -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-left-radius: 0; - border-top-right-radius: 0; -} - .nav-pills .nav-link { border-radius: 0.35rem; } -.nav-pills .nav-link.active, -.nav-pills .show > .nav-link { - color: #fff; -} - -.nav-fill > .nav-link, -.nav-fill .nav-item { - flex: 1 1 auto; - text-align: center; -} - -.nav-justified > .nav-link, -.nav-justified .nav-item { - flex-basis: 0; - flex-grow: 1; - text-align: center; -} - -.tab-content > .tab-pane { - display: none; -} - -.tab-content > .active { - display: block; -} - -.navbar { - position: relative; - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: space-between; - padding: 0.5rem 1rem; -} - -.navbar .container, -.navbar .container-fluid, .navbar .container-sm, .navbar .container-md, .navbar .container-lg, .navbar .container-xl { - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: space-between; -} - -.navbar-brand { - display: inline-block; - padding-top: 0.3125rem; - padding-bottom: 0.3125rem; - margin-right: 1rem; - font-size: 1.25rem; - line-height: inherit; - white-space: nowrap; -} - -.navbar-brand:hover, .navbar-brand:focus { - text-decoration: none; -} - -.navbar-nav { - display: flex; - flex-direction: column; - padding-left: 0; - margin-bottom: 0; - list-style: none; -} - -.navbar-nav .nav-link { - padding-right: 0; - padding-left: 0; -} - -.navbar-nav .dropdown-menu { - position: static; - float: none; -} - -.navbar-text { - display: inline-block; - padding-top: 0.5rem; - padding-bottom: 0.5rem; -} - -.navbar-collapse { - flex-basis: 100%; - flex-grow: 1; - align-items: center; -} - .navbar-toggler { - padding: 0.25rem 0.75rem; - font-size: 1.25rem; - line-height: 1; - background-color: transparent; - border: 1px solid transparent; border-radius: 0.35rem; } -.navbar-toggler:hover, .navbar-toggler:focus { - text-decoration: none; -} - -.navbar-toggler-icon { - display: inline-block; - width: 1.5em; - height: 1.5em; - vertical-align: middle; - content: ""; - background: no-repeat center center; - background-size: 100% 100%; -} - -@media (max-width: 575.98px) { - .navbar-expand-sm > .container, - .navbar-expand-sm > .container-fluid, .navbar-expand-sm > .container-sm, .navbar-expand-sm > .container-md, .navbar-expand-sm > .container-lg, .navbar-expand-sm > .container-xl { - padding-right: 0; - padding-left: 0; - } -} - -@media (min-width: 576px) { - .navbar-expand-sm { - flex-flow: row nowrap; - justify-content: flex-start; - } - .navbar-expand-sm .navbar-nav { - flex-direction: row; - } - .navbar-expand-sm .navbar-nav .dropdown-menu { - position: absolute; - } - - .navbar-expand-sm .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; - } - - .navbar-expand-sm > .container, - .navbar-expand-sm > .container-fluid, .navbar-expand-sm > .container-sm, .navbar-expand-sm > .container-md, .navbar-expand-sm > .container-lg, .navbar-expand-sm > .container-xl { - flex-wrap: nowrap; - } - - .navbar-expand-sm .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .navbar-expand-sm .navbar-toggler { - display: none; - } -} - -@media (max-width: 767.98px) { - .navbar-expand-md > .container, - .navbar-expand-md > .container-fluid, .navbar-expand-md > .container-sm, .navbar-expand-md > .container-md, .navbar-expand-md > .container-lg, .navbar-expand-md > .container-xl { - padding-right: 0; - padding-left: 0; - } -} - -@media (min-width: 768px) { - .navbar-expand-md { - flex-flow: row nowrap; - justify-content: flex-start; - } - .navbar-expand-md .navbar-nav { - flex-direction: row; - } - .navbar-expand-md .navbar-nav .dropdown-menu { - position: absolute; - } - - .navbar-expand-md .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; - } - - .navbar-expand-md > .container, - .navbar-expand-md > .container-fluid, .navbar-expand-md > .container-sm, .navbar-expand-md > .container-md, .navbar-expand-md > .container-lg, .navbar-expand-md > .container-xl { - flex-wrap: nowrap; - } - - .navbar-expand-md .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .navbar-expand-md .navbar-toggler { - display: none; - } -} - -@media (max-width: 991.98px) { - .navbar-expand-lg > .container, - .navbar-expand-lg > .container-fluid, .navbar-expand-lg > .container-sm, .navbar-expand-lg > .container-md, .navbar-expand-lg > .container-lg, .navbar-expand-lg > .container-xl { - padding-right: 0; - padding-left: 0; - } -} - -@media (min-width: 1100px) { - .navbar-expand-lg { - flex-flow: row nowrap; - justify-content: flex-start; - } - .navbar-expand-lg .navbar-nav { - flex-direction: row; - } - .navbar-expand-lg .navbar-nav .dropdown-menu { - position: absolute; - } - - .navbar-expand-lg .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; - } - - .navbar-expand-lg > .container, - .navbar-expand-lg > .container-fluid, .navbar-expand-lg > .container-sm, .navbar-expand-lg > .container-md, .navbar-expand-lg > .container-lg, .navbar-expand-lg > .container-xl { - flex-wrap: nowrap; - } - - .navbar-expand-lg .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .navbar-expand-lg .navbar-toggler { - display: none; - } -} - -@media (max-width: 1199.98px) { - .navbar-expand-xl > .container, - .navbar-expand-xl > .container-fluid, .navbar-expand-xl > .container-sm, .navbar-expand-xl > .container-md, .navbar-expand-xl > .container-lg, .navbar-expand-xl > .container-xl { - padding-right: 0; - padding-left: 0; - } -} - -@media (min-width: 1400px) { - .navbar-expand-xl { - flex-flow: row nowrap; - justify-content: flex-start; - } - .navbar-expand-xl .navbar-nav { - flex-direction: row; - } - .navbar-expand-xl .navbar-nav .dropdown-menu { - position: absolute; - } - - .navbar-expand-xl .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; - } - - .navbar-expand-xl > .container, - .navbar-expand-xl > .container-fluid, .navbar-expand-xl > .container-sm, .navbar-expand-xl > .container-md, .navbar-expand-xl > .container-lg, .navbar-expand-xl > .container-xl { - flex-wrap: nowrap; - } - - .navbar-expand-xl .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .navbar-expand-xl .navbar-toggler { - display: none; - } -} - -.navbar-expand { - flex-flow: row nowrap; - justify-content: flex-start; -} - -.navbar-expand > .container, -.navbar-expand > .container-fluid, .navbar-expand > .container-sm, .navbar-expand > .container-md, .navbar-expand > .container-lg, .navbar-expand > .container-xl { - padding-right: 0; - padding-left: 0; -} - -.navbar-expand .navbar-nav { - flex-direction: row; -} - -.navbar-expand .navbar-nav .dropdown-menu { - position: absolute; -} - -.navbar-expand .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; -} - -.navbar-expand > .container, -.navbar-expand > .container-fluid, .navbar-expand > .container-sm, .navbar-expand > .container-md, .navbar-expand > .container-lg, .navbar-expand > .container-xl { - flex-wrap: nowrap; -} - -.navbar-expand .navbar-collapse { - display: flex !important; - flex-basis: auto; -} - -.navbar-expand .navbar-toggler { - display: none; -} - -.navbar-light .navbar-brand { - color: rgba(0, 0, 0, 0.9); -} - -.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus { - color: rgba(0, 0, 0, 0.9); -} - -.navbar-light .navbar-nav .nav-link { - color: rgba(0, 0, 0, 0.5); -} - -.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus { - color: rgba(0, 0, 0, 0.7); -} - -.navbar-light .navbar-nav .nav-link.disabled { - color: rgba(0, 0, 0, 0.3); -} - -.navbar-light .navbar-nav .show > .nav-link, -.navbar-light .navbar-nav .active > .nav-link, -.navbar-light .navbar-nav .nav-link.show, -.navbar-light .navbar-nav .nav-link.active { - color: rgba(0, 0, 0, 0.9); -} - -.navbar-light .navbar-toggler { - color: rgba(0, 0, 0, 0.5); - border-color: rgba(0, 0, 0, 0.1); -} - -.navbar-light .navbar-toggler-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); -} - -.navbar-light .navbar-text { - color: rgba(0, 0, 0, 0.5); -} - -.navbar-light .navbar-text a { - color: rgba(0, 0, 0, 0.9); -} - -.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus { - color: rgba(0, 0, 0, 0.9); -} - -.navbar-dark .navbar-brand { - color: #fff; -} - -.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus { - color: #fff; -} - -.navbar-dark .navbar-nav .nav-link { - color: rgba(255, 255, 255, 0.5); -} - -.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus { - color: rgba(255, 255, 255, 0.75); -} - -.navbar-dark .navbar-nav .nav-link.disabled { - color: rgba(255, 255, 255, 0.25); -} - -.navbar-dark .navbar-nav .show > .nav-link, -.navbar-dark .navbar-nav .active > .nav-link, -.navbar-dark .navbar-nav .nav-link.show, -.navbar-dark .navbar-nav .nav-link.active { - color: #fff; -} - -.navbar-dark .navbar-toggler { - color: rgba(255, 255, 255, 0.5); - border-color: rgba(255, 255, 255, 0.1); -} - -.navbar-dark .navbar-toggler-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); -} - -.navbar-dark .navbar-text { - color: rgba(255, 255, 255, 0.5); -} - -.navbar-dark .navbar-text a { - color: #fff; -} - -.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus { - color: #fff; -} - .card { - position: relative; - display: flex; - flex-direction: column; - min-width: 0; - word-wrap: break-word; - background-color: #fff; - background-clip: border-box; border: 1px solid #e3e6f0; border-radius: 0.35rem; } -.card > hr { - margin-right: 0; - margin-left: 0; -} - -.card > .list-group { - border-top: inherit; - border-bottom: inherit; -} - .card > .list-group:first-child { - border-top-width: 0; border-top-left-radius: calc(0.35rem - 1px); border-top-right-radius: calc(0.35rem - 1px); } .card > .list-group:last-child { - border-bottom-width: 0; border-bottom-right-radius: calc(0.35rem - 1px); border-bottom-left-radius: calc(0.35rem - 1px); } -.card > .card-header + .list-group, -.card > .list-group + .card-footer { - border-top: 0; -} - -.card-body { - flex: 1 1 auto; - min-height: 1px; - padding: 1.25rem; -} - -.card-title { - margin-bottom: 0.75rem; -} - -.card-subtitle { - margin-top: -0.375rem; - margin-bottom: 0; -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link:hover { - text-decoration: none; -} - -.card-link + .card-link { - margin-left: 1.25rem; -} - .card-header { - padding: 0.75rem 1.25rem; - margin-bottom: 0; background-color: #f8f9fc; border-bottom: 1px solid #e3e6f0; } @@ -4577,7 +1254,6 @@ input[type="button"].btn-block { } .card-footer { - padding: 0.75rem 1.25rem; background-color: #f8f9fc; border-top: 1px solid #e3e6f0; } @@ -4586,35 +1262,10 @@ input[type="button"].btn-block { border-radius: 0 0 calc(0.35rem - 1px) calc(0.35rem - 1px); } -.card-header-tabs { - margin-right: -0.625rem; - margin-bottom: -0.75rem; - margin-left: -0.625rem; - border-bottom: 0; -} - -.card-header-pills { - margin-right: -0.625rem; - margin-left: -0.625rem; -} - .card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: 1.25rem; border-radius: calc(0.35rem - 1px); } -.card-img, -.card-img-top, -.card-img-bottom { - flex-shrink: 0; - width: 100%; -} - .card-img, .card-img-top { border-top-left-radius: calc(0.35rem - 1px); @@ -4627,138 +1278,10 @@ input[type="button"].btn-block { border-bottom-left-radius: calc(0.35rem - 1px); } -.card-deck .card { - margin-bottom: 0.75rem; -} - -@media (min-width: 576px) { - .card-deck { - display: flex; - flex-flow: row wrap; - margin-right: -0.75rem; - margin-left: -0.75rem; - } - .card-deck .card { - flex: 1 0 0%; - margin-right: 0.75rem; - margin-bottom: 0; - margin-left: 0.75rem; - } -} - .card-group > .card { margin-bottom: 0.75rem; } -@media (min-width: 576px) { - .card-group { - display: flex; - flex-flow: row wrap; - } - .card-group > .card { - flex: 1 0 0%; - margin-bottom: 0; - } - - .card-group > .card + .card { - margin-left: 0; - border-left: 0; - } - - .card-group > .card:not(:last-child) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; - } - - .card-group > .card:not(:last-child) .card-img-top, - .card-group > .card:not(:last-child) .card-header { - border-top-right-radius: 0; - } - - .card-group > .card:not(:last-child) .card-img-bottom, - .card-group > .card:not(:last-child) .card-footer { - border-bottom-right-radius: 0; - } - - .card-group > .card:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; - } - - .card-group > .card:not(:first-child) .card-img-top, - .card-group > .card:not(:first-child) .card-header { - border-top-left-radius: 0; - } - - .card-group > .card:not(:first-child) .card-img-bottom, - .card-group > .card:not(:first-child) .card-footer { - border-bottom-left-radius: 0; - } -} - -.card-columns .card { - margin-bottom: 0.75rem; - -webkit-backface-visibility: hidden; -} - -@media (min-width: 576px) { - .card-columns { - -webkit-column-count: 3; - column-count: 3; - -webkit-column-gap: 1.25rem; - column-gap: 1.25rem; - orphans: 1; - widows: 1; - } - - .card-columns .card { - display: inline-block; - width: 100%; - } -} - -.accordion { - overflow-anchor: none; -} - -.accordion > .card { - overflow: hidden; -} - -.accordion > .card:not(:last-of-type) { - border-bottom: 0; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.accordion > .card:not(:first-of-type) { - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.accordion > .card > .card-header { - border-radius: 0; - margin-bottom: -1px; -} - -.breadcrumb { - display: flex; - flex-wrap: wrap; - padding: 0.75rem 1rem; - margin-bottom: 1rem; - list-style: none; - background-color: #eaecf4; - border-radius: 0.35rem; -} - -.breadcrumb-item { - display: flex; -} - -.breadcrumb-item + .breadcrumb-item { - padding-left: 0.5rem; -} - .breadcrumb-item + .breadcrumb-item::before { display: inline-block; padding-right: 0.5rem; @@ -4766,52 +1289,30 @@ input[type="button"].btn-block { content: "/"; } -.breadcrumb-item + .breadcrumb-item:hover::before { - text-decoration: underline; -} - -.breadcrumb-item + .breadcrumb-item:hover::before { - text-decoration: none; -} - .breadcrumb-item.active { color: #858796; } .pagination { - display: flex; - padding-left: 0; - list-style: none; border-radius: 0.35rem; } .page-link { - position: relative; - display: block; - padding: 0.5rem 0.75rem; - margin-left: -1px; - line-height: 1.25; color: #4e73df; - background-color: #fff; border: 1px solid #dddfeb; } .page-link:hover { - z-index: 2; color: #224abe; - text-decoration: none; background-color: #eaecf4; border-color: #dddfeb; } .page-link:focus { - z-index: 3; - outline: 0; box-shadow: 0 0 0 0.2rem rgba(78, 115, 223, 0.25); } .page-item:first-child .page-link { - margin-left: 0; border-top-left-radius: 0.35rem; border-bottom-left-radius: 0.35rem; } @@ -4821,259 +1322,19 @@ input[type="button"].btn-block { border-bottom-right-radius: 0.35rem; } -.page-item.active .page-link { - z-index: 3; - color: #fff; - background-color: #368F17; - border-color: #368F17; -} - .page-item.disabled .page-link { color: #858796; - pointer-events: none; - cursor: auto; - background-color: #fff; border-color: #dddfeb; } -.pagination-lg .page-link { - padding: 0.75rem 1.5rem; - font-size: 1.25rem; - line-height: 1.5; -} - -.pagination-lg .page-item:first-child .page-link { - border-top-left-radius: 0.3rem; - border-bottom-left-radius: 0.3rem; -} - -.pagination-lg .page-item:last-child .page-link { - border-top-right-radius: 0.3rem; - border-bottom-right-radius: 0.3rem; -} - -.pagination-sm .page-link { - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - line-height: 1.5; -} - -.pagination-sm .page-item:first-child .page-link { - border-top-left-radius: 0.2rem; - border-bottom-left-radius: 0.2rem; -} - -.pagination-sm .page-item:last-child .page-link { - border-top-right-radius: 0.2rem; - border-bottom-right-radius: 0.2rem; -} - .badge { - display: inline-block; - padding: 0.25em 0.4em; - font-size: 75%; - font-weight: 700; - line-height: 1; - text-align: center; - white-space: nowrap; - vertical-align: baseline; border-radius: 0.35rem; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} - -@media (prefers-reduced-motion: reduce) { - .badge { - transition: none; - } -} - -a.badge:hover, a.badge:focus { - text-decoration: none; -} - -.badge:empty { - display: none; -} - -.btn .badge { - position: relative; - top: -1px; -} - -.badge-pill { - padding-right: 0.6em; - padding-left: 0.6em; - border-radius: 10rem; -} - -.badge-primary { - color: #fff; - background-color: #4e73df; -} - -a.badge-primary:hover, a.badge-primary:focus { - color: #fff; - background-color: #2653d4; -} - -a.badge-primary:focus, a.badge-primary.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(78, 115, 223, 0.5); -} - -.badge-secondary { - color: #fff; - background-color: #858796; -} - -a.badge-secondary:hover, a.badge-secondary:focus { - color: #fff; - background-color: #6b6d7d; -} - -a.badge-secondary:focus, a.badge-secondary.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(133, 135, 150, 0.5); -} - -.badge-success { - color: #fff; - background-color: #1cc88a; -} - -a.badge-success:hover, a.badge-success:focus { - color: #fff; - background-color: #169b6b; -} - -a.badge-success:focus, a.badge-success.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(28, 200, 138, 0.5); -} - -.badge-info { - color: #fff; - background-color: #36b9cc; -} - -a.badge-info:hover, a.badge-info:focus { - color: #fff; - background-color: #2a96a5; -} - -a.badge-info:focus, a.badge-info.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(54, 185, 204, 0.5); -} - -.badge-warning { - color: #fff; - background-color: #f6c23e; -} - -a.badge-warning:hover, a.badge-warning:focus { - color: #fff; - background-color: #f4b30d; -} - -a.badge-warning:focus, a.badge-warning.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(246, 194, 62, 0.5); -} - -.badge-danger { - color: #fff; - background-color: #e74a3b; -} - -a.badge-danger:hover, a.badge-danger:focus { - color: #fff; - background-color: #d52a1a; -} - -a.badge-danger:focus, a.badge-danger.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(231, 74, 59, 0.5); -} - -.badge-light { - color: #3a3b45; - background-color: #f8f9fc; -} - -a.badge-light:hover, a.badge-light:focus { - color: #3a3b45; - background-color: #d4daed; -} - -a.badge-light:focus, a.badge-light.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(248, 249, 252, 0.5); -} - -.badge-dark { - color: #fff; - background-color: #5a5c69; -} - -a.badge-dark:hover, a.badge-dark:focus { - color: #fff; - background-color: #42444e; -} - -a.badge-dark:focus, a.badge-dark.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(90, 92, 105, 0.5); -} - -.jumbotron { - padding: 2rem 1rem; - margin-bottom: 2rem; - background-color: #eaecf4; - border-radius: 0.3rem; -} - -@media (min-width: 576px) { - .jumbotron { - padding: 4rem 2rem; - } -} - -.jumbotron-fluid { - padding-right: 0; - padding-left: 0; - border-radius: 0; } .alert { - position: relative; - padding: 0.75rem 1.25rem; - margin-bottom: 1rem; - border: 1px solid transparent; border-radius: 0.35rem; } -.alert-heading { - color: inherit; -} - -.alert-link { - font-weight: 700; -} - -.alert-dismissible { - padding-right: 4rem; -} - -.alert-dismissible .close { - position: absolute; - top: 0; - right: 0; - z-index: 2; - padding: 0.75rem 1.25rem; - color: inherit; -} - .alert-primary { color: #293c74; background-color: #dce3f9; @@ -5160,12 +1421,6 @@ a.badge-dark:focus, a.badge-dark.focus { .alert-light { color: #818183; - background-color: #fefefe; - border-color: #fdfdfe; -} - -.alert-light hr { - border-top-color: #ececf6; } .alert-light .alert-link { @@ -5186,96 +1441,25 @@ a.badge-dark:focus, a.badge-dark.focus { color: #18181c; } -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 1rem 0; - } - to { - background-position: 0 0; - } -} - -@keyframes progress-bar-stripes { - from { - background-position: 1rem 0; - } - to { - background-position: 0 0; - } -} - .progress { - display: flex; - height: 1rem; - overflow: hidden; - line-height: 0; - font-size: 0.75rem; background-color: #eaecf4; border-radius: 0.35rem; } .progress-bar { - display: flex; - flex-direction: column; - justify-content: center; - overflow: hidden; - color: #fff; - text-align: center; - white-space: nowrap; background-color: #4e73df; - transition: width 0.6s ease; -} - -@media (prefers-reduced-motion: reduce) { - .progress-bar { - transition: none; - } -} - -.progress-bar-striped { - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-size: 1rem 1rem; -} - -.progress-bar-animated { - -webkit-animation: progress-bar-stripes 1s linear infinite; - animation: progress-bar-stripes 1s linear infinite; -} - -@media (prefers-reduced-motion: reduce) { - .progress-bar-animated { - -webkit-animation: none; - animation: none; - } -} - -.media { - display: flex; - align-items: flex-start; -} - -.media-body { - flex: 1; } .list-group { - display: flex; - flex-direction: column; - padding-left: 0; - margin-bottom: 0; border-radius: 0.35rem; } .list-group-item-action { - width: 100%; color: #6e707e; - text-align: inherit; } .list-group-item-action:hover, .list-group-item-action:focus { - z-index: 1; color: #6e707e; - text-decoration: none; background-color: #f8f9fc; } @@ -5284,204 +1468,61 @@ a.badge-dark:focus, a.badge-dark.focus { background-color: #eaecf4; } -.list-group-item { - position: relative; - display: block; - padding: 0.75rem 1.25rem; - background-color: #fff; - border: 1px solid rgba(0, 0, 0, 0.125); -} - -.list-group-item:first-child { - border-top-left-radius: inherit; - border-top-right-radius: inherit; -} - -.list-group-item:last-child { - border-bottom-right-radius: inherit; - border-bottom-left-radius: inherit; -} - .list-group-item.disabled, .list-group-item:disabled { color: #858796; - pointer-events: none; - background-color: #fff; } .list-group-item.active { - z-index: 2; - color: #fff; background-color: #4e73df; border-color: #4e73df; } -.list-group-item + .list-group-item { - border-top-width: 0; -} - -.list-group-item + .list-group-item.active { - margin-top: -1px; - border-top-width: 1px; -} - -.list-group-horizontal { - flex-direction: row; -} - .list-group-horizontal > .list-group-item:first-child { border-bottom-left-radius: 0.35rem; - border-top-right-radius: 0; } .list-group-horizontal > .list-group-item:last-child { border-top-right-radius: 0.35rem; - border-bottom-left-radius: 0; -} - -.list-group-horizontal > .list-group-item.active { - margin-top: 0; -} - -.list-group-horizontal > .list-group-item + .list-group-item { - border-top-width: 1px; - border-left-width: 0; -} - -.list-group-horizontal > .list-group-item + .list-group-item.active { - margin-left: -1px; - border-left-width: 1px; } @media (min-width: 576px) { - .list-group-horizontal-sm { - flex-direction: row; - } - .list-group-horizontal-sm > .list-group-item:first-child { border-bottom-left-radius: 0.35rem; - border-top-right-radius: 0; } .list-group-horizontal-sm > .list-group-item:last-child { border-top-right-radius: 0.35rem; - border-bottom-left-radius: 0; - } - - .list-group-horizontal-sm > .list-group-item.active { - margin-top: 0; - } - - .list-group-horizontal-sm > .list-group-item + .list-group-item { - border-top-width: 1px; - border-left-width: 0; - } - - .list-group-horizontal-sm > .list-group-item + .list-group-item.active { - margin-left: -1px; - border-left-width: 1px; } } @media (min-width: 768px) { - .list-group-horizontal-md { - flex-direction: row; - } - .list-group-horizontal-md > .list-group-item:first-child { border-bottom-left-radius: 0.35rem; - border-top-right-radius: 0; } .list-group-horizontal-md > .list-group-item:last-child { border-top-right-radius: 0.35rem; - border-bottom-left-radius: 0; - } - - .list-group-horizontal-md > .list-group-item.active { - margin-top: 0; - } - - .list-group-horizontal-md > .list-group-item + .list-group-item { - border-top-width: 1px; - border-left-width: 0; - } - - .list-group-horizontal-md > .list-group-item + .list-group-item.active { - margin-left: -1px; - border-left-width: 1px; } } -@media (min-width: 1100px) { - .list-group-horizontal-lg { - flex-direction: row; - } - +@media (min-width: 992px) { .list-group-horizontal-lg > .list-group-item:first-child { border-bottom-left-radius: 0.35rem; - border-top-right-radius: 0; } .list-group-horizontal-lg > .list-group-item:last-child { border-top-right-radius: 0.35rem; - border-bottom-left-radius: 0; - } - - .list-group-horizontal-lg > .list-group-item.active { - margin-top: 0; - } - - .list-group-horizontal-lg > .list-group-item + .list-group-item { - border-top-width: 1px; - border-left-width: 0; - } - - .list-group-horizontal-lg > .list-group-item + .list-group-item.active { - margin-left: -1px; - border-left-width: 1px; } } -@media (min-width: 1400px) { - .list-group-horizontal-xl { - flex-direction: row; - } - +@media (min-width: 1200px) { .list-group-horizontal-xl > .list-group-item:first-child { border-bottom-left-radius: 0.35rem; - border-top-right-radius: 0; } .list-group-horizontal-xl > .list-group-item:last-child { border-top-right-radius: 0.35rem; - border-bottom-left-radius: 0; } - - .list-group-horizontal-xl > .list-group-item.active { - margin-top: 0; - } - - .list-group-horizontal-xl > .list-group-item + .list-group-item { - border-top-width: 1px; - border-left-width: 0; - } - - .list-group-horizontal-xl > .list-group-item + .list-group-item.active { - margin-left: -1px; - border-left-width: 1px; - } -} - -.list-group-flush { - border-radius: 0; -} - -.list-group-flush > .list-group-item { - border-width: 0 0 1px; -} - -.list-group-flush > .list-group-item:last-child { - border-bottom-width: 0; } .list-group-item-primary { @@ -5495,7 +1536,6 @@ a.badge-dark:focus, a.badge-dark.focus { } .list-group-item-primary.list-group-item-action.active { - color: #fff; background-color: #293c74; border-color: #293c74; } @@ -5511,7 +1551,6 @@ a.badge-dark:focus, a.badge-dark.focus { } .list-group-item-secondary.list-group-item-action.active { - color: #fff; background-color: #45464e; border-color: #45464e; } @@ -5527,7 +1566,6 @@ a.badge-dark:focus, a.badge-dark.focus { } .list-group-item-success.list-group-item-action.active { - color: #fff; background-color: #0f6848; border-color: #0f6848; } @@ -5543,7 +1581,6 @@ a.badge-dark:focus, a.badge-dark.focus { } .list-group-item-info.list-group-item-action.active { - color: #fff; background-color: #1c606a; border-color: #1c606a; } @@ -5559,7 +1596,6 @@ a.badge-dark:focus, a.badge-dark.focus { } .list-group-item-warning.list-group-item-action.active { - color: #fff; background-color: #806520; border-color: #806520; } @@ -5575,7 +1611,6 @@ a.badge-dark:focus, a.badge-dark.focus { } .list-group-item-danger.list-group-item-action.active { - color: #fff; background-color: #78261f; border-color: #78261f; } @@ -5591,7 +1626,6 @@ a.badge-dark:focus, a.badge-dark.focus { } .list-group-item-light.list-group-item-action.active { - color: #fff; background-color: #818183; border-color: #818183; } @@ -5607,939 +1641,58 @@ a.badge-dark:focus, a.badge-dark.focus { } .list-group-item-dark.list-group-item-action.active { - color: #fff; background-color: #2f3037; border-color: #2f3037; } -.close { - float: right; - font-size: 1.5rem; - font-weight: 700; - line-height: 1; - color: #000; - text-shadow: 0 1px 0 #fff; - opacity: .5; -} - -.close:hover { - color: #000; - text-decoration: none; -} - -.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus { - opacity: .75; -} - -button.close { - padding: 0; - background-color: transparent; - border: 0; -} - -a.close.disabled { - pointer-events: none; -} - -.toast { - flex-basis: 350px; - max-width: 350px; - font-size: 0.875rem; - background-color: rgba(255, 255, 255, 0.85); - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.1); - box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1); - opacity: 0; - border-radius: 0.25rem; -} - -.toast:not(:last-child) { - margin-bottom: 0.75rem; -} - -.toast.showing { - opacity: 1; -} - -.toast.show { - display: block; - opacity: 1; -} - -.toast.hide { - display: none; -} - .toast-header { - display: flex; - align-items: center; - padding: 0.25rem 0.75rem; color: #858796; - background-color: rgba(255, 255, 255, 0.85); - background-clip: padding-box; - border-bottom: 1px solid rgba(0, 0, 0, 0.05); - border-top-left-radius: calc(0.25rem - 1px); - border-top-right-radius: calc(0.25rem - 1px); -} - -.toast-body { - padding: 0.75rem; -} - -.modal-open { - overflow: hidden; -} - -.modal-open .modal { - overflow-x: hidden; - overflow-y: auto; -} - -.modal { - position: fixed; - top: 0; - left: 0; - z-index: 1050; - display: none; - width: 100%; - height: 100%; - overflow: hidden; - outline: 0; -} - -.modal-dialog { - position: relative; - width: auto; - margin: 0.5rem; - pointer-events: none; -} - -.modal.fade .modal-dialog { - transition: transform 0.3s ease-out; - transform: translate(0, -50px); -} - -@media (prefers-reduced-motion: reduce) { - .modal.fade .modal-dialog { - transition: none; - } -} - -.modal.show .modal-dialog { - transform: none; -} - -.modal.modal-static .modal-dialog { - transform: scale(1.02); -} - -.modal-dialog-scrollable { - display: flex; - max-height: calc(100% - 1rem); -} - -.modal-dialog-scrollable .modal-content { - max-height: calc(100vh - 1rem); - overflow: hidden; -} - -.modal-dialog-scrollable .modal-header, -.modal-dialog-scrollable .modal-footer { - flex-shrink: 0; -} - -.modal-dialog-scrollable .modal-body { - overflow-y: auto; -} - -.modal-dialog-centered { - display: flex; - align-items: center; - min-height: calc(100% - 1rem); -} - -.modal-dialog-centered::before { - display: block; - height: calc(100vh - 1rem); - height: -webkit-min-content; - height: -moz-min-content; - height: min-content; - content: ""; -} - -.modal-dialog-centered.modal-dialog-scrollable { - flex-direction: column; - justify-content: center; - height: 100%; -} - -.modal-dialog-centered.modal-dialog-scrollable .modal-content { - max-height: none; -} - -.modal-dialog-centered.modal-dialog-scrollable::before { - content: none; -} - -.modal-content { - position: relative; - display: flex; - flex-direction: column; - width: 100%; - pointer-events: auto; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 0.3rem; - outline: 0; -} - -.modal-backdrop { - position: fixed; - top: 0; - left: 0; - z-index: 1040; - width: 100vw; - height: 100vh; - background-color: #000; -} - -.modal-backdrop.fade { - opacity: 0; -} - -.modal-backdrop.show { - opacity: 0.5; } .modal-header { - display: flex; - align-items: flex-start; - justify-content: space-between; - padding: 1rem 1rem; border-bottom: 1px solid #e3e6f0; - border-top-left-radius: calc(0.3rem - 1px); - border-top-right-radius: calc(0.3rem - 1px); -} - -.modal-header .close { - padding: 1rem 1rem; - margin: -1rem -1rem -1rem auto; -} - -.modal-title { - margin-bottom: 0; - line-height: 1.5; -} - -.modal-body { - position: relative; - flex: 1 1 auto; - padding: 1rem; -} - -.modal-footer { - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: flex-end; - padding: 0.75rem; - border-top: 1px solid #eaecf4; - border-bottom-right-radius: calc(0.3rem - 1px); - border-bottom-left-radius: calc(0.3rem - 1px); -} - -.modal-footer > * { - margin: 0.25rem; -} - -.modal-scrollbar-measure { - position: absolute; - top: -9999px; - width: 50px; - height: 50px; - overflow: scroll; -} - -@media (min-width: 576px) { - .modal-dialog { - max-width: 500px; - margin: 1.75rem auto; - } - - .modal-dialog-scrollable { - max-height: calc(100% - 3.5rem); - } - - .modal-dialog-scrollable .modal-content { - max-height: calc(100vh - 3.5rem); - } - - .modal-dialog-centered { - min-height: calc(100% - 3.5rem); - } - - .modal-dialog-centered::before { - height: calc(100vh - 3.5rem); - height: -webkit-min-content; - height: -moz-min-content; - height: min-content; - } - - .modal-sm { - max-width: 300px; - } -} - -@media (min-width: 1100px) { - .modal-lg, - .modal-xl { - max-width: 800px; - } -} - -@media (min-width: 1400px) { - .modal-xl { - max-width: 1140px; - } -} - -.tooltip { - position: absolute; - z-index: 1070; - display: block; - margin: 0; - font-family: "Nunito", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - font-style: normal; - font-weight: 400; - line-height: 1.5; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - word-spacing: normal; - white-space: normal; - line-break: auto; - font-size: 0.875rem; - word-wrap: break-word; - opacity: 0; -} - -.tooltip.show { - opacity: 0.9; -} - -.tooltip .arrow { - position: absolute; - display: block; - width: 0.8rem; - height: 0.4rem; -} - -.tooltip .arrow::before { - position: absolute; - content: ""; - border-color: transparent; - border-style: solid; -} - -.bs-tooltip-top, .bs-tooltip-auto[x-placement^="top"] { - padding: 0.4rem 0; -} - -.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^="top"] .arrow { - bottom: 0; -} - -.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^="top"] .arrow::before { - top: 0; - border-width: 0.4rem 0.4rem 0; - border-top-color: #000; -} - -.bs-tooltip-right, .bs-tooltip-auto[x-placement^="right"] { - padding: 0 0.4rem; -} - -.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^="right"] .arrow { - left: 0; - width: 0.4rem; - height: 0.8rem; -} - -.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^="right"] .arrow::before { - right: 0; - border-width: 0.4rem 0.4rem 0.4rem 0; - border-right-color: #000; -} - -.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^="bottom"] { - padding: 0.4rem 0; -} - -.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^="bottom"] .arrow { - top: 0; -} - -.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^="bottom"] .arrow::before { - bottom: 0; - border-width: 0 0.4rem 0.4rem; - border-bottom-color: #000; -} - -.bs-tooltip-left, .bs-tooltip-auto[x-placement^="left"] { - padding: 0 0.4rem; -} - -.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^="left"] .arrow { - right: 0; - width: 0.4rem; - height: 0.8rem; -} - -.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^="left"] .arrow::before { - left: 0; - border-width: 0.4rem 0 0.4rem 0.4rem; - border-left-color: #000; } .tooltip-inner { - max-width: 200px; - padding: 0.25rem 0.5rem; - color: #fff; - text-align: center; - background-color: #000; border-radius: 0.35rem; } -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1060; - display: block; - max-width: 276px; - font-family: "Nunito", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - font-style: normal; - font-weight: 400; - line-height: 1.5; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - word-spacing: normal; - white-space: normal; - line-break: auto; - font-size: 0.875rem; - word-wrap: break-word; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 0.3rem; -} - -.popover .arrow { - position: absolute; - display: block; - width: 1rem; - height: 0.5rem; - margin: 0 0.3rem; -} - -.popover .arrow::before, .popover .arrow::after { - position: absolute; - display: block; - content: ""; - border-color: transparent; - border-style: solid; -} - -.bs-popover-top, .bs-popover-auto[x-placement^="top"] { - margin-bottom: 0.5rem; -} - -.bs-popover-top > .arrow, .bs-popover-auto[x-placement^="top"] > .arrow { - bottom: calc(-0.5rem - 1px); -} - -.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^="top"] > .arrow::before { - bottom: 0; - border-width: 0.5rem 0.5rem 0; - border-top-color: rgba(0, 0, 0, 0.25); -} - -.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^="top"] > .arrow::after { - bottom: 1px; - border-width: 0.5rem 0.5rem 0; - border-top-color: #fff; -} - -.bs-popover-right, .bs-popover-auto[x-placement^="right"] { - margin-left: 0.5rem; -} - -.bs-popover-right > .arrow, .bs-popover-auto[x-placement^="right"] > .arrow { - left: calc(-0.5rem - 1px); - width: 0.5rem; - height: 1rem; - margin: 0.3rem 0; -} - -.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^="right"] > .arrow::before { - left: 0; - border-width: 0.5rem 0.5rem 0.5rem 0; - border-right-color: rgba(0, 0, 0, 0.25); -} - -.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^="right"] > .arrow::after { - left: 1px; - border-width: 0.5rem 0.5rem 0.5rem 0; - border-right-color: #fff; -} - -.bs-popover-bottom, .bs-popover-auto[x-placement^="bottom"] { - margin-top: 0.5rem; -} - -.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^="bottom"] > .arrow { - top: calc(-0.5rem - 1px); -} - -.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^="bottom"] > .arrow::before { - top: 0; - border-width: 0 0.5rem 0.5rem 0.5rem; - border-bottom-color: rgba(0, 0, 0, 0.25); -} - -.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^="bottom"] > .arrow::after { - top: 1px; - border-width: 0 0.5rem 0.5rem 0.5rem; - border-bottom-color: #fff; -} - -.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^="bottom"] .popover-header::before { - position: absolute; - top: 0; - left: 50%; - display: block; - width: 1rem; - margin-left: -0.5rem; - content: ""; - border-bottom: 1px solid #f7f7f7; -} - -.bs-popover-left, .bs-popover-auto[x-placement^="left"] { - margin-right: 0.5rem; -} - -.bs-popover-left > .arrow, .bs-popover-auto[x-placement^="left"] > .arrow { - right: calc(-0.5rem - 1px); - width: 0.5rem; - height: 1rem; - margin: 0.3rem 0; -} - -.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^="left"] > .arrow::before { - right: 0; - border-width: 0.5rem 0 0.5rem 0.5rem; - border-left-color: rgba(0, 0, 0, 0.25); -} - -.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^="left"] > .arrow::after { - right: 1px; - border-width: 0.5rem 0 0.5rem 0.5rem; - border-left-color: #fff; -} - -.popover-header { - padding: 0.5rem 0.75rem; - margin-bottom: 0; - font-size: 1rem; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-top-left-radius: calc(0.3rem - 1px); - border-top-right-radius: calc(0.3rem - 1px); -} - -.popover-header:empty { - display: none; -} - .popover-body { - padding: 0.5rem 0.75rem; color: #858796; } -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} - -.carousel-inner::after { - display: block; - clear: both; - content: ""; -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - transition: transform 0.6s ease-in-out; -} - -@media (prefers-reduced-motion: reduce) { - .carousel-item { - transition: none; - } -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -.carousel-item-next:not(.carousel-item-left), -.active.carousel-item-right { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-right), -.active.carousel-item-left { - transform: translateX(-100%); -} - -.carousel-fade .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; -} - -.carousel-fade .carousel-item.active, -.carousel-fade .carousel-item-next.carousel-item-left, -.carousel-fade .carousel-item-prev.carousel-item-right { - z-index: 1; - opacity: 1; -} - -.carousel-fade .active.carousel-item-left, -.carousel-fade .active.carousel-item-right { - z-index: 0; - opacity: 0; - transition: opacity 0s 0.6s; -} - -@media (prefers-reduced-motion: reduce) { - .carousel-fade .active.carousel-item-left, - .carousel-fade .active.carousel-item-right { - transition: none; - } -} - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - display: flex; - align-items: center; - justify-content: center; - width: 15%; - color: #fff; - text-align: center; - opacity: 0.5; - transition: opacity 0.15s ease; -} - -@media (prefers-reduced-motion: reduce) { - .carousel-control-prev, - .carousel-control-next { - transition: none; - } -} - -.carousel-control-prev:hover, .carousel-control-prev:focus, -.carousel-control-next:hover, -.carousel-control-next:focus { - color: #fff; - text-decoration: none; - outline: 0; - opacity: 0.9; -} - -.carousel-control-prev { - left: 0; -} - -.carousel-control-next { - right: 0; -} - -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: 20px; - height: 20px; - background: no-repeat 50% / 100% 100%; -} - -.carousel-control-prev-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e"); -} - -.carousel-control-next-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e"); -} - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 15; - display: flex; - justify-content: center; - padding-left: 0; - margin-right: 15%; - margin-left: 15%; - list-style: none; -} - -.carousel-indicators li { - box-sizing: content-box; - flex: 0 1 auto; - width: 30px; - height: 3px; - margin-right: 3px; - margin-left: 3px; - text-indent: -999px; - cursor: pointer; - background-color: #fff; - background-clip: padding-box; - border-top: 10px solid transparent; - border-bottom: 10px solid transparent; - opacity: .5; - transition: opacity 0.6s ease; -} - -@media (prefers-reduced-motion: reduce) { - .carousel-indicators li { - transition: none; - } -} - -.carousel-indicators .active { - opacity: 1; -} - -.carousel-caption { - position: absolute; - right: 15%; - bottom: 20px; - left: 15%; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #fff; - text-align: center; -} - -@-webkit-keyframes spinner-border { - to { - transform: rotate(360deg); - } -} - -@keyframes spinner-border { - to { - transform: rotate(360deg); - } -} - -.spinner-border { - display: inline-block; - width: 2rem; - height: 2rem; - vertical-align: text-bottom; - border: 0.25em solid currentColor; - border-right-color: transparent; - border-radius: 50%; - -webkit-animation: spinner-border .75s linear infinite; - animation: spinner-border .75s linear infinite; -} - -.spinner-border-sm { - width: 1rem; - height: 1rem; - border-width: 0.2em; -} - -@-webkit-keyframes spinner-grow { - 0% { - transform: scale(0); - } - 50% { - opacity: 1; - transform: none; - } -} - -@keyframes spinner-grow { - 0% { - transform: scale(0); - } - 50% { - opacity: 1; - transform: none; - } -} - -.spinner-grow { - display: inline-block; - width: 2rem; - height: 2rem; - vertical-align: text-bottom; - background-color: currentColor; - border-radius: 50%; - opacity: 0; - -webkit-animation: spinner-grow .75s linear infinite; - animation: spinner-grow .75s linear infinite; -} - -.spinner-grow-sm { - width: 1rem; - height: 1rem; -} - -.align-baseline { - vertical-align: baseline !important; -} - -.align-top { - vertical-align: top !important; -} - -.align-middle { - vertical-align: middle !important; -} - -.align-bottom { - vertical-align: bottom !important; -} - -.align-text-bottom { - vertical-align: text-bottom !important; -} - -.align-text-top { - vertical-align: text-top !important; -} - .bg-primary { background-color: #4e73df !important; } -a.bg-primary:hover, a.bg-primary:focus, -button.bg-primary:hover, -button.bg-primary:focus { - background-color: #2653d4 !important; -} - .bg-secondary { background-color: #858796 !important; } -a.bg-secondary:hover, a.bg-secondary:focus, -button.bg-secondary:hover, -button.bg-secondary:focus { - background-color: #6b6d7d !important; -} - .bg-success { background-color: #1cc88a !important; } -a.bg-success:hover, a.bg-success:focus, -button.bg-success:hover, -button.bg-success:focus { - background-color: #169b6b !important; -} - .bg-info { background-color: #36b9cc !important; } -a.bg-info:hover, a.bg-info:focus, -button.bg-info:hover, -button.bg-info:focus { - background-color: #2a96a5 !important; -} - .bg-warning { background-color: #f6c23e !important; } -a.bg-warning:hover, a.bg-warning:focus, -button.bg-warning:hover, -button.bg-warning:focus { - background-color: #f4b30d !important; -} - .bg-danger { background-color: #e74a3b !important; } -a.bg-danger:hover, a.bg-danger:focus, -button.bg-danger:hover, -button.bg-danger:focus { - background-color: #d52a1a !important; -} - .bg-light { background-color: #f8f9fc !important; } -a.bg-light:hover, a.bg-light:focus, -button.bg-light:hover, -button.bg-light:focus { - background-color: #d4daed !important; -} - .bg-dark { background-color: #5a5c69 !important; } -a.bg-dark:hover, a.bg-dark:focus, -button.bg-dark:hover, -button.bg-dark:focus { - background-color: #42444e !important; -} - -.bg-transparent { - background-color: transparent !important; -} - .border { border: 1px solid #e3e6f0 !important; } @@ -6548,7 +1701,7 @@ button.bg-dark:focus { border-top: 1px solid #e3e6f0 !important; } -.border-right { +.border-end { border-right: 1px solid #e3e6f0 !important; } @@ -6556,30 +1709,10 @@ button.bg-dark:focus { border-bottom: 1px solid #e3e6f0 !important; } -.border-left { +.border-start { border-left: 1px solid #e3e6f0 !important; } -.border-0 { - border: 0 !important; -} - -.border-top-0 { - border-top: 0 !important; -} - -.border-right-0 { - border-right: 0 !important; -} - -.border-bottom-0 { - border-bottom: 0 !important; -} - -.border-left-0 { - border-left: 0 !important; -} - .border-primary { border-color: #4e73df !important; } @@ -6612,14 +1745,6 @@ button.bg-dark:focus { border-color: #5a5c69 !important; } -.border-white { - border-color: #fff !important; -} - -.rounded-sm { - border-radius: 0.2rem !important; -} - .rounded { border-radius: 0.35rem !important; } @@ -6629,7 +1754,7 @@ button.bg-dark:focus { border-top-right-radius: 0.35rem !important; } -.rounded-right { +.rounded-end { border-top-right-radius: 0.35rem !important; border-bottom-right-radius: 0.35rem !important; } @@ -6639,976 +1764,11 @@ button.bg-dark:focus { border-bottom-left-radius: 0.35rem !important; } -.rounded-left { +.rounded-start { border-top-left-radius: 0.35rem !important; border-bottom-left-radius: 0.35rem !important; } -.rounded-lg { - border-radius: 0.3rem !important; -} - -.rounded-circle { - border-radius: 50% !important; -} - -.rounded-pill { - border-radius: 50rem !important; -} - -.rounded-0 { - border-radius: 0 !important; -} - -.clearfix::after { - display: block; - clear: both; - content: ""; -} - -.d-none { - display: none !important; -} - -.d-inline { - display: inline !important; -} - -.d-inline-block { - display: inline-block !important; -} - -.d-block { - display: block !important; -} - -.d-table { - display: table !important; -} - -.d-table-row { - display: table-row !important; -} - -.d-table-cell { - display: table-cell !important; -} - -.d-flex { - display: flex !important; -} - -.d-inline-flex { - display: inline-flex !important; -} - -@media (min-width: 576px) { - .d-sm-none { - display: none !important; - } - .d-sm-inline { - display: inline !important; - } - .d-sm-inline-block { - display: inline-block !important; - } - .d-sm-block { - display: block !important; - } - .d-sm-table { - display: table !important; - } - .d-sm-table-row { - display: table-row !important; - } - .d-sm-table-cell { - display: table-cell !important; - } - .d-sm-flex { - display: flex !important; - } - .d-sm-inline-flex { - display: inline-flex !important; - } -} - -@media (min-width: 768px) { - .d-md-none { - display: none !important; - } - .d-md-inline { - display: inline !important; - } - .d-md-inline-block { - display: inline-block !important; - } - .d-md-block { - display: block !important; - } - .d-md-table { - display: table !important; - } - .d-md-table-row { - display: table-row !important; - } - .d-md-table-cell { - display: table-cell !important; - } - .d-md-flex { - display: flex !important; - } - .d-md-inline-flex { - display: inline-flex !important; - } -} - -@media (min-width: 1100px) { - .d-lg-none { - display: none !important; - } - .d-lg-inline { - display: inline !important; - } - .d-lg-inline-block { - display: inline-block !important; - } - .d-lg-block { - display: block !important; - } - .d-lg-table { - display: table !important; - } - .d-lg-table-row { - display: table-row !important; - } - .d-lg-table-cell { - display: table-cell !important; - } - .d-lg-flex { - display: flex !important; - } - .d-lg-inline-flex { - display: inline-flex !important; - } -} - -@media (min-width: 1400px) { - .d-xl-none { - display: none !important; - } - .d-xl-inline { - display: inline !important; - } - .d-xl-inline-block { - display: inline-block !important; - } - .d-xl-block { - display: block !important; - } - .d-xl-table { - display: table !important; - } - .d-xl-table-row { - display: table-row !important; - } - .d-xl-table-cell { - display: table-cell !important; - } - .d-xl-flex { - display: flex !important; - } - .d-xl-inline-flex { - display: inline-flex !important; - } -} - -@media print { - .d-print-none { - display: none !important; - } - .d-print-inline { - display: inline !important; - } - .d-print-inline-block { - display: inline-block !important; - } - .d-print-block { - display: block !important; - } - .d-print-table { - display: table !important; - } - .d-print-table-row { - display: table-row !important; - } - .d-print-table-cell { - display: table-cell !important; - } - .d-print-flex { - display: flex !important; - } - .d-print-inline-flex { - display: inline-flex !important; - } -} - -.embed-responsive { - position: relative; - display: block; - width: 100%; - padding: 0; - overflow: hidden; -} - -.embed-responsive::before { - display: block; - content: ""; -} - -.embed-responsive .embed-responsive-item, -.embed-responsive iframe, -.embed-responsive embed, -.embed-responsive object, -.embed-responsive video { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 100%; - height: 100%; - border: 0; -} - -.embed-responsive-21by9::before { - padding-top: 42.85714%; -} - -.embed-responsive-16by9::before { - padding-top: 56.25%; -} - -.embed-responsive-4by3::before { - padding-top: 75%; -} - -.embed-responsive-1by1::before { - padding-top: 100%; -} - -.flex-row { - flex-direction: row !important; -} - -.flex-column { - flex-direction: column !important; -} - -.flex-row-reverse { - flex-direction: row-reverse !important; -} - -.flex-column-reverse { - flex-direction: column-reverse !important; -} - -.flex-wrap { - flex-wrap: wrap !important; -} - -.flex-nowrap { - flex-wrap: nowrap !important; -} - -.flex-wrap-reverse { - flex-wrap: wrap-reverse !important; -} - -.flex-fill { - flex: 1 1 auto !important; -} - -.flex-grow-0 { - flex-grow: 0 !important; -} - -.flex-grow-1 { - flex-grow: 1 !important; -} - -.flex-shrink-0 { - flex-shrink: 0 !important; -} - -.flex-shrink-1 { - flex-shrink: 1 !important; -} - -.justify-content-start { - justify-content: flex-start !important; -} - -.justify-content-end { - justify-content: flex-end !important; -} - -.justify-content-center { - justify-content: center !important; -} - -.justify-content-between { - justify-content: space-between !important; -} - -.justify-content-around { - justify-content: space-around !important; -} - -.align-items-start { - align-items: flex-start !important; -} - -.align-items-end { - align-items: flex-end !important; -} - -.align-items-center { - align-items: center !important; -} - -.align-items-baseline { - align-items: baseline !important; -} - -.align-items-stretch { - align-items: stretch !important; -} - -.align-content-start { - align-content: flex-start !important; -} - -.align-content-end { - align-content: flex-end !important; -} - -.align-content-center { - align-content: center !important; -} - -.align-content-between { - align-content: space-between !important; -} - -.align-content-around { - align-content: space-around !important; -} - -.align-content-stretch { - align-content: stretch !important; -} - -.align-self-auto { - align-self: auto !important; -} - -.align-self-start { - align-self: flex-start !important; -} - -.align-self-end { - align-self: flex-end !important; -} - -.align-self-center { - align-self: center !important; -} - -.align-self-baseline { - align-self: baseline !important; -} - -.align-self-stretch { - align-self: stretch !important; -} - -@media (min-width: 576px) { - .flex-sm-row { - flex-direction: row !important; - } - .flex-sm-column { - flex-direction: column !important; - } - .flex-sm-row-reverse { - flex-direction: row-reverse !important; - } - .flex-sm-column-reverse { - flex-direction: column-reverse !important; - } - .flex-sm-wrap { - flex-wrap: wrap !important; - } - .flex-sm-nowrap { - flex-wrap: nowrap !important; - } - .flex-sm-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .flex-sm-fill { - flex: 1 1 auto !important; - } - .flex-sm-grow-0 { - flex-grow: 0 !important; - } - .flex-sm-grow-1 { - flex-grow: 1 !important; - } - .flex-sm-shrink-0 { - flex-shrink: 0 !important; - } - .flex-sm-shrink-1 { - flex-shrink: 1 !important; - } - .justify-content-sm-start { - justify-content: flex-start !important; - } - .justify-content-sm-end { - justify-content: flex-end !important; - } - .justify-content-sm-center { - justify-content: center !important; - } - .justify-content-sm-between { - justify-content: space-between !important; - } - .justify-content-sm-around { - justify-content: space-around !important; - } - .align-items-sm-start { - align-items: flex-start !important; - } - .align-items-sm-end { - align-items: flex-end !important; - } - .align-items-sm-center { - align-items: center !important; - } - .align-items-sm-baseline { - align-items: baseline !important; - } - .align-items-sm-stretch { - align-items: stretch !important; - } - .align-content-sm-start { - align-content: flex-start !important; - } - .align-content-sm-end { - align-content: flex-end !important; - } - .align-content-sm-center { - align-content: center !important; - } - .align-content-sm-between { - align-content: space-between !important; - } - .align-content-sm-around { - align-content: space-around !important; - } - .align-content-sm-stretch { - align-content: stretch !important; - } - .align-self-sm-auto { - align-self: auto !important; - } - .align-self-sm-start { - align-self: flex-start !important; - } - .align-self-sm-end { - align-self: flex-end !important; - } - .align-self-sm-center { - align-self: center !important; - } - .align-self-sm-baseline { - align-self: baseline !important; - } - .align-self-sm-stretch { - align-self: stretch !important; - } -} - -@media (min-width: 768px) { - .flex-md-row { - flex-direction: row !important; - } - .flex-md-column { - flex-direction: column !important; - } - .flex-md-row-reverse { - flex-direction: row-reverse !important; - } - .flex-md-column-reverse { - flex-direction: column-reverse !important; - } - .flex-md-wrap { - flex-wrap: wrap !important; - } - .flex-md-nowrap { - flex-wrap: nowrap !important; - } - .flex-md-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .flex-md-fill { - flex: 1 1 auto !important; - } - .flex-md-grow-0 { - flex-grow: 0 !important; - } - .flex-md-grow-1 { - flex-grow: 1 !important; - } - .flex-md-shrink-0 { - flex-shrink: 0 !important; - } - .flex-md-shrink-1 { - flex-shrink: 1 !important; - } - .justify-content-md-start { - justify-content: flex-start !important; - } - .justify-content-md-end { - justify-content: flex-end !important; - } - .justify-content-md-center { - justify-content: center !important; - } - .justify-content-md-between { - justify-content: space-between !important; - } - .justify-content-md-around { - justify-content: space-around !important; - } - .align-items-md-start { - align-items: flex-start !important; - } - .align-items-md-end { - align-items: flex-end !important; - } - .align-items-md-center { - align-items: center !important; - } - .align-items-md-baseline { - align-items: baseline !important; - } - .align-items-md-stretch { - align-items: stretch !important; - } - .align-content-md-start { - align-content: flex-start !important; - } - .align-content-md-end { - align-content: flex-end !important; - } - .align-content-md-center { - align-content: center !important; - } - .align-content-md-between { - align-content: space-between !important; - } - .align-content-md-around { - align-content: space-around !important; - } - .align-content-md-stretch { - align-content: stretch !important; - } - .align-self-md-auto { - align-self: auto !important; - } - .align-self-md-start { - align-self: flex-start !important; - } - .align-self-md-end { - align-self: flex-end !important; - } - .align-self-md-center { - align-self: center !important; - } - .align-self-md-baseline { - align-self: baseline !important; - } - .align-self-md-stretch { - align-self: stretch !important; - } -} - -@media (min-width: 1100px) { - .flex-lg-row { - flex-direction: row !important; - } - .flex-lg-column { - flex-direction: column !important; - } - .flex-lg-row-reverse { - flex-direction: row-reverse !important; - } - .flex-lg-column-reverse { - flex-direction: column-reverse !important; - } - .flex-lg-wrap { - flex-wrap: wrap !important; - } - .flex-lg-nowrap { - flex-wrap: nowrap !important; - } - .flex-lg-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .flex-lg-fill { - flex: 1 1 auto !important; - } - .flex-lg-grow-0 { - flex-grow: 0 !important; - } - .flex-lg-grow-1 { - flex-grow: 1 !important; - } - .flex-lg-shrink-0 { - flex-shrink: 0 !important; - } - .flex-lg-shrink-1 { - flex-shrink: 1 !important; - } - .justify-content-lg-start { - justify-content: flex-start !important; - } - .justify-content-lg-end { - justify-content: flex-end !important; - } - .justify-content-lg-center { - justify-content: center !important; - } - .justify-content-lg-between { - justify-content: space-between !important; - } - .justify-content-lg-around { - justify-content: space-around !important; - } - .align-items-lg-start { - align-items: flex-start !important; - } - .align-items-lg-end { - align-items: flex-end !important; - } - .align-items-lg-center { - align-items: center !important; - } - .align-items-lg-baseline { - align-items: baseline !important; - } - .align-items-lg-stretch { - align-items: stretch !important; - } - .align-content-lg-start { - align-content: flex-start !important; - } - .align-content-lg-end { - align-content: flex-end !important; - } - .align-content-lg-center { - align-content: center !important; - } - .align-content-lg-between { - align-content: space-between !important; - } - .align-content-lg-around { - align-content: space-around !important; - } - .align-content-lg-stretch { - align-content: stretch !important; - } - .align-self-lg-auto { - align-self: auto !important; - } - .align-self-lg-start { - align-self: flex-start !important; - } - .align-self-lg-end { - align-self: flex-end !important; - } - .align-self-lg-center { - align-self: center !important; - } - .align-self-lg-baseline { - align-self: baseline !important; - } - .align-self-lg-stretch { - align-self: stretch !important; - } -} - -@media (min-width: 1400px) { - .flex-xl-row { - flex-direction: row !important; - } - .flex-xl-column { - flex-direction: column !important; - } - .flex-xl-row-reverse { - flex-direction: row-reverse !important; - } - .flex-xl-column-reverse { - flex-direction: column-reverse !important; - } - .flex-xl-wrap { - flex-wrap: wrap !important; - } - .flex-xl-nowrap { - flex-wrap: nowrap !important; - } - .flex-xl-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .flex-xl-fill { - flex: 1 1 auto !important; - } - .flex-xl-grow-0 { - flex-grow: 0 !important; - } - .flex-xl-grow-1 { - flex-grow: 1 !important; - } - .flex-xl-shrink-0 { - flex-shrink: 0 !important; - } - .flex-xl-shrink-1 { - flex-shrink: 1 !important; - } - .justify-content-xl-start { - justify-content: flex-start !important; - } - .justify-content-xl-end { - justify-content: flex-end !important; - } - .justify-content-xl-center { - justify-content: center !important; - } - .justify-content-xl-between { - justify-content: space-between !important; - } - .justify-content-xl-around { - justify-content: space-around !important; - } - .align-items-xl-start { - align-items: flex-start !important; - } - .align-items-xl-end { - align-items: flex-end !important; - } - .align-items-xl-center { - align-items: center !important; - } - .align-items-xl-baseline { - align-items: baseline !important; - } - .align-items-xl-stretch { - align-items: stretch !important; - } - .align-content-xl-start { - align-content: flex-start !important; - } - .align-content-xl-end { - align-content: flex-end !important; - } - .align-content-xl-center { - align-content: center !important; - } - .align-content-xl-between { - align-content: space-between !important; - } - .align-content-xl-around { - align-content: space-around !important; - } - .align-content-xl-stretch { - align-content: stretch !important; - } - .align-self-xl-auto { - align-self: auto !important; - } - .align-self-xl-start { - align-self: flex-start !important; - } - .align-self-xl-end { - align-self: flex-end !important; - } - .align-self-xl-center { - align-self: center !important; - } - .align-self-xl-baseline { - align-self: baseline !important; - } - .align-self-xl-stretch { - align-self: stretch !important; - } -} - -.float-left { - float: left !important; -} - -.float-right { - float: right !important; -} - -.float-none { - float: none !important; -} - -@media (min-width: 576px) { - .float-sm-left { - float: left !important; - } - .float-sm-right { - float: right !important; - } - .float-sm-none { - float: none !important; - } -} - -@media (min-width: 768px) { - .float-md-left { - float: left !important; - } - .float-md-right { - float: right !important; - } - .float-md-none { - float: none !important; - } -} - -@media (min-width: 1100px) { - .float-lg-left { - float: left !important; - } - .float-lg-right { - float: right !important; - } - .float-lg-none { - float: none !important; - } -} - -@media (min-width: 1400px) { - .float-xl-left { - float: left !important; - } - - .float-xl-right { - float: right !important; - } - - .float-xl-none { - float: none !important; - } -} - -.user-select-all { - -webkit-user-select: all !important; - -moz-user-select: all !important; - -ms-user-select: all !important; - user-select: all !important; -} - -.user-select-auto { - -webkit-user-select: auto !important; - -moz-user-select: auto !important; - -ms-user-select: auto !important; - user-select: auto !important; -} - -.user-select-none { - -webkit-user-select: none !important; - -moz-user-select: none !important; - -ms-user-select: none !important; - user-select: none !important; -} - -.overflow-auto { - overflow: auto !important; -} - -.overflow-hidden { - overflow: hidden !important; -} - -.position-static { - position: static !important; -} - -.position-relative { - position: relative !important; -} - -.position-absolute { - position: absolute !important; -} - -.position-fixed { - position: fixed !important; -} - -.position-sticky { - position: -webkit-sticky !important; - position: sticky !important; -} - -.fixed-top { - position: fixed; - top: 0; - right: 0; - left: 0; - z-index: 1030; -} - -.fixed-bottom { - position: fixed; - right: 0; - bottom: 0; - left: 0; - z-index: 1030; -} - -@supports ((position: -webkit-sticky) or (position: sticky)) { - .sticky-top { - position: -webkit-sticky; - position: sticky; - top: 0; - z-index: 1020; - } -} - -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border: 0; -} - -.sr-only-focusable:active, .sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - overflow: visible; - clip: auto; - white-space: normal; -} - .shadow-sm { box-shadow: 0 0.125rem 0.25rem 0 rgba(58, 59, 69, 0.2) !important; } @@ -7617,2026 +1777,10 @@ button.bg-dark:focus { box-shadow: 0 0.15rem 1.75rem 0 rgba(58, 59, 69, 0.15) !important; } -.shadow-lg { - box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; -} - -.shadow-none { - box-shadow: none !important; -} - -.w-25 { - width: 25% !important; -} - -.w-50 { - width: 50% !important; -} - -.w-75 { - width: 75% !important; -} - -.w-100 { - width: 100% !important; -} - -.w-auto { - width: auto !important; -} - -.h-25 { - height: 25% !important; -} - -.h-50 { - height: 50% !important; -} - -.h-75 { - height: 75% !important; -} - -.h-100 { - height: 100% !important; -} - -.h-auto { - height: auto !important; -} - -.mw-100 { - max-width: 100% !important; -} - -.mh-100 { - max-height: 100% !important; -} - -.min-vw-100 { - min-width: 100vw !important; -} - -.min-vh-100 { - min-height: 100vh !important; -} - -.vw-100 { - width: 100vw !important; -} - -.vh-100 { - height: 100vh !important; -} - -.m-0 { - margin: 0 !important; -} - -.mt-0, -.my-0 { - margin-top: 0 !important; -} - -.mr-0, -.mx-0 { - margin-right: 0 !important; -} - -.mb-0, -.my-0 { - margin-bottom: 0 !important; -} - -.ml-0, -.mx-0 { - margin-left: 0 !important; -} - -.m-1 { - margin: 0.25rem !important; -} - -.mt-1, -.my-1 { - margin-top: 0.25rem !important; -} - -.mr-1, -.mx-1 { - margin-right: 0.25rem !important; -} - -.mb-1, -.my-1 { - margin-bottom: 0.25rem !important; -} - -.ml-1, -.mx-1 { - margin-left: 0.25rem !important; -} - -.m-2 { - margin: 0.5rem !important; -} - -.mt-2, -.my-2 { - margin-top: 0.5rem !important; -} - -.mr-2, -.mx-2 { - margin-right: 0.5rem !important; -} - -.mb-2, -.my-2 { - margin-bottom: 0.5rem !important; -} - -.ml-2, -.mx-2 { - margin-left: 0.5rem !important; -} - -.m-3 { - margin: 1rem !important; -} - -.mt-3, -.my-3 { - margin-top: 1rem !important; -} - -.mr-3, -.mx-3 { - margin-right: 1rem !important; -} - -.mb-3, -.my-3 { - margin-bottom: 1rem !important; -} - -.ml-3, -.mx-3 { - margin-left: 1rem !important; -} - -.m-4 { - margin: 1.5rem !important; -} - -.mt-4, -.my-4 { - margin-top: 1.5rem !important; -} - -.mr-4, -.mx-4 { - margin-right: 1.5rem !important; -} - -.mb-4, -.my-4 { - margin-bottom: 1.5rem !important; -} - -.ml-4, -.mx-4 { - margin-left: 1.5rem !important; -} - -.m-5 { - margin: 3rem !important; -} - -.mt-5, -.my-5 { - margin-top: 3rem !important; -} - -.mr-5, -.mx-5 { - margin-right: 3rem !important; -} - -.mb-5, -.my-5 { - margin-bottom: 3rem !important; -} - -.ml-5, -.mx-5 { - margin-left: 3rem !important; -} - -.p-0 { - padding: 0 !important; -} - -.pt-0, -.py-0 { - padding-top: 0 !important; -} - -.pr-0, -.px-0 { - padding-right: 0 !important; -} - -.pb-0, -.py-0 { - padding-bottom: 0 !important; -} - -.pl-0, -.px-0 { - padding-left: 0 !important; -} - -.p-1 { - padding: 0.25rem !important; -} - -.pt-1, -.py-1 { - padding-top: 0.25rem !important; -} - -.pr-1, -.px-1 { - padding-right: 0.25rem !important; -} - -.pb-1, -.py-1 { - padding-bottom: 0.25rem !important; -} - -.pl-1, -.px-1 { - padding-left: 0.25rem !important; -} - -.p-2 { - padding: 0.5rem !important; -} - -.pt-2, -.py-2 { - padding-top: 0.5rem !important; -} - -.pr-2, -.px-2 { - padding-right: 0.5rem !important; -} - -.pb-2, -.py-2 { - padding-bottom: 0.5rem !important; -} - -.pl-2, -.px-2 { - padding-left: 0.5rem !important; -} - -.p-3 { - padding: 1rem !important; -} - -.pt-3, -.py-3 { - padding-top: 1rem !important; -} - -.pr-3, -.px-3 { - padding-right: 1rem !important; -} - -.pb-3, -.py-3 { - padding-bottom: 1rem !important; -} - -.pl-3, -.px-3 { - padding-left: 1rem !important; -} - -.p-4 { - padding: 1.5rem !important; -} - -.pt-4, -.py-4 { - padding-top: 1.5rem !important; -} - -.pr-4, -.px-4 { - padding-right: 1.5rem !important; -} - -.pb-4, -.py-4 { - padding-bottom: 1.5rem !important; -} - -.pl-4, -.px-4 { - padding-left: 1.5rem !important; -} - -.p-5 { - padding: 3rem !important; -} - -.pt-5, -.py-5 { - padding-top: 3rem !important; -} - -.pr-5, -.px-5 { - padding-right: 3rem !important; -} - -.pb-5, -.py-5 { - padding-bottom: 3rem !important; -} - -.pl-5, -.px-5 { - padding-left: 3rem !important; -} - -.m-n1 { - margin: -0.25rem !important; -} - -.mt-n1, -.my-n1 { - margin-top: -0.25rem !important; -} - -.mr-n1, -.mx-n1 { - margin-right: -0.25rem !important; -} - -.mb-n1, -.my-n1 { - margin-bottom: -0.25rem !important; -} - -.ml-n1, -.mx-n1 { - margin-left: -0.25rem !important; -} - -.m-n2 { - margin: -0.5rem !important; -} - -.mt-n2, -.my-n2 { - margin-top: -0.5rem !important; -} - -.mr-n2, -.mx-n2 { - margin-right: -0.5rem !important; -} - -.mb-n2, -.my-n2 { - margin-bottom: -0.5rem !important; -} - -.ml-n2, -.mx-n2 { - margin-left: -0.5rem !important; -} - -.m-n3 { - margin: -1rem !important; -} - -.mt-n3, -.my-n3 { - margin-top: -1rem !important; -} - -.mr-n3, -.mx-n3 { - margin-right: -1rem !important; -} - -.mb-n3, -.my-n3 { - margin-bottom: -1rem !important; -} - -.ml-n3, -.mx-n3 { - margin-left: -1rem !important; -} - -.m-n4 { - margin: -1.5rem !important; -} - -.mt-n4, -.my-n4 { - margin-top: -1.5rem !important; -} - -.mr-n4, -.mx-n4 { - margin-right: -1.5rem !important; -} - -.mb-n4, -.my-n4 { - margin-bottom: -1.5rem !important; -} - -.ml-n4, -.mx-n4 { - margin-left: -1.5rem !important; -} - -.m-n5 { - margin: -3rem !important; -} - -.mt-n5, -.my-n5 { - margin-top: -3rem !important; -} - -.mr-n5, -.mx-n5 { - margin-right: -3rem !important; -} - -.mb-n5, -.my-n5 { - margin-bottom: -3rem !important; -} - -.ml-n5, -.mx-n5 { - margin-left: -3rem !important; -} - -.m-auto { - margin: auto !important; -} - -.mt-auto, -.my-auto { - margin-top: auto !important; -} - -.mr-auto, -.mx-auto { - margin-right: auto !important; -} - -.mb-auto, -.my-auto { - margin-bottom: auto !important; -} - -.ml-auto, -.mx-auto { - margin-left: auto !important; -} - -@media (min-width: 576px) { - .m-sm-0 { - margin: 0 !important; - } - .mt-sm-0, - .my-sm-0 { - margin-top: 0 !important; - } - .mr-sm-0, - .mx-sm-0 { - margin-right: 0 !important; - } - .mb-sm-0, - .my-sm-0 { - margin-bottom: 0 !important; - } - .ml-sm-0, - .mx-sm-0 { - margin-left: 0 !important; - } - .m-sm-1 { - margin: 0.25rem !important; - } - .mt-sm-1, - .my-sm-1 { - margin-top: 0.25rem !important; - } - .mr-sm-1, - .mx-sm-1 { - margin-right: 0.25rem !important; - } - .mb-sm-1, - .my-sm-1 { - margin-bottom: 0.25rem !important; - } - .ml-sm-1, - .mx-sm-1 { - margin-left: 0.25rem !important; - } - .m-sm-2 { - margin: 0.5rem !important; - } - .mt-sm-2, - .my-sm-2 { - margin-top: 0.5rem !important; - } - .mr-sm-2, - .mx-sm-2 { - margin-right: 0.5rem !important; - } - .mb-sm-2, - .my-sm-2 { - margin-bottom: 0.5rem !important; - } - .ml-sm-2, - .mx-sm-2 { - margin-left: 0.5rem !important; - } - .m-sm-3 { - margin: 1rem !important; - } - .mt-sm-3, - .my-sm-3 { - margin-top: 1rem !important; - } - .mr-sm-3, - .mx-sm-3 { - margin-right: 1rem !important; - } - .mb-sm-3, - .my-sm-3 { - margin-bottom: 1rem !important; - } - .ml-sm-3, - .mx-sm-3 { - margin-left: 1rem !important; - } - .m-sm-4 { - margin: 1.5rem !important; - } - .mt-sm-4, - .my-sm-4 { - margin-top: 1.5rem !important; - } - .mr-sm-4, - .mx-sm-4 { - margin-right: 1.5rem !important; - } - .mb-sm-4, - .my-sm-4 { - margin-bottom: 1.5rem !important; - } - .ml-sm-4, - .mx-sm-4 { - margin-left: 1.5rem !important; - } - .m-sm-5 { - margin: 3rem !important; - } - .mt-sm-5, - .my-sm-5 { - margin-top: 3rem !important; - } - .mr-sm-5, - .mx-sm-5 { - margin-right: 3rem !important; - } - .mb-sm-5, - .my-sm-5 { - margin-bottom: 3rem !important; - } - .ml-sm-5, - .mx-sm-5 { - margin-left: 3rem !important; - } - .p-sm-0 { - padding: 0 !important; - } - .pt-sm-0, - .py-sm-0 { - padding-top: 0 !important; - } - .pr-sm-0, - .px-sm-0 { - padding-right: 0 !important; - } - .pb-sm-0, - .py-sm-0 { - padding-bottom: 0 !important; - } - .pl-sm-0, - .px-sm-0 { - padding-left: 0 !important; - } - .p-sm-1 { - padding: 0.25rem !important; - } - .pt-sm-1, - .py-sm-1 { - padding-top: 0.25rem !important; - } - .pr-sm-1, - .px-sm-1 { - padding-right: 0.25rem !important; - } - .pb-sm-1, - .py-sm-1 { - padding-bottom: 0.25rem !important; - } - .pl-sm-1, - .px-sm-1 { - padding-left: 0.25rem !important; - } - .p-sm-2 { - padding: 0.5rem !important; - } - .pt-sm-2, - .py-sm-2 { - padding-top: 0.5rem !important; - } - .pr-sm-2, - .px-sm-2 { - padding-right: 0.5rem !important; - } - .pb-sm-2, - .py-sm-2 { - padding-bottom: 0.5rem !important; - } - .pl-sm-2, - .px-sm-2 { - padding-left: 0.5rem !important; - } - .p-sm-3 { - padding: 1rem !important; - } - .pt-sm-3, - .py-sm-3 { - padding-top: 1rem !important; - } - .pr-sm-3, - .px-sm-3 { - padding-right: 1rem !important; - } - .pb-sm-3, - .py-sm-3 { - padding-bottom: 1rem !important; - } - .pl-sm-3, - .px-sm-3 { - padding-left: 1rem !important; - } - .p-sm-4 { - padding: 1.5rem !important; - } - .pt-sm-4, - .py-sm-4 { - padding-top: 1.5rem !important; - } - .pr-sm-4, - .px-sm-4 { - padding-right: 1.5rem !important; - } - .pb-sm-4, - .py-sm-4 { - padding-bottom: 1.5rem !important; - } - .pl-sm-4, - .px-sm-4 { - padding-left: 1.5rem !important; - } - .p-sm-5 { - padding: 3rem !important; - } - .pt-sm-5, - .py-sm-5 { - padding-top: 3rem !important; - } - .pr-sm-5, - .px-sm-5 { - padding-right: 3rem !important; - } - .pb-sm-5, - .py-sm-5 { - padding-bottom: 3rem !important; - } - .pl-sm-5, - .px-sm-5 { - padding-left: 3rem !important; - } - .m-sm-n1 { - margin: -0.25rem !important; - } - .mt-sm-n1, - .my-sm-n1 { - margin-top: -0.25rem !important; - } - .mr-sm-n1, - .mx-sm-n1 { - margin-right: -0.25rem !important; - } - .mb-sm-n1, - .my-sm-n1 { - margin-bottom: -0.25rem !important; - } - .ml-sm-n1, - .mx-sm-n1 { - margin-left: -0.25rem !important; - } - .m-sm-n2 { - margin: -0.5rem !important; - } - .mt-sm-n2, - .my-sm-n2 { - margin-top: -0.5rem !important; - } - .mr-sm-n2, - .mx-sm-n2 { - margin-right: -0.5rem !important; - } - .mb-sm-n2, - .my-sm-n2 { - margin-bottom: -0.5rem !important; - } - .ml-sm-n2, - .mx-sm-n2 { - margin-left: -0.5rem !important; - } - .m-sm-n3 { - margin: -1rem !important; - } - .mt-sm-n3, - .my-sm-n3 { - margin-top: -1rem !important; - } - .mr-sm-n3, - .mx-sm-n3 { - margin-right: -1rem !important; - } - .mb-sm-n3, - .my-sm-n3 { - margin-bottom: -1rem !important; - } - .ml-sm-n3, - .mx-sm-n3 { - margin-left: -1rem !important; - } - .m-sm-n4 { - margin: -1.5rem !important; - } - .mt-sm-n4, - .my-sm-n4 { - margin-top: -1.5rem !important; - } - .mr-sm-n4, - .mx-sm-n4 { - margin-right: -1.5rem !important; - } - .mb-sm-n4, - .my-sm-n4 { - margin-bottom: -1.5rem !important; - } - .ml-sm-n4, - .mx-sm-n4 { - margin-left: -1.5rem !important; - } - .m-sm-n5 { - margin: -3rem !important; - } - .mt-sm-n5, - .my-sm-n5 { - margin-top: -3rem !important; - } - .mr-sm-n5, - .mx-sm-n5 { - margin-right: -3rem !important; - } - .mb-sm-n5, - .my-sm-n5 { - margin-bottom: -3rem !important; - } - .ml-sm-n5, - .mx-sm-n5 { - margin-left: -3rem !important; - } - .m-sm-auto { - margin: auto !important; - } - .mt-sm-auto, - .my-sm-auto { - margin-top: auto !important; - } - .mr-sm-auto, - .mx-sm-auto { - margin-right: auto !important; - } - .mb-sm-auto, - .my-sm-auto { - margin-bottom: auto !important; - } - .ml-sm-auto, - .mx-sm-auto { - margin-left: auto !important; - } -} - -@media (min-width: 768px) { - .m-md-0 { - margin: 0 !important; - } - .mt-md-0, - .my-md-0 { - margin-top: 0 !important; - } - .mr-md-0, - .mx-md-0 { - margin-right: 0 !important; - } - .mb-md-0, - .my-md-0 { - margin-bottom: 0 !important; - } - .ml-md-0, - .mx-md-0 { - margin-left: 0 !important; - } - .m-md-1 { - margin: 0.25rem !important; - } - .mt-md-1, - .my-md-1 { - margin-top: 0.25rem !important; - } - .mr-md-1, - .mx-md-1 { - margin-right: 0.25rem !important; - } - .mb-md-1, - .my-md-1 { - margin-bottom: 0.25rem !important; - } - .ml-md-1, - .mx-md-1 { - margin-left: 0.25rem !important; - } - .m-md-2 { - margin: 0.5rem !important; - } - .mt-md-2, - .my-md-2 { - margin-top: 0.5rem !important; - } - .mr-md-2, - .mx-md-2 { - margin-right: 0.5rem !important; - } - .mb-md-2, - .my-md-2 { - margin-bottom: 0.5rem !important; - } - .ml-md-2, - .mx-md-2 { - margin-left: 0.5rem !important; - } - .m-md-3 { - margin: 1rem !important; - } - .mt-md-3, - .my-md-3 { - margin-top: 1rem !important; - } - .mr-md-3, - .mx-md-3 { - margin-right: 1rem !important; - } - .mb-md-3, - .my-md-3 { - margin-bottom: 1rem !important; - } - .ml-md-3, - .mx-md-3 { - margin-left: 1rem !important; - } - .m-md-4 { - margin: 1.5rem !important; - } - .mt-md-4, - .my-md-4 { - margin-top: 1.5rem !important; - } - .mr-md-4, - .mx-md-4 { - margin-right: 1.5rem !important; - } - .mb-md-4, - .my-md-4 { - margin-bottom: 1.5rem !important; - } - .ml-md-4, - .mx-md-4 { - margin-left: 1.5rem !important; - } - .m-md-5 { - margin: 3rem !important; - } - .mt-md-5, - .my-md-5 { - margin-top: 3rem !important; - } - .mr-md-5, - .mx-md-5 { - margin-right: 3rem !important; - } - .mb-md-5, - .my-md-5 { - margin-bottom: 3rem !important; - } - .ml-md-5, - .mx-md-5 { - margin-left: 3rem !important; - } - .p-md-0 { - padding: 0 !important; - } - .pt-md-0, - .py-md-0 { - padding-top: 0 !important; - } - .pr-md-0, - .px-md-0 { - padding-right: 0 !important; - } - .pb-md-0, - .py-md-0 { - padding-bottom: 0 !important; - } - .pl-md-0, - .px-md-0 { - padding-left: 0 !important; - } - .p-md-1 { - padding: 0.25rem !important; - } - .pt-md-1, - .py-md-1 { - padding-top: 0.25rem !important; - } - .pr-md-1, - .px-md-1 { - padding-right: 0.25rem !important; - } - .pb-md-1, - .py-md-1 { - padding-bottom: 0.25rem !important; - } - .pl-md-1, - .px-md-1 { - padding-left: 0.25rem !important; - } - .p-md-2 { - padding: 0.5rem !important; - } - .pt-md-2, - .py-md-2 { - padding-top: 0.5rem !important; - } - .pr-md-2, - .px-md-2 { - padding-right: 0.5rem !important; - } - .pb-md-2, - .py-md-2 { - padding-bottom: 0.5rem !important; - } - .pl-md-2, - .px-md-2 { - padding-left: 0.5rem !important; - } - .p-md-3 { - padding: 1rem !important; - } - .pt-md-3, - .py-md-3 { - padding-top: 1rem !important; - } - .pr-md-3, - .px-md-3 { - padding-right: 1rem !important; - } - .pb-md-3, - .py-md-3 { - padding-bottom: 1rem !important; - } - .pl-md-3, - .px-md-3 { - padding-left: 1rem !important; - } - .p-md-4 { - padding: 1.5rem !important; - } - .pt-md-4, - .py-md-4 { - padding-top: 1.5rem !important; - } - .pr-md-4, - .px-md-4 { - padding-right: 1.5rem !important; - } - .pb-md-4, - .py-md-4 { - padding-bottom: 1.5rem !important; - } - .pl-md-4, - .px-md-4 { - padding-left: 1.5rem !important; - } - .p-md-5 { - padding: 3rem !important; - } - .pt-md-5, - .py-md-5 { - padding-top: 3rem !important; - } - .pr-md-5, - .px-md-5 { - padding-right: 3rem !important; - } - .pb-md-5, - .py-md-5 { - padding-bottom: 3rem !important; - } - .pl-md-5, - .px-md-5 { - padding-left: 3rem !important; - } - .m-md-n1 { - margin: -0.25rem !important; - } - .mt-md-n1, - .my-md-n1 { - margin-top: -0.25rem !important; - } - .mr-md-n1, - .mx-md-n1 { - margin-right: -0.25rem !important; - } - .mb-md-n1, - .my-md-n1 { - margin-bottom: -0.25rem !important; - } - .ml-md-n1, - .mx-md-n1 { - margin-left: -0.25rem !important; - } - .m-md-n2 { - margin: -0.5rem !important; - } - .mt-md-n2, - .my-md-n2 { - margin-top: -0.5rem !important; - } - .mr-md-n2, - .mx-md-n2 { - margin-right: -0.5rem !important; - } - .mb-md-n2, - .my-md-n2 { - margin-bottom: -0.5rem !important; - } - .ml-md-n2, - .mx-md-n2 { - margin-left: -0.5rem !important; - } - .m-md-n3 { - margin: -1rem !important; - } - .mt-md-n3, - .my-md-n3 { - margin-top: -1rem !important; - } - .mr-md-n3, - .mx-md-n3 { - margin-right: -1rem !important; - } - .mb-md-n3, - .my-md-n3 { - margin-bottom: -1rem !important; - } - .ml-md-n3, - .mx-md-n3 { - margin-left: -1rem !important; - } - .m-md-n4 { - margin: -1.5rem !important; - } - .mt-md-n4, - .my-md-n4 { - margin-top: -1.5rem !important; - } - .mr-md-n4, - .mx-md-n4 { - margin-right: -1.5rem !important; - } - .mb-md-n4, - .my-md-n4 { - margin-bottom: -1.5rem !important; - } - .ml-md-n4, - .mx-md-n4 { - margin-left: -1.5rem !important; - } - .m-md-n5 { - margin: -3rem !important; - } - .mt-md-n5, - .my-md-n5 { - margin-top: -3rem !important; - } - .mr-md-n5, - .mx-md-n5 { - margin-right: -3rem !important; - } - .mb-md-n5, - .my-md-n5 { - margin-bottom: -3rem !important; - } - .ml-md-n5, - .mx-md-n5 { - margin-left: -3rem !important; - } - .m-md-auto { - margin: auto !important; - } - .mt-md-auto, - .my-md-auto { - margin-top: auto !important; - } - .mr-md-auto, - .mx-md-auto { - margin-right: auto !important; - } - .mb-md-auto, - .my-md-auto { - margin-bottom: auto !important; - } - .ml-md-auto, - .mx-md-auto { - margin-left: auto !important; - } -} - -@media (min-width: 1100px) { - .m-lg-0 { - margin: 0 !important; - } - .mt-lg-0, - .my-lg-0 { - margin-top: 0 !important; - } - .mr-lg-0, - .mx-lg-0 { - margin-right: 0 !important; - } - .mb-lg-0, - .my-lg-0 { - margin-bottom: 0 !important; - } - .ml-lg-0, - .mx-lg-0 { - margin-left: 0 !important; - } - .m-lg-1 { - margin: 0.25rem !important; - } - .mt-lg-1, - .my-lg-1 { - margin-top: 0.25rem !important; - } - .mr-lg-1, - .mx-lg-1 { - margin-right: 0.25rem !important; - } - .mb-lg-1, - .my-lg-1 { - margin-bottom: 0.25rem !important; - } - .ml-lg-1, - .mx-lg-1 { - margin-left: 0.25rem !important; - } - .m-lg-2 { - margin: 0.5rem !important; - } - .mt-lg-2, - .my-lg-2 { - margin-top: 0.5rem !important; - } - .mr-lg-2, - .mx-lg-2 { - margin-right: 0.5rem !important; - } - .mb-lg-2, - .my-lg-2 { - margin-bottom: 0.5rem !important; - } - .ml-lg-2, - .mx-lg-2 { - margin-left: 0.5rem !important; - } - .m-lg-3 { - margin: 1rem !important; - } - .mt-lg-3, - .my-lg-3 { - margin-top: 1rem !important; - } - .mr-lg-3, - .mx-lg-3 { - margin-right: 1rem !important; - } - .mb-lg-3, - .my-lg-3 { - margin-bottom: 1rem !important; - } - .ml-lg-3, - .mx-lg-3 { - margin-left: 1rem !important; - } - .m-lg-4 { - margin: 1.5rem !important; - } - .mt-lg-4, - .my-lg-4 { - margin-top: 1.5rem !important; - } - .mr-lg-4, - .mx-lg-4 { - margin-right: 1.5rem !important; - } - .mb-lg-4, - .my-lg-4 { - margin-bottom: 1.5rem !important; - } - .ml-lg-4, - .mx-lg-4 { - margin-left: 1.5rem !important; - } - .m-lg-5 { - margin: 3rem !important; - } - .mt-lg-5, - .my-lg-5 { - margin-top: 3rem !important; - } - .mr-lg-5, - .mx-lg-5 { - margin-right: 3rem !important; - } - .mb-lg-5, - .my-lg-5 { - margin-bottom: 3rem !important; - } - .ml-lg-5, - .mx-lg-5 { - margin-left: 3rem !important; - } - .p-lg-0 { - padding: 0 !important; - } - .pt-lg-0, - .py-lg-0 { - padding-top: 0 !important; - } - .pr-lg-0, - .px-lg-0 { - padding-right: 0 !important; - } - .pb-lg-0, - .py-lg-0 { - padding-bottom: 0 !important; - } - .pl-lg-0, - .px-lg-0 { - padding-left: 0 !important; - } - .p-lg-1 { - padding: 0.25rem !important; - } - .pt-lg-1, - .py-lg-1 { - padding-top: 0.25rem !important; - } - .pr-lg-1, - .px-lg-1 { - padding-right: 0.25rem !important; - } - .pb-lg-1, - .py-lg-1 { - padding-bottom: 0.25rem !important; - } - .pl-lg-1, - .px-lg-1 { - padding-left: 0.25rem !important; - } - .p-lg-2 { - padding: 0.5rem !important; - } - .pt-lg-2, - .py-lg-2 { - padding-top: 0.5rem !important; - } - .pr-lg-2, - .px-lg-2 { - padding-right: 0.5rem !important; - } - .pb-lg-2, - .py-lg-2 { - padding-bottom: 0.5rem !important; - } - .pl-lg-2, - .px-lg-2 { - padding-left: 0.5rem !important; - } - .p-lg-3 { - padding: 1rem !important; - } - .pt-lg-3, - .py-lg-3 { - padding-top: 1rem !important; - } - .pr-lg-3, - .px-lg-3 { - padding-right: 1rem !important; - } - .pb-lg-3, - .py-lg-3 { - padding-bottom: 1rem !important; - } - .pl-lg-3, - .px-lg-3 { - padding-left: 1rem !important; - } - .p-lg-4 { - padding: 1.5rem !important; - } - .pt-lg-4, - .py-lg-4 { - padding-top: 1.5rem !important; - } - .pr-lg-4, - .px-lg-4 { - padding-right: 1.5rem !important; - } - .pb-lg-4, - .py-lg-4 { - padding-bottom: 1.5rem !important; - } - .pl-lg-4, - .px-lg-4 { - padding-left: 1.5rem !important; - } - .p-lg-5 { - padding: 3rem !important; - } - .pt-lg-5, - .py-lg-5 { - padding-top: 3rem !important; - } - .pr-lg-5, - .px-lg-5 { - padding-right: 3rem !important; - } - .pb-lg-5, - .py-lg-5 { - padding-bottom: 3rem !important; - } - .pl-lg-5, - .px-lg-5 { - padding-left: 3rem !important; - } - .m-lg-n1 { - margin: -0.25rem !important; - } - .mt-lg-n1, - .my-lg-n1 { - margin-top: -0.25rem !important; - } - .mr-lg-n1, - .mx-lg-n1 { - margin-right: -0.25rem !important; - } - .mb-lg-n1, - .my-lg-n1 { - margin-bottom: -0.25rem !important; - } - .ml-lg-n1, - .mx-lg-n1 { - margin-left: -0.25rem !important; - } - .m-lg-n2 { - margin: -0.5rem !important; - } - .mt-lg-n2, - .my-lg-n2 { - margin-top: -0.5rem !important; - } - .mr-lg-n2, - .mx-lg-n2 { - margin-right: -0.5rem !important; - } - .mb-lg-n2, - .my-lg-n2 { - margin-bottom: -0.5rem !important; - } - .ml-lg-n2, - .mx-lg-n2 { - margin-left: -0.5rem !important; - } - .m-lg-n3 { - margin: -1rem !important; - } - .mt-lg-n3, - .my-lg-n3 { - margin-top: -1rem !important; - } - .mr-lg-n3, - .mx-lg-n3 { - margin-right: -1rem !important; - } - .mb-lg-n3, - .my-lg-n3 { - margin-bottom: -1rem !important; - } - .ml-lg-n3, - .mx-lg-n3 { - margin-left: -1rem !important; - } - .m-lg-n4 { - margin: -1.5rem !important; - } - .mt-lg-n4, - .my-lg-n4 { - margin-top: -1.5rem !important; - } - .mr-lg-n4, - .mx-lg-n4 { - margin-right: -1.5rem !important; - } - .mb-lg-n4, - .my-lg-n4 { - margin-bottom: -1.5rem !important; - } - .ml-lg-n4, - .mx-lg-n4 { - margin-left: -1.5rem !important; - } - .m-lg-n5 { - margin: -3rem !important; - } - .mt-lg-n5, - .my-lg-n5 { - margin-top: -3rem !important; - } - .mr-lg-n5, - .mx-lg-n5 { - margin-right: -3rem !important; - } - .mb-lg-n5, - .my-lg-n5 { - margin-bottom: -3rem !important; - } - .ml-lg-n5, - .mx-lg-n5 { - margin-left: -3rem !important; - } - .m-lg-auto { - margin: auto !important; - } - .mt-lg-auto, - .my-lg-auto { - margin-top: auto !important; - } - .mr-lg-auto, - .mx-lg-auto { - margin-right: auto !important; - } - .mb-lg-auto, - .my-lg-auto { - margin-bottom: auto !important; - } - .ml-lg-auto, - .mx-lg-auto { - margin-left: auto !important; - } -} - -@media (min-width: 1400px) { - .m-xl-0 { - margin: 0 !important; - } - .mt-xl-0, - .my-xl-0 { - margin-top: 0 !important; - } - .mr-xl-0, - .mx-xl-0 { - margin-right: 0 !important; - } - .mb-xl-0, - .my-xl-0 { - margin-bottom: 0 !important; - } - .ml-xl-0, - .mx-xl-0 { - margin-left: 0 !important; - } - .m-xl-1 { - margin: 0.25rem !important; - } - .mt-xl-1, - .my-xl-1 { - margin-top: 0.25rem !important; - } - .mr-xl-1, - .mx-xl-1 { - margin-right: 0.25rem !important; - } - .mb-xl-1, - .my-xl-1 { - margin-bottom: 0.25rem !important; - } - .ml-xl-1, - .mx-xl-1 { - margin-left: 0.25rem !important; - } - .m-xl-2 { - margin: 0.5rem !important; - } - .mt-xl-2, - .my-xl-2 { - margin-top: 0.5rem !important; - } - .mr-xl-2, - .mx-xl-2 { - margin-right: 0.5rem !important; - } - .mb-xl-2, - .my-xl-2 { - margin-bottom: 0.5rem !important; - } - .ml-xl-2, - .mx-xl-2 { - margin-left: 0.5rem !important; - } - .m-xl-3 { - margin: 1rem !important; - } - .mt-xl-3, - .my-xl-3 { - margin-top: 1rem !important; - } - .mr-xl-3, - .mx-xl-3 { - margin-right: 1rem !important; - } - .mb-xl-3, - .my-xl-3 { - margin-bottom: 1rem !important; - } - .ml-xl-3, - .mx-xl-3 { - margin-left: 1rem !important; - } - .m-xl-4 { - margin: 1.5rem !important; - } - .mt-xl-4, - .my-xl-4 { - margin-top: 1.5rem !important; - } - .mr-xl-4, - .mx-xl-4 { - margin-right: 1.5rem !important; - } - .mb-xl-4, - .my-xl-4 { - margin-bottom: 1.5rem !important; - } - .ml-xl-4, - .mx-xl-4 { - margin-left: 1.5rem !important; - } - .m-xl-5 { - margin: 3rem !important; - } - .mt-xl-5, - .my-xl-5 { - margin-top: 3rem !important; - } - .mr-xl-5, - .mx-xl-5 { - margin-right: 3rem !important; - } - .mb-xl-5, - .my-xl-5 { - margin-bottom: 3rem !important; - } - .ml-xl-5, - .mx-xl-5 { - margin-left: 3rem !important; - } - .p-xl-0 { - padding: 0 !important; - } - .pt-xl-0, - .py-xl-0 { - padding-top: 0 !important; - } - .pr-xl-0, - .px-xl-0 { - padding-right: 0 !important; - } - .pb-xl-0, - .py-xl-0 { - padding-bottom: 0 !important; - } - .pl-xl-0, - .px-xl-0 { - padding-left: 0 !important; - } - .p-xl-1 { - padding: 0.25rem !important; - } - .pt-xl-1, - .py-xl-1 { - padding-top: 0.25rem !important; - } - .pr-xl-1, - .px-xl-1 { - padding-right: 0.25rem !important; - } - .pb-xl-1, - .py-xl-1 { - padding-bottom: 0.25rem !important; - } - .pl-xl-1, - .px-xl-1 { - padding-left: 0.25rem !important; - } - .p-xl-2 { - padding: 0.5rem !important; - } - .pt-xl-2, - .py-xl-2 { - padding-top: 0.5rem !important; - } - .pr-xl-2, - .px-xl-2 { - padding-right: 0.5rem !important; - } - .pb-xl-2, - .py-xl-2 { - padding-bottom: 0.5rem !important; - } - .pl-xl-2, - .px-xl-2 { - padding-left: 0.5rem !important; - } - .p-xl-3 { - padding: 1rem !important; - } - .pt-xl-3, - .py-xl-3 { - padding-top: 1rem !important; - } - .pr-xl-3, - .px-xl-3 { - padding-right: 1rem !important; - } - .pb-xl-3, - .py-xl-3 { - padding-bottom: 1rem !important; - } - .pl-xl-3, - .px-xl-3 { - padding-left: 1rem !important; - } - .p-xl-4 { - padding: 1.5rem !important; - } - .pt-xl-4, - .py-xl-4 { - padding-top: 1.5rem !important; - } - .pr-xl-4, - .px-xl-4 { - padding-right: 1.5rem !important; - } - .pb-xl-4, - .py-xl-4 { - padding-bottom: 1.5rem !important; - } - .pl-xl-4, - .px-xl-4 { - padding-left: 1.5rem !important; - } - .p-xl-5 { - padding: 3rem !important; - } - .pt-xl-5, - .py-xl-5 { - padding-top: 3rem !important; - } - .pr-xl-5, - .px-xl-5 { - padding-right: 3rem !important; - } - .pb-xl-5, - .py-xl-5 { - padding-bottom: 3rem !important; - } - .pl-xl-5, - .px-xl-5 { - padding-left: 3rem !important; - } - .m-xl-n1 { - margin: -0.25rem !important; - } - .mt-xl-n1, - .my-xl-n1 { - margin-top: -0.25rem !important; - } - .mr-xl-n1, - .mx-xl-n1 { - margin-right: -0.25rem !important; - } - .mb-xl-n1, - .my-xl-n1 { - margin-bottom: -0.25rem !important; - } - .ml-xl-n1, - .mx-xl-n1 { - margin-left: -0.25rem !important; - } - .m-xl-n2 { - margin: -0.5rem !important; - } - .mt-xl-n2, - .my-xl-n2 { - margin-top: -0.5rem !important; - } - .mr-xl-n2, - .mx-xl-n2 { - margin-right: -0.5rem !important; - } - .mb-xl-n2, - .my-xl-n2 { - margin-bottom: -0.5rem !important; - } - .ml-xl-n2, - .mx-xl-n2 { - margin-left: -0.5rem !important; - } - .m-xl-n3 { - margin: -1rem !important; - } - .mt-xl-n3, - .my-xl-n3 { - margin-top: -1rem !important; - } - .mr-xl-n3, - .mx-xl-n3 { - margin-right: -1rem !important; - } - .mb-xl-n3, - .my-xl-n3 { - margin-bottom: -1rem !important; - } - .ml-xl-n3, - .mx-xl-n3 { - margin-left: -1rem !important; - } - .m-xl-n4 { - margin: -1.5rem !important; - } - .mt-xl-n4, - .my-xl-n4 { - margin-top: -1.5rem !important; - } - .mr-xl-n4, - .mx-xl-n4 { - margin-right: -1.5rem !important; - } - .mb-xl-n4, - .my-xl-n4 { - margin-bottom: -1.5rem !important; - } - .ml-xl-n4, - .mx-xl-n4 { - margin-left: -1.5rem !important; - } - .m-xl-n5 { - margin: -3rem !important; - } - .mt-xl-n5, - .my-xl-n5 { - margin-top: -3rem !important; - } - .mr-xl-n5, - .mx-xl-n5 { - margin-right: -3rem !important; - } - .mb-xl-n5, - .my-xl-n5 { - margin-bottom: -3rem !important; - } - .ml-xl-n5, - .mx-xl-n5 { - margin-left: -3rem !important; - } - .m-xl-auto { - margin: auto !important; - } - .mt-xl-auto, - .my-xl-auto { - margin-top: auto !important; - } - .mr-xl-auto, - .mx-xl-auto { - margin-right: auto !important; - } - - .mb-xl-auto, - .my-xl-auto { - margin-bottom: auto !important; - } - - .ml-xl-auto, - .mx-xl-auto { - margin-left: auto !important; - } -} - -.stretched-link::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1; - pointer-events: auto; - content: ""; - background-color: rgba(0, 0, 0, 0); -} - -.text-monospace { - font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important; -} - -.text-justify { - text-align: justify !important; -} - -.text-wrap { - white-space: normal !important; -} - -.text-nowrap { - white-space: nowrap !important; -} - -.text-truncate { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.text-left { - text-align: left !important; -} - -.text-right { - text-align: right !important; -} - -.text-center { - text-align: center !important; -} - -@media (min-width: 576px) { - .text-sm-left { - text-align: left !important; - } - .text-sm-right { - text-align: right !important; - } - .text-sm-center { - text-align: center !important; - } -} - -@media (min-width: 768px) { - .text-md-left { - text-align: left !important; - } - .text-md-right { - text-align: right !important; - } - .text-md-center { - text-align: center !important; - } -} - -@media (min-width: 1100px) { - .text-lg-left { - text-align: left !important; - } - .text-lg-right { - text-align: right !important; - } - .text-lg-center { - text-align: center !important; - } -} - -@media (min-width: 1400px) { - .text-xl-left { - text-align: left !important; - } - .text-xl-right { - text-align: right !important; - } - .text-xl-center { - text-align: center !important; - } -} - -.text-lowercase { - text-transform: lowercase !important; -} - .text-uppercase, .dropdown .dropdown-menu .dropdown-header, .sidebar .sidebar-heading { text-transform: uppercase !important; } -.text-capitalize { - text-transform: capitalize !important; -} - -.font-weight-light { - font-weight: 300 !important; -} - -.font-weight-lighter { - font-weight: lighter !important; -} - -.font-weight-normal { - font-weight: 400 !important; -} - -.font-weight-bold { - font-weight: 700 !important; -} - -.font-weight-bolder { - font-weight: bolder !important; -} - -.font-italic { - font-style: italic !important; -} - -.text-white { - color: #fff !important; -} - .text-primary { color: #4e73df !important; } @@ -9709,133 +1853,15 @@ a.text-dark:hover, a.text-dark:focus { color: #858796 !important; } -.text-black-50 { - color: rgba(0, 0, 0, 0.5) !important; -} - -.text-white-50 { - color: rgba(255, 255, 255, 0.5) !important; -} - -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.text-decoration-none { - text-decoration: none !important; -} - -.text-break { - word-break: break-word !important; - word-wrap: break-word !important; -} - -.text-reset { - color: inherit !important; -} - -.visible { - visibility: visible !important; -} - -.invisible { - visibility: hidden !important; -} - @media print { - *, - *::before, - *::after { - text-shadow: none !important; - box-shadow: none !important; - } - a:not(.btn) { - text-decoration: underline; - } - abbr[title]::after { - content: " (" attr(title) ")"; - } - pre { - white-space: pre-wrap !important; - } pre, blockquote { border: 1px solid #b7b9cc; - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } - @page { - size: a3; - } - body { - min-width: 992px !important; - } - .container { - min-width: 992px !important; - } - .navbar { - display: none; - } - .badge { - border: 1px solid #000; - } - .table { - border-collapse: collapse !important; - } - .table td, - .table th { - background-color: #fff !important; } .table-bordered th, .table-bordered td { border: 1px solid #dddfeb !important; } - .table-dark { - color: inherit; - } - .table-dark th, - .table-dark td, - .table-dark thead th, - .table-dark tbody + tbody { - border-color: #dddfeb; - } - .table .thead-dark th { - color: inherit; - border-color: #dddfeb; - } -} - -html { - position: relative; - min-height: 100%; -} - -body { - height: 100%; -} - -a:focus { - outline: none; } #wrapper { @@ -9852,14 +1878,29 @@ a:focus { flex: 1 0 auto; } -.container, -.container-fluid, -.container-sm, -.container-md, -.container-lg, -.container-xl { - padding-left: 1.5rem; - padding-right: 1.5rem; +.scroll-to-top { + position: fixed; + right: 1rem; + bottom: 1rem; + display: none; + width: 2.75rem; + height: 2.75rem; + text-align: center; + color: #fff; + background: rgba(90, 92, 105, 0.5); + line-height: 46px; +} + +.scroll-to-top:focus, .scroll-to-top:hover { + color: white; +} + +.scroll-to-top:hover { + background: #5a5c69; +} + +.scroll-to-top i { + font-weight: 800; } @-webkit-keyframes growIn { @@ -10308,11 +2349,9 @@ a:focus { width: auto; right: 0; } - .topbar .dropdown-list { width: 20rem !important; } - .topbar .dropdown-list .dropdown-item .text-truncate { max-width: 13.375rem; } @@ -10533,7 +2572,6 @@ a:focus { .sidebar { width: 14rem !important; } - .sidebar .nav-item .collapse { position: relative; left: 0; @@ -10554,12 +2592,12 @@ a:focus { .sidebar .nav-item .collapsing { margin: 0 1rem; } + .sidebar .nav-item .nav-link { display: block; - width: 100%; + width: 14rem; text-align: left; padding: 1rem; - width: 14rem; } .sidebar .nav-item .nav-link i { font-size: 0.85rem; @@ -10569,7 +2607,7 @@ a:focus { font-size: 0.85rem; display: inline; } - .sidebar .nav-item .nav-link[data-toggle="collapse"]::after { + .sidebar .nav-item .nav-link[data-bs-toggle="collapse"]::after { width: 1rem; text-align: center; float: right; @@ -10579,27 +2617,22 @@ a:focus { content: '\f107'; font-family: 'Font Awesome 5 Free'; } - .sidebar .nav-item .nav-link[data-toggle="collapse"].collapsed::after { + .sidebar .nav-item .nav-link[data-bs-toggle="collapse"].collapsed::after { content: '\f105'; } - .sidebar .sidebar-brand .sidebar-brand-icon i { font-size: 2rem; } - .sidebar .sidebar-brand .sidebar-brand-text { display: inline; } - .sidebar .sidebar-heading { text-align: left; } - .sidebar.toggled { overflow: visible; width: 6.5rem !important; } - .sidebar.toggled .nav-item .collapse { position: absolute; left: calc(6.5rem + 1.5rem / 2); @@ -10612,53 +2645,42 @@ a:focus { -webkit-animation-timing-function: transform cubic-bezier(0.18, 1.25, 0.4, 1), opacity cubic-bezier(0, 1, 0.4, 1); animation-timing-function: transform cubic-bezier(0.18, 1.25, 0.4, 1), opacity cubic-bezier(0, 1, 0.4, 1); } - .sidebar.toggled .nav-item .collapse .collapse-inner { box-shadow: 0 0.15rem 1.75rem 0 rgba(58, 59, 69, 0.15); border-radius: 0.35rem; } - .sidebar.toggled .nav-item .collapsing { display: none; transition: none; } - .sidebar.toggled .nav-item .collapse, .sidebar.toggled .nav-item .collapsing { margin: 0; } - .sidebar.toggled .nav-item:last-child { margin-bottom: 1rem; } - .sidebar.toggled .nav-item .nav-link { text-align: center; padding: 0.75rem 1rem; width: 6.5rem; } - .sidebar.toggled .nav-item .nav-link span { font-size: 0.65rem; display: block; } - .sidebar.toggled .nav-item .nav-link i { margin-right: 0; } - - .sidebar.toggled .nav-item .nav-link[data-toggle="collapse"]::after { + .sidebar.toggled .nav-item .nav-link[data-bs-toggle="collapse"]::after { display: none; } - .sidebar.toggled .sidebar-brand .sidebar-brand-icon i { font-size: 2rem; } - .sidebar.toggled .sidebar-brand .sidebar-brand-text { display: none; } - .sidebar.toggled .sidebar-heading { text-align: center; } @@ -10692,7 +2714,7 @@ a:focus { color: #6e707e; } -.sidebar-light .nav-item .nav-link[data-toggle="collapse"]::after { +.sidebar-light .nav-item .nav-link[data-bs-toggle="collapse"]::after { color: #b7b9cc; } @@ -10744,7 +2766,7 @@ a:focus { color: #fff; } -.sidebar-dark .nav-item .nav-link[data-toggle="collapse"]::after { +.sidebar-dark .nav-item .nav-link[data-bs-toggle="collapse"]::after { color: rgba(255, 255, 255, 0.5); } @@ -10837,13 +2859,13 @@ a:focus { line-height: 1.5; } -.card .card-header[data-toggle="collapse"] { +.card .card-header[data-bs-toggle="collapse"] { text-decoration: none; position: relative; padding: 0.75rem 3.25rem 0.75rem 1.25rem; } -.card .card-header[data-toggle="collapse"]::after { +.card .card-header[data-bs-toggle="collapse"]::after { position: absolute; right: 0; top: 0; @@ -10855,51 +2877,14 @@ a:focus { color: #d1d3e2; } -.card .card-header[data-toggle="collapse"].collapsed { +.card .card-header[data-bs-toggle="collapse"].collapsed { border-radius: 0.35rem; } -.card .card-header[data-toggle="collapse"].collapsed::after { +.card .card-header[data-bs-toggle="collapse"].collapsed::after { content: '\f105'; } -.chart-area { - position: relative; - height: 22rem; - width: 100%; - padding: 0.5rem; - text-align: center; -} -.chart-bar { - position: relative; - height: 20rem; - width: 100%; -} - -.chart-pie { - position: relative; - height: calc(20rem - 43px); - width: 100%; -} - -.bg-login-image { - background: url("https://source.unsplash.com/K4mSJ7kc0As/600x800"); - background-position: center; - background-size: cover; -} - -.bg-register-image { - background: url("https://source.unsplash.com/Mv9hjnEUHR4/600x800"); - background-position: center; - background-size: cover; -} - -.bg-password-image { - background: url("https://source.unsplash.com/oWTW-jNGl9I/600x800"); - background-position: center; - background-size: cover; -} - form.user .custom-checkbox.small label { line-height: 1.5rem; } @@ -10908,6 +2893,7 @@ form.user .form-control-user { font-size: 0.8rem; border-radius: 10rem; padding: 1.5rem 1rem; + height: calc(1.5em + 0.75rem + 2px); } form.user .btn-user { diff --git a/Plan/src/main/resources/assets/plan/plan/web/css/style.css b/Plan/src/main/resources/assets/plan/plan/web/css/style.css index e7ab5ad75..78c8d42c4 100644 --- a/Plan/src/main/resources/assets/plan/plan/web/css/style.css +++ b/Plan/src/main/resources/assets/plan/plan/web/css/style.css @@ -1,3 +1,18 @@ +a { + text-decoration: none; +} + +hr { + background-color: transparent; + border-top: 1px solid rgba(0, 0, 0, 0.1); + opacity: 1; +} + +small, .small { + font-weight: 400; +} + + @media (max-width: 1520px) { html { font-size: 95%; @@ -18,6 +33,24 @@ background-color: rgba(255, 255, 255, 0.05); } +.table { + --bs-table-striped-color: none; +} + +.table-dark { + --bs-table-striped-bg: rgba(255, 255, 255, 0.05); + --bs-table-bg: none; +} + +.table-dark.table-bordered { + border: 0; +} + +.table th, +.table td { + padding: 0.75rem; +} + .card-body p + p { margin-top: 1rem; } @@ -35,32 +68,11 @@ width: 22% !important; } -.sidebar-close-modal { - position: absolute; - opacity: 0.7; - background-color: #000; - width: 100%; - height: 100%; - top: 0; - z-index: 1; - cursor: pointer; -} - -.hidden { - width: 0 !important; - display: none; -} - -.hidden .sidebar .sidebar-brand img { - display: none; -} - p.collapsing { display: none; } -.page-link:not(:disabled):not(.disabled), -.close:not(:disabled):not(.disabled) { +.page-link:not(:disabled):not(.disabled) { cursor: pointer; } @@ -171,12 +183,6 @@ div.scrollbar { } /* Navbar ====================================== */ -.col-red .navbar .navbar-brand, -.col-red .navbar .navbar-brand:hover, -.col-red .navbar .navbar-brand:active, -.col-red .navbar .navbar-brand:focus { - color: #fff; -} .col-red .navbar .nav > li > a:hover, .col-red .navbar .nav > li > a:focus, @@ -204,13 +210,6 @@ div.scrollbar { background-color: rgba(0, 0, 0, 0.08); } -.col-pink .navbar .navbar-brand, -.col-pink .navbar .navbar-brand:hover, -.col-pink .navbar .navbar-brand:active, -.col-pink .navbar .navbar-brand:focus { - color: #fff; -} - .col-pink .navbar .nav > li > a:hover, .col-pink .navbar .nav > li > a:focus, .col-pink .navbar .nav .open > a, @@ -237,13 +236,6 @@ div.scrollbar { background-color: rgba(0, 0, 0, 0.08); } -.col-purple .navbar .navbar-brand, -.col-purple .navbar .navbar-brand:hover, -.col-purple .navbar .navbar-brand:active, -.col-purple .navbar .navbar-brand:focus { - color: #fff; -} - .col-purple .navbar .nav > li > a:hover, .col-purple .navbar .nav > li > a:focus, .col-purple .navbar .nav .open > a, @@ -270,13 +262,6 @@ div.scrollbar { background-color: rgba(0, 0, 0, 0.08); } -.col-deep-purple .navbar .navbar-brand, -.col-deep-purple .navbar .navbar-brand:hover, -.col-deep-purple .navbar .navbar-brand:active, -.col-deep-purple .navbar .navbar-brand:focus { - color: #fff; -} - .col-deep-purple .navbar .nav > li > a:hover, .col-deep-purple .navbar .nav > li > a:focus, .col-deep-purple .navbar .nav .open > a, @@ -303,13 +288,6 @@ div.scrollbar { background-color: rgba(0, 0, 0, 0.08); } -.col-indigo .navbar .navbar-brand, -.col-indigo .navbar .navbar-brand:hover, -.col-indigo .navbar .navbar-brand:active, -.col-indigo .navbar .navbar-brand:focus { - color: #fff; -} - .col-indigo .navbar .nav > li > a:hover, .col-indigo .navbar .nav > li > a:focus, .col-indigo .navbar .nav .open > a, @@ -336,13 +314,6 @@ div.scrollbar { background-color: rgba(0, 0, 0, 0.08); } -.col-blue .navbar .navbar-brand, -.col-blue .navbar .navbar-brand:hover, -.col-blue .navbar .navbar-brand:active, -.col-blue .navbar .navbar-brand:focus { - color: #fff; -} - .col-blue .navbar .nav > li > a:hover, .col-blue .navbar .nav > li > a:focus, .col-blue .navbar .nav .open > a, @@ -369,13 +340,6 @@ div.scrollbar { background-color: rgba(0, 0, 0, 0.08); } -.col-light-blue .navbar .navbar-brand, -.col-light-blue .navbar .navbar-brand:hover, -.col-light-blue .navbar .navbar-brand:active, -.col-light-blue .navbar .navbar-brand:focus { - color: #fff; -} - .col-light-blue .navbar .nav > li > a:hover, .col-light-blue .navbar .nav > li > a:focus, .col-light-blue .navbar .nav .open > a, @@ -402,13 +366,6 @@ div.scrollbar { background-color: rgba(0, 0, 0, 0.08); } -.col-cyan .navbar .navbar-brand, -.col-cyan .navbar .navbar-brand:hover, -.col-cyan .navbar .navbar-brand:active, -.col-cyan .navbar .navbar-brand:focus { - color: #fff; -} - .col-cyan .navbar .nav > li > a:hover, .col-cyan .navbar .nav > li > a:focus, .col-cyan .navbar .nav .open > a, @@ -435,13 +392,6 @@ div.scrollbar { background-color: rgba(0, 0, 0, 0.08); } -.col-teal .navbar .navbar-brand, -.col-teal .navbar .navbar-brand:hover, -.col-teal .navbar .navbar-brand:active, -.col-teal .navbar .navbar-brand:focus { - color: #fff; -} - .col-teal .navbar .nav > li > a:hover, .col-teal .navbar .nav > li > a:focus, .col-teal .navbar .nav .open > a, @@ -468,13 +418,6 @@ div.scrollbar { background-color: rgba(0, 0, 0, 0.08); } -.col-green .navbar .navbar-brand, -.col-green .navbar .navbar-brand:hover, -.col-green .navbar .navbar-brand:active, -.col-green .navbar .navbar-brand:focus { - color: #fff; -} - .col-green .navbar .nav > li > a:hover, .col-green .navbar .nav > li > a:focus, .col-green .navbar .nav .open > a, @@ -501,13 +444,6 @@ div.scrollbar { background-color: rgba(0, 0, 0, 0.08); } -.col-light-green .navbar .navbar-brand, -.col-light-green .navbar .navbar-brand:hover, -.col-light-green .navbar .navbar-brand:active, -.col-light-green .navbar .navbar-brand:focus { - color: #fff; -} - .col-light-green .navbar .nav > li > a:hover, .col-light-green .navbar .nav > li > a:focus, .col-light-green .navbar .nav .open > a, @@ -534,13 +470,6 @@ div.scrollbar { background-color: rgba(0, 0, 0, 0.08); } -.col-lime .navbar .navbar-brand, -.col-lime .navbar .navbar-brand:hover, -.col-lime .navbar .navbar-brand:active, -.col-lime .navbar .navbar-brand:focus { - color: #fff; -} - .col-lime .navbar .nav > li > a:hover, .col-lime .navbar .nav > li > a:focus, .col-lime .navbar .nav .open > a, @@ -567,13 +496,6 @@ div.scrollbar { background-color: rgba(0, 0, 0, 0.08); } -.col-yellow .navbar .navbar-brand, -.col-yellow .navbar .navbar-brand:hover, -.col-yellow .navbar .navbar-brand:active, -.col-yellow .navbar .navbar-brand:focus { - color: #fff; -} - .col-yellow .navbar .nav > li > a:hover, .col-yellow .navbar .nav > li > a:focus, .col-yellow .navbar .nav .open > a, @@ -600,13 +522,6 @@ div.scrollbar { background-color: rgba(0, 0, 0, 0.08); } -.col-amber .navbar .navbar-brand, -.col-amber .navbar .navbar-brand:hover, -.col-amber .navbar .navbar-brand:active, -.col-amber .navbar .navbar-brand:focus { - color: #fff; -} - .col-amber .navbar .nav > li > a:hover, .col-amber .navbar .nav > li > a:focus, .col-amber .navbar .nav .open > a, @@ -633,13 +548,6 @@ div.scrollbar { background-color: rgba(0, 0, 0, 0.08); } -.col-orange .navbar .navbar-brand, -.col-orange .navbar .navbar-brand:hover, -.col-orange .navbar .navbar-brand:active, -.col-orange .navbar .navbar-brand:focus { - color: #fff; -} - .col-orange .navbar .nav > li > a:hover, .col-orange .navbar .nav > li > a:focus, .col-orange .navbar .nav .open > a, @@ -666,13 +574,6 @@ div.scrollbar { background-color: rgba(0, 0, 0, 0.08); } -.col-deep-orange .navbar .navbar-brand, -.col-deep-orange .navbar .navbar-brand:hover, -.col-deep-orange .navbar .navbar-brand:active, -.col-deep-orange .navbar .navbar-brand:focus { - color: #fff; -} - .col-deep-orange .navbar .nav > li > a:hover, .col-deep-orange .navbar .nav > li > a:focus, .col-deep-orange .navbar .nav .open > a, @@ -699,13 +600,6 @@ div.scrollbar { background-color: rgba(0, 0, 0, 0.08); } -.col-brown .navbar .navbar-brand, -.col-brown .navbar .navbar-brand:hover, -.col-brown .navbar .navbar-brand:active, -.col-brown .navbar .navbar-brand:focus { - color: #fff; -} - .col-brown .navbar .nav > li > a:hover, .col-brown .navbar .nav > li > a:focus, .col-brown .navbar .nav .open > a, @@ -732,13 +626,6 @@ div.scrollbar { background-color: rgba(0, 0, 0, 0.08); } -.col-grey .navbar .navbar-brand, -.col-grey .navbar .navbar-brand:hover, -.col-grey .navbar .navbar-brand:active, -.col-grey .navbar .navbar-brand:focus { - color: #fff; -} - .col-grey .navbar .nav > li > a:hover, .col-grey .navbar .nav > li > a:focus, .col-grey .navbar .nav .open > a, @@ -765,13 +652,6 @@ div.scrollbar { background-color: rgba(0, 0, 0, 0.08); } -.col-blue-grey .navbar .navbar-brand, -.col-blue-grey .navbar .navbar-brand:hover, -.col-blue-grey .navbar .navbar-brand:active, -.col-blue-grey .navbar .navbar-brand:focus { - color: #fff; -} - .col-blue-grey .navbar .nav > li > a:hover, .col-blue-grey .navbar .nav > li > a:focus, .col-blue-grey .navbar .nav .open > a, @@ -798,13 +678,6 @@ div.scrollbar { background-color: rgba(0, 0, 0, 0.08); } -.col-black .navbar .navbar-brand, -.col-black .navbar .navbar-brand:hover, -.col-black .navbar .navbar-brand:active, -.col-black .navbar .navbar-brand:focus { - color: #fff; -} - .col-black .navbar .nav > li > a:hover, .col-black .navbar .nav > li > a:focus, .col-black .navbar .nav .open > a, @@ -831,13 +704,6 @@ div.scrollbar { background-color: rgba(0, 0, 0, 0.08); } -.col-white .navbar .navbar-brand, -.col-white .navbar .navbar-brand:hover, -.col-white .navbar .navbar-brand:active, -.col-white .navbar .navbar-brand:focus { - color: #fff; -} - .col-white .navbar .nav > li > a:hover, .col-white .navbar .nav > li > a:focus, .col-white .navbar .nav .open > a, @@ -889,7 +755,7 @@ div#navSrvContainer::-webkit-scrollbar-thumb { -webkit-box-shadow: inset -1px -1px 0px rgba(0, 0, 0, 0.05), inset 1px 1px 0px rgba(0, 0, 0, 0.05); } -.bg-gradient { +.plan-bg-gradient { background: rgba(0, 0, 0, 0) linear-gradient(180deg, rgba(0, 0, 0, 0) 20%, rgba(0, 0, 0, 0.2) 100%); } @@ -1064,6 +930,7 @@ div#navSrvContainer::-webkit-scrollbar-thumb { .bg-teal-outline { border-color: #009688; border-style: solid; + border-width: 3px; outline: #009688 solid 1px; } @@ -1381,4 +1248,9 @@ body.sidebar-hidden .navbar-nav { .sidebar .nav-item .collapse { z-index: 2; +} + +.container, .container-fluid, .container-sm, .container-md, .container-lg, .container-xl { + padding-left: 1.5rem; + padding-right: 1.5rem; } \ No newline at end of file diff --git a/Plan/src/main/resources/assets/plan/plan/web/error.html b/Plan/src/main/resources/assets/plan/plan/web/error.html index 53403704b..eeb345bfd 100644 --- a/Plan/src/main/resources/assets/plan/plan/web/error.html +++ b/Plan/src/main/resources/assets/plan/plan/web/error.html @@ -4,7 +4,6 @@ - @@ -18,6 +17,9 @@ rel="stylesheet"> + @@ -45,18 +47,18 @@ -
- - Logout
-
+
${version}
@@ -98,9 +100,7 @@
@@ -163,9 +163,7 @@ - + @@ -220,7 +218,7 @@ @@ -230,10 +228,12 @@ - - + crossorigin="anonymous"> + diff --git a/Plan/src/main/resources/assets/plan/plan/web/js/color-selector.js b/Plan/src/main/resources/assets/plan/plan/web/js/color-selector.js index 3fcf12de6..43cc5bde9 100644 --- a/Plan/src/main/resources/assets/plan/plan/web/js/color-selector.js +++ b/Plan/src/main/resources/assets/plan/plan/web/js/color-selector.js @@ -150,16 +150,16 @@ `.bg-lime {background-color: ${lime};color: #eee8d5;}` + `.bg-yellow {background-color: ${yellow};color: #eee8d5;}` + `.bg-amber {background-color: ${amber};color: #eee8d5;}` + - `.badge-warning {background-color: ${warningColor};color: #eee8d5;}` + + `.bg-warning {background-color: ${warningColor};color: #eee8d5;}` + `.bg-orange {background-color: ${orange};color: #eee8d5;}` + `.bg-deep-orange {background-color: ${deepOrange};color: #eee8d5;}` + - `.badge-danger {background-color: ${dangerColor};color: #eee8d5;}` + + `.bg-danger {background-color: ${dangerColor};color: #eee8d5;}` + `.bg-brown {background-color: ${brown};color: #eee8d5;}` + `.bg-grey {background-color: ${grey};color: #eee8d5;}` + `.bg-blue-grey {background-color: ${blueGrey};color: #eee8d5;}` + `.bg-black {background-color: ${black};color: #eee8d5;}` + `.bg-plan,.page-item.active .page-link {background-color: ${planColor};color: #eee8d5;}` + - `.badge-success {background-color: ${successColor};color: #eee8d5;}` + + `.bg-success {background-color: ${successColor};color: #eee8d5;}` + `.bg-night {background-color: #44475a;color: #eee8d5;}` + `.bg-red-outline {outline-color: ${red};border-color: ${red};}` + `.bg-pink-outline {outline-color: ${pink};border-color: ${pink};}` + @@ -215,16 +215,18 @@ '.card,.bg-white,.modal-content,.page-loader,.nav-tabs .nav-link:hover,.nav-tabs,hr,form .btn, .btn-outline-secondary{background-color:#44475a!important;border-color:#6272a4!important;}' + '.bg-white.collapse-inner {border:1px solid;}' + '.card-header {background-color:#44475a;border-color:#6272a4;}' + - '#content,.col-black,.text-gray-900,.text-gray-800,.collapse-item,.modal-title,.modal-body,.page-loader,.close,.fc-title,.fc-time,pre,.table-dark,input::placeholder{color:#eee8d5 !important;}' + + '#content,.col-black,.text-gray-900,.text-gray-800,.collapse-item,.modal-title,.modal-body,.page-loader,.fc-title,.fc-time,pre,.table-dark,input::placeholder{color:#eee8d5 !important;}' + '.collapse-item:hover,.nav-link.active {background-color: #606270 !important;}' + '.nav-tabs .nav-link.active {background-color: #44475a !important;border-color:#6272a4 #6272a4 #44475a !important;}' + '.fc-today {background:#646e8c !important}' + '.fc-popover-body,.fc-popover-header{background-color: #44475a !important;color: #eee8d5 !important;}' + - 'select,input,.dataTables_paginate .page-item:not(.active) a,.input-group-prepend > * {background-color:#44475a !important;border-color:#6272a4 !important;color: #eee8d5 !important;}' + + 'select,input,.dataTables_paginate .page-item:not(.active) a,.input-group-text,.input-group-text > * {background-color:#44475a !important;border-color:#6272a4 !important;color: #eee8d5 !important;}' + nightModeColors + ''); // Turn bright tables to dark $('.table').addClass('table-dark'); + // Turn modal close buttons light + document.querySelectorAll('button.btn-close').forEach(element => { element.classList.add('btn-close-white'); }) // Sidebar is grey when in night mode disableColorSetters(); setColor('night'); @@ -233,6 +235,8 @@ $('#nightmode').remove(); // Turn dark tables bright again $('.table').removeClass('table-dark'); + // Turn modal close buttons dark + document.querySelectorAll('button.btn-close').forEach(element => { element.classList.remove('btn-close-white'); }) // Sidebar is colorful enableColorSetters(); setColor(window.localStorage.getItem('themeColor')); diff --git a/Plan/src/main/resources/assets/plan/plan/web/js/filters.js b/Plan/src/main/resources/assets/plan/plan/web/js/filters.js index 5bdf168e3..20624c443 100644 --- a/Plan/src/main/resources/assets/plan/plan/web/js/filters.js +++ b/Plan/src/main/resources/assets/plan/plan/web/js/filters.js @@ -25,18 +25,25 @@ class MultipleChoiceFilter extends Filter { render(filterCount) { const select = filterCount === 0 ? "of Players who " : "and "; let html = - `
-
- - - `; for (const option of this.options.options) { html += ``; } - html += `
`; + html += + ` + +
+ +
+ + `; return html; } @@ -119,50 +126,51 @@ class BetweenDateFilter extends Filter { const select = filterCount === 0 ? "of Players who " : "and "; return ( `
- -
-
-
-
+ +
+
+
+
-
+
-
-
-
+
+
+
-
+
-
- +
+
-
-
-
+
+
+
-
+
-
-
-
+
+
+
-
+
- +
` ); diff --git a/Plan/src/main/resources/assets/plan/plan/web/js/graphs.js b/Plan/src/main/resources/assets/plan/plan/web/js/graphs.js index 43dd21199..3f3eda04d 100644 --- a/Plan/src/main/resources/assets/plan/plan/web/js/graphs.js +++ b/Plan/src/main/resources/assets/plan/plan/web/js/graphs.js @@ -220,7 +220,7 @@ function mapToDataSeries(performanceData) { } function performanceChart(id, playersOnlineSeries, tpsSeries, cpuSeries, ramSeries, entitySeries, chunkSeries) { - graphs.push(Highcharts.stockChart(id, { + const chart = Highcharts.stockChart(id, { rangeSelector: { selected: 2, buttons: linegraphButtons @@ -270,7 +270,23 @@ function performanceChart(id, playersOnlineSeries, tpsSeries, cpuSeries, ramSeri enabled: true }, series: [playersOnlineSeries, tpsSeries, cpuSeries, ramSeries, entitySeries, chunkSeries] - })); + }); + + function toggleLabels() { + if (!chart || !chart.yAxis || !chart.yAxis.length) return; + const newWidth = $(window).width(); + chart.yAxis[0].update({labels: {enabled: newWidth >= 900}}); + chart.yAxis[1].update({labels: {enabled: newWidth >= 900}}); + chart.yAxis[2].update({labels: {enabled: newWidth >= 1000}}); + chart.yAxis[3].update({labels: {enabled: newWidth >= 1000}}); + chart.yAxis[4].update({labels: {enabled: newWidth >= 1400}}); + chart.yAxis[5].update({labels: {enabled: newWidth >= 1400}}); + } + + $(window).resize(toggleLabels); + toggleLabels(); + + graphs.push(chart); } function playersChart(id, playersOnlineSeries, sel) { diff --git a/Plan/src/main/resources/assets/plan/plan/web/js/network-values.js b/Plan/src/main/resources/assets/plan/plan/web/js/network-values.js index c5946b543..3360fb5d6 100644 --- a/Plan/src/main/resources/assets/plan/plan/web/js/network-values.js +++ b/Plan/src/main/resources/assets/plan/plan/web/js/network-values.js @@ -1,8 +1,8 @@ -const trend_up_good = " "; -const trend_up_bad = " "; -const trend_down_bad = " "; -const trend_down_good = " "; -const trend_same = " "; +const trend_up_good = " "; +const trend_up_bad = " "; +const trend_down_bad = " "; +const trend_down_good = " "; +const trend_same = " "; const trend_end = ""; @@ -276,19 +276,19 @@ function addserverToNav(server) { function createnetworkserverBox(i, server) { return `
-
+
${server.name}
-

Registered Players${server.players}

-

Players Online${server.online}

+

Registered Players${server.players}

+

Players Online${server.online}

- + Server Analysis -
@@ -373,7 +373,8 @@ function loadHourlyUniqueAndNewGraph(json, error) { } } -function loadServerPie(json, error) { +// Lowercase due to locale translation: Server +function loadserverPie(json, error) { if (json) { serverPieSeries = { name: 'Server Playtime', diff --git a/Plan/src/main/resources/assets/plan/plan/web/js/player-values.js b/Plan/src/main/resources/assets/plan/plan/web/js/player-values.js index d6fdda633..7c1af3aae 100644 --- a/Plan/src/main/resources/assets/plan/plan/web/js/player-values.js +++ b/Plan/src/main/resources/assets/plan/plan/web/js/player-values.js @@ -197,7 +197,7 @@ function onOpenserver(i, servers) { // Lowercase due to locale translation: Server function createserverAccordionTitle(i, server) { - return '' + return '' + server.server_name + (server.operator ? ' ' : '') + (server.banned ? ' ' : '') + @@ -217,15 +217,15 @@ function createserverAccordionBody(i, server) { (server.operator ? `

Operator

` : ``) + (server.banned ? `

Banned

` : ``) + (server.operator || server.banned ? `
` : ``) + - `

Sessions` + server.session_count + `

` + - `

Playtime` + server.playtime + `

` + - `

AFK Time` + server.afk_time + `

` + - `

Longest Session` + server.longest_session_length + `

` + - `

Session Median` + server.session_median + `

` + + `

Sessions` + server.session_count + `

` + + `

Playtime` + server.playtime + `

` + + `

AFK Time` + server.afk_time + `

` + + `

Longest Session` + server.longest_session_length + `

` + + `

Session Median` + server.session_median + `

` + `
` + - `

Player Kills` + server.player_kills + `

` + - `

Mob Kills` + server.mob_kills + `

` + - `

Deaths` + server.deaths + `

` + + `

Player Kills` + server.player_kills + `

` + + `

Mob Kills` + server.mob_kills + `

` + + `

Deaths` + server.deaths + `

` + `
` + `
` + `
` + diff --git a/Plan/src/main/resources/assets/plan/plan/web/js/query.js b/Plan/src/main/resources/assets/plan/plan/web/js/query.js index 1452d9ca2..90a5cc410 100644 --- a/Plan/src/main/resources/assets/plan/plan/web/js/query.js +++ b/Plan/src/main/resources/assets/plan/plan/web/js/query.js @@ -349,6 +349,11 @@ function displayResults(json) { data: json.data.players.data, order: [[5, "desc"]] }); + + if (nightmode) { + document.querySelector('.table').classList.add('table-dark'); + } + const activityIndexHeader = document.querySelector("#DataTables_Table_0 thead th:nth-of-type(2)"); const lastSeenHeader = document.querySelector("#DataTables_Table_0 thead th:nth-of-type(6)"); activityIndexHeader.innerHTML += ` (${json.view.beforeDate})` @@ -417,17 +422,15 @@ function displayDataResultScreen(resultCount, view) {
-
View: ${afterDate} - ${beforeDate}
-
- - - - -
Loading..
-
+ + + + +
Loading..
@@ -436,7 +439,7 @@ function displayDataResultScreen(resultCount, view) {
-
Activity of matched players
@@ -446,7 +449,7 @@ function displayDataResultScreen(resultCount, view) {
-
Activity on
@@ -459,29 +462,29 @@ function displayDataResultScreen(resultCount, view) {
-
Sessions within view
+
Sessions within view

Sessions

+ class="float-end">

Average Sessions / Player

+ class="float-end">

Average Session Length

+ class="float-end" id="data_average_session_length">


Playtime

+ class="float-end" id="data_total_playtime">

Active Playtime

+ class="float-end" id="data_total_active_playtime">

AFK Time

+ class="float-end" id="data_total_afk_playtime">


Average Playtime / Player

+ class="float-end" id="data_average_playtime">

Average Active Playtime / Player

+ class="float-end" id="data_average_active_playtime">

Average AFK Time / Player

+ class="float-end" id="data_average_afk_playtime">

@@ -489,7 +492,7 @@ function displayDataResultScreen(resultCount, view) {
-
Geolocations
diff --git a/Plan/src/main/resources/assets/plan/plan/web/js/sb-admin-2.js b/Plan/src/main/resources/assets/plan/plan/web/js/sb-admin-2.js index 5f34fe023..45668c7ee 100644 --- a/Plan/src/main/resources/assets/plan/plan/web/js/sb-admin-2.js +++ b/Plan/src/main/resources/assets/plan/plan/web/js/sb-admin-2.js @@ -37,7 +37,14 @@ function openPage() { if (uriHash.length > 1) { const bootstrapTabId = uriHash[1]; - $('a[href="#' + bootstrapTabId + '"]').tab('show'); + let tab = document.querySelector('a[href="#' + bootstrapTabId + '"]'); + let tabInstance = bootstrap.Tab.getInstance(tab); + + if (tabInstance) { // show tab if it has been instantiated + tabInstance.show(); + } else { // create new Tab object and show the tab + new bootstrap.Tab(tab).show(); + } } } @@ -97,7 +104,10 @@ function reduceSidebar() { if (!isModalCloserHidden) closeModal.classList.add('hidden'); // Close any open menu accordions when window is resized - $('.sidebar .collapse').collapse('hide'); + document.querySelectorAll('.sidebar .collapse').forEach(element => { + let elCollapse = bootstrap.Collapse.getInstance(element); + if (elCollapse) { elCollapse.hide(); } + }) } else if ($(window).width() > 1400 && isSidebarHidden) { body.classList.remove('sidebar-hidden'); if (!isModalCloserHidden) closeModal.classList.add('hidden'); @@ -110,7 +120,11 @@ $(window).resize(reduceSidebar); function toggleSidebar() { document.querySelector('body').classList.toggle('sidebar-hidden'); - $('.sidebar .collapse').collapse('hide'); + // Close any open menu accordions + document.querySelectorAll('.sidebar .collapse').forEach(element => { + let elCollapse = bootstrap.Collapse.getInstance(element); + if (elCollapse) { elCollapse.hide(); } + }) const closeModal = document.querySelector('.sidebar-close-modal'); if ($(window).width() < 900) { diff --git a/Plan/src/main/resources/assets/plan/plan/web/js/server-values.js b/Plan/src/main/resources/assets/plan/plan/web/js/server-values.js index 47d61386c..62cadcea6 100644 --- a/Plan/src/main/resources/assets/plan/plan/web/js/server-values.js +++ b/Plan/src/main/resources/assets/plan/plan/web/js/server-values.js @@ -1,8 +1,8 @@ -const trend_up_good = " "; -const trend_up_bad = " "; -const trend_down_bad = " "; -const trend_down_good = " "; -const trend_same = " "; +const trend_up_good = " "; +const trend_up_bad = " "; +const trend_down_bad = " "; +const trend_down_good = " "; +const trend_same = " "; const trend_end = ""; @@ -47,6 +47,7 @@ function displayError(element, error) { } /* This function loads Server Overview tab */ +// Lowercase due to locale translation: Server function loadserverOverviewValues(json, error) { const tab = document.getElementById('server-overview'); diff --git a/Plan/src/main/resources/assets/plan/plan/web/js/sessionAccordion.js b/Plan/src/main/resources/assets/plan/plan/web/js/sessionAccordion.js index 88120eb81..fb7e72c2b 100644 --- a/Plan/src/main/resources/assets/plan/plan/web/js/sessionAccordion.js +++ b/Plan/src/main/resources/assets/plan/plan/web/js/sessionAccordion.js @@ -67,7 +67,7 @@ function loadPlayerdeaths(json, error) { function createAccordionTitle(i, session) { let style = session.start.includes("Online") ? 'bg-teal' : 'bg-teal-outline'; return ` + class="clickable collapsed ${style}" data-bs-target="#session_t_${i}" data-bs-toggle="collapse"> ${session.name}${session.first_session ? ` ` : ``} ${session.start}${session.length} ${session.network_server ? session.network_server : session.most_used_world} @@ -79,24 +79,24 @@ function createAccordionBody(i, session) {
-

Ended${session.end}

-

Length${session.length}

-

AFK Time${session.afk_time}

-

Server${session.server_name}

- ${session.avg_ping ? `

Average Ping` + session.avg_ping + `

` : ``} +

Ended${session.end}

+

Length${session.length}

+

AFK Time${session.afk_time}

+

Server${session.server_name}

+ ${session.avg_ping ? `

Average Ping` + session.avg_ping + `

` : ``}
-

Player Kills${session.player_kills.length}

-

Mob Kills${session.mob_kills}

-

Deaths${session.deaths}

+

Player Kills${session.player_kills.length}

+

Mob Kills${session.mob_kills}

+

Deaths${session.deaths}


${createKillsTable(session.player_kills)}
diff --git a/Plan/src/main/resources/assets/plan/plan/web/login.html b/Plan/src/main/resources/assets/plan/plan/web/login.html index 24b4e4118..53e3f0db1 100644 --- a/Plan/src/main/resources/assets/plan/plan/web/login.html +++ b/Plan/src/main/resources/assets/plan/plan/web/login.html @@ -4,7 +4,6 @@ - @@ -18,12 +17,15 @@ rel="stylesheet"> + - + - + crossorigin="anonymous"> + @@ -235,8 +235,6 @@ errorElement.innerText = message; errorElement.classList.remove('hidden'); } - - document.getElementById('forgot-button').addEventListener('click', () => $('#forgotModal').modal()); diff --git a/Plan/src/main/resources/assets/plan/plan/web/network.html b/Plan/src/main/resources/assets/plan/plan/web/network.html index 030ef9a83..a5a726040 100644 --- a/Plan/src/main/resources/assets/plan/plan/web/network.html +++ b/Plan/src/main/resources/assets/plan/plan/web/network.html @@ -4,7 +4,6 @@ - @@ -20,6 +19,9 @@ rel="stylesheet"> + @@ -60,8 +62,8 @@
-
- - Logout
-
+
${version}
@@ -168,18 +170,18 @@ @@ -210,24 +212,24 @@
-
Players
+
Players

Last 24 hours

Unique Players

+ class="float-end">

New Players

+ class="float-end">

Last 7 days

Unique Players

+ class="float-end">

New Players

+ class="float-end">

Last 30 days

Unique Players

+ class="float-end">

New Players

+ class="float-end">

@@ -238,7 +240,7 @@
-
+
Network as Numbers

Total Players

+ class="float-end">

Regular Players

+ class="float-end">

Players Online

+ class="float-end">


Last Peak: Players

Best Peak: Players


Total Playtime

+ class="float-end" id="data_playtime">

Average Playtime / Player

+ class="float-end" id="data_player_playtime">

Average Session Length

+ class="float-end" id="data_session_length_avg">

Sessions

+ class="float-end">

@@ -278,7 +280,7 @@
-
+
Week Comparison
@@ -360,7 +362,7 @@
-
  Online Activity (30 days)
@@ -369,32 +371,32 @@
-
  as Numbers

Last Peak: Players

Best Peak: Players


Last 7 days

Unique Players

+ class="float-end">

New Players

+ class="float-end">

Average TPS

+ class="float-end">

Low TPS Spikes

+ class="float-end">

Downtime

+ class="float-end" id="data_downtime">

@@ -420,9 +422,9 @@
-
- Recent Sessions Click to expand
@@ -444,7 +446,7 @@
-
Server Playtime for 30 days
@@ -453,15 +455,15 @@
-
Insights for 30 days

Playtime

+ class="float-end" id="data_total_playtime">

AFK Time ( ()

@@ -488,7 +490,7 @@
-
Playerbase development
@@ -500,7 +502,7 @@
-
Current Playerbase
@@ -515,7 +517,7 @@
-
Trends for 30 days
@@ -594,7 +596,7 @@
-
Insights for 30 days
@@ -602,14 +604,14 @@

New Regular

Regular Inactive

-

Comparing 30d ago to Now

@@ -619,7 +621,7 @@
-
+
Join Addresses
@@ -650,7 +652,7 @@
-
Geolocations
@@ -674,7 +676,7 @@
-
Connection Information
@@ -710,9 +712,7 @@
@@ -775,9 +775,7 @@ - +
@@ -831,7 +829,7 @@
@@ -841,10 +839,12 @@ - - + crossorigin="anonymous"> + @@ -855,6 +855,7 @@ + @@ -923,7 +924,7 @@ refreshingJsonRequest("./v1/graph?type=playersOnline&server=${serverUUID}", loadPlayersOnlineGraph, 'network-overview', true); refreshingJsonRequest("./v1/graph?type=uniqueAndNew", loadUniqueAndNewGraph, 'network-overview'); refreshingJsonRequest("./v1/graph?type=hourlyUniqueAndNew", loadHourlyUniqueAndNewGraph, 'network-overview'); - refreshingJsonRequest("./v1/graph?type=serverPie", loadServerPie, 'sessions-overview'); + refreshingJsonRequest("./v1/graph?type=serverPie", loadserverPie, 'sessions-overview'); refreshingJsonRequest("./v1/graph?type=joinAddressPie", loadJoinAddressPie, 'playerbase-overview'); refreshingJsonRequest("./v1/graph?type=activity", loadActivityGraphs, 'playerbase-overview'); refreshingJsonRequest("./v1/graph?type=geolocation", loadGeolocationGraph, 'geolocations'); diff --git a/Plan/src/main/resources/assets/plan/plan/web/player.html b/Plan/src/main/resources/assets/plan/plan/web/player.html index 36e0f9e1a..0b4ab0da3 100644 --- a/Plan/src/main/resources/assets/plan/plan/web/player.html +++ b/Plan/src/main/resources/assets/plan/plan/web/player.html @@ -4,7 +4,6 @@ - @@ -20,6 +19,9 @@ rel="stylesheet"> + @@ -80,7 +82,7 @@
-
+
Seen Nicknames
@@ -219,7 +221,7 @@
-
+
Connection information
@@ -240,7 +242,7 @@
-
+
Punchcard
@@ -249,7 +251,7 @@
-
Online Activity
@@ -323,7 +325,7 @@
-
Session Calendar
@@ -334,9 +336,9 @@
-
- Recent Sessions Click to expand
@@ -359,7 +361,7 @@
-
World Playtime
@@ -384,7 +386,7 @@
-
PvP & PvE as Numbers
@@ -452,17 +454,17 @@
-
Insights

Deadliest PvP Weapon -

+

2nd PvP Weapon -

+

3rd PvP Weapon -

+

@@ -473,7 +475,7 @@
-
Recent PvP Kills
@@ -484,7 +486,7 @@
-
Recent PvP Deaths
@@ -509,9 +511,9 @@
-
- Servers + Servers Click to expand
@@ -533,7 +535,7 @@
-
Server Playtime
@@ -556,9 +558,7 @@
@@ -621,9 +621,7 @@ - +
@@ -678,7 +676,7 @@
@@ -688,10 +686,12 @@ - - + crossorigin="anonymous"> + @@ -703,6 +703,7 @@ + diff --git a/Plan/src/main/resources/assets/plan/plan/web/players.html b/Plan/src/main/resources/assets/plan/plan/web/players.html index 1b51e8bc8..2f24e0853 100644 --- a/Plan/src/main/resources/assets/plan/plan/web/players.html +++ b/Plan/src/main/resources/assets/plan/plan/web/players.html @@ -4,7 +4,6 @@ - @@ -18,6 +17,9 @@ rel="stylesheet"> + @@ -58,18 +60,18 @@
-
- - Logout
-
+
${version}
@@ -100,17 +102,15 @@
-
Player List
-
-
- - - -
Loading..
-
+ + + + +
Loading..
@@ -128,9 +128,7 @@
@@ -193,9 +191,7 @@ - +
@@ -250,7 +246,7 @@
@@ -260,10 +256,12 @@ - - + crossorigin="anonymous"> + @@ -282,7 +280,7 @@ if (playersTableJson) { if (table) { table.destroy(); - $('.player-table').replaceWith(` + $('.player-table').replaceWith(`
diff --git a/Plan/src/main/resources/assets/plan/plan/web/query.html b/Plan/src/main/resources/assets/plan/plan/web/query.html index 50ff328a0..24e3bc202 100644 --- a/Plan/src/main/resources/assets/plan/plan/web/query.html +++ b/Plan/src/main/resources/assets/plan/plan/web/query.html @@ -4,7 +4,6 @@ - @@ -17,6 +16,9 @@ rel="stylesheet"> + @@ -50,18 +52,18 @@ -
- - Logout
-
+
${version}
@@ -89,53 +91,45 @@ Failed
-
-
- +
+
+
-
- -
-
-
-
+
+ +
+
-
- -
-
-
-
+
+ +
+
-
- +
+
-
-
-
-
-
+
+
+
-
-
-
-
-
+
+
+
@@ -245,9 +237,7 @@ - +
@@ -301,7 +291,7 @@
@@ -309,10 +299,12 @@ - - + crossorigin="anonymous"> + @@ -338,9 +330,7 @@ const element = document.createElement('div'); element.classList.add("alert", "alert-danger", "alert-dismissable", "show"); element.innerHTML = ` - ` + ` return element; }); document.getElementById('error-text').innerText = new URLSearchParams(location.search).get("error"); diff --git a/Plan/src/main/resources/assets/plan/plan/web/register.html b/Plan/src/main/resources/assets/plan/plan/web/register.html index 56531c7d0..8f79a7100 100644 --- a/Plan/src/main/resources/assets/plan/plan/web/register.html +++ b/Plan/src/main/resources/assets/plan/plan/web/register.html @@ -4,7 +4,6 @@ - @@ -18,18 +17,21 @@ rel="stylesheet"> + - +
-
- logo +
+ logo
@@ -46,22 +48,22 @@ Failed
-
+
- +
Username can be up to 50 characters. - +
-
+
- +
Password should be more than 8 characters, but there are no limitations. - +
- + Register @@ -70,7 +72,7 @@ Already have an account? Login!
- @@ -94,9 +96,7 @@ - +
- - + crossorigin="anonymous"> + diff --git a/Plan/src/main/resources/assets/plan/plan/web/server.html b/Plan/src/main/resources/assets/plan/plan/web/server.html index b78af9046..fec32c691 100644 --- a/Plan/src/main/resources/assets/plan/plan/web/server.html +++ b/Plan/src/main/resources/assets/plan/plan/web/server.html @@ -3,7 +3,6 @@ - @@ -19,6 +18,9 @@ rel="stylesheet"> + @@ -60,8 +62,8 @@
-
- - Logout
-
+
${version}
@@ -173,7 +175,7 @@
-
Online Activity
@@ -185,25 +187,25 @@
-
Last 7 days
+
Last 7 days

Unique Players

+ class="float-end">

Unique Players / Day

+ class="float-end">

New Players

+ class="float-end">

New Player Retention -   


Average TPS

+ class="float-end">

Low TPS Spikes

+ class="float-end">

Downtime

+ class="float-end" id="data_downtime">

@@ -214,39 +216,39 @@
-
+
Server as Numbers

Total Players

+ class="float-end">

Regular Players

+ class="float-end">

Players Online

+ class="float-end">


Last Peak: Players

Best Peak: Players


Total Playtime

+ class="float-end" id="data_playtime">

Average Playtime / Player

+ class="float-end" id="data_player_playtime">

Sessions

+ class="float-end">


Player Kills

+ class="float-end">

Mob Kills

+ class="float-end">

Deaths

+ class="float-end">

@@ -255,7 +257,7 @@
-
Week Comparison
@@ -351,24 +353,24 @@
Loading..
- - - -
Loading..
-
+ + + + +
Loading..
@@ -938,7 +938,7 @@
-
Geolocations
@@ -962,7 +962,7 @@
-
Connection Information
@@ -1006,36 +1006,36 @@ @@ -1165,15 +1165,15 @@

During Low TPS Spikes:

Average Players

+ class="float-end">

Average Entities

+ class="float-end">

Average Chunks

+ class="float-end">

Average CPU

+ class="float-end">

Average TPS

+ class="float-end">

@@ -1194,9 +1194,7 @@
@@ -1259,9 +1257,7 @@ - +
@@ -1316,7 +1312,7 @@ @@ -1326,10 +1322,12 @@ - - + crossorigin="anonymous"> + @@ -1343,6 +1341,7 @@ + @@ -1418,7 +1417,7 @@ if (json) { if (table) { table.destroy(); - $('.player-table').replaceWith(` + $('.player-table').replaceWith(`
diff --git a/Plan/src/main/resources/assets/plan/plan/web/vendor/bootstrap/js/bootstrap.bundle.js b/Plan/src/main/resources/assets/plan/plan/web/vendor/bootstrap/js/bootstrap.bundle.js deleted file mode 100644 index 897e31130..000000000 --- a/Plan/src/main/resources/assets/plan/plan/web/vendor/bootstrap/js/bootstrap.bundle.js +++ /dev/null @@ -1,6817 +0,0 @@ -/*! - * Bootstrap v4.2.1 (https://getbootstrap.com/) - * Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery')) : - typeof define === 'function' && define.amd ? define(['exports', 'jquery'], factory) : - (factory((global.bootstrap = {}), global.jQuery)); -}(this, (function (exports, $) { - 'use strict'; - - $ = $ && $.hasOwnProperty('default') ? $['default'] : $; - - function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - return Constructor; - } - - function _defineProperty(obj, key, value) { - if (key in obj) { - Object.defineProperty(obj, key, { - value: value, - enumerable: true, - configurable: true, - writable: true - }); - } else { - obj[key] = value; - } - - return obj; - } - - function _objectSpread(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i] != null ? arguments[i] : {}; - var ownKeys = Object.keys(source); - - if (typeof Object.getOwnPropertySymbols === 'function') { - ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { - return Object.getOwnPropertyDescriptor(source, sym).enumerable; - })); - } - - ownKeys.forEach(function (key) { - _defineProperty(target, key, source[key]); - }); - } - - return target; - } - - function _inheritsLoose(subClass, superClass) { - subClass.prototype = Object.create(superClass.prototype); - subClass.prototype.constructor = subClass; - subClass.__proto__ = superClass; - } - - /** - * -------------------------------------------------------------------------- - * Bootstrap (v4.2.1): util.js - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * -------------------------------------------------------------------------- - */ - /** - * ------------------------------------------------------------------------ - * Private TransitionEnd Helpers - * ------------------------------------------------------------------------ - */ - - var TRANSITION_END = 'transitionend'; - var MAX_UID = 1000000; - var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp) - - function toType(obj) { - return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase(); - } - - function getSpecialTransitionEndEvent() { - return { - bindType: TRANSITION_END, - delegateType: TRANSITION_END, - handle: function handle(event) { - if ($(event.target).is(this)) { - return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params - } - - return undefined; // eslint-disable-line no-undefined - } - }; - } - - function transitionEndEmulator(duration) { - var _this = this; - - var called = false; - $(this).one(Util.TRANSITION_END, function () { - called = true; - }); - setTimeout(function () { - if (!called) { - Util.triggerTransitionEnd(_this); - } - }, duration); - return this; - } - - function setTransitionEndSupport() { - $.fn.emulateTransitionEnd = transitionEndEmulator; - $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent(); - } - - /** - * -------------------------------------------------------------------------- - * Public Util Api - * -------------------------------------------------------------------------- - */ - - - var Util = { - TRANSITION_END: 'bsTransitionEnd', - getUID: function getUID(prefix) { - do { - // eslint-disable-next-line no-bitwise - prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here - } while (document.getElementById(prefix)); - - return prefix; - }, - getSelectorFromElement: function getSelectorFromElement(element) { - var selector = element.getAttribute('data-target'); - - if (!selector || selector === '#') { - var hrefAttr = element.getAttribute('href'); - selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''; - } - - return selector && document.querySelector(selector) ? selector : null; - }, - getTransitionDurationFromElement: function getTransitionDurationFromElement(element) { - if (!element) { - return 0; - } // Get transition-duration of the element - - - var transitionDuration = $(element).css('transition-duration'); - var transitionDelay = $(element).css('transition-delay'); - var floatTransitionDuration = parseFloat(transitionDuration); - var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found - - if (!floatTransitionDuration && !floatTransitionDelay) { - return 0; - } // If multiple durations are defined, take the first - - - transitionDuration = transitionDuration.split(',')[0]; - transitionDelay = transitionDelay.split(',')[0]; - return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER; - }, - reflow: function reflow(element) { - return element.offsetHeight; - }, - triggerTransitionEnd: function triggerTransitionEnd(element) { - $(element).trigger(TRANSITION_END); - }, - supportsTransitionEnd: function supportsTransitionEnd() { - return Boolean(TRANSITION_END); - }, - isElement: function isElement(obj) { - return (obj[0] || obj).nodeType; - }, - typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) { - for (var property in configTypes) { - if (Object.prototype.hasOwnProperty.call(configTypes, property)) { - var expectedTypes = configTypes[property]; - var value = config[property]; - var valueType = value && Util.isElement(value) ? 'element' : toType(value); - - if (!new RegExp(expectedTypes).test(valueType)) { - throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\".")); - } - } - } - }, - findShadowRoot: function findShadowRoot(element) { - if (!document.documentElement.attachShadow) { - return null; - } // Can find the shadow root otherwise it'll return the document - - - if (typeof element.getRootNode === 'function') { - var root = element.getRootNode(); - return root instanceof ShadowRoot ? root : null; - } - - if (element instanceof ShadowRoot) { - return element; - } // when we don't find a shadow root - - - if (!element.parentNode) { - return null; - } - - return Util.findShadowRoot(element.parentNode); - } - }; - setTransitionEndSupport(); - - /** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - - var NAME = 'alert'; - var VERSION = '4.2.1'; - var DATA_KEY = 'bs.alert'; - var EVENT_KEY = "." + DATA_KEY; - var DATA_API_KEY = '.data-api'; - var JQUERY_NO_CONFLICT = $.fn[NAME]; - var Selector = { - DISMISS: '[data-dismiss="alert"]' - }; - var Event = { - CLOSE: "close" + EVENT_KEY, - CLOSED: "closed" + EVENT_KEY, - CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY - }; - var ClassName = { - ALERT: 'alert', - FADE: 'fade', - SHOW: 'show' - /** - * ------------------------------------------------------------------------ - * Class Definition - * ------------------------------------------------------------------------ - */ - - }; - - var Alert = - /*#__PURE__*/ - function () { - function Alert(element) { - this._element = element; - } // Getters - - - var _proto = Alert.prototype; - - // Public - _proto.close = function close(element) { - var rootElement = this._element; - - if (element) { - rootElement = this._getRootElement(element); - } - - var customEvent = this._triggerCloseEvent(rootElement); - - if (customEvent.isDefaultPrevented()) { - return; - } - - this._removeElement(rootElement); - }; - - _proto.dispose = function dispose() { - $.removeData(this._element, DATA_KEY); - this._element = null; - }; // Private - - - _proto._getRootElement = function _getRootElement(element) { - var selector = Util.getSelectorFromElement(element); - var parent = false; - - if (selector) { - parent = document.querySelector(selector); - } - - if (!parent) { - parent = $(element).closest("." + ClassName.ALERT)[0]; - } - - return parent; - }; - - _proto._triggerCloseEvent = function _triggerCloseEvent(element) { - var closeEvent = $.Event(Event.CLOSE); - $(element).trigger(closeEvent); - return closeEvent; - }; - - _proto._removeElement = function _removeElement(element) { - var _this = this; - - $(element).removeClass(ClassName.SHOW); - - if (!$(element).hasClass(ClassName.FADE)) { - this._destroyElement(element); - - return; - } - - var transitionDuration = Util.getTransitionDurationFromElement(element); - $(element).one(Util.TRANSITION_END, function (event) { - return _this._destroyElement(element, event); - }).emulateTransitionEnd(transitionDuration); - }; - - _proto._destroyElement = function _destroyElement(element) { - $(element).detach().trigger(Event.CLOSED).remove(); - }; // Static - - - Alert._jQueryInterface = function _jQueryInterface(config) { - return this.each(function () { - var $element = $(this); - var data = $element.data(DATA_KEY); - - if (!data) { - data = new Alert(this); - $element.data(DATA_KEY, data); - } - - if (config === 'close') { - data[config](this); - } - }); - }; - - Alert._handleDismiss = function _handleDismiss(alertInstance) { - return function (event) { - if (event) { - event.preventDefault(); - } - - alertInstance.close(this); - }; - }; - - _createClass(Alert, null, [{ - key: "VERSION", - get: function get() { - return VERSION; - } - }]); - - return Alert; - }(); - /** - * ------------------------------------------------------------------------ - * Data Api implementation - * ------------------------------------------------------------------------ - */ - - - $(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert())); - /** - * ------------------------------------------------------------------------ - * jQuery - * ------------------------------------------------------------------------ - */ - - $.fn[NAME] = Alert._jQueryInterface; - $.fn[NAME].Constructor = Alert; - - $.fn[NAME].noConflict = function () { - $.fn[NAME] = JQUERY_NO_CONFLICT; - return Alert._jQueryInterface; - }; - - /** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - - var NAME$1 = 'button'; - var VERSION$1 = '4.2.1'; - var DATA_KEY$1 = 'bs.button'; - var EVENT_KEY$1 = "." + DATA_KEY$1; - var DATA_API_KEY$1 = '.data-api'; - var JQUERY_NO_CONFLICT$1 = $.fn[NAME$1]; - var ClassName$1 = { - ACTIVE: 'active', - BUTTON: 'btn', - FOCUS: 'focus' - }; - var Selector$1 = { - DATA_TOGGLE_CARROT: '[data-toggle^="button"]', - DATA_TOGGLE: '[data-toggle="buttons"]', - INPUT: 'input:not([type="hidden"])', - ACTIVE: '.active', - BUTTON: '.btn' - }; - var Event$1 = { - CLICK_DATA_API: "click" + EVENT_KEY$1 + DATA_API_KEY$1, - FOCUS_BLUR_DATA_API: "focus" + EVENT_KEY$1 + DATA_API_KEY$1 + " " + ("blur" + EVENT_KEY$1 + DATA_API_KEY$1) - /** - * ------------------------------------------------------------------------ - * Class Definition - * ------------------------------------------------------------------------ - */ - - }; - - var Button = - /*#__PURE__*/ - function () { - function Button(element) { - this._element = element; - } // Getters - - - var _proto = Button.prototype; - - // Public - _proto.toggle = function toggle() { - var triggerChangeEvent = true; - var addAriaPressed = true; - var rootElement = $(this._element).closest(Selector$1.DATA_TOGGLE)[0]; - - if (rootElement) { - var input = this._element.querySelector(Selector$1.INPUT); - - if (input) { - if (input.type === 'radio') { - if (input.checked && this._element.classList.contains(ClassName$1.ACTIVE)) { - triggerChangeEvent = false; - } else { - var activeElement = rootElement.querySelector(Selector$1.ACTIVE); - - if (activeElement) { - $(activeElement).removeClass(ClassName$1.ACTIVE); - } - } - } - - if (triggerChangeEvent) { - if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) { - return; - } - - input.checked = !this._element.classList.contains(ClassName$1.ACTIVE); - $(input).trigger('change'); - } - - input.focus(); - addAriaPressed = false; - } - } - - if (addAriaPressed) { - this._element.setAttribute('aria-pressed', !this._element.classList.contains(ClassName$1.ACTIVE)); - } - - if (triggerChangeEvent) { - $(this._element).toggleClass(ClassName$1.ACTIVE); - } - }; - - _proto.dispose = function dispose() { - $.removeData(this._element, DATA_KEY$1); - this._element = null; - }; // Static - - - Button._jQueryInterface = function _jQueryInterface(config) { - return this.each(function () { - var data = $(this).data(DATA_KEY$1); - - if (!data) { - data = new Button(this); - $(this).data(DATA_KEY$1, data); - } - - if (config === 'toggle') { - data[config](); - } - }); - }; - - _createClass(Button, null, [{ - key: "VERSION", - get: function get() { - return VERSION$1; - } - }]); - - return Button; - }(); - /** - * ------------------------------------------------------------------------ - * Data Api implementation - * ------------------------------------------------------------------------ - */ - - - $(document).on(Event$1.CLICK_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) { - event.preventDefault(); - var button = event.target; - - if (!$(button).hasClass(ClassName$1.BUTTON)) { - button = $(button).closest(Selector$1.BUTTON); - } - - Button._jQueryInterface.call($(button), 'toggle'); - }).on(Event$1.FOCUS_BLUR_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) { - var button = $(event.target).closest(Selector$1.BUTTON)[0]; - $(button).toggleClass(ClassName$1.FOCUS, /^focus(in)?$/.test(event.type)); - }); - /** - * ------------------------------------------------------------------------ - * jQuery - * ------------------------------------------------------------------------ - */ - - $.fn[NAME$1] = Button._jQueryInterface; - $.fn[NAME$1].Constructor = Button; - - $.fn[NAME$1].noConflict = function () { - $.fn[NAME$1] = JQUERY_NO_CONFLICT$1; - return Button._jQueryInterface; - }; - - /** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - - var NAME$2 = 'carousel'; - var VERSION$2 = '4.2.1'; - var DATA_KEY$2 = 'bs.carousel'; - var EVENT_KEY$2 = "." + DATA_KEY$2; - var DATA_API_KEY$2 = '.data-api'; - var JQUERY_NO_CONFLICT$2 = $.fn[NAME$2]; - var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key - - var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key - - var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch - - var SWIPE_THRESHOLD = 40; - var Default = { - interval: 5000, - keyboard: true, - slide: false, - pause: 'hover', - wrap: true, - touch: true - }; - var DefaultType = { - interval: '(number|boolean)', - keyboard: 'boolean', - slide: '(boolean|string)', - pause: '(string|boolean)', - wrap: 'boolean', - touch: 'boolean' - }; - var Direction = { - NEXT: 'next', - PREV: 'prev', - LEFT: 'left', - RIGHT: 'right' - }; - var Event$2 = { - SLIDE: "slide" + EVENT_KEY$2, - SLID: "slid" + EVENT_KEY$2, - KEYDOWN: "keydown" + EVENT_KEY$2, - MOUSEENTER: "mouseenter" + EVENT_KEY$2, - MOUSELEAVE: "mouseleave" + EVENT_KEY$2, - TOUCHSTART: "touchstart" + EVENT_KEY$2, - TOUCHMOVE: "touchmove" + EVENT_KEY$2, - TOUCHEND: "touchend" + EVENT_KEY$2, - POINTERDOWN: "pointerdown" + EVENT_KEY$2, - POINTERUP: "pointerup" + EVENT_KEY$2, - DRAG_START: "dragstart" + EVENT_KEY$2, - LOAD_DATA_API: "load" + EVENT_KEY$2 + DATA_API_KEY$2, - CLICK_DATA_API: "click" + EVENT_KEY$2 + DATA_API_KEY$2 - }; - var ClassName$2 = { - CAROUSEL: 'carousel', - ACTIVE: 'active', - SLIDE: 'slide', - RIGHT: 'carousel-item-right', - LEFT: 'carousel-item-left', - NEXT: 'carousel-item-next', - PREV: 'carousel-item-prev', - ITEM: 'carousel-item', - POINTER_EVENT: 'pointer-event' - }; - var Selector$2 = { - ACTIVE: '.active', - ACTIVE_ITEM: '.active.carousel-item', - ITEM: '.carousel-item', - ITEM_IMG: '.carousel-item img', - NEXT_PREV: '.carousel-item-next, .carousel-item-prev', - INDICATORS: '.carousel-indicators', - DATA_SLIDE: '[data-slide], [data-slide-to]', - DATA_RIDE: '[data-ride="carousel"]' - }; - var PointerType = { - TOUCH: 'touch', - PEN: 'pen' - /** - * ------------------------------------------------------------------------ - * Class Definition - * ------------------------------------------------------------------------ - */ - - }; - - var Carousel = - /*#__PURE__*/ - function () { - function Carousel(element, config) { - this._items = null; - this._interval = null; - this._activeElement = null; - this._isPaused = false; - this._isSliding = false; - this.touchTimeout = null; - this.touchStartX = 0; - this.touchDeltaX = 0; - this._config = this._getConfig(config); - this._element = element; - this._indicatorsElement = this._element.querySelector(Selector$2.INDICATORS); - this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0; - this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent); - - this._addEventListeners(); - } // Getters - - - var _proto = Carousel.prototype; - - // Public - _proto.next = function next() { - if (!this._isSliding) { - this._slide(Direction.NEXT); - } - }; - - _proto.nextWhenVisible = function nextWhenVisible() { - // Don't call next when the page isn't visible - // or the carousel or its parent isn't visible - if (!document.hidden && $(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden') { - this.next(); - } - }; - - _proto.prev = function prev() { - if (!this._isSliding) { - this._slide(Direction.PREV); - } - }; - - _proto.pause = function pause(event) { - if (!event) { - this._isPaused = true; - } - - if (this._element.querySelector(Selector$2.NEXT_PREV)) { - Util.triggerTransitionEnd(this._element); - this.cycle(true); - } - - clearInterval(this._interval); - this._interval = null; - }; - - _proto.cycle = function cycle(event) { - if (!event) { - this._isPaused = false; - } - - if (this._interval) { - clearInterval(this._interval); - this._interval = null; - } - - if (this._config.interval && !this._isPaused) { - this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval); - } - }; - - _proto.to = function to(index) { - var _this = this; - - this._activeElement = this._element.querySelector(Selector$2.ACTIVE_ITEM); - - var activeIndex = this._getItemIndex(this._activeElement); - - if (index > this._items.length - 1 || index < 0) { - return; - } - - if (this._isSliding) { - $(this._element).one(Event$2.SLID, function () { - return _this.to(index); - }); - return; - } - - if (activeIndex === index) { - this.pause(); - this.cycle(); - return; - } - - var direction = index > activeIndex ? Direction.NEXT : Direction.PREV; - - this._slide(direction, this._items[index]); - }; - - _proto.dispose = function dispose() { - $(this._element).off(EVENT_KEY$2); - $.removeData(this._element, DATA_KEY$2); - this._items = null; - this._config = null; - this._element = null; - this._interval = null; - this._isPaused = null; - this._isSliding = null; - this._activeElement = null; - this._indicatorsElement = null; - }; // Private - - - _proto._getConfig = function _getConfig(config) { - config = _objectSpread({}, Default, config); - Util.typeCheckConfig(NAME$2, config, DefaultType); - return config; - }; - - _proto._handleSwipe = function _handleSwipe() { - var absDeltax = Math.abs(this.touchDeltaX); - - if (absDeltax <= SWIPE_THRESHOLD) { - return; - } - - var direction = absDeltax / this.touchDeltaX; // swipe left - - if (direction > 0) { - this.prev(); - } // swipe right - - - if (direction < 0) { - this.next(); - } - }; - - _proto._addEventListeners = function _addEventListeners() { - var _this2 = this; - - if (this._config.keyboard) { - $(this._element).on(Event$2.KEYDOWN, function (event) { - return _this2._keydown(event); - }); - } - - if (this._config.pause === 'hover') { - $(this._element).on(Event$2.MOUSEENTER, function (event) { - return _this2.pause(event); - }).on(Event$2.MOUSELEAVE, function (event) { - return _this2.cycle(event); - }); - } - - this._addTouchEventListeners(); - }; - - _proto._addTouchEventListeners = function _addTouchEventListeners() { - var _this3 = this; - - if (!this._touchSupported) { - return; - } - - var start = function start(event) { - if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) { - _this3.touchStartX = event.originalEvent.clientX; - } else if (!_this3._pointerEvent) { - _this3.touchStartX = event.originalEvent.touches[0].clientX; - } - }; - - var move = function move(event) { - // ensure swiping with one touch and not pinching - if (event.originalEvent.touches && event.originalEvent.touches.length > 1) { - _this3.touchDeltaX = 0; - } else { - _this3.touchDeltaX = event.originalEvent.touches[0].clientX - _this3.touchStartX; - } - }; - - var end = function end(event) { - if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) { - _this3.touchDeltaX = event.originalEvent.clientX - _this3.touchStartX; - } - - _this3._handleSwipe(); - - if (_this3._config.pause === 'hover') { - // If it's a touch-enabled device, mouseenter/leave are fired as - // part of the mouse compatibility events on first tap - the carousel - // would stop cycling until user tapped out of it; - // here, we listen for touchend, explicitly pause the carousel - // (as if it's the second time we tap on it, mouseenter compat event - // is NOT fired) and after a timeout (to allow for mouse compatibility - // events to fire) we explicitly restart cycling - _this3.pause(); - - if (_this3.touchTimeout) { - clearTimeout(_this3.touchTimeout); - } - - _this3.touchTimeout = setTimeout(function (event) { - return _this3.cycle(event); - }, TOUCHEVENT_COMPAT_WAIT + _this3._config.interval); - } - }; - - $(this._element.querySelectorAll(Selector$2.ITEM_IMG)).on(Event$2.DRAG_START, function (e) { - return e.preventDefault(); - }); - - if (this._pointerEvent) { - $(this._element).on(Event$2.POINTERDOWN, function (event) { - return start(event); - }); - $(this._element).on(Event$2.POINTERUP, function (event) { - return end(event); - }); - - this._element.classList.add(ClassName$2.POINTER_EVENT); - } else { - $(this._element).on(Event$2.TOUCHSTART, function (event) { - return start(event); - }); - $(this._element).on(Event$2.TOUCHMOVE, function (event) { - return move(event); - }); - $(this._element).on(Event$2.TOUCHEND, function (event) { - return end(event); - }); - } - }; - - _proto._keydown = function _keydown(event) { - if (/input|textarea/i.test(event.target.tagName)) { - return; - } - - switch (event.which) { - case ARROW_LEFT_KEYCODE: - event.preventDefault(); - this.prev(); - break; - - case ARROW_RIGHT_KEYCODE: - event.preventDefault(); - this.next(); - break; - - default: - } - }; - - _proto._getItemIndex = function _getItemIndex(element) { - this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(Selector$2.ITEM)) : []; - return this._items.indexOf(element); - }; - - _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) { - var isNextDirection = direction === Direction.NEXT; - var isPrevDirection = direction === Direction.PREV; - - var activeIndex = this._getItemIndex(activeElement); - - var lastItemIndex = this._items.length - 1; - var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex; - - if (isGoingToWrap && !this._config.wrap) { - return activeElement; - } - - var delta = direction === Direction.PREV ? -1 : 1; - var itemIndex = (activeIndex + delta) % this._items.length; - return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex]; - }; - - _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) { - var targetIndex = this._getItemIndex(relatedTarget); - - var fromIndex = this._getItemIndex(this._element.querySelector(Selector$2.ACTIVE_ITEM)); - - var slideEvent = $.Event(Event$2.SLIDE, { - relatedTarget: relatedTarget, - direction: eventDirectionName, - from: fromIndex, - to: targetIndex - }); - $(this._element).trigger(slideEvent); - return slideEvent; - }; - - _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) { - if (this._indicatorsElement) { - var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector$2.ACTIVE)); - $(indicators).removeClass(ClassName$2.ACTIVE); - - var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)]; - - if (nextIndicator) { - $(nextIndicator).addClass(ClassName$2.ACTIVE); - } - } - }; - - _proto._slide = function _slide(direction, element) { - var _this4 = this; - - var activeElement = this._element.querySelector(Selector$2.ACTIVE_ITEM); - - var activeElementIndex = this._getItemIndex(activeElement); - - var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement); - - var nextElementIndex = this._getItemIndex(nextElement); - - var isCycling = Boolean(this._interval); - var directionalClassName; - var orderClassName; - var eventDirectionName; - - if (direction === Direction.NEXT) { - directionalClassName = ClassName$2.LEFT; - orderClassName = ClassName$2.NEXT; - eventDirectionName = Direction.LEFT; - } else { - directionalClassName = ClassName$2.RIGHT; - orderClassName = ClassName$2.PREV; - eventDirectionName = Direction.RIGHT; - } - - if (nextElement && $(nextElement).hasClass(ClassName$2.ACTIVE)) { - this._isSliding = false; - return; - } - - var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName); - - if (slideEvent.isDefaultPrevented()) { - return; - } - - if (!activeElement || !nextElement) { - // Some weirdness is happening, so we bail - return; - } - - this._isSliding = true; - - if (isCycling) { - this.pause(); - } - - this._setActiveIndicatorElement(nextElement); - - var slidEvent = $.Event(Event$2.SLID, { - relatedTarget: nextElement, - direction: eventDirectionName, - from: activeElementIndex, - to: nextElementIndex - }); - - if ($(this._element).hasClass(ClassName$2.SLIDE)) { - $(nextElement).addClass(orderClassName); - Util.reflow(nextElement); - $(activeElement).addClass(directionalClassName); - $(nextElement).addClass(directionalClassName); - var nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10); - - if (nextElementInterval) { - this._config.defaultInterval = this._config.defaultInterval || this._config.interval; - this._config.interval = nextElementInterval; - } else { - this._config.interval = this._config.defaultInterval || this._config.interval; - } - - var transitionDuration = Util.getTransitionDurationFromElement(activeElement); - $(activeElement).one(Util.TRANSITION_END, function () { - $(nextElement).removeClass(directionalClassName + " " + orderClassName).addClass(ClassName$2.ACTIVE); - $(activeElement).removeClass(ClassName$2.ACTIVE + " " + orderClassName + " " + directionalClassName); - _this4._isSliding = false; - setTimeout(function () { - return $(_this4._element).trigger(slidEvent); - }, 0); - }).emulateTransitionEnd(transitionDuration); - } else { - $(activeElement).removeClass(ClassName$2.ACTIVE); - $(nextElement).addClass(ClassName$2.ACTIVE); - this._isSliding = false; - $(this._element).trigger(slidEvent); - } - - if (isCycling) { - this.cycle(); - } - }; // Static - - - Carousel._jQueryInterface = function _jQueryInterface(config) { - return this.each(function () { - var data = $(this).data(DATA_KEY$2); - - var _config = _objectSpread({}, Default, $(this).data()); - - if (typeof config === 'object') { - _config = _objectSpread({}, _config, config); - } - - var action = typeof config === 'string' ? config : _config.slide; - - if (!data) { - data = new Carousel(this, _config); - $(this).data(DATA_KEY$2, data); - } - - if (typeof config === 'number') { - data.to(config); - } else if (typeof action === 'string') { - if (typeof data[action] === 'undefined') { - throw new TypeError("No method named \"" + action + "\""); - } - - data[action](); - } else if (_config.interval) { - data.pause(); - data.cycle(); - } - }); - }; - - Carousel._dataApiClickHandler = function _dataApiClickHandler(event) { - var selector = Util.getSelectorFromElement(this); - - if (!selector) { - return; - } - - var target = $(selector)[0]; - - if (!target || !$(target).hasClass(ClassName$2.CAROUSEL)) { - return; - } - - var config = _objectSpread({}, $(target).data(), $(this).data()); - - var slideIndex = this.getAttribute('data-slide-to'); - - if (slideIndex) { - config.interval = false; - } - - Carousel._jQueryInterface.call($(target), config); - - if (slideIndex) { - $(target).data(DATA_KEY$2).to(slideIndex); - } - - event.preventDefault(); - }; - - _createClass(Carousel, null, [{ - key: "VERSION", - get: function get() { - return VERSION$2; - } - }, { - key: "Default", - get: function get() { - return Default; - } - }]); - - return Carousel; - }(); - /** - * ------------------------------------------------------------------------ - * Data Api implementation - * ------------------------------------------------------------------------ - */ - - - $(document).on(Event$2.CLICK_DATA_API, Selector$2.DATA_SLIDE, Carousel._dataApiClickHandler); - $(window).on(Event$2.LOAD_DATA_API, function () { - var carousels = [].slice.call(document.querySelectorAll(Selector$2.DATA_RIDE)); - - for (var i = 0, len = carousels.length; i < len; i++) { - var $carousel = $(carousels[i]); - - Carousel._jQueryInterface.call($carousel, $carousel.data()); - } - }); - /** - * ------------------------------------------------------------------------ - * jQuery - * ------------------------------------------------------------------------ - */ - - $.fn[NAME$2] = Carousel._jQueryInterface; - $.fn[NAME$2].Constructor = Carousel; - - $.fn[NAME$2].noConflict = function () { - $.fn[NAME$2] = JQUERY_NO_CONFLICT$2; - return Carousel._jQueryInterface; - }; - - /** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - - var NAME$3 = 'collapse'; - var VERSION$3 = '4.2.1'; - var DATA_KEY$3 = 'bs.collapse'; - var EVENT_KEY$3 = "." + DATA_KEY$3; - var DATA_API_KEY$3 = '.data-api'; - var JQUERY_NO_CONFLICT$3 = $.fn[NAME$3]; - var Default$1 = { - toggle: true, - parent: '' - }; - var DefaultType$1 = { - toggle: 'boolean', - parent: '(string|element)' - }; - var Event$3 = { - SHOW: "show" + EVENT_KEY$3, - SHOWN: "shown" + EVENT_KEY$3, - HIDE: "hide" + EVENT_KEY$3, - HIDDEN: "hidden" + EVENT_KEY$3, - CLICK_DATA_API: "click" + EVENT_KEY$3 + DATA_API_KEY$3 - }; - var ClassName$3 = { - SHOW: 'show', - COLLAPSE: 'collapse', - COLLAPSING: 'collapsing', - COLLAPSED: 'collapsed' - }; - var Dimension = { - WIDTH: 'width', - HEIGHT: 'height' - }; - var Selector$3 = { - ACTIVES: '.show, .collapsing', - DATA_TOGGLE: '[data-toggle="collapse"]' - /** - * ------------------------------------------------------------------------ - * Class Definition - * ------------------------------------------------------------------------ - */ - - }; - - var Collapse = - /*#__PURE__*/ - function () { - function Collapse(element, config) { - this._isTransitioning = false; - this._element = element; - this._config = this._getConfig(config); - this._triggerArray = [].slice.call(document.querySelectorAll("[data-toggle=\"collapse\"][href=\"#" + element.id + "\"]," + ("[data-toggle=\"collapse\"][data-target=\"#" + element.id + "\"]"))); - var toggleList = [].slice.call(document.querySelectorAll(Selector$3.DATA_TOGGLE)); - - for (var i = 0, len = toggleList.length; i < len; i++) { - var elem = toggleList[i]; - var selector = Util.getSelectorFromElement(elem); - var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) { - return foundElem === element; - }); - - if (selector !== null && filterElement.length > 0) { - this._selector = selector; - - this._triggerArray.push(elem); - } - } - - this._parent = this._config.parent ? this._getParent() : null; - - if (!this._config.parent) { - this._addAriaAndCollapsedClass(this._element, this._triggerArray); - } - - if (this._config.toggle) { - this.toggle(); - } - } // Getters - - - var _proto = Collapse.prototype; - - // Public - _proto.toggle = function toggle() { - if ($(this._element).hasClass(ClassName$3.SHOW)) { - this.hide(); - } else { - this.show(); - } - }; - - _proto.show = function show() { - var _this = this; - - if (this._isTransitioning || $(this._element).hasClass(ClassName$3.SHOW)) { - return; - } - - var actives; - var activesData; - - if (this._parent) { - actives = [].slice.call(this._parent.querySelectorAll(Selector$3.ACTIVES)).filter(function (elem) { - if (typeof _this._config.parent === 'string') { - return elem.getAttribute('data-parent') === _this._config.parent; - } - - return elem.classList.contains(ClassName$3.COLLAPSE); - }); - - if (actives.length === 0) { - actives = null; - } - } - - if (actives) { - activesData = $(actives).not(this._selector).data(DATA_KEY$3); - - if (activesData && activesData._isTransitioning) { - return; - } - } - - var startEvent = $.Event(Event$3.SHOW); - $(this._element).trigger(startEvent); - - if (startEvent.isDefaultPrevented()) { - return; - } - - if (actives) { - Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide'); - - if (!activesData) { - $(actives).data(DATA_KEY$3, null); - } - } - - var dimension = this._getDimension(); - - $(this._element).removeClass(ClassName$3.COLLAPSE).addClass(ClassName$3.COLLAPSING); - this._element.style[dimension] = 0; - - if (this._triggerArray.length) { - $(this._triggerArray).removeClass(ClassName$3.COLLAPSED).attr('aria-expanded', true); - } - - this.setTransitioning(true); - - var complete = function complete() { - $(_this._element).removeClass(ClassName$3.COLLAPSING).addClass(ClassName$3.COLLAPSE).addClass(ClassName$3.SHOW); - _this._element.style[dimension] = ''; - - _this.setTransitioning(false); - - $(_this._element).trigger(Event$3.SHOWN); - }; - - var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1); - var scrollSize = "scroll" + capitalizedDimension; - var transitionDuration = Util.getTransitionDurationFromElement(this._element); - $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); - this._element.style[dimension] = this._element[scrollSize] + "px"; - }; - - _proto.hide = function hide() { - var _this2 = this; - - if (this._isTransitioning || !$(this._element).hasClass(ClassName$3.SHOW)) { - return; - } - - var startEvent = $.Event(Event$3.HIDE); - $(this._element).trigger(startEvent); - - if (startEvent.isDefaultPrevented()) { - return; - } - - var dimension = this._getDimension(); - - this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + "px"; - Util.reflow(this._element); - $(this._element).addClass(ClassName$3.COLLAPSING).removeClass(ClassName$3.COLLAPSE).removeClass(ClassName$3.SHOW); - var triggerArrayLength = this._triggerArray.length; - - if (triggerArrayLength > 0) { - for (var i = 0; i < triggerArrayLength; i++) { - var trigger = this._triggerArray[i]; - var selector = Util.getSelectorFromElement(trigger); - - if (selector !== null) { - var $elem = $([].slice.call(document.querySelectorAll(selector))); - - if (!$elem.hasClass(ClassName$3.SHOW)) { - $(trigger).addClass(ClassName$3.COLLAPSED).attr('aria-expanded', false); - } - } - } - } - - this.setTransitioning(true); - - var complete = function complete() { - _this2.setTransitioning(false); - - $(_this2._element).removeClass(ClassName$3.COLLAPSING).addClass(ClassName$3.COLLAPSE).trigger(Event$3.HIDDEN); - }; - - this._element.style[dimension] = ''; - var transitionDuration = Util.getTransitionDurationFromElement(this._element); - $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); - }; - - _proto.setTransitioning = function setTransitioning(isTransitioning) { - this._isTransitioning = isTransitioning; - }; - - _proto.dispose = function dispose() { - $.removeData(this._element, DATA_KEY$3); - this._config = null; - this._parent = null; - this._element = null; - this._triggerArray = null; - this._isTransitioning = null; - }; // Private - - - _proto._getConfig = function _getConfig(config) { - config = _objectSpread({}, Default$1, config); - config.toggle = Boolean(config.toggle); // Coerce string values - - Util.typeCheckConfig(NAME$3, config, DefaultType$1); - return config; - }; - - _proto._getDimension = function _getDimension() { - var hasWidth = $(this._element).hasClass(Dimension.WIDTH); - return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT; - }; - - _proto._getParent = function _getParent() { - var _this3 = this; - - var parent; - - if (Util.isElement(this._config.parent)) { - parent = this._config.parent; // It's a jQuery object - - if (typeof this._config.parent.jquery !== 'undefined') { - parent = this._config.parent[0]; - } - } else { - parent = document.querySelector(this._config.parent); - } - - var selector = "[data-toggle=\"collapse\"][data-parent=\"" + this._config.parent + "\"]"; - var children = [].slice.call(parent.querySelectorAll(selector)); - $(children).each(function (i, element) { - _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]); - }); - return parent; - }; - - _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) { - var isOpen = $(element).hasClass(ClassName$3.SHOW); - - if (triggerArray.length) { - $(triggerArray).toggleClass(ClassName$3.COLLAPSED, !isOpen).attr('aria-expanded', isOpen); - } - }; // Static - - - Collapse._getTargetFromElement = function _getTargetFromElement(element) { - var selector = Util.getSelectorFromElement(element); - return selector ? document.querySelector(selector) : null; - }; - - Collapse._jQueryInterface = function _jQueryInterface(config) { - return this.each(function () { - var $this = $(this); - var data = $this.data(DATA_KEY$3); - - var _config = _objectSpread({}, Default$1, $this.data(), typeof config === 'object' && config ? config : {}); - - if (!data && _config.toggle && /show|hide/.test(config)) { - _config.toggle = false; - } - - if (!data) { - data = new Collapse(this, _config); - $this.data(DATA_KEY$3, data); - } - - if (typeof config === 'string') { - if (typeof data[config] === 'undefined') { - throw new TypeError("No method named \"" + config + "\""); - } - - data[config](); - } - }); - }; - - _createClass(Collapse, null, [{ - key: "VERSION", - get: function get() { - return VERSION$3; - } - }, { - key: "Default", - get: function get() { - return Default$1; - } - }]); - - return Collapse; - }(); - /** - * ------------------------------------------------------------------------ - * Data Api implementation - * ------------------------------------------------------------------------ - */ - - - $(document).on(Event$3.CLICK_DATA_API, Selector$3.DATA_TOGGLE, function (event) { - // preventDefault only for elements (which change the URL) not inside the collapsible element - if (event.currentTarget.tagName === 'A') { - event.preventDefault(); - } - - var $trigger = $(this); - var selector = Util.getSelectorFromElement(this); - var selectors = [].slice.call(document.querySelectorAll(selector)); - $(selectors).each(function () { - var $target = $(this); - var data = $target.data(DATA_KEY$3); - var config = data ? 'toggle' : $trigger.data(); - - Collapse._jQueryInterface.call($target, config); - }); - }); - /** - * ------------------------------------------------------------------------ - * jQuery - * ------------------------------------------------------------------------ - */ - - $.fn[NAME$3] = Collapse._jQueryInterface; - $.fn[NAME$3].Constructor = Collapse; - - $.fn[NAME$3].noConflict = function () { - $.fn[NAME$3] = JQUERY_NO_CONFLICT$3; - return Collapse._jQueryInterface; - }; - - /**! - * @fileOverview Kickass library to create and place poppers near their reference elements. - * @version 1.14.6 - * @license - * Copyright (c) 2016 Federico Zivolo and contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined'; - - var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox']; - var timeoutDuration = 0; - for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) { - if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) { - timeoutDuration = 1; - break; - } - } - - function microtaskDebounce(fn) { - var called = false; - return function () { - if (called) { - return; - } - called = true; - window.Promise.resolve().then(function () { - called = false; - fn(); - }); - }; - } - - function taskDebounce(fn) { - var scheduled = false; - return function () { - if (!scheduled) { - scheduled = true; - setTimeout(function () { - scheduled = false; - fn(); - }, timeoutDuration); - } - }; - } - - var supportsMicroTasks = isBrowser && window.Promise; - - /** - * Create a debounced version of a method, that's asynchronously deferred - * but called in the minimum time possible. - * - * @method - * @memberof Popper.Utils - * @argument {Function} fn - * @returns {Function} - */ - var debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce; - - /** - * Check if the given variable is a function - * @method - * @memberof Popper.Utils - * @argument {Any} functionToCheck - variable to check - * @returns {Boolean} answer to: is a function? - */ - function isFunction(functionToCheck) { - var getType = {}; - return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]'; - } - - /** - * Get CSS computed property of the given element - * @method - * @memberof Popper.Utils - * @argument {Eement} element - * @argument {String} property - */ - function getStyleComputedProperty(element, property) { - if (element.nodeType !== 1) { - return []; - } - // NOTE: 1 DOM access here - var window = element.ownerDocument.defaultView; - var css = window.getComputedStyle(element, null); - return property ? css[property] : css; - } - - /** - * Returns the parentNode or the host of the element - * @method - * @memberof Popper.Utils - * @argument {Element} element - * @returns {Element} parent - */ - function getParentNode(element) { - if (element.nodeName === 'HTML') { - return element; - } - return element.parentNode || element.host; - } - - /** - * Returns the scrolling parent of the given element - * @method - * @memberof Popper.Utils - * @argument {Element} element - * @returns {Element} scroll parent - */ - function getScrollParent(element) { - // Return body, `getScroll` will take care to get the correct `scrollTop` from it - if (!element) { - return document.body; - } - - switch (element.nodeName) { - case 'HTML': - case 'BODY': - return element.ownerDocument.body; - case '#document': - return element.body; - } - - // Firefox want us to check `-x` and `-y` variations as well - - var _getStyleComputedProp = getStyleComputedProperty(element), - overflow = _getStyleComputedProp.overflow, - overflowX = _getStyleComputedProp.overflowX, - overflowY = _getStyleComputedProp.overflowY; - - if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) { - return element; - } - - return getScrollParent(getParentNode(element)); - } - - var isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode); - var isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent); - - /** - * Determines if the browser is Internet Explorer - * @method - * @memberof Popper.Utils - * @param {Number} version to check - * @returns {Boolean} isIE - */ - function isIE(version) { - if (version === 11) { - return isIE11; - } - if (version === 10) { - return isIE10; - } - return isIE11 || isIE10; - } - - /** - * Returns the offset parent of the given element - * @method - * @memberof Popper.Utils - * @argument {Element} element - * @returns {Element} offset parent - */ - function getOffsetParent(element) { - if (!element) { - return document.documentElement; - } - - var noOffsetParent = isIE(10) ? document.body : null; - - // NOTE: 1 DOM access here - var offsetParent = element.offsetParent || null; - // Skip hidden elements which don't have an offsetParent - while (offsetParent === noOffsetParent && element.nextElementSibling) { - offsetParent = (element = element.nextElementSibling).offsetParent; - } - - var nodeName = offsetParent && offsetParent.nodeName; - - if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') { - return element ? element.ownerDocument.documentElement : document.documentElement; - } - - // .offsetParent will return the closest TH, TD or TABLE in case - // no offsetParent is present, I hate this job... - if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') { - return getOffsetParent(offsetParent); - } - - return offsetParent; - } - - function isOffsetContainer(element) { - var nodeName = element.nodeName; - - if (nodeName === 'BODY') { - return false; - } - return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element; - } - - /** - * Finds the root node (document, shadowDOM root) of the given element - * @method - * @memberof Popper.Utils - * @argument {Element} node - * @returns {Element} root node - */ - function getRoot(node) { - if (node.parentNode !== null) { - return getRoot(node.parentNode); - } - - return node; - } - - /** - * Finds the offset parent common to the two provided nodes - * @method - * @memberof Popper.Utils - * @argument {Element} element1 - * @argument {Element} element2 - * @returns {Element} common offset parent - */ - function findCommonOffsetParent(element1, element2) { - // This check is needed to avoid errors in case one of the elements isn't defined for any reason - if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) { - return document.documentElement; - } - - // Here we make sure to give as "start" the element that comes first in the DOM - var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING; - var start = order ? element1 : element2; - var end = order ? element2 : element1; - - // Get common ancestor container - var range = document.createRange(); - range.setStart(start, 0); - range.setEnd(end, 0); - var commonAncestorContainer = range.commonAncestorContainer; - - // Both nodes are inside #document - - if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) { - if (isOffsetContainer(commonAncestorContainer)) { - return commonAncestorContainer; - } - - return getOffsetParent(commonAncestorContainer); - } - - // one of the nodes is inside shadowDOM, find which one - var element1root = getRoot(element1); - if (element1root.host) { - return findCommonOffsetParent(element1root.host, element2); - } else { - return findCommonOffsetParent(element1, getRoot(element2).host); - } - } - - /** - * Gets the scroll value of the given element in the given side (top and left) - * @method - * @memberof Popper.Utils - * @argument {Element} element - * @argument {String} side `top` or `left` - * @returns {number} amount of scrolled pixels - */ - function getScroll(element) { - var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top'; - - var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft'; - var nodeName = element.nodeName; - - if (nodeName === 'BODY' || nodeName === 'HTML') { - var html = element.ownerDocument.documentElement; - var scrollingElement = element.ownerDocument.scrollingElement || html; - return scrollingElement[upperSide]; - } - - return element[upperSide]; - } - - /* - * Sum or subtract the element scroll values (left and top) from a given rect object - * @method - * @memberof Popper.Utils - * @param {Object} rect - Rect object you want to change - * @param {HTMLElement} element - The element from the function reads the scroll values - * @param {Boolean} subtract - set to true if you want to subtract the scroll values - * @return {Object} rect - The modifier rect object - */ - function includeScroll(rect, element) { - var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - - var scrollTop = getScroll(element, 'top'); - var scrollLeft = getScroll(element, 'left'); - var modifier = subtract ? -1 : 1; - rect.top += scrollTop * modifier; - rect.bottom += scrollTop * modifier; - rect.left += scrollLeft * modifier; - rect.right += scrollLeft * modifier; - return rect; - } - - /* - * Helper to detect borders of a given element - * @method - * @memberof Popper.Utils - * @param {CSSStyleDeclaration} styles - * Result of `getStyleComputedProperty` on the given element - * @param {String} axis - `x` or `y` - * @return {number} borders - The borders size of the given axis - */ - - function getBordersSize(styles, axis) { - var sideA = axis === 'x' ? 'Left' : 'Top'; - var sideB = sideA === 'Left' ? 'Right' : 'Bottom'; - - return parseFloat(styles['border' + sideA + 'Width'], 10) + parseFloat(styles['border' + sideB + 'Width'], 10); - } - - function getSize(axis, body, html, computedStyle) { - return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0); - } - - function getWindowSizes(document) { - var body = document.body; - var html = document.documentElement; - var computedStyle = isIE(10) && getComputedStyle(html); - - return { - height: getSize('Height', body, html, computedStyle), - width: getSize('Width', body, html, computedStyle) - }; - } - - var classCallCheck = function (instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } - }; - - var createClass = function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps); - if (staticProps) defineProperties(Constructor, staticProps); - return Constructor; - }; - }(); - - - var defineProperty = function (obj, key, value) { - if (key in obj) { - Object.defineProperty(obj, key, { - value: value, - enumerable: true, - configurable: true, - writable: true - }); - } else { - obj[key] = value; - } - - return obj; - }; - - var _extends = Object.assign || function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - - return target; - }; - - /** - * Given element offsets, generate an output similar to getBoundingClientRect - * @method - * @memberof Popper.Utils - * @argument {Object} offsets - * @returns {Object} ClientRect like output - */ - function getClientRect(offsets) { - return _extends({}, offsets, { - right: offsets.left + offsets.width, - bottom: offsets.top + offsets.height - }); - } - - /** - * Get bounding client rect of given element - * @method - * @memberof Popper.Utils - * @param {HTMLElement} element - * @return {Object} client rect - */ - function getBoundingClientRect(element) { - var rect = {}; - - // IE10 10 FIX: Please, don't ask, the element isn't - // considered in DOM in some circumstances... - // This isn't reproducible in IE10 compatibility mode of IE11 - try { - if (isIE(10)) { - rect = element.getBoundingClientRect(); - var scrollTop = getScroll(element, 'top'); - var scrollLeft = getScroll(element, 'left'); - rect.top += scrollTop; - rect.left += scrollLeft; - rect.bottom += scrollTop; - rect.right += scrollLeft; - } else { - rect = element.getBoundingClientRect(); - } - } catch (e) { - } - - var result = { - left: rect.left, - top: rect.top, - width: rect.right - rect.left, - height: rect.bottom - rect.top - }; - - // subtract scrollbar size from sizes - var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {}; - var width = sizes.width || element.clientWidth || result.right - result.left; - var height = sizes.height || element.clientHeight || result.bottom - result.top; - - var horizScrollbar = element.offsetWidth - width; - var vertScrollbar = element.offsetHeight - height; - - // if an hypothetical scrollbar is detected, we must be sure it's not a `border` - // we make this check conditional for performance reasons - if (horizScrollbar || vertScrollbar) { - var styles = getStyleComputedProperty(element); - horizScrollbar -= getBordersSize(styles, 'x'); - vertScrollbar -= getBordersSize(styles, 'y'); - - result.width -= horizScrollbar; - result.height -= vertScrollbar; - } - - return getClientRect(result); - } - - function getOffsetRectRelativeToArbitraryNode(children, parent) { - var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - - var isIE10 = isIE(10); - var isHTML = parent.nodeName === 'HTML'; - var childrenRect = getBoundingClientRect(children); - var parentRect = getBoundingClientRect(parent); - var scrollParent = getScrollParent(children); - - var styles = getStyleComputedProperty(parent); - var borderTopWidth = parseFloat(styles.borderTopWidth, 10); - var borderLeftWidth = parseFloat(styles.borderLeftWidth, 10); - - // In cases where the parent is fixed, we must ignore negative scroll in offset calc - if (fixedPosition && isHTML) { - parentRect.top = Math.max(parentRect.top, 0); - parentRect.left = Math.max(parentRect.left, 0); - } - var offsets = getClientRect({ - top: childrenRect.top - parentRect.top - borderTopWidth, - left: childrenRect.left - parentRect.left - borderLeftWidth, - width: childrenRect.width, - height: childrenRect.height - }); - offsets.marginTop = 0; - offsets.marginLeft = 0; - - // Subtract margins of documentElement in case it's being used as parent - // we do this only on HTML because it's the only element that behaves - // differently when margins are applied to it. The margins are included in - // the box of the documentElement, in the other cases not. - if (!isIE10 && isHTML) { - var marginTop = parseFloat(styles.marginTop, 10); - var marginLeft = parseFloat(styles.marginLeft, 10); - - offsets.top -= borderTopWidth - marginTop; - offsets.bottom -= borderTopWidth - marginTop; - offsets.left -= borderLeftWidth - marginLeft; - offsets.right -= borderLeftWidth - marginLeft; - - // Attach marginTop and marginLeft because in some circumstances we may need them - offsets.marginTop = marginTop; - offsets.marginLeft = marginLeft; - } - - if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') { - offsets = includeScroll(offsets, parent); - } - - return offsets; - } - - function getViewportOffsetRectRelativeToArtbitraryNode(element) { - var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - - var html = element.ownerDocument.documentElement; - var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html); - var width = Math.max(html.clientWidth, window.innerWidth || 0); - var height = Math.max(html.clientHeight, window.innerHeight || 0); - - var scrollTop = !excludeScroll ? getScroll(html) : 0; - var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0; - - var offset = { - top: scrollTop - relativeOffset.top + relativeOffset.marginTop, - left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft, - width: width, - height: height - }; - - return getClientRect(offset); - } - - /** - * Check if the given element is fixed or is inside a fixed parent - * @method - * @memberof Popper.Utils - * @argument {Element} element - * @argument {Element} customContainer - * @returns {Boolean} answer to "isFixed?" - */ - function isFixed(element) { - var nodeName = element.nodeName; - if (nodeName === 'BODY' || nodeName === 'HTML') { - return false; - } - if (getStyleComputedProperty(element, 'position') === 'fixed') { - return true; - } - return isFixed(getParentNode(element)); - } - - /** - * Finds the first parent of an element that has a transformed property defined - * @method - * @memberof Popper.Utils - * @argument {Element} element - * @returns {Element} first transformed parent or documentElement - */ - - function getFixedPositionOffsetParent(element) { - // This check is needed to avoid errors in case one of the elements isn't defined for any reason - if (!element || !element.parentElement || isIE()) { - return document.documentElement; - } - var el = element.parentElement; - while (el && getStyleComputedProperty(el, 'transform') === 'none') { - el = el.parentElement; - } - return el || document.documentElement; - } - - /** - * Computed the boundaries limits and return them - * @method - * @memberof Popper.Utils - * @param {HTMLElement} popper - * @param {HTMLElement} reference - * @param {number} padding - * @param {HTMLElement} boundariesElement - Element used to define the boundaries - * @param {Boolean} fixedPosition - Is in fixed position mode - * @returns {Object} Coordinates of the boundaries - */ - function getBoundaries(popper, reference, padding, boundariesElement) { - var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; - - // NOTE: 1 DOM access here - - var boundaries = {top: 0, left: 0}; - var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference); - - // Handle viewport case - if (boundariesElement === 'viewport') { - boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition); - } else { - // Handle other cases based on DOM element used as boundaries - var boundariesNode = void 0; - if (boundariesElement === 'scrollParent') { - boundariesNode = getScrollParent(getParentNode(reference)); - if (boundariesNode.nodeName === 'BODY') { - boundariesNode = popper.ownerDocument.documentElement; - } - } else if (boundariesElement === 'window') { - boundariesNode = popper.ownerDocument.documentElement; - } else { - boundariesNode = boundariesElement; - } - - var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition); - - // In case of HTML, we need a different computation - if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) { - var _getWindowSizes = getWindowSizes(popper.ownerDocument), - height = _getWindowSizes.height, - width = _getWindowSizes.width; - - boundaries.top += offsets.top - offsets.marginTop; - boundaries.bottom = height + offsets.top; - boundaries.left += offsets.left - offsets.marginLeft; - boundaries.right = width + offsets.left; - } else { - // for all the other DOM elements, this one is good - boundaries = offsets; - } - } - - // Add paddings - padding = padding || 0; - var isPaddingNumber = typeof padding === 'number'; - boundaries.left += isPaddingNumber ? padding : padding.left || 0; - boundaries.top += isPaddingNumber ? padding : padding.top || 0; - boundaries.right -= isPaddingNumber ? padding : padding.right || 0; - boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0; - - return boundaries; - } - - function getArea(_ref) { - var width = _ref.width, - height = _ref.height; - - return width * height; - } - - /** - * Utility used to transform the `auto` placement to the placement with more - * available space. - * @method - * @memberof Popper.Utils - * @argument {Object} data - The data object generated by update method - * @argument {Object} options - Modifiers configuration and options - * @returns {Object} The data object, properly modified - */ - function computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) { - var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; - - if (placement.indexOf('auto') === -1) { - return placement; - } - - var boundaries = getBoundaries(popper, reference, padding, boundariesElement); - - var rects = { - top: { - width: boundaries.width, - height: refRect.top - boundaries.top - }, - right: { - width: boundaries.right - refRect.right, - height: boundaries.height - }, - bottom: { - width: boundaries.width, - height: boundaries.bottom - refRect.bottom - }, - left: { - width: refRect.left - boundaries.left, - height: boundaries.height - } - }; - - var sortedAreas = Object.keys(rects).map(function (key) { - return _extends({ - key: key - }, rects[key], { - area: getArea(rects[key]) - }); - }).sort(function (a, b) { - return b.area - a.area; - }); - - var filteredAreas = sortedAreas.filter(function (_ref2) { - var width = _ref2.width, - height = _ref2.height; - return width >= popper.clientWidth && height >= popper.clientHeight; - }); - - var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key; - - var variation = placement.split('-')[1]; - - return computedPlacement + (variation ? '-' + variation : ''); - } - - /** - * Get offsets to the reference element - * @method - * @memberof Popper.Utils - * @param {Object} state - * @param {Element} popper - the popper element - * @param {Element} reference - the reference element (the popper will be relative to this) - * @param {Element} fixedPosition - is in fixed position mode - * @returns {Object} An object containing the offsets which will be applied to the popper - */ - function getReferenceOffsets(state, popper, reference) { - var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null; - - var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference); - return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition); - } - - /** - * Get the outer sizes of the given element (offset size + margins) - * @method - * @memberof Popper.Utils - * @argument {Element} element - * @returns {Object} object containing width and height properties - */ - function getOuterSizes(element) { - var window = element.ownerDocument.defaultView; - var styles = window.getComputedStyle(element); - var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0); - var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0); - var result = { - width: element.offsetWidth + y, - height: element.offsetHeight + x - }; - return result; - } - - /** - * Get the opposite placement of the given one - * @method - * @memberof Popper.Utils - * @argument {String} placement - * @returns {String} flipped placement - */ - function getOppositePlacement(placement) { - var hash = {left: 'right', right: 'left', bottom: 'top', top: 'bottom'}; - return placement.replace(/left|right|bottom|top/g, function (matched) { - return hash[matched]; - }); - } - - /** - * Get offsets to the popper - * @method - * @memberof Popper.Utils - * @param {Object} position - CSS position the Popper will get applied - * @param {HTMLElement} popper - the popper element - * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this) - * @param {String} placement - one of the valid placement options - * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper - */ - function getPopperOffsets(popper, referenceOffsets, placement) { - placement = placement.split('-')[0]; - - // Get popper node sizes - var popperRect = getOuterSizes(popper); - - // Add position, width and height to our offsets object - var popperOffsets = { - width: popperRect.width, - height: popperRect.height - }; - - // depending by the popper placement we have to compute its offsets slightly differently - var isHoriz = ['right', 'left'].indexOf(placement) !== -1; - var mainSide = isHoriz ? 'top' : 'left'; - var secondarySide = isHoriz ? 'left' : 'top'; - var measurement = isHoriz ? 'height' : 'width'; - var secondaryMeasurement = !isHoriz ? 'height' : 'width'; - - popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2; - if (placement === secondarySide) { - popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement]; - } else { - popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)]; - } - - return popperOffsets; - } - - /** - * Mimics the `find` method of Array - * @method - * @memberof Popper.Utils - * @argument {Array} arr - * @argument prop - * @argument value - * @returns index or -1 - */ - function find(arr, check) { - // use native find if supported - if (Array.prototype.find) { - return arr.find(check); - } - - // use `filter` to obtain the same behavior of `find` - return arr.filter(check)[0]; - } - - /** - * Return the index of the matching object - * @method - * @memberof Popper.Utils - * @argument {Array} arr - * @argument prop - * @argument value - * @returns index or -1 - */ - function findIndex(arr, prop, value) { - // use native findIndex if supported - if (Array.prototype.findIndex) { - return arr.findIndex(function (cur) { - return cur[prop] === value; - }); - } - - // use `find` + `indexOf` if `findIndex` isn't supported - var match = find(arr, function (obj) { - return obj[prop] === value; - }); - return arr.indexOf(match); - } - - /** - * Loop trough the list of modifiers and run them in order, - * each of them will then edit the data object. - * @method - * @memberof Popper.Utils - * @param {dataObject} data - * @param {Array} modifiers - * @param {String} ends - Optional modifier name used as stopper - * @returns {dataObject} - */ - function runModifiers(modifiers, data, ends) { - var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends)); - - modifiersToRun.forEach(function (modifier) { - if (modifier['function']) { - // eslint-disable-line dot-notation - console.warn('`modifier.function` is deprecated, use `modifier.fn`!'); - } - var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation - if (modifier.enabled && isFunction(fn)) { - // Add properties to offsets to make them a complete clientRect object - // we do this before each modifier to make sure the previous one doesn't - // mess with these values - data.offsets.popper = getClientRect(data.offsets.popper); - data.offsets.reference = getClientRect(data.offsets.reference); - - data = fn(data, modifier); - } - }); - - return data; - } - - /** - * Updates the position of the popper, computing the new offsets and applying - * the new style.
- * Prefer `scheduleUpdate` over `update` because of performance reasons. - * @method - * @memberof Popper - */ - function update() { - // if popper is destroyed, don't perform any further update - if (this.state.isDestroyed) { - return; - } - - var data = { - instance: this, - styles: {}, - arrowStyles: {}, - attributes: {}, - flipped: false, - offsets: {} - }; - - // compute reference element offsets - data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed); - - // compute auto placement, store placement inside the data object, - // modifiers will be able to edit `placement` if needed - // and refer to originalPlacement to know the original value - data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding); - - // store the computed placement inside `originalPlacement` - data.originalPlacement = data.placement; - - data.positionFixed = this.options.positionFixed; - - // compute the popper offsets - data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement); - - data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute'; - - // run the modifiers - data = runModifiers(this.modifiers, data); - - // the first `update` will call `onCreate` callback - // the other ones will call `onUpdate` callback - if (!this.state.isCreated) { - this.state.isCreated = true; - this.options.onCreate(data); - } else { - this.options.onUpdate(data); - } - } - - /** - * Helper used to know if the given modifier is enabled. - * @method - * @memberof Popper.Utils - * @returns {Boolean} - */ - function isModifierEnabled(modifiers, modifierName) { - return modifiers.some(function (_ref) { - var name = _ref.name, - enabled = _ref.enabled; - return enabled && name === modifierName; - }); - } - - /** - * Get the prefixed supported property name - * @method - * @memberof Popper.Utils - * @argument {String} property (camelCase) - * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix) - */ - function getSupportedPropertyName(property) { - var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O']; - var upperProp = property.charAt(0).toUpperCase() + property.slice(1); - - for (var i = 0; i < prefixes.length; i++) { - var prefix = prefixes[i]; - var toCheck = prefix ? '' + prefix + upperProp : property; - if (typeof document.body.style[toCheck] !== 'undefined') { - return toCheck; - } - } - return null; - } - - /** - * Destroys the popper. - * @method - * @memberof Popper - */ - function destroy() { - this.state.isDestroyed = true; - - // touch DOM only if `applyStyle` modifier is enabled - if (isModifierEnabled(this.modifiers, 'applyStyle')) { - this.popper.removeAttribute('x-placement'); - this.popper.style.position = ''; - this.popper.style.top = ''; - this.popper.style.left = ''; - this.popper.style.right = ''; - this.popper.style.bottom = ''; - this.popper.style.willChange = ''; - this.popper.style[getSupportedPropertyName('transform')] = ''; - } - - this.disableEventListeners(); - - // remove the popper if user explicity asked for the deletion on destroy - // do not use `remove` because IE11 doesn't support it - if (this.options.removeOnDestroy) { - this.popper.parentNode.removeChild(this.popper); - } - return this; - } - - /** - * Get the window associated with the element - * @argument {Element} element - * @returns {Window} - */ - function getWindow(element) { - var ownerDocument = element.ownerDocument; - return ownerDocument ? ownerDocument.defaultView : window; - } - - function attachToScrollParents(scrollParent, event, callback, scrollParents) { - var isBody = scrollParent.nodeName === 'BODY'; - var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent; - target.addEventListener(event, callback, {passive: true}); - - if (!isBody) { - attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents); - } - scrollParents.push(target); - } - - /** - * Setup needed event listeners used to update the popper position - * @method - * @memberof Popper.Utils - * @private - */ - function setupEventListeners(reference, options, state, updateBound) { - // Resize event listener on window - state.updateBound = updateBound; - getWindow(reference).addEventListener('resize', state.updateBound, {passive: true}); - - // Scroll event listener on scroll parents - var scrollElement = getScrollParent(reference); - attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents); - state.scrollElement = scrollElement; - state.eventsEnabled = true; - - return state; - } - - /** - * It will add resize/scroll events and start recalculating - * position of the popper element when they are triggered. - * @method - * @memberof Popper - */ - function enableEventListeners() { - if (!this.state.eventsEnabled) { - this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate); - } - } - - /** - * Remove event listeners used to update the popper position - * @method - * @memberof Popper.Utils - * @private - */ - function removeEventListeners(reference, state) { - // Remove resize event listener on window - getWindow(reference).removeEventListener('resize', state.updateBound); - - // Remove scroll event listener on scroll parents - state.scrollParents.forEach(function (target) { - target.removeEventListener('scroll', state.updateBound); - }); - - // Reset state - state.updateBound = null; - state.scrollParents = []; - state.scrollElement = null; - state.eventsEnabled = false; - return state; - } - - /** - * It will remove resize/scroll events and won't recalculate popper position - * when they are triggered. It also won't trigger `onUpdate` callback anymore, - * unless you call `update` method manually. - * @method - * @memberof Popper - */ - function disableEventListeners() { - if (this.state.eventsEnabled) { - cancelAnimationFrame(this.scheduleUpdate); - this.state = removeEventListeners(this.reference, this.state); - } - } - - /** - * Tells if a given input is a number - * @method - * @memberof Popper.Utils - * @param {*} input to check - * @return {Boolean} - */ - function isNumeric(n) { - return n !== '' && !isNaN(parseFloat(n)) && isFinite(n); - } - - /** - * Set the style to the given popper - * @method - * @memberof Popper.Utils - * @argument {Element} element - Element to apply the style to - * @argument {Object} styles - * Object with a list of properties and values which will be applied to the element - */ - function setStyles(element, styles) { - Object.keys(styles).forEach(function (prop) { - var unit = ''; - // add unit if the value is numeric and is one of the following - if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) { - unit = 'px'; - } - element.style[prop] = styles[prop] + unit; - }); - } - - /** - * Set the attributes to the given popper - * @method - * @memberof Popper.Utils - * @argument {Element} element - Element to apply the attributes to - * @argument {Object} styles - * Object with a list of properties and values which will be applied to the element - */ - function setAttributes(element, attributes) { - Object.keys(attributes).forEach(function (prop) { - var value = attributes[prop]; - if (value !== false) { - element.setAttribute(prop, attributes[prop]); - } else { - element.removeAttribute(prop); - } - }); - } - - /** - * @function - * @memberof Modifiers - * @argument {Object} data - The data object generated by `update` method - * @argument {Object} data.styles - List of style properties - values to apply to popper element - * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element - * @argument {Object} options - Modifiers configuration and options - * @returns {Object} The same data object - */ - function applyStyle(data) { - // any property present in `data.styles` will be applied to the popper, - // in this way we can make the 3rd party modifiers add custom styles to it - // Be aware, modifiers could override the properties defined in the previous - // lines of this modifier! - setStyles(data.instance.popper, data.styles); - - // any property present in `data.attributes` will be applied to the popper, - // they will be set as HTML attributes of the element - setAttributes(data.instance.popper, data.attributes); - - // if arrowElement is defined and arrowStyles has some properties - if (data.arrowElement && Object.keys(data.arrowStyles).length) { - setStyles(data.arrowElement, data.arrowStyles); - } - - return data; - } - - /** - * Set the x-placement attribute before everything else because it could be used - * to add margins to the popper margins needs to be calculated to get the - * correct popper offsets. - * @method - * @memberof Popper.modifiers - * @param {HTMLElement} reference - The reference element used to position the popper - * @param {HTMLElement} popper - The HTML element used as popper - * @param {Object} options - Popper.js options - */ - function applyStyleOnLoad(reference, popper, options, modifierOptions, state) { - // compute reference element offsets - var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed); - - // compute auto placement, store placement inside the data object, - // modifiers will be able to edit `placement` if needed - // and refer to originalPlacement to know the original value - var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding); - - popper.setAttribute('x-placement', placement); - - // Apply `position` to popper before anything else because - // without the position applied we can't guarantee correct computations - setStyles(popper, {position: options.positionFixed ? 'fixed' : 'absolute'}); - - return options; - } - - /** - * @function - * @memberof Popper.Utils - * @argument {Object} data - The data object generated by `update` method - * @argument {Boolean} shouldRound - If the offsets should be rounded at all - * @returns {Object} The popper's position offsets rounded - * - * The tale of pixel-perfect positioning. It's still not 100% perfect, but as - * good as it can be within reason. - * Discussion here: https://github.com/FezVrasta/popper.js/pull/715 - * - * Low DPI screens cause a popper to be blurry if not using full pixels (Safari - * as well on High DPI screens). - * - * Firefox prefers no rounding for positioning and does not have blurriness on - * high DPI screens. - * - * Only horizontal placement and left/right values need to be considered. - */ - function getRoundedOffsets(data, shouldRound) { - var _data$offsets = data.offsets, - popper = _data$offsets.popper, - reference = _data$offsets.reference; - - - var isVertical = ['left', 'right'].indexOf(data.placement) !== -1; - var isVariation = data.placement.indexOf('-') !== -1; - var sameWidthOddness = reference.width % 2 === popper.width % 2; - var bothOddWidth = reference.width % 2 === 1 && popper.width % 2 === 1; - var noRound = function noRound(v) { - return v; - }; - - var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthOddness ? Math.round : Math.floor; - var verticalToInteger = !shouldRound ? noRound : Math.round; - - return { - left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left), - top: verticalToInteger(popper.top), - bottom: verticalToInteger(popper.bottom), - right: horizontalToInteger(popper.right) - }; - } - - var isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent); - - /** - * @function - * @memberof Modifiers - * @argument {Object} data - The data object generated by `update` method - * @argument {Object} options - Modifiers configuration and options - * @returns {Object} The data object, properly modified - */ - function computeStyle(data, options) { - var x = options.x, - y = options.y; - var popper = data.offsets.popper; - - // Remove this legacy support in Popper.js v2 - - var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) { - return modifier.name === 'applyStyle'; - }).gpuAcceleration; - if (legacyGpuAccelerationOption !== undefined) { - console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!'); - } - var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration; - - var offsetParent = getOffsetParent(data.instance.popper); - var offsetParentRect = getBoundingClientRect(offsetParent); - - // Styles - var styles = { - position: popper.position - }; - - var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox); - - var sideA = x === 'bottom' ? 'top' : 'bottom'; - var sideB = y === 'right' ? 'left' : 'right'; - - // if gpuAcceleration is set to `true` and transform is supported, - // we use `translate3d` to apply the position to the popper we - // automatically use the supported prefixed version if needed - var prefixedProperty = getSupportedPropertyName('transform'); - - // now, let's make a step back and look at this code closely (wtf?) - // If the content of the popper grows once it's been positioned, it - // may happen that the popper gets misplaced because of the new content - // overflowing its reference element - // To avoid this problem, we provide two options (x and y), which allow - // the consumer to define the offset origin. - // If we position a popper on top of a reference element, we can set - // `x` to `top` to make the popper grow towards its top instead of - // its bottom. - var left = void 0, - top = void 0; - if (sideA === 'bottom') { - // when offsetParent is the positioning is relative to the bottom of the screen (excluding the scrollbar) - // and not the bottom of the html element - if (offsetParent.nodeName === 'HTML') { - top = -offsetParent.clientHeight + offsets.bottom; - } else { - top = -offsetParentRect.height + offsets.bottom; - } - } else { - top = offsets.top; - } - if (sideB === 'right') { - if (offsetParent.nodeName === 'HTML') { - left = -offsetParent.clientWidth + offsets.right; - } else { - left = -offsetParentRect.width + offsets.right; - } - } else { - left = offsets.left; - } - if (gpuAcceleration && prefixedProperty) { - styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)'; - styles[sideA] = 0; - styles[sideB] = 0; - styles.willChange = 'transform'; - } else { - // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties - var invertTop = sideA === 'bottom' ? -1 : 1; - var invertLeft = sideB === 'right' ? -1 : 1; - styles[sideA] = top * invertTop; - styles[sideB] = left * invertLeft; - styles.willChange = sideA + ', ' + sideB; - } - - // Attributes - var attributes = { - 'x-placement': data.placement - }; - - // Update `data` attributes, styles and arrowStyles - data.attributes = _extends({}, attributes, data.attributes); - data.styles = _extends({}, styles, data.styles); - data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles); - - return data; - } - - /** - * Helper used to know if the given modifier depends from another one.
- * It checks if the needed modifier is listed and enabled. - * @method - * @memberof Popper.Utils - * @param {Array} modifiers - list of modifiers - * @param {String} requestingName - name of requesting modifier - * @param {String} requestedName - name of requested modifier - * @returns {Boolean} - */ - function isModifierRequired(modifiers, requestingName, requestedName) { - var requesting = find(modifiers, function (_ref) { - var name = _ref.name; - return name === requestingName; - }); - - var isRequired = !!requesting && modifiers.some(function (modifier) { - return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order; - }); - - if (!isRequired) { - var _requesting = '`' + requestingName + '`'; - var requested = '`' + requestedName + '`'; - console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!'); - } - return isRequired; - } - - /** - * @function - * @memberof Modifiers - * @argument {Object} data - The data object generated by update method - * @argument {Object} options - Modifiers configuration and options - * @returns {Object} The data object, properly modified - */ - function arrow(data, options) { - var _data$offsets$arrow; - - // arrow depends on keepTogether in order to work - if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) { - return data; - } - - var arrowElement = options.element; - - // if arrowElement is a string, suppose it's a CSS selector - if (typeof arrowElement === 'string') { - arrowElement = data.instance.popper.querySelector(arrowElement); - - // if arrowElement is not found, don't run the modifier - if (!arrowElement) { - return data; - } - } else { - // if the arrowElement isn't a query selector we must check that the - // provided DOM node is child of its popper node - if (!data.instance.popper.contains(arrowElement)) { - console.warn('WARNING: `arrow.element` must be child of its popper element!'); - return data; - } - } - - var placement = data.placement.split('-')[0]; - var _data$offsets = data.offsets, - popper = _data$offsets.popper, - reference = _data$offsets.reference; - - var isVertical = ['left', 'right'].indexOf(placement) !== -1; - - var len = isVertical ? 'height' : 'width'; - var sideCapitalized = isVertical ? 'Top' : 'Left'; - var side = sideCapitalized.toLowerCase(); - var altSide = isVertical ? 'left' : 'top'; - var opSide = isVertical ? 'bottom' : 'right'; - var arrowElementSize = getOuterSizes(arrowElement)[len]; - - // - // extends keepTogether behavior making sure the popper and its - // reference have enough pixels in conjunction - // - - // top/left side - if (reference[opSide] - arrowElementSize < popper[side]) { - data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize); - } - // bottom/right side - if (reference[side] + arrowElementSize > popper[opSide]) { - data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide]; - } - data.offsets.popper = getClientRect(data.offsets.popper); - - // compute center of the popper - var center = reference[side] + reference[len] / 2 - arrowElementSize / 2; - - // Compute the sideValue using the updated popper offsets - // take popper margin in account because we don't have this info available - var css = getStyleComputedProperty(data.instance.popper); - var popperMarginSide = parseFloat(css['margin' + sideCapitalized], 10); - var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width'], 10); - var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide; - - // prevent arrowElement from being placed not contiguously to its popper - sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0); - - data.arrowElement = arrowElement; - data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow); - - return data; - } - - /** - * Get the opposite placement variation of the given one - * @method - * @memberof Popper.Utils - * @argument {String} placement variation - * @returns {String} flipped placement variation - */ - function getOppositeVariation(variation) { - if (variation === 'end') { - return 'start'; - } else if (variation === 'start') { - return 'end'; - } - return variation; - } - - /** - * List of accepted placements to use as values of the `placement` option.
- * Valid placements are: - * - `auto` - * - `top` - * - `right` - * - `bottom` - * - `left` - * - * Each placement can have a variation from this list: - * - `-start` - * - `-end` - * - * Variations are interpreted easily if you think of them as the left to right - * written languages. Horizontally (`top` and `bottom`), `start` is left and `end` - * is right.
- * Vertically (`left` and `right`), `start` is top and `end` is bottom. - * - * Some valid examples are: - * - `top-end` (on top of reference, right aligned) - * - `right-start` (on right of reference, top aligned) - * - `bottom` (on bottom, centered) - * - `auto-end` (on the side with more space available, alignment depends by placement) - * - * @static - * @type {Array} - * @enum {String} - * @readonly - * @method placements - * @memberof Popper - */ - var placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start']; - - // Get rid of `auto` `auto-start` and `auto-end` - var validPlacements = placements.slice(3); - - /** - * Given an initial placement, returns all the subsequent placements - * clockwise (or counter-clockwise). - * - * @method - * @memberof Popper.Utils - * @argument {String} placement - A valid placement (it accepts variations) - * @argument {Boolean} counter - Set to true to walk the placements counterclockwise - * @returns {Array} placements including their variations - */ - function clockwise(placement) { - var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - - var index = validPlacements.indexOf(placement); - var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index)); - return counter ? arr.reverse() : arr; - } - - var BEHAVIORS = { - FLIP: 'flip', - CLOCKWISE: 'clockwise', - COUNTERCLOCKWISE: 'counterclockwise' - }; - - /** - * @function - * @memberof Modifiers - * @argument {Object} data - The data object generated by update method - * @argument {Object} options - Modifiers configuration and options - * @returns {Object} The data object, properly modified - */ - function flip(data, options) { - // if `inner` modifier is enabled, we can't use the `flip` modifier - if (isModifierEnabled(data.instance.modifiers, 'inner')) { - return data; - } - - if (data.flipped && data.placement === data.originalPlacement) { - // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides - return data; - } - - var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed); - - var placement = data.placement.split('-')[0]; - var placementOpposite = getOppositePlacement(placement); - var variation = data.placement.split('-')[1] || ''; - - var flipOrder = []; - - switch (options.behavior) { - case BEHAVIORS.FLIP: - flipOrder = [placement, placementOpposite]; - break; - case BEHAVIORS.CLOCKWISE: - flipOrder = clockwise(placement); - break; - case BEHAVIORS.COUNTERCLOCKWISE: - flipOrder = clockwise(placement, true); - break; - default: - flipOrder = options.behavior; - } - - flipOrder.forEach(function (step, index) { - if (placement !== step || flipOrder.length === index + 1) { - return data; - } - - placement = data.placement.split('-')[0]; - placementOpposite = getOppositePlacement(placement); - - var popperOffsets = data.offsets.popper; - var refOffsets = data.offsets.reference; - - // using floor because the reference offsets may contain decimals we are not going to consider here - var floor = Math.floor; - var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom); - - var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left); - var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right); - var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top); - var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom); - - var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom; - - // flip the variation if required - var isVertical = ['top', 'bottom'].indexOf(placement) !== -1; - var flippedVariation = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom); - - if (overlapsRef || overflowsBoundaries || flippedVariation) { - // this boolean to detect any flip loop - data.flipped = true; - - if (overlapsRef || overflowsBoundaries) { - placement = flipOrder[index + 1]; - } - - if (flippedVariation) { - variation = getOppositeVariation(variation); - } - - data.placement = placement + (variation ? '-' + variation : ''); - - // this object contains `position`, we want to preserve it along with - // any additional property we may add in the future - data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement)); - - data = runModifiers(data.instance.modifiers, data, 'flip'); - } - }); - return data; - } - - /** - * @function - * @memberof Modifiers - * @argument {Object} data - The data object generated by update method - * @argument {Object} options - Modifiers configuration and options - * @returns {Object} The data object, properly modified - */ - function keepTogether(data) { - var _data$offsets = data.offsets, - popper = _data$offsets.popper, - reference = _data$offsets.reference; - - var placement = data.placement.split('-')[0]; - var floor = Math.floor; - var isVertical = ['top', 'bottom'].indexOf(placement) !== -1; - var side = isVertical ? 'right' : 'bottom'; - var opSide = isVertical ? 'left' : 'top'; - var measurement = isVertical ? 'width' : 'height'; - - if (popper[side] < floor(reference[opSide])) { - data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement]; - } - if (popper[opSide] > floor(reference[side])) { - data.offsets.popper[opSide] = floor(reference[side]); - } - - return data; - } - - /** - * Converts a string containing value + unit into a px value number - * @function - * @memberof {modifiers~offset} - * @private - * @argument {String} str - Value + unit string - * @argument {String} measurement - `height` or `width` - * @argument {Object} popperOffsets - * @argument {Object} referenceOffsets - * @returns {Number|String} - * Value in pixels, or original string if no values were extracted - */ - function toValue(str, measurement, popperOffsets, referenceOffsets) { - // separate value from unit - var split = str.match(/((?:\-|\+)?\d*\.?\d*)(.*)/); - var value = +split[1]; - var unit = split[2]; - - // If it's not a number it's an operator, I guess - if (!value) { - return str; - } - - if (unit.indexOf('%') === 0) { - var element = void 0; - switch (unit) { - case '%p': - element = popperOffsets; - break; - case '%': - case '%r': - default: - element = referenceOffsets; - } - - var rect = getClientRect(element); - return rect[measurement] / 100 * value; - } else if (unit === 'vh' || unit === 'vw') { - // if is a vh or vw, we calculate the size based on the viewport - var size = void 0; - if (unit === 'vh') { - size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0); - } else { - size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); - } - return size / 100 * value; - } else { - // if is an explicit pixel unit, we get rid of the unit and keep the value - // if is an implicit unit, it's px, and we return just the value - return value; - } - } - - /** - * Parse an `offset` string to extrapolate `x` and `y` numeric offsets. - * @function - * @memberof {modifiers~offset} - * @private - * @argument {String} offset - * @argument {Object} popperOffsets - * @argument {Object} referenceOffsets - * @argument {String} basePlacement - * @returns {Array} a two cells array with x and y offsets in numbers - */ - function parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) { - var offsets = [0, 0]; - - // Use height if placement is left or right and index is 0 otherwise use width - // in this way the first offset will use an axis and the second one - // will use the other one - var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1; - - // Split the offset string to obtain a list of values and operands - // The regex addresses values with the plus or minus sign in front (+10, -20, etc) - var fragments = offset.split(/(\+|\-)/).map(function (frag) { - return frag.trim(); - }); - - // Detect if the offset string contains a pair of values or a single one - // they could be separated by comma or space - var divider = fragments.indexOf(find(fragments, function (frag) { - return frag.search(/,|\s/) !== -1; - })); - - if (fragments[divider] && fragments[divider].indexOf(',') === -1) { - console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.'); - } - - // If divider is found, we divide the list of values and operands to divide - // them by ofset X and Y. - var splitRegex = /\s*,\s*|\s+/; - var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments]; - - // Convert the values with units to absolute pixels to allow our computations - ops = ops.map(function (op, index) { - // Most of the units rely on the orientation of the popper - var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width'; - var mergeWithPrevious = false; - return op - // This aggregates any `+` or `-` sign that aren't considered operators - // e.g.: 10 + +5 => [10, +, +5] - .reduce(function (a, b) { - if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) { - a[a.length - 1] = b; - mergeWithPrevious = true; - return a; - } else if (mergeWithPrevious) { - a[a.length - 1] += b; - mergeWithPrevious = false; - return a; - } else { - return a.concat(b); - } - }, []) - // Here we convert the string values into number values (in px) - .map(function (str) { - return toValue(str, measurement, popperOffsets, referenceOffsets); - }); - }); - - // Loop trough the offsets arrays and execute the operations - ops.forEach(function (op, index) { - op.forEach(function (frag, index2) { - if (isNumeric(frag)) { - offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1); - } - }); - }); - return offsets; - } - - /** - * @function - * @memberof Modifiers - * @argument {Object} data - The data object generated by update method - * @argument {Object} options - Modifiers configuration and options - * @argument {Number|String} options.offset=0 - * The offset value as described in the modifier description - * @returns {Object} The data object, properly modified - */ - function offset(data, _ref) { - var offset = _ref.offset; - var placement = data.placement, - _data$offsets = data.offsets, - popper = _data$offsets.popper, - reference = _data$offsets.reference; - - var basePlacement = placement.split('-')[0]; - - var offsets = void 0; - if (isNumeric(+offset)) { - offsets = [+offset, 0]; - } else { - offsets = parseOffset(offset, popper, reference, basePlacement); - } - - if (basePlacement === 'left') { - popper.top += offsets[0]; - popper.left -= offsets[1]; - } else if (basePlacement === 'right') { - popper.top += offsets[0]; - popper.left += offsets[1]; - } else if (basePlacement === 'top') { - popper.left += offsets[0]; - popper.top -= offsets[1]; - } else if (basePlacement === 'bottom') { - popper.left += offsets[0]; - popper.top += offsets[1]; - } - - data.popper = popper; - return data; - } - - /** - * @function - * @memberof Modifiers - * @argument {Object} data - The data object generated by `update` method - * @argument {Object} options - Modifiers configuration and options - * @returns {Object} The data object, properly modified - */ - function preventOverflow(data, options) { - var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper); - - // If offsetParent is the reference element, we really want to - // go one step up and use the next offsetParent as reference to - // avoid to make this modifier completely useless and look like broken - if (data.instance.reference === boundariesElement) { - boundariesElement = getOffsetParent(boundariesElement); - } - - // NOTE: DOM access here - // resets the popper's position so that the document size can be calculated excluding - // the size of the popper element itself - var transformProp = getSupportedPropertyName('transform'); - var popperStyles = data.instance.popper.style; // assignment to help minification - var top = popperStyles.top, - left = popperStyles.left, - transform = popperStyles[transformProp]; - - popperStyles.top = ''; - popperStyles.left = ''; - popperStyles[transformProp] = ''; - - var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed); - - // NOTE: DOM access here - // restores the original style properties after the offsets have been computed - popperStyles.top = top; - popperStyles.left = left; - popperStyles[transformProp] = transform; - - options.boundaries = boundaries; - - var order = options.priority; - var popper = data.offsets.popper; - - var check = { - primary: function primary(placement) { - var value = popper[placement]; - if (popper[placement] < boundaries[placement] && !options.escapeWithReference) { - value = Math.max(popper[placement], boundaries[placement]); - } - return defineProperty({}, placement, value); - }, - secondary: function secondary(placement) { - var mainSide = placement === 'right' ? 'left' : 'top'; - var value = popper[mainSide]; - if (popper[placement] > boundaries[placement] && !options.escapeWithReference) { - value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height)); - } - return defineProperty({}, mainSide, value); - } - }; - - order.forEach(function (placement) { - var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary'; - popper = _extends({}, popper, check[side](placement)); - }); - - data.offsets.popper = popper; - - return data; - } - - /** - * @function - * @memberof Modifiers - * @argument {Object} data - The data object generated by `update` method - * @argument {Object} options - Modifiers configuration and options - * @returns {Object} The data object, properly modified - */ - function shift(data) { - var placement = data.placement; - var basePlacement = placement.split('-')[0]; - var shiftvariation = placement.split('-')[1]; - - // if shift shiftvariation is specified, run the modifier - if (shiftvariation) { - var _data$offsets = data.offsets, - reference = _data$offsets.reference, - popper = _data$offsets.popper; - - var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1; - var side = isVertical ? 'left' : 'top'; - var measurement = isVertical ? 'width' : 'height'; - - var shiftOffsets = { - start: defineProperty({}, side, reference[side]), - end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement]) - }; - - data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]); - } - - return data; - } - - /** - * @function - * @memberof Modifiers - * @argument {Object} data - The data object generated by update method - * @argument {Object} options - Modifiers configuration and options - * @returns {Object} The data object, properly modified - */ - function hide(data) { - if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) { - return data; - } - - var refRect = data.offsets.reference; - var bound = find(data.instance.modifiers, function (modifier) { - return modifier.name === 'preventOverflow'; - }).boundaries; - - if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) { - // Avoid unnecessary DOM access if visibility hasn't changed - if (data.hide === true) { - return data; - } - - data.hide = true; - data.attributes['x-out-of-boundaries'] = ''; - } else { - // Avoid unnecessary DOM access if visibility hasn't changed - if (data.hide === false) { - return data; - } - - data.hide = false; - data.attributes['x-out-of-boundaries'] = false; - } - - return data; - } - - /** - * @function - * @memberof Modifiers - * @argument {Object} data - The data object generated by `update` method - * @argument {Object} options - Modifiers configuration and options - * @returns {Object} The data object, properly modified - */ - function inner(data) { - var placement = data.placement; - var basePlacement = placement.split('-')[0]; - var _data$offsets = data.offsets, - popper = _data$offsets.popper, - reference = _data$offsets.reference; - - var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1; - - var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1; - - popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0); - - data.placement = getOppositePlacement(placement); - data.offsets.popper = getClientRect(popper); - - return data; - } - - /** - * Modifier function, each modifier can have a function of this type assigned - * to its `fn` property.
- * These functions will be called on each update, this means that you must - * make sure they are performant enough to avoid performance bottlenecks. - * - * @function ModifierFn - * @argument {dataObject} data - The data object generated by `update` method - * @argument {Object} options - Modifiers configuration and options - * @returns {dataObject} The data object, properly modified - */ - - /** - * Modifiers are plugins used to alter the behavior of your poppers.
- * Popper.js uses a set of 9 modifiers to provide all the basic functionalities - * needed by the library. - * - * Usually you don't want to override the `order`, `fn` and `onLoad` props. - * All the other properties are configurations that could be tweaked. - * @namespace modifiers - */ - var modifiers = { - /** - * Modifier used to shift the popper on the start or end of its reference - * element.
- * It will read the variation of the `placement` property.
- * It can be one either `-end` or `-start`. - * @memberof modifiers - * @inner - */ - shift: { - /** @prop {number} order=100 - Index used to define the order of execution */ - order: 100, - /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ - enabled: true, - /** @prop {ModifierFn} */ - fn: shift - }, - - /** - * The `offset` modifier can shift your popper on both its axis. - * - * It accepts the following units: - * - `px` or unit-less, interpreted as pixels - * - `%` or `%r`, percentage relative to the length of the reference element - * - `%p`, percentage relative to the length of the popper element - * - `vw`, CSS viewport width unit - * - `vh`, CSS viewport height unit - * - * For length is intended the main axis relative to the placement of the popper.
- * This means that if the placement is `top` or `bottom`, the length will be the - * `width`. In case of `left` or `right`, it will be the `height`. - * - * You can provide a single value (as `Number` or `String`), or a pair of values - * as `String` divided by a comma or one (or more) white spaces.
- * The latter is a deprecated method because it leads to confusion and will be - * removed in v2.
- * Additionally, it accepts additions and subtractions between different units. - * Note that multiplications and divisions aren't supported. - * - * Valid examples are: - * ``` - * 10 - * '10%' - * '10, 10' - * '10%, 10' - * '10 + 10%' - * '10 - 5vh + 3%' - * '-10px + 5vh, 5px - 6%' - * ``` - * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap - * > with their reference element, unfortunately, you will have to disable the `flip` modifier. - * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373). - * - * @memberof modifiers - * @inner - */ - offset: { - /** @prop {number} order=200 - Index used to define the order of execution */ - order: 200, - /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ - enabled: true, - /** @prop {ModifierFn} */ - fn: offset, - /** @prop {Number|String} offset=0 - * The offset value as described in the modifier description - */ - offset: 0 - }, - - /** - * Modifier used to prevent the popper from being positioned outside the boundary. - * - * A scenario exists where the reference itself is not within the boundaries.
- * We can say it has "escaped the boundaries" — or just "escaped".
- * In this case we need to decide whether the popper should either: - * - * - detach from the reference and remain "trapped" in the boundaries, or - * - if it should ignore the boundary and "escape with its reference" - * - * When `escapeWithReference` is set to`true` and reference is completely - * outside its boundaries, the popper will overflow (or completely leave) - * the boundaries in order to remain attached to the edge of the reference. - * - * @memberof modifiers - * @inner - */ - preventOverflow: { - /** @prop {number} order=300 - Index used to define the order of execution */ - order: 300, - /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ - enabled: true, - /** @prop {ModifierFn} */ - fn: preventOverflow, - /** - * @prop {Array} [priority=['left','right','top','bottom']] - * Popper will try to prevent overflow following these priorities by default, - * then, it could overflow on the left and on top of the `boundariesElement` - */ - priority: ['left', 'right', 'top', 'bottom'], - /** - * @prop {number} padding=5 - * Amount of pixel used to define a minimum distance between the boundaries - * and the popper. This makes sure the popper always has a little padding - * between the edges of its container - */ - padding: 5, - /** - * @prop {String|HTMLElement} boundariesElement='scrollParent' - * Boundaries used by the modifier. Can be `scrollParent`, `window`, - * `viewport` or any DOM element. - */ - boundariesElement: 'scrollParent' - }, - - /** - * Modifier used to make sure the reference and its popper stay near each other - * without leaving any gap between the two. Especially useful when the arrow is - * enabled and you want to ensure that it points to its reference element. - * It cares only about the first axis. You can still have poppers with margin - * between the popper and its reference element. - * @memberof modifiers - * @inner - */ - keepTogether: { - /** @prop {number} order=400 - Index used to define the order of execution */ - order: 400, - /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ - enabled: true, - /** @prop {ModifierFn} */ - fn: keepTogether - }, - - /** - * This modifier is used to move the `arrowElement` of the popper to make - * sure it is positioned between the reference element and its popper element. - * It will read the outer size of the `arrowElement` node to detect how many - * pixels of conjunction are needed. - * - * It has no effect if no `arrowElement` is provided. - * @memberof modifiers - * @inner - */ - arrow: { - /** @prop {number} order=500 - Index used to define the order of execution */ - order: 500, - /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ - enabled: true, - /** @prop {ModifierFn} */ - fn: arrow, - /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */ - element: '[x-arrow]' - }, - - /** - * Modifier used to flip the popper's placement when it starts to overlap its - * reference element. - * - * Requires the `preventOverflow` modifier before it in order to work. - * - * **NOTE:** this modifier will interrupt the current update cycle and will - * restart it if it detects the need to flip the placement. - * @memberof modifiers - * @inner - */ - flip: { - /** @prop {number} order=600 - Index used to define the order of execution */ - order: 600, - /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ - enabled: true, - /** @prop {ModifierFn} */ - fn: flip, - /** - * @prop {String|Array} behavior='flip' - * The behavior used to change the popper's placement. It can be one of - * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid - * placements (with optional variations) - */ - behavior: 'flip', - /** - * @prop {number} padding=5 - * The popper will flip if it hits the edges of the `boundariesElement` - */ - padding: 5, - /** - * @prop {String|HTMLElement} boundariesElement='viewport' - * The element which will define the boundaries of the popper position. - * The popper will never be placed outside of the defined boundaries - * (except if `keepTogether` is enabled) - */ - boundariesElement: 'viewport' - }, - - /** - * Modifier used to make the popper flow toward the inner of the reference element. - * By default, when this modifier is disabled, the popper will be placed outside - * the reference element. - * @memberof modifiers - * @inner - */ - inner: { - /** @prop {number} order=700 - Index used to define the order of execution */ - order: 700, - /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */ - enabled: false, - /** @prop {ModifierFn} */ - fn: inner - }, - - /** - * Modifier used to hide the popper when its reference element is outside of the - * popper boundaries. It will set a `x-out-of-boundaries` attribute which can - * be used to hide with a CSS selector the popper when its reference is - * out of boundaries. - * - * Requires the `preventOverflow` modifier before it in order to work. - * @memberof modifiers - * @inner - */ - hide: { - /** @prop {number} order=800 - Index used to define the order of execution */ - order: 800, - /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ - enabled: true, - /** @prop {ModifierFn} */ - fn: hide - }, - - /** - * Computes the style that will be applied to the popper element to gets - * properly positioned. - * - * Note that this modifier will not touch the DOM, it just prepares the styles - * so that `applyStyle` modifier can apply it. This separation is useful - * in case you need to replace `applyStyle` with a custom implementation. - * - * This modifier has `850` as `order` value to maintain backward compatibility - * with previous versions of Popper.js. Expect the modifiers ordering method - * to change in future major versions of the library. - * - * @memberof modifiers - * @inner - */ - computeStyle: { - /** @prop {number} order=850 - Index used to define the order of execution */ - order: 850, - /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ - enabled: true, - /** @prop {ModifierFn} */ - fn: computeStyle, - /** - * @prop {Boolean} gpuAcceleration=true - * If true, it uses the CSS 3D transformation to position the popper. - * Otherwise, it will use the `top` and `left` properties - */ - gpuAcceleration: true, - /** - * @prop {string} [x='bottom'] - * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin. - * Change this if your popper should grow in a direction different from `bottom` - */ - x: 'bottom', - /** - * @prop {string} [x='left'] - * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin. - * Change this if your popper should grow in a direction different from `right` - */ - y: 'right' - }, - - /** - * Applies the computed styles to the popper element. - * - * All the DOM manipulations are limited to this modifier. This is useful in case - * you want to integrate Popper.js inside a framework or view library and you - * want to delegate all the DOM manipulations to it. - * - * Note that if you disable this modifier, you must make sure the popper element - * has its position set to `absolute` before Popper.js can do its work! - * - * Just disable this modifier and define your own to achieve the desired effect. - * - * @memberof modifiers - * @inner - */ - applyStyle: { - /** @prop {number} order=900 - Index used to define the order of execution */ - order: 900, - /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ - enabled: true, - /** @prop {ModifierFn} */ - fn: applyStyle, - /** @prop {Function} */ - onLoad: applyStyleOnLoad, - /** - * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier - * @prop {Boolean} gpuAcceleration=true - * If true, it uses the CSS 3D transformation to position the popper. - * Otherwise, it will use the `top` and `left` properties - */ - gpuAcceleration: undefined - } - }; - - /** - * The `dataObject` is an object containing all the information used by Popper.js. - * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks. - * @name dataObject - * @property {Object} data.instance The Popper.js instance - * @property {String} data.placement Placement applied to popper - * @property {String} data.originalPlacement Placement originally defined on init - * @property {Boolean} data.flipped True if popper has been flipped by flip modifier - * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper - * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier - * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`) - * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`) - * @property {Object} data.boundaries Offsets of the popper boundaries - * @property {Object} data.offsets The measurements of popper, reference and arrow elements - * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values - * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values - * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0 - */ - - /** - * Default options provided to Popper.js constructor.
- * These can be overridden using the `options` argument of Popper.js.
- * To override an option, simply pass an object with the same - * structure of the `options` object, as the 3rd argument. For example: - * ``` - * new Popper(ref, pop, { - * modifiers: { - * preventOverflow: { enabled: false } - * } - * }) - * ``` - * @type {Object} - * @static - * @memberof Popper - */ - var Defaults = { - /** - * Popper's placement. - * @prop {Popper.placements} placement='bottom' - */ - placement: 'bottom', - - /** - * Set this to true if you want popper to position it self in 'fixed' mode - * @prop {Boolean} positionFixed=false - */ - positionFixed: false, - - /** - * Whether events (resize, scroll) are initially enabled. - * @prop {Boolean} eventsEnabled=true - */ - eventsEnabled: true, - - /** - * Set to true if you want to automatically remove the popper when - * you call the `destroy` method. - * @prop {Boolean} removeOnDestroy=false - */ - removeOnDestroy: false, - - /** - * Callback called when the popper is created.
- * By default, it is set to no-op.
- * Access Popper.js instance with `data.instance`. - * @prop {onCreate} - */ - onCreate: function onCreate() { - }, - - /** - * Callback called when the popper is updated. This callback is not called - * on the initialization/creation of the popper, but only on subsequent - * updates.
- * By default, it is set to no-op.
- * Access Popper.js instance with `data.instance`. - * @prop {onUpdate} - */ - onUpdate: function onUpdate() { - }, - - /** - * List of modifiers used to modify the offsets before they are applied to the popper. - * They provide most of the functionalities of Popper.js. - * @prop {modifiers} - */ - modifiers: modifiers - }; - - /** - * @callback onCreate - * @param {dataObject} data - */ - - /** - * @callback onUpdate - * @param {dataObject} data - */ - - // Utils - // Methods - var Popper = function () { - /** - * Creates a new Popper.js instance. - * @class Popper - * @param {HTMLElement|referenceObject} reference - The reference element used to position the popper - * @param {HTMLElement} popper - The HTML element used as the popper - * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults) - * @return {Object} instance - The generated Popper.js instance - */ - function Popper(reference, popper) { - var _this = this; - - var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - classCallCheck(this, Popper); - - this.scheduleUpdate = function () { - return requestAnimationFrame(_this.update); - }; - - // make update() debounced, so that it only runs at most once-per-tick - this.update = debounce(this.update.bind(this)); - - // with {} we create a new object with the options inside it - this.options = _extends({}, Popper.Defaults, options); - - // init state - this.state = { - isDestroyed: false, - isCreated: false, - scrollParents: [] - }; - - // get reference and popper elements (allow jQuery wrappers) - this.reference = reference && reference.jquery ? reference[0] : reference; - this.popper = popper && popper.jquery ? popper[0] : popper; - - // Deep merge modifiers options - this.options.modifiers = {}; - Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) { - _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {}); - }); - - // Refactoring modifiers' list (Object => Array) - this.modifiers = Object.keys(this.options.modifiers).map(function (name) { - return _extends({ - name: name - }, _this.options.modifiers[name]); - }) - // sort the modifiers by order - .sort(function (a, b) { - return a.order - b.order; - }); - - // modifiers have the ability to execute arbitrary code when Popper.js get inited - // such code is executed in the same order of its modifier - // they could add new properties to their options configuration - // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`! - this.modifiers.forEach(function (modifierOptions) { - if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) { - modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state); - } - }); - - // fire the first update to position the popper in the right place - this.update(); - - var eventsEnabled = this.options.eventsEnabled; - if (eventsEnabled) { - // setup event listeners, they will take care of update the position in specific situations - this.enableEventListeners(); - } - - this.state.eventsEnabled = eventsEnabled; - } - - // We can't use class properties because they don't get listed in the - // class prototype and break stuff like Sinon stubs - - - createClass(Popper, [{ - key: 'update', - value: function update$$1() { - return update.call(this); - } - }, { - key: 'destroy', - value: function destroy$$1() { - return destroy.call(this); - } - }, { - key: 'enableEventListeners', - value: function enableEventListeners$$1() { - return enableEventListeners.call(this); - } - }, { - key: 'disableEventListeners', - value: function disableEventListeners$$1() { - return disableEventListeners.call(this); - } - - /** - * Schedules an update. It will run on the next UI update available. - * @method scheduleUpdate - * @memberof Popper - */ - - - /** - * Collection of utilities useful when writing custom modifiers. - * Starting from version 1.7, this method is available only if you - * include `popper-utils.js` before `popper.js`. - * - * **DEPRECATION**: This way to access PopperUtils is deprecated - * and will be removed in v2! Use the PopperUtils module directly instead. - * Due to the high instability of the methods contained in Utils, we can't - * guarantee them to follow semver. Use them at your own risk! - * @static - * @private - * @type {Object} - * @deprecated since version 1.8 - * @member Utils - * @memberof Popper - */ - - }]); - return Popper; - }(); - - /** - * The `referenceObject` is an object that provides an interface compatible with Popper.js - * and lets you use it as replacement of a real DOM node.
- * You can use this method to position a popper relatively to a set of coordinates - * in case you don't have a DOM node to use as reference. - * - * ``` - * new Popper(referenceObject, popperNode); - * ``` - * - * NB: This feature isn't supported in Internet Explorer 10. - * @name referenceObject - * @property {Function} data.getBoundingClientRect - * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method. - * @property {number} data.clientWidth - * An ES6 getter that will return the width of the virtual reference element. - * @property {number} data.clientHeight - * An ES6 getter that will return the height of the virtual reference element. - */ - - - Popper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils; - Popper.placements = placements; - Popper.Defaults = Defaults; - - /** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - - var NAME$4 = 'dropdown'; - var VERSION$4 = '4.2.1'; - var DATA_KEY$4 = 'bs.dropdown'; - var EVENT_KEY$4 = "." + DATA_KEY$4; - var DATA_API_KEY$4 = '.data-api'; - var JQUERY_NO_CONFLICT$4 = $.fn[NAME$4]; - var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key - - var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key - - var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key - - var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key - - var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key - - var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse) - - var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + "|" + ARROW_DOWN_KEYCODE + "|" + ESCAPE_KEYCODE); - var Event$4 = { - HIDE: "hide" + EVENT_KEY$4, - HIDDEN: "hidden" + EVENT_KEY$4, - SHOW: "show" + EVENT_KEY$4, - SHOWN: "shown" + EVENT_KEY$4, - CLICK: "click" + EVENT_KEY$4, - CLICK_DATA_API: "click" + EVENT_KEY$4 + DATA_API_KEY$4, - KEYDOWN_DATA_API: "keydown" + EVENT_KEY$4 + DATA_API_KEY$4, - KEYUP_DATA_API: "keyup" + EVENT_KEY$4 + DATA_API_KEY$4 - }; - var ClassName$4 = { - DISABLED: 'disabled', - SHOW: 'show', - DROPUP: 'dropup', - DROPRIGHT: 'dropright', - DROPLEFT: 'dropleft', - MENURIGHT: 'dropdown-menu-right', - MENULEFT: 'dropdown-menu-left', - POSITION_STATIC: 'position-static' - }; - var Selector$4 = { - DATA_TOGGLE: '[data-toggle="dropdown"]', - FORM_CHILD: '.dropdown form', - MENU: '.dropdown-menu', - NAVBAR_NAV: '.navbar-nav', - VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)' - }; - var AttachmentMap = { - TOP: 'top-start', - TOPEND: 'top-end', - BOTTOM: 'bottom-start', - BOTTOMEND: 'bottom-end', - RIGHT: 'right-start', - RIGHTEND: 'right-end', - LEFT: 'left-start', - LEFTEND: 'left-end' - }; - var Default$2 = { - offset: 0, - flip: true, - boundary: 'scrollParent', - reference: 'toggle', - display: 'dynamic' - }; - var DefaultType$2 = { - offset: '(number|string|function)', - flip: 'boolean', - boundary: '(string|element)', - reference: '(string|element)', - display: 'string' - /** - * ------------------------------------------------------------------------ - * Class Definition - * ------------------------------------------------------------------------ - */ - - }; - - var Dropdown = - /*#__PURE__*/ - function () { - function Dropdown(element, config) { - this._element = element; - this._popper = null; - this._config = this._getConfig(config); - this._menu = this._getMenuElement(); - this._inNavbar = this._detectNavbar(); - - this._addEventListeners(); - } // Getters - - - var _proto = Dropdown.prototype; - - // Public - _proto.toggle = function toggle() { - if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED)) { - return; - } - - var parent = Dropdown._getParentFromElement(this._element); - - var isActive = $(this._menu).hasClass(ClassName$4.SHOW); - - Dropdown._clearMenus(); - - if (isActive) { - return; - } - - var relatedTarget = { - relatedTarget: this._element - }; - var showEvent = $.Event(Event$4.SHOW, relatedTarget); - $(parent).trigger(showEvent); - - if (showEvent.isDefaultPrevented()) { - return; - } // Disable totally Popper.js for Dropdown in Navbar - - - if (!this._inNavbar) { - /** - * Check for Popper dependency - * Popper - https://popper.js.org - */ - if (typeof Popper === 'undefined') { - throw new TypeError('Bootstrap\'s dropdowns require Popper.js (https://popper.js.org/)'); - } - - var referenceElement = this._element; - - if (this._config.reference === 'parent') { - referenceElement = parent; - } else if (Util.isElement(this._config.reference)) { - referenceElement = this._config.reference; // Check if it's jQuery element - - if (typeof this._config.reference.jquery !== 'undefined') { - referenceElement = this._config.reference[0]; - } - } // If boundary is not `scrollParent`, then set position to `static` - // to allow the menu to "escape" the scroll parent's boundaries - // https://github.com/twbs/bootstrap/issues/24251 - - - if (this._config.boundary !== 'scrollParent') { - $(parent).addClass(ClassName$4.POSITION_STATIC); - } - - this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig()); - } // If this is a touch-enabled device we add extra - // empty mouseover listeners to the body's immediate children; - // only needed because of broken event delegation on iOS - // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html - - - if ('ontouchstart' in document.documentElement && $(parent).closest(Selector$4.NAVBAR_NAV).length === 0) { - $(document.body).children().on('mouseover', null, $.noop); - } - - this._element.focus(); - - this._element.setAttribute('aria-expanded', true); - - $(this._menu).toggleClass(ClassName$4.SHOW); - $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget)); - }; - - _proto.show = function show() { - if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || $(this._menu).hasClass(ClassName$4.SHOW)) { - return; - } - - var relatedTarget = { - relatedTarget: this._element - }; - var showEvent = $.Event(Event$4.SHOW, relatedTarget); - - var parent = Dropdown._getParentFromElement(this._element); - - $(parent).trigger(showEvent); - - if (showEvent.isDefaultPrevented()) { - return; - } - - $(this._menu).toggleClass(ClassName$4.SHOW); - $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget)); - }; - - _proto.hide = function hide() { - if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || !$(this._menu).hasClass(ClassName$4.SHOW)) { - return; - } - - var relatedTarget = { - relatedTarget: this._element - }; - var hideEvent = $.Event(Event$4.HIDE, relatedTarget); - - var parent = Dropdown._getParentFromElement(this._element); - - $(parent).trigger(hideEvent); - - if (hideEvent.isDefaultPrevented()) { - return; - } - - $(this._menu).toggleClass(ClassName$4.SHOW); - $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget)); - }; - - _proto.dispose = function dispose() { - $.removeData(this._element, DATA_KEY$4); - $(this._element).off(EVENT_KEY$4); - this._element = null; - this._menu = null; - - if (this._popper !== null) { - this._popper.destroy(); - - this._popper = null; - } - }; - - _proto.update = function update() { - this._inNavbar = this._detectNavbar(); - - if (this._popper !== null) { - this._popper.scheduleUpdate(); - } - }; // Private - - - _proto._addEventListeners = function _addEventListeners() { - var _this = this; - - $(this._element).on(Event$4.CLICK, function (event) { - event.preventDefault(); - event.stopPropagation(); - - _this.toggle(); - }); - }; - - _proto._getConfig = function _getConfig(config) { - config = _objectSpread({}, this.constructor.Default, $(this._element).data(), config); - Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType); - return config; - }; - - _proto._getMenuElement = function _getMenuElement() { - if (!this._menu) { - var parent = Dropdown._getParentFromElement(this._element); - - if (parent) { - this._menu = parent.querySelector(Selector$4.MENU); - } - } - - return this._menu; - }; - - _proto._getPlacement = function _getPlacement() { - var $parentDropdown = $(this._element.parentNode); - var placement = AttachmentMap.BOTTOM; // Handle dropup - - if ($parentDropdown.hasClass(ClassName$4.DROPUP)) { - placement = AttachmentMap.TOP; - - if ($(this._menu).hasClass(ClassName$4.MENURIGHT)) { - placement = AttachmentMap.TOPEND; - } - } else if ($parentDropdown.hasClass(ClassName$4.DROPRIGHT)) { - placement = AttachmentMap.RIGHT; - } else if ($parentDropdown.hasClass(ClassName$4.DROPLEFT)) { - placement = AttachmentMap.LEFT; - } else if ($(this._menu).hasClass(ClassName$4.MENURIGHT)) { - placement = AttachmentMap.BOTTOMEND; - } - - return placement; - }; - - _proto._detectNavbar = function _detectNavbar() { - return $(this._element).closest('.navbar').length > 0; - }; - - _proto._getPopperConfig = function _getPopperConfig() { - var _this2 = this; - - var offsetConf = {}; - - if (typeof this._config.offset === 'function') { - offsetConf.fn = function (data) { - data.offsets = _objectSpread({}, data.offsets, _this2._config.offset(data.offsets) || {}); - return data; - }; - } else { - offsetConf.offset = this._config.offset; - } - - var popperConfig = { - placement: this._getPlacement(), - modifiers: { - offset: offsetConf, - flip: { - enabled: this._config.flip - }, - preventOverflow: { - boundariesElement: this._config.boundary - } - } // Disable Popper.js if we have a static display - - }; - - if (this._config.display === 'static') { - popperConfig.modifiers.applyStyle = { - enabled: false - }; - } - - return popperConfig; - }; // Static - - - Dropdown._jQueryInterface = function _jQueryInterface(config) { - return this.each(function () { - var data = $(this).data(DATA_KEY$4); - - var _config = typeof config === 'object' ? config : null; - - if (!data) { - data = new Dropdown(this, _config); - $(this).data(DATA_KEY$4, data); - } - - if (typeof config === 'string') { - if (typeof data[config] === 'undefined') { - throw new TypeError("No method named \"" + config + "\""); - } - - data[config](); - } - }); - }; - - Dropdown._clearMenus = function _clearMenus(event) { - if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) { - return; - } - - var toggles = [].slice.call(document.querySelectorAll(Selector$4.DATA_TOGGLE)); - - for (var i = 0, len = toggles.length; i < len; i++) { - var parent = Dropdown._getParentFromElement(toggles[i]); - - var context = $(toggles[i]).data(DATA_KEY$4); - var relatedTarget = { - relatedTarget: toggles[i] - }; - - if (event && event.type === 'click') { - relatedTarget.clickEvent = event; - } - - if (!context) { - continue; - } - - var dropdownMenu = context._menu; - - if (!$(parent).hasClass(ClassName$4.SHOW)) { - continue; - } - - if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $.contains(parent, event.target)) { - continue; - } - - var hideEvent = $.Event(Event$4.HIDE, relatedTarget); - $(parent).trigger(hideEvent); - - if (hideEvent.isDefaultPrevented()) { - continue; - } // If this is a touch-enabled device we remove the extra - // empty mouseover listeners we added for iOS support - - - if ('ontouchstart' in document.documentElement) { - $(document.body).children().off('mouseover', null, $.noop); - } - - toggles[i].setAttribute('aria-expanded', 'false'); - $(dropdownMenu).removeClass(ClassName$4.SHOW); - $(parent).removeClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget)); - } - }; - - Dropdown._getParentFromElement = function _getParentFromElement(element) { - var parent; - var selector = Util.getSelectorFromElement(element); - - if (selector) { - parent = document.querySelector(selector); - } - - return parent || element.parentNode; - }; // eslint-disable-next-line complexity - - - Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) { - // If not input/textarea: - // - And not a key in REGEXP_KEYDOWN => not a dropdown command - // If input/textarea: - // - If space key => not a dropdown command - // - If key is other than escape - // - If key is not up or down => not a dropdown command - // - If trigger inside the menu => not a dropdown command - if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $(event.target).closest(Selector$4.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) { - return; - } - - event.preventDefault(); - event.stopPropagation(); - - if (this.disabled || $(this).hasClass(ClassName$4.DISABLED)) { - return; - } - - var parent = Dropdown._getParentFromElement(this); - - var isActive = $(parent).hasClass(ClassName$4.SHOW); - - if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) { - if (event.which === ESCAPE_KEYCODE) { - var toggle = parent.querySelector(Selector$4.DATA_TOGGLE); - $(toggle).trigger('focus'); - } - - $(this).trigger('click'); - return; - } - - var items = [].slice.call(parent.querySelectorAll(Selector$4.VISIBLE_ITEMS)); - - if (items.length === 0) { - return; - } - - var index = items.indexOf(event.target); - - if (event.which === ARROW_UP_KEYCODE && index > 0) { - // Up - index--; - } - - if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { - // Down - index++; - } - - if (index < 0) { - index = 0; - } - - items[index].focus(); - }; - - _createClass(Dropdown, null, [{ - key: "VERSION", - get: function get() { - return VERSION$4; - } - }, { - key: "Default", - get: function get() { - return Default$2; - } - }, { - key: "DefaultType", - get: function get() { - return DefaultType$2; - } - }]); - - return Dropdown; - }(); - /** - * ------------------------------------------------------------------------ - * Data Api implementation - * ------------------------------------------------------------------------ - */ - - - $(document).on(Event$4.KEYDOWN_DATA_API, Selector$4.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event$4.KEYDOWN_DATA_API, Selector$4.MENU, Dropdown._dataApiKeydownHandler).on(Event$4.CLICK_DATA_API + " " + Event$4.KEYUP_DATA_API, Dropdown._clearMenus).on(Event$4.CLICK_DATA_API, Selector$4.DATA_TOGGLE, function (event) { - event.preventDefault(); - event.stopPropagation(); - - Dropdown._jQueryInterface.call($(this), 'toggle'); - }).on(Event$4.CLICK_DATA_API, Selector$4.FORM_CHILD, function (e) { - e.stopPropagation(); - }); - /** - * ------------------------------------------------------------------------ - * jQuery - * ------------------------------------------------------------------------ - */ - - $.fn[NAME$4] = Dropdown._jQueryInterface; - $.fn[NAME$4].Constructor = Dropdown; - - $.fn[NAME$4].noConflict = function () { - $.fn[NAME$4] = JQUERY_NO_CONFLICT$4; - return Dropdown._jQueryInterface; - }; - - /** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - - var NAME$5 = 'modal'; - var VERSION$5 = '4.2.1'; - var DATA_KEY$5 = 'bs.modal'; - var EVENT_KEY$5 = "." + DATA_KEY$5; - var DATA_API_KEY$5 = '.data-api'; - var JQUERY_NO_CONFLICT$5 = $.fn[NAME$5]; - var ESCAPE_KEYCODE$1 = 27; // KeyboardEvent.which value for Escape (Esc) key - - var Default$3 = { - backdrop: true, - keyboard: true, - focus: true, - show: true - }; - var DefaultType$3 = { - backdrop: '(boolean|string)', - keyboard: 'boolean', - focus: 'boolean', - show: 'boolean' - }; - var Event$5 = { - HIDE: "hide" + EVENT_KEY$5, - HIDDEN: "hidden" + EVENT_KEY$5, - SHOW: "show" + EVENT_KEY$5, - SHOWN: "shown" + EVENT_KEY$5, - FOCUSIN: "focusin" + EVENT_KEY$5, - RESIZE: "resize" + EVENT_KEY$5, - CLICK_DISMISS: "click.dismiss" + EVENT_KEY$5, - KEYDOWN_DISMISS: "keydown.dismiss" + EVENT_KEY$5, - MOUSEUP_DISMISS: "mouseup.dismiss" + EVENT_KEY$5, - MOUSEDOWN_DISMISS: "mousedown.dismiss" + EVENT_KEY$5, - CLICK_DATA_API: "click" + EVENT_KEY$5 + DATA_API_KEY$5 - }; - var ClassName$5 = { - SCROLLBAR_MEASURER: 'modal-scrollbar-measure', - BACKDROP: 'modal-backdrop', - OPEN: 'modal-open', - FADE: 'fade', - SHOW: 'show' - }; - var Selector$5 = { - DIALOG: '.modal-dialog', - DATA_TOGGLE: '[data-toggle="modal"]', - DATA_DISMISS: '[data-dismiss="modal"]', - FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top', - STICKY_CONTENT: '.sticky-top' - /** - * ------------------------------------------------------------------------ - * Class Definition - * ------------------------------------------------------------------------ - */ - - }; - - var Modal = - /*#__PURE__*/ - function () { - function Modal(element, config) { - this._config = this._getConfig(config); - this._element = element; - this._dialog = element.querySelector(Selector$5.DIALOG); - this._backdrop = null; - this._isShown = false; - this._isBodyOverflowing = false; - this._ignoreBackdropClick = false; - this._isTransitioning = false; - this._scrollbarWidth = 0; - } // Getters - - - var _proto = Modal.prototype; - - // Public - _proto.toggle = function toggle(relatedTarget) { - return this._isShown ? this.hide() : this.show(relatedTarget); - }; - - _proto.show = function show(relatedTarget) { - var _this = this; - - if (this._isShown || this._isTransitioning) { - return; - } - - if ($(this._element).hasClass(ClassName$5.FADE)) { - this._isTransitioning = true; - } - - var showEvent = $.Event(Event$5.SHOW, { - relatedTarget: relatedTarget - }); - $(this._element).trigger(showEvent); - - if (this._isShown || showEvent.isDefaultPrevented()) { - return; - } - - this._isShown = true; - - this._checkScrollbar(); - - this._setScrollbar(); - - this._adjustDialog(); - - this._setEscapeEvent(); - - this._setResizeEvent(); - - $(this._element).on(Event$5.CLICK_DISMISS, Selector$5.DATA_DISMISS, function (event) { - return _this.hide(event); - }); - $(this._dialog).on(Event$5.MOUSEDOWN_DISMISS, function () { - $(_this._element).one(Event$5.MOUSEUP_DISMISS, function (event) { - if ($(event.target).is(_this._element)) { - _this._ignoreBackdropClick = true; - } - }); - }); - - this._showBackdrop(function () { - return _this._showElement(relatedTarget); - }); - }; - - _proto.hide = function hide(event) { - var _this2 = this; - - if (event) { - event.preventDefault(); - } - - if (!this._isShown || this._isTransitioning) { - return; - } - - var hideEvent = $.Event(Event$5.HIDE); - $(this._element).trigger(hideEvent); - - if (!this._isShown || hideEvent.isDefaultPrevented()) { - return; - } - - this._isShown = false; - var transition = $(this._element).hasClass(ClassName$5.FADE); - - if (transition) { - this._isTransitioning = true; - } - - this._setEscapeEvent(); - - this._setResizeEvent(); - - $(document).off(Event$5.FOCUSIN); - $(this._element).removeClass(ClassName$5.SHOW); - $(this._element).off(Event$5.CLICK_DISMISS); - $(this._dialog).off(Event$5.MOUSEDOWN_DISMISS); - - if (transition) { - var transitionDuration = Util.getTransitionDurationFromElement(this._element); - $(this._element).one(Util.TRANSITION_END, function (event) { - return _this2._hideModal(event); - }).emulateTransitionEnd(transitionDuration); - } else { - this._hideModal(); - } - }; - - _proto.dispose = function dispose() { - [window, this._element, this._dialog].forEach(function (htmlElement) { - return $(htmlElement).off(EVENT_KEY$5); - }); - /** - * `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API` - * Do not move `document` in `htmlElements` array - * It will remove `Event.CLICK_DATA_API` event that should remain - */ - - $(document).off(Event$5.FOCUSIN); - $.removeData(this._element, DATA_KEY$5); - this._config = null; - this._element = null; - this._dialog = null; - this._backdrop = null; - this._isShown = null; - this._isBodyOverflowing = null; - this._ignoreBackdropClick = null; - this._isTransitioning = null; - this._scrollbarWidth = null; - }; - - _proto.handleUpdate = function handleUpdate() { - this._adjustDialog(); - }; // Private - - - _proto._getConfig = function _getConfig(config) { - config = _objectSpread({}, Default$3, config); - Util.typeCheckConfig(NAME$5, config, DefaultType$3); - return config; - }; - - _proto._showElement = function _showElement(relatedTarget) { - var _this3 = this; - - var transition = $(this._element).hasClass(ClassName$5.FADE); - - if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) { - // Don't move modal's DOM position - document.body.appendChild(this._element); - } - - this._element.style.display = 'block'; - - this._element.removeAttribute('aria-hidden'); - - this._element.setAttribute('aria-modal', true); - - this._element.scrollTop = 0; - - if (transition) { - Util.reflow(this._element); - } - - $(this._element).addClass(ClassName$5.SHOW); - - if (this._config.focus) { - this._enforceFocus(); - } - - var shownEvent = $.Event(Event$5.SHOWN, { - relatedTarget: relatedTarget - }); - - var transitionComplete = function transitionComplete() { - if (_this3._config.focus) { - _this3._element.focus(); - } - - _this3._isTransitioning = false; - $(_this3._element).trigger(shownEvent); - }; - - if (transition) { - var transitionDuration = Util.getTransitionDurationFromElement(this._dialog); - $(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration); - } else { - transitionComplete(); - } - }; - - _proto._enforceFocus = function _enforceFocus() { - var _this4 = this; - - $(document).off(Event$5.FOCUSIN) // Guard against infinite focus loop - .on(Event$5.FOCUSIN, function (event) { - if (document !== event.target && _this4._element !== event.target && $(_this4._element).has(event.target).length === 0) { - _this4._element.focus(); - } - }); - }; - - _proto._setEscapeEvent = function _setEscapeEvent() { - var _this5 = this; - - if (this._isShown && this._config.keyboard) { - $(this._element).on(Event$5.KEYDOWN_DISMISS, function (event) { - if (event.which === ESCAPE_KEYCODE$1) { - event.preventDefault(); - - _this5.hide(); - } - }); - } else if (!this._isShown) { - $(this._element).off(Event$5.KEYDOWN_DISMISS); - } - }; - - _proto._setResizeEvent = function _setResizeEvent() { - var _this6 = this; - - if (this._isShown) { - $(window).on(Event$5.RESIZE, function (event) { - return _this6.handleUpdate(event); - }); - } else { - $(window).off(Event$5.RESIZE); - } - }; - - _proto._hideModal = function _hideModal() { - var _this7 = this; - - this._element.style.display = 'none'; - - this._element.setAttribute('aria-hidden', true); - - this._element.removeAttribute('aria-modal'); - - this._isTransitioning = false; - - this._showBackdrop(function () { - $(document.body).removeClass(ClassName$5.OPEN); - - _this7._resetAdjustments(); - - _this7._resetScrollbar(); - - $(_this7._element).trigger(Event$5.HIDDEN); - }); - }; - - _proto._removeBackdrop = function _removeBackdrop() { - if (this._backdrop) { - $(this._backdrop).remove(); - this._backdrop = null; - } - }; - - _proto._showBackdrop = function _showBackdrop(callback) { - var _this8 = this; - - var animate = $(this._element).hasClass(ClassName$5.FADE) ? ClassName$5.FADE : ''; - - if (this._isShown && this._config.backdrop) { - this._backdrop = document.createElement('div'); - this._backdrop.className = ClassName$5.BACKDROP; - - if (animate) { - this._backdrop.classList.add(animate); - } - - $(this._backdrop).appendTo(document.body); - $(this._element).on(Event$5.CLICK_DISMISS, function (event) { - if (_this8._ignoreBackdropClick) { - _this8._ignoreBackdropClick = false; - return; - } - - if (event.target !== event.currentTarget) { - return; - } - - if (_this8._config.backdrop === 'static') { - _this8._element.focus(); - } else { - _this8.hide(); - } - }); - - if (animate) { - Util.reflow(this._backdrop); - } - - $(this._backdrop).addClass(ClassName$5.SHOW); - - if (!callback) { - return; - } - - if (!animate) { - callback(); - return; - } - - var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop); - $(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration); - } else if (!this._isShown && this._backdrop) { - $(this._backdrop).removeClass(ClassName$5.SHOW); - - var callbackRemove = function callbackRemove() { - _this8._removeBackdrop(); - - if (callback) { - callback(); - } - }; - - if ($(this._element).hasClass(ClassName$5.FADE)) { - var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop); - - $(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration); - } else { - callbackRemove(); - } - } else if (callback) { - callback(); - } - }; // ---------------------------------------------------------------------- - // the following methods are used to handle overflowing modals - // ---------------------------------------------------------------------- - - - _proto._adjustDialog = function _adjustDialog() { - var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; - - if (!this._isBodyOverflowing && isModalOverflowing) { - this._element.style.paddingLeft = this._scrollbarWidth + "px"; - } - - if (this._isBodyOverflowing && !isModalOverflowing) { - this._element.style.paddingRight = this._scrollbarWidth + "px"; - } - }; - - _proto._resetAdjustments = function _resetAdjustments() { - this._element.style.paddingLeft = ''; - this._element.style.paddingRight = ''; - }; - - _proto._checkScrollbar = function _checkScrollbar() { - var rect = document.body.getBoundingClientRect(); - this._isBodyOverflowing = rect.left + rect.right < window.innerWidth; - this._scrollbarWidth = this._getScrollbarWidth(); - }; - - _proto._setScrollbar = function _setScrollbar() { - var _this9 = this; - - if (this._isBodyOverflowing) { - // Note: DOMNode.style.paddingRight returns the actual value or '' if not set - // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set - var fixedContent = [].slice.call(document.querySelectorAll(Selector$5.FIXED_CONTENT)); - var stickyContent = [].slice.call(document.querySelectorAll(Selector$5.STICKY_CONTENT)); // Adjust fixed content padding - - $(fixedContent).each(function (index, element) { - var actualPadding = element.style.paddingRight; - var calculatedPadding = $(element).css('padding-right'); - $(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + "px"); - }); // Adjust sticky content margin - - $(stickyContent).each(function (index, element) { - var actualMargin = element.style.marginRight; - var calculatedMargin = $(element).css('margin-right'); - $(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this9._scrollbarWidth + "px"); - }); // Adjust body padding - - var actualPadding = document.body.style.paddingRight; - var calculatedPadding = $(document.body).css('padding-right'); - $(document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + "px"); - } - - $(document.body).addClass(ClassName$5.OPEN); - }; - - _proto._resetScrollbar = function _resetScrollbar() { - // Restore fixed content padding - var fixedContent = [].slice.call(document.querySelectorAll(Selector$5.FIXED_CONTENT)); - $(fixedContent).each(function (index, element) { - var padding = $(element).data('padding-right'); - $(element).removeData('padding-right'); - element.style.paddingRight = padding ? padding : ''; - }); // Restore sticky content - - var elements = [].slice.call(document.querySelectorAll("" + Selector$5.STICKY_CONTENT)); - $(elements).each(function (index, element) { - var margin = $(element).data('margin-right'); - - if (typeof margin !== 'undefined') { - $(element).css('margin-right', margin).removeData('margin-right'); - } - }); // Restore body padding - - var padding = $(document.body).data('padding-right'); - $(document.body).removeData('padding-right'); - document.body.style.paddingRight = padding ? padding : ''; - }; - - _proto._getScrollbarWidth = function _getScrollbarWidth() { - // thx d.walsh - var scrollDiv = document.createElement('div'); - scrollDiv.className = ClassName$5.SCROLLBAR_MEASURER; - document.body.appendChild(scrollDiv); - var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth; - document.body.removeChild(scrollDiv); - return scrollbarWidth; - }; // Static - - - Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) { - return this.each(function () { - var data = $(this).data(DATA_KEY$5); - - var _config = _objectSpread({}, Default$3, $(this).data(), typeof config === 'object' && config ? config : {}); - - if (!data) { - data = new Modal(this, _config); - $(this).data(DATA_KEY$5, data); - } - - if (typeof config === 'string') { - if (typeof data[config] === 'undefined') { - throw new TypeError("No method named \"" + config + "\""); - } - - data[config](relatedTarget); - } else if (_config.show) { - data.show(relatedTarget); - } - }); - }; - - _createClass(Modal, null, [{ - key: "VERSION", - get: function get() { - return VERSION$5; - } - }, { - key: "Default", - get: function get() { - return Default$3; - } - }]); - - return Modal; - }(); - /** - * ------------------------------------------------------------------------ - * Data Api implementation - * ------------------------------------------------------------------------ - */ - - - $(document).on(Event$5.CLICK_DATA_API, Selector$5.DATA_TOGGLE, function (event) { - var _this10 = this; - - var target; - var selector = Util.getSelectorFromElement(this); - - if (selector) { - target = document.querySelector(selector); - } - - var config = $(target).data(DATA_KEY$5) ? 'toggle' : _objectSpread({}, $(target).data(), $(this).data()); - - if (this.tagName === 'A' || this.tagName === 'AREA') { - event.preventDefault(); - } - - var $target = $(target).one(Event$5.SHOW, function (showEvent) { - if (showEvent.isDefaultPrevented()) { - // Only register focus restorer if modal will actually get shown - return; - } - - $target.one(Event$5.HIDDEN, function () { - if ($(_this10).is(':visible')) { - _this10.focus(); - } - }); - }); - - Modal._jQueryInterface.call($(target), config, this); - }); - /** - * ------------------------------------------------------------------------ - * jQuery - * ------------------------------------------------------------------------ - */ - - $.fn[NAME$5] = Modal._jQueryInterface; - $.fn[NAME$5].Constructor = Modal; - - $.fn[NAME$5].noConflict = function () { - $.fn[NAME$5] = JQUERY_NO_CONFLICT$5; - return Modal._jQueryInterface; - }; - - /** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - - var NAME$6 = 'tooltip'; - var VERSION$6 = '4.2.1'; - var DATA_KEY$6 = 'bs.tooltip'; - var EVENT_KEY$6 = "." + DATA_KEY$6; - var JQUERY_NO_CONFLICT$6 = $.fn[NAME$6]; - var CLASS_PREFIX = 'bs-tooltip'; - var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g'); - var DefaultType$4 = { - animation: 'boolean', - template: 'string', - title: '(string|element|function)', - trigger: 'string', - delay: '(number|object)', - html: 'boolean', - selector: '(string|boolean)', - placement: '(string|function)', - offset: '(number|string)', - container: '(string|element|boolean)', - fallbackPlacement: '(string|array)', - boundary: '(string|element)' - }; - var AttachmentMap$1 = { - AUTO: 'auto', - TOP: 'top', - RIGHT: 'right', - BOTTOM: 'bottom', - LEFT: 'left' - }; - var Default$4 = { - animation: true, - template: '', - trigger: 'hover focus', - title: '', - delay: 0, - html: false, - selector: false, - placement: 'top', - offset: 0, - container: false, - fallbackPlacement: 'flip', - boundary: 'scrollParent' - }; - var HoverState = { - SHOW: 'show', - OUT: 'out' - }; - var Event$6 = { - HIDE: "hide" + EVENT_KEY$6, - HIDDEN: "hidden" + EVENT_KEY$6, - SHOW: "show" + EVENT_KEY$6, - SHOWN: "shown" + EVENT_KEY$6, - INSERTED: "inserted" + EVENT_KEY$6, - CLICK: "click" + EVENT_KEY$6, - FOCUSIN: "focusin" + EVENT_KEY$6, - FOCUSOUT: "focusout" + EVENT_KEY$6, - MOUSEENTER: "mouseenter" + EVENT_KEY$6, - MOUSELEAVE: "mouseleave" + EVENT_KEY$6 - }; - var ClassName$6 = { - FADE: 'fade', - SHOW: 'show' - }; - var Selector$6 = { - TOOLTIP: '.tooltip', - TOOLTIP_INNER: '.tooltip-inner', - ARROW: '.arrow' - }; - var Trigger = { - HOVER: 'hover', - FOCUS: 'focus', - CLICK: 'click', - MANUAL: 'manual' - /** - * ------------------------------------------------------------------------ - * Class Definition - * ------------------------------------------------------------------------ - */ - - }; - - var Tooltip = - /*#__PURE__*/ - function () { - function Tooltip(element, config) { - /** - * Check for Popper dependency - * Popper - https://popper.js.org - */ - if (typeof Popper === 'undefined') { - throw new TypeError('Bootstrap\'s tooltips require Popper.js (https://popper.js.org/)'); - } // private - - - this._isEnabled = true; - this._timeout = 0; - this._hoverState = ''; - this._activeTrigger = {}; - this._popper = null; // Protected - - this.element = element; - this.config = this._getConfig(config); - this.tip = null; - - this._setListeners(); - } // Getters - - - var _proto = Tooltip.prototype; - - // Public - _proto.enable = function enable() { - this._isEnabled = true; - }; - - _proto.disable = function disable() { - this._isEnabled = false; - }; - - _proto.toggleEnabled = function toggleEnabled() { - this._isEnabled = !this._isEnabled; - }; - - _proto.toggle = function toggle(event) { - if (!this._isEnabled) { - return; - } - - if (event) { - var dataKey = this.constructor.DATA_KEY; - var context = $(event.currentTarget).data(dataKey); - - if (!context) { - context = new this.constructor(event.currentTarget, this._getDelegateConfig()); - $(event.currentTarget).data(dataKey, context); - } - - context._activeTrigger.click = !context._activeTrigger.click; - - if (context._isWithActiveTrigger()) { - context._enter(null, context); - } else { - context._leave(null, context); - } - } else { - if ($(this.getTipElement()).hasClass(ClassName$6.SHOW)) { - this._leave(null, this); - - return; - } - - this._enter(null, this); - } - }; - - _proto.dispose = function dispose() { - clearTimeout(this._timeout); - $.removeData(this.element, this.constructor.DATA_KEY); - $(this.element).off(this.constructor.EVENT_KEY); - $(this.element).closest('.modal').off('hide.bs.modal'); - - if (this.tip) { - $(this.tip).remove(); - } - - this._isEnabled = null; - this._timeout = null; - this._hoverState = null; - this._activeTrigger = null; - - if (this._popper !== null) { - this._popper.destroy(); - } - - this._popper = null; - this.element = null; - this.config = null; - this.tip = null; - }; - - _proto.show = function show() { - var _this = this; - - if ($(this.element).css('display') === 'none') { - throw new Error('Please use show on visible elements'); - } - - var showEvent = $.Event(this.constructor.Event.SHOW); - - if (this.isWithContent() && this._isEnabled) { - $(this.element).trigger(showEvent); - var shadowRoot = Util.findShadowRoot(this.element); - var isInTheDom = $.contains(shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement, this.element); - - if (showEvent.isDefaultPrevented() || !isInTheDom) { - return; - } - - var tip = this.getTipElement(); - var tipId = Util.getUID(this.constructor.NAME); - tip.setAttribute('id', tipId); - this.element.setAttribute('aria-describedby', tipId); - this.setContent(); - - if (this.config.animation) { - $(tip).addClass(ClassName$6.FADE); - } - - var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement; - - var attachment = this._getAttachment(placement); - - this.addAttachmentClass(attachment); - - var container = this._getContainer(); - - $(tip).data(this.constructor.DATA_KEY, this); - - if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) { - $(tip).appendTo(container); - } - - $(this.element).trigger(this.constructor.Event.INSERTED); - this._popper = new Popper(this.element, tip, { - placement: attachment, - modifiers: { - offset: { - offset: this.config.offset - }, - flip: { - behavior: this.config.fallbackPlacement - }, - arrow: { - element: Selector$6.ARROW - }, - preventOverflow: { - boundariesElement: this.config.boundary - } - }, - onCreate: function onCreate(data) { - if (data.originalPlacement !== data.placement) { - _this._handlePopperPlacementChange(data); - } - }, - onUpdate: function onUpdate(data) { - return _this._handlePopperPlacementChange(data); - } - }); - $(tip).addClass(ClassName$6.SHOW); // If this is a touch-enabled device we add extra - // empty mouseover listeners to the body's immediate children; - // only needed because of broken event delegation on iOS - // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html - - if ('ontouchstart' in document.documentElement) { - $(document.body).children().on('mouseover', null, $.noop); - } - - var complete = function complete() { - if (_this.config.animation) { - _this._fixTransition(); - } - - var prevHoverState = _this._hoverState; - _this._hoverState = null; - $(_this.element).trigger(_this.constructor.Event.SHOWN); - - if (prevHoverState === HoverState.OUT) { - _this._leave(null, _this); - } - }; - - if ($(this.tip).hasClass(ClassName$6.FADE)) { - var transitionDuration = Util.getTransitionDurationFromElement(this.tip); - $(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); - } else { - complete(); - } - } - }; - - _proto.hide = function hide(callback) { - var _this2 = this; - - var tip = this.getTipElement(); - var hideEvent = $.Event(this.constructor.Event.HIDE); - - var complete = function complete() { - if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) { - tip.parentNode.removeChild(tip); - } - - _this2._cleanTipClass(); - - _this2.element.removeAttribute('aria-describedby'); - - $(_this2.element).trigger(_this2.constructor.Event.HIDDEN); - - if (_this2._popper !== null) { - _this2._popper.destroy(); - } - - if (callback) { - callback(); - } - }; - - $(this.element).trigger(hideEvent); - - if (hideEvent.isDefaultPrevented()) { - return; - } - - $(tip).removeClass(ClassName$6.SHOW); // If this is a touch-enabled device we remove the extra - // empty mouseover listeners we added for iOS support - - if ('ontouchstart' in document.documentElement) { - $(document.body).children().off('mouseover', null, $.noop); - } - - this._activeTrigger[Trigger.CLICK] = false; - this._activeTrigger[Trigger.FOCUS] = false; - this._activeTrigger[Trigger.HOVER] = false; - - if ($(this.tip).hasClass(ClassName$6.FADE)) { - var transitionDuration = Util.getTransitionDurationFromElement(tip); - $(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); - } else { - complete(); - } - - this._hoverState = ''; - }; - - _proto.update = function update() { - if (this._popper !== null) { - this._popper.scheduleUpdate(); - } - }; // Protected - - - _proto.isWithContent = function isWithContent() { - return Boolean(this.getTitle()); - }; - - _proto.addAttachmentClass = function addAttachmentClass(attachment) { - $(this.getTipElement()).addClass(CLASS_PREFIX + "-" + attachment); - }; - - _proto.getTipElement = function getTipElement() { - this.tip = this.tip || $(this.config.template)[0]; - return this.tip; - }; - - _proto.setContent = function setContent() { - var tip = this.getTipElement(); - this.setElementContent($(tip.querySelectorAll(Selector$6.TOOLTIP_INNER)), this.getTitle()); - $(tip).removeClass(ClassName$6.FADE + " " + ClassName$6.SHOW); - }; - - _proto.setElementContent = function setElementContent($element, content) { - var html = this.config.html; - - if (typeof content === 'object' && (content.nodeType || content.jquery)) { - // Content is a DOM node or a jQuery - if (html) { - if (!$(content).parent().is($element)) { - $element.empty().append(content); - } - } else { - $element.text($(content).text()); - } - } else { - $element[html ? 'html' : 'text'](content); - } - }; - - _proto.getTitle = function getTitle() { - var title = this.element.getAttribute('data-original-title'); - - if (!title) { - title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title; - } - - return title; - }; // Private - - - _proto._getContainer = function _getContainer() { - if (this.config.container === false) { - return document.body; - } - - if (Util.isElement(this.config.container)) { - return $(this.config.container); - } - - return $(document).find(this.config.container); - }; - - _proto._getAttachment = function _getAttachment(placement) { - return AttachmentMap$1[placement.toUpperCase()]; - }; - - _proto._setListeners = function _setListeners() { - var _this3 = this; - - var triggers = this.config.trigger.split(' '); - triggers.forEach(function (trigger) { - if (trigger === 'click') { - $(_this3.element).on(_this3.constructor.Event.CLICK, _this3.config.selector, function (event) { - return _this3.toggle(event); - }); - } else if (trigger !== Trigger.MANUAL) { - var eventIn = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSEENTER : _this3.constructor.Event.FOCUSIN; - var eventOut = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSELEAVE : _this3.constructor.Event.FOCUSOUT; - $(_this3.element).on(eventIn, _this3.config.selector, function (event) { - return _this3._enter(event); - }).on(eventOut, _this3.config.selector, function (event) { - return _this3._leave(event); - }); - } - }); - $(this.element).closest('.modal').on('hide.bs.modal', function () { - if (_this3.element) { - _this3.hide(); - } - }); - - if (this.config.selector) { - this.config = _objectSpread({}, this.config, { - trigger: 'manual', - selector: '' - }); - } else { - this._fixTitle(); - } - }; - - _proto._fixTitle = function _fixTitle() { - var titleType = typeof this.element.getAttribute('data-original-title'); - - if (this.element.getAttribute('title') || titleType !== 'string') { - this.element.setAttribute('data-original-title', this.element.getAttribute('title') || ''); - this.element.setAttribute('title', ''); - } - }; - - _proto._enter = function _enter(event, context) { - var dataKey = this.constructor.DATA_KEY; - context = context || $(event.currentTarget).data(dataKey); - - if (!context) { - context = new this.constructor(event.currentTarget, this._getDelegateConfig()); - $(event.currentTarget).data(dataKey, context); - } - - if (event) { - context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true; - } - - if ($(context.getTipElement()).hasClass(ClassName$6.SHOW) || context._hoverState === HoverState.SHOW) { - context._hoverState = HoverState.SHOW; - return; - } - - clearTimeout(context._timeout); - context._hoverState = HoverState.SHOW; - - if (!context.config.delay || !context.config.delay.show) { - context.show(); - return; - } - - context._timeout = setTimeout(function () { - if (context._hoverState === HoverState.SHOW) { - context.show(); - } - }, context.config.delay.show); - }; - - _proto._leave = function _leave(event, context) { - var dataKey = this.constructor.DATA_KEY; - context = context || $(event.currentTarget).data(dataKey); - - if (!context) { - context = new this.constructor(event.currentTarget, this._getDelegateConfig()); - $(event.currentTarget).data(dataKey, context); - } - - if (event) { - context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false; - } - - if (context._isWithActiveTrigger()) { - return; - } - - clearTimeout(context._timeout); - context._hoverState = HoverState.OUT; - - if (!context.config.delay || !context.config.delay.hide) { - context.hide(); - return; - } - - context._timeout = setTimeout(function () { - if (context._hoverState === HoverState.OUT) { - context.hide(); - } - }, context.config.delay.hide); - }; - - _proto._isWithActiveTrigger = function _isWithActiveTrigger() { - for (var trigger in this._activeTrigger) { - if (this._activeTrigger[trigger]) { - return true; - } - } - - return false; - }; - - _proto._getConfig = function _getConfig(config) { - config = _objectSpread({}, this.constructor.Default, $(this.element).data(), typeof config === 'object' && config ? config : {}); - - if (typeof config.delay === 'number') { - config.delay = { - show: config.delay, - hide: config.delay - }; - } - - if (typeof config.title === 'number') { - config.title = config.title.toString(); - } - - if (typeof config.content === 'number') { - config.content = config.content.toString(); - } - - Util.typeCheckConfig(NAME$6, config, this.constructor.DefaultType); - return config; - }; - - _proto._getDelegateConfig = function _getDelegateConfig() { - var config = {}; - - if (this.config) { - for (var key in this.config) { - if (this.constructor.Default[key] !== this.config[key]) { - config[key] = this.config[key]; - } - } - } - - return config; - }; - - _proto._cleanTipClass = function _cleanTipClass() { - var $tip = $(this.getTipElement()); - var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX); - - if (tabClass !== null && tabClass.length) { - $tip.removeClass(tabClass.join('')); - } - }; - - _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) { - var popperInstance = popperData.instance; - this.tip = popperInstance.popper; - - this._cleanTipClass(); - - this.addAttachmentClass(this._getAttachment(popperData.placement)); - }; - - _proto._fixTransition = function _fixTransition() { - var tip = this.getTipElement(); - var initConfigAnimation = this.config.animation; - - if (tip.getAttribute('x-placement') !== null) { - return; - } - - $(tip).removeClass(ClassName$6.FADE); - this.config.animation = false; - this.hide(); - this.show(); - this.config.animation = initConfigAnimation; - }; // Static - - - Tooltip._jQueryInterface = function _jQueryInterface(config) { - return this.each(function () { - var data = $(this).data(DATA_KEY$6); - - var _config = typeof config === 'object' && config; - - if (!data && /dispose|hide/.test(config)) { - return; - } - - if (!data) { - data = new Tooltip(this, _config); - $(this).data(DATA_KEY$6, data); - } - - if (typeof config === 'string') { - if (typeof data[config] === 'undefined') { - throw new TypeError("No method named \"" + config + "\""); - } - - data[config](); - } - }); - }; - - _createClass(Tooltip, null, [{ - key: "VERSION", - get: function get() { - return VERSION$6; - } - }, { - key: "Default", - get: function get() { - return Default$4; - } - }, { - key: "NAME", - get: function get() { - return NAME$6; - } - }, { - key: "DATA_KEY", - get: function get() { - return DATA_KEY$6; - } - }, { - key: "Event", - get: function get() { - return Event$6; - } - }, { - key: "EVENT_KEY", - get: function get() { - return EVENT_KEY$6; - } - }, { - key: "DefaultType", - get: function get() { - return DefaultType$4; - } - }]); - - return Tooltip; - }(); - /** - * ------------------------------------------------------------------------ - * jQuery - * ------------------------------------------------------------------------ - */ - - - $.fn[NAME$6] = Tooltip._jQueryInterface; - $.fn[NAME$6].Constructor = Tooltip; - - $.fn[NAME$6].noConflict = function () { - $.fn[NAME$6] = JQUERY_NO_CONFLICT$6; - return Tooltip._jQueryInterface; - }; - - /** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - - var NAME$7 = 'popover'; - var VERSION$7 = '4.2.1'; - var DATA_KEY$7 = 'bs.popover'; - var EVENT_KEY$7 = "." + DATA_KEY$7; - var JQUERY_NO_CONFLICT$7 = $.fn[NAME$7]; - var CLASS_PREFIX$1 = 'bs-popover'; - var BSCLS_PREFIX_REGEX$1 = new RegExp("(^|\\s)" + CLASS_PREFIX$1 + "\\S+", 'g'); - - var Default$5 = _objectSpread({}, Tooltip.Default, { - placement: 'right', - trigger: 'click', - content: '', - template: '' - }); - - var DefaultType$5 = _objectSpread({}, Tooltip.DefaultType, { - content: '(string|element|function)' - }); - - var ClassName$7 = { - FADE: 'fade', - SHOW: 'show' - }; - var Selector$7 = { - TITLE: '.popover-header', - CONTENT: '.popover-body' - }; - var Event$7 = { - HIDE: "hide" + EVENT_KEY$7, - HIDDEN: "hidden" + EVENT_KEY$7, - SHOW: "show" + EVENT_KEY$7, - SHOWN: "shown" + EVENT_KEY$7, - INSERTED: "inserted" + EVENT_KEY$7, - CLICK: "click" + EVENT_KEY$7, - FOCUSIN: "focusin" + EVENT_KEY$7, - FOCUSOUT: "focusout" + EVENT_KEY$7, - MOUSEENTER: "mouseenter" + EVENT_KEY$7, - MOUSELEAVE: "mouseleave" + EVENT_KEY$7 - /** - * ------------------------------------------------------------------------ - * Class Definition - * ------------------------------------------------------------------------ - */ - - }; - - var Popover = - /*#__PURE__*/ - function (_Tooltip) { - _inheritsLoose(Popover, _Tooltip); - - function Popover() { - return _Tooltip.apply(this, arguments) || this; - } - - var _proto = Popover.prototype; - - // Overrides - _proto.isWithContent = function isWithContent() { - return this.getTitle() || this._getContent(); - }; - - _proto.addAttachmentClass = function addAttachmentClass(attachment) { - $(this.getTipElement()).addClass(CLASS_PREFIX$1 + "-" + attachment); - }; - - _proto.getTipElement = function getTipElement() { - this.tip = this.tip || $(this.config.template)[0]; - return this.tip; - }; - - _proto.setContent = function setContent() { - var $tip = $(this.getTipElement()); // We use append for html objects to maintain js events - - this.setElementContent($tip.find(Selector$7.TITLE), this.getTitle()); - - var content = this._getContent(); - - if (typeof content === 'function') { - content = content.call(this.element); - } - - this.setElementContent($tip.find(Selector$7.CONTENT), content); - $tip.removeClass(ClassName$7.FADE + " " + ClassName$7.SHOW); - }; // Private - - - _proto._getContent = function _getContent() { - return this.element.getAttribute('data-content') || this.config.content; - }; - - _proto._cleanTipClass = function _cleanTipClass() { - var $tip = $(this.getTipElement()); - var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX$1); - - if (tabClass !== null && tabClass.length > 0) { - $tip.removeClass(tabClass.join('')); - } - }; // Static - - - Popover._jQueryInterface = function _jQueryInterface(config) { - return this.each(function () { - var data = $(this).data(DATA_KEY$7); - - var _config = typeof config === 'object' ? config : null; - - if (!data && /dispose|hide/.test(config)) { - return; - } - - if (!data) { - data = new Popover(this, _config); - $(this).data(DATA_KEY$7, data); - } - - if (typeof config === 'string') { - if (typeof data[config] === 'undefined') { - throw new TypeError("No method named \"" + config + "\""); - } - - data[config](); - } - }); - }; - - _createClass(Popover, null, [{ - key: "VERSION", - // Getters - get: function get() { - return VERSION$7; - } - }, { - key: "Default", - get: function get() { - return Default$5; - } - }, { - key: "NAME", - get: function get() { - return NAME$7; - } - }, { - key: "DATA_KEY", - get: function get() { - return DATA_KEY$7; - } - }, { - key: "Event", - get: function get() { - return Event$7; - } - }, { - key: "EVENT_KEY", - get: function get() { - return EVENT_KEY$7; - } - }, { - key: "DefaultType", - get: function get() { - return DefaultType$5; - } - }]); - - return Popover; - }(Tooltip); - /** - * ------------------------------------------------------------------------ - * jQuery - * ------------------------------------------------------------------------ - */ - - - $.fn[NAME$7] = Popover._jQueryInterface; - $.fn[NAME$7].Constructor = Popover; - - $.fn[NAME$7].noConflict = function () { - $.fn[NAME$7] = JQUERY_NO_CONFLICT$7; - return Popover._jQueryInterface; - }; - - /** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - - var NAME$8 = 'scrollspy'; - var VERSION$8 = '4.2.1'; - var DATA_KEY$8 = 'bs.scrollspy'; - var EVENT_KEY$8 = "." + DATA_KEY$8; - var DATA_API_KEY$6 = '.data-api'; - var JQUERY_NO_CONFLICT$8 = $.fn[NAME$8]; - var Default$6 = { - offset: 10, - method: 'auto', - target: '' - }; - var DefaultType$6 = { - offset: 'number', - method: 'string', - target: '(string|element)' - }; - var Event$8 = { - ACTIVATE: "activate" + EVENT_KEY$8, - SCROLL: "scroll" + EVENT_KEY$8, - LOAD_DATA_API: "load" + EVENT_KEY$8 + DATA_API_KEY$6 - }; - var ClassName$8 = { - DROPDOWN_ITEM: 'dropdown-item', - DROPDOWN_MENU: 'dropdown-menu', - ACTIVE: 'active' - }; - var Selector$8 = { - DATA_SPY: '[data-spy="scroll"]', - ACTIVE: '.active', - NAV_LIST_GROUP: '.nav, .list-group', - NAV_LINKS: '.nav-link', - NAV_ITEMS: '.nav-item', - LIST_ITEMS: '.list-group-item', - DROPDOWN: '.dropdown', - DROPDOWN_ITEMS: '.dropdown-item', - DROPDOWN_TOGGLE: '.dropdown-toggle' - }; - var OffsetMethod = { - OFFSET: 'offset', - POSITION: 'position' - /** - * ------------------------------------------------------------------------ - * Class Definition - * ------------------------------------------------------------------------ - */ - - }; - - var ScrollSpy = - /*#__PURE__*/ - function () { - function ScrollSpy(element, config) { - var _this = this; - - this._element = element; - this._scrollElement = element.tagName === 'BODY' ? window : element; - this._config = this._getConfig(config); - this._selector = this._config.target + " " + Selector$8.NAV_LINKS + "," + (this._config.target + " " + Selector$8.LIST_ITEMS + ",") + (this._config.target + " " + Selector$8.DROPDOWN_ITEMS); - this._offsets = []; - this._targets = []; - this._activeTarget = null; - this._scrollHeight = 0; - $(this._scrollElement).on(Event$8.SCROLL, function (event) { - return _this._process(event); - }); - this.refresh(); - - this._process(); - } // Getters - - - var _proto = ScrollSpy.prototype; - - // Public - _proto.refresh = function refresh() { - var _this2 = this; - - var autoMethod = this._scrollElement === this._scrollElement.window ? OffsetMethod.OFFSET : OffsetMethod.POSITION; - var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method; - var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0; - this._offsets = []; - this._targets = []; - this._scrollHeight = this._getScrollHeight(); - var targets = [].slice.call(document.querySelectorAll(this._selector)); - targets.map(function (element) { - var target; - var targetSelector = Util.getSelectorFromElement(element); - - if (targetSelector) { - target = document.querySelector(targetSelector); - } - - if (target) { - var targetBCR = target.getBoundingClientRect(); - - if (targetBCR.width || targetBCR.height) { - return [$(target)[offsetMethod]().top + offsetBase, targetSelector]; - } - } - - return null; - }).filter(function (item) { - return item; - }).sort(function (a, b) { - return a[0] - b[0]; - }).forEach(function (item) { - _this2._offsets.push(item[0]); - - _this2._targets.push(item[1]); - }); - }; - - _proto.dispose = function dispose() { - $.removeData(this._element, DATA_KEY$8); - $(this._scrollElement).off(EVENT_KEY$8); - this._element = null; - this._scrollElement = null; - this._config = null; - this._selector = null; - this._offsets = null; - this._targets = null; - this._activeTarget = null; - this._scrollHeight = null; - }; // Private - - - _proto._getConfig = function _getConfig(config) { - config = _objectSpread({}, Default$6, typeof config === 'object' && config ? config : {}); - - if (typeof config.target !== 'string') { - var id = $(config.target).attr('id'); - - if (!id) { - id = Util.getUID(NAME$8); - $(config.target).attr('id', id); - } - - config.target = "#" + id; - } - - Util.typeCheckConfig(NAME$8, config, DefaultType$6); - return config; - }; - - _proto._getScrollTop = function _getScrollTop() { - return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop; - }; - - _proto._getScrollHeight = function _getScrollHeight() { - return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight); - }; - - _proto._getOffsetHeight = function _getOffsetHeight() { - return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height; - }; - - _proto._process = function _process() { - var scrollTop = this._getScrollTop() + this._config.offset; - - var scrollHeight = this._getScrollHeight(); - - var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight(); - - if (this._scrollHeight !== scrollHeight) { - this.refresh(); - } - - if (scrollTop >= maxScroll) { - var target = this._targets[this._targets.length - 1]; - - if (this._activeTarget !== target) { - this._activate(target); - } - - return; - } - - if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) { - this._activeTarget = null; - - this._clear(); - - return; - } - - var offsetLength = this._offsets.length; - - for (var i = offsetLength; i--;) { - var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]); - - if (isActiveTarget) { - this._activate(this._targets[i]); - } - } - }; - - _proto._activate = function _activate(target) { - this._activeTarget = target; - - this._clear(); - - var queries = this._selector.split(',').map(function (selector) { - return selector + "[data-target=\"" + target + "\"]," + selector + "[href=\"" + target + "\"]"; - }); - - var $link = $([].slice.call(document.querySelectorAll(queries.join(',')))); - - if ($link.hasClass(ClassName$8.DROPDOWN_ITEM)) { - $link.closest(Selector$8.DROPDOWN).find(Selector$8.DROPDOWN_TOGGLE).addClass(ClassName$8.ACTIVE); - $link.addClass(ClassName$8.ACTIVE); - } else { - // Set triggered link as active - $link.addClass(ClassName$8.ACTIVE); // Set triggered links parents as active - // With both
').appendTo($this); - } - oSettings.nTHead = thead[0]; - - var tbody = $this.children('tbody'); - if (tbody.length === 0) { - tbody = $('').appendTo($this); - } - oSettings.nTBody = tbody[0]; - - var tfoot = $this.children('tfoot'); - if (tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "")) { - // If we are a scrolling table, and no footer has been given, then we need to create - // a tfoot element for the caption element to be appended to - tfoot = $('').appendTo($this); - } - - if (tfoot.length === 0 || tfoot.children().length === 0) { - $this.addClass(oClasses.sNoFooter); - } else if (tfoot.length > 0) { - oSettings.nTFoot = tfoot[0]; - _fnDetectHeader(oSettings.aoFooter, oSettings.nTFoot); - } - - /* Check if there is data passing into the constructor */ - if (oInit.aaData) { - for (i = 0; i < oInit.aaData.length; i++) { - _fnAddData(oSettings, oInit.aaData[i]); - } - } else if (oSettings.bDeferLoading || _fnDataSource(oSettings) == 'dom') { - /* Grab the data from the page - only do this when deferred loading or no Ajax - * source since there is no point in reading the DOM data if we are then going - * to replace it with Ajax data - */ - _fnAddTr(oSettings, $(oSettings.nTBody).children('tr')); - } - - /* Copy the data index array */ - oSettings.aiDisplay = oSettings.aiDisplayMaster.slice(); - - /* Initialisation complete - table can be drawn */ - oSettings.bInitialised = true; - - /* Check if we need to initialise the table (it might not have been handed off to the - * language processor) - */ - if (bInitHandedOff === false) { - _fnInitialise(oSettings); - } - }; - - /* Must be done after everything which can be overridden by the state saving! */ - if (oInit.bStateSave) { - features.bStateSave = true; - _fnCallbackReg(oSettings, 'aoDrawCallback', _fnSaveState, 'state_save'); - _fnLoadState(oSettings, oInit, loadedInit); - } else { - loadedInit(); - } - - }); - _that = null; - return this; - }; - - - /* - * It is useful to have variables which are scoped locally so only the - * DataTables functions can access them and they don't leak into global space. - * At the same time these functions are often useful over multiple files in the - * core and API, so we list, or at least document, all variables which are used - * by DataTables as private variables here. This also ensures that there is no - * clashing of variable names and that they can easily referenced for reuse. - */ - - - // Defined else where - // _selector_run - // _selector_opts - // _selector_first - // _selector_row_indexes - - var _ext; // DataTable.ext - var _Api; // DataTable.Api - var _api_register; // DataTable.Api.register - var _api_registerPlural; // DataTable.Api.registerPlural - - var _re_dic = {}; - var _re_new_lines = /[\r\n\u2028]/g; - var _re_html = /<.*?>/g; - - // This is not strict ISO8601 - Date.parse() is quite lax, although - // implementations differ between browsers. - var _re_date = /^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/; - - // Escape regular expression special characters - var _re_escape_regex = new RegExp('(\\' + ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '$', '^', '-'].join('|\\') + ')', 'g'); - - // http://en.wikipedia.org/wiki/Foreign_exchange_market - // - \u20BD - Russian ruble. - // - \u20a9 - South Korean Won - // - \u20BA - Turkish Lira - // - \u20B9 - Indian Rupee - // - R - Brazil (R$) and South Africa - // - fr - Swiss Franc - // - kr - Swedish krona, Norwegian krone and Danish krone - // - \u2009 is thin space and \u202F is narrow no-break space, both used in many - // - Ƀ - Bitcoin - // - Ξ - Ethereum - // standards as thousands separators. - var _re_formatted_numeric = /['\u00A0,$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfkɃΞ]/gi; - - - var _empty = function (d) { - return !d || d === true || d === '-' ? true : false; - }; - - - var _intVal = function (s) { - var integer = parseInt(s, 10); - return !isNaN(integer) && isFinite(s) ? integer : null; - }; - - // Convert from a formatted number with characters other than `.` as the - // decimal place, to a Javascript number - var _numToDecimal = function (num, decimalPoint) { - // Cache created regular expressions for speed as this function is called often - if (!_re_dic[decimalPoint]) { - _re_dic[decimalPoint] = new RegExp(_fnEscapeRegex(decimalPoint), 'g'); - } - return typeof num === 'string' && decimalPoint !== '.' ? - num.replace(/\./g, '').replace(_re_dic[decimalPoint], '.') : - num; - }; - - - var _isNumber = function (d, decimalPoint, formatted) { - var strType = typeof d === 'string'; - - // If empty return immediately so there must be a number if it is a - // formatted string (this stops the string "k", or "kr", etc being detected - // as a formatted number for currency - if (_empty(d)) { - return true; - } - - if (decimalPoint && strType) { - d = _numToDecimal(d, decimalPoint); - } - - if (formatted && strType) { - d = d.replace(_re_formatted_numeric, ''); - } - - return !isNaN(parseFloat(d)) && isFinite(d); - }; - - - // A string without HTML in it can be considered to be HTML still - var _isHtml = function (d) { - return _empty(d) || typeof d === 'string'; - }; - - - var _htmlNumeric = function (d, decimalPoint, formatted) { - if (_empty(d)) { - return true; - } - - var html = _isHtml(d); - return !html ? - null : - _isNumber(_stripHtml(d), decimalPoint, formatted) ? - true : - null; - }; - - - var _pluck = function (a, prop, prop2) { - var out = []; - var i = 0, ien = a.length; - - // Could have the test in the loop for slightly smaller code, but speed - // is essential here - if (prop2 !== undefined) { - for (; i < ien; i++) { - if (a[i] && a[i][prop]) { - out.push(a[i][prop][prop2]); - } - } - } else { - for (; i < ien; i++) { - if (a[i]) { - out.push(a[i][prop]); - } - } - } - - return out; - }; - - - // Basically the same as _pluck, but rather than looping over `a` we use `order` - // as the indexes to pick from `a` - var _pluck_order = function (a, order, prop, prop2) { - var out = []; - var i = 0, ien = order.length; - - // Could have the test in the loop for slightly smaller code, but speed - // is essential here - if (prop2 !== undefined) { - for (; i < ien; i++) { - if (a[order[i]][prop]) { - out.push(a[order[i]][prop][prop2]); - } - } - } else { - for (; i < ien; i++) { - out.push(a[order[i]][prop]); - } - } - - return out; - }; - - - var _range = function (len, start) { - var out = []; - var end; - - if (start === undefined) { - start = 0; - end = len; - } else { - end = start; - start = len; - } - - for (var i = start; i < end; i++) { - out.push(i); - } - - return out; - }; - - - var _removeEmpty = function (a) { - var out = []; - - for (var i = 0, ien = a.length; i < ien; i++) { - if (a[i]) { // careful - will remove all falsy values! - out.push(a[i]); - } - } - - return out; - }; - - - var _stripHtml = function (d) { - return d.replace(_re_html, ''); - }; - - - /** - * Determine if all values in the array are unique. This means we can short - * cut the _unique method at the cost of a single loop. A sorted array is used - * to easily check the values. - * - * @param {array} src Source array - * @return {boolean} true if all unique, false otherwise - * @ignore - */ - var _areAllUnique = function (src) { - if (src.length < 2) { - return true; - } - - var sorted = src.slice().sort(); - var last = sorted[0]; - - for (var i = 1, ien = sorted.length; i < ien; i++) { - if (sorted[i] === last) { - return false; - } - - last = sorted[i]; - } - - return true; - }; - - - /** - * Find the unique elements in a source array. - * - * @param {array} src Source array - * @return {array} Array of unique items - * @ignore - */ - var _unique = function (src) { - if (_areAllUnique(src)) { - return src.slice(); - } - - // A faster unique method is to use object keys to identify used values, - // but this doesn't work with arrays or objects, which we must also - // consider. See jsperf.com/compare-array-unique-versions/4 for more - // information. - var - out = [], - val, - i, ien = src.length, - j, k = 0; - - again: for (i = 0; i < ien; i++) { - val = src[i]; - - for (j = 0; j < k; j++) { - if (out[j] === val) { - continue again; - } - } - - out.push(val); - k++; - } - - return out; - }; - - // Surprisingly this is faster than [].concat.apply - // https://jsperf.com/flatten-an-array-loop-vs-reduce/2 - var _flatten = function (out, val) { - if (Array.isArray(val)) { - for (var i = 0; i < val.length; i++) { - _flatten(out, val[i]); - } - } else { - out.push(val); - } - - return out; - } - - // Array.isArray polyfill. - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray - if (!Array.isArray) { - Array.isArray = function (arg) { - return Object.prototype.toString.call(arg) === '[object Array]'; - }; - } - - // .trim() polyfill - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim - if (!String.prototype.trim) { - String.prototype.trim = function () { - return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); - }; - } - - /** - * DataTables utility methods - * - * This namespace provides helper methods that DataTables uses internally to - * create a DataTable, but which are not exclusively used only for DataTables. - * These methods can be used by extension authors to save the duplication of - * code. - * - * @namespace - */ - DataTable.util = { - /** - * Throttle the calls to a function. Arguments and context are maintained - * for the throttled function. - * - * @param {function} fn Function to be called - * @param {integer} freq Call frequency in mS - * @return {function} Wrapped function - */ - throttle: function (fn, freq) { - var - frequency = freq !== undefined ? freq : 200, - last, - timer; - - return function () { - var - that = this, - now = +new Date(), - args = arguments; - - if (last && now < last + frequency) { - clearTimeout(timer); - - timer = setTimeout(function () { - last = undefined; - fn.apply(that, args); - }, frequency); - } else { - last = now; - fn.apply(that, args); - } - }; - }, - - - /** - * Escape a string such that it can be used in a regular expression - * - * @param {string} val string to escape - * @returns {string} escaped string - */ - escapeRegex: function (val) { - return val.replace(_re_escape_regex, '\\$1'); - } - }; - - - /** - * Create a mapping object that allows camel case parameters to be looked up - * for their Hungarian counterparts. The mapping is stored in a private - * parameter called `_hungarianMap` which can be accessed on the source object. - * @param {object} o - * @memberof DataTable#oApi - */ - function _fnHungarianMap(o) { - var - hungarian = 'a aa ai ao as b fn i m o s ', - match, - newKey, - map = {}; - - $.each(o, function (key, val) { - match = key.match(/^([^A-Z]+?)([A-Z])/); - - if (match && hungarian.indexOf(match[1] + ' ') !== -1) { - newKey = key.replace(match[0], match[2].toLowerCase()); - map[newKey] = key; - - if (match[1] === 'o') { - _fnHungarianMap(o[key]); - } - } - }); - - o._hungarianMap = map; - } - - - /** - * Convert from camel case parameters to Hungarian, based on a Hungarian map - * created by _fnHungarianMap. - * @param {object} src The model object which holds all parameters that can be - * mapped. - * @param {object} user The object to convert from camel case to Hungarian. - * @param {boolean} force When set to `true`, properties which already have a - * Hungarian value in the `user` object will be overwritten. Otherwise they - * won't be. - * @memberof DataTable#oApi - */ - function _fnCamelToHungarian(src, user, force) { - if (!src._hungarianMap) { - _fnHungarianMap(src); - } - - var hungarianKey; - - $.each(user, function (key, val) { - hungarianKey = src._hungarianMap[key]; - - if (hungarianKey !== undefined && (force || user[hungarianKey] === undefined)) { - // For objects, we need to buzz down into the object to copy parameters - if (hungarianKey.charAt(0) === 'o') { - // Copy the camelCase options over to the hungarian - if (!user[hungarianKey]) { - user[hungarianKey] = {}; - } - $.extend(true, user[hungarianKey], user[key]); - - _fnCamelToHungarian(src[hungarianKey], user[hungarianKey], force); - } else { - user[hungarianKey] = user[key]; - } - } - }); - } - - - /** - * Language compatibility - when certain options are given, and others aren't, we - * need to duplicate the values over, in order to provide backwards compatibility - * with older language files. - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnLanguageCompat(lang) { - // Note the use of the Hungarian notation for the parameters in this method as - // this is called after the mapping of camelCase to Hungarian - var defaults = DataTable.defaults.oLanguage; - - // Default mapping - var defaultDecimal = defaults.sDecimal; - if (defaultDecimal) { - _addNumericSort(defaultDecimal); - } - - if (lang) { - var zeroRecords = lang.sZeroRecords; - - // Backwards compatibility - if there is no sEmptyTable given, then use the same as - // sZeroRecords - assuming that is given. - if (!lang.sEmptyTable && zeroRecords && - defaults.sEmptyTable === "No data available in table") { - _fnMap(lang, lang, 'sZeroRecords', 'sEmptyTable'); - } - - // Likewise with loading records - if (!lang.sLoadingRecords && zeroRecords && - defaults.sLoadingRecords === "Loading...") { - _fnMap(lang, lang, 'sZeroRecords', 'sLoadingRecords'); - } - - // Old parameter name of the thousands separator mapped onto the new - if (lang.sInfoThousands) { - lang.sThousands = lang.sInfoThousands; - } - - var decimal = lang.sDecimal; - if (decimal && defaultDecimal !== decimal) { - _addNumericSort(decimal); - } - } - } - - - /** - * Map one parameter onto another - * @param {object} o Object to map - * @param {*} knew The new parameter name - * @param {*} old The old parameter name - */ - var _fnCompatMap = function (o, knew, old) { - if (o[knew] !== undefined) { - o[old] = o[knew]; - } - }; - - - /** - * Provide backwards compatibility for the main DT options. Note that the new - * options are mapped onto the old parameters, so this is an external interface - * change only. - * @param {object} init Object to map - */ - function _fnCompatOpts(init) { - _fnCompatMap(init, 'ordering', 'bSort'); - _fnCompatMap(init, 'orderMulti', 'bSortMulti'); - _fnCompatMap(init, 'orderClasses', 'bSortClasses'); - _fnCompatMap(init, 'orderCellsTop', 'bSortCellsTop'); - _fnCompatMap(init, 'order', 'aaSorting'); - _fnCompatMap(init, 'orderFixed', 'aaSortingFixed'); - _fnCompatMap(init, 'paging', 'bPaginate'); - _fnCompatMap(init, 'pagingType', 'sPaginationType'); - _fnCompatMap(init, 'pageLength', 'iDisplayLength'); - _fnCompatMap(init, 'searching', 'bFilter'); - - // Boolean initialisation of x-scrolling - if (typeof init.sScrollX === 'boolean') { - init.sScrollX = init.sScrollX ? '100%' : ''; - } - if (typeof init.scrollX === 'boolean') { - init.scrollX = init.scrollX ? '100%' : ''; - } - - // Column search objects are in an array, so it needs to be converted - // element by element - var searchCols = init.aoSearchCols; - - if (searchCols) { - for (var i = 0, ien = searchCols.length; i < ien; i++) { - if (searchCols[i]) { - _fnCamelToHungarian(DataTable.models.oSearch, searchCols[i]); - } - } - } - } - - - /** - * Provide backwards compatibility for column options. Note that the new options - * are mapped onto the old parameters, so this is an external interface change - * only. - * @param {object} init Object to map - */ - function _fnCompatCols(init) { - _fnCompatMap(init, 'orderable', 'bSortable'); - _fnCompatMap(init, 'orderData', 'aDataSort'); - _fnCompatMap(init, 'orderSequence', 'asSorting'); - _fnCompatMap(init, 'orderDataType', 'sortDataType'); - - // orderData can be given as an integer - var dataSort = init.aDataSort; - if (typeof dataSort === 'number' && !Array.isArray(dataSort)) { - init.aDataSort = [dataSort]; - } - } - - - /** - * Browser feature detection for capabilities, quirks - * @param {object} settings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnBrowserDetect(settings) { - // We don't need to do this every time DataTables is constructed, the values - // calculated are specific to the browser and OS configuration which we - // don't expect to change between initialisations - if (!DataTable.__browser) { - var browser = {}; - DataTable.__browser = browser; - - // Scrolling feature / quirks detection - var n = $('
') - .css({ - position: 'fixed', - top: 0, - left: $(window).scrollLeft() * -1, // allow for scrolling - height: 1, - width: 1, - overflow: 'hidden' - }) - .append( - $('
') - .css({ - position: 'absolute', - top: 1, - left: 1, - width: 100, - overflow: 'scroll' - }) - .append( - $('
') - .css({ - width: '100%', - height: 10 - }) - ) - ) - .appendTo('body'); - - var outer = n.children(); - var inner = outer.children(); - - // Numbers below, in order, are: - // inner.offsetWidth, inner.clientWidth, outer.offsetWidth, outer.clientWidth - // - // IE6 XP: 100 100 100 83 - // IE7 Vista: 100 100 100 83 - // IE 8+ Windows: 83 83 100 83 - // Evergreen Windows: 83 83 100 83 - // Evergreen Mac with scrollbars: 85 85 100 85 - // Evergreen Mac without scrollbars: 100 100 100 100 - - // Get scrollbar width - browser.barWidth = outer[0].offsetWidth - outer[0].clientWidth; - - // IE6/7 will oversize a width 100% element inside a scrolling element, to - // include the width of the scrollbar, while other browsers ensure the inner - // element is contained without forcing scrolling - browser.bScrollOversize = inner[0].offsetWidth === 100 && outer[0].clientWidth !== 100; - - // In rtl text layout, some browsers (most, but not all) will place the - // scrollbar on the left, rather than the right. - browser.bScrollbarLeft = Math.round(inner.offset().left) !== 1; - - // IE8- don't provide height and width for getBoundingClientRect - browser.bBounding = n[0].getBoundingClientRect().width ? true : false; - - n.remove(); - } - - $.extend(settings.oBrowser, DataTable.__browser); - settings.oScroll.iBarWidth = DataTable.__browser.barWidth; - } - - - /** - * Array.prototype reduce[Right] method, used for browsers which don't support - * JS 1.6. Done this way to reduce code size, since we iterate either way - * @param {object} settings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnReduce(that, fn, init, start, end, inc) { - var - i = start, - value, - isSet = false; - - if (init !== undefined) { - value = init; - isSet = true; - } - - while (i !== end) { - if (!that.hasOwnProperty(i)) { - continue; - } - - value = isSet ? - fn(value, that[i], i, that) : - that[i]; - - isSet = true; - i += inc; - } - - return value; - } - - /** - * Add a column to the list used for the table with default values - * @param {object} oSettings dataTables settings object - * @param {node} nTh The th element for this column - * @memberof DataTable#oApi - */ - function _fnAddColumn(oSettings, nTh) { - // Add column to aoColumns array - var oDefaults = DataTable.defaults.column; - var iCol = oSettings.aoColumns.length; - var oCol = $.extend({}, DataTable.models.oColumn, oDefaults, { - "nTh": nTh ? nTh : document.createElement('th'), - "sTitle": oDefaults.sTitle ? oDefaults.sTitle : nTh ? nTh.innerHTML : '', - "aDataSort": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol], - "mData": oDefaults.mData ? oDefaults.mData : iCol, - idx: iCol - }); - oSettings.aoColumns.push(oCol); - - // Add search object for column specific search. Note that the `searchCols[ iCol ]` - // passed into extend can be undefined. This allows the user to give a default - // with only some of the parameters defined, and also not give a default - var searchCols = oSettings.aoPreSearchCols; - searchCols[iCol] = $.extend({}, DataTable.models.oSearch, searchCols[iCol]); - - // Use the default column options function to initialise classes etc - _fnColumnOptions(oSettings, iCol, $(nTh).data()); - } - - - /** - * Apply options for a column - * @param {object} oSettings dataTables settings object - * @param {int} iCol column index to consider - * @param {object} oOptions object with sType, bVisible and bSearchable etc - * @memberof DataTable#oApi - */ - function _fnColumnOptions(oSettings, iCol, oOptions) { - var oCol = oSettings.aoColumns[iCol]; - var oClasses = oSettings.oClasses; - var th = $(oCol.nTh); - - // Try to get width information from the DOM. We can't get it from CSS - // as we'd need to parse the CSS stylesheet. `width` option can override - if (!oCol.sWidthOrig) { - // Width attribute - oCol.sWidthOrig = th.attr('width') || null; - - // Style attribute - var t = (th.attr('style') || '').match(/width:\s*(\d+[pxem%]+)/); - if (t) { - oCol.sWidthOrig = t[1]; - } - } - - /* User specified column options */ - if (oOptions !== undefined && oOptions !== null) { - // Backwards compatibility - _fnCompatCols(oOptions); - - // Map camel case parameters to their Hungarian counterparts - _fnCamelToHungarian(DataTable.defaults.column, oOptions, true); - - /* Backwards compatibility for mDataProp */ - if (oOptions.mDataProp !== undefined && !oOptions.mData) { - oOptions.mData = oOptions.mDataProp; - } - - if (oOptions.sType) { - oCol._sManualType = oOptions.sType; - } - - // `class` is a reserved word in Javascript, so we need to provide - // the ability to use a valid name for the camel case input - if (oOptions.className && !oOptions.sClass) { - oOptions.sClass = oOptions.className; - } - if (oOptions.sClass) { - th.addClass(oOptions.sClass); - } - - $.extend(oCol, oOptions); - _fnMap(oCol, oOptions, "sWidth", "sWidthOrig"); - - /* iDataSort to be applied (backwards compatibility), but aDataSort will take - * priority if defined - */ - if (oOptions.iDataSort !== undefined) { - oCol.aDataSort = [oOptions.iDataSort]; - } - _fnMap(oCol, oOptions, "aDataSort"); - } - - /* Cache the data get and set functions for speed */ - var mDataSrc = oCol.mData; - var mData = _fnGetObjectDataFn(mDataSrc); - var mRender = oCol.mRender ? _fnGetObjectDataFn(oCol.mRender) : null; - - var attrTest = function (src) { - return typeof src === 'string' && src.indexOf('@') !== -1; - }; - oCol._bAttrSrc = $.isPlainObject(mDataSrc) && ( - attrTest(mDataSrc.sort) || attrTest(mDataSrc.type) || attrTest(mDataSrc.filter) - ); - oCol._setter = null; - - oCol.fnGetData = function (rowData, type, meta) { - var innerData = mData(rowData, type, undefined, meta); - - return mRender && type ? - mRender(innerData, type, rowData, meta) : - innerData; - }; - oCol.fnSetData = function (rowData, val, meta) { - return _fnSetObjectDataFn(mDataSrc)(rowData, val, meta); - }; - - // Indicate if DataTables should read DOM data as an object or array - // Used in _fnGetRowElements - if (typeof mDataSrc !== 'number') { - oSettings._rowReadObject = true; - } - - /* Feature sorting overrides column specific when off */ - if (!oSettings.oFeatures.bSort) { - oCol.bSortable = false; - th.addClass(oClasses.sSortableNone); // Have to add class here as order event isn't called - } - - /* Check that the class assignment is correct for sorting */ - var bAsc = $.inArray('asc', oCol.asSorting) !== -1; - var bDesc = $.inArray('desc', oCol.asSorting) !== -1; - if (!oCol.bSortable || (!bAsc && !bDesc)) { - oCol.sSortingClass = oClasses.sSortableNone; - oCol.sSortingClassJUI = ""; - } else if (bAsc && !bDesc) { - oCol.sSortingClass = oClasses.sSortableAsc; - oCol.sSortingClassJUI = oClasses.sSortJUIAscAllowed; - } else if (!bAsc && bDesc) { - oCol.sSortingClass = oClasses.sSortableDesc; - oCol.sSortingClassJUI = oClasses.sSortJUIDescAllowed; - } else { - oCol.sSortingClass = oClasses.sSortable; - oCol.sSortingClassJUI = oClasses.sSortJUI; - } - } - - - /** - * Adjust the table column widths for new data. Note: you would probably want to - * do a redraw after calling this function! - * @param {object} settings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnAdjustColumnSizing(settings) { - /* Not interested in doing column width calculation if auto-width is disabled */ - if (settings.oFeatures.bAutoWidth !== false) { - var columns = settings.aoColumns; - - _fnCalculateColumnWidths(settings); - for (var i = 0, iLen = columns.length; i < iLen; i++) { - columns[i].nTh.style.width = columns[i].sWidth; - } - } - - var scroll = settings.oScroll; - if (scroll.sY !== '' || scroll.sX !== '') { - _fnScrollDraw(settings); - } - - _fnCallbackFire(settings, null, 'column-sizing', [settings]); - } - - - /** - * Covert the index of a visible column to the index in the data array (take account - * of hidden columns) - * @param {object} oSettings dataTables settings object - * @param {int} iMatch Visible column index to lookup - * @returns {int} i the data index - * @memberof DataTable#oApi - */ - function _fnVisibleToColumnIndex(oSettings, iMatch) { - var aiVis = _fnGetColumns(oSettings, 'bVisible'); - - return typeof aiVis[iMatch] === 'number' ? - aiVis[iMatch] : - null; - } - - - /** - * Covert the index of an index in the data array and convert it to the visible - * column index (take account of hidden columns) - * @param {int} iMatch Column index to lookup - * @param {object} oSettings dataTables settings object - * @returns {int} i the data index - * @memberof DataTable#oApi - */ - function _fnColumnIndexToVisible(oSettings, iMatch) { - var aiVis = _fnGetColumns(oSettings, 'bVisible'); - var iPos = $.inArray(iMatch, aiVis); - - return iPos !== -1 ? iPos : null; - } - - - /** - * Get the number of visible columns - * @param {object} oSettings dataTables settings object - * @returns {int} i the number of visible columns - * @memberof DataTable#oApi - */ - function _fnVisbleColumns(oSettings) { - var vis = 0; - - // No reduce in IE8, use a loop for now - $.each(oSettings.aoColumns, function (i, col) { - if (col.bVisible && $(col.nTh).css('display') !== 'none') { - vis++; - } - }); - - return vis; - } - - - /** - * Get an array of column indexes that match a given property - * @param {object} oSettings dataTables settings object - * @param {string} sParam Parameter in aoColumns to look for - typically - * bVisible or bSearchable - * @returns {array} Array of indexes with matched properties - * @memberof DataTable#oApi - */ - function _fnGetColumns(oSettings, sParam) { - var a = []; - - $.map(oSettings.aoColumns, function (val, i) { - if (val[sParam]) { - a.push(i); - } - }); - - return a; - } - - - /** - * Calculate the 'type' of a column - * @param {object} settings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnColumnTypes(settings) { - var columns = settings.aoColumns; - var data = settings.aoData; - var types = DataTable.ext.type.detect; - var i, ien, j, jen, k, ken; - var col, cell, detectedType, cache; - - // For each column, spin over the - for (i = 0, ien = columns.length; i < ien; i++) { - col = columns[i]; - cache = []; - - if (!col.sType && col._sManualType) { - col.sType = col._sManualType; - } else if (!col.sType) { - for (j = 0, jen = types.length; j < jen; j++) { - for (k = 0, ken = data.length; k < ken; k++) { - // Use a cache array so we only need to get the type data - // from the formatter once (when using multiple detectors) - if (cache[k] === undefined) { - cache[k] = _fnGetCellData(settings, k, i, 'type'); - } - - detectedType = types[j](cache[k], settings); - - // If null, then this type can't apply to this column, so - // rather than testing all cells, break out. There is an - // exception for the last type which is `html`. We need to - // scan all rows since it is possible to mix string and HTML - // types - if (!detectedType && j !== types.length - 1) { - break; - } - - // Only a single match is needed for html type since it is - // bottom of the pile and very similar to string - if (detectedType === 'html') { - break; - } - } - - // Type is valid for all data points in the column - use this - // type - if (detectedType) { - col.sType = detectedType; - break; - } - } - - // Fall back - if no type was detected, always use string - if (!col.sType) { - col.sType = 'string'; - } - } - } - } - - - /** - * Take the column definitions and static columns arrays and calculate how - * they relate to column indexes. The callback function will then apply the - * definition found for a column to a suitable configuration object. - * @param {object} oSettings dataTables settings object - * @param {array} aoColDefs The aoColumnDefs array that is to be applied - * @param {array} aoCols The aoColumns array that defines columns individually - * @param {function} fn Callback function - takes two parameters, the calculated - * column index and the definition for that column. - * @memberof DataTable#oApi - */ - function _fnApplyColumnDefs(oSettings, aoColDefs, aoCols, fn) { - var i, iLen, j, jLen, k, kLen, def; - var columns = oSettings.aoColumns; - - // Column definitions with aTargets - if (aoColDefs) { - /* Loop over the definitions array - loop in reverse so first instance has priority */ - for (i = aoColDefs.length - 1; i >= 0; i--) { - def = aoColDefs[i]; - - /* Each definition can target multiple columns, as it is an array */ - var aTargets = def.targets !== undefined ? - def.targets : - def.aTargets; - - if (!Array.isArray(aTargets)) { - aTargets = [aTargets]; - } - - for (j = 0, jLen = aTargets.length; j < jLen; j++) { - if (typeof aTargets[j] === 'number' && aTargets[j] >= 0) { - /* Add columns that we don't yet know about */ - while (columns.length <= aTargets[j]) { - _fnAddColumn(oSettings); - } - - /* Integer, basic index */ - fn(aTargets[j], def); - } else if (typeof aTargets[j] === 'number' && aTargets[j] < 0) { - /* Negative integer, right to left column counting */ - fn(columns.length + aTargets[j], def); - } else if (typeof aTargets[j] === 'string') { - /* Class name matching on TH element */ - for (k = 0, kLen = columns.length; k < kLen; k++) { - if (aTargets[j] == "_all" || - $(columns[k].nTh).hasClass(aTargets[j])) { - fn(k, def); - } - } - } - } - } - } - - // Statically defined columns array - if (aoCols) { - for (i = 0, iLen = aoCols.length; i < iLen; i++) { - fn(i, aoCols[i]); - } - } - } - - /** - * Add a data array to the table, creating DOM node etc. This is the parallel to - * _fnGatherData, but for adding rows from a Javascript source, rather than a - * DOM source. - * @param {object} oSettings dataTables settings object - * @param {array} aData data array to be added - * @param {node} [nTr] TR element to add to the table - optional. If not given, - * DataTables will create a row automatically - * @param {array} [anTds] Array of TD|TH elements for the row - must be given - * if nTr is. - * @returns {int} >=0 if successful (index of new aoData entry), -1 if failed - * @memberof DataTable#oApi - */ - function _fnAddData(oSettings, aDataIn, nTr, anTds) { - /* Create the object for storing information about this new row */ - var iRow = oSettings.aoData.length; - var oData = $.extend(true, {}, DataTable.models.oRow, { - src: nTr ? 'dom' : 'data', - idx: iRow - }); - - oData._aData = aDataIn; - oSettings.aoData.push(oData); - - /* Create the cells */ - var nTd, sThisType; - var columns = oSettings.aoColumns; - - // Invalidate the column types as the new data needs to be revalidated - for (var i = 0, iLen = columns.length; i < iLen; i++) { - columns[i].sType = null; - } - - /* Add to the display array */ - oSettings.aiDisplayMaster.push(iRow); - - var id = oSettings.rowIdFn(aDataIn); - if (id !== undefined) { - oSettings.aIds[id] = oData; - } - - /* Create the DOM information, or register it if already present */ - if (nTr || !oSettings.oFeatures.bDeferRender) { - _fnCreateTr(oSettings, iRow, nTr, anTds); - } - - return iRow; - } - - - /** - * Add one or more TR elements to the table. Generally we'd expect to - * use this for reading data from a DOM sourced table, but it could be - * used for an TR element. Note that if a TR is given, it is used (i.e. - * it is not cloned). - * @param {object} settings dataTables settings object - * @param {array|node|jQuery} trs The TR element(s) to add to the table - * @returns {array} Array of indexes for the added rows - * @memberof DataTable#oApi - */ - function _fnAddTr(settings, trs) { - var row; - - // Allow an individual node to be passed in - if (!(trs instanceof $)) { - trs = $(trs); - } - - return trs.map(function (i, el) { - row = _fnGetRowElements(settings, el); - return _fnAddData(settings, row.data, el, row.cells); - }); - } - - - /** - * Take a TR element and convert it to an index in aoData - * @param {object} oSettings dataTables settings object - * @param {node} n the TR element to find - * @returns {int} index if the node is found, null if not - * @memberof DataTable#oApi - */ - function _fnNodeToDataIndex(oSettings, n) { - return (n._DT_RowIndex !== undefined) ? n._DT_RowIndex : null; - } - - - /** - * Take a TD element and convert it into a column data index (not the visible index) - * @param {object} oSettings dataTables settings object - * @param {int} iRow The row number the TD/TH can be found in - * @param {node} n The TD/TH element to find - * @returns {int} index if the node is found, -1 if not - * @memberof DataTable#oApi - */ - function _fnNodeToColumnIndex(oSettings, iRow, n) { - return $.inArray(n, oSettings.aoData[iRow].anCells); - } - - - /** - * Get the data for a given cell from the internal cache, taking into account data mapping - * @param {object} settings dataTables settings object - * @param {int} rowIdx aoData row id - * @param {int} colIdx Column index - * @param {string} type data get type ('display', 'type' 'filter' 'sort') - * @returns {*} Cell data - * @memberof DataTable#oApi - */ - function _fnGetCellData(settings, rowIdx, colIdx, type) { - var draw = settings.iDraw; - var col = settings.aoColumns[colIdx]; - var rowData = settings.aoData[rowIdx]._aData; - var defaultContent = col.sDefaultContent; - var cellData = col.fnGetData(rowData, type, { - settings: settings, - row: rowIdx, - col: colIdx - }); - - if (cellData === undefined) { - if (settings.iDrawError != draw && defaultContent === null) { - _fnLog(settings, 0, "Requested unknown parameter " + - (typeof col.mData == 'function' ? '{function}' : "'" + col.mData + "'") + - " for row " + rowIdx + ", column " + colIdx, 4); - settings.iDrawError = draw; - } - return defaultContent; - } - - // When the data source is null and a specific data type is requested (i.e. - // not the original data), we can use default column data - if ((cellData === rowData || cellData === null) && defaultContent !== null && type !== undefined) { - cellData = defaultContent; - } else if (typeof cellData === 'function') { - // If the data source is a function, then we run it and use the return, - // executing in the scope of the data object (for instances) - return cellData.call(rowData); - } - - if (cellData === null && type == 'display') { - return ''; - } - return cellData; - } - - - /** - * Set the value for a specific cell, into the internal data cache - * @param {object} settings dataTables settings object - * @param {int} rowIdx aoData row id - * @param {int} colIdx Column index - * @param {*} val Value to set - * @memberof DataTable#oApi - */ - function _fnSetCellData(settings, rowIdx, colIdx, val) { - var col = settings.aoColumns[colIdx]; - var rowData = settings.aoData[rowIdx]._aData; - - col.fnSetData(rowData, val, { - settings: settings, - row: rowIdx, - col: colIdx - }); - } - - - // Private variable that is used to match action syntax in the data property object - var __reArray = /\[.*?\]$/; - var __reFn = /\(\)$/; - - /** - * Split string on periods, taking into account escaped periods - * @param {string} str String to split - * @return {array} Split string - */ - function _fnSplitObjNotation(str) { - return $.map(str.match(/(\\.|[^\.])+/g) || [''], function (s) { - return s.replace(/\\\./g, '.'); - }); - } - - - /** - * Return a function that can be used to get data from a source object, taking - * into account the ability to use nested objects as a source - * @param {string|int|function} mSource The data source for the object - * @returns {function} Data get function - * @memberof DataTable#oApi - */ - function _fnGetObjectDataFn(mSource) { - if ($.isPlainObject(mSource)) { - /* Build an object of get functions, and wrap them in a single call */ - var o = {}; - $.each(mSource, function (key, val) { - if (val) { - o[key] = _fnGetObjectDataFn(val); - } - }); - - return function (data, type, row, meta) { - var t = o[type] || o._; - return t !== undefined ? - t(data, type, row, meta) : - data; - }; - } else if (mSource === null) { - /* Give an empty string for rendering / sorting etc */ - return function (data) { // type, row and meta also passed, but not used - return data; - }; - } else if (typeof mSource === 'function') { - return function (data, type, row, meta) { - return mSource(data, type, row, meta); - }; - } else if (typeof mSource === 'string' && (mSource.indexOf('.') !== -1 || - mSource.indexOf('[') !== -1 || mSource.indexOf('(') !== -1)) { - /* If there is a . in the source string then the data source is in a - * nested object so we loop over the data for each level to get the next - * level down. On each loop we test for undefined, and if found immediately - * return. This allows entire objects to be missing and sDefaultContent to - * be used if defined, rather than throwing an error - */ - var fetchData = function (data, type, src) { - var arrayNotation, funcNotation, out, innerSrc; - - if (src !== "") { - var a = _fnSplitObjNotation(src); - - for (var i = 0, iLen = a.length; i < iLen; i++) { - // Check if we are dealing with special notation - arrayNotation = a[i].match(__reArray); - funcNotation = a[i].match(__reFn); - - if (arrayNotation) { - // Array notation - a[i] = a[i].replace(__reArray, ''); - - // Condition allows simply [] to be passed in - if (a[i] !== "") { - data = data[a[i]]; - } - out = []; - - // Get the remainder of the nested object to get - a.splice(0, i + 1); - innerSrc = a.join('.'); - - // Traverse each entry in the array getting the properties requested - if (Array.isArray(data)) { - for (var j = 0, jLen = data.length; j < jLen; j++) { - out.push(fetchData(data[j], type, innerSrc)); - } - } - - // If a string is given in between the array notation indicators, that - // is used to join the strings together, otherwise an array is returned - var join = arrayNotation[0].substring(1, arrayNotation[0].length - 1); - data = (join === "") ? out : out.join(join); - - // The inner call to fetchData has already traversed through the remainder - // of the source requested, so we exit from the loop - break; - } else if (funcNotation) { - // Function call - a[i] = a[i].replace(__reFn, ''); - data = data[a[i]](); - continue; - } - - if (data === null || data[a[i]] === undefined) { - return undefined; - } - data = data[a[i]]; - } - } - - return data; - }; - - return function (data, type) { // row and meta also passed, but not used - return fetchData(data, type, mSource); - }; - } else { - /* Array or flat object mapping */ - return function (data, type) { // row and meta also passed, but not used - return data[mSource]; - }; - } - } - - - /** - * Return a function that can be used to set data from a source object, taking - * into account the ability to use nested objects as a source - * @param {string|int|function} mSource The data source for the object - * @returns {function} Data set function - * @memberof DataTable#oApi - */ - function _fnSetObjectDataFn(mSource) { - if ($.isPlainObject(mSource)) { - /* Unlike get, only the underscore (global) option is used for for - * setting data since we don't know the type here. This is why an object - * option is not documented for `mData` (which is read/write), but it is - * for `mRender` which is read only. - */ - return _fnSetObjectDataFn(mSource._); - } else if (mSource === null) { - /* Nothing to do when the data source is null */ - return function () { - }; - } else if (typeof mSource === 'function') { - return function (data, val, meta) { - mSource(data, 'set', val, meta); - }; - } else if (typeof mSource === 'string' && (mSource.indexOf('.') !== -1 || - mSource.indexOf('[') !== -1 || mSource.indexOf('(') !== -1)) { - /* Like the get, we need to get data from a nested object */ - var setData = function (data, val, src) { - var a = _fnSplitObjNotation(src), b; - var aLast = a[a.length - 1]; - var arrayNotation, funcNotation, o, innerSrc; - - for (var i = 0, iLen = a.length - 1; i < iLen; i++) { - // Protect against prototype pollution - if (a[i] === '__proto__' || a[i] === 'constructor') { - throw new Error('Cannot set prototype values'); - } - - // Check if we are dealing with an array notation request - arrayNotation = a[i].match(__reArray); - funcNotation = a[i].match(__reFn); - - if (arrayNotation) { - a[i] = a[i].replace(__reArray, ''); - data[a[i]] = []; - - // Get the remainder of the nested object to set so we can recurse - b = a.slice(); - b.splice(0, i + 1); - innerSrc = b.join('.'); - - // Traverse each entry in the array setting the properties requested - if (Array.isArray(val)) { - for (var j = 0, jLen = val.length; j < jLen; j++) { - o = {}; - setData(o, val[j], innerSrc); - data[a[i]].push(o); - } - } else { - // We've been asked to save data to an array, but it - // isn't array data to be saved. Best that can be done - // is to just save the value. - data[a[i]] = val; - } - - // The inner call to setData has already traversed through the remainder - // of the source and has set the data, thus we can exit here - return; - } else if (funcNotation) { - // Function call - a[i] = a[i].replace(__reFn, ''); - data = data[a[i]](val); - } - - // If the nested object doesn't currently exist - since we are - // trying to set the value - create it - if (data[a[i]] === null || data[a[i]] === undefined) { - data[a[i]] = {}; - } - data = data[a[i]]; - } - - // Last item in the input - i.e, the actual set - if (aLast.match(__reFn)) { - // Function call - data = data[aLast.replace(__reFn, '')](val); - } else { - // If array notation is used, we just want to strip it and use the property name - // and assign the value. If it isn't used, then we get the result we want anyway - data[aLast.replace(__reArray, '')] = val; - } - }; - - return function (data, val) { // meta is also passed in, but not used - return setData(data, val, mSource); - }; - } else { - /* Array or flat object mapping */ - return function (data, val) { // meta is also passed in, but not used - data[mSource] = val; - }; - } - } - - - /** - * Return an array with the full table data - * @param {object} oSettings dataTables settings object - * @returns array {array} aData Master data array - * @memberof DataTable#oApi - */ - function _fnGetDataMaster(settings) { - return _pluck(settings.aoData, '_aData'); - } - - - /** - * Nuke the table - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnClearTable(settings) { - settings.aoData.length = 0; - settings.aiDisplayMaster.length = 0; - settings.aiDisplay.length = 0; - settings.aIds = {}; - } - - - /** - * Take an array of integers (index array) and remove a target integer (value - not - * the key!) - * @param {array} a Index array to target - * @param {int} iTarget value to find - * @memberof DataTable#oApi - */ - function _fnDeleteIndex(a, iTarget, splice) { - var iTargetIndex = -1; - - for (var i = 0, iLen = a.length; i < iLen; i++) { - if (a[i] == iTarget) { - iTargetIndex = i; - } else if (a[i] > iTarget) { - a[i]--; - } - } - - if (iTargetIndex != -1 && splice === undefined) { - a.splice(iTargetIndex, 1); - } - } - - - /** - * Mark cached data as invalid such that a re-read of the data will occur when - * the cached data is next requested. Also update from the data source object. - * - * @param {object} settings DataTables settings object - * @param {int} rowIdx Row index to invalidate - * @param {string} [src] Source to invalidate from: undefined, 'auto', 'dom' - * or 'data' - * @param {int} [colIdx] Column index to invalidate. If undefined the whole - * row will be invalidated - * @memberof DataTable#oApi - * - * @todo For the modularisation of v1.11 this will need to become a callback, so - * the sort and filter methods can subscribe to it. That will required - * initialisation options for sorting, which is why it is not already baked in - */ - function _fnInvalidate(settings, rowIdx, src, colIdx) { - var row = settings.aoData[rowIdx]; - var i, ien; - var cellWrite = function (cell, col) { - // This is very frustrating, but in IE if you just write directly - // to innerHTML, and elements that are overwritten are GC'ed, - // even if there is a reference to them elsewhere - while (cell.childNodes.length) { - cell.removeChild(cell.firstChild); - } - - cell.innerHTML = _fnGetCellData(settings, rowIdx, col, 'display'); - }; - - // Are we reading last data from DOM or the data object? - if (src === 'dom' || ((!src || src === 'auto') && row.src === 'dom')) { - // Read the data from the DOM - row._aData = _fnGetRowElements( - settings, row, colIdx, colIdx === undefined ? undefined : row._aData - ) - .data; - } else { - // Reading from data object, update the DOM - var cells = row.anCells; - - if (cells) { - if (colIdx !== undefined) { - cellWrite(cells[colIdx], colIdx); - } else { - for (i = 0, ien = cells.length; i < ien; i++) { - cellWrite(cells[i], i); - } - } - } - } - - // For both row and cell invalidation, the cached data for sorting and - // filtering is nulled out - row._aSortData = null; - row._aFilterData = null; - - // Invalidate the type for a specific column (if given) or all columns since - // the data might have changed - var cols = settings.aoColumns; - if (colIdx !== undefined) { - cols[colIdx].sType = null; - } else { - for (i = 0, ien = cols.length; i < ien; i++) { - cols[i].sType = null; - } - - // Update DataTables special `DT_*` attributes for the row - _fnRowAttributes(settings, row); - } - } - - - /** - * Build a data source object from an HTML row, reading the contents of the - * cells that are in the row. - * - * @param {object} settings DataTables settings object - * @param {node|object} TR element from which to read data or existing row - * object from which to re-read the data from the cells - * @param {int} [colIdx] Optional column index - * @param {array|object} [d] Data source object. If `colIdx` is given then this - * parameter should also be given and will be used to write the data into. - * Only the column in question will be written - * @returns {object} Object with two parameters: `data` the data read, in - * document order, and `cells` and array of nodes (they can be useful to the - * caller, so rather than needing a second traversal to get them, just return - * them from here). - * @memberof DataTable#oApi - */ - function _fnGetRowElements(settings, row, colIdx, d) { - var - tds = [], - td = row.firstChild, - name, col, o, i = 0, contents, - columns = settings.aoColumns, - objectRead = settings._rowReadObject; - - // Allow the data object to be passed in, or construct - d = d !== undefined ? - d : - objectRead ? - {} : - []; - - var attr = function (str, td) { - if (typeof str === 'string') { - var idx = str.indexOf('@'); - - if (idx !== -1) { - var attr = str.substring(idx + 1); - var setter = _fnSetObjectDataFn(str); - setter(d, td.getAttribute(attr)); - } - } - }; - - // Read data from a cell and store into the data object - var cellProcess = function (cell) { - if (colIdx === undefined || colIdx === i) { - col = columns[i]; - contents = (cell.innerHTML).trim(); - - if (col && col._bAttrSrc) { - var setter = _fnSetObjectDataFn(col.mData._); - setter(d, contents); - - attr(col.mData.sort, cell); - attr(col.mData.type, cell); - attr(col.mData.filter, cell); - } else { - // Depending on the `data` option for the columns the data can - // be read to either an object or an array. - if (objectRead) { - if (!col._setter) { - // Cache the setter function - col._setter = _fnSetObjectDataFn(col.mData); - } - col._setter(d, contents); - } else { - d[i] = contents; - } - } - } - - i++; - }; - - if (td) { - // `tr` element was passed in - while (td) { - name = td.nodeName.toUpperCase(); - - if (name == "TD" || name == "TH") { - cellProcess(td); - tds.push(td); - } - - td = td.nextSibling; - } - } else { - // Existing row object passed in - tds = row.anCells; - - for (var j = 0, jen = tds.length; j < jen; j++) { - cellProcess(tds[j]); - } - } - - // Read the ID from the DOM if present - var rowNode = row.firstChild ? row : row.nTr; - - if (rowNode) { - var id = rowNode.getAttribute('id'); - - if (id) { - _fnSetObjectDataFn(settings.rowId)(d, id); - } - } - - return { - data: d, - cells: tds - }; - } - - /** - * Create a new TR element (and it's TD children) for a row - * @param {object} oSettings dataTables settings object - * @param {int} iRow Row to consider - * @param {node} [nTrIn] TR element to add to the table - optional. If not given, - * DataTables will create a row automatically - * @param {array} [anTds] Array of TD|TH elements for the row - must be given - * if nTr is. - * @memberof DataTable#oApi - */ - function _fnCreateTr(oSettings, iRow, nTrIn, anTds) { - var - row = oSettings.aoData[iRow], - rowData = row._aData, - cells = [], - nTr, nTd, oCol, - i, iLen, create; - - if (row.nTr === null) { - nTr = nTrIn || document.createElement('tr'); - - row.nTr = nTr; - row.anCells = cells; - - /* Use a private property on the node to allow reserve mapping from the node - * to the aoData array for fast look up - */ - nTr._DT_RowIndex = iRow; - - /* Special parameters can be given by the data source to be used on the row */ - _fnRowAttributes(oSettings, row); - - /* Process each column */ - for (i = 0, iLen = oSettings.aoColumns.length; i < iLen; i++) { - oCol = oSettings.aoColumns[i]; - create = nTrIn ? false : true; - - nTd = create ? document.createElement(oCol.sCellType) : anTds[i]; - nTd._DT_CellIndex = { - row: iRow, - column: i - }; - - cells.push(nTd); - - // Need to create the HTML if new, or if a rendering function is defined - if (create || ((oCol.mRender || oCol.mData !== i) && - (!$.isPlainObject(oCol.mData) || oCol.mData._ !== i + '.display') - )) { - nTd.innerHTML = _fnGetCellData(oSettings, iRow, i, 'display'); - } - - /* Add user defined class */ - if (oCol.sClass) { - nTd.className += ' ' + oCol.sClass; - } - - // Visibility - add or remove as required - if (oCol.bVisible && !nTrIn) { - nTr.appendChild(nTd); - } else if (!oCol.bVisible && nTrIn) { - nTd.parentNode.removeChild(nTd); - } - - if (oCol.fnCreatedCell) { - oCol.fnCreatedCell.call(oSettings.oInstance, - nTd, _fnGetCellData(oSettings, iRow, i), rowData, iRow, i - ); - } - } - - _fnCallbackFire(oSettings, 'aoRowCreatedCallback', null, [nTr, rowData, iRow, cells]); - } - } - - - /** - * Add attributes to a row based on the special `DT_*` parameters in a data - * source object. - * @param {object} settings DataTables settings object - * @param {object} DataTables row object for the row to be modified - * @memberof DataTable#oApi - */ - function _fnRowAttributes(settings, row) { - var tr = row.nTr; - var data = row._aData; - - if (tr) { - var id = settings.rowIdFn(data); - - if (id) { - tr.id = id; - } - - if (data.DT_RowClass) { - // Remove any classes added by DT_RowClass before - var a = data.DT_RowClass.split(' '); - row.__rowc = row.__rowc ? - _unique(row.__rowc.concat(a)) : - a; - - $(tr) - .removeClass(row.__rowc.join(' ')) - .addClass(data.DT_RowClass); - } - - if (data.DT_RowAttr) { - $(tr).attr(data.DT_RowAttr); - } - - if (data.DT_RowData) { - $(tr).data(data.DT_RowData); - } - } - } - - - /** - * Create the HTML header for the table - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnBuildHead(oSettings) { - var i, ien, cell, row, column; - var thead = oSettings.nTHead; - var tfoot = oSettings.nTFoot; - var createHeader = $('th, td', thead).length === 0; - var classes = oSettings.oClasses; - var columns = oSettings.aoColumns; - - if (createHeader) { - row = $('
').appendTo(thead); - } - - for (i = 0, ien = columns.length; i < ien; i++) { - column = columns[i]; - cell = $(column.nTh).addClass(column.sClass); - - if (createHeader) { - cell.appendTo(row); - } - - // 1.11 move into sorting - if (oSettings.oFeatures.bSort) { - cell.addClass(column.sSortingClass); - - if (column.bSortable !== false) { - cell - .attr('tabindex', oSettings.iTabIndex) - .attr('aria-controls', oSettings.sTableId); - - _fnSortAttachListener(oSettings, column.nTh, i); - } - } - - if (column.sTitle != cell[0].innerHTML) { - cell.html(column.sTitle); - } - - _fnRenderer(oSettings, 'header')( - oSettings, cell, column, classes - ); - } - - if (createHeader) { - _fnDetectHeader(oSettings.aoHeader, thead); - } - - /* ARIA role for the rows */ - $(thead).children('tr').attr('role', 'row'); - - /* Deal with the footer - add classes if required */ - $(thead).children('tr').children('th, td').addClass(classes.sHeaderTH); - $(tfoot).children('tr').children('th, td').addClass(classes.sFooterTH); - - // Cache the footer cells. Note that we only take the cells from the first - // row in the footer. If there is more than one row the user wants to - // interact with, they need to use the table().foot() method. Note also this - // allows cells to be used for multiple columns using colspan - if (tfoot !== null) { - var cells = oSettings.aoFooter[0]; - - for (i = 0, ien = cells.length; i < ien; i++) { - column = columns[i]; - column.nTf = cells[i].cell; - - if (column.sClass) { - $(column.nTf).addClass(column.sClass); - } - } - } - } - - - /** - * Draw the header (or footer) element based on the column visibility states. The - * methodology here is to use the layout array from _fnDetectHeader, modified for - * the instantaneous column visibility, to construct the new layout. The grid is - * traversed over cell at a time in a rows x columns grid fashion, although each - * cell insert can cover multiple elements in the grid - which is tracks using the - * aApplied array. Cell inserts in the grid will only occur where there isn't - * already a cell in that position. - * @param {object} oSettings dataTables settings object - * @param array {objects} aoSource Layout array from _fnDetectHeader - * @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc, - * @memberof DataTable#oApi - */ - function _fnDrawHead(oSettings, aoSource, bIncludeHidden) { - var i, iLen, j, jLen, k, kLen, n, nLocalTr; - var aoLocal = []; - var aApplied = []; - var iColumns = oSettings.aoColumns.length; - var iRowspan, iColspan; - - if (!aoSource) { - return; - } - - if (bIncludeHidden === undefined) { - bIncludeHidden = false; - } - - /* Make a copy of the master layout array, but without the visible columns in it */ - for (i = 0, iLen = aoSource.length; i < iLen; i++) { - aoLocal[i] = aoSource[i].slice(); - aoLocal[i].nTr = aoSource[i].nTr; - - /* Remove any columns which are currently hidden */ - for (j = iColumns - 1; j >= 0; j--) { - if (!oSettings.aoColumns[j].bVisible && !bIncludeHidden) { - aoLocal[i].splice(j, 1); - } - } - - /* Prep the applied array - it needs an element for each row */ - aApplied.push([]); - } - - for (i = 0, iLen = aoLocal.length; i < iLen; i++) { - nLocalTr = aoLocal[i].nTr; - - /* All cells are going to be replaced, so empty out the row */ - if (nLocalTr) { - while ((n = nLocalTr.firstChild)) { - nLocalTr.removeChild(n); - } - } - - for (j = 0, jLen = aoLocal[i].length; j < jLen; j++) { - iRowspan = 1; - iColspan = 1; - - /* Check to see if there is already a cell (row/colspan) covering our target - * insert point. If there is, then there is nothing to do. - */ - if (aApplied[i][j] === undefined) { - nLocalTr.appendChild(aoLocal[i][j].cell); - aApplied[i][j] = 1; - - /* Expand the cell to cover as many rows as needed */ - while (aoLocal[i + iRowspan] !== undefined && - aoLocal[i][j].cell == aoLocal[i + iRowspan][j].cell) { - aApplied[i + iRowspan][j] = 1; - iRowspan++; - } - - /* Expand the cell to cover as many columns as needed */ - while (aoLocal[i][j + iColspan] !== undefined && - aoLocal[i][j].cell == aoLocal[i][j + iColspan].cell) { - /* Must update the applied array over the rows for the columns */ - for (k = 0; k < iRowspan; k++) { - aApplied[i + k][j + iColspan] = 1; - } - iColspan++; - } - - /* Do the actual expansion in the DOM */ - $(aoLocal[i][j].cell) - .attr('rowspan', iRowspan) - .attr('colspan', iColspan); - } - } - } - } - - - /** - * Insert the required TR nodes into the table for display - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnDraw(oSettings) { - /* Provide a pre-callback function which can be used to cancel the draw is false is returned */ - var aPreDraw = _fnCallbackFire(oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings]); - if ($.inArray(false, aPreDraw) !== -1) { - _fnProcessingDisplay(oSettings, false); - return; - } - - var i, iLen, n; - var anRows = []; - var iRowCount = 0; - var asStripeClasses = oSettings.asStripeClasses; - var iStripes = asStripeClasses.length; - var iOpenRows = oSettings.aoOpenRows.length; - var oLang = oSettings.oLanguage; - var iInitDisplayStart = oSettings.iInitDisplayStart; - var bServerSide = _fnDataSource(oSettings) == 'ssp'; - var aiDisplay = oSettings.aiDisplay; - - oSettings.bDrawing = true; - - /* Check and see if we have an initial draw position from state saving */ - if (iInitDisplayStart !== undefined && iInitDisplayStart !== -1) { - oSettings._iDisplayStart = bServerSide ? - iInitDisplayStart : - iInitDisplayStart >= oSettings.fnRecordsDisplay() ? - 0 : - iInitDisplayStart; - - oSettings.iInitDisplayStart = -1; - } - - var iDisplayStart = oSettings._iDisplayStart; - var iDisplayEnd = oSettings.fnDisplayEnd(); - - /* Server-side processing draw intercept */ - if (oSettings.bDeferLoading) { - oSettings.bDeferLoading = false; - oSettings.iDraw++; - _fnProcessingDisplay(oSettings, false); - } else if (!bServerSide) { - oSettings.iDraw++; - } else if (!oSettings.bDestroying && !_fnAjaxUpdate(oSettings)) { - return; - } - - if (aiDisplay.length !== 0) { - var iStart = bServerSide ? 0 : iDisplayStart; - var iEnd = bServerSide ? oSettings.aoData.length : iDisplayEnd; - - for (var j = iStart; j < iEnd; j++) { - var iDataIndex = aiDisplay[j]; - var aoData = oSettings.aoData[iDataIndex]; - if (aoData.nTr === null) { - _fnCreateTr(oSettings, iDataIndex); - } - - var nRow = aoData.nTr; - - /* Remove the old striping classes and then add the new one */ - if (iStripes !== 0) { - var sStripe = asStripeClasses[iRowCount % iStripes]; - if (aoData._sRowStripe != sStripe) { - $(nRow).removeClass(aoData._sRowStripe).addClass(sStripe); - aoData._sRowStripe = sStripe; - } - } - - // Row callback functions - might want to manipulate the row - // iRowCount and j are not currently documented. Are they at all - // useful? - _fnCallbackFire(oSettings, 'aoRowCallback', null, - [nRow, aoData._aData, iRowCount, j, iDataIndex]); - - anRows.push(nRow); - iRowCount++; - } - } else { - /* Table is empty - create a row with an empty message in it */ - var sZero = oLang.sZeroRecords; - if (oSettings.iDraw == 1 && _fnDataSource(oSettings) == 'ajax') { - sZero = oLang.sLoadingRecords; - } else if (oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0) { - sZero = oLang.sEmptyTable; - } - - anRows[0] = $('', {'class': iStripes ? asStripeClasses[0] : ''}) - .append($('').appendTo(tmpTable.find('tbody')); - - // Clone the table header and footer - we can't use the header / footer - // from the cloned table, since if scrolling is active, the table's - // real header and footer are contained in different table tags - tmpTable.find('thead, tfoot').remove(); - tmpTable - .append($(oSettings.nTHead).clone()) - .append($(oSettings.nTFoot).clone()); - - // Remove any assigned widths from the footer (from scrolling) - tmpTable.find('tfoot th, tfoot td').css('width', ''); - - // Apply custom sizing to the cloned header - headerCells = _fnGetUniqueThs(oSettings, tmpTable.find('thead')[0]); - - for (i = 0; i < visibleColumns.length; i++) { - column = columns[visibleColumns[i]]; - - headerCells[i].style.width = column.sWidthOrig !== null && column.sWidthOrig !== '' ? - _fnStringToCss(column.sWidthOrig) : - ''; - - // For scrollX we need to force the column width otherwise the - // browser will collapse it. If this width is smaller than the - // width the column requires, then it will have no effect - if (column.sWidthOrig && scrollX) { - $(headerCells[i]).append($('
').css({ - width: column.sWidthOrig, - margin: 0, - padding: 0, - border: 0, - height: 1 - })); - } - } - - // Find the widest cell for each column and put it into the table - if (oSettings.aoData.length) { - for (i = 0; i < visibleColumns.length; i++) { - columnIdx = visibleColumns[i]; - column = columns[columnIdx]; - - $(_fnGetWidestNode(oSettings, columnIdx)) - .clone(false) - .append(column.sContentPadding) - .appendTo(tr); - } - } - - // Tidy the temporary table - remove name attributes so there aren't - // duplicated in the dom (radio elements for example) - $('[name]', tmpTable).removeAttr('name'); - - // Table has been built, attach to the document so we can work with it. - // A holding element is used, positioned at the top of the container - // with minimal height, so it has no effect on if the container scrolls - // or not. Otherwise it might trigger scrolling when it actually isn't - // needed - var holder = $('
').css(scrollX || scrollY ? - { - position: 'absolute', - top: 0, - left: 0, - height: 1, - right: 0, - overflow: 'hidden' - } : - {} - ) - .append(tmpTable) - .appendTo(tableContainer); - - // When scrolling (X or Y) we want to set the width of the table as - // appropriate. However, when not scrolling leave the table width as it - // is. This results in slightly different, but I think correct behaviour - if (scrollX && scrollXInner) { - tmpTable.width(scrollXInner); - } else if (scrollX) { - tmpTable.css('width', 'auto'); - tmpTable.removeAttr('width'); - - // If there is no width attribute or style, then allow the table to - // collapse - if (tmpTable.width() < tableContainer.clientWidth && tableWidthAttr) { - tmpTable.width(tableContainer.clientWidth); - } - } else if (scrollY) { - tmpTable.width(tableContainer.clientWidth); - } else if (tableWidthAttr) { - tmpTable.width(tableWidthAttr); - } - - // Get the width of each column in the constructed table - we need to - // know the inner width (so it can be assigned to the other table's - // cells) and the outer width so we can calculate the full width of the - // table. This is safe since DataTables requires a unique cell for each - // column, but if ever a header can span multiple columns, this will - // need to be modified. - var total = 0; - for (i = 0; i < visibleColumns.length; i++) { - var cell = $(headerCells[i]); - var border = cell.outerWidth() - cell.width(); - - // Use getBounding... where possible (not IE8-) because it can give - // sub-pixel accuracy, which we then want to round up! - var bounding = browser.bBounding ? - Math.ceil(headerCells[i].getBoundingClientRect().width) : - cell.outerWidth(); - - // Total is tracked to remove any sub-pixel errors as the outerWidth - // of the table might not equal the total given here (IE!). - total += bounding; - - // Width for each column to use - columns[visibleColumns[i]].sWidth = _fnStringToCss(bounding - border); - } - - table.style.width = _fnStringToCss(total); - - // Finished with the table - ditch it - holder.remove(); - } - - // If there is a width attr, we want to attach an event listener which - // allows the table sizing to automatically adjust when the window is - // resized. Use the width attr rather than CSS, since we can't know if the - // CSS is a relative value or absolute - DOM read is always px. - if (tableWidthAttr) { - table.style.width = _fnStringToCss(tableWidthAttr); - } - - if ((tableWidthAttr || scrollX) && !oSettings._reszEvt) { - var bindResize = function () { - $(window).on('resize.DT-' + oSettings.sInstance, _fnThrottle(function () { - _fnAdjustColumnSizing(oSettings); - })); - }; - - // IE6/7 will crash if we bind a resize event handler on page load. - // To be removed in 1.11 which drops IE6/7 support - if (ie67) { - setTimeout(bindResize, 1000); - } else { - bindResize(); - } - - oSettings._reszEvt = true; - } - } - - - /** - * Throttle the calls to a function. Arguments and context are maintained for - * the throttled function - * @param {function} fn Function to be called - * @param {int} [freq=200] call frequency in mS - * @returns {function} wrapped function - * @memberof DataTable#oApi - */ - var _fnThrottle = DataTable.util.throttle; - - - /** - * Convert a CSS unit width to pixels (e.g. 2em) - * @param {string} width width to be converted - * @param {node} parent parent to get the with for (required for relative widths) - optional - * @returns {int} width in pixels - * @memberof DataTable#oApi - */ - function _fnConvertToWidth(width, parent) { - if (!width) { - return 0; - } - - var n = $('
') - .css('width', _fnStringToCss(width)) - .appendTo(parent || document.body); - - var val = n[0].offsetWidth; - n.remove(); - - return val; - } - - - /** - * Get the widest node - * @param {object} settings dataTables settings object - * @param {int} colIdx column of interest - * @returns {node} widest table node - * @memberof DataTable#oApi - */ - function _fnGetWidestNode(settings, colIdx) { - var idx = _fnGetMaxLenString(settings, colIdx); - if (idx < 0) { - return null; - } - - var data = settings.aoData[idx]; - return !data.nTr ? // Might not have been created when deferred rendering - $('
').addClass(k); - $('td', created) - .addClass(k) - .html(r) - [0].colSpan = _fnVisbleColumns(ctx); - - rows.push(created[0]); - } - }; - - addRow(data, klass); - - if (row._details) { - row._details.detach(); - } - - row._details = $(rows); - - // If the children were already shown, that state should be retained - if (row._detailsShow) { - row._details.insertAfter(row.nTr); - } - }; - - - var __details_remove = function (api, idx) { - var ctx = api.context; - - if (ctx.length) { - var row = ctx[0].aoData[idx !== undefined ? idx : api[0]]; - - if (row && row._details) { - row._details.remove(); - - row._detailsShow = undefined; - row._details = undefined; - } - } - }; - - - var __details_display = function (api, show) { - var ctx = api.context; - - if (ctx.length && api.length) { - var row = ctx[0].aoData[api[0]]; - - if (row._details) { - row._detailsShow = show; - - if (show) { - row._details.insertAfter(row.nTr); - } else { - row._details.detach(); - } - - __details_events(ctx[0]); - } - } - }; - - - var __details_events = function (settings) { - var api = new _Api(settings); - var namespace = '.dt.DT_details'; - var drawEvent = 'draw' + namespace; - var colvisEvent = 'column-visibility' + namespace; - var destroyEvent = 'destroy' + namespace; - var data = settings.aoData; - - api.off(drawEvent + ' ' + colvisEvent + ' ' + destroyEvent); - - if (_pluck(data, '_details').length > 0) { - // On each draw, insert the required elements into the document - api.on(drawEvent, function (e, ctx) { - if (settings !== ctx) { - return; - } - - api.rows({page: 'current'}).eq(0).each(function (idx) { - // Internal data grab - var row = data[idx]; - - if (row._detailsShow) { - row._details.insertAfter(row.nTr); - } - }); - }); - - // Column visibility change - update the colspan - api.on(colvisEvent, function (e, ctx, idx, vis) { - if (settings !== ctx) { - return; - } - - // Update the colspan for the details rows (note, only if it already has - // a colspan) - var row, visible = _fnVisbleColumns(ctx); - - for (var i = 0, ien = data.length; i < ien; i++) { - row = data[i]; - - if (row._details) { - row._details.children('td[colspan]').attr('colspan', visible); - } - } - }); - - // Table destroyed - nuke any child rows - api.on(destroyEvent, function (e, ctx) { - if (settings !== ctx) { - return; - } - - for (var i = 0, ien = data.length; i < ien; i++) { - if (data[i]._details) { - __details_remove(api, i); - } - } - }); - } - }; - - // Strings for the method names to help minification - var _emp = ''; - var _child_obj = _emp + 'row().child'; - var _child_mth = _child_obj + '()'; - - // data can be: - // tr - // string - // jQuery or array of any of the above - _api_register(_child_mth, function (data, klass) { - var ctx = this.context; - - if (data === undefined) { - // get - return ctx.length && this.length ? - ctx[0].aoData[this[0]]._details : - undefined; - } else if (data === true) { - // show - this.child.show(); - } else if (data === false) { - // remove - __details_remove(this); - } else if (ctx.length && this.length) { - // set - __details_add(ctx[0], ctx[0].aoData[this[0]], data, klass); - } - - return this; - }); - - - _api_register([ - _child_obj + '.show()', - _child_mth + '.show()' // only when `child()` was called with parameters (without - ], function (show) { // it returns an object and this method is not executed) - __details_display(this, true); - return this; - }); - - - _api_register([ - _child_obj + '.hide()', - _child_mth + '.hide()' // only when `child()` was called with parameters (without - ], function () { // it returns an object and this method is not executed) - __details_display(this, false); - return this; - }); - - - _api_register([ - _child_obj + '.remove()', - _child_mth + '.remove()' // only when `child()` was called with parameters (without - ], function () { // it returns an object and this method is not executed) - __details_remove(this); - return this; - }); - - - _api_register(_child_obj + '.isShown()', function () { - var ctx = this.context; - - if (ctx.length && this.length) { - // _detailsShown as false or undefined will fall through to return false - return ctx[0].aoData[this[0]]._detailsShow || false; - } - return false; - }); - - - /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Columns - * - * {integer} - column index (>=0 count from left, <0 count from right) - * "{integer}:visIdx" - visible column index (i.e. translate to column index) (>=0 count from left, <0 count from right) - * "{integer}:visible" - alias for {integer}:visIdx (>=0 count from left, <0 count from right) - * "{string}:name" - column name - * "{string}" - jQuery selector on column header nodes - * - */ - - // can be an array of these items, comma separated list, or an array of comma - // separated lists - - var __re_column_selector = /^([^:]+):(name|visIdx|visible)$/; - - - // r1 and r2 are redundant - but it means that the parameters match for the - // iterator callback in columns().data() - var __columnData = function (settings, column, r1, r2, rows) { - var a = []; - for (var row = 0, ien = rows.length; row < ien; row++) { - a.push(_fnGetCellData(settings, rows[row], column)); - } - return a; - }; - - - var __column_selector = function (settings, selector, opts) { - var - columns = settings.aoColumns, - names = _pluck(columns, 'sName'), - nodes = _pluck(columns, 'nTh'); - - var run = function (s) { - var selInt = _intVal(s); - - // Selector - all - if (s === '') { - return _range(columns.length); - } - - // Selector - index - if (selInt !== null) { - return [selInt >= 0 ? - selInt : // Count from left - columns.length + selInt // Count from right (+ because its a negative value) - ]; - } - - // Selector = function - if (typeof s === 'function') { - var rows = _selector_row_indexes(settings, opts); - - return $.map(columns, function (col, idx) { - return s( - idx, - __columnData(settings, idx, 0, 0, rows), - nodes[idx] - ) ? idx : null; - }); - } - - // jQuery or string selector - var match = typeof s === 'string' ? - s.match(__re_column_selector) : - ''; - - if (match) { - switch (match[2]) { - case 'visIdx': - case 'visible': - var idx = parseInt(match[1], 10); - // Visible index given, convert to column index - if (idx < 0) { - // Counting from the right - var visColumns = $.map(columns, function (col, i) { - return col.bVisible ? i : null; - }); - return [visColumns[visColumns.length + idx]]; - } - // Counting from the left - return [_fnVisibleToColumnIndex(settings, idx)]; - - case 'name': - // match by name. `names` is column index complete and in order - return $.map(names, function (name, i) { - return name === match[1] ? i : null; - }); - - default: - return []; - } - } - - // Cell in the table body - if (s.nodeName && s._DT_CellIndex) { - return [s._DT_CellIndex.column]; - } - - // jQuery selector on the TH elements for the columns - var jqResult = $(nodes) - .filter(s) - .map(function () { - return $.inArray(this, nodes); // `nodes` is column index complete and in order - }) - .toArray(); - - if (jqResult.length || !s.nodeName) { - return jqResult; - } - - // Otherwise a node which might have a `dt-column` data attribute, or be - // a child or such an element - var host = $(s).closest('*[data-dt-column]'); - return host.length ? - [host.data('dt-column')] : - []; - }; - - return _selector_run('column', selector, run, settings, opts); - }; - - - var __setColumnVis = function (settings, column, vis) { - var - cols = settings.aoColumns, - col = cols[column], - data = settings.aoData, - row, cells, i, ien, tr; - - // Get - if (vis === undefined) { - return col.bVisible; - } - - // Set - // No change - if (col.bVisible === vis) { - return; - } - - if (vis) { - // Insert column - // Need to decide if we should use appendChild or insertBefore - var insertBefore = $.inArray(true, _pluck(cols, 'bVisible'), column + 1); - - for (i = 0, ien = data.length; i < ien; i++) { - tr = data[i].nTr; - cells = data[i].anCells; - - if (tr) { - // insertBefore can act like appendChild if 2nd arg is null - tr.insertBefore(cells[column], cells[insertBefore] || null); - } - } - } else { - // Remove column - $(_pluck(settings.aoData, 'anCells', column)).detach(); - } - - // Common actions - col.bVisible = vis; - }; - - - _api_register('columns()', function (selector, opts) { - // argument shifting - if (selector === undefined) { - selector = ''; - } else if ($.isPlainObject(selector)) { - opts = selector; - selector = ''; - } - - opts = _selector_opts(opts); - - var inst = this.iterator('table', function (settings) { - return __column_selector(settings, selector, opts); - }, 1); - - // Want argument shifting here and in _row_selector? - inst.selector.cols = selector; - inst.selector.opts = opts; - - return inst; - }); - - _api_registerPlural('columns().header()', 'column().header()', function (selector, opts) { - return this.iterator('column', function (settings, column) { - return settings.aoColumns[column].nTh; - }, 1); - }); - - _api_registerPlural('columns().footer()', 'column().footer()', function (selector, opts) { - return this.iterator('column', function (settings, column) { - return settings.aoColumns[column].nTf; - }, 1); - }); - - _api_registerPlural('columns().data()', 'column().data()', function () { - return this.iterator('column-rows', __columnData, 1); - }); - - _api_registerPlural('columns().dataSrc()', 'column().dataSrc()', function () { - return this.iterator('column', function (settings, column) { - return settings.aoColumns[column].mData; - }, 1); - }); - - _api_registerPlural('columns().cache()', 'column().cache()', function (type) { - return this.iterator('column-rows', function (settings, column, i, j, rows) { - return _pluck_order(settings.aoData, rows, - type === 'search' ? '_aFilterData' : '_aSortData', column - ); - }, 1); - }); - - _api_registerPlural('columns().nodes()', 'column().nodes()', function () { - return this.iterator('column-rows', function (settings, column, i, j, rows) { - return _pluck_order(settings.aoData, rows, 'anCells', column); - }, 1); - }); - - _api_registerPlural('columns().visible()', 'column().visible()', function (vis, calc) { - var that = this; - var ret = this.iterator('column', function (settings, column) { - if (vis === undefined) { - return settings.aoColumns[column].bVisible; - } // else - __setColumnVis(settings, column, vis); - }); - - // Group the column visibility changes - if (vis !== undefined) { - this.iterator('table', function (settings) { - // Redraw the header after changes - _fnDrawHead(settings, settings.aoHeader); - _fnDrawHead(settings, settings.aoFooter); - - // Update colspan for no records display. Child rows and extensions will use their own - // listeners to do this - only need to update the empty table item here - if (!settings.aiDisplay.length) { - $(settings.nTBody).find('td[colspan]').attr('colspan', _fnVisbleColumns(settings)); - } - - _fnSaveState(settings); - - // Second loop once the first is done for events - that.iterator('column', function (settings, column) { - _fnCallbackFire(settings, null, 'column-visibility', [settings, column, vis, calc]); - }); - - if (calc === undefined || calc) { - that.columns.adjust(); - } - }); - } - - return ret; - }); - - _api_registerPlural('columns().indexes()', 'column().index()', function (type) { - return this.iterator('column', function (settings, column) { - return type === 'visible' ? - _fnColumnIndexToVisible(settings, column) : - column; - }, 1); - }); - - _api_register('columns.adjust()', function () { - return this.iterator('table', function (settings) { - _fnAdjustColumnSizing(settings); - }, 1); - }); - - _api_register('column.index()', function (type, idx) { - if (this.context.length !== 0) { - var ctx = this.context[0]; - - if (type === 'fromVisible' || type === 'toData') { - return _fnVisibleToColumnIndex(ctx, idx); - } else if (type === 'fromData' || type === 'toVisible') { - return _fnColumnIndexToVisible(ctx, idx); - } - } - }); - - _api_register('column()', function (selector, opts) { - return _selector_first(this.columns(selector, opts)); - }); - - var __cell_selector = function (settings, selector, opts) { - var data = settings.aoData; - var rows = _selector_row_indexes(settings, opts); - var cells = _removeEmpty(_pluck_order(data, rows, 'anCells')); - var allCells = $(_flatten([], cells)); - var row; - var columns = settings.aoColumns.length; - var a, i, ien, j, o, host; - - var run = function (s) { - var fnSelector = typeof s === 'function'; - - if (s === null || s === undefined || fnSelector) { - // All cells and function selectors - a = []; - - for (i = 0, ien = rows.length; i < ien; i++) { - row = rows[i]; - - for (j = 0; j < columns; j++) { - o = { - row: row, - column: j - }; - - if (fnSelector) { - // Selector - function - host = data[row]; - - if (s(o, _fnGetCellData(settings, row, j), host.anCells ? host.anCells[j] : null)) { - a.push(o); - } - } else { - // Selector - all - a.push(o); - } - } - } - - return a; - } - - // Selector - index - if ($.isPlainObject(s)) { - // Valid cell index and its in the array of selectable rows - return s.column !== undefined && s.row !== undefined && $.inArray(s.row, rows) !== -1 ? - [s] : - []; - } - - // Selector - jQuery filtered cells - var jqResult = allCells - .filter(s) - .map(function (i, el) { - return { // use a new object, in case someone changes the values - row: el._DT_CellIndex.row, - column: el._DT_CellIndex.column - }; - }) - .toArray(); - - if (jqResult.length || !s.nodeName) { - return jqResult; - } - - // Otherwise the selector is a node, and there is one last option - the - // element might be a child of an element which has dt-row and dt-column - // data attributes - host = $(s).closest('*[data-dt-row]'); - return host.length ? - [{ - row: host.data('dt-row'), - column: host.data('dt-column') - }] : - []; - }; - - return _selector_run('cell', selector, run, settings, opts); - }; - - - _api_register('cells()', function (rowSelector, columnSelector, opts) { - // Argument shifting - if ($.isPlainObject(rowSelector)) { - // Indexes - if (rowSelector.row === undefined) { - // Selector options in first parameter - opts = rowSelector; - rowSelector = null; - } else { - // Cell index objects in first parameter - opts = columnSelector; - columnSelector = null; - } - } - if ($.isPlainObject(columnSelector)) { - opts = columnSelector; - columnSelector = null; - } - - // Cell selector - if (columnSelector === null || columnSelector === undefined) { - return this.iterator('table', function (settings) { - return __cell_selector(settings, rowSelector, _selector_opts(opts)); - }); - } - - // The default built in options need to apply to row and columns - var internalOpts = opts ? { - page: opts.page, - order: opts.order, - search: opts.search - } : {}; - - // Row + column selector - var columns = this.columns(columnSelector, internalOpts); - var rows = this.rows(rowSelector, internalOpts); - var i, ien, j, jen; - - var cellsNoOpts = this.iterator('table', function (settings, idx) { - var a = []; - - for (i = 0, ien = rows[idx].length; i < ien; i++) { - for (j = 0, jen = columns[idx].length; j < jen; j++) { - a.push({ - row: rows[idx][i], - column: columns[idx][j] - }); - } - } - - return a; - }, 1); - - // There is currently only one extension which uses a cell selector extension - // It is a _major_ performance drag to run this if it isn't needed, so this is - // an extension specific check at the moment - var cells = opts && opts.selected ? - this.cells(cellsNoOpts, opts) : - cellsNoOpts; - - $.extend(cells.selector, { - cols: columnSelector, - rows: rowSelector, - opts: opts - }); - - return cells; - }); - - - _api_registerPlural('cells().nodes()', 'cell().node()', function () { - return this.iterator('cell', function (settings, row, column) { - var data = settings.aoData[row]; - - return data && data.anCells ? - data.anCells[column] : - undefined; - }, 1); - }); - - - _api_register('cells().data()', function () { - return this.iterator('cell', function (settings, row, column) { - return _fnGetCellData(settings, row, column); - }, 1); - }); - - - _api_registerPlural('cells().cache()', 'cell().cache()', function (type) { - type = type === 'search' ? '_aFilterData' : '_aSortData'; - - return this.iterator('cell', function (settings, row, column) { - return settings.aoData[row][type][column]; - }, 1); - }); - - - _api_registerPlural('cells().render()', 'cell().render()', function (type) { - return this.iterator('cell', function (settings, row, column) { - return _fnGetCellData(settings, row, column, type); - }, 1); - }); - - - _api_registerPlural('cells().indexes()', 'cell().index()', function () { - return this.iterator('cell', function (settings, row, column) { - return { - row: row, - column: column, - columnVisible: _fnColumnIndexToVisible(settings, column) - }; - }, 1); - }); - - - _api_registerPlural('cells().invalidate()', 'cell().invalidate()', function (src) { - return this.iterator('cell', function (settings, row, column) { - _fnInvalidate(settings, row, src, column); - }); - }); - - - _api_register('cell()', function (rowSelector, columnSelector, opts) { - return _selector_first(this.cells(rowSelector, columnSelector, opts)); - }); - - - _api_register('cell().data()', function (data) { - var ctx = this.context; - var cell = this[0]; - - if (data === undefined) { - // Get - return ctx.length && cell.length ? - _fnGetCellData(ctx[0], cell[0].row, cell[0].column) : - undefined; - } - - // Set - _fnSetCellData(ctx[0], cell[0].row, cell[0].column, data); - _fnInvalidate(ctx[0], cell[0].row, 'data', cell[0].column); - - return this; - }); - - - /** - * Get current ordering (sorting) that has been applied to the table. - * - * @returns {array} 2D array containing the sorting information for the first - * table in the current context. Each element in the parent array represents - * a column being sorted upon (i.e. multi-sorting with two columns would have - * 2 inner arrays). The inner arrays may have 2 or 3 elements. The first is - * the column index that the sorting condition applies to, the second is the - * direction of the sort (`desc` or `asc`) and, optionally, the third is the - * index of the sorting order from the `column.sorting` initialisation array. - *//** - * Set the ordering for the table. - * - * @param {integer} order Column index to sort upon. - * @param {string} direction Direction of the sort to be applied (`asc` or `desc`) - * @returns {DataTables.Api} this - *//** - * Set the ordering for the table. - * - * @param {array} order 1D array of sorting information to be applied. - * @param {array} [...] Optional additional sorting conditions - * @returns {DataTables.Api} this - */ - /** - * Set the ordering for the table. - * - * @param {array} order 2D array of sorting information to be applied. - * @returns {DataTables.Api} this - */ - _api_register('order()', function (order, dir) { - var ctx = this.context; - - if (order === undefined) { - // get - return ctx.length !== 0 ? - ctx[0].aaSorting : - undefined; - } - - // set - if (typeof order === 'number') { - // Simple column / direction passed in - order = [[order, dir]]; - } else if (order.length && !Array.isArray(order[0])) { - // Arguments passed in (list of 1D arrays) - order = Array.prototype.slice.call(arguments); - } - // otherwise a 2D array was passed in - - return this.iterator('table', function (settings) { - settings.aaSorting = order.slice(); - }); - }); - - - /** - * Attach a sort listener to an element for a given column - * - * @param {node|jQuery|string} node Identifier for the element(s) to attach the - * listener to. This can take the form of a single DOM node, a jQuery - * collection of nodes or a jQuery selector which will identify the node(s). - * @param {integer} column the column that a click on this node will sort on - * @param {function} [callback] callback function when sort is run - * @returns {DataTables.Api} this - */ - _api_register('order.listener()', function (node, column, callback) { - return this.iterator('table', function (settings) { - _fnSortAttachListener(settings, node, column, callback); - }); - }); - - - _api_register('order.fixed()', function (set) { - if (!set) { - var ctx = this.context; - var fixed = ctx.length ? - ctx[0].aaSortingFixed : - undefined; - - return Array.isArray(fixed) ? - {pre: fixed} : - fixed; - } - - return this.iterator('table', function (settings) { - settings.aaSortingFixed = $.extend(true, {}, set); - }); - }); - - - // Order by the selected column(s) - _api_register([ - 'columns().order()', - 'column().order()' - ], function (dir) { - var that = this; - - return this.iterator('table', function (settings, i) { - var sort = []; - - $.each(that[i], function (j, col) { - sort.push([col, dir]); - }); - - settings.aaSorting = sort; - }); - }); - - - _api_register('search()', function (input, regex, smart, caseInsen) { - var ctx = this.context; - - if (input === undefined) { - // get - return ctx.length !== 0 ? - ctx[0].oPreviousSearch.sSearch : - undefined; - } - - // set - return this.iterator('table', function (settings) { - if (!settings.oFeatures.bFilter) { - return; - } - - _fnFilterComplete(settings, $.extend({}, settings.oPreviousSearch, { - "sSearch": input + "", - "bRegex": regex === null ? false : regex, - "bSmart": smart === null ? true : smart, - "bCaseInsensitive": caseInsen === null ? true : caseInsen - }), 1); - }); - }); - - - _api_registerPlural( - 'columns().search()', - 'column().search()', - function (input, regex, smart, caseInsen) { - return this.iterator('column', function (settings, column) { - var preSearch = settings.aoPreSearchCols; - - if (input === undefined) { - // get - return preSearch[column].sSearch; - } - - // set - if (!settings.oFeatures.bFilter) { - return; - } - - $.extend(preSearch[column], { - "sSearch": input + "", - "bRegex": regex === null ? false : regex, - "bSmart": smart === null ? true : smart, - "bCaseInsensitive": caseInsen === null ? true : caseInsen - }); - - _fnFilterComplete(settings, settings.oPreviousSearch, 1); - }); - } - ); - - /* - * State API methods - */ - - _api_register('state()', function () { - return this.context.length ? - this.context[0].oSavedState : - null; - }); - - - _api_register('state.clear()', function () { - return this.iterator('table', function (settings) { - // Save an empty object - settings.fnStateSaveCallback.call(settings.oInstance, settings, {}); - }); - }); - - - _api_register('state.loaded()', function () { - return this.context.length ? - this.context[0].oLoadedState : - null; - }); - - - _api_register('state.save()', function () { - return this.iterator('table', function (settings) { - _fnSaveState(settings); - }); - }); - - - /** - * Provide a common method for plug-ins to check the version of DataTables being - * used, in order to ensure compatibility. - * - * @param {string} version Version string to check for, in the format "X.Y.Z". - * Note that the formats "X" and "X.Y" are also acceptable. - * @returns {boolean} true if this version of DataTables is greater or equal to - * the required version, or false if this version of DataTales is not - * suitable - * @static - * @dtopt API-Static - * - * @example - * alert( $.fn.dataTable.versionCheck( '1.9.0' ) ); - */ - DataTable.versionCheck = DataTable.fnVersionCheck = function (version) { - var aThis = DataTable.version.split('.'); - var aThat = version.split('.'); - var iThis, iThat; - - for (var i = 0, iLen = aThat.length; i < iLen; i++) { - iThis = parseInt(aThis[i], 10) || 0; - iThat = parseInt(aThat[i], 10) || 0; - - // Parts are the same, keep comparing - if (iThis === iThat) { - continue; - } - - // Parts are different, return immediately - return iThis > iThat; - } - - return true; - }; - - - /** - * Check if a `
Loading..
', { - 'valign': 'top', - 'colSpan': _fnVisbleColumns(oSettings), - 'class': oSettings.oClasses.sRowEmpty - }).html(sZero))[0]; - } - - /* Header and footer callbacks */ - _fnCallbackFire(oSettings, 'aoHeaderCallback', 'header', [$(oSettings.nTHead).children('tr')[0], - _fnGetDataMaster(oSettings), iDisplayStart, iDisplayEnd, aiDisplay]); - - _fnCallbackFire(oSettings, 'aoFooterCallback', 'footer', [$(oSettings.nTFoot).children('tr')[0], - _fnGetDataMaster(oSettings), iDisplayStart, iDisplayEnd, aiDisplay]); - - var body = $(oSettings.nTBody); - - body.children().detach(); - body.append($(anRows)); - - /* Call all required callback functions for the end of a draw */ - _fnCallbackFire(oSettings, 'aoDrawCallback', 'draw', [oSettings]); - - /* Draw is complete, sorting and filtering must be as well */ - oSettings.bSorted = false; - oSettings.bFiltered = false; - oSettings.bDrawing = false; - } - - - /** - * Redraw the table - taking account of the various features which are enabled - * @param {object} oSettings dataTables settings object - * @param {boolean} [holdPosition] Keep the current paging position. By default - * the paging is reset to the first page - * @memberof DataTable#oApi - */ - function _fnReDraw(settings, holdPosition) { - var - features = settings.oFeatures, - sort = features.bSort, - filter = features.bFilter; - - if (sort) { - _fnSort(settings); - } - - if (filter) { - _fnFilterComplete(settings, settings.oPreviousSearch); - } else { - // No filtering, so we want to just use the display master - settings.aiDisplay = settings.aiDisplayMaster.slice(); - } - - if (holdPosition !== true) { - settings._iDisplayStart = 0; - } - - // Let any modules know about the draw hold position state (used by - // scrolling internally) - settings._drawHold = holdPosition; - - _fnDraw(settings); - - settings._drawHold = false; - } - - - /** - * Add the options to the page HTML for the table - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnAddOptionsHtml(oSettings) { - var classes = oSettings.oClasses; - var table = $(oSettings.nTable); - var holding = $('
').insertBefore(table); // Holding element for speed - var features = oSettings.oFeatures; - - // All DataTables are wrapped in a div - var insert = $('
', { - id: oSettings.sTableId + '_wrapper', - 'class': classes.sWrapper + (oSettings.nTFoot ? '' : ' ' + classes.sNoFooter) - }); - - oSettings.nHolding = holding[0]; - oSettings.nTableWrapper = insert[0]; - oSettings.nTableReinsertBefore = oSettings.nTable.nextSibling; - - /* Loop over the user set positioning and place the elements as needed */ - var aDom = oSettings.sDom.split(''); - var featureNode, cOption, nNewNode, cNext, sAttr, j; - for (var i = 0; i < aDom.length; i++) { - featureNode = null; - cOption = aDom[i]; - - if (cOption == '<') { - /* New container div */ - nNewNode = $('
')[0]; - - /* Check to see if we should append an id and/or a class name to the container */ - cNext = aDom[i + 1]; - if (cNext == "'" || cNext == '"') { - sAttr = ""; - j = 2; - while (aDom[i + j] != cNext) { - sAttr += aDom[i + j]; - j++; - } - - /* Replace jQuery UI constants @todo depreciated */ - if (sAttr == "H") { - sAttr = classes.sJUIHeader; - } else if (sAttr == "F") { - sAttr = classes.sJUIFooter; - } - - /* The attribute can be in the format of "#id.class", "#id" or "class" This logic - * breaks the string into parts and applies them as needed - */ - if (sAttr.indexOf('.') != -1) { - var aSplit = sAttr.split('.'); - nNewNode.id = aSplit[0].substr(1, aSplit[0].length - 1); - nNewNode.className = aSplit[1]; - } else if (sAttr.charAt(0) == "#") { - nNewNode.id = sAttr.substr(1, sAttr.length - 1); - } else { - nNewNode.className = sAttr; - } - - i += j; /* Move along the position array */ - } - - insert.append(nNewNode); - insert = $(nNewNode); - } else if (cOption == '>') { - /* End container div */ - insert = insert.parent(); - } - // @todo Move options into their own plugins? - else if (cOption == 'l' && features.bPaginate && features.bLengthChange) { - /* Length */ - featureNode = _fnFeatureHtmlLength(oSettings); - } else if (cOption == 'f' && features.bFilter) { - /* Filter */ - featureNode = _fnFeatureHtmlFilter(oSettings); - } else if (cOption == 'r' && features.bProcessing) { - /* pRocessing */ - featureNode = _fnFeatureHtmlProcessing(oSettings); - } else if (cOption == 't') { - /* Table */ - featureNode = _fnFeatureHtmlTable(oSettings); - } else if (cOption == 'i' && features.bInfo) { - /* Info */ - featureNode = _fnFeatureHtmlInfo(oSettings); - } else if (cOption == 'p' && features.bPaginate) { - /* Pagination */ - featureNode = _fnFeatureHtmlPaginate(oSettings); - } else if (DataTable.ext.feature.length !== 0) { - /* Plug-in features */ - var aoFeatures = DataTable.ext.feature; - for (var k = 0, kLen = aoFeatures.length; k < kLen; k++) { - if (cOption == aoFeatures[k].cFeature) { - featureNode = aoFeatures[k].fnInit(oSettings); - break; - } - } - } - - /* Add to the 2D features array */ - if (featureNode) { - var aanFeatures = oSettings.aanFeatures; - - if (!aanFeatures[cOption]) { - aanFeatures[cOption] = []; - } - - aanFeatures[cOption].push(featureNode); - insert.append(featureNode); - } - } - - /* Built our DOM structure - replace the holding div with what we want */ - holding.replaceWith(insert); - oSettings.nHolding = null; - } - - - /** - * Use the DOM source to create up an array of header cells. The idea here is to - * create a layout grid (array) of rows x columns, which contains a reference - * to the cell that that point in the grid (regardless of col/rowspan), such that - * any column / row could be removed and the new grid constructed - * @param array {object} aLayout Array to store the calculated layout in - * @param {node} nThead The header/footer element for the table - * @memberof DataTable#oApi - */ - function _fnDetectHeader(aLayout, nThead) { - var nTrs = $(nThead).children('tr'); - var nTr, nCell; - var i, k, l, iLen, jLen, iColShifted, iColumn, iColspan, iRowspan; - var bUnique; - var fnShiftCol = function (a, i, j) { - var k = a[i]; - while (k[j]) { - j++; - } - return j; - }; - - aLayout.splice(0, aLayout.length); - - /* We know how many rows there are in the layout - so prep it */ - for (i = 0, iLen = nTrs.length; i < iLen; i++) { - aLayout.push([]); - } - - /* Calculate a layout array */ - for (i = 0, iLen = nTrs.length; i < iLen; i++) { - nTr = nTrs[i]; - iColumn = 0; - - /* For every cell in the row... */ - nCell = nTr.firstChild; - while (nCell) { - if (nCell.nodeName.toUpperCase() == "TD" || - nCell.nodeName.toUpperCase() == "TH") { - /* Get the col and rowspan attributes from the DOM and sanitise them */ - iColspan = nCell.getAttribute('colspan') * 1; - iRowspan = nCell.getAttribute('rowspan') * 1; - iColspan = (!iColspan || iColspan === 0 || iColspan === 1) ? 1 : iColspan; - iRowspan = (!iRowspan || iRowspan === 0 || iRowspan === 1) ? 1 : iRowspan; - - /* There might be colspan cells already in this row, so shift our target - * accordingly - */ - iColShifted = fnShiftCol(aLayout, i, iColumn); - - /* Cache calculation for unique columns */ - bUnique = iColspan === 1 ? true : false; - - /* If there is col / rowspan, copy the information into the layout grid */ - for (l = 0; l < iColspan; l++) { - for (k = 0; k < iRowspan; k++) { - aLayout[i + k][iColShifted + l] = { - "cell": nCell, - "unique": bUnique - }; - aLayout[i + k].nTr = nTr; - } - } - } - nCell = nCell.nextSibling; - } - } - } - - - /** - * Get an array of unique th elements, one for each column - * @param {object} oSettings dataTables settings object - * @param {node} nHeader automatically detect the layout from this node - optional - * @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional - * @returns array {node} aReturn list of unique th's - * @memberof DataTable#oApi - */ - function _fnGetUniqueThs(oSettings, nHeader, aLayout) { - var aReturn = []; - if (!aLayout) { - aLayout = oSettings.aoHeader; - if (nHeader) { - aLayout = []; - _fnDetectHeader(aLayout, nHeader); - } - } - - for (var i = 0, iLen = aLayout.length; i < iLen; i++) { - for (var j = 0, jLen = aLayout[i].length; j < jLen; j++) { - if (aLayout[i][j].unique && - (!aReturn[j] || !oSettings.bSortCellsTop)) { - aReturn[j] = aLayout[i][j].cell; - } - } - } - - return aReturn; - } - - /** - * Create an Ajax call based on the table's settings, taking into account that - * parameters can have multiple forms, and backwards compatibility. - * - * @param {object} oSettings dataTables settings object - * @param {array} data Data to send to the server, required by - * DataTables - may be augmented by developer callbacks - * @param {function} fn Callback function to run when data is obtained - */ - function _fnBuildAjax(oSettings, data, fn) { - // Compatibility with 1.9-, allow fnServerData and event to manipulate - _fnCallbackFire(oSettings, 'aoServerParams', 'serverParams', [data]); - - // Convert to object based for 1.10+ if using the old array scheme which can - // come from server-side processing or serverParams - if (data && Array.isArray(data)) { - var tmp = {}; - var rbracket = /(.*?)\[\]$/; - - $.each(data, function (key, val) { - var match = val.name.match(rbracket); - - if (match) { - // Support for arrays - var name = match[0]; - - if (!tmp[name]) { - tmp[name] = []; - } - tmp[name].push(val.value); - } else { - tmp[val.name] = val.value; - } - }); - data = tmp; - } - - var ajaxData; - var ajax = oSettings.ajax; - var instance = oSettings.oInstance; - var callback = function (json) { - _fnCallbackFire(oSettings, null, 'xhr', [oSettings, json, oSettings.jqXHR]); - fn(json); - }; - - if ($.isPlainObject(ajax) && ajax.data) { - ajaxData = ajax.data; - - var newData = typeof ajaxData === 'function' ? - ajaxData(data, oSettings) : // fn can manipulate data or return - ajaxData; // an object object or array to merge - - // If the function returned something, use that alone - data = typeof ajaxData === 'function' && newData ? - newData : - $.extend(true, data, newData); - - // Remove the data property as we've resolved it already and don't want - // jQuery to do it again (it is restored at the end of the function) - delete ajax.data; - } - - var baseAjax = { - "data": data, - "success": function (json) { - var error = json.error || json.sError; - if (error) { - _fnLog(oSettings, 0, error); - } - - oSettings.json = json; - callback(json); - }, - "dataType": "json", - "cache": false, - "type": oSettings.sServerMethod, - "error": function (xhr, error, thrown) { - var ret = _fnCallbackFire(oSettings, null, 'xhr', [oSettings, null, oSettings.jqXHR]); - - if ($.inArray(true, ret) === -1) { - if (error == "parsererror") { - _fnLog(oSettings, 0, 'Invalid JSON response', 1); - } else if (xhr.readyState === 4) { - _fnLog(oSettings, 0, 'Ajax error', 7); - } - } - - _fnProcessingDisplay(oSettings, false); - } - }; - - // Store the data submitted for the API - oSettings.oAjaxData = data; - - // Allow plug-ins and external processes to modify the data - _fnCallbackFire(oSettings, null, 'preXhr', [oSettings, data]); - - if (oSettings.fnServerData) { - // DataTables 1.9- compatibility - oSettings.fnServerData.call(instance, - oSettings.sAjaxSource, - $.map(data, function (val, key) { // Need to convert back to 1.9 trad format - return {name: key, value: val}; - }), - callback, - oSettings - ); - } else if (oSettings.sAjaxSource || typeof ajax === 'string') { - // DataTables 1.9- compatibility - oSettings.jqXHR = $.ajax($.extend(baseAjax, { - url: ajax || oSettings.sAjaxSource - })); - } else if (typeof ajax === 'function') { - // Is a function - let the caller define what needs to be done - oSettings.jqXHR = ajax.call(instance, data, callback, oSettings); - } else { - // Object to extend the base settings - oSettings.jqXHR = $.ajax($.extend(baseAjax, ajax)); - - // Restore for next time around - ajax.data = ajaxData; - } - } - - - /** - * Update the table using an Ajax call - * @param {object} settings dataTables settings object - * @returns {boolean} Block the table drawing or not - * @memberof DataTable#oApi - */ - function _fnAjaxUpdate(settings) { - if (settings.bAjaxDataGet) { - settings.iDraw++; - _fnProcessingDisplay(settings, true); - - _fnBuildAjax( - settings, - _fnAjaxParameters(settings), - function (json) { - _fnAjaxUpdateDraw(settings, json); - } - ); - - return false; - } - return true; - } - - - /** - * Build up the parameters in an object needed for a server-side processing - * request. Note that this is basically done twice, is different ways - a modern - * method which is used by default in DataTables 1.10 which uses objects and - * arrays, or the 1.9- method with is name / value pairs. 1.9 method is used if - * the sAjaxSource option is used in the initialisation, or the legacyAjax - * option is set. - * @param {object} oSettings dataTables settings object - * @returns {bool} block the table drawing or not - * @memberof DataTable#oApi - */ - function _fnAjaxParameters(settings) { - var - columns = settings.aoColumns, - columnCount = columns.length, - features = settings.oFeatures, - preSearch = settings.oPreviousSearch, - preColSearch = settings.aoPreSearchCols, - i, data = [], dataProp, column, columnSearch, - sort = _fnSortFlatten(settings), - displayStart = settings._iDisplayStart, - displayLength = features.bPaginate !== false ? - settings._iDisplayLength : - -1; - - var param = function (name, value) { - data.push({'name': name, 'value': value}); - }; - - // DataTables 1.9- compatible method - param('sEcho', settings.iDraw); - param('iColumns', columnCount); - param('sColumns', _pluck(columns, 'sName').join(',')); - param('iDisplayStart', displayStart); - param('iDisplayLength', displayLength); - - // DataTables 1.10+ method - var d = { - draw: settings.iDraw, - columns: [], - order: [], - start: displayStart, - length: displayLength, - search: { - value: preSearch.sSearch, - regex: preSearch.bRegex - } - }; - - for (i = 0; i < columnCount; i++) { - column = columns[i]; - columnSearch = preColSearch[i]; - dataProp = typeof column.mData == "function" ? 'function' : column.mData; - - d.columns.push({ - data: dataProp, - name: column.sName, - searchable: column.bSearchable, - orderable: column.bSortable, - search: { - value: columnSearch.sSearch, - regex: columnSearch.bRegex - } - }); - - param("mDataProp_" + i, dataProp); - - if (features.bFilter) { - param('sSearch_' + i, columnSearch.sSearch); - param('bRegex_' + i, columnSearch.bRegex); - param('bSearchable_' + i, column.bSearchable); - } - - if (features.bSort) { - param('bSortable_' + i, column.bSortable); - } - } - - if (features.bFilter) { - param('sSearch', preSearch.sSearch); - param('bRegex', preSearch.bRegex); - } - - if (features.bSort) { - $.each(sort, function (i, val) { - d.order.push({column: val.col, dir: val.dir}); - - param('iSortCol_' + i, val.col); - param('sSortDir_' + i, val.dir); - }); - - param('iSortingCols', sort.length); - } - - // If the legacy.ajax parameter is null, then we automatically decide which - // form to use, based on sAjaxSource - var legacy = DataTable.ext.legacy.ajax; - if (legacy === null) { - return settings.sAjaxSource ? data : d; - } - - // Otherwise, if legacy has been specified then we use that to decide on the - // form - return legacy ? data : d; - } - - - /** - * Data the data from the server (nuking the old) and redraw the table - * @param {object} oSettings dataTables settings object - * @param {object} json json data return from the server. - * @param {string} json.sEcho Tracking flag for DataTables to match requests - * @param {int} json.iTotalRecords Number of records in the data set, not accounting for filtering - * @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for filtering - * @param {array} json.aaData The data to display on this page - * @param {string} [json.sColumns] Column ordering (sName, comma separated) - * @memberof DataTable#oApi - */ - function _fnAjaxUpdateDraw(settings, json) { - // v1.10 uses camelCase variables, while 1.9 uses Hungarian notation. - // Support both - var compat = function (old, modern) { - return json[old] !== undefined ? json[old] : json[modern]; - }; - - var data = _fnAjaxDataSrc(settings, json); - var draw = compat('sEcho', 'draw'); - var recordsTotal = compat('iTotalRecords', 'recordsTotal'); - var recordsFiltered = compat('iTotalDisplayRecords', 'recordsFiltered'); - - if (draw !== undefined) { - // Protect against out of sequence returns - if (draw * 1 < settings.iDraw) { - return; - } - settings.iDraw = draw * 1; - } - - _fnClearTable(settings); - settings._iRecordsTotal = parseInt(recordsTotal, 10); - settings._iRecordsDisplay = parseInt(recordsFiltered, 10); - - for (var i = 0, ien = data.length; i < ien; i++) { - _fnAddData(settings, data[i]); - } - settings.aiDisplay = settings.aiDisplayMaster.slice(); - - settings.bAjaxDataGet = false; - _fnDraw(settings); - - if (!settings._bInitComplete) { - _fnInitComplete(settings, json); - } - - settings.bAjaxDataGet = true; - _fnProcessingDisplay(settings, false); - } - - - /** - * Get the data from the JSON data source to use for drawing a table. Using - * `_fnGetObjectDataFn` allows the data to be sourced from a property of the - * source object, or from a processing function. - * @param {object} oSettings dataTables settings object - * @param {object} json Data source object / array from the server - * @return {array} Array of data to use - */ - function _fnAjaxDataSrc(oSettings, json) { - var dataSrc = $.isPlainObject(oSettings.ajax) && oSettings.ajax.dataSrc !== undefined ? - oSettings.ajax.dataSrc : - oSettings.sAjaxDataProp; // Compatibility with 1.9-. - - // Compatibility with 1.9-. In order to read from aaData, check if the - // default has been changed, if not, check for aaData - if (dataSrc === 'data') { - return json.aaData || json[dataSrc]; - } - - return dataSrc !== "" ? - _fnGetObjectDataFn(dataSrc)(json) : - json; - } - - /** - * Generate the node required for filtering text - * @returns {node} Filter control element - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnFeatureHtmlFilter(settings) { - var classes = settings.oClasses; - var tableId = settings.sTableId; - var language = settings.oLanguage; - var previousSearch = settings.oPreviousSearch; - var features = settings.aanFeatures; - var input = ''; - - var str = language.sSearch; - str = str.match(/_INPUT_/) ? - str.replace('_INPUT_', input) : - str + input; - - var filter = $('
', { - 'id': !features.f ? tableId + '_filter' : null, - 'class': classes.sFilter - }) - .append($('
').html(_fnGetCellData(settings, idx, colIdx, 'display'))[0] : - data.anCells[colIdx]; - } - - - /** - * Get the maximum strlen for each data column - * @param {object} settings dataTables settings object - * @param {int} colIdx column of interest - * @returns {string} max string length for each column - * @memberof DataTable#oApi - */ - function _fnGetMaxLenString(settings, colIdx) { - var s, max = -1, maxIdx = -1; - - for (var i = 0, ien = settings.aoData.length; i < ien; i++) { - s = _fnGetCellData(settings, i, colIdx, 'display') + ''; - s = s.replace(__re_html_remove, ''); - s = s.replace(/ /g, ' '); - - if (s.length > max) { - max = s.length; - maxIdx = i; - } - } - - return maxIdx; - } - - - /** - * Append a CSS unit (only if required) to a string - * @param {string} value to css-ify - * @returns {string} value with css unit - * @memberof DataTable#oApi - */ - function _fnStringToCss(s) { - if (s === null) { - return '0px'; - } - - if (typeof s == 'number') { - return s < 0 ? - '0px' : - s + 'px'; - } - - // Check it has a unit character already - return s.match(/\d$/) ? - s + 'px' : - s; - } - - - function _fnSortFlatten(settings) { - var - i, iLen, k, kLen, - aSort = [], - aiOrig = [], - aoColumns = settings.aoColumns, - aDataSort, iCol, sType, srcCol, - fixed = settings.aaSortingFixed, - fixedObj = $.isPlainObject(fixed), - nestedSort = [], - add = function (a) { - if (a.length && !Array.isArray(a[0])) { - // 1D array - nestedSort.push(a); - } else { - // 2D array - $.merge(nestedSort, a); - } - }; - - // Build the sort array, with pre-fix and post-fix options if they have been - // specified - if (Array.isArray(fixed)) { - add(fixed); - } - - if (fixedObj && fixed.pre) { - add(fixed.pre); - } - - add(settings.aaSorting); - - if (fixedObj && fixed.post) { - add(fixed.post); - } - - for (i = 0; i < nestedSort.length; i++) { - srcCol = nestedSort[i][0]; - aDataSort = aoColumns[srcCol].aDataSort; - - for (k = 0, kLen = aDataSort.length; k < kLen; k++) { - iCol = aDataSort[k]; - sType = aoColumns[iCol].sType || 'string'; - - if (nestedSort[i]._idx === undefined) { - nestedSort[i]._idx = $.inArray(nestedSort[i][1], aoColumns[iCol].asSorting); - } - - aSort.push({ - src: srcCol, - col: iCol, - dir: nestedSort[i][1], - index: nestedSort[i]._idx, - type: sType, - formatter: DataTable.ext.type.order[sType + "-pre"] - }); - } - } - - return aSort; - } - - /** - * Change the order of the table - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - * @todo This really needs split up! - */ - function _fnSort(oSettings) { - var - i, ien, iLen, j, jLen, k, kLen, - sDataType, nTh, - aiOrig = [], - oExtSort = DataTable.ext.type.order, - aoData = oSettings.aoData, - aoColumns = oSettings.aoColumns, - aDataSort, data, iCol, sType, oSort, - formatters = 0, - sortCol, - displayMaster = oSettings.aiDisplayMaster, - aSort; - - // Resolve any column types that are unknown due to addition or invalidation - // @todo Can this be moved into a 'data-ready' handler which is called when - // data is going to be used in the table? - _fnColumnTypes(oSettings); - - aSort = _fnSortFlatten(oSettings); - - for (i = 0, ien = aSort.length; i < ien; i++) { - sortCol = aSort[i]; - - // Track if we can use the fast sort algorithm - if (sortCol.formatter) { - formatters++; - } - - // Load the data needed for the sort, for each cell - _fnSortData(oSettings, sortCol.col); - } - - /* No sorting required if server-side or no sorting array */ - if (_fnDataSource(oSettings) != 'ssp' && aSort.length !== 0) { - // Create a value - key array of the current row positions such that we can use their - // current position during the sort, if values match, in order to perform stable sorting - for (i = 0, iLen = displayMaster.length; i < iLen; i++) { - aiOrig[displayMaster[i]] = i; - } - - /* Do the sort - here we want multi-column sorting based on a given data source (column) - * and sorting function (from oSort) in a certain direction. It's reasonably complex to - * follow on it's own, but this is what we want (example two column sorting): - * fnLocalSorting = function(a,b){ - * var iTest; - * iTest = oSort['string-asc']('data11', 'data12'); - * if (iTest !== 0) - * return iTest; - * iTest = oSort['numeric-desc']('data21', 'data22'); - * if (iTest !== 0) - * return iTest; - * return oSort['numeric-asc']( aiOrig[a], aiOrig[b] ); - * } - * Basically we have a test for each sorting column, if the data in that column is equal, - * test the next column. If all columns match, then we use a numeric sort on the row - * positions in the original data array to provide a stable sort. - * - * Note - I know it seems excessive to have two sorting methods, but the first is around - * 15% faster, so the second is only maintained for backwards compatibility with sorting - * methods which do not have a pre-sort formatting function. - */ - if (formatters === aSort.length) { - // All sort types have formatting functions - displayMaster.sort(function (a, b) { - var - x, y, k, test, sort, - len = aSort.length, - dataA = aoData[a]._aSortData, - dataB = aoData[b]._aSortData; - - for (k = 0; k < len; k++) { - sort = aSort[k]; - - x = dataA[sort.col]; - y = dataB[sort.col]; - - test = x < y ? -1 : x > y ? 1 : 0; - if (test !== 0) { - return sort.dir === 'asc' ? test : -test; - } - } - - x = aiOrig[a]; - y = aiOrig[b]; - return x < y ? -1 : x > y ? 1 : 0; - }); - } else { - // Depreciated - remove in 1.11 (providing a plug-in option) - // Not all sort types have formatting methods, so we have to call their sorting - // methods. - displayMaster.sort(function (a, b) { - var - x, y, k, l, test, sort, fn, - len = aSort.length, - dataA = aoData[a]._aSortData, - dataB = aoData[b]._aSortData; - - for (k = 0; k < len; k++) { - sort = aSort[k]; - - x = dataA[sort.col]; - y = dataB[sort.col]; - - fn = oExtSort[sort.type + "-" + sort.dir] || oExtSort["string-" + sort.dir]; - test = fn(x, y); - if (test !== 0) { - return test; - } - } - - x = aiOrig[a]; - y = aiOrig[b]; - return x < y ? -1 : x > y ? 1 : 0; - }); - } - } - - /* Tell the draw function that we have sorted the data */ - oSettings.bSorted = true; - } - - - function _fnSortAria(settings) { - var label; - var nextSort; - var columns = settings.aoColumns; - var aSort = _fnSortFlatten(settings); - var oAria = settings.oLanguage.oAria; - - // ARIA attributes - need to loop all columns, to update all (removing old - // attributes as needed) - for (var i = 0, iLen = columns.length; i < iLen; i++) { - var col = columns[i]; - var asSorting = col.asSorting; - var sTitle = col.sTitle.replace(/<.*?>/g, ""); - var th = col.nTh; - - // IE7 is throwing an error when setting these properties with jQuery's - // attr() and removeAttr() methods... - th.removeAttribute('aria-sort'); - - /* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */ - if (col.bSortable) { - if (aSort.length > 0 && aSort[0].col == i) { - th.setAttribute('aria-sort', aSort[0].dir == "asc" ? "ascending" : "descending"); - nextSort = asSorting[aSort[0].index + 1] || asSorting[0]; - } else { - nextSort = asSorting[0]; - } - - label = sTitle + (nextSort === "asc" ? - oAria.sSortAscending : - oAria.sSortDescending - ); - } else { - label = sTitle; - } - - th.setAttribute('aria-label', label); - } - } - - - /** - * Function to run on user sort request - * @param {object} settings dataTables settings object - * @param {node} attachTo node to attach the handler to - * @param {int} colIdx column sorting index - * @param {boolean} [append=false] Append the requested sort to the existing - * sort if true (i.e. multi-column sort) - * @param {function} [callback] callback function - * @memberof DataTable#oApi - */ - function _fnSortListener(settings, colIdx, append, callback) { - var col = settings.aoColumns[colIdx]; - var sorting = settings.aaSorting; - var asSorting = col.asSorting; - var nextSortIdx; - var next = function (a, overflow) { - var idx = a._idx; - if (idx === undefined) { - idx = $.inArray(a[1], asSorting); - } - - return idx + 1 < asSorting.length ? - idx + 1 : - overflow ? - null : - 0; - }; - - // Convert to 2D array if needed - if (typeof sorting[0] === 'number') { - sorting = settings.aaSorting = [sorting]; - } - - // If appending the sort then we are multi-column sorting - if (append && settings.oFeatures.bSortMulti) { - // Are we already doing some kind of sort on this column? - var sortIdx = $.inArray(colIdx, _pluck(sorting, '0')); - - if (sortIdx !== -1) { - // Yes, modify the sort - nextSortIdx = next(sorting[sortIdx], true); - - if (nextSortIdx === null && sorting.length === 1) { - nextSortIdx = 0; // can't remove sorting completely - } - - if (nextSortIdx === null) { - sorting.splice(sortIdx, 1); - } else { - sorting[sortIdx][1] = asSorting[nextSortIdx]; - sorting[sortIdx]._idx = nextSortIdx; - } - } else { - // No sort on this column yet - sorting.push([colIdx, asSorting[0], 0]); - sorting[sorting.length - 1]._idx = 0; - } - } else if (sorting.length && sorting[0][0] == colIdx) { - // Single column - already sorting on this column, modify the sort - nextSortIdx = next(sorting[0]); - - sorting.length = 1; - sorting[0][1] = asSorting[nextSortIdx]; - sorting[0]._idx = nextSortIdx; - } else { - // Single column - sort only on this column - sorting.length = 0; - sorting.push([colIdx, asSorting[0]]); - sorting[0]._idx = 0; - } - - // Run the sort by calling a full redraw - _fnReDraw(settings); - - // callback used for async user interaction - if (typeof callback == 'function') { - callback(settings); - } - } - - - /** - * Attach a sort handler (click) to a node - * @param {object} settings dataTables settings object - * @param {node} attachTo node to attach the handler to - * @param {int} colIdx column sorting index - * @param {function} [callback] callback function - * @memberof DataTable#oApi - */ - function _fnSortAttachListener(settings, attachTo, colIdx, callback) { - var col = settings.aoColumns[colIdx]; - - _fnBindAction(attachTo, {}, function (e) { - /* If the column is not sortable - don't to anything */ - if (col.bSortable === false) { - return; - } - - // If processing is enabled use a timeout to allow the processing - // display to be shown - otherwise to it synchronously - if (settings.oFeatures.bProcessing) { - _fnProcessingDisplay(settings, true); - - setTimeout(function () { - _fnSortListener(settings, colIdx, e.shiftKey, callback); - - // In server-side processing, the draw callback will remove the - // processing display - if (_fnDataSource(settings) !== 'ssp') { - _fnProcessingDisplay(settings, false); - } - }, 0); - } else { - _fnSortListener(settings, colIdx, e.shiftKey, callback); - } - }); - } - - - /** - * Set the sorting classes on table's body, Note: it is safe to call this function - * when bSort and bSortClasses are false - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnSortingClasses(settings) { - var oldSort = settings.aLastSort; - var sortClass = settings.oClasses.sSortColumn; - var sort = _fnSortFlatten(settings); - var features = settings.oFeatures; - var i, ien, colIdx; - - if (features.bSort && features.bSortClasses) { - // Remove old sorting classes - for (i = 0, ien = oldSort.length; i < ien; i++) { - colIdx = oldSort[i].src; - - // Remove column sorting - $(_pluck(settings.aoData, 'anCells', colIdx)) - .removeClass(sortClass + (i < 2 ? i + 1 : 3)); - } - - // Add new column sorting - for (i = 0, ien = sort.length; i < ien; i++) { - colIdx = sort[i].src; - - $(_pluck(settings.aoData, 'anCells', colIdx)) - .addClass(sortClass + (i < 2 ? i + 1 : 3)); - } - } - - settings.aLastSort = sort; - } - - - // Get the data to sort a column, be it from cache, fresh (populating the - // cache), or from a sort formatter - function _fnSortData(settings, idx) { - // Custom sorting function - provided by the sort data type - var column = settings.aoColumns[idx]; - var customSort = DataTable.ext.order[column.sSortDataType]; - var customData; - - if (customSort) { - customData = customSort.call(settings.oInstance, settings, idx, - _fnColumnIndexToVisible(settings, idx) - ); - } - - // Use / populate cache - var row, cellData; - var formatter = DataTable.ext.type.order[column.sType + "-pre"]; - - for (var i = 0, ien = settings.aoData.length; i < ien; i++) { - row = settings.aoData[i]; - - if (!row._aSortData) { - row._aSortData = []; - } - - if (!row._aSortData[idx] || customSort) { - cellData = customSort ? - customData[i] : // If there was a custom sort function, use data from there - _fnGetCellData(settings, i, idx, 'sort'); - - row._aSortData[idx] = formatter ? - formatter(cellData) : - cellData; - } - } - } - - - /** - * Save the state of a table - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnSaveState(settings) { - if (!settings.oFeatures.bStateSave || settings.bDestroying) { - return; - } - - /* Store the interesting variables */ - var state = { - time: +new Date(), - start: settings._iDisplayStart, - length: settings._iDisplayLength, - order: $.extend(true, [], settings.aaSorting), - search: _fnSearchToCamel(settings.oPreviousSearch), - columns: $.map(settings.aoColumns, function (col, i) { - return { - visible: col.bVisible, - search: _fnSearchToCamel(settings.aoPreSearchCols[i]) - }; - }) - }; - - _fnCallbackFire(settings, "aoStateSaveParams", 'stateSaveParams', [settings, state]); - - settings.oSavedState = state; - settings.fnStateSaveCallback.call(settings.oInstance, settings, state); - } - - - /** - * Attempt to load a saved table state - * @param {object} oSettings dataTables settings object - * @param {object} oInit DataTables init object so we can override settings - * @param {function} callback Callback to execute when the state has been loaded - * @memberof DataTable#oApi - */ - function _fnLoadState(settings, oInit, callback) { - var i, ien; - var columns = settings.aoColumns; - var loaded = function (s) { - if (!s || !s.time) { - callback(); - return; - } - - // Allow custom and plug-in manipulation functions to alter the saved data set and - // cancelling of loading by returning false - var abStateLoad = _fnCallbackFire(settings, 'aoStateLoadParams', 'stateLoadParams', [settings, s]); - if ($.inArray(false, abStateLoad) !== -1) { - callback(); - return; - } - - // Reject old data - var duration = settings.iStateDuration; - if (duration > 0 && s.time < +new Date() - (duration * 1000)) { - callback(); - return; - } - - // Number of columns have changed - all bets are off, no restore of settings - if (s.columns && columns.length !== s.columns.length) { - callback(); - return; - } - - // Store the saved state so it might be accessed at any time - settings.oLoadedState = $.extend(true, {}, s); - - // Restore key features - todo - for 1.11 this needs to be done by - // subscribed events - if (s.start !== undefined) { - settings._iDisplayStart = s.start; - settings.iInitDisplayStart = s.start; - } - if (s.length !== undefined) { - settings._iDisplayLength = s.length; - } - - // Order - if (s.order !== undefined) { - settings.aaSorting = []; - $.each(s.order, function (i, col) { - settings.aaSorting.push(col[0] >= columns.length ? - [0, col[1]] : - col - ); - }); - } - - // Search - if (s.search !== undefined) { - $.extend(settings.oPreviousSearch, _fnSearchToHung(s.search)); - } - - // Columns - // - if (s.columns) { - for (i = 0, ien = s.columns.length; i < ien; i++) { - var col = s.columns[i]; - - // Visibility - if (col.visible !== undefined) { - columns[i].bVisible = col.visible; - } - - // Search - if (col.search !== undefined) { - $.extend(settings.aoPreSearchCols[i], _fnSearchToHung(col.search)); - } - } - } - - _fnCallbackFire(settings, 'aoStateLoaded', 'stateLoaded', [settings, s]); - callback(); - }; - - if (!settings.oFeatures.bStateSave) { - callback(); - return; - } - - var state = settings.fnStateLoadCallback.call(settings.oInstance, settings, loaded); - - if (state !== undefined) { - loaded(state); - } - // otherwise, wait for the loaded callback to be executed - } - - - /** - * Return the settings object for a particular table - * @param {node} table table we are using as a dataTable - * @returns {object} Settings object - or null if not found - * @memberof DataTable#oApi - */ - function _fnSettingsFromNode(table) { - var settings = DataTable.settings; - var idx = $.inArray(table, _pluck(settings, 'nTable')); - - return idx !== -1 ? - settings[idx] : - null; - } - - - /** - * Log an error message - * @param {object} settings dataTables settings object - * @param {int} level log error messages, or display them to the user - * @param {string} msg error message - * @param {int} tn Technical note id to get more information about the error. - * @memberof DataTable#oApi - */ - function _fnLog(settings, level, msg, tn) { - msg = 'DataTables warning: ' + - (settings ? 'table id=' + settings.sTableId + ' - ' : '') + msg; - - if (tn) { - msg += '. For more information about this error, please see ' + - 'http://datatables.net/tn/' + tn; - } - - if (!level) { - // Backwards compatibility pre 1.10 - var ext = DataTable.ext; - var type = ext.sErrMode || ext.errMode; - - if (settings) { - _fnCallbackFire(settings, null, 'error', [settings, tn, msg]); - } - - if (type == 'alert') { - alert(msg); - } else if (type == 'throw') { - throw new Error(msg); - } else if (typeof type == 'function') { - type(settings, tn, msg); - } - } else if (window.console && console.log) { - console.log(msg); - } - } - - - /** - * See if a property is defined on one object, if so assign it to the other object - * @param {object} ret target object - * @param {object} src source object - * @param {string} name property - * @param {string} [mappedName] name to map too - optional, name used if not given - * @memberof DataTable#oApi - */ - function _fnMap(ret, src, name, mappedName) { - if (Array.isArray(name)) { - $.each(name, function (i, val) { - if (Array.isArray(val)) { - _fnMap(ret, src, val[0], val[1]); - } else { - _fnMap(ret, src, val); - } - }); - - return; - } - - if (mappedName === undefined) { - mappedName = name; - } - - if (src[name] !== undefined) { - ret[mappedName] = src[name]; - } - } - - - /** - * Extend objects - very similar to jQuery.extend, but deep copy objects, and - * shallow copy arrays. The reason we need to do this, is that we don't want to - * deep copy array init values (such as aaSorting) since the dev wouldn't be - * able to override them, but we do want to deep copy arrays. - * @param {object} out Object to extend - * @param {object} extender Object from which the properties will be applied to - * out - * @param {boolean} breakRefs If true, then arrays will be sliced to take an - * independent copy with the exception of the `data` or `aaData` parameters - * if they are present. This is so you can pass in a collection to - * DataTables and have that used as your data source without breaking the - * references - * @returns {object} out Reference, just for convenience - out === the return. - * @memberof DataTable#oApi - * @todo This doesn't take account of arrays inside the deep copied objects. - */ - function _fnExtend(out, extender, breakRefs) { - var val; - - for (var prop in extender) { - if (extender.hasOwnProperty(prop)) { - val = extender[prop]; - - if ($.isPlainObject(val)) { - if (!$.isPlainObject(out[prop])) { - out[prop] = {}; - } - $.extend(true, out[prop], val); - } else if (breakRefs && prop !== 'data' && prop !== 'aaData' && Array.isArray(val)) { - out[prop] = val.slice(); - } else { - out[prop] = val; - } - } - } - - return out; - } - - - /** - * Bind an event handers to allow a click or return key to activate the callback. - * This is good for accessibility since a return on the keyboard will have the - * same effect as a click, if the element has focus. - * @param {element} n Element to bind the action to - * @param {object} oData Data object to pass to the triggered function - * @param {function} fn Callback function for when the event is triggered - * @memberof DataTable#oApi - */ - function _fnBindAction(n, oData, fn) { - $(n) - .on('click.DT', oData, function (e) { - $(n).trigger('blur'); // Remove focus outline for mouse users - fn(e); - }) - .on('keypress.DT', oData, function (e) { - if (e.which === 13) { - e.preventDefault(); - fn(e); - } - }) - .on('selectstart.DT', function () { - /* Take the brutal approach to cancelling text selection */ - return false; - }); - } - - - /** - * Register a callback function. Easily allows a callback function to be added to - * an array store of callback functions that can then all be called together. - * @param {object} oSettings dataTables settings object - * @param {string} sStore Name of the array storage for the callbacks in oSettings - * @param {function} fn Function to be called back - * @param {string} sName Identifying name for the callback (i.e. a label) - * @memberof DataTable#oApi - */ - function _fnCallbackReg(oSettings, sStore, fn, sName) { - if (fn) { - oSettings[sStore].push({ - "fn": fn, - "sName": sName - }); - } - } - - - /** - * Fire callback functions and trigger events. Note that the loop over the - * callback array store is done backwards! Further note that you do not want to - * fire off triggers in time sensitive applications (for example cell creation) - * as its slow. - * @param {object} settings dataTables settings object - * @param {string} callbackArr Name of the array storage for the callbacks in - * oSettings - * @param {string} eventName Name of the jQuery custom event to trigger. If - * null no trigger is fired - * @param {array} args Array of arguments to pass to the callback function / - * trigger - * @memberof DataTable#oApi - */ - function _fnCallbackFire(settings, callbackArr, eventName, args) { - var ret = []; - - if (callbackArr) { - ret = $.map(settings[callbackArr].slice().reverse(), function (val, i) { - return val.fn.apply(settings.oInstance, args); - }); - } - - if (eventName !== null) { - var e = $.Event(eventName + '.dt'); - - $(settings.nTable).trigger(e, args); - - ret.push(e.result); - } - - return ret; - } - - - function _fnLengthOverflow(settings) { - var - start = settings._iDisplayStart, - end = settings.fnDisplayEnd(), - len = settings._iDisplayLength; - - /* If we have space to show extra rows (backing up from the end point - then do so */ - if (start >= end) { - start = end - len; - } - - // Keep the start record on the current page - start -= (start % len); - - if (len === -1 || start < 0) { - start = 0; - } - - settings._iDisplayStart = start; - } - - - function _fnRenderer(settings, type) { - var renderer = settings.renderer; - var host = DataTable.ext.renderer[type]; - - if ($.isPlainObject(renderer) && renderer[type]) { - // Specific renderer for this type. If available use it, otherwise use - // the default. - return host[renderer[type]] || host._; - } else if (typeof renderer === 'string') { - // Common renderer - if there is one available for this type use it, - // otherwise use the default - return host[renderer] || host._; - } - - // Use the default - return host._; - } - - - /** - * Detect the data source being used for the table. Used to simplify the code - * a little (ajax) and to make it compress a little smaller. - * - * @param {object} settings dataTables settings object - * @returns {string} Data source - * @memberof DataTable#oApi - */ - function _fnDataSource(settings) { - if (settings.oFeatures.bServerSide) { - return 'ssp'; - } else if (settings.ajax || settings.sAjaxSource) { - return 'ajax'; - } - return 'dom'; - } - - - /** - * Computed structure of the DataTables API, defined by the options passed to - * `DataTable.Api.register()` when building the API. - * - * The structure is built in order to speed creation and extension of the Api - * objects since the extensions are effectively pre-parsed. - * - * The array is an array of objects with the following structure, where this - * base array represents the Api prototype base: - * - * [ - * { - * name: 'data' -- string - Property name - * val: function () {}, -- function - Api method (or undefined if just an object - * methodExt: [ ... ], -- array - Array of Api object definitions to extend the method result - * propExt: [ ... ] -- array - Array of Api object definitions to extend the property - * }, - * { - * name: 'row' - * val: {}, - * methodExt: [ ... ], - * propExt: [ - * { - * name: 'data' - * val: function () {}, - * methodExt: [ ... ], - * propExt: [ ... ] - * }, - * ... - * ] - * } - * ] - * - * @type {Array} - * @ignore - */ - var __apiStruct = []; - - - /** - * `Array.prototype` reference. - * - * @type object - * @ignore - */ - var __arrayProto = Array.prototype; - - - /** - * Abstraction for `context` parameter of the `Api` constructor to allow it to - * take several different forms for ease of use. - * - * Each of the input parameter types will be converted to a DataTables settings - * object where possible. - * - * @param {string|node|jQuery|object} mixed DataTable identifier. Can be one - * of: - * - * * `string` - jQuery selector. Any DataTables' matching the given selector - * with be found and used. - * * `node` - `TABLE` node which has already been formed into a DataTable. - * * `jQuery` - A jQuery object of `TABLE` nodes. - * * `object` - DataTables settings object - * * `DataTables.Api` - API instance - * @return {array|null} Matching DataTables settings objects. `null` or - * `undefined` is returned if no matching DataTable is found. - * @ignore - */ - var _toSettings = function (mixed) { - var idx, jq; - var settings = DataTable.settings; - var tables = $.map(settings, function (el, i) { - return el.nTable; - }); - - if (!mixed) { - return []; - } else if (mixed.nTable && mixed.oApi) { - // DataTables settings object - return [mixed]; - } else if (mixed.nodeName && mixed.nodeName.toLowerCase() === 'table') { - // Table node - idx = $.inArray(mixed, tables); - return idx !== -1 ? [settings[idx]] : null; - } else if (mixed && typeof mixed.settings === 'function') { - return mixed.settings().toArray(); - } else if (typeof mixed === 'string') { - // jQuery selector - jq = $(mixed); - } else if (mixed instanceof $) { - // jQuery object (also DataTables instance) - jq = mixed; - } - - if (jq) { - return jq.map(function (i) { - idx = $.inArray(this, tables); - return idx !== -1 ? settings[idx] : null; - }).toArray(); - } - }; - - - /** - * DataTables API class - used to control and interface with one or more - * DataTables enhanced tables. - * - * The API class is heavily based on jQuery, presenting a chainable interface - * that you can use to interact with tables. Each instance of the API class has - * a "context" - i.e. the tables that it will operate on. This could be a single - * table, all tables on a page or a sub-set thereof. - * - * Additionally the API is designed to allow you to easily work with the data in - * the tables, retrieving and manipulating it as required. This is done by - * presenting the API class as an array like interface. The contents of the - * array depend upon the actions requested by each method (for example - * `rows().nodes()` will return an array of nodes, while `rows().data()` will - * return an array of objects or arrays depending upon your table's - * configuration). The API object has a number of array like methods (`push`, - * `pop`, `reverse` etc) as well as additional helper methods (`each`, `pluck`, - * `unique` etc) to assist your working with the data held in a table. - * - * Most methods (those which return an Api instance) are chainable, which means - * the return from a method call also has all of the methods available that the - * top level object had. For example, these two calls are equivalent: - * - * // Not chained - * api.row.add( {...} ); - * api.draw(); - * - * // Chained - * api.row.add( {...} ).draw(); - * - * @class DataTable.Api - * @param {array|object|string|jQuery} context DataTable identifier. This is - * used to define which DataTables enhanced tables this API will operate on. - * Can be one of: - * - * * `string` - jQuery selector. Any DataTables' matching the given selector - * with be found and used. - * * `node` - `TABLE` node which has already been formed into a DataTable. - * * `jQuery` - A jQuery object of `TABLE` nodes. - * * `object` - DataTables settings object - * @param {array} [data] Data to initialise the Api instance with. - * - * @example - * // Direct initialisation during DataTables construction - * var api = $('#example').DataTable(); - * - * @example - * // Initialisation using a DataTables jQuery object - * var api = $('#example').dataTable().api(); - * - * @example - * // Initialisation as a constructor - * var api = new $.fn.DataTable.Api( 'table.dataTable' ); - */ - _Api = function (context, data) { - if (!(this instanceof _Api)) { - return new _Api(context, data); - } - - var settings = []; - var ctxSettings = function (o) { - var a = _toSettings(o); - if (a) { - settings.push.apply(settings, a); - } - }; - - if (Array.isArray(context)) { - for (var i = 0, ien = context.length; i < ien; i++) { - ctxSettings(context[i]); - } - } else { - ctxSettings(context); - } - - // Remove duplicates - this.context = _unique(settings); - - // Initial data - if (data) { - $.merge(this, data); - } - - // selector - this.selector = { - rows: null, - cols: null, - opts: null - }; - - _Api.extend(this, this, __apiStruct); - }; - - DataTable.Api = _Api; - - // Don't destroy the existing prototype, just extend it. Required for jQuery 2's - // isPlainObject. - $.extend(_Api.prototype, { - any: function () { - return this.count() !== 0; - }, - - - concat: __arrayProto.concat, - - - context: [], // array of table settings objects - - - count: function () { - return this.flatten().length; - }, - - - each: function (fn) { - for (var i = 0, ien = this.length; i < ien; i++) { - fn.call(this, this[i], i, this); - } - - return this; - }, - - - eq: function (idx) { - var ctx = this.context; - - return ctx.length > idx ? - new _Api(ctx[idx], this[idx]) : - null; - }, - - - filter: function (fn) { - var a = []; - - if (__arrayProto.filter) { - a = __arrayProto.filter.call(this, fn, this); - } else { - // Compatibility for browsers without EMCA-252-5 (JS 1.6) - for (var i = 0, ien = this.length; i < ien; i++) { - if (fn.call(this, this[i], i, this)) { - a.push(this[i]); - } - } - } - - return new _Api(this.context, a); - }, - - - flatten: function () { - var a = []; - return new _Api(this.context, a.concat.apply(a, this.toArray())); - }, - - - join: __arrayProto.join, - - - indexOf: __arrayProto.indexOf || function (obj, start) { - for (var i = (start || 0), ien = this.length; i < ien; i++) { - if (this[i] === obj) { - return i; - } - } - return -1; - }, - - iterator: function (flatten, type, fn, alwaysNew) { - var - a = [], ret, - i, ien, j, jen, - context = this.context, - rows, items, item, - selector = this.selector; - - // Argument shifting - if (typeof flatten === 'string') { - alwaysNew = fn; - fn = type; - type = flatten; - flatten = false; - } - - for (i = 0, ien = context.length; i < ien; i++) { - var apiInst = new _Api(context[i]); - - if (type === 'table') { - ret = fn.call(apiInst, context[i], i); - - if (ret !== undefined) { - a.push(ret); - } - } else if (type === 'columns' || type === 'rows') { - // this has same length as context - one entry for each table - ret = fn.call(apiInst, context[i], this[i], i); - - if (ret !== undefined) { - a.push(ret); - } - } else if (type === 'column' || type === 'column-rows' || type === 'row' || type === 'cell') { - // columns and rows share the same structure. - // 'this' is an array of column indexes for each context - items = this[i]; - - if (type === 'column-rows') { - rows = _selector_row_indexes(context[i], selector.opts); - } - - for (j = 0, jen = items.length; j < jen; j++) { - item = items[j]; - - if (type === 'cell') { - ret = fn.call(apiInst, context[i], item.row, item.column, i, j); - } else { - ret = fn.call(apiInst, context[i], item, i, j, rows); - } - - if (ret !== undefined) { - a.push(ret); - } - } - } - } - - if (a.length || alwaysNew) { - var api = new _Api(context, flatten ? a.concat.apply([], a) : a); - var apiSelector = api.selector; - apiSelector.rows = selector.rows; - apiSelector.cols = selector.cols; - apiSelector.opts = selector.opts; - return api; - } - return this; - }, - - - lastIndexOf: __arrayProto.lastIndexOf || function (obj, start) { - // Bit cheeky... - return this.indexOf.apply(this.toArray.reverse(), arguments); - }, - - - length: 0, - - - map: function (fn) { - var a = []; - - if (__arrayProto.map) { - a = __arrayProto.map.call(this, fn, this); - } else { - // Compatibility for browsers without EMCA-252-5 (JS 1.6) - for (var i = 0, ien = this.length; i < ien; i++) { - a.push(fn.call(this, this[i], i)); - } - } - - return new _Api(this.context, a); - }, - - - pluck: function (prop) { - return this.map(function (el) { - return el[prop]; - }); - }, - - pop: __arrayProto.pop, - - - push: __arrayProto.push, - - - // Does not return an API instance - reduce: __arrayProto.reduce || function (fn, init) { - return _fnReduce(this, fn, init, 0, this.length, 1); - }, - - - reduceRight: __arrayProto.reduceRight || function (fn, init) { - return _fnReduce(this, fn, init, this.length - 1, -1, -1); - }, - - - reverse: __arrayProto.reverse, - - - // Object with rows, columns and opts - selector: null, - - - shift: __arrayProto.shift, - - - slice: function () { - return new _Api(this.context, this); - }, - - - sort: __arrayProto.sort, // ? name - order? - - - splice: __arrayProto.splice, - - - toArray: function () { - return __arrayProto.slice.call(this); - }, - - - to$: function () { - return $(this); - }, - - - toJQuery: function () { - return $(this); - }, - - - unique: function () { - return new _Api(this.context, _unique(this)); - }, - - - unshift: __arrayProto.unshift - }); - - - _Api.extend = function (scope, obj, ext) { - // Only extend API instances and static properties of the API - if (!ext.length || !obj || (!(obj instanceof _Api) && !obj.__dt_wrapper)) { - return; - } - - var - i, ien, - struct, - methodScoping = function (scope, fn, struc) { - return function () { - var ret = fn.apply(scope, arguments); - - // Method extension - _Api.extend(ret, ret, struc.methodExt); - return ret; - }; - }; - - for (i = 0, ien = ext.length; i < ien; i++) { - struct = ext[i]; - - // Value - obj[struct.name] = struct.type === 'function' ? - methodScoping(scope, struct.val, struct) : - struct.type === 'object' ? - {} : - struct.val; - - obj[struct.name].__dt_wrapper = true; - - // Property extension - _Api.extend(scope, obj[struct.name], struct.propExt); - } - }; - - - // @todo - Is there need for an augment function? - // _Api.augment = function ( inst, name ) - // { - // // Find src object in the structure from the name - // var parts = name.split('.'); - - // _Api.extend( inst, obj ); - // }; - - - // [ - // { - // name: 'data' -- string - Property name - // val: function () {}, -- function - Api method (or undefined if just an object - // methodExt: [ ... ], -- array - Array of Api object definitions to extend the method result - // propExt: [ ... ] -- array - Array of Api object definitions to extend the property - // }, - // { - // name: 'row' - // val: {}, - // methodExt: [ ... ], - // propExt: [ - // { - // name: 'data' - // val: function () {}, - // methodExt: [ ... ], - // propExt: [ ... ] - // }, - // ... - // ] - // } - // ] - - _Api.register = _api_register = function (name, val) { - if (Array.isArray(name)) { - for (var j = 0, jen = name.length; j < jen; j++) { - _Api.register(name[j], val); - } - return; - } - - var - i, ien, - heir = name.split('.'), - struct = __apiStruct, - key, method; - - var find = function (src, name) { - for (var i = 0, ien = src.length; i < ien; i++) { - if (src[i].name === name) { - return src[i]; - } - } - return null; - }; - - for (i = 0, ien = heir.length; i < ien; i++) { - method = heir[i].indexOf('()') !== -1; - key = method ? - heir[i].replace('()', '') : - heir[i]; - - var src = find(struct, key); - if (!src) { - src = { - name: key, - val: {}, - methodExt: [], - propExt: [], - type: 'object' - }; - struct.push(src); - } - - if (i === ien - 1) { - src.val = val; - src.type = typeof val === 'function' ? - 'function' : - $.isPlainObject(val) ? - 'object' : - 'other'; - } else { - struct = method ? - src.methodExt : - src.propExt; - } - } - }; - - _Api.registerPlural = _api_registerPlural = function (pluralName, singularName, val) { - _Api.register(pluralName, val); - - _Api.register(singularName, function () { - var ret = val.apply(this, arguments); - - if (ret === this) { - // Returned item is the API instance that was passed in, return it - return this; - } else if (ret instanceof _Api) { - // New API instance returned, want the value from the first item - // in the returned array for the singular result. - return ret.length ? - Array.isArray(ret[0]) ? - new _Api(ret.context, ret[0]) : // Array results are 'enhanced' - ret[0] : - undefined; - } - - // Non-API return - just fire it back - return ret; - }); - }; - - - /** - * Selector for HTML tables. Apply the given selector to the give array of - * DataTables settings objects. - * - * @param {string|integer} [selector] jQuery selector string or integer - * @param {array} Array of DataTables settings objects to be filtered - * @return {array} - * @ignore - */ - var __table_selector = function (selector, a) { - if (Array.isArray(selector)) { - return $.map(selector, function (item) { - return __table_selector(item, a); - }); - } - - // Integer is used to pick out a table by index - if (typeof selector === 'number') { - return [a[selector]]; - } - - // Perform a jQuery selector on the table nodes - var nodes = $.map(a, function (el, i) { - return el.nTable; - }); - - return $(nodes) - .filter(selector) - .map(function (i) { - // Need to translate back from the table node to the settings - var idx = $.inArray(this, nodes); - return a[idx]; - }) - .toArray(); - }; - - - /** - * Context selector for the API's context (i.e. the tables the API instance - * refers to. - * - * @name DataTable.Api#tables - * @param {string|integer} [selector] Selector to pick which tables the iterator - * should operate on. If not given, all tables in the current context are - * used. This can be given as a jQuery selector (for example `':gt(0)'`) to - * select multiple tables or as an integer to select a single table. - * @returns {DataTable.Api} Returns a new API instance if a selector is given. - */ - _api_register('tables()', function (selector) { - // A new instance is created if there was a selector specified - return selector !== undefined && selector !== null ? - new _Api(__table_selector(selector, this.context)) : - this; - }); - - - _api_register('table()', function (selector) { - var tables = this.tables(selector); - var ctx = tables.context; - - // Truncate to the first matched table - return ctx.length ? - new _Api(ctx[0]) : - tables; - }); - - - _api_registerPlural('tables().nodes()', 'table().node()', function () { - return this.iterator('table', function (ctx) { - return ctx.nTable; - }, 1); - }); - - - _api_registerPlural('tables().body()', 'table().body()', function () { - return this.iterator('table', function (ctx) { - return ctx.nTBody; - }, 1); - }); - - - _api_registerPlural('tables().header()', 'table().header()', function () { - return this.iterator('table', function (ctx) { - return ctx.nTHead; - }, 1); - }); - - - _api_registerPlural('tables().footer()', 'table().footer()', function () { - return this.iterator('table', function (ctx) { - return ctx.nTFoot; - }, 1); - }); - - - _api_registerPlural('tables().containers()', 'table().container()', function () { - return this.iterator('table', function (ctx) { - return ctx.nTableWrapper; - }, 1); - }); - - - /** - * Redraw the tables in the current context. - */ - _api_register('draw()', function (paging) { - return this.iterator('table', function (settings) { - if (paging === 'page') { - _fnDraw(settings); - } else { - if (typeof paging === 'string') { - paging = paging === 'full-hold' ? - false : - true; - } - - _fnReDraw(settings, paging === false); - } - }); - }); - - - /** - * Get the current page index. - * - * @return {integer} Current page index (zero based) - */ - /** - * Set the current page. - * - * Note that if you attempt to show a page which does not exist, DataTables will - * not throw an error, but rather reset the paging. - * - * @param {integer|string} action The paging action to take. This can be one of: - * * `integer` - The page index to jump to - * * `string` - An action to take: - * * `first` - Jump to first page. - * * `next` - Jump to the next page - * * `previous` - Jump to previous page - * * `last` - Jump to the last page. - * @returns {DataTables.Api} this - */ - _api_register('page()', function (action) { - if (action === undefined) { - return this.page.info().page; // not an expensive call - } - - // else, have an action to take on all tables - return this.iterator('table', function (settings) { - _fnPageChange(settings, action); - }); - }); - - - /** - * Paging information for the first table in the current context. - * - * If you require paging information for another table, use the `table()` method - * with a suitable selector. - * - * @return {object} Object with the following properties set: - * * `page` - Current page index (zero based - i.e. the first page is `0`) - * * `pages` - Total number of pages - * * `start` - Display index for the first record shown on the current page - * * `end` - Display index for the last record shown on the current page - * * `length` - Display length (number of records). Note that generally `start - * + length = end`, but this is not always true, for example if there are - * only 2 records to show on the final page, with a length of 10. - * * `recordsTotal` - Full data set length - * * `recordsDisplay` - Data set length once the current filtering criterion - * are applied. - */ - _api_register('page.info()', function (action) { - if (this.context.length === 0) { - return undefined; - } - - var - settings = this.context[0], - start = settings._iDisplayStart, - len = settings.oFeatures.bPaginate ? settings._iDisplayLength : -1, - visRecords = settings.fnRecordsDisplay(), - all = len === -1; - - return { - "page": all ? 0 : Math.floor(start / len), - "pages": all ? 1 : Math.ceil(visRecords / len), - "start": start, - "end": settings.fnDisplayEnd(), - "length": len, - "recordsTotal": settings.fnRecordsTotal(), - "recordsDisplay": visRecords, - "serverSide": _fnDataSource(settings) === 'ssp' - }; - }); - - - /** - * Get the current page length. - * - * @return {integer} Current page length. Note `-1` indicates that all records - * are to be shown. - */ - /** - * Set the current page length. - * - * @param {integer} Page length to set. Use `-1` to show all records. - * @returns {DataTables.Api} this - */ - _api_register('page.len()', function (len) { - // Note that we can't call this function 'length()' because `length` - // is a Javascript property of functions which defines how many arguments - // the function expects. - if (len === undefined) { - return this.context.length !== 0 ? - this.context[0]._iDisplayLength : - undefined; - } - - // else, set the page length - return this.iterator('table', function (settings) { - _fnLengthChange(settings, len); - }); - }); - - - var __reload = function (settings, holdPosition, callback) { - // Use the draw event to trigger a callback - if (callback) { - var api = new _Api(settings); - - api.one('draw', function () { - callback(api.ajax.json()); - }); - } - - if (_fnDataSource(settings) == 'ssp') { - _fnReDraw(settings, holdPosition); - } else { - _fnProcessingDisplay(settings, true); - - // Cancel an existing request - var xhr = settings.jqXHR; - if (xhr && xhr.readyState !== 4) { - xhr.abort(); - } - - // Trigger xhr - _fnBuildAjax(settings, [], function (json) { - _fnClearTable(settings); - - var data = _fnAjaxDataSrc(settings, json); - for (var i = 0, ien = data.length; i < ien; i++) { - _fnAddData(settings, data[i]); - } - - _fnReDraw(settings, holdPosition); - _fnProcessingDisplay(settings, false); - }); - } - }; - - - /** - * Get the JSON response from the last Ajax request that DataTables made to the - * server. Note that this returns the JSON from the first table in the current - * context. - * - * @return {object} JSON received from the server. - */ - _api_register('ajax.json()', function () { - var ctx = this.context; - - if (ctx.length > 0) { - return ctx[0].json; - } - - // else return undefined; - }); - - - /** - * Get the data submitted in the last Ajax request - */ - _api_register('ajax.params()', function () { - var ctx = this.context; - - if (ctx.length > 0) { - return ctx[0].oAjaxData; - } - - // else return undefined; - }); - - - /** - * Reload tables from the Ajax data source. Note that this function will - * automatically re-draw the table when the remote data has been loaded. - * - * @param {boolean} [reset=true] Reset (default) or hold the current paging - * position. A full re-sort and re-filter is performed when this method is - * called, which is why the pagination reset is the default action. - * @returns {DataTables.Api} this - */ - _api_register('ajax.reload()', function (callback, resetPaging) { - return this.iterator('table', function (settings) { - __reload(settings, resetPaging === false, callback); - }); - }); - - - /** - * Get the current Ajax URL. Note that this returns the URL from the first - * table in the current context. - * - * @return {string} Current Ajax source URL - */ - /** - * Set the Ajax URL. Note that this will set the URL for all tables in the - * current context. - * - * @param {string} url URL to set. - * @returns {DataTables.Api} this - */ - _api_register('ajax.url()', function (url) { - var ctx = this.context; - - if (url === undefined) { - // get - if (ctx.length === 0) { - return undefined; - } - ctx = ctx[0]; - - return ctx.ajax ? - $.isPlainObject(ctx.ajax) ? - ctx.ajax.url : - ctx.ajax : - ctx.sAjaxSource; - } - - // set - return this.iterator('table', function (settings) { - if ($.isPlainObject(settings.ajax)) { - settings.ajax.url = url; - } else { - settings.ajax = url; - } - // No need to consider sAjaxSource here since DataTables gives priority - // to `ajax` over `sAjaxSource`. So setting `ajax` here, renders any - // value of `sAjaxSource` redundant. - }); - }); - - - /** - * Load data from the newly set Ajax URL. Note that this method is only - * available when `ajax.url()` is used to set a URL. Additionally, this method - * has the same effect as calling `ajax.reload()` but is provided for - * convenience when setting a new URL. Like `ajax.reload()` it will - * automatically redraw the table once the remote data has been loaded. - * - * @returns {DataTables.Api} this - */ - _api_register('ajax.url().load()', function (callback, resetPaging) { - // Same as a reload, but makes sense to present it for easy access after a - // url change - return this.iterator('table', function (ctx) { - __reload(ctx, resetPaging === false, callback); - }); - }); - - - var _selector_run = function (type, selector, selectFn, settings, opts) { - var - out = [], res, - a, i, ien, j, jen, - selectorType = typeof selector; - - // Can't just check for isArray here, as an API or jQuery instance might be - // given with their array like look - if (!selector || selectorType === 'string' || selectorType === 'function' || selector.length === undefined) { - selector = [selector]; - } - - for (i = 0, ien = selector.length; i < ien; i++) { - // Only split on simple strings - complex expressions will be jQuery selectors - a = selector[i] && selector[i].split && !selector[i].match(/[\[\(:]/) ? - selector[i].split(',') : - [selector[i]]; - - for (j = 0, jen = a.length; j < jen; j++) { - res = selectFn(typeof a[j] === 'string' ? (a[j]).trim() : a[j]); - - if (res && res.length) { - out = out.concat(res); - } - } - } - - // selector extensions - var ext = _ext.selector[type]; - if (ext.length) { - for (i = 0, ien = ext.length; i < ien; i++) { - out = ext[i](settings, opts, out); - } - } - - return _unique(out); - }; - - - var _selector_opts = function (opts) { - if (!opts) { - opts = {}; - } - - // Backwards compatibility for 1.9- which used the terminology filter rather - // than search - if (opts.filter && opts.search === undefined) { - opts.search = opts.filter; - } - - return $.extend({ - search: 'none', - order: 'current', - page: 'all' - }, opts); - }; - - - var _selector_first = function (inst) { - // Reduce the API instance to the first item found - for (var i = 0, ien = inst.length; i < ien; i++) { - if (inst[i].length > 0) { - // Assign the first element to the first item in the instance - // and truncate the instance and context - inst[0] = inst[i]; - inst[0].length = 1; - inst.length = 1; - inst.context = [inst.context[i]]; - - return inst; - } - } - - // Not found - return an empty instance - inst.length = 0; - return inst; - }; - - - var _selector_row_indexes = function (settings, opts) { - var - i, ien, tmp, a = [], - displayFiltered = settings.aiDisplay, - displayMaster = settings.aiDisplayMaster; - - var - search = opts.search, // none, applied, removed - order = opts.order, // applied, current, index (original - compatibility with 1.9) - page = opts.page; // all, current - - if (_fnDataSource(settings) == 'ssp') { - // In server-side processing mode, most options are irrelevant since - // rows not shown don't exist and the index order is the applied order - // Removed is a special case - for consistency just return an empty - // array - return search === 'removed' ? - [] : - _range(0, displayMaster.length); - } else if (page == 'current') { - // Current page implies that order=current and fitler=applied, since it is - // fairly senseless otherwise, regardless of what order and search actually - // are - for (i = settings._iDisplayStart, ien = settings.fnDisplayEnd(); i < ien; i++) { - a.push(displayFiltered[i]); - } - } else if (order == 'current' || order == 'applied') { - if (search == 'none') { - a = displayMaster.slice(); - } else if (search == 'applied') { - a = displayFiltered.slice(); - } else if (search == 'removed') { - // O(n+m) solution by creating a hash map - var displayFilteredMap = {}; - - for (var i = 0, ien = displayFiltered.length; i < ien; i++) { - displayFilteredMap[displayFiltered[i]] = null; - } - - a = $.map(displayMaster, function (el) { - return !displayFilteredMap.hasOwnProperty(el) ? - el : - null; - }); - } - } else if (order == 'index' || order == 'original') { - for (i = 0, ien = settings.aoData.length; i < ien; i++) { - if (search == 'none') { - a.push(i); - } else { // applied | removed - tmp = $.inArray(i, displayFiltered); - - if ((tmp === -1 && search == 'removed') || - (tmp >= 0 && search == 'applied')) { - a.push(i); - } - } - } - } - - return a; - }; - - - /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Rows - * - * {} - no selector - use all available rows - * {integer} - row aoData index - * {node} - TR node - * {string} - jQuery selector to apply to the TR elements - * {array} - jQuery array of nodes, or simply an array of TR nodes - * - */ - var __row_selector = function (settings, selector, opts) { - var rows; - var run = function (sel) { - var selInt = _intVal(sel); - var i, ien; - var aoData = settings.aoData; - - // Short cut - selector is a number and no options provided (default is - // all records, so no need to check if the index is in there, since it - // must be - dev error if the index doesn't exist). - if (selInt !== null && !opts) { - return [selInt]; - } - - if (!rows) { - rows = _selector_row_indexes(settings, opts); - } - - if (selInt !== null && $.inArray(selInt, rows) !== -1) { - // Selector - integer - return [selInt]; - } else if (sel === null || sel === undefined || sel === '') { - // Selector - none - return rows; - } - - // Selector - function - if (typeof sel === 'function') { - return $.map(rows, function (idx) { - var row = aoData[idx]; - return sel(idx, row._aData, row.nTr) ? idx : null; - }); - } - - // Selector - node - if (sel.nodeName) { - var rowIdx = sel._DT_RowIndex; // Property added by DT for fast lookup - var cellIdx = sel._DT_CellIndex; - - if (rowIdx !== undefined) { - // Make sure that the row is actually still present in the table - return aoData[rowIdx] && aoData[rowIdx].nTr === sel ? - [rowIdx] : - []; - } else if (cellIdx) { - return aoData[cellIdx.row] && aoData[cellIdx.row].nTr === sel.parentNode ? - [cellIdx.row] : - []; - } else { - var host = $(sel).closest('*[data-dt-row]'); - return host.length ? - [host.data('dt-row')] : - []; - } - } - - // ID selector. Want to always be able to select rows by id, regardless - // of if the tr element has been created or not, so can't rely upon - // jQuery here - hence a custom implementation. This does not match - // Sizzle's fast selector or HTML4 - in HTML5 the ID can be anything, - // but to select it using a CSS selector engine (like Sizzle or - // querySelect) it would need to need to be escaped for some characters. - // DataTables simplifies this for row selectors since you can select - // only a row. A # indicates an id any anything that follows is the id - - // unescaped. - if (typeof sel === 'string' && sel.charAt(0) === '#') { - // get row index from id - var rowObj = settings.aIds[sel.replace(/^#/, '')]; - if (rowObj !== undefined) { - return [rowObj.idx]; - } - - // need to fall through to jQuery in case there is DOM id that - // matches - } - - // Get nodes in the order from the `rows` array with null values removed - var nodes = _removeEmpty( - _pluck_order(settings.aoData, rows, 'nTr') - ); - - // Selector - jQuery selector string, array of nodes or jQuery object/ - // As jQuery's .filter() allows jQuery objects to be passed in filter, - // it also allows arrays, so this will cope with all three options - return $(nodes) - .filter(sel) - .map(function () { - return this._DT_RowIndex; - }) - .toArray(); - }; - - return _selector_run('row', selector, run, settings, opts); - }; - - - _api_register('rows()', function (selector, opts) { - // argument shifting - if (selector === undefined) { - selector = ''; - } else if ($.isPlainObject(selector)) { - opts = selector; - selector = ''; - } - - opts = _selector_opts(opts); - - var inst = this.iterator('table', function (settings) { - return __row_selector(settings, selector, opts); - }, 1); - - // Want argument shifting here and in __row_selector? - inst.selector.rows = selector; - inst.selector.opts = opts; - - return inst; - }); - - _api_register('rows().nodes()', function () { - return this.iterator('row', function (settings, row) { - return settings.aoData[row].nTr || undefined; - }, 1); - }); - - _api_register('rows().data()', function () { - return this.iterator(true, 'rows', function (settings, rows) { - return _pluck_order(settings.aoData, rows, '_aData'); - }, 1); - }); - - _api_registerPlural('rows().cache()', 'row().cache()', function (type) { - return this.iterator('row', function (settings, row) { - var r = settings.aoData[row]; - return type === 'search' ? r._aFilterData : r._aSortData; - }, 1); - }); - - _api_registerPlural('rows().invalidate()', 'row().invalidate()', function (src) { - return this.iterator('row', function (settings, row) { - _fnInvalidate(settings, row, src); - }); - }); - - _api_registerPlural('rows().indexes()', 'row().index()', function () { - return this.iterator('row', function (settings, row) { - return row; - }, 1); - }); - - _api_registerPlural('rows().ids()', 'row().id()', function (hash) { - var a = []; - var context = this.context; - - // `iterator` will drop undefined values, but in this case we want them - for (var i = 0, ien = context.length; i < ien; i++) { - for (var j = 0, jen = this[i].length; j < jen; j++) { - var id = context[i].rowIdFn(context[i].aoData[this[i][j]]._aData); - a.push((hash === true ? '#' : '') + id); - } - } - - return new _Api(context, a); - }); - - _api_registerPlural('rows().remove()', 'row().remove()', function () { - var that = this; - - this.iterator('row', function (settings, row, thatIdx) { - var data = settings.aoData; - var rowData = data[row]; - var i, ien, j, jen; - var loopRow, loopCells; - - data.splice(row, 1); - - // Update the cached indexes - for (i = 0, ien = data.length; i < ien; i++) { - loopRow = data[i]; - loopCells = loopRow.anCells; - - // Rows - if (loopRow.nTr !== null) { - loopRow.nTr._DT_RowIndex = i; - } - - // Cells - if (loopCells !== null) { - for (j = 0, jen = loopCells.length; j < jen; j++) { - loopCells[j]._DT_CellIndex.row = i; - } - } - } - - // Delete from the display arrays - _fnDeleteIndex(settings.aiDisplayMaster, row); - _fnDeleteIndex(settings.aiDisplay, row); - _fnDeleteIndex(that[thatIdx], row, false); // maintain local indexes - - // For server-side processing tables - subtract the deleted row from the count - if (settings._iRecordsDisplay > 0) { - settings._iRecordsDisplay--; - } - - // Check for an 'overflow' they case for displaying the table - _fnLengthOverflow(settings); - - // Remove the row's ID reference if there is one - var id = settings.rowIdFn(rowData._aData); - if (id !== undefined) { - delete settings.aIds[id]; - } - }); - - this.iterator('table', function (settings) { - for (var i = 0, ien = settings.aoData.length; i < ien; i++) { - settings.aoData[i].idx = i; - } - }); - - return this; - }); - - - _api_register('rows.add()', function (rows) { - var newRows = this.iterator('table', function (settings) { - var row, i, ien; - var out = []; - - for (i = 0, ien = rows.length; i < ien; i++) { - row = rows[i]; - - if (row.nodeName && row.nodeName.toUpperCase() === 'TR') { - out.push(_fnAddTr(settings, row)[0]); - } else { - out.push(_fnAddData(settings, row)); - } - } - - return out; - }, 1); - - // Return an Api.rows() extended instance, so rows().nodes() etc can be used - var modRows = this.rows(-1); - modRows.pop(); - $.merge(modRows, newRows); - - return modRows; - }); - - - /** - * - */ - _api_register('row()', function (selector, opts) { - return _selector_first(this.rows(selector, opts)); - }); - - - _api_register('row().data()', function (data) { - var ctx = this.context; - - if (data === undefined) { - // Get - return ctx.length && this.length ? - ctx[0].aoData[this[0]]._aData : - undefined; - } - - // Set - var row = ctx[0].aoData[this[0]]; - row._aData = data; - - // If the DOM has an id, and the data source is an array - if (Array.isArray(data) && row.nTr && row.nTr.id) { - _fnSetObjectDataFn(ctx[0].rowId)(data, row.nTr.id); - } - - // Automatically invalidate - _fnInvalidate(ctx[0], this[0], 'data'); - - return this; - }); - - - _api_register('row().node()', function () { - var ctx = this.context; - - return ctx.length && this.length ? - ctx[0].aoData[this[0]].nTr || null : - null; - }); - - - _api_register('row.add()', function (row) { - // Allow a jQuery object to be passed in - only a single row is added from - // it though - the first element in the set - if (row instanceof $ && row.length) { - row = row[0]; - } - - var rows = this.iterator('table', function (settings) { - if (row.nodeName && row.nodeName.toUpperCase() === 'TR') { - return _fnAddTr(settings, row)[0]; - } - return _fnAddData(settings, row); - }); - - // Return an Api.rows() extended instance, with the newly added row selected - return this.row(rows[0]); - }); - - - var __details_add = function (ctx, row, data, klass) { - // Convert to array of TR elements - var rows = []; - var addRow = function (r, k) { - // Recursion to allow for arrays of jQuery objects - if (Array.isArray(r) || r instanceof $) { - for (var i = 0, ien = r.length; i < ien; i++) { - addRow(r[i], k); - } - return; - } - - // If we get a TR element, then just add it directly - up to the dev - // to add the correct number of columns etc - if (r.nodeName && r.nodeName.toLowerCase() === 'tr') { - rows.push(r); - } else { - // Otherwise create a row with a wrapper - var created = $('
` node is a DataTable table already or not. - * - * @param {node|jquery|string} table Table node, jQuery object or jQuery - * selector for the table to test. Note that if more than more than one - * table is passed on, only the first will be checked - * @returns {boolean} true the table given is a DataTable, or false otherwise - * @static - * @dtopt API-Static - * - * @example - * if ( ! $.fn.DataTable.isDataTable( '#example' ) ) { - * $('#example').dataTable(); - * } - */ - DataTable.isDataTable = DataTable.fnIsDataTable = function (table) { - var t = $(table).get(0); - var is = false; - - if (table instanceof DataTable.Api) { - return true; - } - - $.each(DataTable.settings, function (i, o) { - var head = o.nScrollHead ? $('table', o.nScrollHead)[0] : null; - var foot = o.nScrollFoot ? $('table', o.nScrollFoot)[0] : null; - - if (o.nTable === t || head === t || foot === t) { - is = true; - } - }); - - return is; - }; - - - /** - * Get all DataTable tables that have been initialised - optionally you can - * select to get only currently visible tables. - * - * @param {boolean} [visible=false] Flag to indicate if you want all (default) - * or visible tables only. - * @returns {array} Array of `table` nodes (not DataTable instances) which are - * DataTables - * @static - * @dtopt API-Static - * - * @example - * $.each( $.fn.dataTable.tables(true), function () { - * $(table).DataTable().columns.adjust(); - * } ); - */ - DataTable.tables = DataTable.fnTables = function (visible) { - var api = false; - - if ($.isPlainObject(visible)) { - api = visible.api; - visible = visible.visible; - } - - var a = $.map(DataTable.settings, function (o) { - if (!visible || (visible && $(o.nTable).is(':visible'))) { - return o.nTable; - } - }); - - return api ? - new _Api(a) : - a; - }; - - - /** - * Convert from camel case parameters to Hungarian notation. This is made public - * for the extensions to provide the same ability as DataTables core to accept - * either the 1.9 style Hungarian notation, or the 1.10+ style camelCase - * parameters. - * - * @param {object} src The model object which holds all parameters that can be - * mapped. - * @param {object} user The object to convert from camel case to Hungarian. - * @param {boolean} force When set to `true`, properties which already have a - * Hungarian value in the `user` object will be overwritten. Otherwise they - * won't be. - */ - DataTable.camelToHungarian = _fnCamelToHungarian; - - - /** - * - */ - _api_register('$()', function (selector, opts) { - var - rows = this.rows(opts).nodes(), // Get all rows - jqRows = $(rows); - - return $([].concat( - jqRows.filter(selector).toArray(), - jqRows.find(selector).toArray() - )); - }); - - - // jQuery functions to operate on the tables - $.each(['on', 'one', 'off'], function (i, key) { - _api_register(key + '()', function ( /* event, handler */) { - var args = Array.prototype.slice.call(arguments); - - // Add the `dt` namespace automatically if it isn't already present - args[0] = $.map(args[0].split(/\s/), function (e) { - return !e.match(/\.dt\b/) ? - e + '.dt' : - e; - }).join(' '); - - var inst = $(this.tables().nodes()); - inst[key].apply(inst, args); - return this; - }); - }); - - - _api_register('clear()', function () { - return this.iterator('table', function (settings) { - _fnClearTable(settings); - }); - }); - - - _api_register('settings()', function () { - return new _Api(this.context, this.context); - }); - - - _api_register('init()', function () { - var ctx = this.context; - return ctx.length ? ctx[0].oInit : null; - }); - - - _api_register('data()', function () { - return this.iterator('table', function (settings) { - return _pluck(settings.aoData, '_aData'); - }).flatten(); - }); - - - _api_register('destroy()', function (remove) { - remove = remove || false; - - return this.iterator('table', function (settings) { - var orig = settings.nTableWrapper.parentNode; - var classes = settings.oClasses; - var table = settings.nTable; - var tbody = settings.nTBody; - var thead = settings.nTHead; - var tfoot = settings.nTFoot; - var jqTable = $(table); - var jqTbody = $(tbody); - var jqWrapper = $(settings.nTableWrapper); - var rows = $.map(settings.aoData, function (r) { - return r.nTr; - }); - var i, ien; - - // Flag to note that the table is currently being destroyed - no action - // should be taken - settings.bDestroying = true; - - // Fire off the destroy callbacks for plug-ins etc - _fnCallbackFire(settings, "aoDestroyCallback", "destroy", [settings]); - - // If not being removed from the document, make all columns visible - if (!remove) { - new _Api(settings).columns().visible(true); - } - - // Blitz all `DT` namespaced events (these are internal events, the - // lowercase, `dt` events are user subscribed and they are responsible - // for removing them - jqWrapper.off('.DT').find(':not(tbody *)').off('.DT'); - $(window).off('.DT-' + settings.sInstance); - - // When scrolling we had to break the table up - restore it - if (table != thead.parentNode) { - jqTable.children('thead').detach(); - jqTable.append(thead); - } - - if (tfoot && table != tfoot.parentNode) { - jqTable.children('tfoot').detach(); - jqTable.append(tfoot); - } - - settings.aaSorting = []; - settings.aaSortingFixed = []; - _fnSortingClasses(settings); - - $(rows).removeClass(settings.asStripeClasses.join(' ')); - - $('th, td', thead).removeClass(classes.sSortable + ' ' + - classes.sSortableAsc + ' ' + classes.sSortableDesc + ' ' + classes.sSortableNone - ); - - // Add the TR elements back into the table in their original order - jqTbody.children().detach(); - jqTbody.append(rows); - - // Remove the DataTables generated nodes, events and classes - var removedMethod = remove ? 'remove' : 'detach'; - jqTable[removedMethod](); - jqWrapper[removedMethod](); - - // If we need to reattach the table to the document - if (!remove && orig) { - // insertBefore acts like appendChild if !arg[1] - orig.insertBefore(table, settings.nTableReinsertBefore); - - // Restore the width of the original table - was read from the style property, - // so we can restore directly to that - jqTable - .css('width', settings.sDestroyWidth) - .removeClass(classes.sTable); - - // If the were originally stripe classes - then we add them back here. - // Note this is not fool proof (for example if not all rows had stripe - // classes - but it's a good effort without getting carried away - ien = settings.asDestroyStripes.length; - - if (ien) { - jqTbody.children().each(function (i) { - $(this).addClass(settings.asDestroyStripes[i % ien]); - }); - } - } - - /* Remove the settings object from the settings array */ - var idx = $.inArray(settings, DataTable.settings); - if (idx !== -1) { - DataTable.settings.splice(idx, 1); - } - }); - }); - - - // Add the `every()` method for rows, columns and cells in a compact form - $.each(['column', 'row', 'cell'], function (i, type) { - _api_register(type + 's().every()', function (fn) { - var opts = this.selector.opts; - var api = this; - - return this.iterator(type, function (settings, arg1, arg2, arg3, arg4) { - // Rows and columns: - // arg1 - index - // arg2 - table counter - // arg3 - loop counter - // arg4 - undefined - // Cells: - // arg1 - row index - // arg2 - column index - // arg3 - table counter - // arg4 - loop counter - fn.call( - api[type]( - arg1, - type === 'cell' ? arg2 : opts, - type === 'cell' ? opts : undefined - ), - arg1, arg2, arg3, arg4 - ); - }); - }); - }); - - - // i18n method for extensions to be able to use the language object from the - // DataTable - _api_register('i18n()', function (token, def, plural) { - var ctx = this.context[0]; - var resolved = _fnGetObjectDataFn(token)(ctx.oLanguage); - - if (resolved === undefined) { - resolved = def; - } - - if (plural !== undefined && $.isPlainObject(resolved)) { - resolved = resolved[plural] !== undefined ? - resolved[plural] : - resolved._; - } - - return resolved.replace('%d', plural); // nb: plural might be undefined, - }); - /** - * Version string for plug-ins to check compatibility. Allowed format is - * `a.b.c-d` where: a:int, b:int, c:int, d:string(dev|beta|alpha). `d` is used - * only for non-release builds. See http://semver.org/ for more information. - * @member - * @type string - * @default Version number - */ - DataTable.version = "1.10.23"; - - /** - * Private data store, containing all of the settings objects that are - * created for the tables on a given page. - * - * Note that the `DataTable.settings` object is aliased to - * `jQuery.fn.dataTableExt` through which it may be accessed and - * manipulated, or `jQuery.fn.dataTable.settings`. - * @member - * @type array - * @default [] - * @private - */ - DataTable.settings = []; - - /** - * Object models container, for the various models that DataTables has - * available to it. These models define the objects that are used to hold - * the active state and configuration of the table. - * @namespace - */ - DataTable.models = {}; - - - /** - * Template object for the way in which DataTables holds information about - * search information for the global filter and individual column filters. - * @namespace - */ - DataTable.models.oSearch = { - /** - * Flag to indicate if the filtering should be case insensitive or not - * @type boolean - * @default true - */ - "bCaseInsensitive": true, - - /** - * Applied search term - * @type string - * @default Empty string - */ - "sSearch": "", - - /** - * Flag to indicate if the search term should be interpreted as a - * regular expression (true) or not (false) and therefore and special - * regex characters escaped. - * @type boolean - * @default false - */ - "bRegex": false, - - /** - * Flag to indicate if DataTables is to use its smart filtering or not. - * @type boolean - * @default true - */ - "bSmart": true - }; - - - /** - * Template object for the way in which DataTables holds information about - * each individual row. This is the object format used for the settings - * aoData array. - * @namespace - */ - DataTable.models.oRow = { - /** - * TR element for the row - * @type node - * @default null - */ - "nTr": null, - - /** - * Array of TD elements for each row. This is null until the row has been - * created. - * @type array nodes - * @default [] - */ - "anCells": null, - - /** - * Data object from the original data source for the row. This is either - * an array if using the traditional form of DataTables, or an object if - * using mData options. The exact type will depend on the passed in - * data from the data source, or will be an array if using DOM a data - * source. - * @type array|object - * @default [] - */ - "_aData": [], - - /** - * Sorting data cache - this array is ostensibly the same length as the - * number of columns (although each index is generated only as it is - * needed), and holds the data that is used for sorting each column in the - * row. We do this cache generation at the start of the sort in order that - * the formatting of the sort data need be done only once for each cell - * per sort. This array should not be read from or written to by anything - * other than the master sorting methods. - * @type array - * @default null - * @private - */ - "_aSortData": null, - - /** - * Per cell filtering data cache. As per the sort data cache, used to - * increase the performance of the filtering in DataTables - * @type array - * @default null - * @private - */ - "_aFilterData": null, - - /** - * Filtering data cache. This is the same as the cell filtering cache, but - * in this case a string rather than an array. This is easily computed with - * a join on `_aFilterData`, but is provided as a cache so the join isn't - * needed on every search (memory traded for performance) - * @type array - * @default null - * @private - */ - "_sFilterRow": null, - - /** - * Cache of the class name that DataTables has applied to the row, so we - * can quickly look at this variable rather than needing to do a DOM check - * on className for the nTr property. - * @type string - * @default Empty string - * @private - */ - "_sRowStripe": "", - - /** - * Denote if the original data source was from the DOM, or the data source - * object. This is used for invalidating data, so DataTables can - * automatically read data from the original source, unless uninstructed - * otherwise. - * @type string - * @default null - * @private - */ - "src": null, - - /** - * Index in the aoData array. This saves an indexOf lookup when we have the - * object, but want to know the index - * @type integer - * @default -1 - * @private - */ - "idx": -1 - }; - - - /** - * Template object for the column information object in DataTables. This object - * is held in the settings aoColumns array and contains all the information that - * DataTables needs about each individual column. - * - * Note that this object is related to {@link DataTable.defaults.column} - * but this one is the internal data store for DataTables's cache of columns. - * It should NOT be manipulated outside of DataTables. Any configuration should - * be done through the initialisation options. - * @namespace - */ - DataTable.models.oColumn = { - /** - * Column index. This could be worked out on-the-fly with $.inArray, but it - * is faster to just hold it as a variable - * @type integer - * @default null - */ - "idx": null, - - /** - * A list of the columns that sorting should occur on when this column - * is sorted. That this property is an array allows multi-column sorting - * to be defined for a column (for example first name / last name columns - * would benefit from this). The values are integers pointing to the - * columns to be sorted on (typically it will be a single integer pointing - * at itself, but that doesn't need to be the case). - * @type array - */ - "aDataSort": null, - - /** - * Define the sorting directions that are applied to the column, in sequence - * as the column is repeatedly sorted upon - i.e. the first value is used - * as the sorting direction when the column if first sorted (clicked on). - * Sort it again (click again) and it will move on to the next index. - * Repeat until loop. - * @type array - */ - "asSorting": null, - - /** - * Flag to indicate if the column is searchable, and thus should be included - * in the filtering or not. - * @type boolean - */ - "bSearchable": null, - - /** - * Flag to indicate if the column is sortable or not. - * @type boolean - */ - "bSortable": null, - - /** - * Flag to indicate if the column is currently visible in the table or not - * @type boolean - */ - "bVisible": null, - - /** - * Store for manual type assignment using the `column.type` option. This - * is held in store so we can manipulate the column's `sType` property. - * @type string - * @default null - * @private - */ - "_sManualType": null, - - /** - * Flag to indicate if HTML5 data attributes should be used as the data - * source for filtering or sorting. True is either are. - * @type boolean - * @default false - * @private - */ - "_bAttrSrc": false, - - /** - * Developer definable function that is called whenever a cell is created (Ajax source, - * etc) or processed for input (DOM source). This can be used as a compliment to mRender - * allowing you to modify the DOM element (add background colour for example) when the - * element is available. - * @type function - * @param {element} nTd The TD node that has been created - * @param {*} sData The Data for the cell - * @param {array|object} oData The data for the whole row - * @param {int} iRow The row index for the aoData data store - * @default null - */ - "fnCreatedCell": null, - - /** - * Function to get data from a cell in a column. You should never - * access data directly through _aData internally in DataTables - always use - * the method attached to this property. It allows mData to function as - * required. This function is automatically assigned by the column - * initialisation method - * @type function - * @param {array|object} oData The data array/object for the array - * (i.e. aoData[]._aData) - * @param {string} sSpecific The specific data type you want to get - - * 'display', 'type' 'filter' 'sort' - * @returns {*} The data for the cell from the given row's data - * @default null - */ - "fnGetData": null, - - /** - * Function to set data for a cell in the column. You should never - * set the data directly to _aData internally in DataTables - always use - * this method. It allows mData to function as required. This function - * is automatically assigned by the column initialisation method - * @type function - * @param {array|object} oData The data array/object for the array - * (i.e. aoData[]._aData) - * @param {*} sValue Value to set - * @default null - */ - "fnSetData": null, - - /** - * Property to read the value for the cells in the column from the data - * source array / object. If null, then the default content is used, if a - * function is given then the return from the function is used. - * @type function|int|string|null - * @default null - */ - "mData": null, - - /** - * Partner property to mData which is used (only when defined) to get - * the data - i.e. it is basically the same as mData, but without the - * 'set' option, and also the data fed to it is the result from mData. - * This is the rendering method to match the data method of mData. - * @type function|int|string|null - * @default null - */ - "mRender": null, - - /** - * Unique header TH/TD element for this column - this is what the sorting - * listener is attached to (if sorting is enabled.) - * @type node - * @default null - */ - "nTh": null, - - /** - * Unique footer TH/TD element for this column (if there is one). Not used - * in DataTables as such, but can be used for plug-ins to reference the - * footer for each column. - * @type node - * @default null - */ - "nTf": null, - - /** - * The class to apply to all TD elements in the table's TBODY for the column - * @type string - * @default null - */ - "sClass": null, - - /** - * When DataTables calculates the column widths to assign to each column, - * it finds the longest string in each column and then constructs a - * temporary table and reads the widths from that. The problem with this - * is that "mmm" is much wider then "iiii", but the latter is a longer - * string - thus the calculation can go wrong (doing it properly and putting - * it into an DOM object and measuring that is horribly(!) slow). Thus as - * a "work around" we provide this option. It will append its value to the - * text that is found to be the longest string for the column - i.e. padding. - * @type string - */ - "sContentPadding": null, - - /** - * Allows a default value to be given for a column's data, and will be used - * whenever a null data source is encountered (this can be because mData - * is set to null, or because the data source itself is null). - * @type string - * @default null - */ - "sDefaultContent": null, - - /** - * Name for the column, allowing reference to the column by name as well as - * by index (needs a lookup to work by name). - * @type string - */ - "sName": null, - - /** - * Custom sorting data type - defines which of the available plug-ins in - * afnSortData the custom sorting will use - if any is defined. - * @type string - * @default std - */ - "sSortDataType": 'std', - - /** - * Class to be applied to the header element when sorting on this column - * @type string - * @default null - */ - "sSortingClass": null, - - /** - * Class to be applied to the header element when sorting on this column - - * when jQuery UI theming is used. - * @type string - * @default null - */ - "sSortingClassJUI": null, - - /** - * Title of the column - what is seen in the TH element (nTh). - * @type string - */ - "sTitle": null, - - /** - * Column sorting and filtering type - * @type string - * @default null - */ - "sType": null, - - /** - * Width of the column - * @type string - * @default null - */ - "sWidth": null, - - /** - * Width of the column when it was first "encountered" - * @type string - * @default null - */ - "sWidthOrig": null - }; - - - /* - * Developer note: The properties of the object below are given in Hungarian - * notation, that was used as the interface for DataTables prior to v1.10, however - * from v1.10 onwards the primary interface is camel case. In order to avoid - * breaking backwards compatibility utterly with this change, the Hungarian - * version is still, internally the primary interface, but is is not documented - * - hence the @name tags in each doc comment. This allows a Javascript function - * to create a map from Hungarian notation to camel case (going the other direction - * would require each property to be listed, which would add around 3K to the size - * of DataTables, while this method is about a 0.5K hit). - * - * Ultimately this does pave the way for Hungarian notation to be dropped - * completely, but that is a massive amount of work and will break current - * installs (therefore is on-hold until v2). - */ - - /** - * Initialisation options that can be given to DataTables at initialisation - * time. - * @namespace - */ - DataTable.defaults = { - /** - * An array of data to use for the table, passed in at initialisation which - * will be used in preference to any data which is already in the DOM. This is - * particularly useful for constructing tables purely in Javascript, for - * example with a custom Ajax call. - * @type array - * @default null - * - * @dtopt Option - * @name DataTable.defaults.data - * - * @example - * // Using a 2D array data source - * $(document).ready( function () { - * $('#example').dataTable( { - * "data": [ - * ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'], - * ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'], - * ], - * "columns": [ - * { "title": "Engine" }, - * { "title": "Browser" }, - * { "title": "Platform" }, - * { "title": "Version" }, - * { "title": "Grade" } - * ] - * } ); - * } ); - * - * @example - * // Using an array of objects as a data source (`data`) - * $(document).ready( function () { - * $('#example').dataTable( { - * "data": [ - * { - * "engine": "Trident", - * "browser": "Internet Explorer 4.0", - * "platform": "Win 95+", - * "version": 4, - * "grade": "X" - * }, - * { - * "engine": "Trident", - * "browser": "Internet Explorer 5.0", - * "platform": "Win 95+", - * "version": 5, - * "grade": "C" - * } - * ], - * "columns": [ - * { "title": "Engine", "data": "engine" }, - * { "title": "Browser", "data": "browser" }, - * { "title": "Platform", "data": "platform" }, - * { "title": "Version", "data": "version" }, - * { "title": "Grade", "data": "grade" } - * ] - * } ); - * } ); - */ - "aaData": null, - - - /** - * If ordering is enabled, then DataTables will perform a first pass sort on - * initialisation. You can define which column(s) the sort is performed - * upon, and the sorting direction, with this variable. The `sorting` array - * should contain an array for each column to be sorted initially containing - * the column's index and a direction string ('asc' or 'desc'). - * @type array - * @default [[0,'asc']] - * - * @dtopt Option - * @name DataTable.defaults.order - * - * @example - * // Sort by 3rd column first, and then 4th column - * $(document).ready( function() { - * $('#example').dataTable( { - * "order": [[2,'asc'], [3,'desc']] - * } ); - * } ); - * - * // No initial sorting - * $(document).ready( function() { - * $('#example').dataTable( { - * "order": [] - * } ); - * } ); - */ - "aaSorting": [[0, 'asc']], - - - /** - * This parameter is basically identical to the `sorting` parameter, but - * cannot be overridden by user interaction with the table. What this means - * is that you could have a column (visible or hidden) which the sorting - * will always be forced on first - any sorting after that (from the user) - * will then be performed as required. This can be useful for grouping rows - * together. - * @type array - * @default null - * - * @dtopt Option - * @name DataTable.defaults.orderFixed - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "orderFixed": [[0,'asc']] - * } ); - * } ) - */ - "aaSortingFixed": [], - - - /** - * DataTables can be instructed to load data to display in the table from a - * Ajax source. This option defines how that Ajax call is made and where to. - * - * The `ajax` property has three different modes of operation, depending on - * how it is defined. These are: - * - * * `string` - Set the URL from where the data should be loaded from. - * * `object` - Define properties for `jQuery.ajax`. - * * `function` - Custom data get function - * - * `string` - * -------- - * - * As a string, the `ajax` property simply defines the URL from which - * DataTables will load data. - * - * `object` - * -------- - * - * As an object, the parameters in the object are passed to - * [jQuery.ajax](http://api.jquery.com/jQuery.ajax/) allowing fine control - * of the Ajax request. DataTables has a number of default parameters which - * you can override using this option. Please refer to the jQuery - * documentation for a full description of the options available, although - * the following parameters provide additional options in DataTables or - * require special consideration: - * - * * `data` - As with jQuery, `data` can be provided as an object, but it - * can also be used as a function to manipulate the data DataTables sends - * to the server. The function takes a single parameter, an object of - * parameters with the values that DataTables has readied for sending. An - * object may be returned which will be merged into the DataTables - * defaults, or you can add the items to the object that was passed in and - * not return anything from the function. This supersedes `fnServerParams` - * from DataTables 1.9-. - * - * * `dataSrc` - By default DataTables will look for the property `data` (or - * `aaData` for compatibility with DataTables 1.9-) when obtaining data - * from an Ajax source or for server-side processing - this parameter - * allows that property to be changed. You can use Javascript dotted - * object notation to get a data source for multiple levels of nesting, or - * it my be used as a function. As a function it takes a single parameter, - * the JSON returned from the server, which can be manipulated as - * required, with the returned value being that used by DataTables as the - * data source for the table. This supersedes `sAjaxDataProp` from - * DataTables 1.9-. - * - * * `success` - Should not be overridden it is used internally in - * DataTables. To manipulate / transform the data returned by the server - * use `ajax.dataSrc`, or use `ajax` as a function (see below). - * - * `function` - * ---------- - * - * As a function, making the Ajax call is left up to yourself allowing - * complete control of the Ajax request. Indeed, if desired, a method other - * than Ajax could be used to obtain the required data, such as Web storage - * or an AIR database. - * - * The function is given four parameters and no return is required. The - * parameters are: - * - * 1. _object_ - Data to send to the server - * 2. _function_ - Callback function that must be executed when the required - * data has been obtained. That data should be passed into the callback - * as the only parameter - * 3. _object_ - DataTables settings object for the table - * - * Note that this supersedes `fnServerData` from DataTables 1.9-. - * - * @type string|object|function - * @default null - * - * @dtopt Option - * @name DataTable.defaults.ajax - * @since 1.10.0 - * - * @example - * // Get JSON data from a file via Ajax. - * // Note DataTables expects data in the form `{ data: [ ...data... ] }` by default). - * $('#example').dataTable( { - * "ajax": "data.json" - * } ); - * - * @example - * // Get JSON data from a file via Ajax, using `dataSrc` to change - * // `data` to `tableData` (i.e. `{ tableData: [ ...data... ] }`) - * $('#example').dataTable( { - * "ajax": { - * "url": "data.json", - * "dataSrc": "tableData" - * } - * } ); - * - * @example - * // Get JSON data from a file via Ajax, using `dataSrc` to read data - * // from a plain array rather than an array in an object - * $('#example').dataTable( { - * "ajax": { - * "url": "data.json", - * "dataSrc": "" - * } - * } ); - * - * @example - * // Manipulate the data returned from the server - add a link to data - * // (note this can, should, be done using `render` for the column - this - * // is just a simple example of how the data can be manipulated). - * $('#example').dataTable( { - * "ajax": { - * "url": "data.json", - * "dataSrc": function ( json ) { - * for ( var i=0, ien=json.length ; iView message'; - * } - * return json; - * } - * } - * } ); - * - * @example - * // Add data to the request - * $('#example').dataTable( { - * "ajax": { - * "url": "data.json", - * "data": function ( d ) { - * return { - * "extra_search": $('#extra').val() - * }; - * } - * } - * } ); - * - * @example - * // Send request as POST - * $('#example').dataTable( { - * "ajax": { - * "url": "data.json", - * "type": "POST" - * } - * } ); - * - * @example - * // Get the data from localStorage (could interface with a form for - * // adding, editing and removing rows). - * $('#example').dataTable( { - * "ajax": function (data, callback, settings) { - * callback( - * JSON.parse( localStorage.getItem('dataTablesData') ) - * ); - * } - * } ); - */ - "ajax": null, - - - /** - * This parameter allows you to readily specify the entries in the length drop - * down menu that DataTables shows when pagination is enabled. It can be - * either a 1D array of options which will be used for both the displayed - * option and the value, or a 2D array which will use the array in the first - * position as the value, and the array in the second position as the - * displayed options (useful for language strings such as 'All'). - * - * Note that the `pageLength` property will be automatically set to the - * first value given in this array, unless `pageLength` is also provided. - * @type array - * @default [ 10, 25, 50, 100 ] - * - * @dtopt Option - * @name DataTable.defaults.lengthMenu - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "lengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]] - * } ); - * } ); - */ - "aLengthMenu": [10, 25, 50, 100], - - - /** - * The `columns` option in the initialisation parameter allows you to define - * details about the way individual columns behave. For a full list of - * column options that can be set, please see - * {@link DataTable.defaults.column}. Note that if you use `columns` to - * define your columns, you must have an entry in the array for every single - * column that you have in your table (these can be null if you don't which - * to specify any options). - * @member - * - * @name DataTable.defaults.column - */ - "aoColumns": null, - - /** - * Very similar to `columns`, `columnDefs` allows you to target a specific - * column, multiple columns, or all columns, using the `targets` property of - * each object in the array. This allows great flexibility when creating - * tables, as the `columnDefs` arrays can be of any length, targeting the - * columns you specifically want. `columnDefs` may use any of the column - * options available: {@link DataTable.defaults.column}, but it _must_ - * have `targets` defined in each object in the array. Values in the `targets` - * array may be: - *
    - *
  • a string - class name will be matched on the TH for the column
  • - *
  • 0 or a positive integer - column index counting from the left
  • - *
  • a negative integer - column index counting from the right
  • - *
  • the string "_all" - all columns (i.e. assign a default)
  • - *
- * @member - * - * @name DataTable.defaults.columnDefs - */ - "aoColumnDefs": null, - - - /** - * Basically the same as `search`, this parameter defines the individual column - * filtering state at initialisation time. The array must be of the same size - * as the number of columns, and each element be an object with the parameters - * `search` and `escapeRegex` (the latter is optional). 'null' is also - * accepted and the default will be used. - * @type array - * @default [] - * - * @dtopt Option - * @name DataTable.defaults.searchCols - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "searchCols": [ - * null, - * { "search": "My filter" }, - * null, - * { "search": "^[0-9]", "escapeRegex": false } - * ] - * } ); - * } ) - */ - "aoSearchCols": [], - - - /** - * An array of CSS classes that should be applied to displayed rows. This - * array may be of any length, and DataTables will apply each class - * sequentially, looping when required. - * @type array - * @default null Will take the values determined by the `oClasses.stripe*` - * options - * - * @dtopt Option - * @name DataTable.defaults.stripeClasses - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "stripeClasses": [ 'strip1', 'strip2', 'strip3' ] - * } ); - * } ) - */ - "asStripeClasses": null, - - - /** - * Enable or disable automatic column width calculation. This can be disabled - * as an optimisation (it takes some time to calculate the widths) if the - * tables widths are passed in using `columns`. - * @type boolean - * @default true - * - * @dtopt Features - * @name DataTable.defaults.autoWidth - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "autoWidth": false - * } ); - * } ); - */ - "bAutoWidth": true, - - - /** - * Deferred rendering can provide DataTables with a huge speed boost when you - * are using an Ajax or JS data source for the table. This option, when set to - * true, will cause DataTables to defer the creation of the table elements for - * each row until they are needed for a draw - saving a significant amount of - * time. - * @type boolean - * @default false - * - * @dtopt Features - * @name DataTable.defaults.deferRender - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "ajax": "sources/arrays.txt", - * "deferRender": true - * } ); - * } ); - */ - "bDeferRender": false, - - - /** - * Replace a DataTable which matches the given selector and replace it with - * one which has the properties of the new initialisation object passed. If no - * table matches the selector, then the new DataTable will be constructed as - * per normal. - * @type boolean - * @default false - * - * @dtopt Options - * @name DataTable.defaults.destroy - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "srollY": "200px", - * "paginate": false - * } ); - * - * // Some time later.... - * $('#example').dataTable( { - * "filter": false, - * "destroy": true - * } ); - * } ); - */ - "bDestroy": false, - - - /** - * Enable or disable filtering of data. Filtering in DataTables is "smart" in - * that it allows the end user to input multiple words (space separated) and - * will match a row containing those words, even if not in the order that was - * specified (this allow matching across multiple columns). Note that if you - * wish to use filtering in DataTables this must remain 'true' - to remove the - * default filtering input box and retain filtering abilities, please use - * {@link DataTable.defaults.dom}. - * @type boolean - * @default true - * - * @dtopt Features - * @name DataTable.defaults.searching - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "searching": false - * } ); - * } ); - */ - "bFilter": true, - - - /** - * Enable or disable the table information display. This shows information - * about the data that is currently visible on the page, including information - * about filtered data if that action is being performed. - * @type boolean - * @default true - * - * @dtopt Features - * @name DataTable.defaults.info - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "info": false - * } ); - * } ); - */ - "bInfo": true, - - - /** - * Allows the end user to select the size of a formatted page from a select - * menu (sizes are 10, 25, 50 and 100). Requires pagination (`paginate`). - * @type boolean - * @default true - * - * @dtopt Features - * @name DataTable.defaults.lengthChange - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "lengthChange": false - * } ); - * } ); - */ - "bLengthChange": true, - - - /** - * Enable or disable pagination. - * @type boolean - * @default true - * - * @dtopt Features - * @name DataTable.defaults.paging - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "paging": false - * } ); - * } ); - */ - "bPaginate": true, - - - /** - * Enable or disable the display of a 'processing' indicator when the table is - * being processed (e.g. a sort). This is particularly useful for tables with - * large amounts of data where it can take a noticeable amount of time to sort - * the entries. - * @type boolean - * @default false - * - * @dtopt Features - * @name DataTable.defaults.processing - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "processing": true - * } ); - * } ); - */ - "bProcessing": false, - - - /** - * Retrieve the DataTables object for the given selector. Note that if the - * table has already been initialised, this parameter will cause DataTables - * to simply return the object that has already been set up - it will not take - * account of any changes you might have made to the initialisation object - * passed to DataTables (setting this parameter to true is an acknowledgement - * that you understand this). `destroy` can be used to reinitialise a table if - * you need. - * @type boolean - * @default false - * - * @dtopt Options - * @name DataTable.defaults.retrieve - * - * @example - * $(document).ready( function() { - * initTable(); - * tableActions(); - * } ); - * - * function initTable () - * { - * return $('#example').dataTable( { - * "scrollY": "200px", - * "paginate": false, - * "retrieve": true - * } ); - * } - * - * function tableActions () - * { - * var table = initTable(); - * // perform API operations with oTable - * } - */ - "bRetrieve": false, - - - /** - * When vertical (y) scrolling is enabled, DataTables will force the height of - * the table's viewport to the given height at all times (useful for layout). - * However, this can look odd when filtering data down to a small data set, - * and the footer is left "floating" further down. This parameter (when - * enabled) will cause DataTables to collapse the table's viewport down when - * the result set will fit within the given Y height. - * @type boolean - * @default false - * - * @dtopt Options - * @name DataTable.defaults.scrollCollapse - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "scrollY": "200", - * "scrollCollapse": true - * } ); - * } ); - */ - "bScrollCollapse": false, - - - /** - * Configure DataTables to use server-side processing. Note that the - * `ajax` parameter must also be given in order to give DataTables a - * source to obtain the required data for each draw. - * @type boolean - * @default false - * - * @dtopt Features - * @dtopt Server-side - * @name DataTable.defaults.serverSide - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "serverSide": true, - * "ajax": "xhr.php" - * } ); - * } ); - */ - "bServerSide": false, - - - /** - * Enable or disable sorting of columns. Sorting of individual columns can be - * disabled by the `sortable` option for each column. - * @type boolean - * @default true - * - * @dtopt Features - * @name DataTable.defaults.ordering - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "ordering": false - * } ); - * } ); - */ - "bSort": true, - - - /** - * Enable or display DataTables' ability to sort multiple columns at the - * same time (activated by shift-click by the user). - * @type boolean - * @default true - * - * @dtopt Options - * @name DataTable.defaults.orderMulti - * - * @example - * // Disable multiple column sorting ability - * $(document).ready( function () { - * $('#example').dataTable( { - * "orderMulti": false - * } ); - * } ); - */ - "bSortMulti": true, - - - /** - * Allows control over whether DataTables should use the top (true) unique - * cell that is found for a single column, or the bottom (false - default). - * This is useful when using complex headers. - * @type boolean - * @default false - * - * @dtopt Options - * @name DataTable.defaults.orderCellsTop - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "orderCellsTop": true - * } ); - * } ); - */ - "bSortCellsTop": false, - - - /** - * Enable or disable the addition of the classes `sorting\_1`, `sorting\_2` and - * `sorting\_3` to the columns which are currently being sorted on. This is - * presented as a feature switch as it can increase processing time (while - * classes are removed and added) so for large data sets you might want to - * turn this off. - * @type boolean - * @default true - * - * @dtopt Features - * @name DataTable.defaults.orderClasses - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "orderClasses": false - * } ); - * } ); - */ - "bSortClasses": true, - - - /** - * Enable or disable state saving. When enabled HTML5 `localStorage` will be - * used to save table display information such as pagination information, - * display length, filtering and sorting. As such when the end user reloads - * the page the display display will match what thy had previously set up. - * - * Due to the use of `localStorage` the default state saving is not supported - * in IE6 or 7. If state saving is required in those browsers, use - * `stateSaveCallback` to provide a storage solution such as cookies. - * @type boolean - * @default false - * - * @dtopt Features - * @name DataTable.defaults.stateSave - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "stateSave": true - * } ); - * } ); - */ - "bStateSave": false, - - - /** - * This function is called when a TR element is created (and all TD child - * elements have been inserted), or registered if using a DOM source, allowing - * manipulation of the TR element (adding classes etc). - * @type function - * @param {node} row "TR" element for the current row - * @param {array} data Raw data array for this row - * @param {int} dataIndex The index of this row in the internal aoData array - * - * @dtopt Callbacks - * @name DataTable.defaults.createdRow - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "createdRow": function( row, data, dataIndex ) { - * // Bold the grade for all 'A' grade browsers - * if ( data[4] == "A" ) - * { - * $('td:eq(4)', row).html( 'A' ); - * } - * } - * } ); - * } ); - */ - "fnCreatedRow": null, - - - /** - * This function is called on every 'draw' event, and allows you to - * dynamically modify any aspect you want about the created DOM. - * @type function - * @param {object} settings DataTables settings object - * - * @dtopt Callbacks - * @name DataTable.defaults.drawCallback - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "drawCallback": function( settings ) { - * alert( 'DataTables has redrawn the table' ); - * } - * } ); - * } ); - */ - "fnDrawCallback": null, - - - /** - * Identical to fnHeaderCallback() but for the table footer this function - * allows you to modify the table footer on every 'draw' event. - * @type function - * @param {node} foot "TR" element for the footer - * @param {array} data Full table data (as derived from the original HTML) - * @param {int} start Index for the current display starting point in the - * display array - * @param {int} end Index for the current display ending point in the - * display array - * @param {array int} display Index array to translate the visual position - * to the full data array - * - * @dtopt Callbacks - * @name DataTable.defaults.footerCallback - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "footerCallback": function( tfoot, data, start, end, display ) { - * tfoot.getElementsByTagName('th')[0].innerHTML = "Starting index is "+start; - * } - * } ); - * } ) - */ - "fnFooterCallback": null, - - - /** - * When rendering large numbers in the information element for the table - * (i.e. "Showing 1 to 10 of 57 entries") DataTables will render large numbers - * to have a comma separator for the 'thousands' units (e.g. 1 million is - * rendered as "1,000,000") to help readability for the end user. This - * function will override the default method DataTables uses. - * @type function - * @member - * @param {int} toFormat number to be formatted - * @returns {string} formatted string for DataTables to show the number - * - * @dtopt Callbacks - * @name DataTable.defaults.formatNumber - * - * @example - * // Format a number using a single quote for the separator (note that - * // this can also be done with the language.thousands option) - * $(document).ready( function() { - * $('#example').dataTable( { - * "formatNumber": function ( toFormat ) { - * return toFormat.toString().replace( - * /\B(?=(\d{3})+(?!\d))/g, "'" - * ); - * }; - * } ); - * } ); - */ - "fnFormatNumber": function (toFormat) { - return toFormat.toString().replace( - /\B(?=(\d{3})+(?!\d))/g, - this.oLanguage.sThousands - ); - }, - - - /** - * This function is called on every 'draw' event, and allows you to - * dynamically modify the header row. This can be used to calculate and - * display useful information about the table. - * @type function - * @param {node} head "TR" element for the header - * @param {array} data Full table data (as derived from the original HTML) - * @param {int} start Index for the current display starting point in the - * display array - * @param {int} end Index for the current display ending point in the - * display array - * @param {array int} display Index array to translate the visual position - * to the full data array - * - * @dtopt Callbacks - * @name DataTable.defaults.headerCallback - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "fheaderCallback": function( head, data, start, end, display ) { - * head.getElementsByTagName('th')[0].innerHTML = "Displaying "+(end-start)+" records"; - * } - * } ); - * } ) - */ - "fnHeaderCallback": null, - - - /** - * The information element can be used to convey information about the current - * state of the table. Although the internationalisation options presented by - * DataTables are quite capable of dealing with most customisations, there may - * be times where you wish to customise the string further. This callback - * allows you to do exactly that. - * @type function - * @param {object} oSettings DataTables settings object - * @param {int} start Starting position in data for the draw - * @param {int} end End position in data for the draw - * @param {int} max Total number of rows in the table (regardless of - * filtering) - * @param {int} total Total number of rows in the data set, after filtering - * @param {string} pre The string that DataTables has formatted using it's - * own rules - * @returns {string} The string to be displayed in the information element. - * - * @dtopt Callbacks - * @name DataTable.defaults.infoCallback - * - * @example - * $('#example').dataTable( { - * "infoCallback": function( settings, start, end, max, total, pre ) { - * return start +" to "+ end; - * } - * } ); - */ - "fnInfoCallback": null, - - - /** - * Called when the table has been initialised. Normally DataTables will - * initialise sequentially and there will be no need for this function, - * however, this does not hold true when using external language information - * since that is obtained using an async XHR call. - * @type function - * @param {object} settings DataTables settings object - * @param {object} json The JSON object request from the server - only - * present if client-side Ajax sourced data is used - * - * @dtopt Callbacks - * @name DataTable.defaults.initComplete - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "initComplete": function(settings, json) { - * alert( 'DataTables has finished its initialisation.' ); - * } - * } ); - * } ) - */ - "fnInitComplete": null, - - - /** - * Called at the very start of each table draw and can be used to cancel the - * draw by returning false, any other return (including undefined) results in - * the full draw occurring). - * @type function - * @param {object} settings DataTables settings object - * @returns {boolean} False will cancel the draw, anything else (including no - * return) will allow it to complete. - * - * @dtopt Callbacks - * @name DataTable.defaults.preDrawCallback - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "preDrawCallback": function( settings ) { - * if ( $('#test').val() == 1 ) { - * return false; - * } - * } - * } ); - * } ); - */ - "fnPreDrawCallback": null, - - - /** - * This function allows you to 'post process' each row after it have been - * generated for each table draw, but before it is rendered on screen. This - * function might be used for setting the row class name etc. - * @type function - * @param {node} row "TR" element for the current row - * @param {array} data Raw data array for this row - * @param {int} displayIndex The display index for the current table draw - * @param {int} displayIndexFull The index of the data in the full list of - * rows (after filtering) - * - * @dtopt Callbacks - * @name DataTable.defaults.rowCallback - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "rowCallback": function( row, data, displayIndex, displayIndexFull ) { - * // Bold the grade for all 'A' grade browsers - * if ( data[4] == "A" ) { - * $('td:eq(4)', row).html( 'A' ); - * } - * } - * } ); - * } ); - */ - "fnRowCallback": null, - - - /** - * __Deprecated__ The functionality provided by this parameter has now been - * superseded by that provided through `ajax`, which should be used instead. - * - * This parameter allows you to override the default function which obtains - * the data from the server so something more suitable for your application. - * For example you could use POST data, or pull information from a Gears or - * AIR database. - * @type function - * @member - * @param {string} source HTTP source to obtain the data from (`ajax`) - * @param {array} data A key/value pair object containing the data to send - * to the server - * @param {function} callback to be called on completion of the data get - * process that will draw the data on the page. - * @param {object} settings DataTables settings object - * - * @dtopt Callbacks - * @dtopt Server-side - * @name DataTable.defaults.serverData - * - * @deprecated 1.10. Please use `ajax` for this functionality now. - */ - "fnServerData": null, - - - /** - * __Deprecated__ The functionality provided by this parameter has now been - * superseded by that provided through `ajax`, which should be used instead. - * - * It is often useful to send extra data to the server when making an Ajax - * request - for example custom filtering information, and this callback - * function makes it trivial to send extra information to the server. The - * passed in parameter is the data set that has been constructed by - * DataTables, and you can add to this or modify it as you require. - * @type function - * @param {array} data Data array (array of objects which are name/value - * pairs) that has been constructed by DataTables and will be sent to the - * server. In the case of Ajax sourced data with server-side processing - * this will be an empty array, for server-side processing there will be a - * significant number of parameters! - * @returns {undefined} Ensure that you modify the data array passed in, - * as this is passed by reference. - * - * @dtopt Callbacks - * @dtopt Server-side - * @name DataTable.defaults.serverParams - * - * @deprecated 1.10. Please use `ajax` for this functionality now. - */ - "fnServerParams": null, - - - /** - * Load the table state. With this function you can define from where, and how, the - * state of a table is loaded. By default DataTables will load from `localStorage` - * but you might wish to use a server-side database or cookies. - * @type function - * @member - * @param {object} settings DataTables settings object - * @param {object} callback Callback that can be executed when done. It - * should be passed the loaded state object. - * @return {object} The DataTables state object to be loaded - * - * @dtopt Callbacks - * @name DataTable.defaults.stateLoadCallback - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "stateSave": true, - * "stateLoadCallback": function (settings, callback) { - * $.ajax( { - * "url": "/state_load", - * "dataType": "json", - * "success": function (json) { - * callback( json ); - * } - * } ); - * } - * } ); - * } ); - */ - "fnStateLoadCallback": function (settings) { - try { - return JSON.parse( - (settings.iStateDuration === -1 ? sessionStorage : localStorage).getItem( - 'DataTables_' + settings.sInstance + '_' + location.pathname - ) - ); - } catch (e) { - return {}; - } - }, - - - /** - * Callback which allows modification of the saved state prior to loading that state. - * This callback is called when the table is loading state from the stored data, but - * prior to the settings object being modified by the saved state. Note that for - * plug-in authors, you should use the `stateLoadParams` event to load parameters for - * a plug-in. - * @type function - * @param {object} settings DataTables settings object - * @param {object} data The state object that is to be loaded - * - * @dtopt Callbacks - * @name DataTable.defaults.stateLoadParams - * - * @example - * // Remove a saved filter, so filtering is never loaded - * $(document).ready( function() { - * $('#example').dataTable( { - * "stateSave": true, - * "stateLoadParams": function (settings, data) { - * data.oSearch.sSearch = ""; - * } - * } ); - * } ); - * - * @example - * // Disallow state loading by returning false - * $(document).ready( function() { - * $('#example').dataTable( { - * "stateSave": true, - * "stateLoadParams": function (settings, data) { - * return false; - * } - * } ); - * } ); - */ - "fnStateLoadParams": null, - - - /** - * Callback that is called when the state has been loaded from the state saving method - * and the DataTables settings object has been modified as a result of the loaded state. - * @type function - * @param {object} settings DataTables settings object - * @param {object} data The state object that was loaded - * - * @dtopt Callbacks - * @name DataTable.defaults.stateLoaded - * - * @example - * // Show an alert with the filtering value that was saved - * $(document).ready( function() { - * $('#example').dataTable( { - * "stateSave": true, - * "stateLoaded": function (settings, data) { - * alert( 'Saved filter was: '+data.oSearch.sSearch ); - * } - * } ); - * } ); - */ - "fnStateLoaded": null, - - - /** - * Save the table state. This function allows you to define where and how the state - * information for the table is stored By default DataTables will use `localStorage` - * but you might wish to use a server-side database or cookies. - * @type function - * @member - * @param {object} settings DataTables settings object - * @param {object} data The state object to be saved - * - * @dtopt Callbacks - * @name DataTable.defaults.stateSaveCallback - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "stateSave": true, - * "stateSaveCallback": function (settings, data) { - * // Send an Ajax request to the server with the state object - * $.ajax( { - * "url": "/state_save", - * "data": data, - * "dataType": "json", - * "method": "POST" - * "success": function () {} - * } ); - * } - * } ); - * } ); - */ - "fnStateSaveCallback": function (settings, data) { - try { - (settings.iStateDuration === -1 ? sessionStorage : localStorage).setItem( - 'DataTables_' + settings.sInstance + '_' + location.pathname, - JSON.stringify(data) - ); - } catch (e) { - } - }, - - - /** - * Callback which allows modification of the state to be saved. Called when the table - * has changed state a new state save is required. This method allows modification of - * the state saving object prior to actually doing the save, including addition or - * other state properties or modification. Note that for plug-in authors, you should - * use the `stateSaveParams` event to save parameters for a plug-in. - * @type function - * @param {object} settings DataTables settings object - * @param {object} data The state object to be saved - * - * @dtopt Callbacks - * @name DataTable.defaults.stateSaveParams - * - * @example - * // Remove a saved filter, so filtering is never saved - * $(document).ready( function() { - * $('#example').dataTable( { - * "stateSave": true, - * "stateSaveParams": function (settings, data) { - * data.oSearch.sSearch = ""; - * } - * } ); - * } ); - */ - "fnStateSaveParams": null, - - - /** - * Duration for which the saved state information is considered valid. After this period - * has elapsed the state will be returned to the default. - * Value is given in seconds. - * @type int - * @default 7200 (2 hours) - * - * @dtopt Options - * @name DataTable.defaults.stateDuration - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "stateDuration": 60*60*24; // 1 day - * } ); - * } ) - */ - "iStateDuration": 7200, - - - /** - * When enabled DataTables will not make a request to the server for the first - * page draw - rather it will use the data already on the page (no sorting etc - * will be applied to it), thus saving on an XHR at load time. `deferLoading` - * is used to indicate that deferred loading is required, but it is also used - * to tell DataTables how many records there are in the full table (allowing - * the information element and pagination to be displayed correctly). In the case - * where a filtering is applied to the table on initial load, this can be - * indicated by giving the parameter as an array, where the first element is - * the number of records available after filtering and the second element is the - * number of records without filtering (allowing the table information element - * to be shown correctly). - * @type int | array - * @default null - * - * @dtopt Options - * @name DataTable.defaults.deferLoading - * - * @example - * // 57 records available in the table, no filtering applied - * $(document).ready( function() { - * $('#example').dataTable( { - * "serverSide": true, - * "ajax": "scripts/server_processing.php", - * "deferLoading": 57 - * } ); - * } ); - * - * @example - * // 57 records after filtering, 100 without filtering (an initial filter applied) - * $(document).ready( function() { - * $('#example').dataTable( { - * "serverSide": true, - * "ajax": "scripts/server_processing.php", - * "deferLoading": [ 57, 100 ], - * "search": { - * "search": "my_filter" - * } - * } ); - * } ); - */ - "iDeferLoading": null, - - - /** - * Number of rows to display on a single page when using pagination. If - * feature enabled (`lengthChange`) then the end user will be able to override - * this to a custom setting using a pop-up menu. - * @type int - * @default 10 - * - * @dtopt Options - * @name DataTable.defaults.pageLength - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "pageLength": 50 - * } ); - * } ) - */ - "iDisplayLength": 10, - - - /** - * Define the starting point for data display when using DataTables with - * pagination. Note that this parameter is the number of records, rather than - * the page number, so if you have 10 records per page and want to start on - * the third page, it should be "20". - * @type int - * @default 0 - * - * @dtopt Options - * @name DataTable.defaults.displayStart - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "displayStart": 20 - * } ); - * } ) - */ - "iDisplayStart": 0, - - - /** - * By default DataTables allows keyboard navigation of the table (sorting, paging, - * and filtering) by adding a `tabindex` attribute to the required elements. This - * allows you to tab through the controls and press the enter key to activate them. - * The tabindex is default 0, meaning that the tab follows the flow of the document. - * You can overrule this using this parameter if you wish. Use a value of -1 to - * disable built-in keyboard navigation. - * @type int - * @default 0 - * - * @dtopt Options - * @name DataTable.defaults.tabIndex - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "tabIndex": 1 - * } ); - * } ); - */ - "iTabIndex": 0, - - - /** - * Classes that DataTables assigns to the various components and features - * that it adds to the HTML table. This allows classes to be configured - * during initialisation in addition to through the static - * {@link DataTable.ext.oStdClasses} object). - * @namespace - * @name DataTable.defaults.classes - */ - "oClasses": {}, - - - /** - * All strings that DataTables uses in the user interface that it creates - * are defined in this object, allowing you to modified them individually or - * completely replace them all as required. - * @namespace - * @name DataTable.defaults.language - */ - "oLanguage": { - /** - * Strings that are used for WAI-ARIA labels and controls only (these are not - * actually visible on the page, but will be read by screenreaders, and thus - * must be internationalised as well). - * @namespace - * @name DataTable.defaults.language.aria - */ - "oAria": { - /** - * ARIA label that is added to the table headers when the column may be - * sorted ascending by activing the column (click or return when focused). - * Note that the column header is prefixed to this string. - * @type string - * @default : activate to sort column ascending - * - * @dtopt Language - * @name DataTable.defaults.language.aria.sortAscending - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "aria": { - * "sortAscending": " - click/return to sort ascending" - * } - * } - * } ); - * } ); - */ - "sSortAscending": ": activate to sort column ascending", - - /** - * ARIA label that is added to the table headers when the column may be - * sorted descending by activing the column (click or return when focused). - * Note that the column header is prefixed to this string. - * @type string - * @default : activate to sort column ascending - * - * @dtopt Language - * @name DataTable.defaults.language.aria.sortDescending - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "aria": { - * "sortDescending": " - click/return to sort descending" - * } - * } - * } ); - * } ); - */ - "sSortDescending": ": activate to sort column descending" - }, - - /** - * Pagination string used by DataTables for the built-in pagination - * control types. - * @namespace - * @name DataTable.defaults.language.paginate - */ - "oPaginate": { - /** - * Text to use when using the 'full_numbers' type of pagination for the - * button to take the user to the first page. - * @type string - * @default First - * - * @dtopt Language - * @name DataTable.defaults.language.paginate.first - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "paginate": { - * "first": "First page" - * } - * } - * } ); - * } ); - */ - "sFirst": "First", - - - /** - * Text to use when using the 'full_numbers' type of pagination for the - * button to take the user to the last page. - * @type string - * @default Last - * - * @dtopt Language - * @name DataTable.defaults.language.paginate.last - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "paginate": { - * "last": "Last page" - * } - * } - * } ); - * } ); - */ - "sLast": "Last", - - - /** - * Text to use for the 'next' pagination button (to take the user to the - * next page). - * @type string - * @default Next - * - * @dtopt Language - * @name DataTable.defaults.language.paginate.next - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "paginate": { - * "next": "Next page" - * } - * } - * } ); - * } ); - */ - "sNext": "Next", - - - /** - * Text to use for the 'previous' pagination button (to take the user to - * the previous page). - * @type string - * @default Previous - * - * @dtopt Language - * @name DataTable.defaults.language.paginate.previous - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "paginate": { - * "previous": "Previous page" - * } - * } - * } ); - * } ); - */ - "sPrevious": "Previous" - }, - - /** - * This string is shown in preference to `zeroRecords` when the table is - * empty of data (regardless of filtering). Note that this is an optional - * parameter - if it is not given, the value of `zeroRecords` will be used - * instead (either the default or given value). - * @type string - * @default No data available in table - * - * @dtopt Language - * @name DataTable.defaults.language.emptyTable - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "emptyTable": "No data available in table" - * } - * } ); - * } ); - */ - "sEmptyTable": "No data available in table", - - - /** - * This string gives information to the end user about the information - * that is current on display on the page. The following tokens can be - * used in the string and will be dynamically replaced as the table - * display updates. This tokens can be placed anywhere in the string, or - * removed as needed by the language requires: - * - * * `\_START\_` - Display index of the first record on the current page - * * `\_END\_` - Display index of the last record on the current page - * * `\_TOTAL\_` - Number of records in the table after filtering - * * `\_MAX\_` - Number of records in the table without filtering - * * `\_PAGE\_` - Current page number - * * `\_PAGES\_` - Total number of pages of data in the table - * - * @type string - * @default Showing _START_ to _END_ of _TOTAL_ entries - * - * @dtopt Language - * @name DataTable.defaults.language.info - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "info": "Showing page _PAGE_ of _PAGES_" - * } - * } ); - * } ); - */ - "sInfo": "Showing _START_ to _END_ of _TOTAL_ entries", - - - /** - * Display information string for when the table is empty. Typically the - * format of this string should match `info`. - * @type string - * @default Showing 0 to 0 of 0 entries - * - * @dtopt Language - * @name DataTable.defaults.language.infoEmpty - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "infoEmpty": "No entries to show" - * } - * } ); - * } ); - */ - "sInfoEmpty": "Showing 0 to 0 of 0 entries", - - - /** - * When a user filters the information in a table, this string is appended - * to the information (`info`) to give an idea of how strong the filtering - * is. The variable _MAX_ is dynamically updated. - * @type string - * @default (filtered from _MAX_ total entries) - * - * @dtopt Language - * @name DataTable.defaults.language.infoFiltered - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "infoFiltered": " - filtering from _MAX_ records" - * } - * } ); - * } ); - */ - "sInfoFiltered": "(filtered from _MAX_ total entries)", - - - /** - * If can be useful to append extra information to the info string at times, - * and this variable does exactly that. This information will be appended to - * the `info` (`infoEmpty` and `infoFiltered` in whatever combination they are - * being used) at all times. - * @type string - * @default Empty string - * - * @dtopt Language - * @name DataTable.defaults.language.infoPostFix - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "infoPostFix": "All records shown are derived from real information." - * } - * } ); - * } ); - */ - "sInfoPostFix": "", - - - /** - * This decimal place operator is a little different from the other - * language options since DataTables doesn't output floating point - * numbers, so it won't ever use this for display of a number. Rather, - * what this parameter does is modify the sort methods of the table so - * that numbers which are in a format which has a character other than - * a period (`.`) as a decimal place will be sorted numerically. - * - * Note that numbers with different decimal places cannot be shown in - * the same table and still be sortable, the table must be consistent. - * However, multiple different tables on the page can use different - * decimal place characters. - * @type string - * @default - * - * @dtopt Language - * @name DataTable.defaults.language.decimal - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "decimal": "," - * "thousands": "." - * } - * } ); - * } ); - */ - "sDecimal": "", - - - /** - * DataTables has a build in number formatter (`formatNumber`) which is - * used to format large numbers that are used in the table information. - * By default a comma is used, but this can be trivially changed to any - * character you wish with this parameter. - * @type string - * @default , - * - * @dtopt Language - * @name DataTable.defaults.language.thousands - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "thousands": "'" - * } - * } ); - * } ); - */ - "sThousands": ",", - - - /** - * Detail the action that will be taken when the drop down menu for the - * pagination length option is changed. The '_MENU_' variable is replaced - * with a default select list of 10, 25, 50 and 100, and can be replaced - * with a custom select box if required. - * @type string - * @default Show _MENU_ entries - * - * @dtopt Language - * @name DataTable.defaults.language.lengthMenu - * - * @example - * // Language change only - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "lengthMenu": "Display _MENU_ records" - * } - * } ); - * } ); - * - * @example - * // Language and options change - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "lengthMenu": 'Display records' - * } - * } ); - * } ); - */ - "sLengthMenu": "Show _MENU_ entries", - - - /** - * When using Ajax sourced data and during the first draw when DataTables is - * gathering the data, this message is shown in an empty row in the table to - * indicate to the end user the the data is being loaded. Note that this - * parameter is not used when loading data by server-side processing, just - * Ajax sourced data with client-side processing. - * @type string - * @default Loading... - * - * @dtopt Language - * @name DataTable.defaults.language.loadingRecords - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "loadingRecords": "Please wait - loading..." - * } - * } ); - * } ); - */ - "sLoadingRecords": "Loading...", - - - /** - * Text which is displayed when the table is processing a user action - * (usually a sort command or similar). - * @type string - * @default Processing... - * - * @dtopt Language - * @name DataTable.defaults.language.processing - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "processing": "DataTables is currently busy" - * } - * } ); - * } ); - */ - "sProcessing": "Processing...", - - - /** - * Details the actions that will be taken when the user types into the - * filtering input text box. The variable "_INPUT_", if used in the string, - * is replaced with the HTML text box for the filtering input allowing - * control over where it appears in the string. If "_INPUT_" is not given - * then the input box is appended to the string automatically. - * @type string - * @default Search: - * - * @dtopt Language - * @name DataTable.defaults.language.search - * - * @example - * // Input text box will be appended at the end automatically - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "search": "Filter records:" - * } - * } ); - * } ); - * - * @example - * // Specify where the filter should appear - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "search": "Apply filter _INPUT_ to table" - * } - * } ); - * } ); - */ - "sSearch": "Search:", - - - /** - * Assign a `placeholder` attribute to the search `input` element - * @type string - * @default - * - * @dtopt Language - * @name DataTable.defaults.language.searchPlaceholder - */ - "sSearchPlaceholder": "", - - - /** - * All of the language information can be stored in a file on the - * server-side, which DataTables will look up if this parameter is passed. - * It must store the URL of the language file, which is in a JSON format, - * and the object has the same properties as the oLanguage object in the - * initialiser object (i.e. the above parameters). Please refer to one of - * the example language files to see how this works in action. - * @type string - * @default Empty string - i.e. disabled - * - * @dtopt Language - * @name DataTable.defaults.language.url - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "url": "http://www.sprymedia.co.uk/dataTables/lang.txt" - * } - * } ); - * } ); - */ - "sUrl": "", - - - /** - * Text shown inside the table records when the is no information to be - * displayed after filtering. `emptyTable` is shown when there is simply no - * information in the table at all (regardless of filtering). - * @type string - * @default No matching records found - * - * @dtopt Language - * @name DataTable.defaults.language.zeroRecords - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "zeroRecords": "No records to display" - * } - * } ); - * } ); - */ - "sZeroRecords": "No matching records found" - }, - - - /** - * This parameter allows you to have define the global filtering state at - * initialisation time. As an object the `search` parameter must be - * defined, but all other parameters are optional. When `regex` is true, - * the search string will be treated as a regular expression, when false - * (default) it will be treated as a straight string. When `smart` - * DataTables will use it's smart filtering methods (to word match at - * any point in the data), when false this will not be done. - * @namespace - * @extends DataTable.models.oSearch - * - * @dtopt Options - * @name DataTable.defaults.search - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "search": {"search": "Initial search"} - * } ); - * } ) - */ - "oSearch": $.extend({}, DataTable.models.oSearch), - - - /** - * __Deprecated__ The functionality provided by this parameter has now been - * superseded by that provided through `ajax`, which should be used instead. - * - * By default DataTables will look for the property `data` (or `aaData` for - * compatibility with DataTables 1.9-) when obtaining data from an Ajax - * source or for server-side processing - this parameter allows that - * property to be changed. You can use Javascript dotted object notation to - * get a data source for multiple levels of nesting. - * @type string - * @default data - * - * @dtopt Options - * @dtopt Server-side - * @name DataTable.defaults.ajaxDataProp - * - * @deprecated 1.10. Please use `ajax` for this functionality now. - */ - "sAjaxDataProp": "data", - - - /** - * __Deprecated__ The functionality provided by this parameter has now been - * superseded by that provided through `ajax`, which should be used instead. - * - * You can instruct DataTables to load data from an external - * source using this parameter (use aData if you want to pass data in you - * already have). Simply provide a url a JSON object can be obtained from. - * @type string - * @default null - * - * @dtopt Options - * @dtopt Server-side - * @name DataTable.defaults.ajaxSource - * - * @deprecated 1.10. Please use `ajax` for this functionality now. - */ - "sAjaxSource": null, - - - /** - * This initialisation variable allows you to specify exactly where in the - * DOM you want DataTables to inject the various controls it adds to the page - * (for example you might want the pagination controls at the top of the - * table). DIV elements (with or without a custom class) can also be added to - * aid styling. The follow syntax is used: - *
    - *
  • The following options are allowed: - *
      - *
    • 'l' - Length changing
    • - *
    • 'f' - Filtering input
    • - *
    • 't' - The table!
    • - *
    • 'i' - Information
    • - *
    • 'p' - Pagination
    • - *
    • 'r' - pRocessing
    • - *
    - *
  • - *
  • The following constants are allowed: - *
      - *
    • 'H' - jQueryUI theme "header" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')
    • - *
    • 'F' - jQueryUI theme "footer" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')
    • - *
    - *
  • - *
  • The following syntax is expected: - *
      - *
    • '<' and '>' - div elements
    • - *
    • '<"class" and '>' - div with a class
    • - *
    • '<"#id" and '>' - div with an ID
    • - *
    - *
  • - *
  • Examples: - *
      - *
    • '<"wrapper"flipt>'
    • - *
    • '<lf<t>ip>'
    • - *
    - *
  • - *
- * @type string - * @default lfrtip (when `jQueryUI` is false)or - * <"H"lfr>t<"F"ip> (when `jQueryUI` is true) - * - * @dtopt Options - * @name DataTable.defaults.dom - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "dom": '<"top"i>rt<"bottom"flp><"clear">' - * } ); - * } ); - */ - "sDom": "lfrtip", - - - /** - * Search delay option. This will throttle full table searches that use the - * DataTables provided search input element (it does not effect calls to - * `dt-api search()`, providing a delay before the search is made. - * @type integer - * @default 0 - * - * @dtopt Options - * @name DataTable.defaults.searchDelay - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "searchDelay": 200 - * } ); - * } ) - */ - "searchDelay": null, - - - /** - * DataTables features six different built-in options for the buttons to - * display for pagination control: - * - * * `numbers` - Page number buttons only - * * `simple` - 'Previous' and 'Next' buttons only - * * 'simple_numbers` - 'Previous' and 'Next' buttons, plus page numbers - * * `full` - 'First', 'Previous', 'Next' and 'Last' buttons - * * `full_numbers` - 'First', 'Previous', 'Next' and 'Last' buttons, plus page numbers - * * `first_last_numbers` - 'First' and 'Last' buttons, plus page numbers - * - * Further methods can be added using {@link DataTable.ext.oPagination}. - * @type string - * @default simple_numbers - * - * @dtopt Options - * @name DataTable.defaults.pagingType - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "pagingType": "full_numbers" - * } ); - * } ) - */ - "sPaginationType": "simple_numbers", - - - /** - * Enable horizontal scrolling. When a table is too wide to fit into a - * certain layout, or you have a large number of columns in the table, you - * can enable x-scrolling to show the table in a viewport, which can be - * scrolled. This property can be `true` which will allow the table to - * scroll horizontally when needed, or any CSS unit, or a number (in which - * case it will be treated as a pixel measurement). Setting as simply `true` - * is recommended. - * @type boolean|string - * @default blank string - i.e. disabled - * - * @dtopt Features - * @name DataTable.defaults.scrollX - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "scrollX": true, - * "scrollCollapse": true - * } ); - * } ); - */ - "sScrollX": "", - - - /** - * This property can be used to force a DataTable to use more width than it - * might otherwise do when x-scrolling is enabled. For example if you have a - * table which requires to be well spaced, this parameter is useful for - * "over-sizing" the table, and thus forcing scrolling. This property can by - * any CSS unit, or a number (in which case it will be treated as a pixel - * measurement). - * @type string - * @default blank string - i.e. disabled - * - * @dtopt Options - * @name DataTable.defaults.scrollXInner - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "scrollX": "100%", - * "scrollXInner": "110%" - * } ); - * } ); - */ - "sScrollXInner": "", - - - /** - * Enable vertical scrolling. Vertical scrolling will constrain the DataTable - * to the given height, and enable scrolling for any data which overflows the - * current viewport. This can be used as an alternative to paging to display - * a lot of data in a small area (although paging and scrolling can both be - * enabled at the same time). This property can be any CSS unit, or a number - * (in which case it will be treated as a pixel measurement). - * @type string - * @default blank string - i.e. disabled - * - * @dtopt Features - * @name DataTable.defaults.scrollY - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "scrollY": "200px", - * "paginate": false - * } ); - * } ); - */ - "sScrollY": "", - - - /** - * __Deprecated__ The functionality provided by this parameter has now been - * superseded by that provided through `ajax`, which should be used instead. - * - * Set the HTTP method that is used to make the Ajax call for server-side - * processing or Ajax sourced data. - * @type string - * @default GET - * - * @dtopt Options - * @dtopt Server-side - * @name DataTable.defaults.serverMethod - * - * @deprecated 1.10. Please use `ajax` for this functionality now. - */ - "sServerMethod": "GET", - - - /** - * DataTables makes use of renderers when displaying HTML elements for - * a table. These renderers can be added or modified by plug-ins to - * generate suitable mark-up for a site. For example the Bootstrap - * integration plug-in for DataTables uses a paging button renderer to - * display pagination buttons in the mark-up required by Bootstrap. - * - * For further information about the renderers available see - * DataTable.ext.renderer - * @type string|object - * @default null - * - * @name DataTable.defaults.renderer - * - */ - "renderer": null, - - - /** - * Set the data property name that DataTables should use to get a row's id - * to set as the `id` property in the node. - * @type string - * @default DT_RowId - * - * @name DataTable.defaults.rowId - */ - "rowId": "DT_RowId" - }; - - _fnHungarianMap(DataTable.defaults); - - - /* - * Developer note - See note in model.defaults.js about the use of Hungarian - * notation and camel case. - */ - - /** - * Column options that can be given to DataTables at initialisation time. - * @namespace - */ - DataTable.defaults.column = { - /** - * Define which column(s) an order will occur on for this column. This - * allows a column's ordering to take multiple columns into account when - * doing a sort or use the data from a different column. For example first - * name / last name columns make sense to do a multi-column sort over the - * two columns. - * @type array|int - * @default null Takes the value of the column index automatically - * - * @name DataTable.defaults.column.orderData - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "orderData": [ 0, 1 ], "targets": [ 0 ] }, - * { "orderData": [ 1, 0 ], "targets": [ 1 ] }, - * { "orderData": 2, "targets": [ 2 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "orderData": [ 0, 1 ] }, - * { "orderData": [ 1, 0 ] }, - * { "orderData": 2 }, - * null, - * null - * ] - * } ); - * } ); - */ - "aDataSort": null, - "iDataSort": -1, - - - /** - * You can control the default ordering direction, and even alter the - * behaviour of the sort handler (i.e. only allow ascending ordering etc) - * using this parameter. - * @type array - * @default [ 'asc', 'desc' ] - * - * @name DataTable.defaults.column.orderSequence - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "orderSequence": [ "asc" ], "targets": [ 1 ] }, - * { "orderSequence": [ "desc", "asc", "asc" ], "targets": [ 2 ] }, - * { "orderSequence": [ "desc" ], "targets": [ 3 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * null, - * { "orderSequence": [ "asc" ] }, - * { "orderSequence": [ "desc", "asc", "asc" ] }, - * { "orderSequence": [ "desc" ] }, - * null - * ] - * } ); - * } ); - */ - "asSorting": ['asc', 'desc'], - - - /** - * Enable or disable filtering on the data in this column. - * @type boolean - * @default true - * - * @name DataTable.defaults.column.searchable - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "searchable": false, "targets": [ 0 ] } - * ] } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "searchable": false }, - * null, - * null, - * null, - * null - * ] } ); - * } ); - */ - "bSearchable": true, - - - /** - * Enable or disable ordering on this column. - * @type boolean - * @default true - * - * @name DataTable.defaults.column.orderable - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "orderable": false, "targets": [ 0 ] } - * ] } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "orderable": false }, - * null, - * null, - * null, - * null - * ] } ); - * } ); - */ - "bSortable": true, - - - /** - * Enable or disable the display of this column. - * @type boolean - * @default true - * - * @name DataTable.defaults.column.visible - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "visible": false, "targets": [ 0 ] } - * ] } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "visible": false }, - * null, - * null, - * null, - * null - * ] } ); - * } ); - */ - "bVisible": true, - - - /** - * Developer definable function that is called whenever a cell is created (Ajax source, - * etc) or processed for input (DOM source). This can be used as a compliment to mRender - * allowing you to modify the DOM element (add background colour for example) when the - * element is available. - * @type function - * @param {element} td The TD node that has been created - * @param {*} cellData The Data for the cell - * @param {array|object} rowData The data for the whole row - * @param {int} row The row index for the aoData data store - * @param {int} col The column index for aoColumns - * - * @name DataTable.defaults.column.createdCell - * @dtopt Columns - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [3], - * "createdCell": function (td, cellData, rowData, row, col) { - * if ( cellData == "1.7" ) { - * $(td).css('color', 'blue') - * } - * } - * } ] - * }); - * } ); - */ - "fnCreatedCell": null, - - - /** - * This parameter has been replaced by `data` in DataTables to ensure naming - * consistency. `dataProp` can still be used, as there is backwards - * compatibility in DataTables for this option, but it is strongly - * recommended that you use `data` in preference to `dataProp`. - * @name DataTable.defaults.column.dataProp - */ - - - /** - * This property can be used to read data from any data source property, - * including deeply nested objects / properties. `data` can be given in a - * number of different ways which effect its behaviour: - * - * * `integer` - treated as an array index for the data source. This is the - * default that DataTables uses (incrementally increased for each column). - * * `string` - read an object property from the data source. There are - * three 'special' options that can be used in the string to alter how - * DataTables reads the data from the source object: - * * `.` - Dotted Javascript notation. Just as you use a `.` in - * Javascript to read from nested objects, so to can the options - * specified in `data`. For example: `browser.version` or - * `browser.name`. If your object parameter name contains a period, use - * `\\` to escape it - i.e. `first\\.name`. - * * `[]` - Array notation. DataTables can automatically combine data - * from and array source, joining the data with the characters provided - * between the two brackets. For example: `name[, ]` would provide a - * comma-space separated list from the source array. If no characters - * are provided between the brackets, the original array source is - * returned. - * * `()` - Function notation. Adding `()` to the end of a parameter will - * execute a function of the name given. For example: `browser()` for a - * simple function on the data source, `browser.version()` for a - * function in a nested property or even `browser().version` to get an - * object property if the function called returns an object. Note that - * function notation is recommended for use in `render` rather than - * `data` as it is much simpler to use as a renderer. - * * `null` - use the original data source for the row rather than plucking - * data directly from it. This action has effects on two other - * initialisation options: - * * `defaultContent` - When null is given as the `data` option and - * `defaultContent` is specified for the column, the value defined by - * `defaultContent` will be used for the cell. - * * `render` - When null is used for the `data` option and the `render` - * option is specified for the column, the whole data source for the - * row is used for the renderer. - * * `function` - the function given will be executed whenever DataTables - * needs to set or get the data for a cell in the column. The function - * takes three parameters: - * * Parameters: - * * `{array|object}` The data source for the row - * * `{string}` The type call data requested - this will be 'set' when - * setting data or 'filter', 'display', 'type', 'sort' or undefined - * when gathering data. Note that when `undefined` is given for the - * type DataTables expects to get the raw data for the object back< - * * `{*}` Data to set when the second parameter is 'set'. - * * Return: - * * The return value from the function is not required when 'set' is - * the type of call, but otherwise the return is what will be used - * for the data requested. - * - * Note that `data` is a getter and setter option. If you just require - * formatting of data for output, you will likely want to use `render` which - * is simply a getter and thus simpler to use. - * - * Note that prior to DataTables 1.9.2 `data` was called `mDataProp`. The - * name change reflects the flexibility of this property and is consistent - * with the naming of mRender. If 'mDataProp' is given, then it will still - * be used by DataTables, as it automatically maps the old name to the new - * if required. - * - * @type string|int|function|null - * @default null Use automatically calculated column index - * - * @name DataTable.defaults.column.data - * @dtopt Columns - * - * @example - * // Read table data from objects - * // JSON structure for each row: - * // { - * // "engine": {value}, - * // "browser": {value}, - * // "platform": {value}, - * // "version": {value}, - * // "grade": {value} - * // } - * $(document).ready( function() { - * $('#example').dataTable( { - * "ajaxSource": "sources/objects.txt", - * "columns": [ - * { "data": "engine" }, - * { "data": "browser" }, - * { "data": "platform" }, - * { "data": "version" }, - * { "data": "grade" } - * ] - * } ); - * } ); - * - * @example - * // Read information from deeply nested objects - * // JSON structure for each row: - * // { - * // "engine": {value}, - * // "browser": {value}, - * // "platform": { - * // "inner": {value} - * // }, - * // "details": [ - * // {value}, {value} - * // ] - * // } - * $(document).ready( function() { - * $('#example').dataTable( { - * "ajaxSource": "sources/deep.txt", - * "columns": [ - * { "data": "engine" }, - * { "data": "browser" }, - * { "data": "platform.inner" }, - * { "data": "details.0" }, - * { "data": "details.1" } - * ] - * } ); - * } ); - * - * @example - * // Using `data` as a function to provide different information for - * // sorting, filtering and display. In this case, currency (price) - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [ 0 ], - * "data": function ( source, type, val ) { - * if (type === 'set') { - * source.price = val; - * // Store the computed dislay and filter values for efficiency - * source.price_display = val=="" ? "" : "$"+numberFormat(val); - * source.price_filter = val=="" ? "" : "$"+numberFormat(val)+" "+val; - * return; - * } - * else if (type === 'display') { - * return source.price_display; - * } - * else if (type === 'filter') { - * return source.price_filter; - * } - * // 'sort', 'type' and undefined all just use the integer - * return source.price; - * } - * } ] - * } ); - * } ); - * - * @example - * // Using default content - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [ 0 ], - * "data": null, - * "defaultContent": "Click to edit" - * } ] - * } ); - * } ); - * - * @example - * // Using array notation - outputting a list from an array - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [ 0 ], - * "data": "name[, ]" - * } ] - * } ); - * } ); - * - */ - "mData": null, - - - /** - * This property is the rendering partner to `data` and it is suggested that - * when you want to manipulate data for display (including filtering, - * sorting etc) without altering the underlying data for the table, use this - * property. `render` can be considered to be the the read only companion to - * `data` which is read / write (then as such more complex). Like `data` - * this option can be given in a number of different ways to effect its - * behaviour: - * - * * `integer` - treated as an array index for the data source. This is the - * default that DataTables uses (incrementally increased for each column). - * * `string` - read an object property from the data source. There are - * three 'special' options that can be used in the string to alter how - * DataTables reads the data from the source object: - * * `.` - Dotted Javascript notation. Just as you use a `.` in - * Javascript to read from nested objects, so to can the options - * specified in `data`. For example: `browser.version` or - * `browser.name`. If your object parameter name contains a period, use - * `\\` to escape it - i.e. `first\\.name`. - * * `[]` - Array notation. DataTables can automatically combine data - * from and array source, joining the data with the characters provided - * between the two brackets. For example: `name[, ]` would provide a - * comma-space separated list from the source array. If no characters - * are provided between the brackets, the original array source is - * returned. - * * `()` - Function notation. Adding `()` to the end of a parameter will - * execute a function of the name given. For example: `browser()` for a - * simple function on the data source, `browser.version()` for a - * function in a nested property or even `browser().version` to get an - * object property if the function called returns an object. - * * `object` - use different data for the different data types requested by - * DataTables ('filter', 'display', 'type' or 'sort'). The property names - * of the object is the data type the property refers to and the value can - * defined using an integer, string or function using the same rules as - * `render` normally does. Note that an `_` option _must_ be specified. - * This is the default value to use if you haven't specified a value for - * the data type requested by DataTables. - * * `function` - the function given will be executed whenever DataTables - * needs to set or get the data for a cell in the column. The function - * takes three parameters: - * * Parameters: - * * {array|object} The data source for the row (based on `data`) - * * {string} The type call data requested - this will be 'filter', - * 'display', 'type' or 'sort'. - * * {array|object} The full data source for the row (not based on - * `data`) - * * Return: - * * The return value from the function is what will be used for the - * data requested. - * - * @type string|int|function|object|null - * @default null Use the data source value. - * - * @name DataTable.defaults.column.render - * @dtopt Columns - * - * @example - * // Create a comma separated list from an array of objects - * $(document).ready( function() { - * $('#example').dataTable( { - * "ajaxSource": "sources/deep.txt", - * "columns": [ - * { "data": "engine" }, - * { "data": "browser" }, - * { - * "data": "platform", - * "render": "[, ].name" - * } - * ] - * } ); - * } ); - * - * @example - * // Execute a function to obtain data - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [ 0 ], - * "data": null, // Use the full data source object for the renderer's source - * "render": "browserName()" - * } ] - * } ); - * } ); - * - * @example - * // As an object, extracting different data for the different types - * // This would be used with a data source such as: - * // { "phone": 5552368, "phone_filter": "5552368 555-2368", "phone_display": "555-2368" } - * // Here the `phone` integer is used for sorting and type detection, while `phone_filter` - * // (which has both forms) is used for filtering for if a user inputs either format, while - * // the formatted phone number is the one that is shown in the table. - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [ 0 ], - * "data": null, // Use the full data source object for the renderer's source - * "render": { - * "_": "phone", - * "filter": "phone_filter", - * "display": "phone_display" - * } - * } ] - * } ); - * } ); - * - * @example - * // Use as a function to create a link from the data source - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [ 0 ], - * "data": "download_link", - * "render": function ( data, type, full ) { - * return 'Download'; - * } - * } ] - * } ); - * } ); - */ - "mRender": null, - - - /** - * Change the cell type created for the column - either TD cells or TH cells. This - * can be useful as TH cells have semantic meaning in the table body, allowing them - * to act as a header for a row (you may wish to add scope='row' to the TH elements). - * @type string - * @default td - * - * @name DataTable.defaults.column.cellType - * @dtopt Columns - * - * @example - * // Make the first column use TH cells - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [ 0 ], - * "cellType": "th" - * } ] - * } ); - * } ); - */ - "sCellType": "td", - - - /** - * Class to give to each cell in this column. - * @type string - * @default Empty string - * - * @name DataTable.defaults.column.class - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "class": "my_class", "targets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "class": "my_class" }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "sClass": "", - - /** - * When DataTables calculates the column widths to assign to each column, - * it finds the longest string in each column and then constructs a - * temporary table and reads the widths from that. The problem with this - * is that "mmm" is much wider then "iiii", but the latter is a longer - * string - thus the calculation can go wrong (doing it properly and putting - * it into an DOM object and measuring that is horribly(!) slow). Thus as - * a "work around" we provide this option. It will append its value to the - * text that is found to be the longest string for the column - i.e. padding. - * Generally you shouldn't need this! - * @type string - * @default Empty string - * - * @name DataTable.defaults.column.contentPadding - * @dtopt Columns - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * null, - * null, - * null, - * { - * "contentPadding": "mmm" - * } - * ] - * } ); - * } ); - */ - "sContentPadding": "", - - - /** - * Allows a default value to be given for a column's data, and will be used - * whenever a null data source is encountered (this can be because `data` - * is set to null, or because the data source itself is null). - * @type string - * @default null - * - * @name DataTable.defaults.column.defaultContent - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { - * "data": null, - * "defaultContent": "Edit", - * "targets": [ -1 ] - * } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * null, - * null, - * null, - * { - * "data": null, - * "defaultContent": "Edit" - * } - * ] - * } ); - * } ); - */ - "sDefaultContent": null, - - - /** - * This parameter is only used in DataTables' server-side processing. It can - * be exceptionally useful to know what columns are being displayed on the - * client side, and to map these to database fields. When defined, the names - * also allow DataTables to reorder information from the server if it comes - * back in an unexpected order (i.e. if you switch your columns around on the - * client-side, your server-side code does not also need updating). - * @type string - * @default Empty string - * - * @name DataTable.defaults.column.name - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "name": "engine", "targets": [ 0 ] }, - * { "name": "browser", "targets": [ 1 ] }, - * { "name": "platform", "targets": [ 2 ] }, - * { "name": "version", "targets": [ 3 ] }, - * { "name": "grade", "targets": [ 4 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "name": "engine" }, - * { "name": "browser" }, - * { "name": "platform" }, - * { "name": "version" }, - * { "name": "grade" } - * ] - * } ); - * } ); - */ - "sName": "", - - - /** - * Defines a data source type for the ordering which can be used to read - * real-time information from the table (updating the internally cached - * version) prior to ordering. This allows ordering to occur on user - * editable elements such as form inputs. - * @type string - * @default std - * - * @name DataTable.defaults.column.orderDataType - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "orderDataType": "dom-text", "targets": [ 2, 3 ] }, - * { "type": "numeric", "targets": [ 3 ] }, - * { "orderDataType": "dom-select", "targets": [ 4 ] }, - * { "orderDataType": "dom-checkbox", "targets": [ 5 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * null, - * null, - * { "orderDataType": "dom-text" }, - * { "orderDataType": "dom-text", "type": "numeric" }, - * { "orderDataType": "dom-select" }, - * { "orderDataType": "dom-checkbox" } - * ] - * } ); - * } ); - */ - "sSortDataType": "std", - - - /** - * The title of this column. - * @type string - * @default null Derived from the 'TH' value for this column in the - * original HTML table. - * - * @name DataTable.defaults.column.title - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "title": "My column title", "targets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "title": "My column title" }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "sTitle": null, - - - /** - * The type allows you to specify how the data for this column will be - * ordered. Four types (string, numeric, date and html (which will strip - * HTML tags before ordering)) are currently available. Note that only date - * formats understood by Javascript's Date() object will be accepted as type - * date. For example: "Mar 26, 2008 5:03 PM". May take the values: 'string', - * 'numeric', 'date' or 'html' (by default). Further types can be adding - * through plug-ins. - * @type string - * @default null Auto-detected from raw data - * - * @name DataTable.defaults.column.type - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "type": "html", "targets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "type": "html" }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "sType": null, - - - /** - * Defining the width of the column, this parameter may take any CSS value - * (3em, 20px etc). DataTables applies 'smart' widths to columns which have not - * been given a specific width through this interface ensuring that the table - * remains readable. - * @type string - * @default null Automatic - * - * @name DataTable.defaults.column.width - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "width": "20%", "targets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "width": "20%" }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "sWidth": null - }; - - _fnHungarianMap(DataTable.defaults.column); - - - /** - * DataTables settings object - this holds all the information needed for a - * given table, including configuration, data and current application of the - * table options. DataTables does not have a single instance for each DataTable - * with the settings attached to that instance, but rather instances of the - * DataTable "class" are created on-the-fly as needed (typically by a - * $().dataTable() call) and the settings object is then applied to that - * instance. - * - * Note that this object is related to {@link DataTable.defaults} but this - * one is the internal data store for DataTables's cache of columns. It should - * NOT be manipulated outside of DataTables. Any configuration should be done - * through the initialisation options. - * @namespace - * @todo Really should attach the settings object to individual instances so we - * don't need to create new instances on each $().dataTable() call (if the - * table already exists). It would also save passing oSettings around and - * into every single function. However, this is a very significant - * architecture change for DataTables and will almost certainly break - * backwards compatibility with older installations. This is something that - * will be done in 2.0. - */ - DataTable.models.oSettings = { - /** - * Primary features of DataTables and their enablement state. - * @namespace - */ - "oFeatures": { - - /** - * Flag to say if DataTables should automatically try to calculate the - * optimum table and columns widths (true) or not (false). - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bAutoWidth": null, - - /** - * Delay the creation of TR and TD elements until they are actually - * needed by a driven page draw. This can give a significant speed - * increase for Ajax source and Javascript source data, but makes no - * difference at all fro DOM and server-side processing tables. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bDeferRender": null, - - /** - * Enable filtering on the table or not. Note that if this is disabled - * then there is no filtering at all on the table, including fnFilter. - * To just remove the filtering input use sDom and remove the 'f' option. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bFilter": null, - - /** - * Table information element (the 'Showing x of y records' div) enable - * flag. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bInfo": null, - - /** - * Present a user control allowing the end user to change the page size - * when pagination is enabled. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bLengthChange": null, - - /** - * Pagination enabled or not. Note that if this is disabled then length - * changing must also be disabled. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bPaginate": null, - - /** - * Processing indicator enable flag whenever DataTables is enacting a - * user request - typically an Ajax request for server-side processing. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bProcessing": null, - - /** - * Server-side processing enabled flag - when enabled DataTables will - * get all data from the server for every draw - there is no filtering, - * sorting or paging done on the client-side. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bServerSide": null, - - /** - * Sorting enablement flag. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bSort": null, - - /** - * Multi-column sorting - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bSortMulti": null, - - /** - * Apply a class to the columns which are being sorted to provide a - * visual highlight or not. This can slow things down when enabled since - * there is a lot of DOM interaction. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bSortClasses": null, - - /** - * State saving enablement flag. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bStateSave": null - }, - - - /** - * Scrolling settings for a table. - * @namespace - */ - "oScroll": { - /** - * When the table is shorter in height than sScrollY, collapse the - * table container down to the height of the table (when true). - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bCollapse": null, - - /** - * Width of the scrollbar for the web-browser's platform. Calculated - * during table initialisation. - * @type int - * @default 0 - */ - "iBarWidth": 0, - - /** - * Viewport width for horizontal scrolling. Horizontal scrolling is - * disabled if an empty string. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - */ - "sX": null, - - /** - * Width to expand the table to when using x-scrolling. Typically you - * should not need to use this. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @deprecated - */ - "sXInner": null, - - /** - * Viewport height for vertical scrolling. Vertical scrolling is disabled - * if an empty string. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - */ - "sY": null - }, - - /** - * Language information for the table. - * @namespace - * @extends DataTable.defaults.oLanguage - */ - "oLanguage": { - /** - * Information callback function. See - * {@link DataTable.defaults.fnInfoCallback} - * @type function - * @default null - */ - "fnInfoCallback": null - }, - - /** - * Browser support parameters - * @namespace - */ - "oBrowser": { - /** - * Indicate if the browser incorrectly calculates width:100% inside a - * scrolling element (IE6/7) - * @type boolean - * @default false - */ - "bScrollOversize": false, - - /** - * Determine if the vertical scrollbar is on the right or left of the - * scrolling container - needed for rtl language layout, although not - * all browsers move the scrollbar (Safari). - * @type boolean - * @default false - */ - "bScrollbarLeft": false, - - /** - * Flag for if `getBoundingClientRect` is fully supported or not - * @type boolean - * @default false - */ - "bBounding": false, - - /** - * Browser scrollbar width - * @type integer - * @default 0 - */ - "barWidth": 0 - }, - - - "ajax": null, - - - /** - * Array referencing the nodes which are used for the features. The - * parameters of this object match what is allowed by sDom - i.e. - *
    - *
  • 'l' - Length changing
  • - *
  • 'f' - Filtering input
  • - *
  • 't' - The table!
  • - *
  • 'i' - Information
  • - *
  • 'p' - Pagination
  • - *
  • 'r' - pRocessing
  • - *
- * @type array - * @default [] - */ - "aanFeatures": [], - - /** - * Store data information - see {@link DataTable.models.oRow} for detailed - * information. - * @type array - * @default [] - */ - "aoData": [], - - /** - * Array of indexes which are in the current display (after filtering etc) - * @type array - * @default [] - */ - "aiDisplay": [], - - /** - * Array of indexes for display - no filtering - * @type array - * @default [] - */ - "aiDisplayMaster": [], - - /** - * Map of row ids to data indexes - * @type object - * @default {} - */ - "aIds": {}, - - /** - * Store information about each column that is in use - * @type array - * @default [] - */ - "aoColumns": [], - - /** - * Store information about the table's header - * @type array - * @default [] - */ - "aoHeader": [], - - /** - * Store information about the table's footer - * @type array - * @default [] - */ - "aoFooter": [], - - /** - * Store the applied global search information in case we want to force a - * research or compare the old search to a new one. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @namespace - * @extends DataTable.models.oSearch - */ - "oPreviousSearch": {}, - - /** - * Store the applied search for each column - see - * {@link DataTable.models.oSearch} for the format that is used for the - * filtering information for each column. - * @type array - * @default [] - */ - "aoPreSearchCols": [], - - /** - * Sorting that is applied to the table. Note that the inner arrays are - * used in the following manner: - *
    - *
  • Index 0 - column number
  • - *
  • Index 1 - current sorting direction
  • - *
- * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type array - * @todo These inner arrays should really be objects - */ - "aaSorting": null, - - /** - * Sorting that is always applied to the table (i.e. prefixed in front of - * aaSorting). - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type array - * @default [] - */ - "aaSortingFixed": [], - - /** - * Classes to use for the striping of a table. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type array - * @default [] - */ - "asStripeClasses": null, - - /** - * If restoring a table - we should restore its striping classes as well - * @type array - * @default [] - */ - "asDestroyStripes": [], - - /** - * If restoring a table - we should restore its width - * @type int - * @default 0 - */ - "sDestroyWidth": 0, - - /** - * Callback functions array for every time a row is inserted (i.e. on a draw). - * @type array - * @default [] - */ - "aoRowCallback": [], - - /** - * Callback functions for the header on each draw. - * @type array - * @default [] - */ - "aoHeaderCallback": [], - - /** - * Callback function for the footer on each draw. - * @type array - * @default [] - */ - "aoFooterCallback": [], - - /** - * Array of callback functions for draw callback functions - * @type array - * @default [] - */ - "aoDrawCallback": [], - - /** - * Array of callback functions for row created function - * @type array - * @default [] - */ - "aoRowCreatedCallback": [], - - /** - * Callback functions for just before the table is redrawn. A return of - * false will be used to cancel the draw. - * @type array - * @default [] - */ - "aoPreDrawCallback": [], - - /** - * Callback functions for when the table has been initialised. - * @type array - * @default [] - */ - "aoInitComplete": [], - - - /** - * Callbacks for modifying the settings to be stored for state saving, prior to - * saving state. - * @type array - * @default [] - */ - "aoStateSaveParams": [], - - /** - * Callbacks for modifying the settings that have been stored for state saving - * prior to using the stored values to restore the state. - * @type array - * @default [] - */ - "aoStateLoadParams": [], - - /** - * Callbacks for operating on the settings object once the saved state has been - * loaded - * @type array - * @default [] - */ - "aoStateLoaded": [], - - /** - * Cache the table ID for quick access - * @type string - * @default Empty string - */ - "sTableId": "", - - /** - * The TABLE node for the main table - * @type node - * @default null - */ - "nTable": null, - - /** - * Permanent ref to the thead element - * @type node - * @default null - */ - "nTHead": null, - - /** - * Permanent ref to the tfoot element - if it exists - * @type node - * @default null - */ - "nTFoot": null, - - /** - * Permanent ref to the tbody element - * @type node - * @default null - */ - "nTBody": null, - - /** - * Cache the wrapper node (contains all DataTables controlled elements) - * @type node - * @default null - */ - "nTableWrapper": null, - - /** - * Indicate if when using server-side processing the loading of data - * should be deferred until the second draw. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - * @default false - */ - "bDeferLoading": false, - - /** - * Indicate if all required information has been read in - * @type boolean - * @default false - */ - "bInitialised": false, - - /** - * Information about open rows. Each object in the array has the parameters - * 'nTr' and 'nParent' - * @type array - * @default [] - */ - "aoOpenRows": [], - - /** - * Dictate the positioning of DataTables' control elements - see - * {@link DataTable.model.oInit.sDom}. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @default null - */ - "sDom": null, - - /** - * Search delay (in mS) - * @type integer - * @default null - */ - "searchDelay": null, - - /** - * Which type of pagination should be used. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @default two_button - */ - "sPaginationType": "two_button", - - /** - * The state duration (for `stateSave`) in seconds. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type int - * @default 0 - */ - "iStateDuration": 0, - - /** - * Array of callback functions for state saving. Each array element is an - * object with the following parameters: - *
    - *
  • function:fn - function to call. Takes two parameters, oSettings - * and the JSON string to save that has been thus far created. Returns - * a JSON string to be inserted into a json object - * (i.e. '"param": [ 0, 1, 2]')
  • - *
  • string:sName - name of callback
  • - *
- * @type array - * @default [] - */ - "aoStateSave": [], - - /** - * Array of callback functions for state loading. Each array element is an - * object with the following parameters: - *
    - *
  • function:fn - function to call. Takes two parameters, oSettings - * and the object stored. May return false to cancel state loading
  • - *
  • string:sName - name of callback
  • - *
- * @type array - * @default [] - */ - "aoStateLoad": [], - - /** - * State that was saved. Useful for back reference - * @type object - * @default null - */ - "oSavedState": null, - - /** - * State that was loaded. Useful for back reference - * @type object - * @default null - */ - "oLoadedState": null, - - /** - * Source url for AJAX data for the table. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @default null - */ - "sAjaxSource": null, - - /** - * Property from a given object from which to read the table data from. This - * can be an empty string (when not server-side processing), in which case - * it is assumed an an array is given directly. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - */ - "sAjaxDataProp": null, - - /** - * Note if draw should be blocked while getting data - * @type boolean - * @default true - */ - "bAjaxDataGet": true, - - /** - * The last jQuery XHR object that was used for server-side data gathering. - * This can be used for working with the XHR information in one of the - * callbacks - * @type object - * @default null - */ - "jqXHR": null, - - /** - * JSON returned from the server in the last Ajax request - * @type object - * @default undefined - */ - "json": undefined, - - /** - * Data submitted as part of the last Ajax request - * @type object - * @default undefined - */ - "oAjaxData": undefined, - - /** - * Function to get the server-side data. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type function - */ - "fnServerData": null, - - /** - * Functions which are called prior to sending an Ajax request so extra - * parameters can easily be sent to the server - * @type array - * @default [] - */ - "aoServerParams": [], - - /** - * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if - * required). - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - */ - "sServerMethod": null, - - /** - * Format numbers for display. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type function - */ - "fnFormatNumber": null, - - /** - * List of options that can be used for the user selectable length menu. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type array - * @default [] - */ - "aLengthMenu": null, - - /** - * Counter for the draws that the table does. Also used as a tracker for - * server-side processing - * @type int - * @default 0 - */ - "iDraw": 0, - - /** - * Indicate if a redraw is being done - useful for Ajax - * @type boolean - * @default false - */ - "bDrawing": false, - - /** - * Draw index (iDraw) of the last error when parsing the returned data - * @type int - * @default -1 - */ - "iDrawError": -1, - - /** - * Paging display length - * @type int - * @default 10 - */ - "_iDisplayLength": 10, - - /** - * Paging start point - aiDisplay index - * @type int - * @default 0 - */ - "_iDisplayStart": 0, - - /** - * Server-side processing - number of records in the result set - * (i.e. before filtering), Use fnRecordsTotal rather than - * this property to get the value of the number of records, regardless of - * the server-side processing setting. - * @type int - * @default 0 - * @private - */ - "_iRecordsTotal": 0, - - /** - * Server-side processing - number of records in the current display set - * (i.e. after filtering). Use fnRecordsDisplay rather than - * this property to get the value of the number of records, regardless of - * the server-side processing setting. - * @type boolean - * @default 0 - * @private - */ - "_iRecordsDisplay": 0, - - /** - * The classes to use for the table - * @type object - * @default {} - */ - "oClasses": {}, - - /** - * Flag attached to the settings object so you can check in the draw - * callback if filtering has been done in the draw. Deprecated in favour of - * events. - * @type boolean - * @default false - * @deprecated - */ - "bFiltered": false, - - /** - * Flag attached to the settings object so you can check in the draw - * callback if sorting has been done in the draw. Deprecated in favour of - * events. - * @type boolean - * @default false - * @deprecated - */ - "bSorted": false, - - /** - * Indicate that if multiple rows are in the header and there is more than - * one unique cell per column, if the top one (true) or bottom one (false) - * should be used for sorting / title by DataTables. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bSortCellsTop": null, - - /** - * Initialisation object that is used for the table - * @type object - * @default null - */ - "oInit": null, - - /** - * Destroy callback functions - for plug-ins to attach themselves to the - * destroy so they can clean up markup and events. - * @type array - * @default [] - */ - "aoDestroyCallback": [], - - - /** - * Get the number of records in the current record set, before filtering - * @type function - */ - "fnRecordsTotal": function () { - return _fnDataSource(this) == 'ssp' ? - this._iRecordsTotal * 1 : - this.aiDisplayMaster.length; - }, - - /** - * Get the number of records in the current record set, after filtering - * @type function - */ - "fnRecordsDisplay": function () { - return _fnDataSource(this) == 'ssp' ? - this._iRecordsDisplay * 1 : - this.aiDisplay.length; - }, - - /** - * Get the display end point - aiDisplay index - * @type function - */ - "fnDisplayEnd": function () { - var - len = this._iDisplayLength, - start = this._iDisplayStart, - calc = start + len, - records = this.aiDisplay.length, - features = this.oFeatures, - paginate = features.bPaginate; - - if (features.bServerSide) { - return paginate === false || len === -1 ? - start + records : - Math.min(start + len, this._iRecordsDisplay); - } else { - return !paginate || calc > records || len === -1 ? - records : - calc; - } - }, - - /** - * The DataTables object for this table - * @type object - * @default null - */ - "oInstance": null, - - /** - * Unique identifier for each instance of the DataTables object. If there - * is an ID on the table node, then it takes that value, otherwise an - * incrementing internal counter is used. - * @type string - * @default null - */ - "sInstance": null, - - /** - * tabindex attribute value that is added to DataTables control elements, allowing - * keyboard navigation of the table and its controls. - */ - "iTabIndex": 0, - - /** - * DIV container for the footer scrolling table if scrolling - */ - "nScrollHead": null, - - /** - * DIV container for the footer scrolling table if scrolling - */ - "nScrollFoot": null, - - /** - * Last applied sort - * @type array - * @default [] - */ - "aLastSort": [], - - /** - * Stored plug-in instances - * @type object - * @default {} - */ - "oPlugins": {}, - - /** - * Function used to get a row's id from the row's data - * @type function - * @default null - */ - "rowIdFn": null, - - /** - * Data location where to store a row's id - * @type string - * @default null - */ - "rowId": null - }; - - /** - * Extension object for DataTables that is used to provide all extension - * options. - * - * Note that the `DataTable.ext` object is available through - * `jQuery.fn.dataTable.ext` where it may be accessed and manipulated. It is - * also aliased to `jQuery.fn.dataTableExt` for historic reasons. - * @namespace - * @extends DataTable.models.ext - */ - - - /** - * DataTables extensions - * - * This namespace acts as a collection area for plug-ins that can be used to - * extend DataTables capabilities. Indeed many of the build in methods - * use this method to provide their own capabilities (sorting methods for - * example). - * - * Note that this namespace is aliased to `jQuery.fn.dataTableExt` for legacy - * reasons - * - * @namespace - */ - DataTable.ext = _ext = { - /** - * Buttons. For use with the Buttons extension for DataTables. This is - * defined here so other extensions can define buttons regardless of load - * order. It is _not_ used by DataTables core. - * - * @type object - * @default {} - */ - buttons: {}, - - - /** - * Element class names - * - * @type object - * @default {} - */ - classes: {}, - - - /** - * DataTables build type (expanded by the download builder) - * - * @type string - */ - build: "bs4/dt-1.10.23/r-2.2.7", - - - /** - * Error reporting. - * - * How should DataTables report an error. Can take the value 'alert', - * 'throw', 'none' or a function. - * - * @type string|function - * @default alert - */ - errMode: "alert", - - - /** - * Feature plug-ins. - * - * This is an array of objects which describe the feature plug-ins that are - * available to DataTables. These feature plug-ins are then available for - * use through the `dom` initialisation option. - * - * Each feature plug-in is described by an object which must have the - * following properties: - * - * * `fnInit` - function that is used to initialise the plug-in, - * * `cFeature` - a character so the feature can be enabled by the `dom` - * instillation option. This is case sensitive. - * - * The `fnInit` function has the following input parameters: - * - * 1. `{object}` DataTables settings object: see - * {@link DataTable.models.oSettings} - * - * And the following return is expected: - * - * * {node|null} The element which contains your feature. Note that the - * return may also be void if your plug-in does not require to inject any - * DOM elements into DataTables control (`dom`) - for example this might - * be useful when developing a plug-in which allows table control via - * keyboard entry - * - * @type array - * - * @example - * $.fn.dataTable.ext.features.push( { - * "fnInit": function( oSettings ) { - * return new TableTools( { "oDTSettings": oSettings } ); - * }, - * "cFeature": "T" - * } ); - */ - feature: [], - - - /** - * Row searching. - * - * This method of searching is complimentary to the default type based - * searching, and a lot more comprehensive as it allows you complete control - * over the searching logic. Each element in this array is a function - * (parameters described below) that is called for every row in the table, - * and your logic decides if it should be included in the searching data set - * or not. - * - * Searching functions have the following input parameters: - * - * 1. `{object}` DataTables settings object: see - * {@link DataTable.models.oSettings} - * 2. `{array|object}` Data for the row to be processed (same as the - * original format that was passed in as the data source, or an array - * from a DOM data source - * 3. `{int}` Row index ({@link DataTable.models.oSettings.aoData}), which - * can be useful to retrieve the `TR` element if you need DOM interaction. - * - * And the following return is expected: - * - * * {boolean} Include the row in the searched result set (true) or not - * (false) - * - * Note that as with the main search ability in DataTables, technically this - * is "filtering", since it is subtractive. However, for consistency in - * naming we call it searching here. - * - * @type array - * @default [] - * - * @example - * // The following example shows custom search being applied to the - * // fourth column (i.e. the data[3] index) based on two input values - * // from the end-user, matching the data in a certain range. - * $.fn.dataTable.ext.search.push( - * function( settings, data, dataIndex ) { - * var min = document.getElementById('min').value * 1; - * var max = document.getElementById('max').value * 1; - * var version = data[3] == "-" ? 0 : data[3]*1; - * - * if ( min == "" && max == "" ) { - * return true; - * } - * else if ( min == "" && version < max ) { - * return true; - * } - * else if ( min < version && "" == max ) { - * return true; - * } - * else if ( min < version && version < max ) { - * return true; - * } - * return false; - * } - * ); - */ - search: [], - - - /** - * Selector extensions - * - * The `selector` option can be used to extend the options available for the - * selector modifier options (`selector-modifier` object data type) that - * each of the three built in selector types offer (row, column and cell + - * their plural counterparts). For example the Select extension uses this - * mechanism to provide an option to select only rows, columns and cells - * that have been marked as selected by the end user (`{selected: true}`), - * which can be used in conjunction with the existing built in selector - * options. - * - * Each property is an array to which functions can be pushed. The functions - * take three attributes: - * - * * Settings object for the host table - * * Options object (`selector-modifier` object type) - * * Array of selected item indexes - * - * The return is an array of the resulting item indexes after the custom - * selector has been applied. - * - * @type object - */ - selector: { - cell: [], - column: [], - row: [] - }, - - - /** - * Internal functions, exposed for used in plug-ins. - * - * Please note that you should not need to use the internal methods for - * anything other than a plug-in (and even then, try to avoid if possible). - * The internal function may change between releases. - * - * @type object - * @default {} - */ - internal: {}, - - - /** - * Legacy configuration options. Enable and disable legacy options that - * are available in DataTables. - * - * @type object - */ - legacy: { - /** - * Enable / disable DataTables 1.9 compatible server-side processing - * requests - * - * @type boolean - * @default null - */ - ajax: null - }, - - - /** - * Pagination plug-in methods. - * - * Each entry in this object is a function and defines which buttons should - * be shown by the pagination rendering method that is used for the table: - * {@link DataTable.ext.renderer.pageButton}. The renderer addresses how the - * buttons are displayed in the document, while the functions here tell it - * what buttons to display. This is done by returning an array of button - * descriptions (what each button will do). - * - * Pagination types (the four built in options and any additional plug-in - * options defined here) can be used through the `paginationType` - * initialisation parameter. - * - * The functions defined take two parameters: - * - * 1. `{int} page` The current page index - * 2. `{int} pages` The number of pages in the table - * - * Each function is expected to return an array where each element of the - * array can be one of: - * - * * `first` - Jump to first page when activated - * * `last` - Jump to last page when activated - * * `previous` - Show previous page when activated - * * `next` - Show next page when activated - * * `{int}` - Show page of the index given - * * `{array}` - A nested array containing the above elements to add a - * containing 'DIV' element (might be useful for styling). - * - * Note that DataTables v1.9- used this object slightly differently whereby - * an object with two functions would be defined for each plug-in. That - * ability is still supported by DataTables 1.10+ to provide backwards - * compatibility, but this option of use is now decremented and no longer - * documented in DataTables 1.10+. - * - * @type object - * @default {} - * - * @example - * // Show previous, next and current page buttons only - * $.fn.dataTableExt.oPagination.current = function ( page, pages ) { - * return [ 'previous', page, 'next' ]; - * }; - */ - pager: {}, - - - renderer: { - pageButton: {}, - header: {} - }, - - - /** - * Ordering plug-ins - custom data source - * - * The extension options for ordering of data available here is complimentary - * to the default type based ordering that DataTables typically uses. It - * allows much greater control over the the data that is being used to - * order a column, but is necessarily therefore more complex. - * - * This type of ordering is useful if you want to do ordering based on data - * live from the DOM (for example the contents of an 'input' element) rather - * than just the static string that DataTables knows of. - * - * The way these plug-ins work is that you create an array of the values you - * wish to be ordering for the column in question and then return that - * array. The data in the array much be in the index order of the rows in - * the table (not the currently ordering order!). Which order data gathering - * function is run here depends on the `dt-init columns.orderDataType` - * parameter that is used for the column (if any). - * - * The functions defined take two parameters: - * - * 1. `{object}` DataTables settings object: see - * {@link DataTable.models.oSettings} - * 2. `{int}` Target column index - * - * Each function is expected to return an array: - * - * * `{array}` Data for the column to be ordering upon - * - * @type array - * - * @example - * // Ordering using `input` node values - * $.fn.dataTable.ext.order['dom-text'] = function ( settings, col ) - * { - * return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) { - * return $('input', td).val(); - * } ); - * } - */ - order: {}, - - - /** - * Type based plug-ins. - * - * Each column in DataTables has a type assigned to it, either by automatic - * detection or by direct assignment using the `type` option for the column. - * The type of a column will effect how it is ordering and search (plug-ins - * can also make use of the column type if required). - * - * @namespace - */ - type: { - /** - * Type detection functions. - * - * The functions defined in this object are used to automatically detect - * a column's type, making initialisation of DataTables super easy, even - * when complex data is in the table. - * - * The functions defined take two parameters: - * - * 1. `{*}` Data from the column cell to be analysed - * 2. `{settings}` DataTables settings object. This can be used to - * perform context specific type detection - for example detection - * based on language settings such as using a comma for a decimal - * place. Generally speaking the options from the settings will not - * be required - * - * Each function is expected to return: - * - * * `{string|null}` Data type detected, or null if unknown (and thus - * pass it on to the other type detection functions. - * - * @type array - * - * @example - * // Currency type detection plug-in: - * $.fn.dataTable.ext.type.detect.push( - * function ( data, settings ) { - * // Check the numeric part - * if ( ! data.substring(1).match(/[0-9]/) ) { - * return null; - * } - * - * // Check prefixed by currency - * if ( data.charAt(0) == '$' || data.charAt(0) == '£' ) { - * return 'currency'; - * } - * return null; - * } - * ); - */ - detect: [], - - - /** - * Type based search formatting. - * - * The type based searching functions can be used to pre-format the - * data to be search on. For example, it can be used to strip HTML - * tags or to de-format telephone numbers for numeric only searching. - * - * Note that is a search is not defined for a column of a given type, - * no search formatting will be performed. - * - * Pre-processing of searching data plug-ins - When you assign the sType - * for a column (or have it automatically detected for you by DataTables - * or a type detection plug-in), you will typically be using this for - * custom sorting, but it can also be used to provide custom searching - * by allowing you to pre-processing the data and returning the data in - * the format that should be searched upon. This is done by adding - * functions this object with a parameter name which matches the sType - * for that target column. This is the corollary of afnSortData - * for searching data. - * - * The functions defined take a single parameter: - * - * 1. `{*}` Data from the column cell to be prepared for searching - * - * Each function is expected to return: - * - * * `{string|null}` Formatted string that will be used for the searching. - * - * @type object - * @default {} - * - * @example - * $.fn.dataTable.ext.type.search['title-numeric'] = function ( d ) { - * return d.replace(/\n/g," ").replace( /<.*?>/g, "" ); - * } - */ - search: {}, - - - /** - * Type based ordering. - * - * The column type tells DataTables what ordering to apply to the table - * when a column is sorted upon. The order for each type that is defined, - * is defined by the functions available in this object. - * - * Each ordering option can be described by three properties added to - * this object: - * - * * `{type}-pre` - Pre-formatting function - * * `{type}-asc` - Ascending order function - * * `{type}-desc` - Descending order function - * - * All three can be used together, only `{type}-pre` or only - * `{type}-asc` and `{type}-desc` together. It is generally recommended - * that only `{type}-pre` is used, as this provides the optimal - * implementation in terms of speed, although the others are provided - * for compatibility with existing Javascript sort functions. - * - * `{type}-pre`: Functions defined take a single parameter: - * - * 1. `{*}` Data from the column cell to be prepared for ordering - * - * And return: - * - * * `{*}` Data to be sorted upon - * - * `{type}-asc` and `{type}-desc`: Functions are typical Javascript sort - * functions, taking two parameters: - * - * 1. `{*}` Data to compare to the second parameter - * 2. `{*}` Data to compare to the first parameter - * - * And returning: - * - * * `{*}` Ordering match: <0 if first parameter should be sorted lower - * than the second parameter, ===0 if the two parameters are equal and - * >0 if the first parameter should be sorted height than the second - * parameter. - * - * @type object - * @default {} - * - * @example - * // Numeric ordering of formatted numbers with a pre-formatter - * $.extend( $.fn.dataTable.ext.type.order, { - * "string-pre": function(x) { - * a = (a === "-" || a === "") ? 0 : a.replace( /[^\d\-\.]/g, "" ); - * return parseFloat( a ); - * } - * } ); - * - * @example - * // Case-sensitive string ordering, with no pre-formatting method - * $.extend( $.fn.dataTable.ext.order, { - * "string-case-asc": function(x,y) { - * return ((x < y) ? -1 : ((x > y) ? 1 : 0)); - * }, - * "string-case-desc": function(x,y) { - * return ((x < y) ? 1 : ((x > y) ? -1 : 0)); - * } - * } ); - */ - order: {} - }, - - /** - * Unique DataTables instance counter - * - * @type int - * @private - */ - _unique: 0, - - - // - // Depreciated - // The following properties are retained for backwards compatiblity only. - // The should not be used in new projects and will be removed in a future - // version - // - - /** - * Version check function. - * @type function - * @depreciated Since 1.10 - */ - fnVersionCheck: DataTable.fnVersionCheck, - - - /** - * Index for what 'this' index API functions should use - * @type int - * @deprecated Since v1.10 - */ - iApiIndex: 0, - - - /** - * jQuery UI class container - * @type object - * @deprecated Since v1.10 - */ - oJUIClasses: {}, - - - /** - * Software version - * @type string - * @deprecated Since v1.10 - */ - sVersion: DataTable.version - }; - - - // - // Backwards compatibility. Alias to pre 1.10 Hungarian notation counter parts - // - $.extend(_ext, { - afnFiltering: _ext.search, - aTypes: _ext.type.detect, - ofnSearch: _ext.type.search, - oSort: _ext.type.order, - afnSortData: _ext.order, - aoFeatures: _ext.feature, - oApi: _ext.internal, - oStdClasses: _ext.classes, - oPagination: _ext.pager - }); - - - $.extend(DataTable.ext.classes, { - "sTable": "dataTable", - "sNoFooter": "no-footer", - - /* Paging buttons */ - "sPageButton": "paginate_button", - "sPageButtonActive": "current", - "sPageButtonDisabled": "disabled", - - /* Striping classes */ - "sStripeOdd": "odd", - "sStripeEven": "even", - - /* Empty row */ - "sRowEmpty": "dataTables_empty", - - /* Features */ - "sWrapper": "dataTables_wrapper", - "sFilter": "dataTables_filter", - "sInfo": "dataTables_info", - "sPaging": "dataTables_paginate paging_", /* Note that the type is postfixed */ - "sLength": "dataTables_length", - "sProcessing": "dataTables_processing", - - /* Sorting */ - "sSortAsc": "sorting_asc", - "sSortDesc": "sorting_desc", - "sSortable": "sorting", /* Sortable in both directions */ - "sSortableAsc": "sorting_asc_disabled", - "sSortableDesc": "sorting_desc_disabled", - "sSortableNone": "sorting_disabled", - "sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */ - - /* Filtering */ - "sFilterInput": "", - - /* Page length */ - "sLengthSelect": "", - - /* Scrolling */ - "sScrollWrapper": "dataTables_scroll", - "sScrollHead": "dataTables_scrollHead", - "sScrollHeadInner": "dataTables_scrollHeadInner", - "sScrollBody": "dataTables_scrollBody", - "sScrollFoot": "dataTables_scrollFoot", - "sScrollFootInner": "dataTables_scrollFootInner", - - /* Misc */ - "sHeaderTH": "", - "sFooterTH": "", - - // Deprecated - "sSortJUIAsc": "", - "sSortJUIDesc": "", - "sSortJUI": "", - "sSortJUIAscAllowed": "", - "sSortJUIDescAllowed": "", - "sSortJUIWrapper": "", - "sSortIcon": "", - "sJUIHeader": "", - "sJUIFooter": "" - }); - - - var extPagination = DataTable.ext.pager; - - function _numbers(page, pages) { - var - numbers = [], - buttons = extPagination.numbers_length, - half = Math.floor(buttons / 2), - i = 1; - - if (pages <= buttons) { - numbers = _range(0, pages); - } else if (page <= half) { - numbers = _range(0, buttons - 2); - numbers.push('ellipsis'); - numbers.push(pages - 1); - } else if (page >= pages - 1 - half) { - numbers = _range(pages - (buttons - 2), pages); - numbers.splice(0, 0, 'ellipsis'); // no unshift in ie6 - numbers.splice(0, 0, 0); - } else { - numbers = _range(page - half + 2, page + half - 1); - numbers.push('ellipsis'); - numbers.push(pages - 1); - numbers.splice(0, 0, 'ellipsis'); - numbers.splice(0, 0, 0); - } - - numbers.DT_el = 'span'; - return numbers; - } - - - $.extend(extPagination, { - simple: function (page, pages) { - return ['previous', 'next']; - }, - - full: function (page, pages) { - return ['first', 'previous', 'next', 'last']; - }, - - numbers: function (page, pages) { - return [_numbers(page, pages)]; - }, - - simple_numbers: function (page, pages) { - return ['previous', _numbers(page, pages), 'next']; - }, - - full_numbers: function (page, pages) { - return ['first', 'previous', _numbers(page, pages), 'next', 'last']; - }, - - first_last_numbers: function (page, pages) { - return ['first', _numbers(page, pages), 'last']; - }, - - // For testing and plug-ins to use - _numbers: _numbers, - - // Number of number buttons (including ellipsis) to show. _Must be odd!_ - numbers_length: 7 - }); - - - $.extend(true, DataTable.ext.renderer, { - pageButton: { - _: function (settings, host, idx, buttons, page, pages) { - var classes = settings.oClasses; - var lang = settings.oLanguage.oPaginate; - var aria = settings.oLanguage.oAria.paginate || {}; - var btnDisplay, btnClass, counter = 0; - - var attach = function (container, buttons) { - var i, ien, node, button, tabIndex; - var disabledClass = classes.sPageButtonDisabled; - var clickHandler = function (e) { - _fnPageChange(settings, e.data.action, true); - }; - - for (i = 0, ien = buttons.length; i < ien; i++) { - button = buttons[i]; - - if (Array.isArray(button)) { - var inner = $('<' + (button.DT_el || 'div') + '/>') - .appendTo(container); - attach(inner, button); - } else { - btnDisplay = null; - btnClass = button; - tabIndex = settings.iTabIndex; - - switch (button) { - case 'ellipsis': - container.append(''); - break; - - case 'first': - btnDisplay = lang.sFirst; - - if (page === 0) { - tabIndex = -1; - btnClass += ' ' + disabledClass; - } - break; - - case 'previous': - btnDisplay = lang.sPrevious; - - if (page === 0) { - tabIndex = -1; - btnClass += ' ' + disabledClass; - } - break; - - case 'next': - btnDisplay = lang.sNext; - - if (pages === 0 || page === pages - 1) { - tabIndex = -1; - btnClass += ' ' + disabledClass; - } - break; - - case 'last': - btnDisplay = lang.sLast; - - if (pages === 0 || page === pages - 1) { - tabIndex = -1; - btnClass += ' ' + disabledClass; - } - break; - - default: - btnDisplay = settings.fnFormatNumber(button + 1); - btnClass = page === button ? - classes.sPageButtonActive : ''; - break; - } - - if (btnDisplay !== null) { - node = $('', { - 'class': classes.sPageButton + ' ' + btnClass, - 'aria-controls': settings.sTableId, - 'aria-label': aria[button], - 'data-dt-idx': counter, - 'tabindex': tabIndex, - 'id': idx === 0 && typeof button === 'string' ? - settings.sTableId + '_' + button : - null - }) - .html(btnDisplay) - .appendTo(container); - - _fnBindAction( - node, {action: button}, clickHandler - ); - - counter++; - } - } - } - }; - - // IE9 throws an 'unknown error' if document.activeElement is used - // inside an iframe or frame. Try / catch the error. Not good for - // accessibility, but neither are frames. - var activeEl; - - try { - // Because this approach is destroying and recreating the paging - // elements, focus is lost on the select button which is bad for - // accessibility. So we want to restore focus once the draw has - // completed - activeEl = $(host).find(document.activeElement).data('dt-idx'); - } catch (e) { - } - - attach($(host).empty(), buttons); - - if (activeEl !== undefined) { - $(host).find('[data-dt-idx=' + activeEl + ']').trigger('focus'); - } - } - } - }); - - - // Built in type detection. See model.ext.aTypes for information about - // what is required from this methods. - $.extend(DataTable.ext.type.detect, [ - // Plain numbers - first since V8 detects some plain numbers as dates - // e.g. Date.parse('55') (but not all, e.g. Date.parse('22')...). - function (d, settings) { - var decimal = settings.oLanguage.sDecimal; - return _isNumber(d, decimal) ? 'num' + decimal : null; - }, - - // Dates (only those recognised by the browser's Date.parse) - function (d, settings) { - // V8 tries _very_ hard to make a string passed into `Date.parse()` - // valid, so we need to use a regex to restrict date formats. Use a - // plug-in for anything other than ISO8601 style strings - if (d && !(d instanceof Date) && !_re_date.test(d)) { - return null; - } - var parsed = Date.parse(d); - return (parsed !== null && !isNaN(parsed)) || _empty(d) ? 'date' : null; - }, - - // Formatted numbers - function (d, settings) { - var decimal = settings.oLanguage.sDecimal; - return _isNumber(d, decimal, true) ? 'num-fmt' + decimal : null; - }, - - // HTML numeric - function (d, settings) { - var decimal = settings.oLanguage.sDecimal; - return _htmlNumeric(d, decimal) ? 'html-num' + decimal : null; - }, - - // HTML numeric, formatted - function (d, settings) { - var decimal = settings.oLanguage.sDecimal; - return _htmlNumeric(d, decimal, true) ? 'html-num-fmt' + decimal : null; - }, - - // HTML (this is strict checking - there must be html) - function (d, settings) { - return _empty(d) || (typeof d === 'string' && d.indexOf('<') !== -1) ? - 'html' : null; - } - ]); - - - // Filter formatting functions. See model.ext.ofnSearch for information about - // what is required from these methods. - // - // Note that additional search methods are added for the html numbers and - // html formatted numbers by `_addNumericSort()` when we know what the decimal - // place is - - - $.extend(DataTable.ext.type.search, { - html: function (data) { - return _empty(data) ? - data : - typeof data === 'string' ? - data - .replace(_re_new_lines, " ") - .replace(_re_html, "") : - ''; - }, - - string: function (data) { - return _empty(data) ? - data : - typeof data === 'string' ? - data.replace(_re_new_lines, " ") : - data; - } - }); - - - var __numericReplace = function (d, decimalPlace, re1, re2) { - if (d !== 0 && (!d || d === '-')) { - return -Infinity; - } - - // If a decimal place other than `.` is used, it needs to be given to the - // function so we can detect it and replace with a `.` which is the only - // decimal place Javascript recognises - it is not locale aware. - if (decimalPlace) { - d = _numToDecimal(d, decimalPlace); - } - - if (d.replace) { - if (re1) { - d = d.replace(re1, ''); - } - - if (re2) { - d = d.replace(re2, ''); - } - } - - return d * 1; - }; - - - // Add the numeric 'deformatting' functions for sorting and search. This is done - // in a function to provide an easy ability for the language options to add - // additional methods if a non-period decimal place is used. - function _addNumericSort(decimalPlace) { - $.each( - { - // Plain numbers - "num": function (d) { - return __numericReplace(d, decimalPlace); - }, - - // Formatted numbers - "num-fmt": function (d) { - return __numericReplace(d, decimalPlace, _re_formatted_numeric); - }, - - // HTML numeric - "html-num": function (d) { - return __numericReplace(d, decimalPlace, _re_html); - }, - - // HTML numeric, formatted - "html-num-fmt": function (d) { - return __numericReplace(d, decimalPlace, _re_html, _re_formatted_numeric); - } - }, - function (key, fn) { - // Add the ordering method - _ext.type.order[key + decimalPlace + '-pre'] = fn; - - // For HTML types add a search formatter that will strip the HTML - if (key.match(/^html\-/)) { - _ext.type.search[key + decimalPlace] = _ext.type.search.html; - } - } - ); - } - - - // Default sort methods - $.extend(_ext.type.order, { - // Dates - "date-pre": function (d) { - var ts = Date.parse(d); - return isNaN(ts) ? -Infinity : ts; - }, - - // html - "html-pre": function (a) { - return _empty(a) ? - '' : - a.replace ? - a.replace(/<.*?>/g, "").toLowerCase() : - a + ''; - }, - - // string - "string-pre": function (a) { - // This is a little complex, but faster than always calling toString, - // http://jsperf.com/tostring-v-check - return _empty(a) ? - '' : - typeof a === 'string' ? - a.toLowerCase() : - !a.toString ? - '' : - a.toString(); - }, - - // string-asc and -desc are retained only for compatibility with the old - // sort methods - "string-asc": function (x, y) { - return ((x < y) ? -1 : ((x > y) ? 1 : 0)); - }, - - "string-desc": function (x, y) { - return ((x < y) ? 1 : ((x > y) ? -1 : 0)); - } - }); - - - // Numeric sorting types - order doesn't matter here - _addNumericSort(''); - - - $.extend(true, DataTable.ext.renderer, { - header: { - _: function (settings, cell, column, classes) { - // No additional mark-up required - // Attach a sort listener to update on sort - note that using the - // `DT` namespace will allow the event to be removed automatically - // on destroy, while the `dt` namespaced event is the one we are - // listening for - $(settings.nTable).on('order.dt.DT', function (e, ctx, sorting, columns) { - if (settings !== ctx) { // need to check this this is the host - return; // table, not a nested one - } - - var colIdx = column.idx; - - cell - .removeClass( - column.sSortingClass + ' ' + - classes.sSortAsc + ' ' + - classes.sSortDesc - ) - .addClass(columns[colIdx] == 'asc' ? - classes.sSortAsc : columns[colIdx] == 'desc' ? - classes.sSortDesc : - column.sSortingClass - ); - }); - }, - - jqueryui: function (settings, cell, column, classes) { - $('
') - .addClass(classes.sSortJUIWrapper) - .append(cell.contents()) - .append($('') - .addClass(classes.sSortIcon + ' ' + column.sSortingClassJUI) - ) - .appendTo(cell); - - // Attach a sort listener to update on sort - $(settings.nTable).on('order.dt.DT', function (e, ctx, sorting, columns) { - if (settings !== ctx) { - return; - } - - var colIdx = column.idx; - - cell - .removeClass(classes.sSortAsc + " " + classes.sSortDesc) - .addClass(columns[colIdx] == 'asc' ? - classes.sSortAsc : columns[colIdx] == 'desc' ? - classes.sSortDesc : - column.sSortingClass - ); - - cell - .find('span.' + classes.sSortIcon) - .removeClass( - classes.sSortJUIAsc + " " + - classes.sSortJUIDesc + " " + - classes.sSortJUI + " " + - classes.sSortJUIAscAllowed + " " + - classes.sSortJUIDescAllowed - ) - .addClass(columns[colIdx] == 'asc' ? - classes.sSortJUIAsc : columns[colIdx] == 'desc' ? - classes.sSortJUIDesc : - column.sSortingClassJUI - ); - }); - } - } - }); - - /* - * Public helper functions. These aren't used internally by DataTables, or - * called by any of the options passed into DataTables, but they can be used - * externally by developers working with DataTables. They are helper functions - * to make working with DataTables a little bit easier. - */ - - var __htmlEscapeEntities = function (d) { - return typeof d === 'string' ? - d - .replace(/&/g, '&') - .replace(//g, '>') - .replace(/"/g, '"') : - d; - }; - - /** - * Helpers for `columns.render`. - * - * The options defined here can be used with the `columns.render` initialisation - * option to provide a display renderer. The following functions are defined: - * - * * `number` - Will format numeric data (defined by `columns.data`) for - * display, retaining the original unformatted data for sorting and filtering. - * It takes 5 parameters: - * * `string` - Thousands grouping separator - * * `string` - Decimal point indicator - * * `integer` - Number of decimal points to show - * * `string` (optional) - Prefix. - * * `string` (optional) - Postfix (/suffix). - * * `text` - Escape HTML to help prevent XSS attacks. It has no optional - * parameters. - * - * @example - * // Column definition using the number renderer - * { - * data: "salary", - * render: $.fn.dataTable.render.number( '\'', '.', 0, '$' ) - * } - * - * @namespace - */ - DataTable.render = { - number: function (thousands, decimal, precision, prefix, postfix) { - return { - display: function (d) { - if (typeof d !== 'number' && typeof d !== 'string') { - return d; - } - - var negative = d < 0 ? '-' : ''; - var flo = parseFloat(d); - - // If NaN then there isn't much formatting that we can do - just - // return immediately, escaping any HTML (this was supposed to - // be a number after all) - if (isNaN(flo)) { - return __htmlEscapeEntities(d); - } - - flo = flo.toFixed(precision); - d = Math.abs(flo); - - var intPart = parseInt(d, 10); - var floatPart = precision ? - decimal + (d - intPart).toFixed(precision).substring(2) : - ''; - - return negative + (prefix || '') + - intPart.toString().replace( - /\B(?=(\d{3})+(?!\d))/g, thousands - ) + - floatPart + - (postfix || ''); - } - }; - }, - - text: function () { - return { - display: __htmlEscapeEntities, - filter: __htmlEscapeEntities - }; - } - }; - - - /* - * This is really a good bit rubbish this method of exposing the internal methods - * publicly... - To be fixed in 2.0 using methods on the prototype - */ - - - /** - * Create a wrapper function for exporting an internal functions to an external API. - * @param {string} fn API function name - * @returns {function} wrapped function - * @memberof DataTable#internal - */ - function _fnExternApiFunc(fn) { - return function () { - var args = [_fnSettingsFromNode(this[DataTable.ext.iApiIndex])].concat( - Array.prototype.slice.call(arguments) - ); - return DataTable.ext.internal[fn].apply(this, args); - }; - } - - - /** - * Reference to internal functions for use by plug-in developers. Note that - * these methods are references to internal functions and are considered to be - * private. If you use these methods, be aware that they are liable to change - * between versions. - * @namespace - */ - $.extend(DataTable.ext.internal, { - _fnExternApiFunc: _fnExternApiFunc, - _fnBuildAjax: _fnBuildAjax, - _fnAjaxUpdate: _fnAjaxUpdate, - _fnAjaxParameters: _fnAjaxParameters, - _fnAjaxUpdateDraw: _fnAjaxUpdateDraw, - _fnAjaxDataSrc: _fnAjaxDataSrc, - _fnAddColumn: _fnAddColumn, - _fnColumnOptions: _fnColumnOptions, - _fnAdjustColumnSizing: _fnAdjustColumnSizing, - _fnVisibleToColumnIndex: _fnVisibleToColumnIndex, - _fnColumnIndexToVisible: _fnColumnIndexToVisible, - _fnVisbleColumns: _fnVisbleColumns, - _fnGetColumns: _fnGetColumns, - _fnColumnTypes: _fnColumnTypes, - _fnApplyColumnDefs: _fnApplyColumnDefs, - _fnHungarianMap: _fnHungarianMap, - _fnCamelToHungarian: _fnCamelToHungarian, - _fnLanguageCompat: _fnLanguageCompat, - _fnBrowserDetect: _fnBrowserDetect, - _fnAddData: _fnAddData, - _fnAddTr: _fnAddTr, - _fnNodeToDataIndex: _fnNodeToDataIndex, - _fnNodeToColumnIndex: _fnNodeToColumnIndex, - _fnGetCellData: _fnGetCellData, - _fnSetCellData: _fnSetCellData, - _fnSplitObjNotation: _fnSplitObjNotation, - _fnGetObjectDataFn: _fnGetObjectDataFn, - _fnSetObjectDataFn: _fnSetObjectDataFn, - _fnGetDataMaster: _fnGetDataMaster, - _fnClearTable: _fnClearTable, - _fnDeleteIndex: _fnDeleteIndex, - _fnInvalidate: _fnInvalidate, - _fnGetRowElements: _fnGetRowElements, - _fnCreateTr: _fnCreateTr, - _fnBuildHead: _fnBuildHead, - _fnDrawHead: _fnDrawHead, - _fnDraw: _fnDraw, - _fnReDraw: _fnReDraw, - _fnAddOptionsHtml: _fnAddOptionsHtml, - _fnDetectHeader: _fnDetectHeader, - _fnGetUniqueThs: _fnGetUniqueThs, - _fnFeatureHtmlFilter: _fnFeatureHtmlFilter, - _fnFilterComplete: _fnFilterComplete, - _fnFilterCustom: _fnFilterCustom, - _fnFilterColumn: _fnFilterColumn, - _fnFilter: _fnFilter, - _fnFilterCreateSearch: _fnFilterCreateSearch, - _fnEscapeRegex: _fnEscapeRegex, - _fnFilterData: _fnFilterData, - _fnFeatureHtmlInfo: _fnFeatureHtmlInfo, - _fnUpdateInfo: _fnUpdateInfo, - _fnInfoMacros: _fnInfoMacros, - _fnInitialise: _fnInitialise, - _fnInitComplete: _fnInitComplete, - _fnLengthChange: _fnLengthChange, - _fnFeatureHtmlLength: _fnFeatureHtmlLength, - _fnFeatureHtmlPaginate: _fnFeatureHtmlPaginate, - _fnPageChange: _fnPageChange, - _fnFeatureHtmlProcessing: _fnFeatureHtmlProcessing, - _fnProcessingDisplay: _fnProcessingDisplay, - _fnFeatureHtmlTable: _fnFeatureHtmlTable, - _fnScrollDraw: _fnScrollDraw, - _fnApplyToChildren: _fnApplyToChildren, - _fnCalculateColumnWidths: _fnCalculateColumnWidths, - _fnThrottle: _fnThrottle, - _fnConvertToWidth: _fnConvertToWidth, - _fnGetWidestNode: _fnGetWidestNode, - _fnGetMaxLenString: _fnGetMaxLenString, - _fnStringToCss: _fnStringToCss, - _fnSortFlatten: _fnSortFlatten, - _fnSort: _fnSort, - _fnSortAria: _fnSortAria, - _fnSortListener: _fnSortListener, - _fnSortAttachListener: _fnSortAttachListener, - _fnSortingClasses: _fnSortingClasses, - _fnSortData: _fnSortData, - _fnSaveState: _fnSaveState, - _fnLoadState: _fnLoadState, - _fnSettingsFromNode: _fnSettingsFromNode, - _fnLog: _fnLog, - _fnMap: _fnMap, - _fnBindAction: _fnBindAction, - _fnCallbackReg: _fnCallbackReg, - _fnCallbackFire: _fnCallbackFire, - _fnLengthOverflow: _fnLengthOverflow, - _fnRenderer: _fnRenderer, - _fnDataSource: _fnDataSource, - _fnRowAttributes: _fnRowAttributes, - _fnExtend: _fnExtend, - _fnCalculateEnd: function () { - } // Used by a lot of plug-ins, but redundant - // in 1.10, so this dead-end function is - // added to prevent errors - }); - - - // jQuery access - $.fn.dataTable = DataTable; - - // Provide access to the host jQuery object (circular reference) - DataTable.$ = $; - - // Legacy aliases - $.fn.dataTableSettings = DataTable.settings; - $.fn.dataTableExt = DataTable.ext; - - // With a capital `D` we return a DataTables API instance rather than a - // jQuery object - $.fn.DataTable = function (opts) { - return $(this).dataTable(opts).api(); - }; - - // All properties that are available to $.fn.dataTable should also be - // available on $.fn.DataTable - $.each(DataTable, function (prop, val) { - $.fn.DataTable[prop] = val; - }); - - - // Information about events fired by DataTables - for documentation. - /** - * Draw event, fired whenever the table is redrawn on the page, at the same - * point as fnDrawCallback. This may be useful for binding events or - * performing calculations when the table is altered at all. - * @name DataTable#draw.dt - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ - - /** - * Search event, fired when the searching applied to the table (using the - * built-in global search, or column filters) is altered. - * @name DataTable#search.dt - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ - - /** - * Page change event, fired when the paging of the table is altered. - * @name DataTable#page.dt - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ - - /** - * Order event, fired when the ordering applied to the table is altered. - * @name DataTable#order.dt - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ - - /** - * DataTables initialisation complete event, fired when the table is fully - * drawn, including Ajax data loaded, if Ajax data is required. - * @name DataTable#init.dt - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {object} json The JSON object request from the server - only - * present if client-side Ajax sourced data is used - */ - - /** - * State save event, fired when the table has changed state a new state save - * is required. This event allows modification of the state saving object - * prior to actually doing the save, including addition or other state - * properties (for plug-ins) or modification of a DataTables core property. - * @name DataTable#stateSaveParams.dt - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {object} json The state information to be saved - */ - - /** - * State load event, fired when the table is loading state from the stored - * data, but prior to the settings object being modified by the saved state - * - allowing modification of the saved state is required or loading of - * state for a plug-in. - * @name DataTable#stateLoadParams.dt - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {object} json The saved state information - */ - - /** - * State loaded event, fired when state has been loaded from stored data and - * the settings object has been modified by the loaded data. - * @name DataTable#stateLoaded.dt - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {object} json The saved state information - */ - - /** - * Processing event, fired when DataTables is doing some kind of processing - * (be it, order, search or anything else). It can be used to indicate to - * the end user that there is something happening, or that something has - * finished. - * @name DataTable#processing.dt - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {boolean} bShow Flag for if DataTables is doing processing or not - */ - - /** - * Ajax (XHR) event, fired whenever an Ajax request is completed from a - * request to made to the server for new data. This event is called before - * DataTables processed the returned data, so it can also be used to pre- - * process the data returned from the server, if needed. - * - * Note that this trigger is called in `fnServerData`, if you override - * `fnServerData` and which to use this event, you need to trigger it in you - * success function. - * @name DataTable#xhr.dt - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - * @param {object} json JSON returned from the server - * - * @example - * // Use a custom property returned from the server in another DOM element - * $('#table').dataTable().on('xhr.dt', function (e, settings, json) { - * $('#status').html( json.status ); - * } ); - * - * @example - * // Pre-process the data returned from the server - * $('#table').dataTable().on('xhr.dt', function (e, settings, json) { - * for ( var i=0, ien=json.aaData.length ; i<'col-sm-12 col-md-6'f>>" + - "<'row'<'col-sm-12'tr>>" + - "<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>", - renderer: 'bootstrap' - }); - - - /* Default class modification */ - $.extend(DataTable.ext.classes, { - sWrapper: "dataTables_wrapper dt-bootstrap4", - sFilterInput: "form-control form-control-sm", - sLengthSelect: "custom-select custom-select-sm form-control form-control-sm", - sProcessing: "dataTables_processing card", - sPageButton: "paginate_button page-item" - }); - - - /* Bootstrap paging button renderer */ - DataTable.ext.renderer.pageButton.bootstrap = function (settings, host, idx, buttons, page, pages) { - var api = new DataTable.Api(settings); - var classes = settings.oClasses; - var lang = settings.oLanguage.oPaginate; - var aria = settings.oLanguage.oAria.paginate || {}; - var btnDisplay, btnClass, counter = 0; - - var attach = function (container, buttons) { - var i, ien, node, button; - var clickHandler = function (e) { - e.preventDefault(); - if (!$(e.currentTarget).hasClass('disabled') && api.page() != e.data.action) { - api.page(e.data.action).draw('page'); - } - }; - - for (i = 0, ien = buttons.length; i < ien; i++) { - button = buttons[i]; - - if (Array.isArray(button)) { - attach(container, button); - } else { - btnDisplay = ''; - btnClass = ''; - - switch (button) { - case 'ellipsis': - btnDisplay = '…'; - btnClass = 'disabled'; - break; - - case 'first': - btnDisplay = lang.sFirst; - btnClass = button + (page > 0 ? - '' : ' disabled'); - break; - - case 'previous': - btnDisplay = lang.sPrevious; - btnClass = button + (page > 0 ? - '' : ' disabled'); - break; - - case 'next': - btnDisplay = lang.sNext; - btnClass = button + (page < pages - 1 ? - '' : ' disabled'); - break; - - case 'last': - btnDisplay = lang.sLast; - btnClass = button + (page < pages - 1 ? - '' : ' disabled'); - break; - - default: - btnDisplay = button + 1; - btnClass = page === button ? - 'active' : ''; - break; - } - - if (btnDisplay) { - node = $('
  • ', { - 'class': classes.sPageButton + ' ' + btnClass, - 'id': idx === 0 && typeof button === 'string' ? - settings.sTableId + '_' + button : - null - }) - .append($('', { - 'href': '#', - 'aria-controls': settings.sTableId, - 'aria-label': aria[button], - 'data-dt-idx': counter, - 'tabindex': settings.iTabIndex, - 'class': 'page-link' - }) - .html(btnDisplay) - ) - .appendTo(container); - - settings.oApi._fnBindAction( - node, {action: button}, clickHandler - ); - - counter++; - } - } - } - }; - - // IE9 throws an 'unknown error' if document.activeElement is used - // inside an iframe or frame. - var activeEl; - - try { - // Because this approach is destroying and recreating the paging - // elements, focus is lost on the select button which is bad for - // accessibility. So we want to restore focus once the draw has - // completed - activeEl = $(host).find(document.activeElement).data('dt-idx'); - } catch (e) { - } - - attach( - $(host).empty().html('
      ').children('ul'), - buttons - ); - - if (activeEl !== undefined) { - $(host).find('[data-dt-idx=' + activeEl + ']').trigger('focus'); - } - }; - - - return DataTable; -})); - - -/*! Responsive 2.2.7 - * 2014-2021 SpryMedia Ltd - datatables.net/license - */ - -/** - * @summary Responsive - * @description Responsive tables plug-in for DataTables - * @version 2.2.7 - * @file dataTables.responsive.js - * @author SpryMedia Ltd (www.sprymedia.co.uk) - * @contact www.sprymedia.co.uk/contact - * @copyright Copyright 2014-2021 SpryMedia Ltd. - * - * This source file is free software, available under the following license: - * MIT license - http://datatables.net/license/mit - * - * This source file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. - * - * For details please refer to: http://www.datatables.net - */ -(function (factory) { - if (typeof define === 'function' && define.amd) { - // AMD - define(['jquery', 'datatables.net'], function ($) { - return factory($, window, document); - }); - } else if (typeof exports === 'object') { - // CommonJS - module.exports = function (root, $) { - if (!root) { - root = window; - } - - if (!$ || !$.fn.dataTable) { - $ = require('datatables.net')(root, $).$; - } - - return factory($, root, root.document); - }; - } else { - // Browser - factory(jQuery, window, document); - } -}(function ($, window, document, undefined) { - 'use strict'; - var DataTable = $.fn.dataTable; - - - /** - * Responsive is a plug-in for the DataTables library that makes use of - * DataTables' ability to change the visibility of columns, changing the - * visibility of columns so the displayed columns fit into the table container. - * The end result is that complex tables will be dynamically adjusted to fit - * into the viewport, be it on a desktop, tablet or mobile browser. - * - * Responsive for DataTables has two modes of operation, which can used - * individually or combined: - * - * * Class name based control - columns assigned class names that match the - * breakpoint logic can be shown / hidden as required for each breakpoint. - * * Automatic control - columns are automatically hidden when there is no - * room left to display them. Columns removed from the right. - * - * In additional to column visibility control, Responsive also has built into - * options to use DataTables' child row display to show / hide the information - * from the table that has been hidden. There are also two modes of operation - * for this child row display: - * - * * Inline - when the control element that the user can use to show / hide - * child rows is displayed inside the first column of the table. - * * Column - where a whole column is dedicated to be the show / hide control. - * - * Initialisation of Responsive is performed by: - * - * * Adding the class `responsive` or `dt-responsive` to the table. In this case - * Responsive will automatically be initialised with the default configuration - * options when the DataTable is created. - * * Using the `responsive` option in the DataTables configuration options. This - * can also be used to specify the configuration options, or simply set to - * `true` to use the defaults. - * - * @class - * @param {object} settings DataTables settings object for the host table - * @param {object} [opts] Configuration options - * @requires jQuery 1.7+ - * @requires DataTables 1.10.3+ - * - * @example - * $('#example').DataTable( { - * responsive: true - * } ); - * } ); - */ - var Responsive = function (settings, opts) { - // Sanity check that we are using DataTables 1.10 or newer - if (!DataTable.versionCheck || !DataTable.versionCheck('1.10.10')) { - throw 'DataTables Responsive requires DataTables 1.10.10 or newer'; - } - - this.s = { - dt: new DataTable.Api(settings), - columns: [], - current: [] - }; - - // Check if responsive has already been initialised on this table - if (this.s.dt.settings()[0].responsive) { - return; - } - - // details is an object, but for simplicity the user can give it as a string - // or a boolean - if (opts && typeof opts.details === 'string') { - opts.details = {type: opts.details}; - } else if (opts && opts.details === false) { - opts.details = {type: false}; - } else if (opts && opts.details === true) { - opts.details = {type: 'inline'}; - } - - this.c = $.extend(true, {}, Responsive.defaults, DataTable.defaults.responsive, opts); - settings.responsive = this; - this._constructor(); - }; - - $.extend(Responsive.prototype, { - /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Constructor - */ - - /** - * Initialise the Responsive instance - * - * @private - */ - _constructor: function () { - var that = this; - var dt = this.s.dt; - var dtPrivateSettings = dt.settings()[0]; - var oldWindowWidth = $(window).innerWidth(); - - dt.settings()[0]._responsive = this; - - // Use DataTables' throttle function to avoid processor thrashing on - // resize - $(window).on('resize.dtr orientationchange.dtr', DataTable.util.throttle(function () { - // iOS has a bug whereby resize can fire when only scrolling - // See: http://stackoverflow.com/questions/8898412 - var width = $(window).innerWidth(); - - if (width !== oldWindowWidth) { - that._resize(); - oldWindowWidth = width; - } - })); - - // DataTables doesn't currently trigger an event when a row is added, so - // we need to hook into its private API to enforce the hidden rows when - // new data is added - dtPrivateSettings.oApi._fnCallbackReg(dtPrivateSettings, 'aoRowCreatedCallback', function (tr, data, idx) { - if ($.inArray(false, that.s.current) !== -1) { - $('>td, >th', tr).each(function (i) { - var idx = dt.column.index('toData', i); - - if (that.s.current[idx] === false) { - $(this).css('display', 'none'); - } - }); - } - }); - - // Destroy event handler - dt.on('destroy.dtr', function () { - dt.off('.dtr'); - $(dt.table().body()).off('.dtr'); - $(window).off('resize.dtr orientationchange.dtr'); - dt.cells('.dtr-control').nodes().to$().removeClass('dtr-control'); - - // Restore the columns that we've hidden - $.each(that.s.current, function (i, val) { - if (val === false) { - that._setColumnVis(i, true); - } - }); - }); - - // Reorder the breakpoints array here in case they have been added out - // of order - this.c.breakpoints.sort(function (a, b) { - return a.width < b.width ? 1 : - a.width > b.width ? -1 : 0; - }); - - this._classLogic(); - this._resizeAuto(); - - // Details handler - var details = this.c.details; - - if (details.type !== false) { - that._detailsInit(); - - // DataTables will trigger this event on every column it shows and - // hides individually - dt.on('column-visibility.dtr', function () { - // Use a small debounce to allow multiple columns to be set together - if (that._timer) { - clearTimeout(that._timer); - } - - that._timer = setTimeout(function () { - that._timer = null; - - that._classLogic(); - that._resizeAuto(); - that._resize(true); - - that._redrawChildren(); - }, 100); - }); - - // Redraw the details box on each draw which will happen if the data - // has changed. This is used until DataTables implements a native - // `updated` event for rows - dt.on('draw.dtr', function () { - that._redrawChildren(); - }); - - $(dt.table().node()).addClass('dtr-' + details.type); - } - - dt.on('column-reorder.dtr', function (e, settings, details) { - that._classLogic(); - that._resizeAuto(); - that._resize(true); - }); - - // Change in column sizes means we need to calc - dt.on('column-sizing.dtr', function () { - that._resizeAuto(); - that._resize(); - }); - - // On Ajax reload we want to reopen any child rows which are displayed - // by responsive - dt.on('preXhr.dtr', function () { - var rowIds = []; - dt.rows().every(function () { - if (this.child.isShown()) { - rowIds.push(this.id(true)); - } - }); - - dt.one('draw.dtr', function () { - that._resizeAuto(); - that._resize(); - - dt.rows(rowIds).every(function () { - that._detailsDisplay(this, false); - }); - }); - }); - - dt - .on('draw.dtr', function () { - that._controlClass(); - }) - .on('init.dtr', function (e, settings, details) { - if (e.namespace !== 'dt') { - return; - } - - that._resizeAuto(); - that._resize(); - - // If columns were hidden, then DataTables needs to adjust the - // column sizing - if ($.inArray(false, that.s.current)) { - dt.columns.adjust(); - } - }); - - // First pass - draw the table for the current viewport size - this._resize(); - }, - - - /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Private methods - */ - - /** - * Calculate the visibility for the columns in a table for a given - * breakpoint. The result is pre-determined based on the class logic if - * class names are used to control all columns, but the width of the table - * is also used if there are columns which are to be automatically shown - * and hidden. - * - * @param {string} breakpoint Breakpoint name to use for the calculation - * @return {array} Array of boolean values initiating the visibility of each - * column. - * @private - */ - _columnsVisiblity: function (breakpoint) { - var dt = this.s.dt; - var columns = this.s.columns; - var i, ien; - - // Create an array that defines the column ordering based first on the - // column's priority, and secondly the column index. This allows the - // columns to be removed from the right if the priority matches - var order = columns - .map(function (col, idx) { - return { - columnIdx: idx, - priority: col.priority - }; - }) - .sort(function (a, b) { - if (a.priority !== b.priority) { - return a.priority - b.priority; - } - return a.columnIdx - b.columnIdx; - }); - - // Class logic - determine which columns are in this breakpoint based - // on the classes. If no class control (i.e. `auto`) then `-` is used - // to indicate this to the rest of the function - var display = $.map(columns, function (col, i) { - if (dt.column(i).visible() === false) { - return 'not-visible'; - } - return col.auto && col.minWidth === null ? - false : - col.auto === true ? - '-' : - $.inArray(breakpoint, col.includeIn) !== -1; - }); - - // Auto column control - first pass: how much width is taken by the - // ones that must be included from the non-auto columns - var requiredWidth = 0; - for (i = 0, ien = display.length; i < ien; i++) { - if (display[i] === true) { - requiredWidth += columns[i].minWidth; - } - } - - // Second pass, use up any remaining width for other columns. For - // scrolling tables we need to subtract the width of the scrollbar. It - // may not be requires which makes this sub-optimal, but it would - // require another full redraw to make complete use of those extra few - // pixels - var scrolling = dt.settings()[0].oScroll; - var bar = scrolling.sY || scrolling.sX ? scrolling.iBarWidth : 0; - var widthAvailable = dt.table().container().offsetWidth - bar; - var usedWidth = widthAvailable - requiredWidth; - - // Control column needs to always be included. This makes it sub- - // optimal in terms of using the available with, but to stop layout - // thrashing or overflow. Also we need to account for the control column - // width first so we know how much width is available for the other - // columns, since the control column might not be the first one shown - for (i = 0, ien = display.length; i < ien; i++) { - if (columns[i].control) { - usedWidth -= columns[i].minWidth; - } - } - - // Allow columns to be shown (counting by priority and then right to - // left) until we run out of room - var empty = false; - for (i = 0, ien = order.length; i < ien; i++) { - var colIdx = order[i].columnIdx; - - if (display[colIdx] === '-' && !columns[colIdx].control && columns[colIdx].minWidth) { - // Once we've found a column that won't fit we don't let any - // others display either, or columns might disappear in the - // middle of the table - if (empty || usedWidth - columns[colIdx].minWidth < 0) { - empty = true; - display[colIdx] = false; - } else { - display[colIdx] = true; - } - - usedWidth -= columns[colIdx].minWidth; - } - } - - // Determine if the 'control' column should be shown (if there is one). - // This is the case when there is a hidden column (that is not the - // control column). The two loops look inefficient here, but they are - // trivial and will fly through. We need to know the outcome from the - // first , before the action in the second can be taken - var showControl = false; - - for (i = 0, ien = columns.length; i < ien; i++) { - if (!columns[i].control && !columns[i].never && display[i] === false) { - showControl = true; - break; - } - } - - for (i = 0, ien = columns.length; i < ien; i++) { - if (columns[i].control) { - display[i] = showControl; - } - - // Replace not visible string with false from the control column detection above - if (display[i] === 'not-visible') { - display[i] = false; - } - } - - // Finally we need to make sure that there is at least one column that - // is visible - if ($.inArray(true, display) === -1) { - display[0] = true; - } - - return display; - }, - - - /** - * Create the internal `columns` array with information about the columns - * for the table. This includes determining which breakpoints the column - * will appear in, based upon class names in the column, which makes up the - * vast majority of this method. - * - * @private - */ - _classLogic: function () { - var that = this; - var calc = {}; - var breakpoints = this.c.breakpoints; - var dt = this.s.dt; - var columns = dt.columns().eq(0).map(function (i) { - var column = this.column(i); - var className = column.header().className; - var priority = dt.settings()[0].aoColumns[i].responsivePriority; - var dataPriority = column.header().getAttribute('data-priority'); - - if (priority === undefined) { - priority = dataPriority === undefined || dataPriority === null ? - 10000 : - dataPriority * 1; - } - - return { - className: className, - includeIn: [], - auto: false, - control: false, - never: className.match(/\bnever\b/) ? true : false, - priority: priority - }; - }); - - // Simply add a breakpoint to `includeIn` array, ensuring that there are - // no duplicates - var add = function (colIdx, name) { - var includeIn = columns[colIdx].includeIn; - - if ($.inArray(name, includeIn) === -1) { - includeIn.push(name); - } - }; - - var column = function (colIdx, name, operator, matched) { - var size, i, ien; - - if (!operator) { - columns[colIdx].includeIn.push(name); - } else if (operator === 'max-') { - // Add this breakpoint and all smaller - size = that._find(name).width; - - for (i = 0, ien = breakpoints.length; i < ien; i++) { - if (breakpoints[i].width <= size) { - add(colIdx, breakpoints[i].name); - } - } - } else if (operator === 'min-') { - // Add this breakpoint and all larger - size = that._find(name).width; - - for (i = 0, ien = breakpoints.length; i < ien; i++) { - if (breakpoints[i].width >= size) { - add(colIdx, breakpoints[i].name); - } - } - } else if (operator === 'not-') { - // Add all but this breakpoint - for (i = 0, ien = breakpoints.length; i < ien; i++) { - if (breakpoints[i].name.indexOf(matched) === -1) { - add(colIdx, breakpoints[i].name); - } - } - } - }; - - // Loop over each column and determine if it has a responsive control - // class - columns.each(function (col, i) { - var classNames = col.className.split(' '); - var hasClass = false; - - // Split the class name up so multiple rules can be applied if needed - for (var k = 0, ken = classNames.length; k < ken; k++) { - var className = classNames[k].trim(); - - if (className === 'all') { - // Include in all - hasClass = true; - col.includeIn = $.map(breakpoints, function (a) { - return a.name; - }); - return; - } else if (className === 'none' || col.never) { - // Include in none (default) and no auto - hasClass = true; - return; - } else if (className === 'control' || className === 'dtr-control') { - // Special column that is only visible, when one of the other - // columns is hidden. This is used for the details control - hasClass = true; - col.control = true; - return; - } - - $.each(breakpoints, function (j, breakpoint) { - // Does this column have a class that matches this breakpoint? - var brokenPoint = breakpoint.name.split('-'); - var re = new RegExp('(min\\-|max\\-|not\\-)?(' + brokenPoint[0] + ')(\\-[_a-zA-Z0-9])?'); - var match = className.match(re); - - if (match) { - hasClass = true; - - if (match[2] === brokenPoint[0] && match[3] === '-' + brokenPoint[1]) { - // Class name matches breakpoint name fully - column(i, breakpoint.name, match[1], match[2] + match[3]); - } else if (match[2] === brokenPoint[0] && !match[3]) { - // Class name matched primary breakpoint name with no qualifier - column(i, breakpoint.name, match[1], match[2]); - } - } - }); - } - - // If there was no control class, then automatic sizing is used - if (!hasClass) { - col.auto = true; - } - }); - - this.s.columns = columns; - }, - - /** - * Update the cells to show the correct control class / button - * @private - */ - _controlClass: function () { - if (this.c.details.type === 'inline') { - var dt = this.s.dt; - var columnsVis = this.s.current; - var firstVisible = $.inArray(true, columnsVis); - - // Remove from any cells which shouldn't have it - dt.cells( - null, - function (idx) { - return idx !== firstVisible; - }, - {page: 'current'} - ) - .nodes() - .to$() - .filter('.dtr-control') - .removeClass('dtr-control'); - - dt.cells(null, firstVisible, {page: 'current'}) - .nodes() - .to$() - .addClass('dtr-control'); - } - }, - - /** - * Show the details for the child row - * - * @param {DataTables.Api} row API instance for the row - * @param {boolean} update Update flag - * @private - */ - _detailsDisplay: function (row, update) { - var that = this; - var dt = this.s.dt; - var details = this.c.details; - - if (details && details.type !== false) { - var res = details.display(row, update, function () { - return details.renderer( - dt, row[0], that._detailsObj(row[0]) - ); - }); - - if (res === true || res === false) { - $(dt.table().node()).triggerHandler('responsive-display.dt', [dt, row, res, update]); - } - } - }, - - - /** - * Initialisation for the details handler - * - * @private - */ - _detailsInit: function () { - var that = this; - var dt = this.s.dt; - var details = this.c.details; - - // The inline type always uses the first child as the target - if (details.type === 'inline') { - details.target = 'td.dtr-control, th.dtr-control'; - } - - // Keyboard accessibility - dt.on('draw.dtr', function () { - that._tabIndexes(); - }); - that._tabIndexes(); // Initial draw has already happened - - $(dt.table().body()).on('keyup.dtr', 'td, th', function (e) { - if (e.keyCode === 13 && $(this).data('dtr-keyboard')) { - $(this).click(); - } - }); - - // type.target can be a string jQuery selector or a column index - var target = details.target; - var selector = typeof target === 'string' ? target : 'td, th'; - - if (target !== undefined || target !== null) { - // Click handler to show / hide the details rows when they are available - $(dt.table().body()) - .on('click.dtr mousedown.dtr mouseup.dtr', selector, function (e) { - // If the table is not collapsed (i.e. there is no hidden columns) - // then take no action - if (!$(dt.table().node()).hasClass('collapsed')) { - return; - } - - // Check that the row is actually a DataTable's controlled node - if ($.inArray($(this).closest('tr').get(0), dt.rows().nodes().toArray()) === -1) { - return; - } - - // For column index, we determine if we should act or not in the - // handler - otherwise it is already okay - if (typeof target === 'number') { - var targetIdx = target < 0 ? - dt.columns().eq(0).length + target : - target; - - if (dt.cell(this).index().column !== targetIdx) { - return; - } - } - - // $().closest() includes itself in its check - var row = dt.row($(this).closest('tr')); - - // Check event type to do an action - if (e.type === 'click') { - // The renderer is given as a function so the caller can execute it - // only when they need (i.e. if hiding there is no point is running - // the renderer) - that._detailsDisplay(row, false); - } else if (e.type === 'mousedown') { - // For mouse users, prevent the focus ring from showing - $(this).css('outline', 'none'); - } else if (e.type === 'mouseup') { - // And then re-allow at the end of the click - $(this).trigger('blur').css('outline', ''); - } - }); - } - }, - - - /** - * Get the details to pass to a renderer for a row - * @param {int} rowIdx Row index - * @private - */ - _detailsObj: function (rowIdx) { - var that = this; - var dt = this.s.dt; - - return $.map(this.s.columns, function (col, i) { - // Never and control columns should not be passed to the renderer - if (col.never || col.control) { - return; - } - - var dtCol = dt.settings()[0].aoColumns[i]; - - return { - className: dtCol.sClass, - columnIndex: i, - data: dt.cell(rowIdx, i).render(that.c.orthogonal), - hidden: dt.column(i).visible() && !that.s.current[i], - rowIndex: rowIdx, - title: dtCol.sTitle !== null ? - dtCol.sTitle : - $(dt.column(i).header()).text() - }; - }); - }, - - - /** - * Find a breakpoint object from a name - * - * @param {string} name Breakpoint name to find - * @return {object} Breakpoint description object - * @private - */ - _find: function (name) { - var breakpoints = this.c.breakpoints; - - for (var i = 0, ien = breakpoints.length; i < ien; i++) { - if (breakpoints[i].name === name) { - return breakpoints[i]; - } - } - }, - - - /** - * Re-create the contents of the child rows as the display has changed in - * some way. - * - * @private - */ - _redrawChildren: function () { - var that = this; - var dt = this.s.dt; - - dt.rows({page: 'current'}).iterator('row', function (settings, idx) { - var row = dt.row(idx); - - that._detailsDisplay(dt.row(idx), true); - }); - }, - - - /** - * Alter the table display for a resized viewport. This involves first - * determining what breakpoint the window currently is in, getting the - * column visibilities to apply and then setting them. - * - * @param {boolean} forceRedraw Force a redraw - * @private - */ - _resize: function (forceRedraw) { - var that = this; - var dt = this.s.dt; - var width = $(window).innerWidth(); - var breakpoints = this.c.breakpoints; - var breakpoint = breakpoints[0].name; - var columns = this.s.columns; - var i, ien; - var oldVis = this.s.current.slice(); - - // Determine what breakpoint we are currently at - for (i = breakpoints.length - 1; i >= 0; i--) { - if (width <= breakpoints[i].width) { - breakpoint = breakpoints[i].name; - break; - } - } - - // Show the columns for that break point - var columnsVis = this._columnsVisiblity(breakpoint); - this.s.current = columnsVis; - - // Set the class before the column visibility is changed so event - // listeners know what the state is. Need to determine if there are - // any columns that are not visible but can be shown - var collapsedClass = false; - - for (i = 0, ien = columns.length; i < ien; i++) { - if (columnsVis[i] === false && !columns[i].never && !columns[i].control && !dt.column(i).visible() === false) { - collapsedClass = true; - break; - } - } - - $(dt.table().node()).toggleClass('collapsed', collapsedClass); - - var changed = false; - var visible = 0; - - dt.columns().eq(0).each(function (colIdx, i) { - if (columnsVis[i] === true) { - visible++; - } - - if (forceRedraw || columnsVis[i] !== oldVis[i]) { - changed = true; - that._setColumnVis(colIdx, columnsVis[i]); - } - }); - - if (changed) { - this._redrawChildren(); - - // Inform listeners of the change - $(dt.table().node()).trigger('responsive-resize.dt', [dt, this.s.current]); - - // If no records, update the "No records" display element - if (dt.page.info().recordsDisplay === 0) { - $('td', dt.table().body()).eq(0).attr('colspan', visible); - } - } - - that._controlClass(); - }, - - - /** - * Determine the width of each column in the table so the auto column hiding - * has that information to work with. This method is never going to be 100% - * perfect since column widths can change slightly per page, but without - * seriously compromising performance this is quite effective. - * - * @private - */ - _resizeAuto: function () { - var dt = this.s.dt; - var columns = this.s.columns; - - // Are we allowed to do auto sizing? - if (!this.c.auto) { - return; - } - - // Are there any columns that actually need auto-sizing, or do they all - // have classes defined - if ($.inArray(true, $.map(columns, function (c) { - return c.auto; - })) === -1) { - return; - } - - // Need to restore all children. They will be reinstated by a re-render - if (!$.isEmptyObject(_childNodeStore)) { - $.each(_childNodeStore, function (key) { - var idx = key.split('-'); - - _childNodesRestore(dt, idx[0] * 1, idx[1] * 1); - }); - } - - // Clone the table with the current data in it - var tableWidth = dt.table().node().offsetWidth; - var columnWidths = dt.columns; - var clonedTable = dt.table().node().cloneNode(false); - var clonedHeader = $(dt.table().header().cloneNode(false)).appendTo(clonedTable); - var clonedBody = $(dt.table().body()).clone(false, false).empty().appendTo(clonedTable); // use jQuery because of IE8 - - clonedTable.style.width = 'auto'; - - // Header - var headerCells = dt.columns() - .header() - .filter(function (idx) { - return dt.column(idx).visible(); - }) - .to$() - .clone(false) - .css('display', 'table-cell') - .css('width', 'auto') - .css('min-width', 0); - - // Body rows - we don't need to take account of DataTables' column - // visibility since we implement our own here (hence the `display` set) - $(clonedBody) - .append($(dt.rows({page: 'current'}).nodes()).clone(false)) - .find('th, td').css('display', ''); - - // Footer - var footer = dt.table().footer(); - if (footer) { - var clonedFooter = $(footer.cloneNode(false)).appendTo(clonedTable); - var footerCells = dt.columns() - .footer() - .filter(function (idx) { - return dt.column(idx).visible(); - }) - .to$() - .clone(false) - .css('display', 'table-cell'); - - $('
  • ') - .append(footerCells) - .appendTo(clonedFooter); - } - - $('') - .append(headerCells) - .appendTo(clonedHeader); - - // In the inline case extra padding is applied to the first column to - // give space for the show / hide icon. We need to use this in the - // calculation - if (this.c.details.type === 'inline') { - $(clonedTable).addClass('dtr-inline collapsed'); - } - - // It is unsafe to insert elements with the same name into the DOM - // multiple times. For example, cloning and inserting a checked radio - // clears the chcecked state of the original radio. - $(clonedTable).find('[name]').removeAttr('name'); - - // A position absolute table would take the table out of the flow of - // our container element, bypassing the height and width (Scroller) - $(clonedTable).css('position', 'relative') - - var inserted = $('
    ') - .css({ - width: 1, - height: 1, - overflow: 'hidden', - clear: 'both' - }) - .append(clonedTable); - - inserted.insertBefore(dt.table().node()); - - // The cloned header now contains the smallest that each column can be - headerCells.each(function (i) { - var idx = dt.column.index('fromVisible', i); - columns[idx].minWidth = this.offsetWidth || 0; - }); - - inserted.remove(); - }, - - /** - * Get the state of the current hidden columns - controlled by Responsive only - */ - _responsiveOnlyHidden: function () { - var dt = this.s.dt; - - return $.map(this.s.current, function (v, i) { - // If the column is hidden by DataTables then it can't be hidden by - // Responsive! - if (dt.column(i).visible() === false) { - return true; - } - return v; - }); - }, - - /** - * Set a column's visibility. - * - * We don't use DataTables' column visibility controls in order to ensure - * that column visibility can Responsive can no-exist. Since only IE8+ is - * supported (and all evergreen browsers of course) the control of the - * display attribute works well. - * - * @param {integer} col Column index - * @param {boolean} showHide Show or hide (true or false) - * @private - */ - _setColumnVis: function (col, showHide) { - var dt = this.s.dt; - var display = showHide ? '' : 'none'; // empty string will remove the attr - - $(dt.column(col).header()).css('display', display); - $(dt.column(col).footer()).css('display', display); - dt.column(col).nodes().to$().css('display', display); - - // If the are child nodes stored, we might need to reinsert them - if (!$.isEmptyObject(_childNodeStore)) { - dt.cells(null, col).indexes().each(function (idx) { - _childNodesRestore(dt, idx.row, idx.column); - }); - } - }, - - - /** - * Update the cell tab indexes for keyboard accessibility. This is called on - * every table draw - that is potentially inefficient, but also the least - * complex option given that column visibility can change on the fly. Its a - * shame user-focus was removed from CSS 3 UI, as it would have solved this - * issue with a single CSS statement. - * - * @private - */ - _tabIndexes: function () { - var dt = this.s.dt; - var cells = dt.cells({page: 'current'}).nodes().to$(); - var ctx = dt.settings()[0]; - var target = this.c.details.target; - - cells.filter('[data-dtr-keyboard]').removeData('[data-dtr-keyboard]'); - - if (typeof target === 'number') { - dt.cells(null, target, {page: 'current'}).nodes().to$() - .attr('tabIndex', ctx.iTabIndex) - .data('dtr-keyboard', 1); - } else { - // This is a bit of a hack - we need to limit the selected nodes to just - // those of this table - if (target === 'td:first-child, th:first-child') { - target = '>td:first-child, >th:first-child'; - } - - $(target, dt.rows({page: 'current'}).nodes()) - .attr('tabIndex', ctx.iTabIndex) - .data('dtr-keyboard', 1); - } - } - }); - - - /** - * List of default breakpoints. Each item in the array is an object with two - * properties: - * - * * `name` - the breakpoint name. - * * `width` - the breakpoint width - * - * @name Responsive.breakpoints - * @static - */ - Responsive.breakpoints = [ - {name: 'desktop', width: Infinity}, - {name: 'tablet-l', width: 1024}, - {name: 'tablet-p', width: 768}, - {name: 'mobile-l', width: 480}, - {name: 'mobile-p', width: 320} - ]; - - - /** - * Display methods - functions which define how the hidden data should be shown - * in the table. - * - * @namespace - * @name Responsive.defaults - * @static - */ - Responsive.display = { - childRow: function (row, update, render) { - if (update) { - if ($(row.node()).hasClass('parent')) { - row.child(render(), 'child').show(); - - return true; - } - } else { - if (!row.child.isShown()) { - row.child(render(), 'child').show(); - $(row.node()).addClass('parent'); - - return true; - } else { - row.child(false); - $(row.node()).removeClass('parent'); - - return false; - } - } - }, - - childRowImmediate: function (row, update, render) { - if ((!update && row.child.isShown()) || !row.responsive.hasHidden()) { - // User interaction and the row is show, or nothing to show - row.child(false); - $(row.node()).removeClass('parent'); - - return false; - } else { - // Display - row.child(render(), 'child').show(); - $(row.node()).addClass('parent'); - - return true; - } - }, - - // This is a wrapper so the modal options for Bootstrap and jQuery UI can - // have options passed into them. This specific one doesn't need to be a - // function but it is for consistency in the `modal` name - modal: function (options) { - return function (row, update, render) { - if (!update) { - // Show a modal - var close = function () { - modal.remove(); // will tidy events for us - $(document).off('keypress.dtr'); - }; - - var modal = $('
    ') - .append($('
    ') - .append($('
    ') - .append(render()) - ) - .append($('
    ×
    ') - .click(function () { - close(); - }) - ) - ) - .append($('
    ') - .click(function () { - close(); - }) - ) - .appendTo('body'); - - $(document).on('keyup.dtr', function (e) { - if (e.keyCode === 27) { - e.stopPropagation(); - - close(); - } - }); - } else { - $('div.dtr-modal-content') - .empty() - .append(render()); - } - - if (options && options.header) { - $('div.dtr-modal-content').prepend( - '

    ' + options.header(row) + '

    ' - ); - } - }; - } - }; - - - var _childNodeStore = {}; - - function _childNodes(dt, row, col) { - var name = row + '-' + col; - - if (_childNodeStore[name]) { - return _childNodeStore[name]; - } - - // https://jsperf.com/childnodes-array-slice-vs-loop - var nodes = []; - var children = dt.cell(row, col).node().childNodes; - for (var i = 0, ien = children.length; i < ien; i++) { - nodes.push(children[i]); - } - - _childNodeStore[name] = nodes; - - return nodes; - } - - function _childNodesRestore(dt, row, col) { - var name = row + '-' + col; - - if (!_childNodeStore[name]) { - return; - } - - var node = dt.cell(row, col).node(); - var store = _childNodeStore[name]; - var parent = store[0].parentNode; - var parentChildren = parent.childNodes; - var a = []; - - for (var i = 0, ien = parentChildren.length; i < ien; i++) { - a.push(parentChildren[i]); - } - - for (var j = 0, jen = a.length; j < jen; j++) { - node.appendChild(a[j]); - } - - _childNodeStore[name] = undefined; - } - - - /** - * Display methods - functions which define how the hidden data should be shown - * in the table. - * - * @namespace - * @name Responsive.defaults - * @static - */ - Responsive.renderer = { - listHiddenNodes: function () { - return function (api, rowIdx, columns) { - var ul = $('
      '); - var found = false; - - var data = $.each(columns, function (i, col) { - if (col.hidden) { - var klass = col.className ? - 'class="' + col.className + '"' : - ''; - - $( - '
    • ' + - '' + - col.title + - ' ' + - '
    • ' - ) - .append($('').append(_childNodes(api, col.rowIndex, col.columnIndex)))// api.cell( col.rowIndex, col.columnIndex ).node().childNodes ) ) - .appendTo(ul); - - found = true; - } - }); - - return found ? - ul : - false; - }; - }, - - listHidden: function () { - return function (api, rowIdx, columns) { - var data = $.map(columns, function (col) { - var klass = col.className ? - 'class="' + col.className + '"' : - ''; - - return col.hidden ? - '
    • ' + - '' + - col.title + - ' ' + - '' + - col.data + - '' + - '
    • ' : - ''; - }).join(''); - - return data ? - $('
        ').append(data) : - false; - } - }, - - tableAll: function (options) { - options = $.extend({ - tableClass: '' - }, options); - - return function (api, rowIdx, columns) { - var data = $.map(columns, function (col) { - var klass = col.className ? - 'class="' + col.className + '"' : - ''; - - return '
    ' + - ' ' + - '' + - ''; - }).join(''); - - return $('
    ' + col.title + ':' + '' + col.data + '
    ').append(data); - } - } - }; - - /** - * Responsive default settings for initialisation - * - * @namespace - * @name Responsive.defaults - * @static - */ - Responsive.defaults = { - /** - * List of breakpoints for the instance. Note that this means that each - * instance can have its own breakpoints. Additionally, the breakpoints - * cannot be changed once an instance has been creased. - * - * @type {Array} - * @default Takes the value of `Responsive.breakpoints` - */ - breakpoints: Responsive.breakpoints, - - /** - * Enable / disable auto hiding calculations. It can help to increase - * performance slightly if you disable this option, but all columns would - * need to have breakpoint classes assigned to them - * - * @type {Boolean} - * @default `true` - */ - auto: true, - - /** - * Details control. If given as a string value, the `type` property of the - * default object is set to that value, and the defaults used for the rest - * of the object - this is for ease of implementation. - * - * The object consists of the following properties: - * - * * `display` - A function that is used to show and hide the hidden details - * * `renderer` - function that is called for display of the child row data. - * The default function will show the data from the hidden columns - * * `target` - Used as the selector for what objects to attach the child - * open / close to - * * `type` - `false` to disable the details display, `inline` or `column` - * for the two control types - * - * @type {Object|string} - */ - details: { - display: Responsive.display.childRow, - - renderer: Responsive.renderer.listHidden(), - - target: 0, - - type: 'inline' - }, - - /** - * Orthogonal data request option. This is used to define the data type - * requested when Responsive gets the data to show in the child row. - * - * @type {String} - */ - orthogonal: 'display' - }; - - - /* - * API - */ - var Api = $.fn.dataTable.Api; - -// Doesn't do anything - work around for a bug in DT... Not documented - Api.register('responsive()', function () { - return this; - }); - - Api.register('responsive.index()', function (li) { - li = $(li); - - return { - column: li.data('dtr-index'), - row: li.parent().data('dtr-index') - }; - }); - - Api.register('responsive.rebuild()', function () { - return this.iterator('table', function (ctx) { - if (ctx._responsive) { - ctx._responsive._classLogic(); - } - }); - }); - - Api.register('responsive.recalc()', function () { - return this.iterator('table', function (ctx) { - if (ctx._responsive) { - ctx._responsive._resizeAuto(); - ctx._responsive._resize(); - } - }); - }); - - Api.register('responsive.hasHidden()', function () { - var ctx = this.context[0]; - - return ctx._responsive ? - $.inArray(false, ctx._responsive._responsiveOnlyHidden()) !== -1 : - false; - }); - - Api.registerPlural('columns().responsiveHidden()', 'column().responsiveHidden()', function () { - return this.iterator('column', function (settings, column) { - return settings._responsive ? - settings._responsive._responsiveOnlyHidden()[column] : - false; - }, 1); - }); - - - /** - * Version information - * - * @name Responsive.version - * @static - */ - Responsive.version = '2.2.7'; - - - $.fn.dataTable.Responsive = Responsive; - $.fn.DataTable.Responsive = Responsive; - -// Attach a listener to the document which listens for DataTables initialisation -// events so we can automatically initialise - $(document).on('preInit.dt.dtr', function (e, settings, json) { - if (e.namespace !== 'dt') { - return; - } - - if ($(settings.nTable).hasClass('responsive') || - $(settings.nTable).hasClass('dt-responsive') || - settings.oInit.responsive || - DataTable.defaults.responsive - ) { - var init = settings.oInit.responsive; - - if (init !== false) { - new Responsive(settings, $.isPlainObject(init) ? init : {}); - } - } - }); - - - return Responsive; -})); - - diff --git a/Plan/src/main/resources/assets/plan/plan/web/vendor/datatables/datatables.min.css b/Plan/src/main/resources/assets/plan/plan/web/vendor/datatables/datatables.min.css index a42ed3f78..064afa191 100644 --- a/Plan/src/main/resources/assets/plan/plan/web/vendor/datatables/datatables.min.css +++ b/Plan/src/main/resources/assets/plan/plan/web/vendor/datatables/datatables.min.css @@ -4,15 +4,19 @@ * * To rebuild or modify this file with the latest versions of the included * software please visit: - * https://datatables.net/download/#bs4/dt-1.10.23/r-2.2.7 + * https://datatables.net/download/#bs5/dt-1.10.25/r-2.2.9 * * Included libraries: - * DataTables 1.10.23, Responsive 2.2.7 + * DataTables 1.10.25, Responsive 2.2.9 */ -table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important;border-collapse:separate !important;border-spacing:0}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:auto;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:.85em}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap;justify-content:flex-end}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}table.dataTable>thead>tr>th:active,table.dataTable>thead>tr>td:active{outline:none}table.dataTable>thead>tr>th:not(.sorting_disabled),table.dataTable>thead>tr>td:not(.sorting_disabled){padding-right:30px}table.dataTable>thead .sorting,table.dataTable>thead .sorting_asc,table.dataTable>thead .sorting_desc,table.dataTable>thead .sorting_asc_disabled,table.dataTable>thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable>thead .sorting:before,table.dataTable>thead .sorting:after,table.dataTable>thead .sorting_asc:before,table.dataTable>thead .sorting_asc:after,table.dataTable>thead .sorting_desc:before,table.dataTable>thead .sorting_desc:after,table.dataTable>thead .sorting_asc_disabled:before,table.dataTable>thead .sorting_asc_disabled:after,table.dataTable>thead .sorting_desc_disabled:before,table.dataTable>thead .sorting_desc_disabled:after{position:absolute;bottom:.9em;display:block;opacity:.3}table.dataTable>thead .sorting:before,table.dataTable>thead .sorting_asc:before,table.dataTable>thead .sorting_desc:before,table.dataTable>thead .sorting_asc_disabled:before,table.dataTable>thead .sorting_desc_disabled:before{right:1em;content:"↑"}table.dataTable>thead .sorting:after,table.dataTable>thead .sorting_asc:after,table.dataTable>thead .sorting_desc:after,table.dataTable>thead .sorting_asc_disabled:after,table.dataTable>thead .sorting_desc_disabled:after{right:.5em;content:"↓"}table.dataTable>thead .sorting_asc:before,table.dataTable>thead .sorting_desc:after{opacity:1}table.dataTable>thead .sorting_asc_disabled:before,table.dataTable>thead .sorting_desc_disabled:after{opacity:0}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody table thead .sorting:before,div.dataTables_scrollBody table thead .sorting_asc:before,div.dataTables_scrollBody table thead .sorting_desc:before,div.dataTables_scrollBody table thead .sorting:after,div.dataTables_scrollBody table thead .sorting_asc:after,div.dataTables_scrollBody table thead .sorting_desc:after{display:none}div.dataTables_scrollBody table tbody tr:first-child th,div.dataTables_scrollBody table tbody tr:first-child td{border-top:none}div.dataTables_scrollFoot>.dataTables_scrollFootInner{box-sizing:content-box}div.dataTables_scrollFoot>.dataTables_scrollFootInner>table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}div.dataTables_wrapper div.dataTables_paginate ul.pagination{justify-content:center !important}}table.dataTable.table-sm>thead>tr>th:not(.sorting_disabled){padding-right:20px}table.dataTable.table-sm .sorting:before,table.dataTable.table-sm .sorting_asc:before,table.dataTable.table-sm .sorting_desc:before{top:5px;right:.85em}table.dataTable.table-sm .sorting:after,table.dataTable.table-sm .sorting_asc:after,table.dataTable.table-sm .sorting_desc:after{top:5px}table.table-bordered.dataTable{border-right-width:0}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:1px}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:last-child{padding-right:0} +/*! Bootstrap 5 integration for DataTables + * + * ©2020 SpryMedia Ltd, all rights reserved. + * License: MIT datatables.net/license/mit + */table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important;border-collapse:separate !important;border-spacing:0}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:auto;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:.85em}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap;justify-content:flex-end}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}table.dataTable>thead>tr>th:active,table.dataTable>thead>tr>td:active{outline:none}table.dataTable>thead>tr>th:not(.sorting_disabled),table.dataTable>thead>tr>td:not(.sorting_disabled){padding-right:30px}table.dataTable>thead .sorting,table.dataTable>thead .sorting_asc,table.dataTable>thead .sorting_desc,table.dataTable>thead .sorting_asc_disabled,table.dataTable>thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable>thead .sorting:before,table.dataTable>thead .sorting:after,table.dataTable>thead .sorting_asc:before,table.dataTable>thead .sorting_asc:after,table.dataTable>thead .sorting_desc:before,table.dataTable>thead .sorting_desc:after,table.dataTable>thead .sorting_asc_disabled:before,table.dataTable>thead .sorting_asc_disabled:after,table.dataTable>thead .sorting_desc_disabled:before,table.dataTable>thead .sorting_desc_disabled:after{position:absolute;bottom:.5em;display:block;opacity:.3}table.dataTable>thead .sorting:before,table.dataTable>thead .sorting_asc:before,table.dataTable>thead .sorting_desc:before,table.dataTable>thead .sorting_asc_disabled:before,table.dataTable>thead .sorting_desc_disabled:before{right:1em;content:"↑"}table.dataTable>thead .sorting:after,table.dataTable>thead .sorting_asc:after,table.dataTable>thead .sorting_desc:after,table.dataTable>thead .sorting_asc_disabled:after,table.dataTable>thead .sorting_desc_disabled:after{right:.5em;content:"↓"}table.dataTable>thead .sorting_asc:before,table.dataTable>thead .sorting_desc:after{opacity:1}table.dataTable>thead .sorting_asc_disabled:before,table.dataTable>thead .sorting_desc_disabled:after{opacity:0}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody table thead .sorting:before,div.dataTables_scrollBody table thead .sorting_asc:before,div.dataTables_scrollBody table thead .sorting_desc:before,div.dataTables_scrollBody table thead .sorting:after,div.dataTables_scrollBody table thead .sorting_asc:after,div.dataTables_scrollBody table thead .sorting_desc:after{display:none}div.dataTables_scrollBody table tbody tr:first-child th,div.dataTables_scrollBody table tbody tr:first-child td{border-top:none}div.dataTables_scrollFoot>.dataTables_scrollFootInner{box-sizing:content-box}div.dataTables_scrollFoot>.dataTables_scrollFootInner>table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}div.dataTables_wrapper div.dataTables_paginate ul.pagination{justify-content:center !important}}table.dataTable.table-sm>thead>tr>th:not(.sorting_disabled){padding-right:20px}table.dataTable.table-sm .sorting:before,table.dataTable.table-sm .sorting_asc:before,table.dataTable.table-sm .sorting_desc:before{top:5px;right:.85em}table.dataTable.table-sm .sorting:after,table.dataTable.table-sm .sorting_asc:after,table.dataTable.table-sm .sorting_desc:after{top:5px}table.table-bordered.dataTable{border-right-width:0}table.table-bordered.dataTable thead tr:first-child th,table.table-bordered.dataTable thead tr:first-child td{border-top-width:1px}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:first-child,table.table-bordered.dataTable th:first-child,table.table-bordered.dataTable td:first-child,table.table-bordered.dataTable td:first-child{border-left-width:1px}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:1px}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-bottom-width:1px}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:last-child{padding-right:0} -table.dataTable.dtr-inline.collapsed>tbody>tr>td.child,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty{cursor:default !important}table.dataTable.dtr-inline.collapsed>tbody>tr>td.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty:before{display:none !important}table.dataTable.dtr-inline.collapsed>tbody>tr>td.dtr-control,table.dataTable.dtr-inline.collapsed>tbody>tr>th.dtr-control{position:relative;padding-left:30px;cursor:pointer}table.dataTable.dtr-inline.collapsed>tbody>tr>td.dtr-control:before,table.dataTable.dtr-inline.collapsed>tbody>tr>th.dtr-control:before{top:50%;left:5px;height:1em;width:1em;margin-top:-9px;display:block;position:absolute;color:white;border:.15em solid white;border-radius:1em;box-shadow:0 0 .2em #444;box-sizing:content-box;text-align:center;text-indent:0 !important;font-family:"Courier New",Courier,monospace;line-height:1em;content:"+";background-color:#0275d8}table.dataTable.dtr-inline.collapsed>tbody>tr.parent>td.dtr-control:before,table.dataTable.dtr-inline.collapsed>tbody>tr.parent>th.dtr-control:before{content:"-";background-color:#d33333}table.dataTable.dtr-inline.collapsed.compact>tbody>tr>td.dtr-control,table.dataTable.dtr-inline.collapsed.compact>tbody>tr>th.dtr-control{padding-left:27px}table.dataTable.dtr-inline.collapsed.compact>tbody>tr>td.dtr-control:before,table.dataTable.dtr-inline.collapsed.compact>tbody>tr>th.dtr-control:before{left:4px;height:14px;width:14px;border-radius:14px;line-height:14px;text-indent:3px}table.dataTable.dtr-column>tbody>tr>td.dtr-control,table.dataTable.dtr-column>tbody>tr>th.dtr-control,table.dataTable.dtr-column>tbody>tr>td.control,table.dataTable.dtr-column>tbody>tr>th.control{position:relative;cursor:pointer}table.dataTable.dtr-column>tbody>tr>td.dtr-control:before,table.dataTable.dtr-column>tbody>tr>th.dtr-control:before,table.dataTable.dtr-column>tbody>tr>td.control:before,table.dataTable.dtr-column>tbody>tr>th.control:before{top:50%;left:50%;height:.8em;width:.8em;margin-top:-0.5em;margin-left:-0.5em;display:block;position:absolute;color:white;border:.15em solid white;border-radius:1em;box-shadow:0 0 .2em #444;box-sizing:content-box;text-align:center;text-indent:0 !important;font-family:"Courier New",Courier,monospace;line-height:1em;content:"+";background-color:#0275d8}table.dataTable.dtr-column>tbody>tr.parent td.dtr-control:before,table.dataTable.dtr-column>tbody>tr.parent th.dtr-control:before,table.dataTable.dtr-column>tbody>tr.parent td.control:before,table.dataTable.dtr-column>tbody>tr.parent th.control:before{content:"-";background-color:#d33333}table.dataTable>tbody>tr.child{padding:.5em 1em}table.dataTable>tbody>tr.child:hover{background:transparent !important}table.dataTable>tbody>tr.child ul.dtr-details{display:inline-block;list-style-type:none;margin:0;padding:0}table.dataTable>tbody>tr.child ul.dtr-details>li{border-bottom:1px solid #efefef;padding:.5em 0}table.dataTable>tbody>tr.child ul.dtr-details>li:first-child{padding-top:0}table.dataTable>tbody>tr.child ul.dtr-details>li:last-child{border-bottom:none}table.dataTable>tbody>tr.child span.dtr-title{display:inline-block;min-width:75px;font-weight:bold}div.dtr-modal{position:fixed;box-sizing:border-box;top:0;left:0;height:100%;width:100%;z-index:100;padding:10em 1em}div.dtr-modal div.dtr-modal-display{position:absolute;top:0;left:0;bottom:0;right:0;width:50%;height:50%;overflow:auto;margin:auto;z-index:102;overflow:auto;background-color:#f5f5f7;border:1px solid black;border-radius:.5em;box-shadow:0 12px 30px rgba(0, 0, 0, 0.6)}div.dtr-modal div.dtr-modal-content{position:relative;padding:1em}div.dtr-modal div.dtr-modal-close{position:absolute;top:6px;right:6px;width:22px;height:22px;border:1px solid #eaeaea;background-color:#f9f9f9;text-align:center;border-radius:3px;cursor:pointer;z-index:12}div.dtr-modal div.dtr-modal-close:hover{background-color:#eaeaea}div.dtr-modal div.dtr-modal-background{position:fixed;top:0;left:0;right:0;bottom:0;z-index:101;background:rgba(0, 0, 0, 0.6)}@media screen and (max-width: 767px){div.dtr-modal div.dtr-modal-display{width:95%}}div.dtr-bs-modal table.table tr:first-child td{border-top:none}table.dataTable.dtr-inline.collapsed.table-sm>tbody>tr>td:first-child:before,table.dataTable.dtr-inline.collapsed.table-sm>tbody>tr>th:first-child:before{top:5px} +table.dataTable.dtr-inline.collapsed>tbody>tr>td.child,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty{cursor:default !important}table.dataTable.dtr-inline.collapsed>tbody>tr>td.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty:before{display:none !important}table.dataTable.dtr-inline.collapsed>tbody>tr>td.dtr-control,table.dataTable.dtr-inline.collapsed>tbody>tr>th.dtr-control{position:relative;padding-left:30px;cursor:pointer}table.dataTable.dtr-inline.collapsed>tbody>tr>td.dtr-control:before,table.dataTable.dtr-inline.collapsed>tbody>tr>th.dtr-control:before{top:50%;left:5px;height:1em;width:1em;margin-top:-9px;display:block;position:absolute;color:white;border:.15em solid white;border-radius:1em;box-shadow:0 0 .2em #444;box-sizing:content-box;text-align:center;text-indent:0 !important;font-family:"Courier New",Courier,monospace;line-height:1em;content:"+";background-color:#0d6efd}table.dataTable.dtr-inline.collapsed>tbody>tr.parent>td.dtr-control:before,table.dataTable.dtr-inline.collapsed>tbody>tr.parent>th.dtr-control:before{content:"-";background-color:#d33333}table.dataTable.dtr-inline.collapsed.compact>tbody>tr>td.dtr-control,table.dataTable.dtr-inline.collapsed.compact>tbody>tr>th.dtr-control{padding-left:27px}table.dataTable.dtr-inline.collapsed.compact>tbody>tr>td.dtr-control:before,table.dataTable.dtr-inline.collapsed.compact>tbody>tr>th.dtr-control:before{left:4px;height:14px;width:14px;border-radius:14px;line-height:14px;text-indent:3px}table.dataTable.dtr-column>tbody>tr>td.dtr-control,table.dataTable.dtr-column>tbody>tr>th.dtr-control,table.dataTable.dtr-column>tbody>tr>td.control,table.dataTable.dtr-column>tbody>tr>th.control{position:relative;cursor:pointer}table.dataTable.dtr-column>tbody>tr>td.dtr-control:before,table.dataTable.dtr-column>tbody>tr>th.dtr-control:before,table.dataTable.dtr-column>tbody>tr>td.control:before,table.dataTable.dtr-column>tbody>tr>th.control:before{top:50%;left:50%;height:.8em;width:.8em;margin-top:-0.5em;margin-left:-0.5em;display:block;position:absolute;color:white;border:.15em solid white;border-radius:1em;box-shadow:0 0 .2em #444;box-sizing:content-box;text-align:center;text-indent:0 !important;font-family:"Courier New",Courier,monospace;line-height:1em;content:"+";background-color:#0d6efd}table.dataTable.dtr-column>tbody>tr.parent td.dtr-control:before,table.dataTable.dtr-column>tbody>tr.parent th.dtr-control:before,table.dataTable.dtr-column>tbody>tr.parent td.control:before,table.dataTable.dtr-column>tbody>tr.parent th.control:before{content:"-";background-color:#d33333}table.dataTable>tbody>tr.child{padding:.5em 1em}table.dataTable>tbody>tr.child:hover{background:transparent !important}table.dataTable>tbody>tr.child ul.dtr-details{display:inline-block;list-style-type:none;margin:0;padding:0}table.dataTable>tbody>tr.child ul.dtr-details>li{border-bottom:1px solid #efefef;padding:.5em 0}table.dataTable>tbody>tr.child ul.dtr-details>li:first-child{padding-top:0}table.dataTable>tbody>tr.child ul.dtr-details>li:last-child{border-bottom:none}table.dataTable>tbody>tr.child span.dtr-title{display:inline-block;min-width:75px;font-weight:bold}div.dtr-modal{position:fixed;box-sizing:border-box;top:0;left:0;height:100%;width:100%;z-index:100;padding:10em 1em}div.dtr-modal div.dtr-modal-display{position:absolute;top:0;left:0;bottom:0;right:0;width:50%;height:50%;overflow:auto;margin:auto;z-index:102;overflow:auto;background-color:#f5f5f7;border:1px solid black;border-radius:.5em;box-shadow:0 12px 30px rgba(0, 0, 0, 0.6)}div.dtr-modal div.dtr-modal-content{position:relative;padding:1em}div.dtr-modal div.dtr-modal-close{position:absolute;top:6px;right:6px;width:22px;height:22px;border:1px solid #eaeaea;background-color:#f9f9f9;text-align:center;border-radius:3px;cursor:pointer;z-index:12}div.dtr-modal div.dtr-modal-close:hover{background-color:#eaeaea}div.dtr-modal div.dtr-modal-background{position:fixed;top:0;left:0;right:0;bottom:0;z-index:101;background:rgba(0, 0, 0, 0.6)}@media screen and (max-width: 767px){div.dtr-modal div.dtr-modal-display{width:95%}}div.dtr-bs-modal table.table tr:first-child td{border-top:none} diff --git a/Plan/src/main/resources/assets/plan/plan/web/vendor/datatables/datatables.min.js b/Plan/src/main/resources/assets/plan/plan/web/vendor/datatables/datatables.min.js index 1b1e20482..602235f1f 100644 --- a/Plan/src/main/resources/assets/plan/plan/web/vendor/datatables/datatables.min.js +++ b/Plan/src/main/resources/assets/plan/plan/web/vendor/datatables/datatables.min.js @@ -4,14 +4,14 @@ * * To rebuild or modify this file with the latest versions of the included * software please visit: - * https://datatables.net/download/#bs4/dt-1.10.23/r-2.2.7 + * https://datatables.net/download/#bs5/dt-1.10.25/r-2.2.9 * * Included libraries: - * DataTables 1.10.23, Responsive 2.2.7 + * DataTables 1.10.25, Responsive 2.2.9 */ /*! - Copyright 2008-2020 SpryMedia Ltd. + Copyright 2008-2021 SpryMedia Ltd. This source file is free software, available under the following license: MIT license - http://datatables.net/license @@ -21,8 +21,8 @@ or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. For details please refer to: http://www.datatables.net - DataTables 1.10.23 - ©2008-2020 SpryMedia Ltd - datatables.net/license + DataTables 1.10.25 + ©2008-2021 SpryMedia Ltd - datatables.net/license */ var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(k,y,z){k instanceof String&&(k=String(k));for(var q=k.length,G=0;G").css({position:"fixed",top:0,left:-1*k(y).scrollLeft(),height:1, +d[c]=e,"o"===b[1]&&G(a[e]))});a._hungarianMap=d}function O(a,b,c){a._hungarianMap||G(a);var d;k.each(b,function(e,f){d=a._hungarianMap[e];d===q||!c&&b[d]!==q||("o"===d.charAt(0)?(b[d]||(b[d]={}),k.extend(!0,b[d],b[e]),O(a[d],b[d],c)):b[d]=b[e])})}function ma(a){var b=u.defaults.oLanguage,c=b.sDecimal;c&&Wa(c);if(a){var d=a.sZeroRecords;!a.sEmptyTable&&d&&"No data available in table"===b.sEmptyTable&&V(a,a,"sZeroRecords","sEmptyTable");!a.sLoadingRecords&&d&&"Loading..."===b.sLoadingRecords&&V(a,a, +"sZeroRecords","sLoadingRecords");a.sInfoThousands&&(a.sThousands=a.sInfoThousands);(a=a.sDecimal)&&c!==a&&Wa(a)}}function zb(a){R(a,"ordering","bSort");R(a,"orderMulti","bSortMulti");R(a,"orderClasses","bSortClasses");R(a,"orderCellsTop","bSortCellsTop");R(a,"order","aaSorting");R(a,"orderFixed","aaSortingFixed");R(a,"paging","bPaginate");R(a,"pagingType","sPaginationType");R(a,"pageLength","iDisplayLength");R(a,"searching","bFilter");"boolean"===typeof a.sScrollX&&(a.sScrollX=a.sScrollX?"100%": +"");"boolean"===typeof a.scrollX&&(a.scrollX=a.scrollX?"100%":"");if(a=a.aoSearchCols)for(var b=0,c=a.length;b").css({position:"fixed",top:0,left:-1*k(y).scrollLeft(),height:1, width:1,overflow:"hidden"}).append(k("
    ").css({position:"absolute",top:1,left:1,width:100,overflow:"scroll"}).append(k("
    ").css({width:"100%",height:10}))).appendTo("body"),d=c.children(),e=d.children();b.barWidth=d[0].offsetWidth-d[0].clientWidth;b.bScrollOversize=100===e[0].offsetWidth&&100!==d[0].clientWidth;b.bScrollbarLeft=1!==Math.round(e.offset().left);b.bBounding=c[0].getBoundingClientRect().width?!0:!1;c.remove()}k.extend(a.oBrowser,u.__browser);a.oScroll.iBarWidth=u.__browser.barWidth} -function Bb(a,b,c,d,e,f){var g=!1;if(c!==q){var h=c;g=!0}for(;d!==e;)a.hasOwnProperty(d)&&(h=g?b(h,a[d],d,a):a[d],g=!0,d+=f);return h}function Wa(a,b){var c=u.defaults.column,d=a.aoColumns.length;c=k.extend({},u.models.oColumn,c,{nTh:b?b:z.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[d],mData:c.mData?c.mData:d,idx:d});a.aoColumns.push(c);c=a.aoPreSearchCols;c[d]=k.extend({},u.models.oSearch,c[d]);Da(a,d,k(b).data())}function Da(a,b,c){b=a.aoColumns[b]; -var d=a.oClasses,e=k(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=e.attr("width")||null;var f=(e.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);f&&(b.sWidthOrig=f[1])}c!==q&&null!==c&&(zb(c),O(u.defaults.column,c,!0),c.mDataProp===q||c.mData||(c.mData=c.mDataProp),c.sType&&(b._sManualType=c.sType),c.className&&!c.sClass&&(c.sClass=c.className),c.sClass&&e.addClass(c.sClass),k.extend(b,c),V(b,c,"sWidth","sWidthOrig"),c.iDataSort!==q&&(b.aDataSort=[c.iDataSort]),V(b,c,"aDataSort"));var g=b.mData,h=ia(g), +function Cb(a,b,c,d,e,f){var g=!1;if(c!==q){var h=c;g=!0}for(;d!==e;)a.hasOwnProperty(d)&&(h=g?b(h,a[d],d,a):a[d],g=!0,d+=f);return h}function Xa(a,b){var c=u.defaults.column,d=a.aoColumns.length;c=k.extend({},u.models.oColumn,c,{nTh:b?b:z.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[d],mData:c.mData?c.mData:d,idx:d});a.aoColumns.push(c);c=a.aoPreSearchCols;c[d]=k.extend({},u.models.oSearch,c[d]);Ea(a,d,k(b).data())}function Ea(a,b,c){b=a.aoColumns[b]; +var d=a.oClasses,e=k(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=e.attr("width")||null;var f=(e.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);f&&(b.sWidthOrig=f[1])}c!==q&&null!==c&&(Ab(c),O(u.defaults.column,c,!0),c.mDataProp===q||c.mData||(c.mData=c.mDataProp),c.sType&&(b._sManualType=c.sType),c.className&&!c.sClass&&(c.sClass=c.className),c.sClass&&e.addClass(c.sClass),k.extend(b,c),V(b,c,"sWidth","sWidthOrig"),c.iDataSort!==q&&(b.aDataSort=[c.iDataSort]),V(b,c,"aDataSort"));var g=b.mData,h=ia(g), l=b.mRender?ia(b.mRender):null;c=function(n){return"string"===typeof n&&-1!==n.indexOf("@")};b._bAttrSrc=k.isPlainObject(g)&&(c(g.sort)||c(g.type)||c(g.filter));b._setter=null;b.fnGetData=function(n,m,p){var t=h(n,m,q,p);return l&&m?l(t,m,n,p):t};b.fnSetData=function(n,m,p){return da(g)(n,m,p)};"number"!==typeof g&&(a._rowReadObject=!0);a.oFeatures.bSort||(b.bSortable=!1,e.addClass(d.sSortableNone));a=-1!==k.inArray("asc",b.asSorting);c=-1!==k.inArray("desc",b.asSorting);b.bSortable&&(a||c)?a&&!c? -(b.sSortingClass=d.sSortableAsc,b.sSortingClassJUI=d.sSortJUIAscAllowed):!a&&c?(b.sSortingClass=d.sSortableDesc,b.sSortingClassJUI=d.sSortJUIDescAllowed):(b.sSortingClass=d.sSortable,b.sSortingClassJUI=d.sSortJUI):(b.sSortingClass=d.sSortableNone,b.sSortingClassJUI="")}function ra(a){if(!1!==a.oFeatures.bAutoWidth){var b=a.aoColumns;Xa(a);for(var c=0,d=b.length;cn[m])d(h.length+n[m],l);else if("string"===typeof n[m]){var p=0;for(g=h.length;pb&&a[e]--; -1!=d&&c===q&&a.splice(d,1)}function va(a,b,c,d){var e=a.aoData[b],f,g=function(l,n){for(;l.childNodes.length;)l.removeChild(l.firstChild);l.innerHTML=S(a,b,n,"display")};if("dom"!==c&&(c&&"auto"!==c||"dom"!==e.src)){var h=e.anCells;if(h)if(d!==q)g(h[d],d);else for(c=0,f=h.length;c").appendTo(d));var l=0;for(b=h.length;l=a.fnRecordsDisplay()?0:g,a.iInitDisplayStart=-1);g=a._iDisplayStart;var n=a.fnDisplayEnd();if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,U(a,!1);else if(!h)a.iDraw++;else if(!a.bDestroying&&!Fb(a))return;if(0!==l.length)for(f=h?a.aoData.length:n,h=h?0:g;h",{"class":e?d[0]:""}).append(k("
    ").appendTo(p));r.nTBody=B[0];B=p.children("tfoot");0===B.length&&0").appendTo(p));0===B.length||0===B.children().length?p.addClass(A.sNoFooter):0/g,tc=/^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/,uc=/(\/|\.|\*|\+|\?|\||\(|\)|\[|\]|\{|\}|\\|\$|\^|\-)/g,qb=/['\u00A0,$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfkɃΞ]/gi,ca=function(a){return a&&!0!==a&&"-"!==a?!1:!0},hc=function(a){var b=parseInt(a,10);return!isNaN(b)&&isFinite(a)?b:null},ic=function(a,b){rb[b]|| -(rb[b]=new RegExp(hb(b),"g"));return"string"===typeof a&&"."!==b?a.replace(/\./g,"").replace(rb[b],"."):a},sb=function(a,b,c){var d="string"===typeof a;if(ca(a))return!0;b&&d&&(a=ic(a,b));c&&d&&(a=a.replace(qb,""));return!isNaN(parseFloat(a))&&isFinite(a)},jc=function(a,b,c){return ca(a)?!0:ca(a)||"string"===typeof a?sb(a.replace(Ta,""),b,c)?!0:null:null},T=function(a,b,c){var d=[],e=0,f=a.length;if(c!==q)for(;ea.length)){var b=a.slice().sort();for(var c=b[0],d=1,e=b.length;d")[0],rc=Oa.textContent!==q,sc=/<.*?>/g,fb=u.util.throttle,mc=[],N=Array.prototype,vc=function(a){var b,c=u.settings,d=k.map(c,function(f,g){return f.nTable});if(a){if(a.nTable&&a.oApi)return[a];if(a.nodeName&&"table"===a.nodeName.toLowerCase()){var e= -k.inArray(a,d);return-1!==e?[c[e]]:null}if(a&&"function"===typeof a.settings)return a.settings().toArray();"string"===typeof a?b=k(a):a instanceof k&&(b=a)}else return[];if(b)return b.map(function(f){e=k.inArray(this,d);return-1!==e?c[e]:null}).toArray()};var D=function(a,b){if(!(this instanceof D))return new D(a,b);var c=[],d=function(g){(g=vc(g))&&c.push.apply(c,g)};if(Array.isArray(a))for(var e=0,f=a.length;ea?new D(b[a],this[a]):null},filter:function(a){var b=[];if(N.filter)b=N.filter.call(this,a,this);else for(var c=0,d=this.length;c").addClass(h),k("td",l).addClass(h).html(g)[0].colSpan=na(a),e.push(l[0]))};f(c,d);b._details&&b._details.detach();b._details=k(e);b._detailsShow&& -b._details.insertAfter(b.nTr)},wb=function(a,b){var c=a.context;c.length&&(a=c[0].aoData[b!==q?b:a[0]])&&a._details&&(a._details.remove(),a._detailsShow=q,a._details=q)},pc=function(a,b){var c=a.context;c.length&&a.length&&(a=c[0].aoData[a[0]],a._details&&((a._detailsShow=b)?a._details.insertAfter(a.nTr):a._details.detach(),yc(c[0])))},yc=function(a){var b=new D(a),c=a.aoData;b.off("draw.dt.DT_details column-visibility.dt.DT_details destroy.dt.DT_details");0h){var m=k.map(d,function(p,t){return p.bVisible?t:null});return[m[m.length+h]]}return[sa(a,h)];case "name":return k.map(e,function(p,t){return p===n[1]?t:null});default:return[]}if(g.nodeName&&g._DT_CellIndex)return[g._DT_CellIndex.column];h=k(f).filter(g).map(function(){return k.inArray(this,f)}).toArray();if(h.length||!g.nodeName)return h;h=k(g).closest("*[data-dt-column]");return h.length?[h.data("dt-column")]:[]},a,c)};w("columns()",function(a,b){a===q?a="":k.isPlainObject(a)&&(b=a, -a="");b=ub(b);var c=this.iterator("table",function(d){return Ac(d,a,b)},1);c.selector.cols=a;c.selector.opts=b;return c});J("columns().header()","column().header()",function(a,b){return this.iterator("column",function(c,d){return c.aoColumns[d].nTh},1)});J("columns().footer()","column().footer()",function(a,b){return this.iterator("column",function(c,d){return c.aoColumns[d].nTf},1)});J("columns().data()","column().data()",function(){return this.iterator("column-rows",qc,1)});J("columns().dataSrc()", -"column().dataSrc()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].mData},1)});J("columns().cache()","column().cache()",function(a){return this.iterator("column-rows",function(b,c,d,e,f){return Ca(b.aoData,f,"search"===a?"_aFilterData":"_aSortData",c)},1)});J("columns().nodes()","column().nodes()",function(){return this.iterator("column-rows",function(a,b,c,d,e){return Ca(a.aoData,e,"anCells",b)},1)});J("columns().visible()","column().visible()",function(a,b){var c= -this,d=this.iterator("column",function(e,f){if(a===q)return e.aoColumns[f].bVisible;var g=e.aoColumns,h=g[f],l=e.aoData,n;if(a!==q&&h.bVisible!==a){if(a){var m=k.inArray(!0,T(g,"bVisible"),f+1);g=0;for(n=l.length;gd;return!0};u.isDataTable=u.fnIsDataTable=function(a){var b=k(a).get(0),c=!1;if(a instanceof u.Api)return!0;k.each(u.settings,function(d,e){d=e.nScrollHead?k("table",e.nScrollHead)[0]:null;var f=e.nScrollFoot?k("table",e.nScrollFoot)[0]:null;if(e.nTable===b||d===b||f===b)c=!0});return c};u.tables=u.fnTables=function(a){var b= -!1;k.isPlainObject(a)&&(b=a.api,a=a.visible);var c=k.map(u.settings,function(d){if(!a||a&&k(d.nTable).is(":visible"))return d.nTable});return b?new D(c):c};u.camelToHungarian=O;w("$()",function(a,b){b=this.rows(b).nodes();b=k(b);return k([].concat(b.filter(a).toArray(),b.find(a).toArray()))});k.each(["on","one","off"],function(a,b){w(b+"()",function(){var c=Array.prototype.slice.call(arguments);c[0]=k.map(c[0].split(/\s/),function(e){return e.match(/\.dt\b/)?e:e+".dt"}).join(" ");var d=k(this.tables().nodes()); -d[b].apply(d,c);return this})});w("clear()",function(){return this.iterator("table",function(a){Ha(a)})});w("settings()",function(){return new D(this.context,this.context)});w("init()",function(){var a=this.context;return a.length?a[0].oInit:null});w("data()",function(){return this.iterator("table",function(a){return T(a.aoData,"_aData")}).flatten()});w("destroy()",function(a){a=a||!1;return this.iterator("table",function(b){var c=b.nTableWrapper.parentNode,d=b.oClasses,e=b.nTable,f=b.nTBody,g=b.nTHead, -h=b.nTFoot,l=k(e);f=k(f);var n=k(b.nTableWrapper),m=k.map(b.aoData,function(t){return t.nTr}),p;b.bDestroying=!0;I(b,"aoDestroyCallback","destroy",[b]);a||(new D(b)).columns().visible(!0);n.off(".DT").find(":not(tbody *)").off(".DT");k(y).off(".DT-"+b.sInstance);e!=g.parentNode&&(l.children("thead").detach(),l.append(g));h&&e!=h.parentNode&&(l.children("tfoot").detach(),l.append(h));b.aaSorting=[];b.aaSortingFixed=[];Pa(b);k(m).removeClass(b.asStripeClasses.join(" "));k("th, td",g).removeClass(d.sSortable+ -" "+d.sSortableAsc+" "+d.sSortableDesc+" "+d.sSortableNone);f.children().detach();f.append(m);g=a?"remove":"detach";l[g]();n[g]();!a&&c&&(c.insertBefore(e,b.nTableReinsertBefore),l.css("width",b.sDestroyWidth).removeClass(d.sTable),(p=b.asDestroyStripes.length)&&f.children().each(function(t){k(this).addClass(b.asDestroyStripes[t%p])}));c=k.inArray(b,u.settings);-1!==c&&u.settings.splice(c,1)})});k.each(["column","row","cell"],function(a,b){w(b+"s().every()",function(c){var d=this.selector.opts,e= -this;return this.iterator(b,function(f,g,h,l,n){c.call(e[b](g,"cell"===b?h:d,"cell"===b?d:q),g,h,l,n)})})});w("i18n()",function(a,b,c){var d=this.context[0];a=ia(a)(d.oLanguage);a===q&&(a=b);c!==q&&k.isPlainObject(a)&&(a=a[c]!==q?a[c]:a._);return a.replace("%d",c)});u.version="1.10.23";u.settings=[];u.models={};u.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0};u.models.oRow={nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null, -idx:-1};u.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null};u.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10, -25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(a){return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g,this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null, -fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(a){try{return JSON.parse((-1===a.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+a.sInstance+"_"+location.pathname))}catch(b){return{}}},fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(a,b){try{(-1===a.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+a.sInstance+"_"+location.pathname,JSON.stringify(b))}catch(c){}}, -fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)", -sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:k.extend({},u.models.oSearch),sAjaxDataProp:"data",sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null,rowId:"DT_RowId"};G(u.defaults);u.defaults.column={aDataSort:null, -iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};G(u.defaults.column);u.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null, -iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1,bBounding:!1,barWidth:0},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aIds:{},aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[], -aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",iStateDuration:0,aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,bAjaxDataGet:!0,jqXHR:null,json:q,oAjaxData:q,fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null, -iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==P(this)?1*this._iRecordsTotal:this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==P(this)?1*this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var a=this._iDisplayLength,b=this._iDisplayStart,c=b+a,d=this.aiDisplay.length,e=this.oFeatures, -f=e.bPaginate;return e.bServerSide?!1===f||-1===a?b+d:Math.min(b+a,this._iRecordsDisplay):!f||c>d||-1===a?d:c},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{},rowIdFn:null,rowId:null};u.ext=L={buttons:{},classes:{},build:"bs4/dt-1.10.23/r-2.2.7",errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:u.fnVersionCheck, +function La(a,b,c){var d=[];c||(c=a.aoHeader,b&&(c=[],wa(c,b)));b=0;for(var e=c.length;b',h=d.sSearch;h=h.match(/_INPUT_/)?h.replace("_INPUT_",g):h+g;b=k("
    ",{id:f.f?null:c+"_filter","class":b.sFilter}).append(k("
    ").addClass(b.sLength);a.aanFeatures.l||(l[0].id=c+"_length");l.children().append(a.oLanguage.sLengthMenu.replace("_MENU_", +e[0].outerHTML));k("select",l).val(a._iDisplayLength).on("change.DT",function(n){jb(a,k(this).val());fa(a)});k(a.nTable).on("length.dt.DT",function(n,m,p){a===m&&k("select",l).val(p)});return l[0]}function Ob(a){var b=a.sPaginationType,c=u.ext.pager[b],d="function"===typeof c,e=function(g){fa(g)};b=k("
    ").addClass(a.oClasses.sPaging+b)[0];var f=a.aanFeatures;d||c.fnInit(a,b,e);f.p||(b.id=a.sTableId+"_paginate",a.aoDrawCallback.push({fn:function(g){if(d){var h=g._iDisplayStart,l=g._iDisplayLength, +n=g.fnRecordsDisplay(),m=-1===l;h=m?0:Math.ceil(h/l);l=m?1:Math.ceil(n/l);n=c(h,l);var p;m=0;for(p=f.p.length;mf&&(d=0)):"first"==b?d=0:"previous"==b?(d=0<=e?d-e:0,0>d&&(d=0)):"next"==b?d+e",{id:a.aanFeatures.r?null:a.sTableId+"_processing","class":a.oClasses.sProcessing}).html(a.oLanguage.sProcessing).insertBefore(a.nTable)[0]}function U(a,b){a.oFeatures.bProcessing&&k(a.aanFeatures.r).css("display",b?"block":"none");H(a,null,"processing",[a,b])}function Mb(a){var b=k(a.nTable);b.attr("role","grid");var c=a.oScroll;if(""===c.sX&&""===c.sY)return a.nTable;var d=c.sX, +e=c.sY,f=a.oClasses,g=b.children("caption"),h=g.length?g[0]._captionSide:null,l=k(b[0].cloneNode(!1)),n=k(b[0].cloneNode(!1)),m=b.children("tfoot");m.length||(m=null);l=k("
    ",{"class":f.sScrollWrapper}).append(k("
    ",{"class":f.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:d?d?K(d):null:"100%"}).append(k("
    ",{"class":f.sScrollHeadInner}).css({"box-sizing":"content-box",width:c.sXInner||"100%"}).append(l.removeAttr("id").css("margin-left",0).append("top"===h? +g:null).append(b.children("thead"))))).append(k("
    ",{"class":f.sScrollBody}).css({position:"relative",overflow:"auto",width:d?K(d):null}).append(b));m&&l.append(k("
    ",{"class":f.sScrollFoot}).css({overflow:"hidden",border:0,width:d?d?K(d):null:"100%"}).append(k("
    ",{"class":f.sScrollFootInner}).append(n.removeAttr("id").css("margin-left",0).append("bottom"===h?g:null).append(b.children("tfoot")))));b=l.children();var p=b[0];f=b[1];var t=m?b[2]:null;if(d)k(f).on("scroll.DT",function(v){v= +this.scrollLeft;p.scrollLeft=v;m&&(t.scrollLeft=v)});k(f).css("max-height",e);c.bCollapse||k(f).css("height",e);a.nScrollHead=p;a.nScrollBody=f;a.nScrollFoot=t;a.aoDrawCallback.push({fn:Fa,sName:"scrolling"});return l[0]}function Fa(a){var b=a.oScroll,c=b.sX,d=b.sXInner,e=b.sY;b=b.iBarWidth;var f=k(a.nScrollHead),g=f[0].style,h=f.children("div"),l=h[0].style,n=h.children("table");h=a.nScrollBody;var m=k(h),p=h.style,t=k(a.nScrollFoot).children("div"),v=t.children("table"),x=k(a.nTHead),r=k(a.nTable), +A=r[0],D=A.style,I=a.nTFoot?k(a.nTFoot):null,W=a.oBrowser,M=W.bScrollOversize,B=T(a.aoColumns,"nTh"),E=[],aa=[],X=[],Aa=[],mb,Ba=function(F){F=F.style;F.paddingTop="0";F.paddingBottom="0";F.borderTopWidth="0";F.borderBottomWidth="0";F.height=0};var ha=h.scrollHeight>h.clientHeight;if(a.scrollBarVis!==ha&&a.scrollBarVis!==q)a.scrollBarVis=ha,ra(a);else{a.scrollBarVis=ha;r.children("thead, tfoot").remove();if(I){var ka=I.clone().prependTo(r);var la=I.find("tr");ka=ka.find("tr")}var nb=x.clone().prependTo(r); +x=x.find("tr");ha=nb.find("tr");nb.find("th, td").removeAttr("tabindex");c||(p.width="100%",f[0].style.width="100%");k.each(La(a,nb),function(F,Y){mb=sa(a,F);Y.style.width=a.aoColumns[mb].sWidth});I&&ba(function(F){F.style.width=""},ka);f=r.outerWidth();""===c?(D.width="100%",M&&(r.find("tbody").height()>h.offsetHeight||"scroll"==m.css("overflow-y"))&&(D.width=K(r.outerWidth()-b)),f=r.outerWidth()):""!==d&&(D.width=K(d),f=r.outerWidth());ba(Ba,ha);ba(function(F){X.push(F.innerHTML);E.push(K(k(F).css("width")))}, +ha);ba(function(F,Y){-1!==k.inArray(F,B)&&(F.style.width=E[Y])},x);k(ha).height(0);I&&(ba(Ba,ka),ba(function(F){Aa.push(F.innerHTML);aa.push(K(k(F).css("width")))},ka),ba(function(F,Y){F.style.width=aa[Y]},la),k(ka).height(0));ba(function(F,Y){F.innerHTML='
    '+X[Y]+"
    ";F.childNodes[0].style.height="0";F.childNodes[0].style.overflow="hidden";F.style.width=E[Y]},ha);I&&ba(function(F,Y){F.innerHTML='
    '+Aa[Y]+"
    ";F.childNodes[0].style.height= +"0";F.childNodes[0].style.overflow="hidden";F.style.width=aa[Y]},ka);r.outerWidth()h.offsetHeight||"scroll"==m.css("overflow-y")?f+b:f,M&&(h.scrollHeight>h.offsetHeight||"scroll"==m.css("overflow-y"))&&(D.width=K(la-b)),""!==c&&""===d||ca(a,1,"Possible column misalignment",6)):la="100%";p.width=K(la);g.width=K(la);I&&(a.nScrollFoot.style.width=K(la));!e&&M&&(p.height=K(A.offsetHeight+b));c=r.outerWidth();n[0].style.width=K(c);l.width=K(c);d=r.height()>h.clientHeight||"scroll"== +m.css("overflow-y");e="padding"+(W.bScrollbarLeft?"Left":"Right");l[e]=d?b+"px":"0px";I&&(v[0].style.width=K(c),t[0].style.width=K(c),t[0].style[e]=d?b+"px":"0px");r.children("colgroup").insertBefore(r.children("thead"));m.trigger("scroll");!a.bSorted&&!a.bFiltered||a._drawHold||(h.scrollTop=0)}}function ba(a,b,c){for(var d=0,e=0,f=b.length,g,h;e").appendTo(h.find("tbody"));h.find("thead, tfoot").remove();h.append(k(a.nTHead).clone()).append(k(a.nTFoot).clone());h.find("tfoot th, tfoot td").css("width","");n=La(a,h.find("thead")[0]);for(v=0;v").css({width:r.sWidthOrig,margin:0,padding:0,border:0,height:1}));if(a.aoData.length)for(v=0;v").css(f||e?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(h).appendTo(p);f&&g?h.width(g):f?(h.css("width","auto"),h.removeAttr("width"),h.width()").css("width",K(a)).appendTo(b||z.body);b=a[0].offsetWidth;a.remove();return b}function $b(a,b){var c=ac(a,b);if(0>c)return null;var d=a.aoData[c];return d.nTr?d.anCells[b]:k("
    ").insertAfter(E));r.nTBody=aa[0];E=p.children("tfoot"); +0===E.length&&0").appendTo(p));0===E.length||0===E.children().length?p.addClass(A.sNoFooter):0/g,tc=/^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/,uc=/(\/|\.|\*|\+|\?|\||\(|\)|\[|\]|\{|\}|\\|\$|\^|\-)/g,rb=/['\u00A0,$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfkɃΞ]/gi,Z=function(a){return a&&!0!==a&&"-"!==a?!1:!0},hc=function(a){var b=parseInt(a,10);return!isNaN(b)&&isFinite(a)?b:null},ic=function(a,b){sb[b]||(sb[b]=new RegExp(ib(b),"g"));return"string"===typeof a&&"."!==b?a.replace(/\./g,"").replace(sb[b],"."): +a},tb=function(a,b,c){var d="string"===typeof a;if(Z(a))return!0;b&&d&&(a=ic(a,b));c&&d&&(a=a.replace(rb,""));return!isNaN(parseFloat(a))&&isFinite(a)},jc=function(a,b,c){return Z(a)?!0:Z(a)||"string"===typeof a?tb(a.replace(Ua,""),b,c)?!0:null:null},T=function(a,b,c){var d=[],e=0,f=a.length;if(c!==q)for(;ea.length)){var b=a.slice().sort();for(var c=b[0],d=1,e=b.length;d")[0],rc=Pa.textContent!==q,sc=/<.*?>/g,gb=u.util.throttle,mc=[],N=Array.prototype,vc=function(a){var b,c=u.settings,d=k.map(c,function(f,g){return f.nTable});if(a){if(a.nTable&&a.oApi)return[a];if(a.nodeName&&"table"===a.nodeName.toLowerCase()){var e=k.inArray(a,d);return-1!==e?[c[e]]:null}if(a&&"function"===typeof a.settings)return a.settings().toArray(); +"string"===typeof a?b=k(a):a instanceof k&&(b=a)}else return[];if(b)return b.map(function(f){e=k.inArray(this,d);return-1!==e?c[e]:null}).toArray()};var C=function(a,b){if(!(this instanceof C))return new C(a,b);var c=[],d=function(g){(g=vc(g))&&c.push.apply(c,g)};if(Array.isArray(a))for(var e=0,f=a.length;ea?new C(b[a],this[a]):null},filter:function(a){var b=[];if(N.filter)b=N.filter.call(this,a,this);else for(var c=0,d=this.length;c").addClass(h),k("td",l).addClass(h).html(g)[0].colSpan=na(a),e.push(l[0]))};f(c,d);b._details&&b._details.detach();b._details=k(e);b._detailsShow&&b._details.insertAfter(b.nTr)},xb=function(a,b){var c=a.context;c.length&& +(a=c[0].aoData[b!==q?b:a[0]])&&a._details&&(a._details.remove(),a._detailsShow=q,a._details=q)},pc=function(a,b){var c=a.context;c.length&&a.length&&(a=c[0].aoData[a[0]],a._details&&((a._detailsShow=b)?a._details.insertAfter(a.nTr):a._details.detach(),yc(c[0])))},yc=function(a){var b=new C(a),c=a.aoData;b.off("draw.dt.DT_details column-visibility.dt.DT_details destroy.dt.DT_details");0h){var m=k.map(d,function(p, +t){return p.bVisible?t:null});return[m[m.length+h]]}return[sa(a,h)];case "name":return k.map(e,function(p,t){return p===n[1]?t:null});default:return[]}if(g.nodeName&&g._DT_CellIndex)return[g._DT_CellIndex.column];h=k(f).filter(g).map(function(){return k.inArray(this,f)}).toArray();if(h.length||!g.nodeName)return h;h=k(g).closest("*[data-dt-column]");return h.length?[h.data("dt-column")]:[]},a,c)};w("columns()",function(a,b){a===q?a="":k.isPlainObject(a)&&(b=a,a="");b=vb(b);var c=this.iterator("table", +function(d){return Ac(d,a,b)},1);c.selector.cols=a;c.selector.opts=b;return c});J("columns().header()","column().header()",function(a,b){return this.iterator("column",function(c,d){return c.aoColumns[d].nTh},1)});J("columns().footer()","column().footer()",function(a,b){return this.iterator("column",function(c,d){return c.aoColumns[d].nTf},1)});J("columns().data()","column().data()",function(){return this.iterator("column-rows",qc,1)});J("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column", +function(a,b){return a.aoColumns[b].mData},1)});J("columns().cache()","column().cache()",function(a){return this.iterator("column-rows",function(b,c,d,e,f){return Da(b.aoData,f,"search"===a?"_aFilterData":"_aSortData",c)},1)});J("columns().nodes()","column().nodes()",function(){return this.iterator("column-rows",function(a,b,c,d,e){return Da(a.aoData,e,"anCells",b)},1)});J("columns().visible()","column().visible()",function(a,b){var c=this,d=this.iterator("column",function(e,f){if(a===q)return e.aoColumns[f].bVisible; +var g=e.aoColumns,h=g[f],l=e.aoData,n;if(a!==q&&h.bVisible!==a){if(a){var m=k.inArray(!0,T(g,"bVisible"),f+1);g=0;for(n=l.length;gd;return!0};u.isDataTable=u.fnIsDataTable=function(a){var b=k(a).get(0),c=!1;if(a instanceof u.Api)return!0;k.each(u.settings,function(d,e){d=e.nScrollHead?k("table",e.nScrollHead)[0]:null;var f=e.nScrollFoot?k("table",e.nScrollFoot)[0]:null;if(e.nTable===b||d===b||f===b)c=!0});return c};u.tables=u.fnTables=function(a){var b=!1;k.isPlainObject(a)&&(b=a.api,a=a.visible); +var c=k.map(u.settings,function(d){if(!a||a&&k(d.nTable).is(":visible"))return d.nTable});return b?new C(c):c};u.camelToHungarian=O;w("$()",function(a,b){b=this.rows(b).nodes();b=k(b);return k([].concat(b.filter(a).toArray(),b.find(a).toArray()))});k.each(["on","one","off"],function(a,b){w(b+"()",function(){var c=Array.prototype.slice.call(arguments);c[0]=k.map(c[0].split(/\s/),function(e){return e.match(/\.dt\b/)?e:e+".dt"}).join(" ");var d=k(this.tables().nodes());d[b].apply(d,c);return this})}); +w("clear()",function(){return this.iterator("table",function(a){Ia(a)})});w("settings()",function(){return new C(this.context,this.context)});w("init()",function(){var a=this.context;return a.length?a[0].oInit:null});w("data()",function(){return this.iterator("table",function(a){return T(a.aoData,"_aData")}).flatten()});w("destroy()",function(a){a=a||!1;return this.iterator("table",function(b){var c=b.nTableWrapper.parentNode,d=b.oClasses,e=b.nTable,f=b.nTBody,g=b.nTHead,h=b.nTFoot,l=k(e);f=k(f); +var n=k(b.nTableWrapper),m=k.map(b.aoData,function(t){return t.nTr}),p;b.bDestroying=!0;H(b,"aoDestroyCallback","destroy",[b]);a||(new C(b)).columns().visible(!0);n.off(".DT").find(":not(tbody *)").off(".DT");k(y).off(".DT-"+b.sInstance);e!=g.parentNode&&(l.children("thead").detach(),l.append(g));h&&e!=h.parentNode&&(l.children("tfoot").detach(),l.append(h));b.aaSorting=[];b.aaSortingFixed=[];Qa(b);k(m).removeClass(b.asStripeClasses.join(" "));k("th, td",g).removeClass(d.sSortable+" "+d.sSortableAsc+ +" "+d.sSortableDesc+" "+d.sSortableNone);f.children().detach();f.append(m);g=a?"remove":"detach";l[g]();n[g]();!a&&c&&(c.insertBefore(e,b.nTableReinsertBefore),l.css("width",b.sDestroyWidth).removeClass(d.sTable),(p=b.asDestroyStripes.length)&&f.children().each(function(t){k(this).addClass(b.asDestroyStripes[t%p])}));c=k.inArray(b,u.settings);-1!==c&&u.settings.splice(c,1)})});k.each(["column","row","cell"],function(a,b){w(b+"s().every()",function(c){var d=this.selector.opts,e=this;return this.iterator(b, +function(f,g,h,l,n){c.call(e[b](g,"cell"===b?h:d,"cell"===b?d:q),g,h,l,n)})})});w("i18n()",function(a,b,c){var d=this.context[0];a=ia(a)(d.oLanguage);a===q&&(a=b);c!==q&&k.isPlainObject(a)&&(a=a[c]!==q?a[c]:a._);return a.replace("%d",c)});u.version="1.10.25";u.settings=[];u.models={};u.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0};u.models.oRow={nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null,idx:-1};u.models.oColumn= +{idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null};u.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null, +aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(a){return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g,this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null, +fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(a){try{return JSON.parse((-1===a.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+a.sInstance+"_"+location.pathname))}catch(b){return{}}},fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(a,b){try{(-1===a.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+a.sInstance+"_"+location.pathname,JSON.stringify(b))}catch(c){}},fnStateSaveParams:null, +iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"", +sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:k.extend({},u.models.oSearch),sAjaxDataProp:"data",sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null,rowId:"DT_RowId"};G(u.defaults);u.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc", +"desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};G(u.defaults.column);u.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null, +sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1,bBounding:!1,barWidth:0},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aIds:{},aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[], +aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",iStateDuration:0,aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,jqXHR:null,json:q,oAjaxData:q,fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1, +iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==P(this)?1*this._iRecordsTotal:this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==P(this)?1*this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var a=this._iDisplayLength,b=this._iDisplayStart,c=b+a,d=this.aiDisplay.length,e=this.oFeatures,f=e.bPaginate; +return e.bServerSide?!1===f||-1===a?b+d:Math.min(b+a,this._iRecordsDisplay):!f||c>d||-1===a?d:c},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{},rowIdFn:null,rowId:null};u.ext=L={buttons:{},classes:{},builder:"bs5/dt-1.10.25/r-2.2.9",errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:u.fnVersionCheck, iApiIndex:0,oJUIClasses:{},sVersion:u.version};k.extend(L,{afnFiltering:L.search,aTypes:L.type.detect,ofnSearch:L.type.search,oSort:L.type.order,afnSortData:L.order,aoFeatures:L.feature,oApi:L.internal,oStdClasses:L.classes,oPagination:L.pager});k.extend(u.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter", -sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled",sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody", -sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",sJUIHeader:"",sJUIFooter:""});var ec=u.ext.pager;k.extend(ec,{simple:function(a,b){return["previous","next"]},full:function(a,b){return["first","previous","next","last"]},numbers:function(a,b){return[Ba(a,b)]},simple_numbers:function(a,b){return["previous",Ba(a,b),"next"]}, -full_numbers:function(a,b){return["first","previous",Ba(a,b),"next","last"]},first_last_numbers:function(a,b){return["first",Ba(a,b),"last"]},_numbers:Ba,numbers_length:7});k.extend(!0,u.ext.renderer,{pageButton:{_:function(a,b,c,d,e,f){var g=a.oClasses,h=a.oLanguage.oPaginate,l=a.oLanguage.oAria.paginate||{},n,m,p=0,t=function(x,r){var A,E=g.sPageButtonDisabled,H=function(B){kb(a,B.data.action,!0)};var W=0;for(A=r.length;W").appendTo(x); -t(C,M)}else{n=null;m=M;C=a.iTabIndex;switch(M){case "ellipsis":x.append('');break;case "first":n=h.sFirst;0===e&&(C=-1,m+=" "+E);break;case "previous":n=h.sPrevious;0===e&&(C=-1,m+=" "+E);break;case "next":n=h.sNext;if(0===f||e===f-1)C=-1,m+=" "+E;break;case "last":n=h.sLast;if(0===f||e===f-1)C=-1,m+=" "+E;break;default:n=a.fnFormatNumber(M+1),m=e===M?g.sPageButtonActive:""}null!==n&&(C=k("",{"class":g.sPageButton+" "+m,"aria-controls":a.sTableId,"aria-label":l[M], -"data-dt-idx":p,tabindex:C,id:0===c&&"string"===typeof M?a.sTableId+"_"+M:null}).html(n).appendTo(x),ob(C,{action:M},H),p++)}}};try{var v=k(b).find(z.activeElement).data("dt-idx")}catch(x){}t(k(b).empty(),d);v!==q&&k(b).find("[data-dt-idx="+v+"]").trigger("focus")}}});k.extend(u.ext.type.detect,[function(a,b){b=b.oLanguage.sDecimal;return sb(a,b)?"num"+b:null},function(a,b){if(a&&!(a instanceof Date)&&!tc.test(a))return null;b=Date.parse(a);return null!==b&&!isNaN(b)||ca(a)?"date":null},function(a, -b){b=b.oLanguage.sDecimal;return sb(a,b,!0)?"num-fmt"+b:null},function(a,b){b=b.oLanguage.sDecimal;return jc(a,b)?"html-num"+b:null},function(a,b){b=b.oLanguage.sDecimal;return jc(a,b,!0)?"html-num-fmt"+b:null},function(a,b){return ca(a)||"string"===typeof a&&-1!==a.indexOf("<")?"html":null}]);k.extend(u.ext.type.search,{html:function(a){return ca(a)?a:"string"===typeof a?a.replace(gc," ").replace(Ta,""):""},string:function(a){return ca(a)?a:"string"===typeof a?a.replace(gc," "):a}});var Sa=function(a, -b,c,d){if(0!==a&&(!a||"-"===a))return-Infinity;b&&(a=ic(a,b));a.replace&&(c&&(a=a.replace(c,"")),d&&(a=a.replace(d,"")));return 1*a};k.extend(L.type.order,{"date-pre":function(a){a=Date.parse(a);return isNaN(a)?-Infinity:a},"html-pre":function(a){return ca(a)?"":a.replace?a.replace(/<.*?>/g,"").toLowerCase():a+""},"string-pre":function(a){return ca(a)?"":"string"===typeof a?a.toLowerCase():a.toString?a.toString():""},"string-asc":function(a,b){return ab?1:0},"string-desc":function(a,b){return a< -b?1:a>b?-1:0}});Va("");k.extend(!0,u.ext.renderer,{header:{_:function(a,b,c,d){k(a.nTable).on("order.dt.DT",function(e,f,g,h){a===f&&(e=c.idx,b.removeClass(c.sSortingClass+" "+d.sSortAsc+" "+d.sSortDesc).addClass("asc"==h[e]?d.sSortAsc:"desc"==h[e]?d.sSortDesc:c.sSortingClass))})},jqueryui:function(a,b,c,d){k("
    ").addClass(d.sSortJUIWrapper).append(b.contents()).append(k("").addClass(d.sSortIcon+" "+c.sSortingClassJUI)).appendTo(b);k(a.nTable).on("order.dt.DT",function(e,f,g,h){a===f&& -(e=c.idx,b.removeClass(d.sSortAsc+" "+d.sSortDesc).addClass("asc"==h[e]?d.sSortAsc:"desc"==h[e]?d.sSortDesc:c.sSortingClass),b.find("span."+d.sSortIcon).removeClass(d.sSortJUIAsc+" "+d.sSortJUIDesc+" "+d.sSortJUI+" "+d.sSortJUIAscAllowed+" "+d.sSortJUIDescAllowed).addClass("asc"==h[e]?d.sSortJUIAsc:"desc"==h[e]?d.sSortJUIDesc:c.sSortingClassJUI))})}}});var xb=function(a){return"string"===typeof a?a.replace(/&/g,"&").replace(//g,">").replace(/"/g,"""):a};u.render= -{number:function(a,b,c,d,e){return{display:function(f){if("number"!==typeof f&&"string"!==typeof f)return f;var g=0>f?"-":"",h=parseFloat(f);if(isNaN(h))return xb(f);h=h.toFixed(c);f=Math.abs(h);h=parseInt(f,10);f=c?b+(f-h).toFixed(c).substring(2):"";return g+(d||"")+h.toString().replace(/\B(?=(\d{3})+(?!\d))/g,a)+f+(e||"")}}},text:function(){return{display:xb,filter:xb}}};k.extend(u.ext.internal,{_fnExternApiFunc:fc,_fnBuildAjax:La,_fnAjaxUpdate:Fb,_fnAjaxParameters:Ob,_fnAjaxUpdateDraw:Pb,_fnAjaxDataSrc:Ma, -_fnAddColumn:Wa,_fnColumnOptions:Da,_fnAdjustColumnSizing:ra,_fnVisibleToColumnIndex:sa,_fnColumnIndexToVisible:ta,_fnVisbleColumns:na,_fnGetColumns:Fa,_fnColumnTypes:Ya,_fnApplyColumnDefs:Cb,_fnHungarianMap:G,_fnCamelToHungarian:O,_fnLanguageCompat:ma,_fnBrowserDetect:Ab,_fnAddData:ea,_fnAddTr:Ga,_fnNodeToDataIndex:function(a,b){return b._DT_RowIndex!==q?b._DT_RowIndex:null},_fnNodeToColumnIndex:function(a,b,c){return k.inArray(c,a.aoData[b].anCells)},_fnGetCellData:S,_fnSetCellData:Db,_fnSplitObjNotation:ab, -_fnGetObjectDataFn:ia,_fnSetObjectDataFn:da,_fnGetDataMaster:bb,_fnClearTable:Ha,_fnDeleteIndex:Ia,_fnInvalidate:va,_fnGetRowElements:$a,_fnCreateTr:Za,_fnBuildHead:Eb,_fnDrawHead:xa,_fnDraw:fa,_fnReDraw:ja,_fnAddOptionsHtml:Hb,_fnDetectHeader:wa,_fnGetUniqueThs:Ka,_fnFeatureHtmlFilter:Jb,_fnFilterComplete:ya,_fnFilterCustom:Sb,_fnFilterColumn:Rb,_fnFilter:Qb,_fnFilterCreateSearch:gb,_fnEscapeRegex:hb,_fnFilterData:Tb,_fnFeatureHtmlInfo:Mb,_fnUpdateInfo:Wb,_fnInfoMacros:Xb,_fnInitialise:za,_fnInitComplete:Na, -_fnLengthChange:ib,_fnFeatureHtmlLength:Ib,_fnFeatureHtmlPaginate:Nb,_fnPageChange:kb,_fnFeatureHtmlProcessing:Kb,_fnProcessingDisplay:U,_fnFeatureHtmlTable:Lb,_fnScrollDraw:Ea,_fnApplyToChildren:Z,_fnCalculateColumnWidths:Xa,_fnThrottle:fb,_fnConvertToWidth:Zb,_fnGetWidestNode:$b,_fnGetMaxLenString:ac,_fnStringToCss:K,_fnSortFlatten:pa,_fnSort:Gb,_fnSortAria:cc,_fnSortListener:nb,_fnSortAttachListener:db,_fnSortingClasses:Pa,_fnSortData:bc,_fnSaveState:Qa,_fnLoadState:dc,_fnSettingsFromNode:Ra,_fnLog:aa, -_fnMap:V,_fnBindAction:ob,_fnCallbackReg:Q,_fnCallbackFire:I,_fnLengthOverflow:jb,_fnRenderer:eb,_fnDataSource:P,_fnRowAttributes:cb,_fnExtend:pb,_fnCalculateEnd:function(){}});k.fn.dataTable=u;u.$=k;k.fn.dataTableSettings=u.settings;k.fn.dataTableExt=u.ext;k.fn.DataTable=function(a){return k(this).dataTable(a).api()};k.each(u,function(a,b){k.fn.DataTable[a]=b});return k.fn.dataTable}); +sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_desc_disabled",sSortableDesc:"sorting_asc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody", +sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",sJUIHeader:"",sJUIFooter:""});var ec=u.ext.pager;k.extend(ec,{simple:function(a,b){return["previous","next"]},full:function(a,b){return["first","previous","next","last"]},numbers:function(a,b){return[Ca(a,b)]},simple_numbers:function(a,b){return["previous",Ca(a,b),"next"]}, +full_numbers:function(a,b){return["first","previous",Ca(a,b),"next","last"]},first_last_numbers:function(a,b){return["first",Ca(a,b),"last"]},_numbers:Ca,numbers_length:7});k.extend(!0,u.ext.renderer,{pageButton:{_:function(a,b,c,d,e,f){var g=a.oClasses,h=a.oLanguage.oPaginate,l=a.oLanguage.oAria.paginate||{},n,m,p=0,t=function(x,r){var A,D=g.sPageButtonDisabled,I=function(E){lb(a,E.data.action,!0)};var W=0;for(A=r.length;W").appendTo(x); +t(B,M)}else{n=null;m=M;B=a.iTabIndex;switch(M){case "ellipsis":x.append('');break;case "first":n=h.sFirst;0===e&&(B=-1,m+=" "+D);break;case "previous":n=h.sPrevious;0===e&&(B=-1,m+=" "+D);break;case "next":n=h.sNext;if(0===f||e===f-1)B=-1,m+=" "+D;break;case "last":n=h.sLast;if(0===f||e===f-1)B=-1,m+=" "+D;break;default:n=a.fnFormatNumber(M+1),m=e===M?g.sPageButtonActive:""}null!==n&&(B=k("",{"class":g.sPageButton+" "+m,"aria-controls":a.sTableId,"aria-label":l[M], +"data-dt-idx":p,tabindex:B,id:0===c&&"string"===typeof M?a.sTableId+"_"+M:null}).html(n).appendTo(x),pb(B,{action:M},I),p++)}}};try{var v=k(b).find(z.activeElement).data("dt-idx")}catch(x){}t(k(b).empty(),d);v!==q&&k(b).find("[data-dt-idx="+v+"]").trigger("focus")}}});k.extend(u.ext.type.detect,[function(a,b){b=b.oLanguage.sDecimal;return tb(a,b)?"num"+b:null},function(a,b){if(a&&!(a instanceof Date)&&!tc.test(a))return null;b=Date.parse(a);return null!==b&&!isNaN(b)||Z(a)?"date":null},function(a, +b){b=b.oLanguage.sDecimal;return tb(a,b,!0)?"num-fmt"+b:null},function(a,b){b=b.oLanguage.sDecimal;return jc(a,b)?"html-num"+b:null},function(a,b){b=b.oLanguage.sDecimal;return jc(a,b,!0)?"html-num-fmt"+b:null},function(a,b){return Z(a)||"string"===typeof a&&-1!==a.indexOf("<")?"html":null}]);k.extend(u.ext.type.search,{html:function(a){return Z(a)?a:"string"===typeof a?a.replace(gc," ").replace(Ua,""):""},string:function(a){return Z(a)?a:"string"===typeof a?a.replace(gc," "):a}});var Ta=function(a, +b,c,d){if(0!==a&&(!a||"-"===a))return-Infinity;b&&(a=ic(a,b));a.replace&&(c&&(a=a.replace(c,"")),d&&(a=a.replace(d,"")));return 1*a};k.extend(L.type.order,{"date-pre":function(a){a=Date.parse(a);return isNaN(a)?-Infinity:a},"html-pre":function(a){return Z(a)?"":a.replace?a.replace(/<.*?>/g,"").toLowerCase():a+""},"string-pre":function(a){return Z(a)?"":"string"===typeof a?a.toLowerCase():a.toString?a.toString():""},"string-asc":function(a,b){return ab?1:0},"string-desc":function(a,b){return a< +b?1:a>b?-1:0}});Wa("");k.extend(!0,u.ext.renderer,{header:{_:function(a,b,c,d){k(a.nTable).on("order.dt.DT",function(e,f,g,h){a===f&&(e=c.idx,b.removeClass(d.sSortAsc+" "+d.sSortDesc).addClass("asc"==h[e]?d.sSortAsc:"desc"==h[e]?d.sSortDesc:c.sSortingClass))})},jqueryui:function(a,b,c,d){k("
    ").addClass(d.sSortJUIWrapper).append(b.contents()).append(k("").addClass(d.sSortIcon+" "+c.sSortingClassJUI)).appendTo(b);k(a.nTable).on("order.dt.DT",function(e,f,g,h){a===f&&(e=c.idx,b.removeClass(d.sSortAsc+ +" "+d.sSortDesc).addClass("asc"==h[e]?d.sSortAsc:"desc"==h[e]?d.sSortDesc:c.sSortingClass),b.find("span."+d.sSortIcon).removeClass(d.sSortJUIAsc+" "+d.sSortJUIDesc+" "+d.sSortJUI+" "+d.sSortJUIAscAllowed+" "+d.sSortJUIDescAllowed).addClass("asc"==h[e]?d.sSortJUIAsc:"desc"==h[e]?d.sSortJUIDesc:c.sSortingClassJUI))})}}});var yb=function(a){return"string"===typeof a?a.replace(/&/g,"&").replace(//g,">").replace(/"/g,"""):a};u.render={number:function(a,b,c,d,e){return{display:function(f){if("number"!== +typeof f&&"string"!==typeof f)return f;var g=0>f?"-":"",h=parseFloat(f);if(isNaN(h))return yb(f);h=h.toFixed(c);f=Math.abs(h);h=parseInt(f,10);f=c?b+(f-h).toFixed(c).substring(2):"";0===h&&0===parseFloat(f)&&(g="");return g+(d||"")+h.toString().replace(/\B(?=(\d{3})+(?!\d))/g,a)+f+(e||"")}}},text:function(){return{display:yb,filter:yb}}};k.extend(u.ext.internal,{_fnExternApiFunc:fc,_fnBuildAjax:Ma,_fnAjaxUpdate:Gb,_fnAjaxParameters:Pb,_fnAjaxUpdateDraw:Qb,_fnAjaxDataSrc:Na,_fnAddColumn:Xa,_fnColumnOptions:Ea, +_fnAdjustColumnSizing:ra,_fnVisibleToColumnIndex:sa,_fnColumnIndexToVisible:ta,_fnVisbleColumns:na,_fnGetColumns:Ga,_fnColumnTypes:Za,_fnApplyColumnDefs:Db,_fnHungarianMap:G,_fnCamelToHungarian:O,_fnLanguageCompat:ma,_fnBrowserDetect:Bb,_fnAddData:ea,_fnAddTr:Ha,_fnNodeToDataIndex:function(a,b){return b._DT_RowIndex!==q?b._DT_RowIndex:null},_fnNodeToColumnIndex:function(a,b,c){return k.inArray(c,a.aoData[b].anCells)},_fnGetCellData:S,_fnSetCellData:Eb,_fnSplitObjNotation:bb,_fnGetObjectDataFn:ia, +_fnSetObjectDataFn:da,_fnGetDataMaster:cb,_fnClearTable:Ia,_fnDeleteIndex:Ja,_fnInvalidate:va,_fnGetRowElements:ab,_fnCreateTr:$a,_fnBuildHead:Fb,_fnDrawHead:xa,_fnDraw:fa,_fnReDraw:ja,_fnAddOptionsHtml:Ib,_fnDetectHeader:wa,_fnGetUniqueThs:La,_fnFeatureHtmlFilter:Kb,_fnFilterComplete:ya,_fnFilterCustom:Tb,_fnFilterColumn:Sb,_fnFilter:Rb,_fnFilterCreateSearch:hb,_fnEscapeRegex:ib,_fnFilterData:Ub,_fnFeatureHtmlInfo:Nb,_fnUpdateInfo:Xb,_fnInfoMacros:Yb,_fnInitialise:za,_fnInitComplete:Oa,_fnLengthChange:jb, +_fnFeatureHtmlLength:Jb,_fnFeatureHtmlPaginate:Ob,_fnPageChange:lb,_fnFeatureHtmlProcessing:Lb,_fnProcessingDisplay:U,_fnFeatureHtmlTable:Mb,_fnScrollDraw:Fa,_fnApplyToChildren:ba,_fnCalculateColumnWidths:Ya,_fnThrottle:gb,_fnConvertToWidth:Zb,_fnGetWidestNode:$b,_fnGetMaxLenString:ac,_fnStringToCss:K,_fnSortFlatten:pa,_fnSort:Hb,_fnSortAria:cc,_fnSortListener:ob,_fnSortAttachListener:eb,_fnSortingClasses:Qa,_fnSortData:bc,_fnSaveState:Ra,_fnLoadState:dc,_fnSettingsFromNode:Sa,_fnLog:ca,_fnMap:V, +_fnBindAction:pb,_fnCallbackReg:Q,_fnCallbackFire:H,_fnLengthOverflow:kb,_fnRenderer:fb,_fnDataSource:P,_fnRowAttributes:db,_fnExtend:qb,_fnCalculateEnd:function(){}});k.fn.dataTable=u;u.$=k;k.fn.dataTableSettings=u.settings;k.fn.dataTableExt=u.ext;k.fn.DataTable=function(a){return k(this).dataTable(a).api()};k.each(u,function(a,b){k.fn.DataTable[a]=b});return k.fn.dataTable}); /*! - DataTables Bootstrap 4 integration - ©2011-2017 SpryMedia Ltd - datatables.net/license + DataTables Bootstrap 5 integration + 2020 SpryMedia Ltd - datatables.net/license */ var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(a,b,c){a instanceof String&&(a=String(a));for(var e=a.length,d=0;d<'col-sm-12 col-md-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>", -renderer:"bootstrap"});a.extend(d.ext.classes,{sWrapper:"dataTables_wrapper dt-bootstrap4",sFilterInput:"form-control form-control-sm",sLengthSelect:"custom-select custom-select-sm form-control form-control-sm",sProcessing:"dataTables_processing card",sPageButton:"paginate_button page-item"});d.ext.renderer.pageButton.bootstrap=function(f,l,A,B,m,t){var u=new d.Api(f),C=f.oClasses,n=f.oLanguage.oPaginate,D=f.oLanguage.oAria.paginate||{},h,k,v=0,y=function(q,w){var x,E=function(p){p.preventDefault(); -a(p.currentTarget).hasClass("disabled")||u.page()==p.data.action||u.page(p.data.action).draw("page")};var r=0;for(x=w.length;r",{"class":C.sPageButton+" "+k,id:0===A&&"string"===typeof g?f.sTableId+"_"+g:null}).append(a("",{href:"#","aria-controls":f.sTableId,"aria-label":D[g],"data-dt-idx":v,tabindex:f.iTabIndex,"class":"page-link"}).html(h)).appendTo(q);f.oApi._fnBindAction(F,{action:g},E);v++}}}};try{var z=a(l).find(c.activeElement).data("dt-idx")}catch(q){}y(a(l).empty().html('
    "}).join("");return b('
    ",{valign:"top",colSpan:na(a),"class":a.oClasses.sRowEmpty}).html(c))[0];I(a,"aoHeaderCallback","header",[k(a.nTHead).children("tr")[0], -bb(a),g,n,l]);I(a,"aoFooterCallback","footer",[k(a.nTFoot).children("tr")[0],bb(a),g,n,l]);d=k(a.nTBody);d.children().detach();d.append(k(b));I(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=!1}}function ja(a,b){var c=a.oFeatures,d=c.bFilter;c.bSort&&Gb(a);d?ya(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);a._drawHold=b;fa(a);a._drawHold=!1}function Hb(a){var b=a.oClasses,c=k(a.nTable);c=k("
    ").insertBefore(c);var d=a.oFeatures, +(b.sSortingClass=d.sSortableAsc,b.sSortingClassJUI=d.sSortJUIAscAllowed):!a&&c?(b.sSortingClass=d.sSortableDesc,b.sSortingClassJUI=d.sSortJUIDescAllowed):(b.sSortingClass=d.sSortable,b.sSortingClassJUI=d.sSortJUI):(b.sSortingClass=d.sSortableNone,b.sSortingClassJUI="")}function ra(a){if(!1!==a.oFeatures.bAutoWidth){var b=a.aoColumns;Ya(a);for(var c=0,d=b.length;cn[m])d(h.length+n[m],l);else if("string"===typeof n[m]){var p=0;for(g=h.length;pb&&a[e]--; -1!=d&&c===q&&a.splice(d,1)}function va(a,b,c,d){var e=a.aoData[b],f,g=function(l,n){for(;l.childNodes.length;)l.removeChild(l.firstChild);l.innerHTML=S(a,b,n,"display")};if("dom"!==c&&(c&&"auto"!==c||"dom"!==e.src)){var h=e.anCells;if(h)if(d!==q)g(h[d],d);else for(c=0,f=h.length;c").appendTo(d));var l=0;for(b=h.length;l=a.fnRecordsDisplay()?0:h,a.iInitDisplayStart=-1);h=a._iDisplayStart;var m=a.fnDisplayEnd();if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,U(a,!1);else if(!l)a.iDraw++;else if(!a.bDestroying&&!b){Gb(a);return}if(0!==n.length)for(b=l?a.aoData.length:m,g=l?0:h;g",{"class":f?e[0]:""}).append(k("
    ",{valign:"top",colSpan:na(a),"class":a.oClasses.sRowEmpty}).html(d))[0];H(a,"aoHeaderCallback","header",[k(a.nTHead).children("tr")[0], +cb(a),h,m,n]);H(a,"aoFooterCallback","footer",[k(a.nTFoot).children("tr")[0],cb(a),h,m,n]);e=k(a.nTBody);e.children().detach();e.append(k(c));H(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=!1}}function ja(a,b){var c=a.oFeatures,d=c.bFilter;c.bSort&&Hb(a);d?ya(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);a._drawHold=b;fa(a);a._drawHold=!1}function Ib(a){var b=a.oClasses,c=k(a.nTable);c=k("
    ").insertBefore(c);var d=a.oFeatures, e=k("
    ",{id:a.sTableId+"_wrapper","class":b.sWrapper+(a.nTFoot?"":" "+b.sNoFooter)});a.nHolding=c[0];a.nTableWrapper=e[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var f=a.sDom.split(""),g,h,l,n,m,p,t=0;t")[0];n=f[t+1];if("'"==n||'"'==n){m="";for(p=2;f[t+p]!=n;)m+=f[t+p],p++;"H"==m?m=b.sJUIHeader:"F"==m&&(m=b.sJUIFooter);-1!=m.indexOf(".")?(n=m.split("."),l.id=n[0].substr(1,n[0].length-1),l.className=n[1]):"#"==m.charAt(0)?l.id=m.substr(1, -m.length-1):l.className=m;t+=p}e.append(l);e=k(l)}else if(">"==h)e=e.parent();else if("l"==h&&d.bPaginate&&d.bLengthChange)g=Ib(a);else if("f"==h&&d.bFilter)g=Jb(a);else if("r"==h&&d.bProcessing)g=Kb(a);else if("t"==h)g=Lb(a);else if("i"==h&&d.bInfo)g=Mb(a);else if("p"==h&&d.bPaginate)g=Nb(a);else if(0!==u.ext.feature.length)for(l=u.ext.feature,p=0,n=l.length;p"==h)e=e.parent();else if("l"==h&&d.bPaginate&&d.bLengthChange)g=Jb(a);else if("f"==h&&d.bFilter)g=Kb(a);else if("r"==h&&d.bProcessing)g=Lb(a);else if("t"==h)g=Mb(a);else if("i"==h&&d.bInfo)g=Nb(a);else if("p"==h&&d.bPaginate)g=Ob(a);else if(0!==u.ext.feature.length)for(l=u.ext.feature,p=0,n=l.length;p',h=d.sSearch;h=h.match(/_INPUT_/)?h.replace("_INPUT_",g):h+g;b=k("
    ",{id:f.f?null:c+"_filter","class":b.sFilter}).append(k("
    ").addClass(b.sLength);a.aanFeatures.l||(l[0].id=c+"_length");l.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",e[0].outerHTML));k("select",l).val(a._iDisplayLength).on("change.DT",function(n){ib(a,k(this).val());fa(a)});k(a.nTable).on("length.dt.DT",function(n,m,p){a===m&&k("select",l).val(p)});return l[0]}function Nb(a){var b=a.sPaginationType,c=u.ext.pager[b],d="function"===typeof c,e=function(g){fa(g)};b=k("
    ").addClass(a.oClasses.sPaging+b)[0]; -var f=a.aanFeatures;d||c.fnInit(a,b,e);f.p||(b.id=a.sTableId+"_paginate",a.aoDrawCallback.push({fn:function(g){if(d){var h=g._iDisplayStart,l=g._iDisplayLength,n=g.fnRecordsDisplay(),m=-1===l;h=m?0:Math.ceil(h/l);l=m?1:Math.ceil(n/l);n=c(h,l);var p;m=0;for(p=f.p.length;mf&& -(d=0)):"first"==b?d=0:"previous"==b?(d=0<=e?d-e:0,0>d&&(d=0)):"next"==b?d+e",{id:a.aanFeatures.r?null:a.sTableId+"_processing","class":a.oClasses.sProcessing}).html(a.oLanguage.sProcessing).insertBefore(a.nTable)[0]}function U(a,b){a.oFeatures.bProcessing&&k(a.aanFeatures.r).css("display",b?"block":"none"); -I(a,null,"processing",[a,b])}function Lb(a){var b=k(a.nTable);b.attr("role","grid");var c=a.oScroll;if(""===c.sX&&""===c.sY)return a.nTable;var d=c.sX,e=c.sY,f=a.oClasses,g=b.children("caption"),h=g.length?g[0]._captionSide:null,l=k(b[0].cloneNode(!1)),n=k(b[0].cloneNode(!1)),m=b.children("tfoot");m.length||(m=null);l=k("
    ",{"class":f.sScrollWrapper}).append(k("
    ",{"class":f.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:d?d?K(d):null:"100%"}).append(k("
    ", -{"class":f.sScrollHeadInner}).css({"box-sizing":"content-box",width:c.sXInner||"100%"}).append(l.removeAttr("id").css("margin-left",0).append("top"===h?g:null).append(b.children("thead"))))).append(k("
    ",{"class":f.sScrollBody}).css({position:"relative",overflow:"auto",width:d?K(d):null}).append(b));m&&l.append(k("
    ",{"class":f.sScrollFoot}).css({overflow:"hidden",border:0,width:d?d?K(d):null:"100%"}).append(k("
    ",{"class":f.sScrollFootInner}).append(n.removeAttr("id").css("margin-left", -0).append("bottom"===h?g:null).append(b.children("tfoot")))));b=l.children();var p=b[0];f=b[1];var t=m?b[2]:null;if(d)k(f).on("scroll.DT",function(v){v=this.scrollLeft;p.scrollLeft=v;m&&(t.scrollLeft=v)});k(f).css("max-height",e);c.bCollapse||k(f).css("height",e);a.nScrollHead=p;a.nScrollBody=f;a.nScrollFoot=t;a.aoDrawCallback.push({fn:Ea,sName:"scrolling"});return l[0]}function Ea(a){var b=a.oScroll,c=b.sX,d=b.sXInner,e=b.sY;b=b.iBarWidth;var f=k(a.nScrollHead),g=f[0].style,h=f.children("div"),l= -h[0].style,n=h.children("table");h=a.nScrollBody;var m=k(h),p=h.style,t=k(a.nScrollFoot).children("div"),v=t.children("table"),x=k(a.nTHead),r=k(a.nTable),A=r[0],E=A.style,H=a.nTFoot?k(a.nTFoot):null,W=a.oBrowser,M=W.bScrollOversize,C=T(a.aoColumns,"nTh"),B=[],ba=[],X=[],lb=[],Aa,Yb=function(F){F=F.style;F.paddingTop="0";F.paddingBottom="0";F.borderTopWidth="0";F.borderBottomWidth="0";F.height=0};var ha=h.scrollHeight>h.clientHeight;if(a.scrollBarVis!==ha&&a.scrollBarVis!==q)a.scrollBarVis=ha,ra(a); -else{a.scrollBarVis=ha;r.children("thead, tfoot").remove();if(H){var ka=H.clone().prependTo(r);var la=H.find("tr");ka=ka.find("tr")}var mb=x.clone().prependTo(r);x=x.find("tr");ha=mb.find("tr");mb.find("th, td").removeAttr("tabindex");c||(p.width="100%",f[0].style.width="100%");k.each(Ka(a,mb),function(F,Y){Aa=sa(a,F);Y.style.width=a.aoColumns[Aa].sWidth});H&&Z(function(F){F.style.width=""},ka);f=r.outerWidth();""===c?(E.width="100%",M&&(r.find("tbody").height()>h.offsetHeight||"scroll"==m.css("overflow-y"))&& -(E.width=K(r.outerWidth()-b)),f=r.outerWidth()):""!==d&&(E.width=K(d),f=r.outerWidth());Z(Yb,ha);Z(function(F){X.push(F.innerHTML);B.push(K(k(F).css("width")))},ha);Z(function(F,Y){-1!==k.inArray(F,C)&&(F.style.width=B[Y])},x);k(ha).height(0);H&&(Z(Yb,ka),Z(function(F){lb.push(F.innerHTML);ba.push(K(k(F).css("width")))},ka),Z(function(F,Y){F.style.width=ba[Y]},la),k(ka).height(0));Z(function(F,Y){F.innerHTML='
    '+X[Y]+"
    ";F.childNodes[0].style.height="0";F.childNodes[0].style.overflow= -"hidden";F.style.width=B[Y]},ha);H&&Z(function(F,Y){F.innerHTML='
    '+lb[Y]+"
    ";F.childNodes[0].style.height="0";F.childNodes[0].style.overflow="hidden";F.style.width=ba[Y]},ka);r.outerWidth()h.offsetHeight||"scroll"==m.css("overflow-y")?f+b:f,M&&(h.scrollHeight>h.offsetHeight||"scroll"==m.css("overflow-y"))&&(E.width=K(la-b)),""!==c&&""===d||aa(a,1,"Possible column misalignment",6)):la="100%";p.width=K(la);g.width=K(la);H&&(a.nScrollFoot.style.width= -K(la));!e&&M&&(p.height=K(A.offsetHeight+b));c=r.outerWidth();n[0].style.width=K(c);l.width=K(c);d=r.height()>h.clientHeight||"scroll"==m.css("overflow-y");e="padding"+(W.bScrollbarLeft?"Left":"Right");l[e]=d?b+"px":"0px";H&&(v[0].style.width=K(c),t[0].style.width=K(c),t[0].style[e]=d?b+"px":"0px");r.children("colgroup").insertBefore(r.children("thead"));m.trigger("scroll");!a.bSorted&&!a.bFiltered||a._drawHold||(h.scrollTop=0)}}function Z(a,b,c){for(var d=0,e=0,f=b.length,g,h;e").appendTo(h.find("tbody"));h.find("thead, tfoot").remove();h.append(k(a.nTHead).clone()).append(k(a.nTFoot).clone());h.find("tfoot th, tfoot td").css("width","");n=Ka(a,h.find("thead")[0]);for(v=0;v").css({width:r.sWidthOrig, -margin:0,padding:0,border:0,height:1}));if(a.aoData.length)for(v=0;v").css(f||e?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(h).appendTo(p);f&&g?h.width(g):f?(h.css("width","auto"),h.removeAttr("width"),h.width()").css("width",K(a)).appendTo(b||z.body);b=a[0].offsetWidth;a.remove();return b}function $b(a,b){var c=ac(a,b);if(0>c)return null;var d=a.aoData[c];return d.nTr?d.anCells[b]: -k("
    ").html(S(a,c,b,"display"))[0]}function ac(a,b){for(var c,d=-1,e=-1,f=0,g=a.aoData.length;fd&&(d=c.length,e=f);return e}function K(a){return null===a?"0px":"number"==typeof a?0>a?"0px":a+"px":a.match(/\d$/)?a+"px":a}function pa(a){var b=[],c=a.aoColumns;var d=a.aaSortingFixed;var e=k.isPlainObject(d);var f=[];var g=function(m){m.length&&!Array.isArray(m[0])?f.push(m):k.merge(f,m)};Array.isArray(d)&&g(d); -e&&d.pre&&g(d.pre);g(a.aaSorting);e&&d.post&&g(d.post);for(a=0;aH?1:0;if(0!==E)return"asc"===A.dir?E:-E}E=c[m];H=c[p];return EH?1:0}):g.sort(function(m,p){var t,v=h.length,x=e[m]._aSortData,r=e[p]._aSortData;for(t=0;tH?1:0})}a.bSorted=!0}function cc(a){var b=a.aoColumns,c=pa(a);a=a.oLanguage.oAria;for(var d=0,e=b.length;d/g,"");var l=f.nTh;l.removeAttribute("aria-sort");f.bSortable&&(0e?e+1:3))}e=0;for(f=d.length;ee?e+1:3))}a.aLastSort= -d}function bc(a,b){var c=a.aoColumns[b],d=u.ext.order[c.sSortDataType],e;d&&(e=d.call(a.oInstance,a,b,ta(a,b)));for(var f,g=u.ext.type.order[c.sType+"-pre"],h=0,l=a.aoData.length;h=f.length?[0,m[1]]:m)}));h.search!==q&&k.extend(a.oPreviousSearch,Vb(h.search));if(h.columns)for(d=0,e=h.columns.length;d=c&&(b=c-d);b-=b%d;if(-1===d||0>b)b=0;a._iDisplayStart=b}function eb(a,b){a=a.renderer;var c=u.ext.renderer[b];return k.isPlainObject(a)&&a[b]?c[a[b]]||c._:"string"===typeof a?c[a]|| -c._:c._}function P(a){return a.oFeatures.bServerSide?"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function Ba(a,b){var c=ec.numbers_length,d=Math.floor(c/2);b<=c?a=qa(0,b):a<=d?(a=qa(0,c-2),a.push("ellipsis"),a.push(b-1)):(a>=b-1-d?a=qa(b-(c-2),b):(a=qa(a-d+2,a+d-1),a.push("ellipsis"),a.push(b-1)),a.splice(0,0,"ellipsis"),a.splice(0,0,0));a.DT_el="span";return a}function Va(a){k.each({num:function(b){return Sa(b,a)},"num-fmt":function(b){return Sa(b,a,qb)},"html-num":function(b){return Sa(b,a,Ta)},"html-num-fmt":function(b){return Sa(b, -a,Ta,qb)}},function(b,c){L.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(L.type.search[b+a]=L.type.search.html)})}function fc(a){return function(){var b=[Ra(this[u.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return u.ext.internal[a].apply(this,b)}}var u=function(a){this.$=function(f,g){return this.api(!0).$(f,g)};this._=function(f,g){return this.api(!0).rows(f,g).data()};this.api=function(f){return f?new D(Ra(this[L.iApiIndex])):new D(this)};this.fnAddData=function(f,g){var h=this.api(!0); -f=Array.isArray(f)&&(Array.isArray(f[0])||k.isPlainObject(f[0]))?h.rows.add(f):h.row.add(f);(g===q||g)&&h.draw();return f.flatten().toArray()};this.fnAdjustColumnSizing=function(f){var g=this.api(!0).columns.adjust(),h=g.settings()[0],l=h.oScroll;f===q||f?g.draw(!1):(""!==l.sX||""!==l.sY)&&Ea(h)};this.fnClearTable=function(f){var g=this.api(!0).clear();(f===q||f)&&g.draw()};this.fnClose=function(f){this.api(!0).row(f).child.hide()};this.fnDeleteRow=function(f,g,h){var l=this.api(!0);f=l.rows(f);var n= -f.settings()[0],m=n.aoData[f[0][0]];f.remove();g&&g.call(this,n,m);(h===q||h)&&l.draw();return m};this.fnDestroy=function(f){this.api(!0).destroy(f)};this.fnDraw=function(f){this.api(!0).draw(f)};this.fnFilter=function(f,g,h,l,n,m){n=this.api(!0);null===g||g===q?n.search(f,h,l,m):n.column(g).search(f,h,l,m);n.draw()};this.fnGetData=function(f,g){var h=this.api(!0);if(f!==q){var l=f.nodeName?f.nodeName.toLowerCase():"";return g!==q||"td"==l||"th"==l?h.cell(f,g).data():h.row(f).data()||null}return h.data().toArray()}; -this.fnGetNodes=function(f){var g=this.api(!0);return f!==q?g.row(f).node():g.rows().nodes().flatten().toArray()};this.fnGetPosition=function(f){var g=this.api(!0),h=f.nodeName.toUpperCase();return"TR"==h?g.row(f).index():"TD"==h||"TH"==h?(f=g.cell(f).index(),[f.row,f.columnVisible,f.column]):null};this.fnIsOpen=function(f){return this.api(!0).row(f).child.isShown()};this.fnOpen=function(f,g,h){return this.api(!0).row(f).child(g,h).show().child()[0]};this.fnPageChange=function(f,g){f=this.api(!0).page(f); -(g===q||g)&&f.draw(!1)};this.fnSetColumnVis=function(f,g,h){f=this.api(!0).column(f).visible(g);(h===q||h)&&f.columns.adjust().draw()};this.fnSettings=function(){return Ra(this[L.iApiIndex])};this.fnSort=function(f){this.api(!0).order(f).draw()};this.fnSortListener=function(f,g,h){this.api(!0).order.listener(f,g,h)};this.fnUpdate=function(f,g,h,l,n){var m=this.api(!0);h===q||null===h?m.row(g).data(f):m.cell(g,h).data(f);(n===q||n)&&m.columns.adjust();(l===q||l)&&m.draw();return 0};this.fnVersionCheck= -L.fnVersionCheck;var b=this,c=a===q,d=this.length;c&&(a={});this.oApi=this.internal=L.internal;for(var e in u.ext.internal)e&&(this[e]=fc(e));this.each(function(){var f={},g=1").appendTo(p));r.nTHead=B[0]; -B=p.children("tbody");0===B.length&&(B=k("
    ").html(S(a,c,b,"display"))[0]}function ac(a,b){for(var c,d=-1,e=-1,f=0,g=a.aoData.length;fd&&(d=c.length,e=f);return e}function K(a){return null===a?"0px":"number"==typeof a?0>a?"0px":a+"px":a.match(/\d$/)?a+"px":a}function pa(a){var b=[],c=a.aoColumns;var d=a.aaSortingFixed;var e=k.isPlainObject(d);var f=[];var g=function(m){m.length&&!Array.isArray(m[0])?f.push(m):k.merge(f,m)};Array.isArray(d)&&g(d);e&&d.pre&&g(d.pre);g(a.aaSorting);e&&d.post&&g(d.post);for(a=0;aI?1:0;if(0!==D)return"asc"===A.dir?D:-D}D=c[m];I=c[p];return DI?1:0}):g.sort(function(m,p){var t,v=h.length,x=e[m]._aSortData,r=e[p]._aSortData;for(t=0;tI?1:0})}a.bSorted=!0}function cc(a){var b=a.aoColumns,c=pa(a);a=a.oLanguage.oAria;for(var d=0,e=b.length;d/g,"");var l=f.nTh;l.removeAttribute("aria-sort");f.bSortable&&(0e?e+1:3))}e=0;for(f=d.length;ee?e+1:3))}a.aLastSort=d}function bc(a,b){var c=a.aoColumns[b],d=u.ext.order[c.sSortDataType],e;d&&(e=d.call(a.oInstance,a,b,ta(a,b)));for(var f,g=u.ext.type.order[c.sType+ +"-pre"],h=0,l=a.aoData.length;h= +f.length?[0,m[1]]:m)}));h.search!==q&&k.extend(a.oPreviousSearch,Wb(h.search));if(h.columns)for(d=0,e=h.columns.length;d=c&&(b=c-d);b-=b%d;if(-1===d||0>b)b=0;a._iDisplayStart=b}function fb(a,b){a=a.renderer;var c=u.ext.renderer[b];return k.isPlainObject(a)&&a[b]?c[a[b]]||c._:"string"===typeof a?c[a]||c._:c._}function P(a){return a.oFeatures.bServerSide?"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function Ca(a,b){var c=ec.numbers_length,d=Math.floor(c/2); +b<=c?a=qa(0,b):a<=d?(a=qa(0,c-2),a.push("ellipsis"),a.push(b-1)):(a>=b-1-d?a=qa(b-(c-2),b):(a=qa(a-d+2,a+d-1),a.push("ellipsis"),a.push(b-1)),a.splice(0,0,"ellipsis"),a.splice(0,0,0));a.DT_el="span";return a}function Wa(a){k.each({num:function(b){return Ta(b,a)},"num-fmt":function(b){return Ta(b,a,rb)},"html-num":function(b){return Ta(b,a,Ua)},"html-num-fmt":function(b){return Ta(b,a,Ua,rb)}},function(b,c){L.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(L.type.search[b+a]=L.type.search.html)})}function fc(a){return function(){var b= +[Sa(this[u.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return u.ext.internal[a].apply(this,b)}}var u=function(a){this.$=function(f,g){return this.api(!0).$(f,g)};this._=function(f,g){return this.api(!0).rows(f,g).data()};this.api=function(f){return f?new C(Sa(this[L.iApiIndex])):new C(this)};this.fnAddData=function(f,g){var h=this.api(!0);f=Array.isArray(f)&&(Array.isArray(f[0])||k.isPlainObject(f[0]))?h.rows.add(f):h.row.add(f);(g===q||g)&&h.draw();return f.flatten().toArray()}; +this.fnAdjustColumnSizing=function(f){var g=this.api(!0).columns.adjust(),h=g.settings()[0],l=h.oScroll;f===q||f?g.draw(!1):(""!==l.sX||""!==l.sY)&&Fa(h)};this.fnClearTable=function(f){var g=this.api(!0).clear();(f===q||f)&&g.draw()};this.fnClose=function(f){this.api(!0).row(f).child.hide()};this.fnDeleteRow=function(f,g,h){var l=this.api(!0);f=l.rows(f);var n=f.settings()[0],m=n.aoData[f[0][0]];f.remove();g&&g.call(this,n,m);(h===q||h)&&l.draw();return m};this.fnDestroy=function(f){this.api(!0).destroy(f)}; +this.fnDraw=function(f){this.api(!0).draw(f)};this.fnFilter=function(f,g,h,l,n,m){n=this.api(!0);null===g||g===q?n.search(f,h,l,m):n.column(g).search(f,h,l,m);n.draw()};this.fnGetData=function(f,g){var h=this.api(!0);if(f!==q){var l=f.nodeName?f.nodeName.toLowerCase():"";return g!==q||"td"==l||"th"==l?h.cell(f,g).data():h.row(f).data()||null}return h.data().toArray()};this.fnGetNodes=function(f){var g=this.api(!0);return f!==q?g.row(f).node():g.rows().nodes().flatten().toArray()};this.fnGetPosition= +function(f){var g=this.api(!0),h=f.nodeName.toUpperCase();return"TR"==h?g.row(f).index():"TD"==h||"TH"==h?(f=g.cell(f).index(),[f.row,f.columnVisible,f.column]):null};this.fnIsOpen=function(f){return this.api(!0).row(f).child.isShown()};this.fnOpen=function(f,g,h){return this.api(!0).row(f).child(g,h).show().child()[0]};this.fnPageChange=function(f,g){f=this.api(!0).page(f);(g===q||g)&&f.draw(!1)};this.fnSetColumnVis=function(f,g,h){f=this.api(!0).column(f).visible(g);(h===q||h)&&f.columns.adjust().draw()}; +this.fnSettings=function(){return Sa(this[L.iApiIndex])};this.fnSort=function(f){this.api(!0).order(f).draw()};this.fnSortListener=function(f,g,h){this.api(!0).order.listener(f,g,h)};this.fnUpdate=function(f,g,h,l,n){var m=this.api(!0);h===q||null===h?m.row(g).data(f):m.cell(g,h).data(f);(n===q||n)&&m.columns.adjust();(l===q||l)&&m.draw();return 0};this.fnVersionCheck=L.fnVersionCheck;var b=this,c=a===q,d=this.length;c&&(a={});this.oApi=this.internal=L.internal;for(var e in u.ext.internal)e&&(this[e]= +fc(e));this.each(function(){var f={},g=1").appendTo(p));r.nTHead=E[0];var aa=p.children("tbody");0===aa.length&&(aa=k("
    '+g.title+": "+g.data+"
    ').append(c)}}};u.defaults={breakpoints:u.breakpoints,auto:!0,details:{display:u.display.childRow,renderer:u.renderer.listHidden(),target:0,type:"inline"},orthogonal:"display"};var C=b.fn.dataTable.Api;C.register("responsive()",function(){return this});C.register("responsive.index()", function(a){a=b(a);return{column:a.data("dtr-index"),row:a.parent().data("dtr-index")}});C.register("responsive.rebuild()",function(){return this.iterator("table",function(a){a._responsive&&a._responsive._classLogic()})});C.register("responsive.recalc()",function(){return this.iterator("table",function(a){a._responsive&&(a._responsive._resizeAuto(),a._responsive._resize())})});C.register("responsive.hasHidden()",function(){var a=this.context[0];return a._responsive?-1!==b.inArray(!1,a._responsive._responsiveOnlyHidden()): -!1});C.registerPlural("columns().responsiveHidden()","column().responsiveHidden()",function(){return this.iterator("column",function(a,c){return a._responsive?a._responsive._responsiveOnlyHidden()[c]:!1},1)});u.version="2.2.7";b.fn.dataTable.Responsive=u;b.fn.DataTable.Responsive=u;b(m).on("preInit.dt.dtr",function(a,c,d){"dt"===a.namespace&&(b(c.nTable).hasClass("responsive")||b(c.nTable).hasClass("dt-responsive")||c.oInit.responsive||z.defaults.responsive)&&(a=c.oInit.responsive,!1!==a&&new u(c, +!1});C.registerPlural("columns().responsiveHidden()","column().responsiveHidden()",function(){return this.iterator("column",function(a,c){return a._responsive?a._responsive._responsiveOnlyHidden()[c]:!1},1)});u.version="2.2.9";b.fn.dataTable.Responsive=u;b.fn.DataTable.Responsive=u;b(m).on("preInit.dt.dtr",function(a,c,d){"dt"===a.namespace&&(b(c.nTable).hasClass("responsive")||b(c.nTable).hasClass("dt-responsive")||c.oInit.responsive||z.defaults.responsive)&&(a=c.oInit.responsive,!1!==a&&new u(c, b.isPlainObject(a)?a:{}))});return u}); /*! - Bootstrap 4 integration for DataTables' Responsive - ©2016 SpryMedia Ltd - datatables.net/license + Bootstrap 5 integration for DataTables' Responsive + ©2021 SpryMedia Ltd - datatables.net/license */ var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(a,b,c){a instanceof String&&(a=String(a));for(var e=a.length,d=0;d'); -c.modal=function(g){return function(k,h,l){if(!a.fn.modal)d(k,h,l);else if(!h){if(g&&g.header){h=f.find("div.modal-header");var m=h.find("button").detach();h.empty().append('").append(m)}f.find("div.modal-body").empty().append(l());f.appendTo("body").modal()}}};return b.Responsive}); +(function(a){"function"===typeof define&&define.amd?define(["jquery","datatables.net-bs5","datatables.net-responsive"],function(b){return a(b,window,document)}):"object"===typeof exports?module.exports=function(b,c){b||(b=window);c&&c.fn.dataTable||(c=require("datatables.net-bs5")(b,c).$);c.fn.dataTable.Responsive||require("datatables.net-responsive")(b,c);return a(c,b,b.document)}:a(jQuery,window,document)})(function(a,b,c,e){b=a.fn.dataTable;c=b.Responsive.display;var d=c.modal,f=a('