diff --git a/Dockerfile_Live b/Dockerfile_Live index 7ca6bd2..520167f 100644 --- a/Dockerfile_Live +++ b/Dockerfile_Live @@ -6,6 +6,7 @@ ARG TRYTOND_VERSION ENV SERIES=${TRYTOND_VERSION} RUN npm install -g bower RUN curl https://downloads.tryton.org/${SERIES}/tryton-sao-last.tgz | tar zxf - -C / +COPY naliia_sao_custom/sao.less /package/src/sao.less RUN cd /package && bower install --allow-root FROM python:3.11-bullseye @@ -15,4 +16,4 @@ RUN apt-get update && apt-get install -y postgresql-client # TOMADO DE: https://hg.tryton.org/tryton-docker/file/tip/6.6/Dockerfile COPY --from=builder-node /package /var/lib/trytond/www - +COPY naliia_sao_custom/ /var/lib/trytond/www/ diff --git a/naliia_sao_custom/custom.css b/naliia_sao_custom/custom.css new file mode 100644 index 0000000..fad1733 --- /dev/null +++ b/naliia_sao_custom/custom.css @@ -0,0 +1,11051 @@ +/* This file is part of Tryton. The COPYRIGHT file at the top level of + this repository contains the full copyright notices and license terms. */ +/*! + * Bootstrap v3.4.1 (https://getbootstrap.com/) + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +html { + font-family: sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: none; + text-decoration: underline; + text-decoration: underline dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + font-size: 2em; + margin: 0.67em 0; +} +mark { + background: #ff0; + color: #000; +} +small { + font-size: 80%; +} +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + box-sizing: content-box; + height: 0; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-appearance: textfield; + box-sizing: content-box; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} +legend { + border: 0; + padding: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + 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 #ddd !important; + } +} +@font-face { + font-family: "Glyphicons Halflings"; + src: url("../bower_components/bootstrap/fonts/glyphicons-halflings-regular.eot"); + src: url("../bower_components/bootstrap/fonts/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"), url("../bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff2") format("woff2"), url("../bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff") format("woff"), url("../bower_components/bootstrap/fonts/glyphicons-halflings-regular.ttf") format("truetype"), url("../bower_components/bootstrap/fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular") format("svg"); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: "Glyphicons Halflings"; + font-style: normal; + font-weight: 400; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\002a"; +} +.glyphicon-plus:before { + content: "\002b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-btc:before { + content: "\e227"; +} +.glyphicon-xbt:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-jpy:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-rub:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333333; + background-color: #fff; + background-image: url("images/body_background.png"); + background-repeat: no-repeat; + background-position: center -200%; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #487B50; + text-decoration: none; +} +a:hover, +a:focus { + color: #000000; + text-decoration: underline; +} +a:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + padding: 4px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + display: inline-block; + max-width: 100%; + height: auto; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eeeeee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +[role="button"] { + cursor: pointer; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: 400; + line-height: 1; + color: #777777; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 100%; +} +mark, +.mark { + padding: 0.2em; + background-color: #fcf8e3; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #777777; +} +.text-primary { + color: #acd5e3; +} +a.text-primary:hover, +a.text-primary:focus { + color: #1a585b; +} +.text-success { + color: #3c763d; +} +a.text-success:hover, +a.text-success:focus { + color: #2b542c; +} +.text-info { + color: #31708f; +} +a.text-info:hover, +a.text-info:focus { + color: #245269; +} +.text-warning { + color: #8a6d3b; +} +a.text-warning:hover, +a.text-warning:focus { + color: #66512c; +} +.text-danger { + color: #a94442; +} +a.text-danger:hover, +a.text-danger:focus { + color: #843534; +} +.bg-primary { + color: #fff; + background-color: #acd5e3; +} +a.bg-primary:hover, +a.bg-primary:focus { + background-color: #1a585b; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover, +a.bg-success:focus { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover, +a.bg-info:focus { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover, +a.bg-warning:focus { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover, +a.bg-danger:focus { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eeeeee; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + list-style: none; + margin-left: -5px; +} +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: 700; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eeeeee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: "\2014 \00A0"; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eeeeee; + border-left: 0; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ""; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: "\00A0 \2014"; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: 700; + box-shadow: none; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +.row { + margin-right: -15px; + margin-left: -15px; +} +.row-no-gutters { + margin-right: 0; + margin-left: 0; +} +.row-no-gutters [class*="col-"] { + padding-right: 0; + padding-left: 0; +} +.col-xs-1, +.col-sm-1, +.col-md-1, +.col-lg-1, +.col-xs-2, +.col-sm-2, +.col-md-2, +.col-lg-2, +.col-xs-3, +.col-sm-3, +.col-md-3, +.col-lg-3, +.col-xs-4, +.col-sm-4, +.col-md-4, +.col-lg-4, +.col-xs-5, +.col-sm-5, +.col-md-5, +.col-lg-5, +.col-xs-6, +.col-sm-6, +.col-md-6, +.col-lg-6, +.col-xs-7, +.col-sm-7, +.col-md-7, +.col-lg-7, +.col-xs-8, +.col-sm-8, +.col-md-8, +.col-lg-8, +.col-xs-9, +.col-sm-9, +.col-md-9, +.col-lg-9, +.col-xs-10, +.col-sm-10, +.col-md-10, +.col-lg-10, +.col-xs-11, +.col-sm-11, +.col-md-11, +.col-lg-11, +.col-xs-12, +.col-sm-12, +.col-md-12, +.col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} +.col-xs-1, +.col-xs-2, +.col-xs-3, +.col-xs-4, +.col-xs-5, +.col-xs-6, +.col-xs-7, +.col-xs-8, +.col-xs-9, +.col-xs-10, +.col-xs-11, +.col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0%; +} +@media (min-width: 768px) { + .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 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0%; + } +} +@media (min-width: 992px) { + .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 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0%; + } +} +@media (min-width: 1200px) { + .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 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0%; + } +} +table { + background-color: transparent; +} +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777777; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #ddd; +} +.table .table { + background-color: #fff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #acd5e3; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + min-height: 0.01%; + overflow-x: auto; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: 700; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-appearance: none; + appearance: none; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555555; +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #59cbce; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(89, 203, 206, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(89, 203, 206, 0.6); +} +.form-control::-moz-placeholder { + color: #999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999; +} +.form-control::-webkit-input-placeholder { + color: #999; +} +.form-control::-ms-expand { + background-color: transparent; + border: 0; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #eeeeee; + opacity: 1; +} +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; +} +textarea.form-control { + height: auto; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"].form-control, + input[type="time"].form-control, + input[type="datetime-local"].form-control, + input[type="month"].form-control { + line-height: 34px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 33px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: 400; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 4px \9; + margin-left: -20px; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: 400; + vertical-align: middle; + cursor: pointer; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +.form-control-static { + min-height: 34px; + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-right: 0; + padding-left: 0; +} +.input-sm { + height: 33px; + padding: 5px 10px; + font-size: 14px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm { + height: 33px; + line-height: 33px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 33px; + padding: 5px 10px; + font-size: 14px; + line-height: 1.5; + border-radius: 3px; +} +.form-group-sm select.form-control { + height: 33px; + line-height: 33px; +} +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 33px; + min-height: 34px; + padding: 6px 10px; + font-size: 14px; + line-height: 1.5; +} +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-lg { + height: 46px; + line-height: 46px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.form-group-lg select.form-control { + height: 46px; + line-height: 46px; +} +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 46px; + min-height: 38px; + padding: 11px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 42.5px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback, +.input-group-lg + .form-control-feedback, +.form-group-lg .form-control + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} +.input-sm + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .form-control-feedback { + width: 33px; + height: 33px; + line-height: 33px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} +.has-success .form-control-feedback { + color: #3c763d; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} +.has-error .form-control-feedback { + color: #a94442; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 11px; + font-size: 18px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + font-size: 14px; + } +} +.btn { + display: inline-block; + margin-bottom: 0; + font-weight: normal; + text-align: center; + white-space: nowrap; + vertical-align: middle; + touch-action: manipulation; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + border-radius: 4px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333; + text-decoration: none; +} +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + filter: alpha(opacity=65); + opacity: 0.65; + -webkit-box-shadow: none; + box-shadow: none; +} +a.btn.disabled, +fieldset[disabled] a.btn { + pointer-events: none; +} +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; +} +.btn-default:focus, +.btn-default.focus { + color: #333; + background-color: #e6e6e6; + border-color: #8c8c8c; +} +.btn-default:hover { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333; + background-color: #e6e6e6; + background-image: none; + border-color: #adadad; +} +.btn-default:active:hover, +.btn-default.active:hover, +.open > .dropdown-toggle.btn-default:hover, +.btn-default:active:focus, +.btn-default.active:focus, +.open > .dropdown-toggle.btn-default:focus, +.btn-default:active.focus, +.btn-default.active.focus, +.open > .dropdown-toggle.btn-default.focus { + color: #333; + background-color: #d4d4d4; + border-color: #8c8c8c; +} +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus { + background-color: #fff; + border-color: #ccc; +} +.btn-default .badge { + color: #fff; + background-color: #333; +} +.btn-primary { + color: #fff; + background-color: #e54c75; + border-color: #ffffff; +} +.btn-primary:focus, +.btn-primary.focus { + color: #fff; + background-color: #e54c75; + border-color: #ffffff; +} +.btn-primary:hover { + color: #fff; + background-color: #e54c75; + border-color: #ffffff; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #fff; + background-color: #e54c75; + background-image: none; + border-color: #ffffff; +} +.btn-primary:active:hover, +.btn-primary.active:hover, +.open > .dropdown-toggle.btn-primary:hover, +.btn-primary:active:focus, +.btn-primary.active:focus, +.open > .dropdown-toggle.btn-primary:focus, +.btn-primary:active.focus, +.btn-primary.active.focus, +.open > .dropdown-toggle.btn-primary.focus { + color: #fff; + background-color: #1f1a17; + border-color: #fff; +} +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus { + background-color: #1f1a17; + border-color: #fff; +} +.btn-primary .badge { + color: #acd5e3; + background-color: #fff; +} +.btn-success { + color: #fff; + background-color: #00a639; + border-color: #fff; +} +.btn-success:focus, +.btn-success.focus { + color: #fff; + background-color: #00a639; + border-color: #1f1a17; +} +.btn-success:hover { + color: #fff; + background-color: #1f1a17; + border-color: #00a639; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #fff; + background-color: #00a639; + background-image: none; + border-color: #1f1a17; +} +.btn-success:active:hover, +.btn-success.active:hover, +.open > .dropdown-toggle.btn-success:hover, +.btn-success:active:focus, +.btn-success.active:focus, +.open > .dropdown-toggle.btn-success:focus, +.btn-success:active.focus, +.btn-success.active.focus, +.open > .dropdown-toggle.btn-success.focus { + color: #fff; + background-color: #acd5e3; + border-color: #fff; +} +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus { + background-color: #32ad52; + border-color: #2c9949; +} +.btn-success .badge { + color: #32ad52; + background-color: #fff; +} +.btn-info { + color: #fff; + background-color: #1f1a17; + border-color: #439499; +} +.btn-info:focus, +.btn-info.focus { + color: #fff; + background-color: #acd5e3; + border-color: #439499; +} +.btn-info:hover { + color: #fff; + background-color: #acd5e3; + border-color: #439499; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #fff; + background-color: #acd5e3; + background-image: none; + border-color: #439499; +} +.btn-info:active:hover, +.btn-info.active:hover, +.open > .dropdown-toggle.btn-info:hover, +.btn-info:active:focus, +.btn-info.active:focus, +.open > .dropdown-toggle.btn-info:focus, +.btn-info:active.focus, +.btn-info.active.focus, +.open > .dropdown-toggle.btn-info.focus { + color: #fff; + background-color: #439499; + border-color: #acd5e3; +} +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus { + background-color: #71bdc1; + border-color: #5fb5b9; +} +.btn-info .badge { + color: #71bdc1; + background-color: #fff; +} +.btn-warning { + color: #fff; + background-color: #e78e42; + border-color: #e4802b; +} +.btn-warning:focus, +.btn-warning.focus { + color: #fff; + background-color: #da731c; + border-color: #804410; +} +.btn-warning:hover { + color: #fff; + background-color: #da731c; + border-color: #bb6318; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #fff; + background-color: #da731c; + background-image: none; + border-color: #bb6318; +} +.btn-warning:active:hover, +.btn-warning.active:hover, +.open > .dropdown-toggle.btn-warning:hover, +.btn-warning:active:focus, +.btn-warning.active:focus, +.open > .dropdown-toggle.btn-warning:focus, +.btn-warning:active.focus, +.btn-warning.active.focus, +.open > .dropdown-toggle.btn-warning.focus { + color: #fff; + background-color: #bb6318; + border-color: #804410; +} +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus { + background-color: #e78e42; + border-color: #e4802b; +} +.btn-warning .badge { + color: #e78e42; + background-color: #fff; +} +.btn-danger { + color: #fff; + background-color: #e74842; + border-color: #e4322b; +} +.btn-danger:focus, +.btn-danger.focus { + color: #fff; + background-color: #da231c; + border-color: #801410; +} +.btn-danger:hover { + color: #fff; + background-color: #da231c; + border-color: #bb1e18; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #fff; + background-color: #da231c; + background-image: none; + border-color: #bb1e18; +} +.btn-danger:active:hover, +.btn-danger.active:hover, +.open > .dropdown-toggle.btn-danger:hover, +.btn-danger:active:focus, +.btn-danger.active:focus, +.open > .dropdown-toggle.btn-danger:focus, +.btn-danger:active.focus, +.btn-danger.active.focus, +.open > .dropdown-toggle.btn-danger.focus { + color: #fff; + background-color: #bb1e18; + border-color: #801410; +} +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus { + background-color: #e74842; + border-color: #e4322b; +} +.btn-danger .badge { + color: #e74842; + background-color: #fff; +} +.btn-link { + font-weight: 400; + color: #acd5e3; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #1f1a17; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777777; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 14px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 14px; + line-height: 1.5; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-property: height, visibility; + transition-property: height, visibility; + -webkit-transition-duration: 0.35s; + transition-duration: 0.35s; + -webkit-transition-timing-function: ease; + transition-timing-function: ease; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid \9; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + text-align: left; + list-style: none; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: 400; + line-height: 1.42857143; + color: #333333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background-color: #acd5e3; + outline: 0; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777777; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + right: 0; + left: auto; +} +.dropdown-menu-left { + right: auto; + left: 0; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 14px; + line-height: 1.42857143; + color: #777777; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + content: ""; + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + .navbar-right .dropdown-menu-left { + right: auto; + left: 0; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn, +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group .form-control:focus { + z-index: 3; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 33px; + padding: 5px 10px; + font-size: 14px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 33px; + line-height: 33px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: 400; + line-height: 1; + color: #555555; + text-align: center; + background-color: #eeeeee; + border: 1px solid #ccc; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 14px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + z-index: 2; + margin-left: -1px; +} +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} +.nav > li.disabled > a { + color: #777777; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #777777; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eeeeee; + border-color: #acd5e3; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #ddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #fff; + background-color: #acd5e3; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + border-top: 1px solid transparent; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-overflow-scrolling: touch; +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-right: 15px; + margin-top: 8px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 7.5px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } +} +.navbar-form { + padding: 10px 15px; + margin-right: -15px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + margin-top: 8px; + margin-bottom: 8px; +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} +.navbar-btn.btn-sm { + margin-top: 8.5px; + margin-bottom: 8.5px; +} +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; +} +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777; +} +.navbar-default .navbar-nav > li > a { + color: #777; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555; + background-color: #e7e7e7; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; + } +} +.navbar-default .navbar-toggle { + border-color: #ddd; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #ddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #888; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} +.navbar-default .navbar-link { + color: #777; +} +.navbar-default .navbar-link:hover { + color: #333; +} +.navbar-default .btn-link { + color: #777; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #333; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; +} +.navbar-inverse { + background-color: #e54c75; + border-color: #e54c75; +} +.navbar-inverse .navbar-brand { + color: white; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #1f1a17; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #1f1a17; +} +.navbar-inverse .navbar-nav > li > a { + color: #ffffff; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: white; + background-color: #f59f86; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #fff; + background-color: #487b50; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #1f1a17; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #1f1a17; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #6dd1d4; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #1f1a17; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; + } +} +.navbar-inverse .navbar-toggle { + border-color: #333; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: rgba(0, 0, 0, 0.5); +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: rgba(0, 0, 0, 0.5); +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #1e6466; +} +.navbar-inverse .navbar-link { + color: #6dd1d4; +} +.navbar-inverse .navbar-link:hover { + color: #fff; +} +.navbar-inverse .btn-link { + color: #6dd1d4; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #fff; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + padding: 0 5px; + color: #ccc; + content: "/\00a0"; +} +.breadcrumb > .active { + color: #777777; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #acd5e3; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + z-index: 2; + color: #154547; + background-color: #eeeeee; + border-color: #ddd; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 3; + color: #fff; + cursor: default; + background-color: #acd5e3; + border-color: #acd5e3; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 14px; + line-height: 1.5; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777777; + cursor: not-allowed; + background-color: #fff; +} +.label { + display: inline; + padding: 0.2em 0.6em 0.3em; + font-size: 75%; + font-weight: 700; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.25em; +} +a.label:hover, +a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #777777; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; +} +.label-primary { + background-color: #e54c75; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #1a585b; +} +.label-success { + background-color: #32ad52; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #27853f; +} +.label-info { + background-color: #e54c75; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #4eacb2; +} +.label-warning { + background-color: #e78e42; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #da731c; +} +.label-danger { + background-color: #e74842; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #da231c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 14px; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: middle; + background-color: #777777; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; + color +} +.btn-xs .badge, +.btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #acd5e3; + background-color: #fff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding-top: 30px; + padding-bottom: 30px; + margin-bottom: 30px; + color: inherit; + background-color: #eeeeee; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #d5d5d5; +} +.container .jumbotron, +.container-fluid .jumbotron { + padding-right: 15px; + padding-left: 15px; + border-radius: 6px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border 0.2s ease-in-out; + -o-transition: border 0.2s ease-in-out; + transition: border 0.2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-right: auto; + margin-left: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #acd5e3; +} +.thumbnail .caption { + padding: 9px; + color: #333333; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #2b542c; +} +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #245269; +} +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.alert-warning hr { + border-top-color: #f7e1b5; +} +.alert-warning .alert-link { + color: #66512c; +} +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.alert-danger hr { + border-top-color: #e4b9c0; +} +.alert-danger .alert-link { + color: #843534; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} +.progress-bar { + float: left; + width: 0%; + height: 100%; + font-size: 14px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #e54c75; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-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-image: -o-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-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: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #32ad52; +} +.progress-striped .progress-bar-success { + background-image: -webkit-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-image: -o-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-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); +} +.progress-bar-info { + background-color: #71bdc1; +} +.progress-striped .progress-bar-info { + background-image: -webkit-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-image: -o-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-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); +} +.progress-bar-warning { + background-color: #e78e42; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-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-image: -o-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-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); +} +.progress-bar-danger { + background-color: #e74842; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-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-image: -o-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-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); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media, +.media-body { + overflow: hidden; + zoom: 1; +} +.media-body { + width: 10000px; +} +.media-object { + display: block; +} +.media-object.img-thumbnail { + max-width: none; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + padding-left: 0; + margin-bottom: 20px; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; +} +.list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + color: #777777; + cursor: not-allowed; + background-color: #eeeeee; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #777777; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #acd5e3; + border-color: #acd5e3; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #94dde0; +} +a.list-group-item, +button.list-group-item { + color: #555; +} +a.list-group-item .list-group-item-heading, +button.list-group-item .list-group-item-heading { + color: #333; +} +a.list-group-item:hover, +button.list-group-item:hover, +a.list-group-item:focus, +button.list-group-item:focus { + color: #555; + text-decoration: none; + background-color: #f5f5f5; +} +button.list-group-item { + width: 100%; + text-align: left; +} +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} +a.list-group-item-success, +button.list-group-item-success { + color: #3c763d; +} +a.list-group-item-success .list-group-item-heading, +button.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +button.list-group-item-success:hover, +a.list-group-item-success:focus, +button.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +button.list-group-item-success.active, +a.list-group-item-success.active:hover, +button.list-group-item-success.active:hover, +a.list-group-item-success.active:focus, +button.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} +a.list-group-item-info, +button.list-group-item-info { + color: #31708f; +} +a.list-group-item-info .list-group-item-heading, +button.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +button.list-group-item-info:hover, +a.list-group-item-info:focus, +button.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +button.list-group-item-info.active, +a.list-group-item-info.active:hover, +button.list-group-item-info.active:hover, +a.list-group-item-info.active:focus, +button.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} +a.list-group-item-warning, +button.list-group-item-warning { + color: #8a6d3b; +} +a.list-group-item-warning .list-group-item-heading, +button.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +button.list-group-item-warning:hover, +a.list-group-item-warning:focus, +button.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +button.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +button.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus, +button.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} +a.list-group-item-danger, +button.list-group-item-danger { + color: #a94442; +} +a.list-group-item-danger .list-group-item-heading, +button.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +button.list-group-item-danger:hover, +a.list-group-item-danger:focus, +button.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +button.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +button.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus, +button.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + margin-bottom: 0; + border: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; +} +.panel-default { + border-color: #ddd; +} +.panel-default > .panel-heading { + color: #fff; + background-color: #e54c75; + border-color: #ddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; +} +.panel-default > .panel-heading .badge { + color: #e54c75; + background-color: #fff; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; +} +.panel-primary { + border-color: #acd5e3; +} +.panel-primary > .panel-heading { + color: #fff; + background-color: #acd5e3; + border-color: #acd5e3; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #acd5e3; +} +.panel-primary > .panel-heading .badge { + color: #acd5e3; + background-color: #fff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #acd5e3; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.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-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} +.well-lg { + padding: 24px; + border-radius: 6px; +} +.well-sm { + padding: 9px; + border-radius: 3px; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: 0.2; +} +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: 0.5; +} +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; + appearance: none; +} +.modal-open { + overflow: hidden; +} +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform 0.3s ease-out; + -moz-transition: -moz-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + outline: 0; +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; +} +.modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0; +} +.modal-backdrop.in { + filter: alpha(opacity=50); + opacity: 0.5; +} +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-style: normal; + font-weight: 400; + line-height: 1.42857143; + line-break: auto; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + font-size: 14px; + filter: alpha(opacity=0); + opacity: 0; +} +.tooltip.in { + filter: alpha(opacity=90); + opacity: 0.9; +} +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-style: normal; + font-weight: 400; + line-height: 1.42857143; + line-break: auto; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + font-size: 14px; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow:after { + content: ""; + border-width: 10px; +} +.popover.top > .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999999; + border-top-color: rgba(0, 0, 0, 0.25); + border-bottom-width: 0; +} +.popover.top > .arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: #fff; + border-bottom-width: 0; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999999; + border-right-color: rgba(0, 0, 0, 0.25); + border-left-width: 0; +} +.popover.right > .arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0; +} +.popover.bottom > .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999999; + border-bottom-color: rgba(0, 0, 0, 0.25); +} +.popover.bottom > .arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999999; + border-left-color: rgba(0, 0, 0, 0.25); +} +.popover.left > .arrow:after { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff; +} +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform 0.6s ease-in-out; + -moz-transition: -moz-transform 0.6s ease-in-out; + -o-transition: -o-transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + -moz-perspective: 1000px; + perspective: 1000px; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + left: 0; + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + left: 0; + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + left: 0; + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); + background-color: rgba(0, 0, 0, 0); + filter: alpha(opacity=50); + opacity: 0.5; +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0%), color-stop(rgba(0, 0, 0, 0.0001) 100%)); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); +} +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0%), color-stop(rgba(0, 0, 0, 0.5) 100%)); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); +} +.carousel-control:hover, +.carousel-control:focus { + color: #fff; + text-decoration: none; + outline: 0; + filter: alpha(opacity=90); + opacity: 0.9; +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + margin-top: -10px; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + font-family: serif; + line-height: 1; +} +.carousel-control .icon-prev:before { + content: "\2039"; +} +.carousel-control .icon-next:before { + content: "\203a"; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px; +} +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff; +} +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -10px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -10px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -10px; + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-header:before, +.modal-header:after, +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-header:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table !important; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table !important; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table !important; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table !important; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table !important; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +html[dir="rtl"] { + direction: rtl; +} +[dir="rtl"] body { + direction: rtl; +} +[dir="rtl"] .flip.text-left { + text-align: right; +} +[dir="rtl"] .flip.text-right { + text-align: left; +} +[dir="rtl"] .list-unstyled { + padding-right: 0; + padding-left: initial; +} +[dir="rtl"] .list-inline { + padding-right: 0; + padding-left: initial; + margin-right: -5px; + margin-left: 0; +} +[dir="rtl"] dd { + margin-right: 0; + margin-left: initial; +} +@media (min-width: 768px) { + [dir="rtl"] .dl-horizontal dt { + float: right; + clear: right; + text-align: left; + } + [dir="rtl"] .dl-horizontal dd { + margin-right: 180px; + margin-left: 0; + } +} +[dir="rtl"] blockquote { + border-right: 5px solid #eeeeee; + border-left: 0; +} +[dir="rtl"] .blockquote-reverse, +[dir="rtl"] blockquote.pull-left { + padding-left: 15px; + padding-right: 0; + border-left: 5px solid #eeeeee; + border-right: 0; + text-align: left; +} +[dir="rtl"] .col-xs-1, +[dir="rtl"] [dir="rtl"] .col-sm-1, +[dir="rtl"] [dir="rtl"] .col-md-1, +[dir="rtl"] [dir="rtl"] .col-lg-1, +[dir="rtl"] [dir="rtl"] [dir="rtl"] .col-xs-2, +[dir="rtl"] [dir="rtl"] .col-sm-2, +[dir="rtl"] [dir="rtl"] .col-md-2, +[dir="rtl"] [dir="rtl"] .col-lg-2, +[dir="rtl"] [dir="rtl"] [dir="rtl"] .col-xs-3, +[dir="rtl"] [dir="rtl"] .col-sm-3, +[dir="rtl"] [dir="rtl"] .col-md-3, +[dir="rtl"] [dir="rtl"] .col-lg-3, +[dir="rtl"] [dir="rtl"] [dir="rtl"] .col-xs-4, +[dir="rtl"] [dir="rtl"] .col-sm-4, +[dir="rtl"] [dir="rtl"] .col-md-4, +[dir="rtl"] [dir="rtl"] .col-lg-4, +[dir="rtl"] [dir="rtl"] [dir="rtl"] .col-xs-5, +[dir="rtl"] [dir="rtl"] .col-sm-5, +[dir="rtl"] [dir="rtl"] .col-md-5, +[dir="rtl"] [dir="rtl"] .col-lg-5, +[dir="rtl"] [dir="rtl"] [dir="rtl"] .col-xs-6, +[dir="rtl"] [dir="rtl"] .col-sm-6, +[dir="rtl"] [dir="rtl"] .col-md-6, +[dir="rtl"] [dir="rtl"] .col-lg-6, +[dir="rtl"] [dir="rtl"] [dir="rtl"] .col-xs-7, +[dir="rtl"] [dir="rtl"] .col-sm-7, +[dir="rtl"] [dir="rtl"] .col-md-7, +[dir="rtl"] [dir="rtl"] .col-lg-7, +[dir="rtl"] [dir="rtl"] [dir="rtl"] .col-xs-8, +[dir="rtl"] [dir="rtl"] .col-sm-8, +[dir="rtl"] [dir="rtl"] .col-md-8, +[dir="rtl"] [dir="rtl"] .col-lg-8, +[dir="rtl"] [dir="rtl"] [dir="rtl"] .col-xs-9, +[dir="rtl"] [dir="rtl"] .col-sm-9, +[dir="rtl"] [dir="rtl"] .col-md-9, +[dir="rtl"] [dir="rtl"] .col-lg-9, +[dir="rtl"] [dir="rtl"] [dir="rtl"] .col-xs-10, +[dir="rtl"] [dir="rtl"] .col-sm-10, +[dir="rtl"] [dir="rtl"] .col-md-10, +[dir="rtl"] [dir="rtl"] .col-lg-10, +[dir="rtl"] [dir="rtl"] [dir="rtl"] .col-xs-11, +[dir="rtl"] [dir="rtl"] .col-sm-11, +[dir="rtl"] [dir="rtl"] .col-md-11, +[dir="rtl"] [dir="rtl"] .col-lg-11, +[dir="rtl"] [dir="rtl"] [dir="rtl"] .col-xs-12, +[dir="rtl"] [dir="rtl"] .col-sm-12, +[dir="rtl"] [dir="rtl"] .col-md-12, +[dir="rtl"] [dir="rtl"] .col-lg-12 { + position: relative; + min-height: 1px; + padding-left: 15px; + padding-right: 15px; +} +[dir="rtl"] .col-xs-1, +[dir="rtl"] [dir="rtl"] .col-xs-2, +[dir="rtl"] [dir="rtl"] .col-xs-3, +[dir="rtl"] [dir="rtl"] .col-xs-4, +[dir="rtl"] [dir="rtl"] .col-xs-5, +[dir="rtl"] [dir="rtl"] .col-xs-6, +[dir="rtl"] [dir="rtl"] .col-xs-7, +[dir="rtl"] [dir="rtl"] .col-xs-8, +[dir="rtl"] [dir="rtl"] .col-xs-9, +[dir="rtl"] [dir="rtl"] .col-xs-10, +[dir="rtl"] [dir="rtl"] .col-xs-11, +[dir="rtl"] [dir="rtl"] .col-xs-12 { + float: right; +} +[dir="rtl"] .col-xs-1, +[dir="rtl"] .col-xs-2, +[dir="rtl"] .col-xs-3, +[dir="rtl"] .col-xs-4, +[dir="rtl"] .col-xs-5, +[dir="rtl"] .col-xs-6, +[dir="rtl"] .col-xs-7, +[dir="rtl"] .col-xs-8, +[dir="rtl"] .col-xs-9, +[dir="rtl"] .col-xs-10, +[dir="rtl"] .col-xs-11, +[dir="rtl"] .col-xs-12 { + float: right; +} +[dir="rtl"] .col-xs-12 { + width: 100%; +} +[dir="rtl"] .col-xs-11 { + width: 91.66666667%; +} +[dir="rtl"] .col-xs-10 { + width: 83.33333333%; +} +[dir="rtl"] .col-xs-9 { + width: 75%; +} +[dir="rtl"] .col-xs-8 { + width: 66.66666667%; +} +[dir="rtl"] .col-xs-7 { + width: 58.33333333%; +} +[dir="rtl"] .col-xs-6 { + width: 50%; +} +[dir="rtl"] .col-xs-5 { + width: 41.66666667%; +} +[dir="rtl"] .col-xs-4 { + width: 33.33333333%; +} +[dir="rtl"] .col-xs-3 { + width: 25%; +} +[dir="rtl"] .col-xs-2 { + width: 16.66666667%; +} +[dir="rtl"] .col-xs-1 { + width: 8.33333333%; +} +[dir="rtl"] .col-xs-pull-12 { + left: 100%; + right: auto; +} +[dir="rtl"] .col-xs-pull-11 { + left: 91.66666667%; + right: auto; +} +[dir="rtl"] .col-xs-pull-10 { + left: 83.33333333%; + right: auto; +} +[dir="rtl"] .col-xs-pull-9 { + left: 75%; + right: auto; +} +[dir="rtl"] .col-xs-pull-8 { + left: 66.66666667%; + right: auto; +} +[dir="rtl"] .col-xs-pull-7 { + left: 58.33333333%; + right: auto; +} +[dir="rtl"] .col-xs-pull-6 { + left: 50%; + right: auto; +} +[dir="rtl"] .col-xs-pull-5 { + left: 41.66666667%; + right: auto; +} +[dir="rtl"] .col-xs-pull-4 { + left: 33.33333333%; + right: auto; +} +[dir="rtl"] .col-xs-pull-3 { + left: 25%; + right: auto; +} +[dir="rtl"] .col-xs-pull-2 { + left: 16.66666667%; + right: auto; +} +[dir="rtl"] .col-xs-pull-1 { + left: 8.33333333%; + right: auto; +} +[dir="rtl"] .col-xs-pull-0 { + left: auto; + right: auto; +} +[dir="rtl"] .col-xs-push-12 { + right: 100%; + left: 0; +} +[dir="rtl"] .col-xs-push-11 { + right: 91.66666667%; + left: 0; +} +[dir="rtl"] .col-xs-push-10 { + right: 83.33333333%; + left: 0; +} +[dir="rtl"] .col-xs-push-9 { + right: 75%; + left: 0; +} +[dir="rtl"] .col-xs-push-8 { + right: 66.66666667%; + left: 0; +} +[dir="rtl"] .col-xs-push-7 { + right: 58.33333333%; + left: 0; +} +[dir="rtl"] .col-xs-push-6 { + right: 50%; + left: 0; +} +[dir="rtl"] .col-xs-push-5 { + right: 41.66666667%; + left: 0; +} +[dir="rtl"] .col-xs-push-4 { + right: 33.33333333%; + left: 0; +} +[dir="rtl"] .col-xs-push-3 { + right: 25%; + left: 0; +} +[dir="rtl"] .col-xs-push-2 { + right: 16.66666667%; + left: 0; +} +[dir="rtl"] .col-xs-push-1 { + right: 8.33333333%; + left: 0; +} +[dir="rtl"] .col-xs-push-0 { + right: auto; + left: 0; +} +[dir="rtl"] .col-xs-offset-12 { + margin-right: 100%; + margin-left: 0; +} +[dir="rtl"] .col-xs-offset-11 { + margin-right: 91.66666667%; + margin-left: 0; +} +[dir="rtl"] .col-xs-offset-10 { + margin-right: 83.33333333%; + margin-left: 0; +} +[dir="rtl"] .col-xs-offset-9 { + margin-right: 75%; + margin-left: 0; +} +[dir="rtl"] .col-xs-offset-8 { + margin-right: 66.66666667%; + margin-left: 0; +} +[dir="rtl"] .col-xs-offset-7 { + margin-right: 58.33333333%; + margin-left: 0; +} +[dir="rtl"] .col-xs-offset-6 { + margin-right: 50%; + margin-left: 0; +} +[dir="rtl"] .col-xs-offset-5 { + margin-right: 41.66666667%; + margin-left: 0; +} +[dir="rtl"] .col-xs-offset-4 { + margin-right: 33.33333333%; + margin-left: 0; +} +[dir="rtl"] .col-xs-offset-3 { + margin-right: 25%; + margin-left: 0; +} +[dir="rtl"] .col-xs-offset-2 { + margin-right: 16.66666667%; + margin-left: 0; +} +[dir="rtl"] .col-xs-offset-1 { + margin-right: 8.33333333%; + margin-left: 0; +} +[dir="rtl"] .col-xs-offset-0 { + margin-right: 0%; + margin-left: 0; +} +@media (min-width: 768px) { + [dir="rtl"] .col-sm-1, + [dir="rtl"] [dir="rtl"] .col-sm-2, + [dir="rtl"] [dir="rtl"] .col-sm-3, + [dir="rtl"] [dir="rtl"] .col-sm-4, + [dir="rtl"] [dir="rtl"] .col-sm-5, + [dir="rtl"] [dir="rtl"] .col-sm-6, + [dir="rtl"] [dir="rtl"] .col-sm-7, + [dir="rtl"] [dir="rtl"] .col-sm-8, + [dir="rtl"] [dir="rtl"] .col-sm-9, + [dir="rtl"] [dir="rtl"] .col-sm-10, + [dir="rtl"] [dir="rtl"] .col-sm-11, + [dir="rtl"] [dir="rtl"] .col-sm-12 { + float: right; + } + [dir="rtl"] .col-sm-1, + [dir="rtl"] .col-sm-2, + [dir="rtl"] .col-sm-3, + [dir="rtl"] .col-sm-4, + [dir="rtl"] .col-sm-5, + [dir="rtl"] .col-sm-6, + [dir="rtl"] .col-sm-7, + [dir="rtl"] .col-sm-8, + [dir="rtl"] .col-sm-9, + [dir="rtl"] .col-sm-10, + [dir="rtl"] .col-sm-11, + [dir="rtl"] .col-sm-12 { + float: right; + } + [dir="rtl"] .col-sm-12 { + width: 100%; + } + [dir="rtl"] .col-sm-11 { + width: 91.66666667%; + } + [dir="rtl"] .col-sm-10 { + width: 83.33333333%; + } + [dir="rtl"] .col-sm-9 { + width: 75%; + } + [dir="rtl"] .col-sm-8 { + width: 66.66666667%; + } + [dir="rtl"] .col-sm-7 { + width: 58.33333333%; + } + [dir="rtl"] .col-sm-6 { + width: 50%; + } + [dir="rtl"] .col-sm-5 { + width: 41.66666667%; + } + [dir="rtl"] .col-sm-4 { + width: 33.33333333%; + } + [dir="rtl"] .col-sm-3 { + width: 25%; + } + [dir="rtl"] .col-sm-2 { + width: 16.66666667%; + } + [dir="rtl"] .col-sm-1 { + width: 8.33333333%; + } + [dir="rtl"] .col-sm-pull-12 { + left: 100%; + right: auto; + } + [dir="rtl"] .col-sm-pull-11 { + left: 91.66666667%; + right: auto; + } + [dir="rtl"] .col-sm-pull-10 { + left: 83.33333333%; + right: auto; + } + [dir="rtl"] .col-sm-pull-9 { + left: 75%; + right: auto; + } + [dir="rtl"] .col-sm-pull-8 { + left: 66.66666667%; + right: auto; + } + [dir="rtl"] .col-sm-pull-7 { + left: 58.33333333%; + right: auto; + } + [dir="rtl"] .col-sm-pull-6 { + left: 50%; + right: auto; + } + [dir="rtl"] .col-sm-pull-5 { + left: 41.66666667%; + right: auto; + } + [dir="rtl"] .col-sm-pull-4 { + left: 33.33333333%; + right: auto; + } + [dir="rtl"] .col-sm-pull-3 { + left: 25%; + right: auto; + } + [dir="rtl"] .col-sm-pull-2 { + left: 16.66666667%; + right: auto; + } + [dir="rtl"] .col-sm-pull-1 { + left: 8.33333333%; + right: auto; + } + [dir="rtl"] .col-sm-pull-0 { + left: auto; + right: auto; + } + [dir="rtl"] .col-sm-push-12 { + right: 100%; + left: 0; + } + [dir="rtl"] .col-sm-push-11 { + right: 91.66666667%; + left: 0; + } + [dir="rtl"] .col-sm-push-10 { + right: 83.33333333%; + left: 0; + } + [dir="rtl"] .col-sm-push-9 { + right: 75%; + left: 0; + } + [dir="rtl"] .col-sm-push-8 { + right: 66.66666667%; + left: 0; + } + [dir="rtl"] .col-sm-push-7 { + right: 58.33333333%; + left: 0; + } + [dir="rtl"] .col-sm-push-6 { + right: 50%; + left: 0; + } + [dir="rtl"] .col-sm-push-5 { + right: 41.66666667%; + left: 0; + } + [dir="rtl"] .col-sm-push-4 { + right: 33.33333333%; + left: 0; + } + [dir="rtl"] .col-sm-push-3 { + right: 25%; + left: 0; + } + [dir="rtl"] .col-sm-push-2 { + right: 16.66666667%; + left: 0; + } + [dir="rtl"] .col-sm-push-1 { + right: 8.33333333%; + left: 0; + } + [dir="rtl"] .col-sm-push-0 { + right: auto; + left: 0; + } + [dir="rtl"] .col-sm-offset-12 { + margin-right: 100%; + margin-left: 0; + } + [dir="rtl"] .col-sm-offset-11 { + margin-right: 91.66666667%; + margin-left: 0; + } + [dir="rtl"] .col-sm-offset-10 { + margin-right: 83.33333333%; + margin-left: 0; + } + [dir="rtl"] .col-sm-offset-9 { + margin-right: 75%; + margin-left: 0; + } + [dir="rtl"] .col-sm-offset-8 { + margin-right: 66.66666667%; + margin-left: 0; + } + [dir="rtl"] .col-sm-offset-7 { + margin-right: 58.33333333%; + margin-left: 0; + } + [dir="rtl"] .col-sm-offset-6 { + margin-right: 50%; + margin-left: 0; + } + [dir="rtl"] .col-sm-offset-5 { + margin-right: 41.66666667%; + margin-left: 0; + } + [dir="rtl"] .col-sm-offset-4 { + margin-right: 33.33333333%; + margin-left: 0; + } + [dir="rtl"] .col-sm-offset-3 { + margin-right: 25%; + margin-left: 0; + } + [dir="rtl"] .col-sm-offset-2 { + margin-right: 16.66666667%; + margin-left: 0; + } + [dir="rtl"] .col-sm-offset-1 { + margin-right: 8.33333333%; + margin-left: 0; + } + [dir="rtl"] .col-sm-offset-0 { + margin-right: 0%; + margin-left: 0; + } +} +@media (min-width: 992px) { + [dir="rtl"] .col-md-1, + [dir="rtl"] [dir="rtl"] .col-md-2, + [dir="rtl"] [dir="rtl"] .col-md-3, + [dir="rtl"] [dir="rtl"] .col-md-4, + [dir="rtl"] [dir="rtl"] .col-md-5, + [dir="rtl"] [dir="rtl"] .col-md-6, + [dir="rtl"] [dir="rtl"] .col-md-7, + [dir="rtl"] [dir="rtl"] .col-md-8, + [dir="rtl"] [dir="rtl"] .col-md-9, + [dir="rtl"] [dir="rtl"] .col-md-10, + [dir="rtl"] [dir="rtl"] .col-md-11, + [dir="rtl"] [dir="rtl"] .col-md-12 { + float: right; + } + [dir="rtl"] .col-md-1, + [dir="rtl"] .col-md-2, + [dir="rtl"] .col-md-3, + [dir="rtl"] .col-md-4, + [dir="rtl"] .col-md-5, + [dir="rtl"] .col-md-6, + [dir="rtl"] .col-md-7, + [dir="rtl"] .col-md-8, + [dir="rtl"] .col-md-9, + [dir="rtl"] .col-md-10, + [dir="rtl"] .col-md-11, + [dir="rtl"] .col-md-12 { + float: right; + } + [dir="rtl"] .col-md-12 { + width: 100%; + } + [dir="rtl"] .col-md-11 { + width: 91.66666667%; + } + [dir="rtl"] .col-md-10 { + width: 83.33333333%; + } + [dir="rtl"] .col-md-9 { + width: 75%; + } + [dir="rtl"] .col-md-8 { + width: 66.66666667%; + } + [dir="rtl"] .col-md-7 { + width: 58.33333333%; + } + [dir="rtl"] .col-md-6 { + width: 50%; + } + [dir="rtl"] .col-md-5 { + width: 41.66666667%; + } + [dir="rtl"] .col-md-4 { + width: 33.33333333%; + } + [dir="rtl"] .col-md-3 { + width: 25%; + } + [dir="rtl"] .col-md-2 { + width: 16.66666667%; + } + [dir="rtl"] .col-md-1 { + width: 8.33333333%; + } + [dir="rtl"] .col-md-pull-12 { + left: 100%; + right: auto; + } + [dir="rtl"] .col-md-pull-11 { + left: 91.66666667%; + right: auto; + } + [dir="rtl"] .col-md-pull-10 { + left: 83.33333333%; + right: auto; + } + [dir="rtl"] .col-md-pull-9 { + left: 75%; + right: auto; + } + [dir="rtl"] .col-md-pull-8 { + left: 66.66666667%; + right: auto; + } + [dir="rtl"] .col-md-pull-7 { + left: 58.33333333%; + right: auto; + } + [dir="rtl"] .col-md-pull-6 { + left: 50%; + right: auto; + } + [dir="rtl"] .col-md-pull-5 { + left: 41.66666667%; + right: auto; + } + [dir="rtl"] .col-md-pull-4 { + left: 33.33333333%; + right: auto; + } + [dir="rtl"] .col-md-pull-3 { + left: 25%; + right: auto; + } + [dir="rtl"] .col-md-pull-2 { + left: 16.66666667%; + right: auto; + } + [dir="rtl"] .col-md-pull-1 { + left: 8.33333333%; + right: auto; + } + [dir="rtl"] .col-md-pull-0 { + left: auto; + right: auto; + } + [dir="rtl"] .col-md-push-12 { + right: 100%; + left: 0; + } + [dir="rtl"] .col-md-push-11 { + right: 91.66666667%; + left: 0; + } + [dir="rtl"] .col-md-push-10 { + right: 83.33333333%; + left: 0; + } + [dir="rtl"] .col-md-push-9 { + right: 75%; + left: 0; + } + [dir="rtl"] .col-md-push-8 { + right: 66.66666667%; + left: 0; + } + [dir="rtl"] .col-md-push-7 { + right: 58.33333333%; + left: 0; + } + [dir="rtl"] .col-md-push-6 { + right: 50%; + left: 0; + } + [dir="rtl"] .col-md-push-5 { + right: 41.66666667%; + left: 0; + } + [dir="rtl"] .col-md-push-4 { + right: 33.33333333%; + left: 0; + } + [dir="rtl"] .col-md-push-3 { + right: 25%; + left: 0; + } + [dir="rtl"] .col-md-push-2 { + right: 16.66666667%; + left: 0; + } + [dir="rtl"] .col-md-push-1 { + right: 8.33333333%; + left: 0; + } + [dir="rtl"] .col-md-push-0 { + right: auto; + left: 0; + } + [dir="rtl"] .col-md-offset-12 { + margin-right: 100%; + margin-left: 0; + } + [dir="rtl"] .col-md-offset-11 { + margin-right: 91.66666667%; + margin-left: 0; + } + [dir="rtl"] .col-md-offset-10 { + margin-right: 83.33333333%; + margin-left: 0; + } + [dir="rtl"] .col-md-offset-9 { + margin-right: 75%; + margin-left: 0; + } + [dir="rtl"] .col-md-offset-8 { + margin-right: 66.66666667%; + margin-left: 0; + } + [dir="rtl"] .col-md-offset-7 { + margin-right: 58.33333333%; + margin-left: 0; + } + [dir="rtl"] .col-md-offset-6 { + margin-right: 50%; + margin-left: 0; + } + [dir="rtl"] .col-md-offset-5 { + margin-right: 41.66666667%; + margin-left: 0; + } + [dir="rtl"] .col-md-offset-4 { + margin-right: 33.33333333%; + margin-left: 0; + } + [dir="rtl"] .col-md-offset-3 { + margin-right: 25%; + margin-left: 0; + } + [dir="rtl"] .col-md-offset-2 { + margin-right: 16.66666667%; + margin-left: 0; + } + [dir="rtl"] .col-md-offset-1 { + margin-right: 8.33333333%; + margin-left: 0; + } + [dir="rtl"] .col-md-offset-0 { + margin-right: 0%; + margin-left: 0; + } +} +@media (min-width: 1200px) { + [dir="rtl"] .col-lg-1, + [dir="rtl"] [dir="rtl"] .col-lg-2, + [dir="rtl"] [dir="rtl"] .col-lg-3, + [dir="rtl"] [dir="rtl"] .col-lg-4, + [dir="rtl"] [dir="rtl"] .col-lg-5, + [dir="rtl"] [dir="rtl"] .col-lg-6, + [dir="rtl"] [dir="rtl"] .col-lg-7, + [dir="rtl"] [dir="rtl"] .col-lg-8, + [dir="rtl"] [dir="rtl"] .col-lg-9, + [dir="rtl"] [dir="rtl"] .col-lg-10, + [dir="rtl"] [dir="rtl"] .col-lg-11, + [dir="rtl"] [dir="rtl"] .col-lg-12 { + float: right; + } + [dir="rtl"] .col-lg-1, + [dir="rtl"] .col-lg-2, + [dir="rtl"] .col-lg-3, + [dir="rtl"] .col-lg-4, + [dir="rtl"] .col-lg-5, + [dir="rtl"] .col-lg-6, + [dir="rtl"] .col-lg-7, + [dir="rtl"] .col-lg-8, + [dir="rtl"] .col-lg-9, + [dir="rtl"] .col-lg-10, + [dir="rtl"] .col-lg-11, + [dir="rtl"] .col-lg-12 { + float: right; + } + [dir="rtl"] .col-lg-12 { + width: 100%; + } + [dir="rtl"] .col-lg-11 { + width: 91.66666667%; + } + [dir="rtl"] .col-lg-10 { + width: 83.33333333%; + } + [dir="rtl"] .col-lg-9 { + width: 75%; + } + [dir="rtl"] .col-lg-8 { + width: 66.66666667%; + } + [dir="rtl"] .col-lg-7 { + width: 58.33333333%; + } + [dir="rtl"] .col-lg-6 { + width: 50%; + } + [dir="rtl"] .col-lg-5 { + width: 41.66666667%; + } + [dir="rtl"] .col-lg-4 { + width: 33.33333333%; + } + [dir="rtl"] .col-lg-3 { + width: 25%; + } + [dir="rtl"] .col-lg-2 { + width: 16.66666667%; + } + [dir="rtl"] .col-lg-1 { + width: 8.33333333%; + } + [dir="rtl"] .col-lg-pull-12 { + left: 100%; + right: auto; + } + [dir="rtl"] .col-lg-pull-11 { + left: 91.66666667%; + right: auto; + } + [dir="rtl"] .col-lg-pull-10 { + left: 83.33333333%; + right: auto; + } + [dir="rtl"] .col-lg-pull-9 { + left: 75%; + right: auto; + } + [dir="rtl"] .col-lg-pull-8 { + left: 66.66666667%; + right: auto; + } + [dir="rtl"] .col-lg-pull-7 { + left: 58.33333333%; + right: auto; + } + [dir="rtl"] .col-lg-pull-6 { + left: 50%; + right: auto; + } + [dir="rtl"] .col-lg-pull-5 { + left: 41.66666667%; + right: auto; + } + [dir="rtl"] .col-lg-pull-4 { + left: 33.33333333%; + right: auto; + } + [dir="rtl"] .col-lg-pull-3 { + left: 25%; + right: auto; + } + [dir="rtl"] .col-lg-pull-2 { + left: 16.66666667%; + right: auto; + } + [dir="rtl"] .col-lg-pull-1 { + left: 8.33333333%; + right: auto; + } + [dir="rtl"] .col-lg-pull-0 { + left: auto; + right: auto; + } + [dir="rtl"] .col-lg-push-12 { + right: 100%; + left: 0; + } + [dir="rtl"] .col-lg-push-11 { + right: 91.66666667%; + left: 0; + } + [dir="rtl"] .col-lg-push-10 { + right: 83.33333333%; + left: 0; + } + [dir="rtl"] .col-lg-push-9 { + right: 75%; + left: 0; + } + [dir="rtl"] .col-lg-push-8 { + right: 66.66666667%; + left: 0; + } + [dir="rtl"] .col-lg-push-7 { + right: 58.33333333%; + left: 0; + } + [dir="rtl"] .col-lg-push-6 { + right: 50%; + left: 0; + } + [dir="rtl"] .col-lg-push-5 { + right: 41.66666667%; + left: 0; + } + [dir="rtl"] .col-lg-push-4 { + right: 33.33333333%; + left: 0; + } + [dir="rtl"] .col-lg-push-3 { + right: 25%; + left: 0; + } + [dir="rtl"] .col-lg-push-2 { + right: 16.66666667%; + left: 0; + } + [dir="rtl"] .col-lg-push-1 { + right: 8.33333333%; + left: 0; + } + [dir="rtl"] .col-lg-push-0 { + right: auto; + left: 0; + } + [dir="rtl"] .col-lg-offset-12 { + margin-right: 100%; + margin-left: 0; + } + [dir="rtl"] .col-lg-offset-11 { + margin-right: 91.66666667%; + margin-left: 0; + } + [dir="rtl"] .col-lg-offset-10 { + margin-right: 83.33333333%; + margin-left: 0; + } + [dir="rtl"] .col-lg-offset-9 { + margin-right: 75%; + margin-left: 0; + } + [dir="rtl"] .col-lg-offset-8 { + margin-right: 66.66666667%; + margin-left: 0; + } + [dir="rtl"] .col-lg-offset-7 { + margin-right: 58.33333333%; + margin-left: 0; + } + [dir="rtl"] .col-lg-offset-6 { + margin-right: 50%; + margin-left: 0; + } + [dir="rtl"] .col-lg-offset-5 { + margin-right: 41.66666667%; + margin-left: 0; + } + [dir="rtl"] .col-lg-offset-4 { + margin-right: 33.33333333%; + margin-left: 0; + } + [dir="rtl"] .col-lg-offset-3 { + margin-right: 25%; + margin-left: 0; + } + [dir="rtl"] .col-lg-offset-2 { + margin-right: 16.66666667%; + margin-left: 0; + } + [dir="rtl"] .col-lg-offset-1 { + margin-right: 8.33333333%; + margin-left: 0; + } + [dir="rtl"] .col-lg-offset-0 { + margin-right: 0%; + margin-left: 0; + } +} +[dir="rtl"] caption { + text-align: right; +} +[dir="rtl"] th { + text-align: right; +} +@media screen and (max-width: 767px) { + [dir="rtl"] .table-responsive > .table-bordered { + border: 0; + } + [dir="rtl"] .table-responsive > .table-bordered > thead > tr > th:first-child, + [dir="rtl"] .table-responsive > .table-bordered > tbody > tr > th:first-child, + [dir="rtl"] .table-responsive > .table-bordered > tfoot > tr > th:first-child, + [dir="rtl"] .table-responsive > .table-bordered > thead > tr > td:first-child, + [dir="rtl"] .table-responsive > .table-bordered > tbody > tr > td:first-child, + [dir="rtl"] .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-right: 0; + border-left: initial; + } + [dir="rtl"] .table-responsive > .table-bordered > thead > tr > th:last-child, + [dir="rtl"] .table-responsive > .table-bordered > tbody > tr > th:last-child, + [dir="rtl"] .table-responsive > .table-bordered > tfoot > tr > th:last-child, + [dir="rtl"] .table-responsive > .table-bordered > thead > tr > td:last-child, + [dir="rtl"] .table-responsive > .table-bordered > tbody > tr > td:last-child, + [dir="rtl"] .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-left: 0; + border-right: initial; + } +} +[dir="rtl"] .radio label, +[dir="rtl"] .checkbox label { + padding-right: 20px; + padding-left: initial; +} +[dir="rtl"] .radio input[type="radio"], +[dir="rtl"] .radio-inline input[type="radio"], +[dir="rtl"] .checkbox input[type="checkbox"], +[dir="rtl"] .checkbox-inline input[type="checkbox"] { + margin-right: -20px; + margin-left: auto; +} +[dir="rtl"] .radio-inline, +[dir="rtl"] .checkbox-inline { + padding-right: 20px; + padding-left: 0; +} +[dir="rtl"] .radio-inline + .radio-inline, +[dir="rtl"] .checkbox-inline + .checkbox-inline { + margin-right: 10px; + margin-left: 0; +} +[dir="rtl"] .has-feedback .form-control { + padding-left: 42.5px; + padding-right: 12px; +} +[dir="rtl"] .form-control-feedback { + left: 0; + right: auto; +} +@media (min-width: 768px) { + [dir="rtl"] .form-inline label { + padding-right: 0; + padding-left: initial; + } + [dir="rtl"] .form-inline .radio input[type="radio"], + [dir="rtl"] .form-inline .checkbox input[type="checkbox"] { + margin-right: 0; + margin-left: auto; + } +} +@media (min-width: 768px) { + [dir="rtl"] .form-horizontal .control-label { + text-align: left; + } +} +[dir="rtl"] .form-horizontal .has-feedback .form-control-feedback { + left: 15px; + right: auto; +} +[dir="rtl"] .caret { + margin-right: 2px; + margin-left: 0; +} +[dir="rtl"] .dropdown-menu { + right: 0; + left: auto; + float: left; + text-align: right; +} +[dir="rtl"] .dropdown-menu.pull-right { + left: 0; + right: auto; + float: right; +} +[dir="rtl"] .dropdown-menu-right { + left: auto; + right: 0; +} +[dir="rtl"] .dropdown-menu-left { + left: 0; + right: auto; +} +@media (min-width: 768px) { + [dir="rtl"] .navbar-right .dropdown-menu { + left: auto; + right: 0; + } + [dir="rtl"] .navbar-right .dropdown-menu-left { + left: 0; + right: auto; + } +} +[dir="rtl"] .btn-group > .btn, +[dir="rtl"] .btn-group-vertical > .btn { + float: right; +} +[dir="rtl"] .btn-group .btn + .btn, +[dir="rtl"] .btn-group .btn + .btn-group, +[dir="rtl"] .btn-group .btn-group + .btn, +[dir="rtl"] .btn-group .btn-group + .btn-group { + margin-right: -1px; + margin-left: 0px; +} +[dir="rtl"] .btn-toolbar { + margin-right: -5px; + margin-left: 0px; +} +[dir="rtl"] .btn-toolbar .btn-group, +[dir="rtl"] .btn-toolbar .input-group { + float: right; +} +[dir="rtl"] .btn-toolbar > .btn, +[dir="rtl"] .btn-toolbar > .btn-group, +[dir="rtl"] .btn-toolbar > .input-group { + margin-right: 5px; + margin-left: 0px; +} +[dir="rtl"] .btn-group > .btn:first-child { + margin-right: 0; +} +[dir="rtl"] .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +[dir="rtl"] .btn-group > .btn:last-child:not(:first-child), +[dir="rtl"] .btn-group > .dropdown-toggle:not(:first-child) { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +[dir="rtl"] .btn-group > .btn-group { + float: right; +} +[dir="rtl"] .btn-group.btn-group-justified > .btn, +[dir="rtl"] .btn-group.btn-group-justified > .btn-group { + float: none; +} +[dir="rtl"] .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +[dir="rtl"] .btn-group > .btn-group:first-child > .btn:last-child, +[dir="rtl"] .btn-group > .btn-group:first-child > .dropdown-toggle { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +[dir="rtl"] .btn-group > .btn-group:last-child > .btn:first-child { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +[dir="rtl"] .btn .caret { + margin-right: 0; +} +[dir="rtl"] .btn-group-vertical > .btn + .btn, +[dir="rtl"] .btn-group-vertical > .btn + .btn-group, +[dir="rtl"] .btn-group-vertical > .btn-group + .btn, +[dir="rtl"] .btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-right: 0; +} +[dir="rtl"] .input-group .form-control { + float: right; +} +[dir="rtl"] .input-group .form-control:first-child, +[dir="rtl"] .input-group-addon:first-child, +[dir="rtl"] .input-group-btn:first-child > .btn, +[dir="rtl"] .input-group-btn:first-child > .btn-group > .btn, +[dir="rtl"] .input-group-btn:first-child > .dropdown-toggle, +[dir="rtl"] .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +[dir="rtl"] .input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +[dir="rtl"] .input-group-addon:first-child { + border-left: 0px; + border-right: 1px solid; +} +[dir="rtl"] .input-group .form-control:last-child, +[dir="rtl"] .input-group-addon:last-child, +[dir="rtl"] .input-group-btn:last-child > .btn, +[dir="rtl"] .input-group-btn:last-child > .btn-group > .btn, +[dir="rtl"] .input-group-btn:last-child > .dropdown-toggle, +[dir="rtl"] .input-group-btn:first-child > .btn:not(:first-child), +[dir="rtl"] .input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +[dir="rtl"] .input-group-addon:last-child { + border-left-width: 1px; + border-left-style: solid; + border-right: 0px; +} +[dir="rtl"] .input-group-btn > .btn + .btn { + margin-right: -1px; + margin-left: auto; +} +[dir="rtl"] .input-group-btn:first-child > .btn, +[dir="rtl"] .input-group-btn:first-child > .btn-group { + margin-left: -1px; + margin-right: auto; +} +[dir="rtl"] .input-group-btn:last-child > .btn, +[dir="rtl"] .input-group-btn:last-child > .btn-group { + margin-right: -1px; + margin-left: auto; +} +[dir="rtl"] .nav { + padding-right: 0; + padding-left: initial; +} +[dir="rtl"] .nav-tabs > li { + float: right; +} +[dir="rtl"] .nav-tabs > li > a { + margin-left: auto; + margin-right: -2px; + border-radius: 4px 4px 0 0; +} +[dir="rtl"] .nav-pills > li { + float: right; +} +[dir="rtl"] .nav-pills > li > a { + border-radius: 4px; +} +[dir="rtl"] .nav-pills > li + li { + margin-right: 2px; + margin-left: auto; +} +[dir="rtl"] .nav-stacked > li { + float: none; +} +[dir="rtl"] .nav-stacked > li + li { + margin-right: 0; + margin-left: auto; +} +[dir="rtl"] .nav-justified > .dropdown .dropdown-menu { + right: auto; +} +[dir="rtl"] .nav-tabs-justified > li > a { + margin-left: 0; + margin-right: auto; +} +@media (min-width: 768px) { + [dir="rtl"] .nav-tabs-justified > li > a { + border-radius: 4px 4px 0 0; + } +} +@media (min-width: 768px) { + [dir="rtl"] .navbar-header { + float: right; + } +} +[dir="rtl"] .navbar-collapse { + padding-right: 15px; + padding-left: 15px; +} +[dir="rtl"] .navbar-brand { + float: right; +} +@media (min-width: 768px) { + .navbar > .container [dir="rtl"] .navbar-brand, + .navbar > .container-fluid [dir="rtl"] .navbar-brand { + margin-right: -15px; + margin-left: auto; + } +} +[dir="rtl"] .navbar-toggle { + float: left; + margin-left: 15px; + margin-right: auto; +} +@media (max-width: 767px) { + [dir="rtl"] .navbar-nav .open .dropdown-menu > li > a, + [dir="rtl"] .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 25px 5px 15px; + } +} +@media (min-width: 768px) { + [dir="rtl"] .navbar-nav { + float: right; + } + [dir="rtl"] .navbar-nav > li { + float: right; + } +} +@media (min-width: 768px) { + [dir="rtl"] .navbar-left.flip { + float: right !important; + } + [dir="rtl"] .navbar-right:last-child { + margin-left: -15px; + margin-right: auto; + } + [dir="rtl"] .navbar-right.flip { + float: left !important; + margin-left: -15px; + margin-right: auto; + } + [dir="rtl"] .navbar-right .dropdown-menu { + left: 0; + right: auto; + } +} +@media (min-width: 768px) { + [dir="rtl"] .navbar-text { + float: right; + } + [dir="rtl"] .navbar-text.navbar-right:last-child { + margin-left: 0; + margin-right: auto; + } +} +[dir="rtl"] .pagination { + padding-right: 0; +} +[dir="rtl"] .pagination > li > a, +[dir="rtl"] .pagination > li > span { + float: right; + margin-right: -1px; + margin-left: 0px; +} +[dir="rtl"] .pagination > li:first-child > a, +[dir="rtl"] .pagination > li:first-child > span { + margin-left: 0; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +[dir="rtl"] .pagination > li:last-child > a, +[dir="rtl"] .pagination > li:last-child > span { + margin-right: -1px; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +[dir="rtl"] .pager { + padding-right: 0; + padding-left: initial; +} +[dir="rtl"] .pager .next > a, +[dir="rtl"] .pager .next > span { + float: left; +} +[dir="rtl"] .pager .previous > a, +[dir="rtl"] .pager .previous > span { + float: right; +} +.nav-pills > li > a > [dir="rtl"] .badge { + margin-left: 0px; + margin-right: 3px; +} +.list-group-item > [dir="rtl"] .badge { + float: left; +} +.list-group-item > [dir="rtl"] .badge + [dir="rtl"] .badge { + margin-left: 5px; + margin-right: auto; +} +[dir="rtl"] .alert-dismissable, +[dir="rtl"] .alert-dismissible { + padding-left: 35px; + padding-right: 15px; +} +[dir="rtl"] .alert-dismissable .close, +[dir="rtl"] .alert-dismissible .close { + right: auto; + left: -21px; +} +[dir="rtl"] .progress-bar { + float: right; +} +[dir="rtl"] .media > .pull-left { + margin-right: 10px; +} +[dir="rtl"] .media > .pull-left.flip { + margin-right: 0; + margin-left: 10px; +} +[dir="rtl"] .media > .pull-right { + margin-left: 10px; +} +[dir="rtl"] .media > .pull-right.flip { + margin-left: 0; + margin-right: 10px; +} +[dir="rtl"] .media-right, +[dir="rtl"] .media > .pull-right { + padding-right: 10px; + padding-left: initial; +} +[dir="rtl"] .media-left, +[dir="rtl"] .media > .pull-left { + padding-left: 10px; + padding-right: initial; +} +[dir="rtl"] .media-list { + padding-right: 0; + padding-left: initial; + list-style: none; +} +[dir="rtl"] .list-group { + padding-right: 0; + padding-left: initial; +} +[dir="rtl"] .panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +[dir="rtl"] .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +[dir="rtl"] .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +[dir="rtl"] .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +[dir="rtl"] .panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +[dir="rtl"] .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +[dir="rtl"] .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +[dir="rtl"] .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-right-radius: 3px; + border-top-left-radius: 0; +} +[dir="rtl"] .panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +[dir="rtl"] .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +[dir="rtl"] .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +[dir="rtl"] .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +[dir="rtl"] .panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +[dir="rtl"] .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +[dir="rtl"] .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +[dir="rtl"] .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-left-radius: 3px; + border-top-right-radius: 0; +} +[dir="rtl"] .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +[dir="rtl"] .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +[dir="rtl"] .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +[dir="rtl"] .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +[dir="rtl"] .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +[dir="rtl"] .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +[dir="rtl"] .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +[dir="rtl"] .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; + border-top-right-radius: 0; +} +[dir="rtl"] .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +[dir="rtl"] .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +[dir="rtl"] .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +[dir="rtl"] .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +[dir="rtl"] .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +[dir="rtl"] .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +[dir="rtl"] .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +[dir="rtl"] .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; + border-top-left-radius: 0; +} +[dir="rtl"] .panel > .table-bordered > thead > tr > th:first-child, +[dir="rtl"] .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +[dir="rtl"] .panel > .table-bordered > tbody > tr > th:first-child, +[dir="rtl"] .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +[dir="rtl"] .panel > .table-bordered > tfoot > tr > th:first-child, +[dir="rtl"] .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +[dir="rtl"] .panel > .table-bordered > thead > tr > td:first-child, +[dir="rtl"] .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +[dir="rtl"] .panel > .table-bordered > tbody > tr > td:first-child, +[dir="rtl"] .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +[dir="rtl"] .panel > .table-bordered > tfoot > tr > td:first-child, +[dir="rtl"] .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-right: 0; + border-left: none; +} +[dir="rtl"] .panel > .table-bordered > thead > tr > th:last-child, +[dir="rtl"] .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +[dir="rtl"] .panel > .table-bordered > tbody > tr > th:last-child, +[dir="rtl"] .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +[dir="rtl"] .panel > .table-bordered > tfoot > tr > th:last-child, +[dir="rtl"] .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +[dir="rtl"] .panel > .table-bordered > thead > tr > td:last-child, +[dir="rtl"] .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +[dir="rtl"] .panel > .table-bordered > tbody > tr > td:last-child, +[dir="rtl"] .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +[dir="rtl"] .panel > .table-bordered > tfoot > tr > td:last-child, +[dir="rtl"] .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: none; + border-left: 0; +} +[dir="rtl"] .embed-responsive .embed-responsive-item, +[dir="rtl"] .embed-responsive iframe, +[dir="rtl"] .embed-responsive embed, +[dir="rtl"] .embed-responsive object { + right: 0; + left: auto; +} +[dir="rtl"] .close { + float: left; +} +[dir="rtl"] .modal-footer { + text-align: left; +} +[dir="rtl"] .modal-footer.flip { + text-align: right; +} +[dir="rtl"] .modal-footer .btn + .btn { + margin-left: auto; + margin-right: 5px; +} +[dir="rtl"] .modal-footer .btn-group .btn + .btn { + margin-right: -1px; + margin-left: auto; +} +[dir="rtl"] .modal-footer .btn-block + .btn-block { + margin-right: 0; + margin-left: auto; +} +[dir="rtl"] .popover { + left: auto; + text-align: right; +} +[dir="rtl"] .popover.top > .arrow { + right: 50%; + left: auto; + margin-right: -11px; + margin-left: auto; +} +[dir="rtl"] .popover.top > .arrow:after { + margin-right: -10px; + margin-left: auto; +} +[dir="rtl"] .popover.bottom > .arrow { + right: 50%; + left: auto; + margin-right: -11px; + margin-left: auto; +} +[dir="rtl"] .popover.bottom > .arrow:after { + margin-right: -10px; + margin-left: auto; +} +[dir="rtl"] .carousel-control { + right: 0; + bottom: 0; +} +[dir="rtl"] .carousel-control.left { + right: auto; + left: 0; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0%), color-stop(rgba(0, 0, 0, 0.0001) 100%)); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); +} +[dir="rtl"] .carousel-control.right { + left: auto; + right: 0; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0%), color-stop(rgba(0, 0, 0, 0.5) 100%)); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); +} +[dir="rtl"] .carousel-control .icon-prev, +[dir="rtl"] .carousel-control .glyphicon-chevron-left { + left: 50%; + right: auto; + margin-right: -10px; +} +[dir="rtl"] .carousel-control .icon-next, +[dir="rtl"] .carousel-control .glyphicon-chevron-right { + right: 50%; + left: auto; + margin-left: -10px; +} +[dir="rtl"] .carousel-indicators { + right: 50%; + left: 0; + margin-right: -30%; + margin-left: 0; + padding-left: 0; +} +@media screen and (min-width: 768px) { + [dir="rtl"] .carousel-control .glyphicon-chevron-left, + [dir="rtl"] .carousel-control .icon-prev { + margin-left: 0; + margin-right: -15px; + } + [dir="rtl"] .carousel-control .glyphicon-chevron-right, + [dir="rtl"] .carousel-control .icon-next { + margin-left: 0; + margin-right: -15px; + } + [dir="rtl"] .carousel-caption { + left: 20%; + right: 20%; + padding-bottom: 30px; + } +} +[dir="rtl"] .pull-right.flip { + float: left !important; +} +[dir="rtl"] .pull-left.flip { + float: right !important; +} +/* This file is part of Tryton. The COPYRIGHT file at the top level of + this repository contains the full copyright notices and license terms. */ +html { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +html[theme="default"] { + /* This file is part of Tryton. The COPYRIGHT file at the top level of + this repository contains the full copyright notices and license terms. */ + /* The MIT License (MIT) +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. +*/ +} +html[theme="default"] .navbar { + border: none; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); +} +html[theme="default"] .btn-default:focus, +html[theme="default"] .btn-default:hover, +html[theme="default"] .btn-default:active:hover { + background-color: #f0f0f0; +} +html[theme="default"] .btn-default:active { + background-color: #e0e0e0; + background-image: -webkit-radial-gradient(circle, #e0e0e0 10%, #fff 11%); + background-image: radial-gradient(circle, #e0e0e0 10%, #fff 11%); + background-repeat: no-repeat; + background-size: 1000% 1000%; + -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); + box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); +} +html[theme="default"] .btn-primary:focus, +html[theme="default"] .btn-primary:hover, +html[theme="default"] .btn-primary:active:hover { + background-color: #f59f86; +} +html[theme="default"] .btn-primary:active { + background-color: #487b50; + background-image: -webkit-radial-gradient(circle, #1f1a17 10%, #acd5e3 11%); + background-image: radial-gradient(circle, #1f1a17 10%, #acd5e3 11%); + background-repeat: no-repeat; + background-size: 1000% 1000%; + -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); + box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); +} +html[theme="default"] .btn-success:focus, +html[theme="default"] .btn-success:hover, +html[theme="default"] .btn-success:active:hover { + background-color: #2b9547; +} +html[theme="default"] .btn-success:active { + background-color: #247e3b; + background-image: -webkit-radial-gradient(circle, #247e3b 10%, #32ad52 11%); + background-image: radial-gradient(circle, #247e3b 10%, #32ad52 11%); + background-repeat: no-repeat; + background-size: 1000% 1000%; + -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); + box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); +} +html[theme="default"] .btn-info:focus, +html[theme="default"] .btn-info:hover, +html[theme="default"] .btn-info:active:hover { + background-color: #5cb3b8; +} +html[theme="default"] .btn-info:active { + background-color: #4aa6aa; + background-image: -webkit-radial-gradient(circle, #4aa6aa 10%, #71bdc1 11%); + background-image: radial-gradient(circle, #4aa6aa 10%, #71bdc1 11%); + background-repeat: no-repeat; + background-size: 1000% 1000%; + -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); + box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); +} +html[theme="default"] .btn-warning:focus, +html[theme="default"] .btn-warning:hover, +html[theme="default"] .btn-warning:active:hover { + background-color: #e47e27; +} +html[theme="default"] .btn-warning:active { + background-color: #d16f1b; + background-image: -webkit-radial-gradient(circle, #d16f1b 10%, #e78e42 11%); + background-image: radial-gradient(circle, #d16f1b 10%, #e78e42 11%); + background-repeat: no-repeat; + background-size: 1000% 1000%; + -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); + box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); +} +html[theme="default"] .btn-danger:focus, +html[theme="default"] .btn-danger:hover, +html[theme="default"] .btn-danger:active:hover { + background-color: #e42e27; +} +html[theme="default"] .btn-danger:active { + background-color: #d1211b; + background-image: -webkit-radial-gradient(circle, #d1211b 10%, #e74842 11%); + background-image: radial-gradient(circle, #d1211b 10%, #e74842 11%); + background-repeat: no-repeat; + background-size: 1000% 1000%; + -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); + box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); +} +html[theme="default"] .btn-link:focus, +html[theme="default"] .btn-link:hover, +html[theme="default"] .btn-link:active:hover { + background-color: #f0f0f0; +} +html[theme="default"] .btn-link:active { + background-color: #e0e0e0; + background-image: -webkit-radial-gradient(circle, #e0e0e0 10%, #fff 11%); + background-image: radial-gradient(circle, #e0e0e0 10%, #fff 11%); + background-repeat: no-repeat; + background-size: 1000% 1000%; + -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); + box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); +} +html[theme="default"] .btn { + text-transform: uppercase; + border: none; + -webkit-box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.4); + box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.4); + -webkit-transition: all 0.4s; + -o-transition: all 0.4s; + transition: all 0.4s; +} +html[theme="default"] .btn-link { + border-radius: 4px; + -webkit-box-shadow: none; + box-shadow: none; + color: #333; +} +html[theme="default"] .btn-link:hover, +html[theme="default"] .btn-link:focus { + -webkit-box-shadow: none; + box-shadow: none; + color: #333; + text-decoration: none; +} +html[theme="default"] .btn-default.disabled { + background-color: rgba(0, 0, 0, 0.1); + color: rgba(0, 0, 0, 0.4); + opacity: 1; +} +html[theme="default"] .table-hover > tbody > tr, +html[theme="default"] .table-hover > tbody > tr > th, +html[theme="default"] .table-hover > tbody > tr > td { + -webkit-transition: all 0.2s; + -o-transition: all 0.2s; + transition: all 0.2s; +} +html[theme="default"] .form-control { + border: transparent; +} +html[theme="default"] .form-control[disabled], +html[theme="default"] .form-control[readonly], +fieldset[disabled] html[theme="default"] .form-control { + background-color: transparent; +} +html[theme="default"] textarea, +html[theme="default"] textarea.form-control, +html[theme="default"] input.form-control, +html[theme="default"] input[type=text], +html[theme="default"] input[type=password], +html[theme="default"] input[type=email], +html[theme="default"] input[type=number], +html[theme="default"] [type=text].form-control, +html[theme="default"] [type=password].form-control, +html[theme="default"] [type=email].form-control, +html[theme="default"] [type=tel].form-control, +html[theme="default"] [contenteditable].form-control { + padding: 0 5px; + border: none; + -webkit-appearance: none; + -webkit-box-shadow: inset 0 -1px 0 #ddd; + box-shadow: inset 0 -1px 0 #ddd; +} +html[theme="default"] textarea:focus, +html[theme="default"] textarea.form-control:focus, +html[theme="default"] input.form-control:focus, +html[theme="default"] input[type=text]:focus, +html[theme="default"] input[type=password]:focus, +html[theme="default"] input[type=email]:focus, +html[theme="default"] input[type=number]:focus, +html[theme="default"] [type=text].form-control:focus, +html[theme="default"] [type=password].form-control:focus, +html[theme="default"] [type=email].form-control:focus, +html[theme="default"] [type=tel].form-control:focus, +html[theme="default"] [contenteditable].form-control:focus { + -webkit-box-shadow: inset 0 -2px 0 #acd5e3; + box-shadow: inset 0 -2px 0 #acd5e3; +} +html[theme="default"] textarea[disabled], +html[theme="default"] textarea.form-control[disabled], +html[theme="default"] input.form-control[disabled], +html[theme="default"] input[type=text][disabled], +html[theme="default"] input[type=password][disabled], +html[theme="default"] input[type=email][disabled], +html[theme="default"] input[type=number][disabled], +html[theme="default"] [type=text].form-control[disabled], +html[theme="default"] [type=password].form-control[disabled], +html[theme="default"] [type=email].form-control[disabled], +html[theme="default"] [type=tel].form-control[disabled], +html[theme="default"] [contenteditable].form-control[disabled], +html[theme="default"] textarea[readonly], +html[theme="default"] textarea.form-control[readonly], +html[theme="default"] input.form-control[readonly], +html[theme="default"] input[type=text][readonly], +html[theme="default"] input[type=password][readonly], +html[theme="default"] input[type=email][readonly], +html[theme="default"] input[type=number][readonly], +html[theme="default"] [type=text].form-control[readonly], +html[theme="default"] [type=password].form-control[readonly], +html[theme="default"] [type=email].form-control[readonly], +html[theme="default"] [type=tel].form-control[readonly], +html[theme="default"] [contenteditable].form-control[readonly] { + -webkit-box-shadow: none; + box-shadow: none; + border-bottom: 2px dotted #ddd; +} +html[theme="default"] textarea.input-sm, +html[theme="default"] textarea.form-control.input-sm, +html[theme="default"] input.form-control.input-sm, +html[theme="default"] input[type=text].input-sm, +html[theme="default"] input[type=password].input-sm, +html[theme="default"] input[type=email].input-sm, +html[theme="default"] input[type=number].input-sm, +html[theme="default"] [type=text].form-control.input-sm, +html[theme="default"] [type=password].form-control.input-sm, +html[theme="default"] [type=email].form-control.input-sm, +html[theme="default"] [type=tel].form-control.input-sm, +html[theme="default"] [contenteditable].form-control.input-sm { + font-size: 14px; +} +html[theme="default"] textarea.input-lg, +html[theme="default"] textarea.form-control.input-lg, +html[theme="default"] input.form-control.input-lg, +html[theme="default"] input[type=text].input-lg, +html[theme="default"] input[type=password].input-lg, +html[theme="default"] input[type=email].input-lg, +html[theme="default"] input[type=number].input-lg, +html[theme="default"] [type=text].form-control.input-lg, +html[theme="default"] [type=password].form-control.input-lg, +html[theme="default"] [type=email].form-control.input-lg, +html[theme="default"] [type=tel].form-control.input-lg, +html[theme="default"] [contenteditable].form-control.input-lg { + font-size: 18px; +} +html[theme="default"] .input-group { + margin-bottom: 2px; +} +html[theme="default"] .input-group-lg > .form-control, +html[theme="default"] .input-group-lg > .input-group-addon { + padding: 0 5px; +} +html[theme="default"] .input-group-sm > .form-control, +html[theme="default"] .input-group-sm > .input-group-addon { + padding: 0 5px; +} +html[theme="default"] .has-feedback .form-control { + padding-right: 42.5px; +} +html[theme="default"] .input-group-addon { + background-color: transparent; + border: transparent; + border-radius: 0; +} +html[theme="default"] .input-group-addon.input-sm { + border-radius: 0; +} +html[theme="default"] .input-group-addon.input-lg { + border-radius: 0; +} +html[theme="default"] select, +html[theme="default"] select.form-control { + border: 0; + border-radius: 0; + border-inline-end: 13px solid transparent; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + padding-left: 0; + padding-right: 0; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAAJ1BMVEVmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmaP/QSjAAAADHRSTlMAAgMJC0uWpKa6wMxMdjkoAAAANUlEQVR4AeXJyQEAERAAsNl7Hf3X6xt0QL6JpZWq30pdvdadme+0PMdzvHm8YThHcT1H7K0BtOMDniZhWOgAAAAASUVORK5CYII=); + background-size: 13px; + background-repeat: no-repeat; + background-position: right center; + -webkit-box-shadow: inset 0 -1px 0 #ddd; + box-shadow: inset 0 -1px 0 #ddd; + font-size: 16px; + line-height: 1.5; +} +html[theme="default"] select::-ms-expand, +html[theme="default"] select.form-control::-ms-expand { + display: none; +} +html[theme="default"] select.input-sm, +html[theme="default"] select.form-control.input-sm { + font-size: 14px; +} +html[theme="default"] select.input-lg, +html[theme="default"] select.form-control.input-lg { + font-size: 18px; +} +html[theme="default"] select:focus, +html[theme="default"] select.form-control:focus { + -webkit-box-shadow: inset 0 -2px 0 #acd5e3; + box-shadow: inset 0 -2px 0 #acd5e3; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAAJ1BMVEUhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISF8S9ewAAAADHRSTlMAAgMJC0uWpKa6wMxMdjkoAAAANUlEQVR4AeXJyQEAERAAsNl7Hf3X6xt0QL6JpZWq30pdvdadme+0PMdzvHm8YThHcT1H7K0BtOMDniZhWOgAAAAASUVORK5CYII=); +} +html[theme="default"] select[multiple], +html[theme="default"] select.form-control[multiple] { + background: none; +} +html[theme="default"] .radio label, +html[theme="default"] .radio-inline label, +html[theme="default"] .checkbox label, +html[theme="default"] .checkbox-inline label { + padding-left: 25px; +} +html[theme="default"] .radio label input, +html[theme="default"] .radio-inline label input, +html[theme="default"] .checkbox label input, +html[theme="default"] .checkbox-inline label input { + margin-right: 4px; +} +html[theme="default"] .radio input[type="radio"], +html[theme="default"] .radio-inline input[type="radio"], +html[theme="default"] .checkbox input[type="radio"], +html[theme="default"] .checkbox-inline input[type="radio"], +html[theme="default"] .radio input[type="checkbox"], +html[theme="default"] .radio-inline input[type="checkbox"], +html[theme="default"] .checkbox input[type="checkbox"], +html[theme="default"] .checkbox-inline input[type="checkbox"] { + margin-left: -25px; +} +html[theme="default"] input[type="radio"], +html[theme="default"] .radio input[type="radio"], +html[theme="default"] .radio-inline input[type="radio"] { + position: relative; + vertical-align: top; + border: none; + background-color: transparent; + -webkit-appearance: none; + appearance: none; + cursor: pointer; +} +html[theme="default"] input[type="radio"]:focus, +html[theme="default"] .radio input[type="radio"]:focus, +html[theme="default"] .radio-inline input[type="radio"]:focus { + outline: none; +} +html[theme="default"] input[type="radio"]:before, +html[theme="default"] .radio input[type="radio"]:before, +html[theme="default"] .radio-inline input[type="radio"]:before, +html[theme="default"] input[type="radio"]:after, +html[theme="default"] .radio input[type="radio"]:after, +html[theme="default"] .radio-inline input[type="radio"]:after { + content: ""; + display: block; + width: 18px; + height: 18px; + border-radius: 50%; + -webkit-transition: 240ms; + -o-transition: 240ms; + transition: 240ms; +} +html[theme="default"] input[type="radio"].form-control:before, +html[theme="default"] .radio input[type="radio"].form-control:before, +html[theme="default"] .radio-inline input[type="radio"].form-control:before, +html[theme="default"] input[type="radio"].form-control:after, +html[theme="default"] .radio input[type="radio"].form-control:after, +html[theme="default"] .radio-inline input[type="radio"].form-control:after { + top: 6px; +} +html[theme="default"] input[type="radio"]:before, +html[theme="default"] .radio input[type="radio"]:before, +html[theme="default"] .radio-inline input[type="radio"]:before { + position: absolute; + left: 0; + top: -3px; + background-color: #acd5e3; + -webkit-transform: scale(0); + -ms-transform: scale(0); + -o-transform: scale(0); + transform: scale(0); +} +html[theme="default"] input[type="radio"].form-control:before, +html[theme="default"] .radio input[type="radio"].form-control:before, +html[theme="default"] .radio-inline input[type="radio"].form-control:before { + left: 4px; +} +html[theme="default"] input[type="radio"]:after, +html[theme="default"] .radio input[type="radio"]:after, +html[theme="default"] .radio-inline input[type="radio"]:after { + position: relative; + top: -3px; + border: 2px solid #555555; +} +html[theme="default"] input[type="radio"]:checked:before, +html[theme="default"] .radio input[type="radio"]:checked:before, +html[theme="default"] .radio-inline input[type="radio"]:checked:before { + -webkit-transform: scale(0.5); + -ms-transform: scale(0.5); + -o-transform: scale(0.5); + transform: scale(0.5); +} +html[theme="default"] input[type="radio"]:disabled:checked:before, +html[theme="default"] .radio input[type="radio"]:disabled:checked:before, +html[theme="default"] .radio-inline input[type="radio"]:disabled:checked:before { + background-color: #777777; +} +html[theme="default"] input[type="radio"]:checked:after, +html[theme="default"] .radio input[type="radio"]:checked:after, +html[theme="default"] .radio-inline input[type="radio"]:checked:after { + border-color: #acd5e3; +} +html[theme="default"] input[type="radio"]:disabled:after, +html[theme="default"] .radio input[type="radio"]:disabled:after, +html[theme="default"] .radio-inline input[type="radio"]:disabled:after, +html[theme="default"] input[type="radio"][readonly]:after, +html[theme="default"] .radio input[type="radio"][readonly]:after, +html[theme="default"] .radio-inline input[type="radio"][readonly]:after, +html[theme="default"] input[type="radio"]:disabled:checked:after, +html[theme="default"] .radio input[type="radio"]:disabled:checked:after, +html[theme="default"] .radio-inline input[type="radio"]:disabled:checked:after, +html[theme="default"] input[type="radio"][readonly]:checked:after, +html[theme="default"] .radio input[type="radio"][readonly]:checked:after, +html[theme="default"] .radio-inline input[type="radio"][readonly]:checked:after { + border-color: #777777; +} +html[theme="default"] input[type="checkbox"], +html[theme="default"] .checkbox input[type="checkbox"], +html[theme="default"] .checkbox-inline input[type="checkbox"] { + position: relative; + border: none; + margin-bottom: -4px; + -webkit-appearance: none; + appearance: none; + cursor: pointer; + width: 18px !important; +} +html[theme="default"] input[type="checkbox"].form-control, +html[theme="default"] .checkbox input[type="checkbox"].form-control, +html[theme="default"] .checkbox-inline input[type="checkbox"].form-control { + margin-bottom: 0; +} +html[theme="default"] input[type="checkbox"]:focus, +html[theme="default"] .checkbox input[type="checkbox"]:focus, +html[theme="default"] .checkbox-inline input[type="checkbox"]:focus { + outline: none; +} +html[theme="default"] input[type="checkbox"]:focus:before, +html[theme="default"] .checkbox input[type="checkbox"]:focus:before, +html[theme="default"] .checkbox-inline input[type="checkbox"]:focus:before { + border-color: #acd5e3; +} +html[theme="default"] input[type="checkbox"]:after, +html[theme="default"] .checkbox input[type="checkbox"]:after, +html[theme="default"] .checkbox-inline input[type="checkbox"]:after { + content: ""; + display: block; + width: 18px; + height: 18px; + margin-top: -2px; + border: 2px solid #555555; + border-radius: 2px; + -webkit-transition: 240ms; + -o-transition: 240ms; + transition: 240ms; +} +html[theme="default"] input[type="checkbox"].form-control:after, +html[theme="default"] .checkbox input[type="checkbox"].form-control:after, +html[theme="default"] .checkbox-inline input[type="checkbox"].form-control:after { + position: absolute; + top: 6px; + left: 0; + right: 0; +} +html[theme="default"] input[type="checkbox"]:checked:before, +html[theme="default"] .checkbox input[type="checkbox"]:checked:before, +html[theme="default"] .checkbox-inline input[type="checkbox"]:checked:before { + content: ""; + position: absolute; + top: 0; + left: 6px; + display: table; + width: 6px; + height: 12px; + border: 2px solid #fff; + border-top-width: 0; + border-left-width: 0; + -webkit-transform: rotate(45deg); + -ms-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); + z-index: 100; +} +html[theme="default"] input[type="checkbox"].form-control:before, +html[theme="default"] .checkbox input[type="checkbox"].form-control:before, +html[theme="default"] .checkbox-inline input[type="checkbox"].form-control:before { + top: 6px; +} +html[theme="default"] input[type="checkbox"]:indeterminate:before, +html[theme="default"] .checkbox input[type="checkbox"]:indeterminate:before, +html[theme="default"] .checkbox-inline input[type="checkbox"]:indeterminate:before { + content: ""; + position: absolute; + top: 50%; + left: 50%; + margin-left: -7px; + transform: translate(0, -50%); + width: 14px; + height: 2px; + background: #fff; +} +html[theme="default"] input[type="checkbox"]:checked:after, +html[theme="default"] .checkbox input[type="checkbox"]:checked:after, +html[theme="default"] .checkbox-inline input[type="checkbox"]:checked:after, +html[theme="default"] input[type="checkbox"]:indeterminate:after, +html[theme="default"] .checkbox input[type="checkbox"]:indeterminate:after, +html[theme="default"] .checkbox-inline input[type="checkbox"]:indeterminate:after { + background-color: #e54c75; + border-color: #e54c75; +} +html[theme="default"] input[type="checkbox"]:disabled:after, +html[theme="default"] .checkbox input[type="checkbox"]:disabled:after, +html[theme="default"] .checkbox-inline input[type="checkbox"]:disabled:after, +html[theme="default"] input[type="checkbox"][readonly]:after, +html[theme="default"] .checkbox input[type="checkbox"][readonly]:after, +html[theme="default"] .checkbox-inline input[type="checkbox"][readonly]:after { + border-color: #777777; +} +html[theme="default"] input[type="checkbox"]:disabled:checked:after, +html[theme="default"] .checkbox input[type="checkbox"]:disabled:checked:after, +html[theme="default"] .checkbox-inline input[type="checkbox"]:disabled:checked:after, +html[theme="default"] input[type="checkbox"][readonly]:checked:after, +html[theme="default"] .checkbox input[type="checkbox"][readonly]:checked:after, +html[theme="default"] .checkbox-inline input[type="checkbox"][readonly]:checked:after { + background-color: #777777; + border-color: transparent; +} +html[theme="default"] .form-boolean input[type=checkbox], +html[theme="default"] .dict-boolean input[type=checkbox], +html[theme="default"] .editabletree-boolean input[type=checkbox] { + width: default; +} +html[theme="default"] .has-warning input:not([type=checkbox]), +html[theme="default"] .has-warning .form-control, +html[theme="default"] .has-warning input.form-control[readonly], +html[theme="default"] .has-warning input[type=text][readonly], +html[theme="default"] .has-warning [type=text].form-control[readonly], +html[theme="default"] .has-warning input:not([type=checkbox]):focus, +html[theme="default"] .has-warning .form-control:focus { + border-bottom: none; + -webkit-box-shadow: inset 0 -2px 0 #e78e42; + box-shadow: inset 0 -2px 0 #e78e42; +} +html[theme="default"] .has-error input:not([type=checkbox]), +html[theme="default"] .has-error .form-control, +html[theme="default"] .has-error input.form-control[readonly], +html[theme="default"] .has-error input[type=text][readonly], +html[theme="default"] .has-error [type=text].form-control[readonly], +html[theme="default"] .has-error input:not([type=checkbox]):focus, +html[theme="default"] .has-error .form-control:focus { + border-bottom: none; + -webkit-box-shadow: inset 0 -2px 0 #e74842; + box-shadow: inset 0 -2px 0 #e74842; +} +html[theme="default"] .has-success input:not([type=checkbox]), +html[theme="default"] .has-success .form-control, +html[theme="default"] .has-success input.form-control[readonly], +html[theme="default"] .has-success input[type=text][readonly], +html[theme="default"] .has-success [type=text].form-control[readonly], +html[theme="default"] .has-success input:not([type=checkbox]):focus, +html[theme="default"] .has-success .form-control:focus { + border-bottom: none; + -webkit-box-shadow: inset 0 -2px 0 #32ad52; + box-shadow: inset 0 -2px 0 #32ad52; +} +html[theme="default"] .nav-tabs > li > a, +html[theme="default"] .nav-tabs > li > a:focus { + margin-right: 0; + background-color: transparent; + border: none; + color: #777; + -webkit-box-shadow: inset 0 -1px 0 #ddd; + box-shadow: inset 0 -1px 0 #ddd; + -webkit-transition: all 0.2s; + -o-transition: all 0.2s; + transition: all 0.2s; +} +html[theme="default"] .nav-tabs > li > a:hover, +html[theme="default"] .nav-tabs > li > a:focus:hover { + background-color: transparent; + -webkit-box-shadow: inset 0 -2px 0 #acd5e3; + box-shadow: inset 0 -2px 0 #acd5e3; + color: #acd5e3; +} +html[theme="default"] .nav-tabs > li.active > a, +html[theme="default"] .nav-tabs > li.active > a:focus { + border: none; + -webkit-box-shadow: inset 0 -2px 0 #acd5e3; + box-shadow: inset 0 -2px 0 #acd5e3; + color: #acd5e3; +} +html[theme="default"] .nav-tabs > li.active > a:hover, +html[theme="default"] .nav-tabs > li.active > a:focus:hover { + border: none; + color: #acd5e3; +} +html[theme="default"] .nav-tabs > li.disabled > a { + -webkit-box-shadow: inset 0 -1px 0 #ddd; + box-shadow: inset 0 -1px 0 #ddd; +} +html[theme="default"] .nav-tabs.nav-justified > li > a, +html[theme="default"] .nav-tabs.nav-justified > li > a:hover, +html[theme="default"] .nav-tabs.nav-justified > li > a:focus, +html[theme="default"] .nav-tabs.nav-justified > .active > a, +html[theme="default"] .nav-tabs.nav-justified > .active > a:hover, +html[theme="default"] .nav-tabs.nav-justified > .active > a:focus { + border: none; +} +html[theme="default"] .nav-tabs .dropdown-menu { + margin-top: 0; +} +html[theme="default"] .dropdown-menu { + margin-top: 0; + border: none; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); +} +html[theme="default"] .alert { + border: none; + color: #fff; +} +html[theme="default"] .alert-success { + background-color: #32ad52; +} +html[theme="default"] .alert-info { + background-color: #e54c75; +} +html[theme="default"] .alert-warning { + background-color: #e78e42; +} +html[theme="default"] .alert-danger { + background-color: #e74842; +} +html[theme="default"] .alert a:not(.close):not(.btn), +html[theme="default"] .alert .alert-link { + color: #fff; + font-weight: bold; +} +html[theme="default"] .alert .close { + color: #fff; +} +html[theme="default"] .badge { + padding: 4px 6px 4px; +} +html[theme="default"] .progress { + position: relative; + z-index: 1; + border-radius: 0; + -webkit-box-shadow: none; + box-shadow: none; +} +html[theme="default"] .progress-bar { + -webkit-box-shadow: none; + box-shadow: none; +} +html[theme="default"] .progress-bar:last-child { + border-radius: 0 3px 3px 0; +} +html[theme="default"] .progress-bar:last-child:before { + display: block; + content: ""; + position: absolute; + width: 100%; + height: 100%; + left: 0; + right: 0; + z-index: -1; + background-color: #78959F; +} +html[theme="default"] .progress-bar-success:last-child.progress-bar:before { + background-color: #abe7ba; +} +html[theme="default"] .progress-bar-info:last-child.progress-bar:before { + background-color: #ffffff; +} +html[theme="default"] .progress-bar-warning:last-child.progress-bar:before { + background-color: #fbede0; +} +html[theme="default"] .progress-bar-danger:last-child.progress-bar:before { + background-color: #f5b6b3; +} +html[theme="default"] .close { + font-size: 34px; + font-weight: 300; + line-height: inherit; + opacity: 0.6; + -webkit-transition: all 0.2s; + -o-transition: all 0.2s; + transition: all 0.2s; +} +html[theme="default"] .close:hover { + opacity: 1; +} +html[theme="default"] .well { + border-radius: 0; + -webkit-box-shadow: none; + box-shadow: none; +} +html[theme="default"] .panel { + border: none; + border-radius: 2px; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); +} +html[theme="default"] .panel-heading { + border-bottom: none; +} +html[theme="default"] .panel-footer { + border-top: none; +} +html[theme="default"] .popover { + border: none; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); +} +html[theme="default"] .carousel-caption h1, +html[theme="default"] .carousel-caption h2, +html[theme="default"] .carousel-caption h3, +html[theme="default"] .carousel-caption h4, +html[theme="default"] .carousel-caption h5, +html[theme="default"] .carousel-caption h6 { + color: inherit; +} +.body { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; +} +.body > .navbar { + margin-bottom: 0; +} +.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); +} +.radio, +.checkbox { + margin-top: 0; + margin-bottom: 0; +} +.btn-horizontal { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.input-group > .form-control-feedback { + z-index: 3; +} +.input-group-addon > .label { + position: absolute; + right: 0px; + top: -5px; +} +.navbar-inverse .close { + color: white; +} +.navbar-inverse .close:hover, +.navbar-inverse .close:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .active .close, +.navbar-inverse .active .close:hover, +.navbar-inverse .active .close:focus { + color: #fff; + background-color: transparent; +} +.navbar .icon { + display: inline-block; + height: 1.42857143em; + vertical-align: middle; +} +@media (min-width: 768px) { + .navbar-nav { + float: none; + } +} +.btn-primary .icon { + filter: brightness(0) invert(1); +} +.panel-heading a { + color: inherit; +} +.modal-header { + background: linear-gradient(45deg, #e54c75, #f7b973); + color: #fff; +} +.modal-header .modal-title small { + color: #eeeeee; +} +.alert { + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; +} +#tablist { + display: flex; + overflow-x: auto; +} +#tablist > li { + flex: auto; + min-width: 9em; +} +#tablist > li > a > span { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + /* For IE */ + display: block; + margin-right: 15px; +} +[dir="rtl"] #tablist > li > a > span { + margin-right: 0; + margin-left: 15px; +} +@media screen and (max-width: 767px) { + #tablist { + display: block; + } + #tablist > li { + float: none; + } +} +#main { + bottom: 0; + display: flex; + flex-direction: row; + gap: 0.5rem; + left: 0; + position: absolute; + right: 0; + top: 6rem; +} +#menu, +#tabs { + display: flex; + overflow: auto; +} +#menu .navbar-brand .title, +#tabs .navbar-brand .title { + display: inline-block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +#tabs { + flex: 1; + overflow-x: hidden; + padding: 0 5px; +} +@media screen and (max-width: 1199px) { + #menu .navbar-brand .title, + #tabs .navbar-brand .title { + max-width: 180px; + } +} +@media screen and (max-width: 991px) { + #menu .navbar-brand .title, + #tabs .navbar-brand .title { + max-width: 170px; + } +} +@media screen and (max-width: 767px) { + #menu, + #tabs { + padding-left: 0; + padding-right: 0; + } + #menu .navbar-brand, + #tabs .navbar-brand { + padding-left: 0; + padding-right: 0; + } + #menu .navbar-brand .title, + #tabs .navbar-brand .title { + max-width: 70px; + } +} +#menu { + overflow-y: auto; + padding: 0; + background-color: #f8f8f8; + border-color: #ddd; + border-style: solid; + border-radius: 0 4px 4px 0; + border-width: 1px; +} +#menu .treeview { + height: auto; +} +#menu .treeview .cell { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +@media (min-width: 992px) { + #menu { + resize: horizontal; + width: 35rem; + min-width: 20ch; + max-width: 100vw; + } +} +@media (max-width: 991px) { + #menu { + width: 100%; + } +} +[dir="rtl"] #menu { + border-right: none; +} +@media screen and (max-width: 991px) { + #menu { + border-right: none; + border-left: none; + border-width: none; + } + .active #menu { + border-width: 1px; + } + [dir="rtl"] .active #menu { + border-right: none; + } +} +#tabcontent { + display: flex; + flex: 1; + width: 100%; +} +#tabcontent > .tab-pane > .panel { + display: flex; + flex-direction: column; + flex: 1; + margin-bottom: 5px; + padding-bottom: 0; +} +#tabcontent > .tab-pane > .panel > .panel-body { + display: flex; + flex: 1; + flex-direction: row; + padding: 5px 0; + min-height: 0; +} +#tabcontent > .tab-pane > .panel > .panel-body > div { + display: inline-flex; +} +#tabcontent > .tab-pane > .panel > .panel-body > div:first-child { + flex: 2; +} +#tabcontent > .tab-pane.active { + /* override bootstrap which sets display to block */ + display: flex; + flex: 1; +} +#tabcontent .sidebar { + border-color: #ddd; + border-style: solid; + border-width: 0 0 0 1px; + flex: 1; + overflow: unset; +} +#tabcontent .sidebar .sidebar-resizer { + display: flex; + flex-direction: column; + height: 100%; + max-width: 100vw; + min-width: 100%; + overflow: hidden; + resize: inline; + transform: scaleX(-1); +} +#tabcontent .sidebar .sidebar-content { + display: flex; + flex-direction: column; + flex: 1; + transform: scaleX(-1); + height: 100%; +} +@media screen and (max-width: 767px) { + #tabcontent .sidebar:not(:empty) { + flex: 2; + } + #tabcontent .sidebar:not(:empty) > .sidebar-resizer { + resize: none; + } +} +@media screen and (max-width: 991px) { + #tabcontent .sidebar { + visibility: collapse; + } + #tabcontent[data-view-type="form"] { + display: block; + } + #tabcontent[data-view-type="form"] > .tab-pane > .panel > .panel-body { + flex-direction: column; + } + #tabcontent[data-view-type="form"] .sidebar { + visibility: unset; + } +} +@media screen and (min-width: 768px) { + #global-search-entry { + width: 10em; + -webkit-transition: width 0.5s ease; + -o-transition: width 0.5s ease; + transition: width 0.5s ease; + } + .global-search-container:focus-within #global-search-entry { + width: 20em; + } +} +#user-preferences > a { + max-width: 30em; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +#user-preferences > a > img { + margin: -5px 5px; + width: 30px; +} +#user-preferences > a > img[src=''] { + width: 0; +} +#user-preferences > a > img.img-badge { + margin-left: -15px; + margin-bottom: -25px; + width: 15px; +} +.attachment-preview { + border-bottom: 1px solid #eeeeee; + display: flex; + flex-direction: column; + flex: 1; + min-height: 200px; +} +.attachment-preview .screen-container { + overflow: auto; +} +.attachment-preview .btn-group { + margin-bottom: 10px; + margin-top: 10px; +} +.chat { + border-bottom: 1px solid #eeeeee; + display: flex; + flex-direction: column; + flex: 1; + height: 100%; + min-height: 200px; + padding-bottom: 20px; + padding-left: 5px; + padding-right: 5px; +} +.chat .chat-messages-outer { + display: flex; + flex-direction: column; + flex: 1; + justify-content: flex-end; + overflow: hidden; +} +.chat .chat-messages { + max-height: 100%; + overflow-y: auto; +} +.chat .chat-message { + margin-top: 5px; +} +.chat .chat-content { + white-space: pre-wrap; + word-wrap: break-word; +} +.chat .chat-content-internal { + color: #777777; +} +.chat .media-body.well { + border-radius: 0.5rem; + margin: 0; +} +.chat hr { + border-style: dotted; + margin-bottom: 5px; + margin-top: 5px; + width: 100%; +} +.chat textarea { + min-height: 60px; + resize: vertical; +} +.chat .checkbox { + margin-bottom: 10px; + margin-top: 10px; +} +.list-group-item-selected { + color: #9e9e9e; + background-color: #bceaeb; +} +a.list-group-item-selected, +button.list-group-item-selected { + color: #9e9e9e; +} +a.list-group-item-selected .list-group-item-heading, +button.list-group-item-selected .list-group-item-heading { + color: inherit; +} +a.list-group-item-selected:hover, +button.list-group-item-selected:hover, +a.list-group-item-selected:focus, +button.list-group-item-selected:focus { + color: #59cbce; + background-color: #a8e4e6; +} +a.list-group-item-selected.active, +button.list-group-item-selected.active, +a.list-group-item-selected.active:hover, +button.list-group-item-selected.active:hover, +a.list-group-item-selected.active:focus, +button.list-group-item-selected.active:focus { + color: #fff; + background-color: #1f1a17; + border-color: #1f1a17; +} +.table > thead > tr > td.selected, +.table > tbody > tr > td.selected, +.table > tfoot > tr > td.selected, +.table > thead > tr > th.selected, +.table > tbody > tr > th.selected, +.table > tfoot > tr > th.selected, +.table > thead > tr.selected > td, +.table > tbody > tr.selected > td, +.table > tfoot > tr.selected > td, +.table > thead > tr.selected > th, +.table > tbody > tr.selected > th, +.table > tfoot > tr.selected > th { + background-color: #487b508c; +} +.table-hover > tbody > tr > td.selected:hover, +.table-hover > tbody > tr > th.selected:hover, +.table-hover > tbody > tr.selected:hover > td, +.table-hover > tbody > tr:hover > .selected, +.table-hover > tbody > tr.selected:hover > th { + background-color: #fff; +} +/* Duplicate bootstrap variant to have precedence over selected */ +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +html.accesskey *[accesskey] ~ span[data-accesskey]:after, +html.accesskey *[accesskey]:after { + background-color: #71bdc1; + color: #fff; + font-size: x-small; + padding: 0 2px; + position: absolute; + text-transform: uppercase; + margin: 0 -1em; + z-index: 5; +} +html.accesskey input[accesskey][type="checkbox"]:after { + background-color: initial; +} +html.accesskey *[accesskey] ~ span[data-accesskey] { + float: right; + position: relative; +} +html.accesskey *[accesskey] ~ span[data-accesskey]:after { + content: attr(data-accesskey); +} +html.accesskey *[accesskey]:after { + content: attr(accesskey); +} +html.accesskey input[accesskey][type="checkbox"] ~ span[data-accesskey], +html.accesskey input[accesskey][type="checkbox"] ~ span[data-accesskey], +html.accesskey select[accesskey] ~ span[data-accesskey] { + bottom: 1em; +} +.tab-form, +.tab-board { + padding-bottom: 20px; +} +.tab-form nav.toolbar, +.tab-board nav.toolbar { + position: -webkit-sticky; + position: sticky; + top: 0px; + z-index: 999; +} +.tab-form nav.toolbar .close, +.tab-board nav.toolbar .close { + margin-right: 5px; + margin-left: 5px; +} +.tab-form .navbar-text .badge, +.tab-board .navbar-text .badge { + max-width: 7em; + min-width: 7em; + overflow: hidden; + text-overflow: ellipsis; +} +.tab-form .navbar-btn .badge, +.tab-board .navbar-btn .badge { + position: absolute; + top: -5px; + right: -5px; + z-index: 1000; + background-color: #111; +} +.tab-form .tab-domain, +.tab-board .tab-domain { + overflow-x: auto; + max-width: calc(100vw - 10px); + flex: 0 0 content; +} +.tab-form .tab-domain > .nav-tabs, +.tab-board .tab-domain > .nav-tabs { + display: inline-flex; + white-space: nowrap; + width: 1px; +} +.tab-form .tab-domain .badge, +.tab-board .tab-domain .badge { + min-width: 3em; +} +@media screen and (max-height: 750px) { + .tab-form .navbar-header > ul, + .tab-board .navbar-header > ul { + min-width: 320px; + } + .tab-form .navbar-header > ul > li, + .tab-board .navbar-header > ul > li { + float: left; + width: 50%; + } +} +@media screen and (max-width: 767px) { + nav.toolbar { + padding-left: 0; + padding-right: 0; + } +} +.modal-body { + overflow-x: auto; + max-height: calc(100vh - 200px); +} +@media screen and (max-height: 500px) { + .modal-body { + max-height: 300px; + } +} +.modal-lg .modal-content { + height: auto; + border-radius: 0; +} +@media screen and (min-width: 768px) { + .modal-dialog.modal-lg { + width: auto; + margin: 30px; + } +} +input[type='number'] { + text-align: right; + text-align: end; +} +input[type='color'] .btn { + height: 1.42857143; +} +input[type='color'] .btn-lg { + height: 1.3333333; +} +input[type='color'] .btn-sm { + height: 1.5; +} +input[type='color'] .btn-xs { + height: 1.5; +} +.input-file > input[type='file'] { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0; + cursor: pointer; +} +li.input-file > input[type='file'] { + top: auto; + height: auto; +} +li.input-file > input[type='file']:hover + a, +li.input-file > input[type='file']:focus + a { + background-color: #f5f5f5; + color: #262626; + text-decoration: none; +} +/* Hide empty image displayed as broken image */ +img[src=''], +img:not([src]) { + visibility: hidden; +} +img.icon { + height: 1.42857143em; +} +[dir="rtl"] img.icon { + transform: scaleX(-1); +} +.screen-container, +.board { + display: flex; + flex-direction: column; + flex: 1; +} +.filter-box { + margin: 5px 0; +} +@media screen and (max-width: 991px) { + .filter-box button[disabled] { + display: none; + } +} +.content-box { + display: flex; + flex-direction: column; + flex: 1; + overflow-y: auto; +} +.tree-container { + display: flex; + flex-direction: column; + min-height: 0; +} +.tree-container .tree-dragged-image { + display: block; + height: 0; + left: 0; + position: absolute; + top: 0; + width: 0; +} +.wizard-form { + width: 100%; +} +.list-form { + overflow-y: auto; +} +.treeview { + overflow-x: auto; +} +.treeview > table.tree { + width: 100%; + table-layout: fixed; + border: 1px solid transparent; +} +.treeview > table.tree.table-bordered { + border-color: #ddd; +} +.treeview > table.tree col.selection-state, +.treeview > table.tree col.favorite, +.treeview > table.tree col.tree-menu { + width: 30px; +} +.treeview > table.tree td.draggable-handle > img, +.treeview > table.tree td.optional > img { + display: block; + margin-right: auto; + margin-left: auto; +} +.treeview > table.tree td.draggable-handle { + cursor: grab; +} +.treeview > table.tree th.selection-state > input { + margin-top: 0; + margin-bottom: 0; +} +.treeview > table.tree th.selection-state > input, +.treeview > table.tree td.selection-state > input { + display: block; + margin-right: auto; + margin-left: auto; +} +.treeview > table.tree > thead > tr > th { + position: relative; + padding: 5px; + text-align: center; +} +.treeview > table.tree > thead > tr > th > label { + display: inline-block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0; +} +.treeview > table.tree > thead > tr > th > label.sortable { + cursor: pointer; +} +.treeview > table.tree > thead > tr > th > div.resizer { + z-index: 1; + position: absolute; + top: 0; + inset-inline-end: -5px; + width: 2px; + height: 100%; + cursor: ew-resize; + padding: 0 4px; + background-color: transparent; +} +.treeview > table.tree > thead > tr > th.tree-menu { + cursor: pointer; + overflow: visible; +} +.treeview > table.tree > thead > tr > th.char, +.treeview > table.tree > thead > tr > th.text, +.treeview > table.tree > thead > tr > th.many2one, +.treeview > table.tree > thead > tr > th.one2one, +.treeview > table.tree > thead > tr > th.date, +.treeview > table.tree > thead > tr > th.time, +.treeview > table.tree > thead > tr > th.selection, +.treeview > table.tree > thead > tr > th.reference, +.treeview > table.tree > thead > tr > th.url, +.treeview > table.tree > thead > tr > th.email, +.treeview > table.tree > thead > tr > th.callto, +.treeview > table.tree > thead > tr > th.sip { + text-align: left; + text-align: start; +} +.treeview > table.tree > thead > tr > th.timedelta, +.treeview > table.tree > thead > tr > th.float, +.treeview > table.tree > thead > tr > th.numeric, +.treeview > table.tree > thead > tr > th.integer { + text-align: right; + text-align: end; +} +.treeview > table.tree > thead > tr:first-child { + position: sticky; + top: 0; + z-index: 100; +} +.treeview > table.tree > thead > tr:first-child th { + border: 1px solid transparent; + border-bottom: 2px solid #ddd; + background-color: #fff; +} +.treeview > table.tree > thead > tr:first-child:hover th { + border: 1px solid #ddd; + border-bottom-width: 2px; +} +.treeview > table.tree > tfoot > tr { + bottom: 0; + position: sticky; + z-index: 100; +} +.treeview > table.tree > tfoot > tr th { + background-color: #fff; +} +.treeview > table.tree > tfoot > tr th > label { + display: none; +} +.treeview > table.tree > tfoot > tr th > div.value { + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + white-space: pre; +} +.treeview > table.tree > tbody > tr > td { + cursor: pointer; +} +.treeview > table.tree > tbody > tr > td > * { + vertical-align: middle; +} +.treeview > table.tree > tbody > tr.dragged-row { + background-color: #d9edf7; +} +.treeview > table.tree img.column-affix, +.treeview > table.tree a.column-affix > img { + width: 1.42857143em; + height: 1.42857143em; + display: block; +} +.treeview > table.tree tr.more-row { + text-align: center; +} +.treeview .editabletree-char, +.treeview .editabletree-date, +.treeview .editabletree-datetime, +.treeview .editabletree-integer, +.treeview .editabletree-float, +.treeview .editabletree-selection, +.treeview .editabletree-timedelta, +.treeview .editabletree-boolean, +.treeview .editabletree-many2one, +.treeview .editabletree-one2many, +.treeview .editabletree-reference, +.treeview .editabletree-time { + width: 100%; +} +.treeview .editabletree-char input[type='checkbox'], +.treeview .editabletree-date input[type='checkbox'], +.treeview .editabletree-datetime input[type='checkbox'], +.treeview .editabletree-integer input[type='checkbox'], +.treeview .editabletree-float input[type='checkbox'], +.treeview .editabletree-selection input[type='checkbox'], +.treeview .editabletree-timedelta input[type='checkbox'], +.treeview .editabletree-boolean input[type='checkbox'], +.treeview .editabletree-many2one input[type='checkbox'], +.treeview .editabletree-one2many input[type='checkbox'], +.treeview .editabletree-reference input[type='checkbox'], +.treeview .editabletree-time input[type='checkbox'] { + margin-top: 0; + margin-left: auto; + margin-right: auto; +} +.treeview .editabletree-char > .input-group, +.treeview .editabletree-date > .input-group, +.treeview .editabletree-datetime > .input-group, +.treeview .editabletree-integer > .input-group, +.treeview .editabletree-float > .input-group, +.treeview .editabletree-selection > .input-group, +.treeview .editabletree-timedelta > .input-group, +.treeview .editabletree-boolean > .input-group, +.treeview .editabletree-many2one > .input-group, +.treeview .editabletree-one2many > .input-group, +.treeview .editabletree-reference > .input-group, +.treeview .editabletree-time > .input-group { + width: 100%; +} +@media screen and (min-width: 768px) { + .treeview .editabletree-reference > .input-sm, + .treeview .editabletree-reference > .input-group { + width: 50%; + } +} +.treeview td { + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.treeview td.edited { + /* We have to define an overflow:visible in order for the + completion widget to be shown */ + overflow: visible; + padding: 0 0; +} +.treeview td > .column-text { + white-space: pre; +} +.treeview .cell { + display: flex; + justify-content: space-between; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; +} +.treeview .cell > * { + align-self: center; +} +.treeview .cell .widget, +.treeview .cell .widget-editable { + min-width: 0; + flex-grow: 2; +} +.treeview .cell .widget > *, +.treeview .cell .widget-editable > * { + width: 100%; +} +.treeview .cell .widget > * { + overflow: hidden; + text-overflow: ellipsis; +} +.treeview .cell .widget > input[type="checkbox"], +.treeview .cell .widget > input[type="radio"] { + overflow: unset; +} +.treeview .cell .prefix { + padding-right: 4px; +} +[dir="rtl"] .treeview .cell .prefix { + padding-right: 0; + padding-left: 4px; +} +.treeview .cell .suffix { + padding-left: 4px; +} +[dir="rtl"] .treeview .cell .suffix { + padding-left: 0; + padding-right: 4px; +} +.treeview .expander { + cursor: pointer; +} +.treeview .expander > img { + float: left; + width: 1.42857143em; + height: 1.42857143em; +} +[dir="rtl"] .treeview .expander > img { + float: right; +} +.treeview label { + font-weight: normal; + display: inline; +} +.treeview label.required { + font-weight: bold; +} +.treeview label.editable { + font-style: italic; +} +.treeview .btn { + padding-top: 0; + padding-bottom: 0; +} +.treeview > table.table-bordered { + border: 1px solid #ddd; +} +.treeview > table.table-bordered > thead > tr:first-child > th, +.treeview > table.table-bordered > tbody > tr:first-child > th, +.treeview > table.table-bordered > tfoot > tr:first-child > th, +.treeview > table.table-bordered > thead > tr:first-child > td, +.treeview > table.table-bordered > tbody > tr:first-child > td, +.treeview > table.table-bordered > tfoot > tr:first-child > td { + border: 1px solid #ddd; +} +.treeview > table.table-bordered > thead > tr:first-child > th, +.treeview > table.table-bordered > thead > tr:first-child > td { + border-bottom-width: 2px; +} +.form, +.board { + width: 100%; + height: 100%; +} +.form .form-container, +.board .form-container, +.form .form-hcontainer, +.board .form-hcontainer, +.form .form-vcontainer, +.board .form-vcontainer { + display: grid; + width: 100%; + height: 100%; + column-gap: 5px; + row-gap: 5px; +} +.form .form-item, +.board .form-item { + display: flex; +} +.form .form-item > .btn, +.board .form-item > .btn { + margin: 5px 0; +} +.form .form-notebook, +.board .form-notebook { + border-color: #ddd; + border-style: solid; + border-width: 1px; +} +.form .form-notebook .nav-tabs, +.board .form-notebook .nav-tabs { + background: #f8f8f8; + margin-bottom: 5px; +} +.form .form-label, +.board .form-label { + white-space: pre-wrap; + width: max-content; + max-width: 80ch; +} +.form .form-char input, +.board .form-char input, +.form .form-password input, +.board .form-password input, +.form .form-color input, +.board .form-color input, +.form .form-integer input, +.board .form-integer input, +.form .form-float input, +.board .form-float input, +.form .form-timedelta input, +.board .form-timedelta input, +.form .form-selection input, +.board .form-selection input, +.form .form-multiselection input, +.board .form-multiselection input, +.form .form-url input, +.board .form-url input, +.form .form-email input, +.board .form-email input, +.form .form-callto input, +.board .form-callto input, +.form .form-sip input, +.board .form-sip input, +.form .form-pyson input, +.board .form-pyson input, +.form .form-char select, +.board .form-char select, +.form .form-password select, +.board .form-password select, +.form .form-color select, +.board .form-color select, +.form .form-integer select, +.board .form-integer select, +.form .form-float select, +.board .form-float select, +.form .form-timedelta select, +.board .form-timedelta select, +.form .form-selection select, +.board .form-selection select, +.form .form-multiselection select, +.board .form-multiselection select, +.form .form-url select, +.board .form-url select, +.form .form-email select, +.board .form-email select, +.form .form-callto select, +.board .form-callto select, +.form .form-sip select, +.board .form-sip select, +.form .form-pyson select, +.board .form-pyson select { + min-width: 8ch; +} +.form .form-date input, +.board .form-date input { + width: calc(10ch + 34px); +} +.form .form-time input, +.board .form-time input { + width: calc(8ch + 34px); +} +.form .form-datetime input, +.board .form-datetime input { + width: calc(19ch + 34px); +} +.form .form-many2one select, +.board .form-many2one select, +.form .form-one2one select, +.board .form-one2one select, +.form .form-reference select, +.board .form-reference select, +.form .form-binary select, +.board .form-binary select { + min-width: 8ch; +} +.form .form-many2one input, +.board .form-many2one input, +.form .form-one2one input, +.board .form-one2one input, +.form .form-reference input, +.board .form-reference input, +.form .form-binary input, +.board .form-binary input { + min-width: 12ch; +} +.form .form-many2one input[type='file'], +.board .form-many2one input[type='file'], +.form .form-one2one input[type='file'], +.board .form-one2one input[type='file'], +.form .form-reference input[type='file'], +.board .form-reference input[type='file'], +.form .form-binary input[type='file'], +.board .form-binary input[type='file'] { + min-width: unset; +} +.form .form-selection select.form-control, +.board .form-selection select.form-control { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +@media screen and (min-width: 768px) { + .form .form-reference > .input-sm, + .board .form-reference > .input-sm, + .form .form-reference > .input-group, + .board .form-reference > .input-group { + width: 50%; + } +} +@media screen and (max-width: 767px) { + .form .form-reference > .input-sm, + .board .form-reference > .input-sm, + .form .form-reference > .input-group, + .board .form-reference > .input-group { + width: 100%; + } +} +.form .form-url a > img, +.board .form-url a > img, +.form .form-email a > img, +.board .form-email a > img, +.form .form-callto a > img, +.board .form-callto a > img, +.form .form-sip a > img, +.board .form-sip a > img { + width: 1em; + height: 1em; +} +.form .form-many2one > .input-group, +.board .form-many2one > .input-group { + width: 100%; +} +.form .form-one2many-menu::after, +.board .form-one2many-menu::after, +.form .form-many2many-menu::after, +.board .form-many2many-menu::after { + content: ""; + display: table; + clear: both; +} +.form .form-one2many-menu .form-one2many-string, +.board .form-one2many-menu .form-one2many-string, +.form .form-many2many-menu .form-one2many-string, +.board .form-many2many-menu .form-one2many-string, +.form .form-one2many-menu .form-many2many-string, +.board .form-one2many-menu .form-many2many-string, +.form .form-many2many-menu .form-many2many-string, +.board .form-many2many-menu .form-many2many-string { + display: inline-table; + float: left; + margin: 5px; +} +[dir="rtl"] .form .form-one2many-menu .form-one2many-string, +[dir="rtl"] .board .form-one2many-menu .form-one2many-string, +[dir="rtl"] .form .form-many2many-menu .form-one2many-string, +[dir="rtl"] .board .form-many2many-menu .form-one2many-string, +[dir="rtl"] .form .form-one2many-menu .form-many2many-string, +[dir="rtl"] .board .form-one2many-menu .form-many2many-string, +[dir="rtl"] .form .form-many2many-menu .form-many2many-string, +[dir="rtl"] .board .form-many2many-menu .form-many2many-string { + float: right; +} +.form .form-one2many-menu .form-one2many-toolbar, +.board .form-one2many-menu .form-one2many-toolbar, +.form .form-many2many-menu .form-one2many-toolbar, +.board .form-many2many-menu .form-one2many-toolbar, +.form .form-one2many-menu .form-many2many-toolbar, +.board .form-one2many-menu .form-many2many-toolbar, +.form .form-many2many-menu .form-many2many-toolbar, +.board .form-many2many-menu .form-many2many-toolbar { + display: inline-table; + float: right; +} +[dir="rtl"] .form .form-one2many-menu .form-one2many-toolbar, +[dir="rtl"] .board .form-one2many-menu .form-one2many-toolbar, +[dir="rtl"] .form .form-many2many-menu .form-one2many-toolbar, +[dir="rtl"] .board .form-many2many-menu .form-one2many-toolbar, +[dir="rtl"] .form .form-one2many-menu .form-many2many-toolbar, +[dir="rtl"] .board .form-one2many-menu .form-many2many-toolbar, +[dir="rtl"] .form .form-many2many-menu .form-many2many-toolbar, +[dir="rtl"] .board .form-many2many-menu .form-many2many-toolbar { + float: left; +} +.form .form-one2many-menu .form-one2many-toolbar .badge, +.board .form-one2many-menu .form-one2many-toolbar .badge, +.form .form-many2many-menu .form-one2many-toolbar .badge, +.board .form-many2many-menu .form-one2many-toolbar .badge, +.form .form-one2many-menu .form-many2many-toolbar .badge, +.board .form-one2many-menu .form-many2many-toolbar .badge, +.form .form-many2many-menu .form-many2many-toolbar .badge, +.board .form-many2many-menu .form-many2many-toolbar .badge { + max-width: 5em; + min-width: 5em; + overflow: hidden; + text-overflow: ellipsis; +} +.form .form-one2many-content, +.board .form-one2many-content, +.form .form-many2many-content, +.board .form-many2many-content { + padding: 5px; +} +.form .form-one2many-content .treeview, +.board .form-one2many-content .treeview, +.form .form-many2many-content .treeview, +.board .form-many2many-content .treeview, +.form .form-one2many-content .list-form, +.board .form-one2many-content .list-form, +.form .form-many2many-content .list-form, +.board .form-many2many-content .list-form { + height: auto; + min-height: 150px; + max-height: 300px; +} +.form .form-text, +.board .form-text, +.form .form-richtext, +.board .form-richtext { + display: flex; +} +.form .form-text .input-group, +.board .form-text .input-group, +.form .form-richtext .input-group, +.board .form-richtext .input-group { + display: flex; + width: 100%; +} +.form .form-text .input-group textarea, +.board .form-text .input-group textarea, +.form .form-richtext .input-group textarea, +.board .form-richtext .input-group textarea, +.form .form-text .input-group .richtext, +.board .form-text .input-group .richtext, +.form .form-richtext .input-group .richtext, +.board .form-richtext .input-group .richtext { + height: 100%; + line-height: 2.5ex; + min-height: 12.5ex; + overflow: auto; + resize: vertical; +} +.form .form-text .input-group > span, +.board .form-text .input-group > span, +.form .form-richtext .input-group > span, +.board .form-richtext .input-group > span { + flex-basis: fit-content; +} +.form .form-richtext > .btn-toolbar, +.board .form-richtext > .btn-toolbar { + min-width: 450px; +} +.form .form-separator label, +.board .form-separator label { + margin-top: 10px; +} +.form .form-separator hr, +.board .form-separator hr { + margin-top: 0; + margin-bottom: 5px; +} +.form .form-image, +.board .form-image { + margin: 2px; +} +.form .form-image .caption, +.board .form-image .caption { + min-width: 120px; +} +.form .form-document object, +.board .form-document object { + object-fit: scale-down; + object-position: center top; + max-width: 100%; + min-height: 50vh; + height: 100%; + width: 100%; +} +@media screen and (max-width: 767px) { + .form .form-document object, + .board .form-document object { + min-height: 25vh; + } +} +.form label, +.board label { + font-weight: normal; + display: inline; + padding: 0 5px; +} +.form label.required, +.board label.required { + font-weight: bold; +} +.form label.editable, +.board label.editable { + font-style: italic; +} +.form .nav-tabs, +.board .nav-tabs { + margin-bottom: 15px; +} +.form .panel-heading, +.board .panel-heading { + padding: 2px 2px; +} +.form fieldset.form-group_, +.board fieldset.form-group_ { + overflow: auto; +} +.form fieldset.form-group_ > legend, +.board fieldset.form-group_ > legend { + font-size: 14px; + margin-bottom: 5px; +} +.form fieldset.form-group_ .form-container, +.board fieldset.form-group_ .form-container, +.form fieldset.form-group_ .form-hcontainer, +.board fieldset.form-group_ .form-hcontainer, +.form fieldset.form-group_ .form-vcontainer, +.board fieldset.form-group_ .form-vcontainer { + vertical-align: middle; +} +.form .xexpand, +.board .xexpand { + width: 100%; +} +.form .xfill, +.board .xfill { + justify-content: stretch; +} +.form .yexpand, +.board .yexpand { + height: 100%; +} +.form .xalign-start, +.board .xalign-start { + justify-self: start; + justify-content: start; +} +.form .xalign-center, +.board .xalign-center { + justify-self: center; + justify-content: center; +} +.form .xalign-end, +.board .xalign-end { + justify-self: end; + justify-content: end; +} +.form .yalign-start, +.board .yalign-start { + align-items: start; +} +.form .yalign-center, +.board .yalign-center { + align-items: center; +} +.form .yalign-end, +.board .yalign-end { + align-items: end; +} +.form .yfill, +.board .yfill { + align-self: stretch; +} +.form-binary, +.editabletree-binary { + min-width: calc(5 * 2.4em); +} +.form-binary input:last-of-type, +.editabletree-binary input:last-of-type { + text-align: right; + text-align: end; +} +.form-multiselection select option:before, +.dict-multiselection select option:before { + content: "☐ "; +} +.form-multiselection select option:checked:before, +.dict-multiselection select option:checked:before { + content: "☑ "; +} +.form-multiselection.yexpand select, +.dict-multiselection.yexpand select { + min-height: 150px; + max-height: 400px; +} +.form-integer input, +.form-float input, +.form-timedelta input, +.dict-integer input, +.dict-float input, +.dict-numeric input, +.editabletree-integer input, +.editabletree-float input, +.editabletree-timedelta input { + text-align: right; + text-align: end; +} +.column-integer, +.column-float, +.column-timedelta, +.column-binary { + text-align: right; + text-align: end; +} +.column-many2many, +.column-one2many { + text-align: center; +} +input.column-boolean { + display: block; + margin-right: auto; + margin-left: auto; +} +.column-many2one a:hover:after, +.column-reference a:hover:after { + content: " 🔗"; + display: inline-block; +} +.form-date .icon-input, +.form-datetime .icon-input, +.form-time .icon-input, +.dict-date .icon-input, +.dict-datetime .icon-input, +.input-date .icon-input, +.input-datetime-local .icon-input, +.input-time .icon-input, +.editabletree-date .icon-input, +.editabletree-datetime .icon-input, +.editabletree-time .icon-input { + overflow-y: hidden; +} +.form-date input[type="date"], +.form-datetime input[type="date"], +.form-time input[type="date"], +.dict-date input[type="date"], +.dict-datetime input[type="date"], +.input-date input[type="date"], +.input-datetime-local input[type="date"], +.input-time input[type="date"], +.editabletree-date input[type="date"], +.editabletree-datetime input[type="date"], +.editabletree-time input[type="date"], +.form-date input[type="datetime-local"], +.form-datetime input[type="datetime-local"], +.form-time input[type="datetime-local"], +.dict-date input[type="datetime-local"], +.dict-datetime input[type="datetime-local"], +.input-date input[type="datetime-local"], +.input-datetime-local input[type="datetime-local"], +.input-time input[type="datetime-local"], +.editabletree-date input[type="datetime-local"], +.editabletree-datetime input[type="datetime-local"], +.editabletree-time input[type="datetime-local"], +.form-date input[type="time"], +.form-datetime input[type="time"], +.form-time input[type="time"], +.dict-date input[type="time"], +.dict-datetime input[type="time"], +.input-date input[type="time"], +.input-datetime-local input[type="time"], +.input-time input[type="time"], +.editabletree-date input[type="time"], +.editabletree-datetime input[type="time"], +.editabletree-time input[type="time"] { + min-width: 0; + opacity: 0; + position: absolute; + width: calc(100% + 2em); + left: -2em; +} +.form-date input[type="date"]::-webkit-calendar-picker-indicator, +.form-datetime input[type="date"]::-webkit-calendar-picker-indicator, +.form-time input[type="date"]::-webkit-calendar-picker-indicator, +.dict-date input[type="date"]::-webkit-calendar-picker-indicator, +.dict-datetime input[type="date"]::-webkit-calendar-picker-indicator, +.input-date input[type="date"]::-webkit-calendar-picker-indicator, +.input-datetime-local input[type="date"]::-webkit-calendar-picker-indicator, +.input-time input[type="date"]::-webkit-calendar-picker-indicator, +.editabletree-date input[type="date"]::-webkit-calendar-picker-indicator, +.editabletree-datetime input[type="date"]::-webkit-calendar-picker-indicator, +.editabletree-time input[type="date"]::-webkit-calendar-picker-indicator, +.form-date input[type="datetime-local"]::-webkit-calendar-picker-indicator, +.form-datetime input[type="datetime-local"]::-webkit-calendar-picker-indicator, +.form-time input[type="datetime-local"]::-webkit-calendar-picker-indicator, +.dict-date input[type="datetime-local"]::-webkit-calendar-picker-indicator, +.dict-datetime input[type="datetime-local"]::-webkit-calendar-picker-indicator, +.input-date input[type="datetime-local"]::-webkit-calendar-picker-indicator, +.input-datetime-local input[type="datetime-local"]::-webkit-calendar-picker-indicator, +.input-time input[type="datetime-local"]::-webkit-calendar-picker-indicator, +.editabletree-date input[type="datetime-local"]::-webkit-calendar-picker-indicator, +.editabletree-datetime input[type="datetime-local"]::-webkit-calendar-picker-indicator, +.editabletree-time input[type="datetime-local"]::-webkit-calendar-picker-indicator, +.form-date input[type="time"]::-webkit-calendar-picker-indicator, +.form-datetime input[type="time"]::-webkit-calendar-picker-indicator, +.form-time input[type="time"]::-webkit-calendar-picker-indicator, +.dict-date input[type="time"]::-webkit-calendar-picker-indicator, +.dict-datetime input[type="time"]::-webkit-calendar-picker-indicator, +.input-date input[type="time"]::-webkit-calendar-picker-indicator, +.input-datetime-local input[type="time"]::-webkit-calendar-picker-indicator, +.input-time input[type="time"]::-webkit-calendar-picker-indicator, +.editabletree-date input[type="time"]::-webkit-calendar-picker-indicator, +.editabletree-datetime input[type="time"]::-webkit-calendar-picker-indicator, +.editabletree-time input[type="time"]::-webkit-calendar-picker-indicator { + bottom: 0; + left: 0; + position: absolute; + top: 0; + width: 100%; + height: 100%; +} +.dict-label { + text-align: right; + text-align: end; +} +.form-dict-container { + display: grid; + grid-template-columns: fit-content(50%) 1fr; +} +.dict-row { + display: grid; + grid-template-columns: subgrid; + grid-column: 1 / span 2; + padding: 2px; +} +.calendar { + width: 100%; + height: 100%; +} +.graph { + min-height: 400px; +} +.progress { + margin-bottom: 0px; +} +.window-form .window-form-toolbar { + text-align: right; + text-align: end; +} +.csv .modal-dialog .column-fields { + max-height: 400px; + overflow: auto; + white-space: nowrap; +} +.csv .modal-dialog li.dragged-row { + background-color: #d9edf7; +} +.email .email-richtext { + line-height: 2.5ex; + max-height: 50ex; + min-height: 12.5ex; + overflow: auto; + resize: vertical; +} +.email input[type='file'] { + display: inline-block; +} +.email .close { + float: none; +} +.filter-window select[multiple] { + min-height: 150px; + max-height: 400px; +} +.filter-window select[multiple] option:before { + content: "☐ "; +} +.filter-window select[multiple] option:checked:before { + content: "☑ "; +} +@media screen and (max-width: 767px) { + .form-dict-container { + grid-template-columns: 100%; + } + .dict-row { + grid-column: 1; + } + .dict-label { + text-align: left; + text-align: start; + } + .form-link { + display: none; + } + .form .form-container, + .form .form-hcontainer, + .form .form-vcontainer { + display: block; + } + .form .form-container .form-item, + .form .form-hcontainer .form-item, + .form .form-vcontainer .form-item { + padding: 2px 0; + } + .form .xalign-end { + justify-self: start; + justify-content: start; + } +} +@media screen and (max-width: 767px) { + .responsive.scrollbar { + display: none; + } + .responsive.scrollbar > div { + min-width: unset !important; + } + table.responsive, + table.responsive > thead, + table.responsive > thead > tr, + table.responsive > thead > tr > th:not(.invisible), + table.responsive > tbody, + table.responsive > tbody > tr, + table.responsive > tbody > tr > td:not(.invisible), + table.responsive > tfoot, + table.responsive > tfoot > tr, + table.responsive > tfoot > tr > td:not(.invisible) { + display: block !important; + } + table.responsive > thead > tr > th.invisible, + table.responsive > tbody > tr > td.invisible, + table.responsive > tfoot > tr > td.invisible { + display: none; + } + table.responsive { + min-width: unset !important; + /* Hide table headers (but not display: none; for accessiblity) */ + } + table.responsive > thead > tr { + position: absolute !important; + top: -9999px; + left: -9999px; + } + table.responsive > thead > tr, + table.responsive > tbody > tr > td { + max-width: unset !important; + text-align: left !important; + text-align: start !important; + /* Force height to empty content */ + } + table.responsive > thead > tr > span:empty, + table.responsive > tbody > tr > td > span:empty { + min-height: calc(20px + 5px); + display: block; + } + table.responsive .more-row .btn, + table.responsive .cell .btn { + display: block; + width: 100%; + font-size: 14px; + } + table.responsive tfoot { + background-color: #fff; + border: 1px solid #ddd; + position: sticky; + top: 0; + z-index: 100; + } + table.responsive tfoot > tr > td:empty, + table.responsive tfoot > tr > td > label { + display: none !important; + } + table.responsive tfoot > tr th { + border: none; + } + table.responsive tfoot > tr th > label { + display: inline !important; + } + table.responsive-noheader > tbody > tr > td { + width: 100% !important; + } + table.responsive-header > tbody > tr { + border: 1px solid #ddd; + } + table.responsive-header > tbody > tr > td, + table.responsive-header > tfoot > tr > td { + /* Behave like a "row" */ + border: none; + position: relative; + } + table.responsive-header > tbody > tr > td[data-title]:before, + table.responsive-header > tfoot > tr > td[data-title]:before { + /* Now like a table header */ + position: absolute; + /* Top/left values mimic padding */ + top: 5px; + left: 5px; + padding-right: calc(5px * 2); + text-align: left; + text-align: start; + overflow: hidden; + text-overflow: ellipsis; + /* Label */ + content: attr(data-title); + } + [dir="rtl"] table.responsive-header > tbody > tr > td[data-title]:before, + [dir="rtl"] table.responsive-header > tfoot > tr > td[data-title]:before { + left: unset; + right: 5px; + padding-right: 0; + padding-left: calc(5px * 2); + } + table.responsive-header > tbody > tr > td.required:before, + table.responsive-header > tfoot > tr > td.required:before { + font-weight: bold; + } + table.responsive-header > tbody > tr > td.editable:before, + table.responsive-header > tfoot > tr > td.editable:before { + font-style: italic; + } +} +@keyframes blink { + 50% { + color: transparent; + } +} +#processing { + position: fixed; + top: 0px; + width: 100%; + z-index: 2000; +} +#processing .dot { + animation: 1s blink infinite; +} +#processing .dot:nth-child(2) { + animation-delay: 250ms; +} +#processing .dot:nth-child(3) { + animation-delay: 500ms; +} +.scrollbar { + flex: 0 0 content; + overflow: auto; +} +.scrollbar > div { + height: 5px; +} +.btn-code-scanner { + bottom: 0; + margin: 20px; + position: fixed; + right: 0; + text-align: right; + z-index: 1030; +} +.modal .btn-code-scanner { + margin: 5px; + position: sticky; +} +.infobar { + line-height: 20px; + position: fixed; + top: 30px; + left: 50%; + transform: translateX(-50%); + z-index: 1000; + min-width: 25%; + text-align: center; + font-size: 18px; +} +img.global-search-icon { + width: 2em; + height: 2em; +} +img.favorite-icon { + width: 1em; + height: 1em; +} +/* This file is part of Tryton. The COPYRIGHT file at the top level of + this repository contains the full copyright notices and license terms. */ +.input-icon { + position: relative; +} +.input-icon .icon-input { + position: absolute; + top: 0; + z-index: 4; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; +} +.input-icon .icon-input > .btn { + padding: 0; +} +[dir="ltr"] .input-icon .icon-primary { + left: 0px; +} +[dir="rtl"] .input-icon .icon-primary { + right: 0px; +} +[dir="ltr"] .input-icon .icon-secondary { + right: 0px; +} +[dir="rtl"] .input-icon .icon-secondary { + left: 0px; +} +.input-lg .icon-input, +.input-group-lg .icon-input { + width: 46px; + height: 46px; + line-height: 46px; +} +.input-sm .icon-input, +.input-group-sm .icon-input { + width: 33px; + height: 33px; + line-height: 33px; +} +[dir="ltr"] .input-icon-primary > .form-control { + padding-left: 34px; +} +[dir="ltr"] .input-lg.input-icon-primary > .form-control, +[dir="ltr"] .input-group-lg.input-icon-primary > .form-control { + padding-left: 46px; +} +[dir="ltr"] .input-sm.input-icon-primary > .form-control, +[dir="ltr"] .input-group-sm.input-icon-primary > .form-control { + padding-left: 33px; +} +[dir="rtl"] .input-icon-primary > .form-control { + padding-right: 34px; +} +[dir="rtl"] .input-lg.input-icon-primary > .form-control, +[dir="rtl"] .input-group-lg.input-icon-primary > .form-control { + padding-right: 46px; +} +[dir="rtl"] .input-sm.input-icon-primary > .form-control, +[dir="rtl"] .input-group-sm.input-icon-primary > .form-control { + padding-right: 33px; +} +[dir="ltr"] .input-icon-secondary > .form-control { + padding-right: 34px; +} +[dir="ltr"] .input-lg.input-icon-secondary > .form-control, +[dir="ltr"] .input-group-lg.input-icon-secondary > .form-control { + padding-right: 46px; +} +[dir="ltr"] .input-sm.input-icon-secondary > .form-control, +[dir="ltr"] .input-group-sm.input-icon-secondary > .form-control { + padding-right: 33px; +} +[dir="rtl"] .input-icon-secondary > .form-control { + padding-left: 34px; +} +[dir="rtl"] .input-lg.input-icon-secondary > .form-control, +[dir="rtl"] .input-group-lg.input-icon-secondary > .form-control { + padding-left: 46px; +} +[dir="rtl"] .input-sm.input-icon-secondary > .form-control, +[dir="rtl"] .input-group-sm.input-icon-secondary > .form-control { + padding-left: 33px; +} diff --git a/naliia_sao_custom/custom.js b/naliia_sao_custom/custom.js new file mode 100644 index 0000000..f9a5e95 --- /dev/null +++ b/naliia_sao_custom/custom.js @@ -0,0 +1,9 @@ +//Mudar cores dos ícones do menu lateral +Sao.config.icon_colors = { + 'toolbar_icons':'white', + 'default':'#487b50' +}; + +//Configuração do título do programa (canto superior esquerdo) +Sao.config.bug_url = 'https://ecovida.org.br'; +Sao.config.title = 'RedeEcovida'; diff --git a/naliia_sao_custom/images/body_background.png b/naliia_sao_custom/images/body_background.png new file mode 100644 index 0000000..86bb21a Binary files /dev/null and b/naliia_sao_custom/images/body_background.png differ diff --git a/naliia_sao_custom/images/tryton-icon.png b/naliia_sao_custom/images/tryton-icon.png new file mode 100644 index 0000000..f3ff2dc Binary files /dev/null and b/naliia_sao_custom/images/tryton-icon.png differ diff --git a/naliia_sao_custom/images/tryton-menu.svg b/naliia_sao_custom/images/tryton-menu.svg new file mode 100644 index 0000000..a7897ee --- /dev/null +++ b/naliia_sao_custom/images/tryton-menu.svg @@ -0,0 +1,80 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/naliia_sao_custom/model.js b/naliia_sao_custom/model.js new file mode 100644 index 0000000..6d0ac60 --- /dev/null +++ b/naliia_sao_custom/model.js @@ -0,0 +1,3010 @@ +/* This file is part of Tryton. The COPYRIGHT file at the top level of + this repository contains the full copyright notices and license terms. */ +(function() { + 'use strict'; + + function get_x2m_sub_fields(f_attrs, prefix) { + if (f_attrs.visible && !jQuery.isEmptyObject(f_attrs.views)) { + // There's only one key but we don't know its value + const [[, view],] = Object.entries(f_attrs.views); + + const sub_fields = view.fields || {}; + const x2m_sub_fields = []; + + for (const [s_field, f_def] of Object.entries(sub_fields)) { + x2m_sub_fields.push(`${prefix}.${s_field}`); + + var type_ = f_def.type; + if (['many2one', 'one2one', 'reference'].includes(type_)) { + x2m_sub_fields.push(`${prefix}.${s_field}.rec_name`); + } else if (['selection', 'multiselection'].includes(type_)) { + x2m_sub_fields.push(`${prefix}.${s_field}:string`); + } else if (['one2many', 'many2many'].includes(type_)) { + x2m_sub_fields.push( + ...get_x2m_sub_fields(f_def, `${prefix}.${s_field}`) + ); + } + } + + x2m_sub_fields.push( + `${prefix}._timestamp`, + `${prefix}._write`, + `${prefix}._delete`); + return x2m_sub_fields; + } else { + return []; + } + } + + Sao.Model = Sao.class_(Object, { + init: function(name, attributes) { + attributes = attributes || {}; + this.name = name; + this.session = Sao.Session.current_session; + this.fields = {}; + }, + add_fields: function(descriptions) { + var added = []; + for (var name in descriptions) { + var desc = descriptions[name]; + if (!(name in this.fields)) { + var Field = Sao.field.get(desc.type); + this.fields[name] = new Field(desc); + added.push(name); + } else { + jQuery.extend(this.fields[name].description, desc); + } + } + return added; + }, + execute: function( + method, params, context={}, async=true, + process_exception=true) { + var args = { + 'method': 'model.' + this.name + '.' + method, + 'params': params.concat(context) + }; + return Sao.rpc(args, this.session, async, process_exception); + }, + copy: function(records, context) { + if (jQuery.isEmptyObject(records)) { + return jQuery.when(); + } + var record_ids = records.map(function(record) { + return record.id; + }); + return this.execute('copy', [record_ids, {}], context); + } + }); + + Sao.Group = function(model, context, array) { + array.prm = jQuery.when(); + array.model = model; + array._context = context; + array.on_write = []; + array.parent = undefined; + array.screens = []; + array.parent_name = ''; + array.children = []; + array.child_name = ''; + array.parent_datetime_field = undefined; + array.record_removed = []; + array.record_deleted = []; + array.__readonly = false; + array.exclude_field = null; + array.skip_model_access = false; + array.forEach(function(e, i, a) { + e.group = a; + }); + Object.defineProperty(array, 'readonly', { + get: function() { + // Must skip res.user for Preference windows + var access = Sao.common.MODELACCESS.get(this.model.name); + if (this.context._datetime || + (!(access.write || access.create) && + !this.skip_model_access)) { + return true; + } + return this.__readonly; + }, + set: function(value) { + this.__readonly = value; + } + }); + array.load = function(ids, modified=false, position=-1, preloaded=null) { + if (position == -1) { + position = this.length; + } + var new_records = []; + for (const id of ids) { + let new_record = this.get(id); + if (!new_record) { + new_record = new Sao.Record(this.model, id); + new_record.group = this; + this.splice(position, 0, new_record); + position += 1; + } + if (preloaded && (id in preloaded)) { + new_record.set(preloaded[id], false, false); + } + new_records.push(new_record); + } + // Remove previously removed or deleted records + var record_removed = []; + for (const record of this.record_removed) { + if (!~ids.indexOf(record.id)) { + record_removed.push(record); + } + } + this.record_removed = record_removed; + var record_deleted = []; + for (const record of this.record_deleted) { + if (!~ids.indexOf(record.id)) { + record_deleted.push(record); + } + } + this.record_deleted = record_deleted; + if (new_records.length && modified) { + for (const record of new_records) { + record.modified_fields.id = true; + } + this.record_modified(); + } + }; + array.get = function(id) { + // TODO optimize + for (const record of this) { + if (record.id == id) { + return record; + } + } + }; + array.new_ = function(default_, id, defaults=null) { + var record = new Sao.Record(this.model, id); + record.group = this; + if (default_) { + record.default_get(defaults); + } + return record; + }; + array.add = function(record, position=-1, modified=true) { + if (position == -1) { + position = this.length; + } + position = Math.min(position, this.length); + if (record.group != this) { + record.group = this; + } + if (this.indexOf(record) < 0) { + this.splice(position, 0, record); + } + for (var record_rm of this.record_removed) { + if (record_rm.id == record.id) { + this.record_removed.splice( + this.record_removed.indexOf(record_rm), 1); + } + } + for (var record_del of this.record_deleted) { + if (record_del.id == record.id) { + this.record_deleted.splice( + this.record_deleted.indexOf(record_del), 1); + } + } + record.modified_fields.id = true; + if (modified) { + // Set parent field to trigger on_change + if (this.parent && this.model.fields[this.parent_name]) { + var field = this.model.fields[this.parent_name]; + if ((field instanceof Sao.field.Many2One) || + field instanceof Sao.field.Reference) { + var value = [this.parent.id, '']; + if (field instanceof Sao.field.Reference) { + value = [this.parent.model.name, value]; + } + field.set_client(record, value); + } + } + } + return record; + }; + array.remove = function( + record, remove, force_remove=false, modified=true) { + if (record.id >= 0) { + if (remove) { + if (~this.record_deleted.indexOf(record)) { + this.record_deleted.splice( + this.record_deleted.indexOf(record), 1); + } + if (!~this.record_removed.indexOf(record)) { + this.record_removed.push(record); + } + } else { + if (~this.record_removed.indexOf(record)) { + this.record_removed.splice( + this.record_removed.indexOf(record), 1); + } + if (!~this.record_deleted.indexOf(record)) { + this.record_deleted.push(record); + } + } + } + record.modified_fields.id = true; + if ((record.id < 0) || + (this.parent && this.parent.id < 0) || + force_remove) { + this._remove(record); + } + if (modified) { + this.record_modified(); + } + }; + array._remove = function(record) { + var idx = this.indexOf(record); + this.splice(idx, 1); + record.destroy(); + }; + array.unremove = function(record) { + this.record_removed.splice(this.record_removed.indexOf(record), 1); + this.record_deleted.splice(this.record_deleted.indexOf(record), 1); + record.group.record_modified(); + }; + array.clear = function() { + this.splice(0, this.length); + this.record_removed = []; + this.record_deleted = []; + }; + array.record_modified = function() { + if (!this.parent) { + for (const screen of this.screens) { + screen.record_modified(); + } + } else { + this.parent.modified_fields[this.child_name] = true; + this.parent.model.fields[this.child_name].changed(this.parent); + this.parent.validate(null, true, false); + this.parent.group.record_modified(); + } + }; + array.record_notify = function(notifications) { + for (const screen of this.screens) { + screen.record_notify(notifications); + } + }; + array.delete_ = function(records) { + if (jQuery.isEmptyObject(records)) { + return jQuery.when(); + } + var root_group = this.root_group; + Sao.Logger.assert(records.every( + r => r.model.name == this.model.name), + 'records not from the same model'); + Sao.Logger.assert(records.every( + r => r.group.root_group == root_group), + 'records not from the same root group'); + records = records.filter(record => record.id >= 0); + var context = this.context; + context._timestamp = {}; + for (const record of records) { + jQuery.extend(context._timestamp, record.get_timestamp()); + } + var record_ids = records.map(function(record) { + return record.id; + }); + return root_group.on_write_ids(record_ids).then(reload_ids => { + for (const record of records) { + record.destroy(); + } + reload_ids = reload_ids.filter(e => !~record_ids.indexOf(e)); + return this.model.execute('delete', [record_ids], context) + .then(() => { + root_group.reload(reload_ids); + }); + }); + }; + Object.defineProperty(array, 'root_group', { + get: function() { + var root = this; + var parent = this.parent; + while (parent) { + root = parent.group; + parent = parent.parent; + } + return root; + } + }); + array.save = function() { + var deferreds = []; + this.forEach(record => { + deferreds.push(record.save()); + }); + if (!jQuery.isEmptyObject(this.record_deleted)) { + for (const record of this.record_deleted) { + this._remove(record); + } + deferreds.push(this.delete_(this.record_deleted)); + this.record_deleted.splice(0, this.record_deleted.length); + } + return jQuery.when.apply(jQuery, deferreds); + }; + array.written = function(ids) { + if (typeof(ids) == 'number') { + ids = [ids]; + } + return this.on_write_ids(ids).then(to_reload => { + to_reload = to_reload.filter(e => !~ids.indexOf(e)); + this.root_group.reload(to_reload); + }); + }; + array.reload = function(ids) { + for (const child of this.children) { + child.reload(ids); + } + for (const id of ids) { + const record = this.get(id); + if (record && jQuery.isEmptyObject(record.modified_fields)) { + record.cancel(); + } + } + }; + array.on_write_ids = function(ids) { + var deferreds = []; + var result = []; + this.on_write.forEach(fnct => { + var prm = this.model.execute(fnct, [ids], this._context) + .then(res => { + jQuery.extend(result, res); + }); + deferreds.push(prm); + }); + return jQuery.when.apply(jQuery, deferreds).then( + () => result.filter((e, i, a) => i == a.indexOf(e))); + }; + array.set_parent = function(parent) { + this.parent = parent; + if (parent && parent.model.name == this.model.name) { + this.parent.group.children.push(this); + } + }; + array.add_fields = function(fields) { + var added = this.model.add_fields(fields); + if (jQuery.isEmptyObject(this)) { + return; + } + var new_ = []; + for (const record of this) { + if (record.id < 0) { + new_.push(record); + } + } + if (new_.length && added.length) { + this.model.execute('default_get', [added, this.context]) + .then(values => { + for (const record of new_) { + record.set_default(values, true, false); + } + this.record_modified(); + }); + } + }; + array.destroy = function() { + if (this.parent) { + var i = this.parent.group.children.indexOf(this); + if (~i) { + this.parent.group.children.splice(i, 1); + } + } + this.parent = null; + }; + Object.defineProperty(array, 'domain', { + get: function() { + var domain = []; + for (const screen of this.screens) { + if (screen.attributes.domain) { + domain.push(screen.attributes.domain); + } + } + if (this.parent && this.child_name) { + var field = this.parent.model.fields[this.child_name]; + return [domain, field.get_domain(this.parent)]; + } else { + return domain; + } + } + }); + Object.defineProperty(array, 'context', { + get: function() { + return this._get_context(); + }, + set: function(context) { + this._context = jQuery.extend({}, context); + } + }); + Object.defineProperty(array, 'local_context', { + get: function() { + return this._get_context(true); + } + }); + array._get_context = function(local) { + var context; + if (!local) { + context = jQuery.extend({}, this.model.session.context); + } else { + context = {}; + } + if (this.parent) { + var parent_context = this.parent.get_context(local); + jQuery.extend(context, parent_context); + if (this.child_name in this.parent.model.fields) { + var field = this.parent.model.fields[this.child_name]; + jQuery.extend(context, field.get_context( + this.parent, parent_context, local)); + } + } + jQuery.extend(context, this._context); + if (this.parent_datetime_field) { + context._datetime = this.parent.get_eval()[ + this.parent_datetime_field]; + } + return context; + }; + array.clean4inversion = function(domain) { + if (jQuery.isEmptyObject(domain)) { + return []; + } + var inversion = new Sao.common.DomainInversion(); + var head = domain[0]; + var tail = domain.slice(1); + if (~['AND', 'OR'].indexOf(head)) { + // pass + } else if (inversion.is_leaf(head)) { + var field = head[0]; + if ((field in this.model.fields) && + (this.model.fields[field].description.readonly)) { + head = []; + } + } else { + head = this.clean4inversion(head); + } + return [head].concat(this.clean4inversion(tail)); + }; + array.domain4inversion = function() { + var domain = this.domain; + if (!this.__domain4inversion || + !Sao.common.compare(this.__domain4inversion[0], domain)) { + this.__domain4inversion = [domain, this.clean4inversion(domain)]; + } + return this.__domain4inversion[1]; + }; + array.get_by_path = function(path) { + path = jQuery.extend([], path); + var record = null; + var group = this; + + var browse_child = function() { + if (jQuery.isEmptyObject(path)) { + return record; + } + var child_name = path[0][0]; + var id = path[0][1]; + path.splice(0, 1); + record = group.get(id); + if (!record) { + return null; + } + if (!child_name) { + return browse_child(); + } + return record.load(child_name).then(function() { + group = record._values[child_name]; + if (!group) { + return null; + } + return browse_child(); + }); + }; + return jQuery.when().then(browse_child); + }; + array.set_sequence = function(field, position) { + var changed = false; + var prev = null; + var index, update, value, cmp; + if (position === 0) { + cmp = function(a, b) { return a > b; }; + } else { + cmp = function(a, b) { return a < b; }; + } + for (const record of this) { + if (record.get_loaded([field]) || changed || record.id < 0) { + if (prev) { + prev.load(field, false); + index = prev.field_get(field); + } else { + index = null; + } + update = false; + value = record.field_get(field); + if (value === null) { + if (index) { + update = true; + } else if (prev) { + if (record.id >= 0) { + update = cmp(record.id, prev.id); + } else if (position === 0) { + update = true; + } + } + } else if (value === index) { + if (prev) { + if (record.id >= 0) { + update = cmp(record.id, prev.id); + } else if (position === 0) { + update = true; + } + } + } else if (value <= (index || 0)) { + update = true; + } + if (update) { + if (index === null) { + index = 0; + } + index += 1; + record.field_set_client(field, index); + changed = record; + } + } + prev = record; + } + }; + return array; + }; + + Sao.Record = Sao.class_(Object, { + id_counter: -1, + init: function(model, id=null) { + this.model = model; + this.group = Sao.Group(model, {}, []); + if (id === null) { + this.id = Sao.Record.prototype.id_counter; + } else { + this.id = id; + } + if (this.id < 0) { + Sao.Record.prototype.id_counter--; + } + this._values = {}; + this.modified_fields = {}; + this._loaded = {}; + this.fields = {}; + this._timestamp = null; + this._write = true; + this._delete = true; + this.resources = null; + this.button_clicks = {}; + this.links_counts = {}; + this.state_attrs = {}; + this.autocompletion = {}; + this.exception = false; + this.destroyed = false; + this._save_prm = jQuery.when(); + }, + get modified() { + if (!jQuery.isEmptyObject(this.modified_fields)) { + Sao.Logger.info( + "Modified fields of %s@%s", this.id, this.model.name, + Object.keys(this.modified_fields)); + return true; + } else { + return false; + } + }, + save: function(force_reload=false) { + var context = this.get_context(); + if (this._save_prm.state() == 'pending') { + return this._save_prm.then(() => this.save(force_reload)); + } + var prm = jQuery.when(); + if ((this.id < 0) || this.modified) { + var values = this.get(); + if (this.id < 0) { + prm = this.model.execute('create', [[values]], context) + .then(ids => this.id = ids[0]); + } else { + if (!jQuery.isEmptyObject(values)) { + context._timestamp = this.get_timestamp(); + prm = this.model.execute( + 'write', [[this.id], values], context); + } + } + prm = prm.then(() => { + this.cancel(); + if (force_reload) { + return this.reload(); + } + }); + if (this.group) { + prm = prm.then(() => this.group.written(this.id)); + } + } + if (this.group.parent) { + delete this.group.parent.modified_fields[this.group.child_name]; + prm = prm.then(() => this.group.parent.save(force_reload)); + } + this._save_prm = prm; + return prm; + }, + reload: function(fields, async=true) { + if (this.id < 0) { + return async? jQuery.when() : null; + } + if (!fields) { + return this.load('*', async); + } else if (!async) { + for (let field of fields) { + this.load(field, async); + } + } else { + var prms = fields.map(field => this.load(field)); + return jQuery.when.apply(jQuery, prms); + } + }, + is_loaded: function(name) { + return ((this.id < 0) || (name in this._loaded)); + }, + load: function(name, async=true, process_exception=true) { + var fname; + if (this.destroyed || this.is_loaded(name)) { + if (async) { + return jQuery.when(); + } else if (name !== '*') { + return this.model.fields[name]; + } else { + return; + } + } + if (async && this.group.prm.state() == 'pending') { + return this.group.prm.then(() => this.load(name)); + } + var id2record = {}; + id2record[this.id] = this; + var loading, views, field; + if (name == '*') { + loading = 'eager'; + views = new Set(); + for (fname in this.model.fields) { + field = this.model.fields[fname]; + if ((field.description.loading || 'eager') == 'lazy') { + loading = 'lazy'; + } + for (const view of field.views) { + views.add(view); + } + } + } else { + loading = this.model.fields[name].description.loading || 'eager'; + views = this.model.fields[name].views; + } + var fields = {}; + var views_operator; + if (loading == 'eager') { + for (fname in this.model.fields) { + field = this.model.fields[fname]; + if ((field.description.loading || 'eager') == 'eager') { + fields[fname] = field; + } + } + views_operator = views.isSubsetOf.bind(views); + } else { + fields = this.model.fields; + views_operator = function(view) { + return Boolean(this.intersection(view).size); + }.bind(views); + } + var fnames = []; + for (fname in fields) { + field = fields[fname]; + if (!(fname in this._loaded) && + (!views.size || + views_operator(new Set(field.views)))) { + fnames.push(fname); + } + } + var related_read_limit = null; + var fnames_to_fetch = fnames.slice(); + var rec_named_fields = ['many2one', 'one2one', 'reference']; + const selection_fields = ['selection', 'multiselection']; + for (const fname of fnames) { + var fdescription = this.model.fields[fname].description; + if (~rec_named_fields.indexOf(fdescription.type)) + fnames_to_fetch.push(fname + '.rec_name'); + else if (~selection_fields.indexOf(fdescription.type) && + ((fdescription.loading || 'lazy') == 'eager')) { + fnames_to_fetch.push(fname + ':string'); + } else if ( + ['many2many', 'one2many'].includes(fdescription.type)) { + var sub_fields = get_x2m_sub_fields(fdescription, fname); + fnames_to_fetch = [ ...fnames_to_fetch, ...sub_fields]; + if (sub_fields.length > 0) { + related_read_limit = Sao.config.display_size; + } + } + } + if (!~fnames.indexOf('rec_name')) { + fnames_to_fetch.push('rec_name'); + } + fnames_to_fetch.push('_timestamp'); + fnames_to_fetch.push('_write'); + fnames_to_fetch.push('_delete'); + + var context = jQuery.extend({}, this.get_context()); + if (related_read_limit) { + context.related_read_limit = related_read_limit; + } + if (loading == 'eager') { + var limit = Math.trunc(Sao.config.limit / + Math.min(fnames_to_fetch.length, 10)); + + const filter_group = record => { + return (!record.destroyed && + (record.id >= 0) && + !(name in record._loaded)); + }; + const filter_parent_group = record => { + return (filter_group(record) && + (id2record[record.id] === undefined) && + ((record.group === this.group) || + // Don't compute context for same group + (JSON.stringify(record.get_context()) === + JSON.stringify(context)))); + }; + var group, filter; + if (this.group.parent && + (this.group.parent.model.name == this.model.name)) { + group = []; + group = group.concat.apply( + group, this.group.parent.group.children); + filter = filter_parent_group; + } else { + group = this.group; + filter = filter_group; + } + var idx = group.indexOf(this); + if (~idx) { + var length = group.length; + var n = 1; + while ((Object.keys(id2record).length < limit) && + ((idx - n >= 0) || (idx + n < length)) && + (n < 2 * limit)) { + var record; + if (idx - n >= 0) { + record = group[idx - n]; + if (filter(record)) { + id2record[record.id] = record; + } + } + if (idx + n < length) { + record = group[idx + n]; + if (filter(record)) { + id2record[record.id] = record; + } + } + n++; + } + } + } + + for (fname in this.model.fields) { + if ((this.model.fields[fname].description.type == 'binary') && + ~fnames_to_fetch.indexOf(fname, fnames_to_fetch)) { + context[this.model.name + '.' + fname] = 'size'; + } + } + var result = this.model.execute('read', [ + Object.keys(id2record).map( e => parseInt(e, 10)), + fnames_to_fetch], context, async, process_exception); + const succeed = (values, exception=false) => { + var id2value = {}; + for (const e of values) { + id2value[e.id] = e; + } + for (var id in id2record) { + var record = id2record[id]; + if (!record.exception) { + record.exception = exception; + } + var value = id2value[id]; + if (record && value) { + for (var key in this.modified_fields) { + delete value[key]; + } + record.set(value, false); + } + } + }; + const failed = () => { + var failed_values = []; + var default_values = {}; + for (let fname of fnames_to_fetch) { + if (fname != 'id') { + default_values[fname] = null; + } + } + + for (let id in id2record) { + failed_values.push(Object.assign({'id': id}, default_values)); + } + return succeed(failed_values, true); + }; + if (async) { + this.group.prm = result.then(succeed, failed); + return this.group.prm; + } else { + if (result) { + succeed(result); + } else { + failed(); + } + if (name !== '*') { + return this.model.fields[name]; + } else { + return; + } + } + }, + set: function(values, modified=true, validate=true) { + var name, value; + var later = {}; + var fieldnames = []; + for (name in values) { + value = values[name]; + if (name == '_timestamp') { + // Always keep the older timestamp + if (!this._timestamp) { + this._timestamp = value; + } + continue; + } + if (name == '_write' || name == '_delete') { + this[name] = value; + continue; + } + if (!(name in this.model.fields)) { + if (name == 'rec_name') { + this._values[name] = value; + } + continue; + } + if (this.model.fields[name] instanceof Sao.field.One2Many) { + later[name] = value; + continue; + } + const field = this.model.fields[name]; + var related; + if ((field instanceof Sao.field.Many2One) || + (field instanceof Sao.field.Reference)) { + related = name + '.'; + this._values[related] = values[related] || {}; + } else if ((field instanceof Sao.field.Selection) || + (field instanceof Sao.field.MultiSelection)) { + related = name + ':string'; + if (name + ':string' in values) { + this._values[related] = values[related]; + } else { + delete this._values[related]; + } + } + this.model.fields[name].set(this, value); + this._loaded[name] = true; + fieldnames.push(name); + } + for (name in later) { + value = later[name]; + this.model.fields[name].set(this, value, false, values[`${name}.`]); + this._loaded[name] = true; + fieldnames.push(name); + } + if (validate) { + this.validate(fieldnames, true, false); + } + if (modified) { + this.set_modified(); + } + }, + get: function() { + var value = {}; + for (var name in this.model.fields) { + var field = this.model.fields[name]; + if (field.description.readonly && + !((field instanceof Sao.field.One2Many) && + !(field instanceof Sao.field.Many2Many))) { + continue; + } + if ((this.modified_fields[name] === undefined) && this.id >= 0) { + continue; + } + value[name] = field.get(this); + // Sending an empty x2MField breaks ModelFieldAccess.check + if ((field instanceof Sao.field.One2Many) && + (value[name].length === 0)) { + delete value[name]; + } + } + return value; + }, + invalid_fields: function() { + var fields = {}; + for (var fname in this.model.fields) { + var field = this.model.fields[fname]; + var invalid = field.get_state_attrs(this).invalid; + if (invalid) { + fields[fname] = invalid; + } + } + return fields; + }, + get_context: function(local) { + if (!local) { + return this.group.context; + } else { + return this.group.local_context; + } + }, + field_get: function(name) { + return this.model.fields[name].get(this); + }, + field_set: function(name, value) { + this.model.fields[name].set(this, value); + }, + field_get_client: function(name) { + return this.model.fields[name].get_client(this); + }, + field_set_client: function(name, value, force_change) { + this.model.fields[name].set_client(this, value, force_change); + }, + default_get: function(defaults=null) { + if (!jQuery.isEmptyObject(this.model.fields)) { + var context = this.get_context(); + if (defaults) { + for (const name in defaults) { + Sao.setdefault(context, `default_${name}` ,defaults[name]); + } + } + var prm = this.model.execute('default_get', + [Object.keys(this.model.fields)], context); + return prm.then(values => { + if (this.group.parent && + this.group.parent_name in this.group.model.fields) { + var parent_field = + this.group.model.fields[this.group.parent_name]; + if (parent_field instanceof Sao.field.Reference) { + values[this.group.parent_name] = [ + this.group.parent.model.name, + this.group.parent.id]; + } else if (parent_field.description.relation == + this.group.parent.model.name) { + values[this.group.parent_name] = + this.group.parent.id; + } + } + return this.set_default(values); + }); + } + return jQuery.when(); + }, + set_default: function(values, validate=true, modified=true) { + var promises = []; + var fieldnames = []; + for (var fname in values) { + if ((fname == '_write') || + (fname == '_delete') || + (fname == '_timestamp')) { + this[fname] = values[fname]; + continue; + } + var value = values[fname]; + if (!(fname in this.model.fields)) { + continue; + } + if (fname == this.group.exclude_field) { + continue; + } + if ((this.model.fields[fname] instanceof Sao.field.Many2One) || + (this.model.fields[fname] instanceof Sao.field.Reference)) { + var related = fname + '.'; + this._values[related] = values[related] || {}; + } + promises.push(this.model.fields[fname].set_default(this, value)); + this._loaded[fname] = true; + fieldnames.push(fname); + } + return jQuery.when.apply(jQuery, promises).then(() => { + this.on_change(fieldnames); + this.on_change_with(fieldnames); + if (validate) { + return this.validate(null, true); + } + if (modified) { + this.set_modified(); + return jQuery.when.apply( + jQuery, this.group.root_group.screens + .map(screen => screen.display())); + } + }); + }, + get_timestamp: function() { + var timestamps = {}; + timestamps[this.model.name + ',' + this.id] = this._timestamp; + for (var fname in this.model.fields) { + if (!(fname in this._loaded)) { + continue; + } + jQuery.extend(timestamps, + this.model.fields[fname].get_timestamp(this)); + } + return timestamps; + }, + get_eval: function() { + var value = {}; + for (var key in this.model.fields) { + if (!(key in this._loaded) && this.id >= 0) + continue; + value[key] = this.model.fields[key].get_eval(this); + } + value.id = this.id; + return value; + }, + get_on_change_value: function(skip) { + var value = {}; + for (var key in this.model.fields) { + if (skip && ~skip.indexOf(key)) { + continue; + } + if ((this.id >= 0) && + (!this._loaded[key] || !this.modified_fields[key])) { + continue; + } + value[key] = this.model.fields[key].get_on_change_value(this); + } + value.id = this.id; + return value; + }, + _get_on_change_args: function(args) { + var result = {}; + var values = Sao.common.EvalEnvironment(this, 'on_change'); + for (const arg of args) { + var scope = values; + for (const e of arg.split('.')) { + if (scope !== undefined) { + scope = scope[e]; + } + } + result[arg] = scope; + } + return result; + }, + on_change: function(fieldnames) { + var values = {}; + for (const fieldname of fieldnames) { + var on_change = this.model.fields[fieldname] + .description.on_change; + if (!jQuery.isEmptyObject(on_change)) { + values = jQuery.extend(values, + this._get_on_change_args(on_change)); + } + } + let modified = new Set(fieldnames); + if (!jQuery.isEmptyObject(values)) { + values.id = this.id; + var changes; + try { + if ((fieldnames.length == 1) || + (values.id === undefined)) { + changes = []; + for (const fieldname of fieldnames) { + changes.push(this.model.execute( + 'on_change_' + fieldname, + [values], this.get_context(), false)); + } + } else { + changes = [this.model.execute( + 'on_change', + [values, fieldnames], this.get_context(), false)]; + } + } catch (e) { + return; + } + changes.forEach((values) => { + this.set_on_change(values); + for (let fieldname in values) { + modified.add(fieldname); + } + }); + } + + var notification_fields = Sao.common.MODELNOTIFICATION.get( + this.model.name); + if (modified.intersection(new Set(notification_fields)).size) { + values = this._get_on_change_args(notification_fields); + this.model.execute( + 'on_change_notify', [values], this.get_context()) + .then(this.group.record_notify.bind(this.group)); + } + }, + on_change_with: function(field_names) { + var fieldnames = {}; + var values = {}; + var later = {}; + var fieldname, on_change_with; + for (fieldname in this.model.fields) { + on_change_with = this.model.fields[fieldname] + .description.on_change_with; + if (jQuery.isEmptyObject(on_change_with)) { + continue; + } + for (var i = 0; i < field_names.length; i++) { + if (~on_change_with.indexOf(field_names[i])) { + break; + } + } + if (i >= field_names.length) { + continue; + } + if (!jQuery.isEmptyObject(Sao.common.intersect( + Object.keys(fieldnames).sort(), + on_change_with.sort()))) { + later[fieldname] = true; + continue; + } + fieldnames[fieldname] = true; + values = jQuery.extend(values, + this._get_on_change_args( + on_change_with.concat([fieldname]))); + if ((this.model.fields[fieldname] instanceof + Sao.field.Many2One) || + (this.model.fields[fieldname] instanceof + Sao.field.Reference)) { + delete this._values[fieldname + '.']; + } + } + var changed; + fieldnames = Object.keys(fieldnames); + if (fieldnames.length) { + try { + if ((fieldnames.length == 1) || + (values.id === undefined)) { + changed = {}; + for (const fieldname of fieldnames) { + changed = jQuery.extend( + changed, + this.model.execute( + 'on_change_with_' + fieldname, + [values], this.get_context(), false)); + } + } else { + values.id = this.id; + changed = this.model.execute( + 'on_change_with', + [values, fieldnames], this.get_context(), false); + } + } catch (e) { + return; + } + this.set_on_change(changed); + } + if (!jQuery.isEmptyObject(later)) { + values = {}; + for (const fieldname in later) { + on_change_with = this.model.fields[fieldname] + .description.on_change_with; + values = jQuery.extend( + values, + this._get_on_change_args( + on_change_with.concat([fieldname]))); + } + fieldnames = Object.keys(later); + try { + if ((fieldnames.length == 1) || + (values.id === undefined)) { + changed = {}; + for (const fieldname of fieldnames) { + changed = jQuery.extend( + changed, + this.model.execute( + 'on_change_with_' + fieldname, + [values], this.get_context(), false)); + } + } else { + values.id = this.id; + changed = this.model.execute( + 'on_change_with', + [values, fieldnames], this.get_context(), false); + } + } catch (e) { + return; + } + this.set_on_change(changed); + } + let notification_fields = Sao.common.MODELNOTIFICATION.get( + this.model.name); + if (new Set(field_names).intersection(new Set(notification_fields)).size) { + values = this._get_on_change_args(notification_fields); + this.model.execute( + 'on_change_notify', [values], this.get_context()) + .then(this.group.record_notify.bind(this.group)); + } + }, + set_on_change: function(values) { + var fieldname, value; + for (fieldname in values) { + value = values[fieldname]; + if (!(fieldname in this.model.fields)) { + continue; + } + if ((this.model.fields[fieldname] instanceof + Sao.field.Many2One) || + (this.model.fields[fieldname] instanceof + Sao.field.Reference)) { + var related = fieldname + '.'; + this._values[related] = values[related] || {}; + } + this.load(fieldname, false).set_on_change(this, value); + } + }, + autocomplete_with: function(fieldname) { + for (var fname in this.model.fields) { + var field = this.model.fields[fname]; + var autocomplete = field.description.autocomplete || []; + if (!~autocomplete.indexOf(fieldname)) { + continue; + } + this.do_autocomplete(fname); + } + }, + do_autocomplete: function(fieldname) { + this.autocompletion[fieldname] = []; + var field = this.model.fields[fieldname]; + var autocomplete = field.description.autocomplete; + var values = this._get_on_change_args(autocomplete); + var result; + try { + result = this.model.execute( + 'autocomplete_' + fieldname, [values], this.get_context(), + false, false); + } catch (e) { + result = []; + } + this.autocompletion[fieldname] = result; + }, + on_scan_code: function(code, depends) { + depends = this.expr_eval(depends); + var values = this._get_on_change_args(depends); + values.id = this.id; + return this.model.execute( + 'on_scan_code', [values, code], this.get_context(), + true, false).then((changes) => { + this.set_on_change(changes); + this.set_modified(); + return !jQuery.isEmptyObject(changes); + }); + }, + reset: function(value) { + this.cancel(); + this.set(value, true); + if (this.group.parent) { + this.group.parent.on_change([this.group.child_name]); + this.group.parent.on_change_with([this.group.child_name]); + } + }, + expr_eval: function(expr) { + if (typeof(expr) != 'string') return expr; + if (!expr) { + return; + } else if (expr == '[]') { + return []; + } else if (expr == '{}') { + return {}; + } + var ctx = this.get_eval(); + ctx.context = this.get_context(); + ctx.active_model = this.model.name; + ctx.active_id = this.id; + if (this.group.parent && this.group.parent_name) { + var parent_env = Sao.common.EvalEnvironment(this.group.parent); + ctx['_parent_' + this.group.parent_name] = parent_env; + } + return new Sao.PYSON.Decoder(ctx).decode(expr); + }, + rec_name: function() { + var prm = this.model.execute('read', [[this.id], ['rec_name']], + this.get_context()); + return prm.then(function(values) { + return values[0].rec_name; + }); + }, + validate: function(fields, softvalidation, pre_validate) { + var result = true; + for (var fname in this.model.fields) { + var field = this.model.fields[fname]; + if (fields && !~fields.indexOf(fname)) { + continue; + } + if (!this.get_loaded([fname])) { + continue; + } + if (field.description.readonly) { + continue; + } + if (fname == this.group.exclude_field) { + continue; + } + if (!field.validate(this, softvalidation, pre_validate)) { + result = false; + } + } + return result; + }, + pre_validate: function() { + if (jQuery.isEmptyObject(this.modified_fields)) { + return jQuery.Deferred().resolve(true); + } + var values = this._get_on_change_args( + Object.keys(this.modified_fields).concat(['id'])); + return this.model.execute('pre_validate', + [values], this.get_context()); + }, + cancel: function() { + this._loaded = {}; + this._values = {}; + this.modified_fields = {}; + this._timestamp = null; + this.button_clicks = {}; + this.links_counts = {}; + this.exception = false; + }, + _check_load: function(fields) { + if (!this.get_loaded(fields)) { + this.reload(fields, false); + } + }, + get_loaded: function(fields) { + if (this.id < 0) { + return true; + } + if (!fields) { + fields = Object.keys(this.model.fields); + } + fields = new Set(fields); + var loaded = new Set(Object.keys(this._loaded)); + loaded = loaded.union(new Set(Object.keys(this.modified_fields))); + return fields.isSubsetOf(loaded); + }, + get root_parent() { + var parent = this; + while (parent.group.parent) { + parent = parent.group.parent; + } + return parent; + }, + get_path: function(group) { + var path = []; + var i = this; + var child_name = ''; + while (i) { + path.push([child_name, i.id]); + if (i.group === group) { + break; + } + child_name = i.group.child_name; + i = i.group.parent; + } + path.reverse(); + return path; + }, + get_index_path: function(group) { + var path = [], + record = this; + while (record) { + path.push(record.group.indexOf(record)); + if (record.group === group) { + break; + } + record = record.group.parent; + } + path.reverse(); + return path; + }, + children_group: function(field_name) { + if (!field_name) { + return []; + } + this._check_load([field_name]); + var group = this._values[field_name]; + if (group === undefined) { + return; + } + + if (group.model.fields !== this.group.model.fields) { + jQuery.extend(this.group.model.fields, group.model.fields); + group.model.fields = this.group.model.fields; + } + group.on_write = this.group.on_write; + group.readonly = this.group.readonly; + jQuery.extend(group._context, this.group._context); + return group; + }, + get deleted() { + return Boolean(~this.group.record_deleted.indexOf(this)); + }, + get removed() { + return Boolean(~this.group.record_removed.indexOf(this)); + }, + get readonly() { + return (this.deleted || + this.removed || + this.exception || + this.group.readonly || + !this._write); + }, + get deletable() { + return this._delete; + }, + get identity() { + return JSON.stringify( + Object.keys(this._values).reduce((values, name) => { + var field = this.model.fields[name]; + if (field) { + if (field instanceof Sao.field.Binary) { + values[name] = field.get_size(this); + } else { + values[name] = field.get(this); + } + } + return values; + }, {})); + }, + set_field_context: function() { + for (var name in this.model.fields) { + var field = this.model.fields[name]; + var value = this._values[name]; + if (!(value instanceof Array)) { + continue; + } + var context_descriptor = Object.getOwnPropertyDescriptor( + value, 'context'); + if (!context_descriptor || !context_descriptor.set) { + continue; + } + var context = field.description.context; + if (context) { + value.context = this.expr_eval(context); + } + } + }, + get_resources: function(reload) { + var prm; + if ((this.id >= 0) && (!this.resources || reload)) { + prm = this.model.execute( + 'resources', [this.id], this.get_context()) + .then(resources => { + this.resources = resources; + return resources; + }); + } else { + prm = jQuery.when(this.resources); + } + return prm; + }, + get_button_clicks: function(name) { + if (this.id < 0) { + return jQuery.when(); + } + var clicks = this.button_clicks[name]; + if (clicks !== undefined) { + return jQuery.when(clicks); + } + return Sao.rpc({ + 'method': 'model.ir.model.button.click.get_click', + 'params': [this.model.name, name, this.id, {}], + }, this.model.session).then(clicks => { + this.button_clicks[name] = clicks; + return clicks; + }); + }, + set_modified: function(field) { + if (field) { + this.modified_fields[field] = true; + } + this.group.record_modified(); + }, + destroy: function() { + var vals = Object.values(this._values); + for (const val of vals) { + if (val && + Object.prototype.hasOwnProperty.call(val, 'destroy')) { + val.destroy(); + } + } + this.destroyed = true; + } + }); + + + Sao.field = {}; + + Sao.field.get = function(type) { + switch (type) { + case 'char': + return Sao.field.Char; + case 'selection': + return Sao.field.Selection; + case 'multiselection': + return Sao.field.MultiSelection; + case 'datetime': + case 'timestamp': + return Sao.field.DateTime; + case 'date': + return Sao.field.Date; + case 'time': + return Sao.field.Time; + case 'timedelta': + return Sao.field.TimeDelta; + case 'float': + return Sao.field.Float; + case 'numeric': + return Sao.field.Numeric; + case 'integer': + return Sao.field.Integer; + case 'boolean': + return Sao.field.Boolean; + case 'many2one': + return Sao.field.Many2One; + case 'one2one': + return Sao.field.One2One; + case 'one2many': + return Sao.field.One2Many; + case 'many2many': + return Sao.field.Many2Many; + case 'reference': + return Sao.field.Reference; + case 'binary': + return Sao.field.Binary; + case 'dict': + return Sao.field.Dict; + default: + return Sao.field.Char; + } + }; + + Sao.field.Field = Sao.class_(Object, { + _default: null, + _single_value: true, + init: function(description) { + this.description = description; + this.name = description.name; + this.views = new Set(); + }, + set: function(record, value) { + record._values[this.name] = value; + }, + get: function(record) { + var value = record._values[this.name]; + if (value === undefined) { + value = this._default; + } + return value; + }, + _has_changed: function(previous, value) { + // Use stringify to compare object instance like Number for Decimal + return JSON.stringify(previous) != JSON.stringify(value); + }, + set_client: function(record, value, force_change) { + var previous_value = this.get(record); + this.set(record, value); + if (this._has_changed(previous_value, this.get(record))) { + this.changed(record); + record.validate(null, true, false); + record.set_modified(this.name); + } else if (force_change) { + this.changed(record); + record.validate(null, true, false); + record.set_modified(); + } + }, + get_client: function(record) { + return this.get(record); + }, + set_default: function(record, value) { + this.set(record, value); + record.modified_fields[this.name] = true; + }, + set_on_change: function(record, value) { + this.set(record, value); + record.modified_fields[this.name] = true; + }, + changed: function(record) { + record.on_change([this.name]); + record.on_change_with([this.name]); + record.autocomplete_with(this.name); + record.set_field_context(); + }, + get_timestamp: function(record) { + return {}; + }, + get_context: function(record, record_context, local) { + var context; + if (record_context) { + context = jQuery.extend({}, record_context); + } else { + context = record.get_context(local); + } + jQuery.extend(context, + record.expr_eval(this.description.context || {})); + return context; + }, + get_search_context: function(record) { + var context = this.get_context(record); + jQuery.extend(context, + record.expr_eval(this.description.search_context || {})); + return context; + }, + get_search_order: function(record) { + return record.expr_eval(this.description.search_order || null); + }, + get_domains: function(record, pre_validate) { + var inversion = new Sao.common.DomainInversion(); + var screen_domain = inversion.domain_inversion( + [record.group.domain4inversion(), pre_validate || []], + this.name, Sao.common.EvalEnvironment(record)); + if ((typeof screen_domain == 'boolean') && !screen_domain) { + screen_domain = [['id', '=', null]]; + } else if ((typeof screen_domain == 'boolean') && screen_domain) { + screen_domain = []; + } + var attr_domain = record.expr_eval(this.description.domain || []); + return [screen_domain, attr_domain]; + }, + get_domain: function(record) { + var domains = this.get_domains(record); + var screen_domain = domains[0]; + var attr_domain = domains[1]; + var inversion = new Sao.common.DomainInversion(); + return inversion.concat( + [inversion.localize_domain(screen_domain), attr_domain]); + }, + validation_domains: function(record, pre_validate) { + var inversion = new Sao.common.DomainInversion(); + return inversion.concat(this.get_domains(record, pre_validate)); + }, + get_eval: function(record) { + return this.get(record); + }, + get_on_change_value: function(record) { + return this.get_eval(record); + }, + set_state: function( + record, states=['readonly', 'required', 'invisible']) { + var state_changes = record.expr_eval( + this.description.states || {}); + for (const state of states) { + if ((state == 'readonly') && this.description.readonly) { + continue; + } + if (state_changes[state] !== undefined) { + this.get_state_attrs(record)[state] = state_changes[state]; + } else if (this.description[state] !== undefined) { + this.get_state_attrs(record)[state] = + this.description[state]; + } + } + if (record.group.readonly || + this.get_state_attrs(record).domain_readonly || + (record.parent_name == this.name)) { + this.get_state_attrs(record).readonly = true; + } + }, + get_state_attrs: function(record) { + if (!(this.name in record.state_attrs)) { + record.state_attrs[this.name] = jQuery.extend( + {}, this.description); + } + if (record.group.readonly || record.readonly) { + record.state_attrs[this.name].readonly = true; + } + return record.state_attrs[this.name]; + }, + _is_empty: function(record) { + return !this.get_eval(record); + }, + check_required: function(record) { + var state_attrs = this.get_state_attrs(record); + if (state_attrs.required == 1) { + if (this._is_empty(record) && (state_attrs.readonly != 1)) { + return false; + } + } + return true; + }, + validate: function(record, softvalidation, pre_validate) { + if (this.description.readonly) { + return true; + } + var invalid = false; + var state_attrs = this.get_state_attrs(record); + var is_required = Boolean(parseInt(state_attrs.required, 10)); + var is_invisible = Boolean(parseInt(state_attrs.invisible, 10)); + state_attrs.domain_readonly = false; + var inversion = new Sao.common.DomainInversion(); + var domain = inversion.simplify(this.validation_domains(record, + pre_validate)); + if (!softvalidation) { + if (!this.check_required(record)) { + invalid = 'required'; + } + } + if (typeof domain == 'boolean') { + if (!domain) { + invalid = 'domain'; + } + } else if (Sao.common.compare(domain, [['id', '=', null]])) { + invalid = 'domain'; + } else { + let [screen_domain] = this.get_domains(record, pre_validate); + var uniques = inversion.unique_value( + domain, this._single_value); + var unique = uniques[0]; + var leftpart = uniques[1]; + var value = uniques[2]; + let unique_from_screen = inversion.unique_value( + screen_domain, this._single_value)[0]; + if (this._is_empty(record) && + !is_required && + !is_invisible && + !unique_from_screen) { + // Do nothing + } else if (unique) { + // If the inverted domain is so constraint that only one + // value is possible we should use it. But we must also pay + // attention to the fact that the original domain might be + // a 'OR' domain and thus not preventing the modification + // of fields. + if (value === false) { + // XXX to remove once server domains are fixed + value = null; + } + var setdefault = true; + var original_domain; + if (!jQuery.isEmptyObject(record.group.domain)) { + original_domain = inversion.merge(record.group.domain); + } else { + original_domain = inversion.merge(domain); + } + var domain_readonly = original_domain[0] == 'AND'; + if (leftpart.contains('.')) { + var recordpart = leftpart.split('.', 1)[0]; + var localpart = leftpart.split('.', 1)[1]; + var constraintfields = []; + if (domain_readonly) { + for (const leaf of inversion.localize_domain( + original_domain.slice(1))) { + constraintfields.push(leaf); + } + } + if ((localpart != 'id') || + !~constraintfields.indexOf(recordpart)) { + setdefault = false; + } + } + if (setdefault && jQuery.isEmptyObject(pre_validate)) { + this.set_client(record, value); + state_attrs.domain_readonly = domain_readonly; + } + } + if (!inversion.eval_domain(domain, + Sao.common.EvalEnvironment(record))) { + invalid = domain; + } + } + state_attrs.invalid = invalid; + return !invalid; + } + }); + + Sao.field.Char = Sao.class_(Sao.field.Field, { + _default: '', + set: function(record, value) { + if (this.description.strip && value) { + switch (this.description.strip) { + case 'leading': + value = value.trimStart(); + break; + case 'trailing': + value = value.trimEnd(); + break; + default: + value = value.trim(); + } + } + Sao.field.Char._super.set.call(this, record, value); + }, + get: function(record) { + return Sao.field.Char._super.get.call(this, record) || this._default; + } + }); + + Sao.field.Selection = Sao.class_(Sao.field.Field, { + _default: null, + set_client: function(record, value, force_change) { + // delete before trigger the display + delete record._values[this.name + ':string']; + Sao.field.Selection._super.set_client.call( + this, record, value, force_change); + } + }); + + Sao.field.MultiSelection = Sao.class_(Sao.field.Selection, { + _default: null, + _single_value: false, + get: function(record) { + var value = Sao.field.MultiSelection._super.get.call(this, record); + if (jQuery.isEmptyObject(value)) { + value = this._default; + } else { + value.sort(); + } + return value; + }, + get_eval: function(record) { + var value = Sao.field.MultiSelection._super.get_eval.call( + this, record); + if (value === null) { + value = []; + } + return value; + }, + set_client: function(record, value, force_change) { + if (value === null) { + value = []; + } + if (typeof(value) == 'string') { + value = [value]; + } + if (value) { + value = value.slice().sort(); + } + Sao.field.MultiSelection._super.set_client.call( + this, record, value, force_change); + } + }); + + Sao.field.DateTime = Sao.class_(Sao.field.Field, { + _default: null, + time_format: function(record) { + return record.expr_eval(this.description.format); + }, + set_client: function(record, value, force_change) { + var current_value; + if (value) { + if (value.isTime) { + current_value = this.get(record); + if (current_value) { + value = Sao.DateTime.combine(current_value, value); + } else { + value = null; + } + } else if (value.isDate) { + current_value = this.get(record) || Sao.Time(); + value = Sao.DateTime.combine(value, current_value); + } + } + Sao.field.DateTime._super.set_client.call(this, record, value, + force_change); + }, + date_format: function(record) { + var context = this.get_context(record); + return Sao.common.date_format(context.date_format); + } + }); + + Sao.field.Date = Sao.class_(Sao.field.Field, { + _default: null, + set_client: function(record, value, force_change) { + if (value && !value.isDate) { + value.isDate = true; + value.isDateTime = false; + } + Sao.field.Date._super.set_client.call(this, record, value, + force_change); + }, + date_format: function(record) { + var context = this.get_context(record); + return Sao.common.date_format(context.date_format); + } + }); + + Sao.field.Time = Sao.class_(Sao.field.Field, { + _default: null, + time_format: function(record) { + return record.expr_eval(this.description.format); + }, + set_client: function(record, value, force_change) { + if (value && (value.isDate || value.isDateTime)) { + value = Sao.Time(value.hour(), value.minute(), + value.second(), value.millisecond()); + } + Sao.field.Time._super.set_client.call(this, record, value, + force_change); + } + }); + + Sao.field.TimeDelta = Sao.class_(Sao.field.Field, { + _default: null, + converter: function(group) { + return group.context[this.description.converter]; + }, + set_client: function(record, value, force_change) { + if (typeof(value) == 'string') { + value = Sao.common.timedelta.parse( + value, this.converter(record.group)); + } + Sao.field.TimeDelta._super.set_client.call( + this, record, value, force_change); + }, + get_client: function(record) { + var value = Sao.field.TimeDelta._super.get_client.call( + this, record); + return Sao.common.timedelta.format( + value, this.converter(record.group)); + } + }); + + Sao.field.Float = Sao.class_(Sao.field.Field, { + _default: null, + init: function(description) { + Sao.field.Float._super.init.call(this, description); + this._digits = {}; + this._symbol = {}; + }, + digits: function(record, factor=1) { + var digits = record.expr_eval(this.description.digits); + if (typeof(digits) == 'string') { + if (!(digits in record.model.fields)) { + return; + } + var digits_field = record.model.fields[digits]; + var digits_name = digits_field.description.relation; + var digits_id = digits_field.get(record); + if (digits_name && (digits_id !== null) && (digits_id >= 0)) { + if (digits_id in this._digits) { + digits = this._digits[digits_id]; + } else { + try { + digits = Sao.rpc({ + 'method': 'model.' + digits_name + '.get_digits', + 'params': [digits_id, {}], + }, record.model.session, false); + } catch(e) { + Sao.Logger.warn( + "Fail to fetch digits for %s,%s", + digits_name, digits_id); + return; + } + this._digits[digits_id] = digits; + } + } else { + return; + } + } + var shift = Math.round(Math.log(Math.abs(factor)) / Math.LN10); + if (!digits) { + return; + } + var int_size = digits[0]; + if (int_size !== null) { + int_size += shift; + } + var dec_size = digits[1]; + if (dec_size !== null) { + dec_size -= shift; + } + return [int_size, dec_size]; + }, + get_symbol: function(record, symbol) { + if (record && (symbol in record.model.fields)) { + var value = this.get(record) || 0; + var sign = 1; + if (value < 0) { + sign = -1; + } else if (value === 0) { + sign = 0; + } + var symbol_field = record.model.fields[symbol]; + var symbol_name = symbol_field.description.relation; + var symbol_id = symbol_field.get(record); + if (symbol_name && (symbol_id !== null) && (symbol_id >= 0)) { + if (symbol_id in this._symbol) { + return this._symbol[symbol_id]; + } + try { + var result = Sao.rpc({ + 'method': 'model.' + symbol_name + '.get_symbol', + 'params': [symbol_id, sign, record.get_context()], + }, record.model.session, false) || ['', 1]; + this._symbol[symbol_id] = result; + return result; + } catch (e) { + Sao.Logger.warn( + "Fail to fetch symbol for %s,%s", + symbol_name, symbol_id); + } + } + } + return ['', 1]; + }, + check_required: function(record) { + var state_attrs = this.get_state_attrs(record); + if (state_attrs.required == 1) { + if ((this.get(record) === null) && + (state_attrs.readonly != 1)) { + return false; + } + } + return true; + }, + convert: function(value) { + if (!value && (value !== 0)) { + return null; + } + value = Number(value); + if (isNaN(value)) { + value = this._default; + } + return value; + }, + apply_factor: function(record, value, factor) { + if (value !== null) { + value /= factor; + var digits = this.digits(record); + if (digits && (digits[1] !== null)) { + // Round to avoid float precision error + // after the division by factor + value = value.toFixed(digits[1]); + } + value = this.convert(value); + } + return value; + }, + set_client: function(record, value, force_change, factor=1) { + value = this.apply_factor(record, this.convert(value), factor); + Sao.field.Float._super.set_client.call(this, record, value, + force_change); + }, + get_client: function(record, factor=1, grouping=true) { + var value = this.get(record); + if (value !== null) { + var options = { + useGrouping: grouping, + }; + var digits = this.digits(record, factor); + if (digits && (digits[1] !== null)) { + options.minimumFractionDigits = digits[1]; + options.maximumFractionDigits = digits[1]; + } + return (value * factor).toLocaleString( + Sao.i18n.BC47(Sao.i18n.getlang()), options); + } else { + return ''; + } + } + }); + + Sao.field.Numeric = Sao.class_(Sao.field.Float, { + convert: function(value) { + if (!value && (value !== 0)) { + return null; + } + value = new Sao.Decimal(value); + if (isNaN(value.valueOf())) { + value = this._default; + } + return value; + }, + }); + + Sao.field.Integer = Sao.class_(Sao.field.Float, { + convert: function(value) { + if (!value && (value !== 0)) { + return null; + } + value = parseInt(value, 10); + if (isNaN(value)) { + value = this._default; + } + return value; + } + }); + + Sao.field.Boolean = Sao.class_(Sao.field.Field, { + _default: false, + set_client: function(record, value, force_change) { + value = Boolean(value); + Sao.field.Boolean._super.set_client.call(this, record, value, + force_change); + }, + get: function(record) { + return Boolean(record._values[this.name]); + }, + get_client: function(record) { + return Boolean(record._values[this.name]); + } + }); + + Sao.field.Many2One = Sao.class_(Sao.field.Field, { + _default: null, + check_required: function(record) { + var state_attrs = this.get_state_attrs(record); + if (state_attrs.required == 1) { + if ((this.get(record) === null) && + (state_attrs.readonly != 1)) { + return false; + } + } + return true; + }, + get_client: function(record) { + var rec_name = (record._values[this.name + '.'] || {}).rec_name; + if (rec_name === undefined) { + this.set(record, this.get(record)); + rec_name = ( + record._values[this.name + '.'] || {}).rec_name || ''; + } + return rec_name; + }, + set: function(record, value) { + var rec_name = ( + record._values[this.name + '.'] || {}).rec_name || ''; + if (!rec_name && (value >= 0) && (value !== null)) { + var model_name = record.model.fields[this.name].description + .relation; + rec_name = Sao.rpc({ + 'method': 'model.' + model_name + '.read', + 'params': [[value], ['rec_name'], record.get_context()] + }, record.model.session, false)[0].rec_name; + } + Sao.setdefault( + record._values, this.name + '.', {}).rec_name = rec_name; + record._values[this.name] = value; + }, + set_client: function(record, value, force_change) { + var rec_name; + if (value instanceof Array) { + rec_name = value[1]; + value = value[0]; + } else { + if (value == this.get(record)) { + rec_name = ( + record._values[this.name + '.'] || {}).rec_name || ''; + } else { + rec_name = ''; + } + } + if ((value < 0) && (this.name != record.group.parent_name)) { + value = null; + rec_name = ''; + } + Sao.setdefault( + record._values, this.name + '.', {}).rec_name = rec_name; + Sao.field.Many2One._super.set_client.call(this, record, value, + force_change); + }, + get_context: function(record, record_context, local) { + var context = Sao.field.Many2One._super.get_context.call( + this, record, record_context, local); + if (this.description.datetime_field) { + context._datetime = record.get_eval()[ + this.description.datetime_field]; + } + return context; + }, + validation_domains: function(record, pre_validate) { + return this.get_domains(record, pre_validate)[0]; + }, + get_domain: function(record) { + var domains = this.get_domains(record); + var screen_domain = domains[0]; + var attr_domain = domains[1]; + var inversion = new Sao.common.DomainInversion(); + return inversion.concat([ + inversion.localize_domain(screen_domain, this.name), + attr_domain]); + }, + get_on_change_value: function(record) { + if ((record.group.parent_name == this.name) && + record.group.parent) { + return record.group.parent.get_on_change_value( + [record.group.child_name]); + } + return Sao.field.Many2One._super.get_on_change_value.call( + this, record); + } + }); + + Sao.field.One2One = Sao.class_(Sao.field.Many2One, { + }); + + Sao.field.One2Many = Sao.class_(Sao.field.Field, { + init: function(description) { + Sao.field.One2Many._super.init.call(this, description); + }, + _default: null, + _single_value: false, + _set_value: function(record, value, default_, modified, data) { + this._set_default_value(record); + var group = record._values[this.name]; + if (jQuery.isEmptyObject(value)) { + value = []; + } + var mode; + if (jQuery.isEmptyObject(value) || + !isNaN(parseInt(value[0], 10))) { + mode = 'list ids'; + } else { + mode = 'list values'; + } + if ((mode == 'list values') || data) { + var context = this.get_context(record); + var value_fields = new Set(); + if (mode == 'list values') { + for (const v of value) { + for (const f of Object.keys(v)) { + value_fields.add(f); + } + } + } else { + for (const d of data) { + for (const f in d) { + value_fields.add(f); + } + } + } + let field_names = new Set(); + for (const fieldname of value_fields) { + if (!(fieldname in group.model.fields) && + (!~fieldname.indexOf('.')) && + (!~fieldname.indexOf(':')) && + (!fieldname.startsWith('_'))) { + field_names.add(fieldname); + } + } + var attr_fields = Object.values(this.description.views || {}) + .map(v => v.fields) + .reduce((acc, elem) => { + for (const field in elem) { + acc[field] = elem[field]; + } + return acc; + }, {}); + var fields = {}; + for (const n of field_names) { + if (n in attr_fields) { + fields[n] = attr_fields[n]; + } + } + + var to_fetch = Array.from(field_names).filter(k => !(k in attr_fields)); + if (to_fetch.length) { + var args = { + 'method': 'model.' + this.description.relation + + '.fields_get', + 'params': [to_fetch, context] + }; + try { + var rpc_fields = Sao.rpc( + args, record.model.session, false); + for (const [key, value] of Object.entries(rpc_fields)) { + fields[key] = value; + } + } catch (e) { + return; + } + } + if (!jQuery.isEmptyObject(fields)) { + group.add_fields(fields); + } + } + if (mode == 'list ids') { + var records_to_remove = []; + for (const old_record of group) { + if (!~value.indexOf(old_record.id)) { + records_to_remove.push(old_record); + } + } + for (const record_to_remove of records_to_remove) { + group.remove(record_to_remove, true, false, false); + } + var preloaded = {}; + for (const d of (data || [])) { + preloaded[d.id] = d; + } + group.load(value, modified || default_, -1, preloaded); + } else { + for (const vals of value) { + var new_record; + if ('id' in vals) { + new_record = group.get(vals.id); + if (!new_record) { + new_record = group.new_(false, vals.id); + } + } else { + new_record = group.new_(false); + } + if (default_) { + // Don't validate as parent will validate + new_record.set_default(vals, false, false); + group.add(new_record, -1, false); + } else { + new_record.set(vals, false); + group.push(new_record); + } + } + // Trigger modified only once + group.record_modified(); + } + }, + set: function(record, value, _default=false, data=null) { + var group = record._values[this.name]; + var model; + if (group !== undefined) { + model = group.model; + group.destroy(); + } else if (record.model.name == this.description.relation) { + model = record.model; + } else { + model = new Sao.Model(this.description.relation); + } + record._values[this.name] = undefined; + this._set_default_value(record, model); + this._set_value(record, value, _default, undefined, data); + }, + get: function(record) { + var group = record._values[this.name]; + if (group === undefined) { + return []; + } + var record_removed = group.record_removed; + var record_deleted = group.record_deleted; + var result = []; + var parent_name = this.description.relation_field || ''; + var to_add = []; + var to_create = []; + var to_write = []; + for (const record2 of group) { + if (~record_removed.indexOf(record2) || + ~record_deleted.indexOf(record2)) { + continue; + } + var values; + if (record2.id >= 0) { + if (record2.modified) { + values = record2.get(); + delete values[parent_name]; + if (!jQuery.isEmptyObject(values)) { + to_write.push([record2.id]); + to_write.push(values); + } + to_add.push(record2.id); + } + } else { + values = record2.get(); + delete values[parent_name]; + to_create.push(values); + } + } + if (!jQuery.isEmptyObject(to_add)) { + result.push(['add', to_add]); + } + if (!jQuery.isEmptyObject(to_create)) { + result.push(['create', to_create]); + } + if (!jQuery.isEmptyObject(to_write)) { + result.push(['write'].concat(to_write)); + } + if (!jQuery.isEmptyObject(record_removed)) { + result.push(['remove', record_removed.map(function(r) { + return r.id; + })]); + } + if (!jQuery.isEmptyObject(record_deleted)) { + result.push(['delete', record_deleted.map(function(r) { + return r.id; + })]); + } + return result; + }, + set_client: function(record, value, force_change) { + // domain inversion try to set None as value + if (value === null) { + value = []; + } + // domain inversion could try to set id as value + if (typeof value == 'number') { + value = [value]; + } + + var previous_ids = this.get_eval(record); + var modified = !Sao.common.compare( + previous_ids.sort(), value.sort()); + this._set_value(record, value, false, modified); + if (modified) { + this.changed(record); + record.validate(null, true, false); + record.set_modified(this.name); + } else if (force_change) { + this.changed(record); + record.validate(null, true, false); + record.set_modified(); + } + }, + get_client: function(record) { + this._set_default_value(record); + return record._values[this.name]; + }, + set_default: function(record, value) { + record.modified_fields[this.name] = true; + return this.set(record, value, true); + }, + set_on_change: function(record, value) { + var fields, new_fields; + record.modified_fields[this.name] = true; + this._set_default_value(record); + if (value instanceof Array) { + return this._set_value(record, value, false, true); + } + var new_field_names = {}; + if (value && (value.add || value.update)) { + var context = this.get_context(record); + fields = record._values[this.name].model.fields; + var adding_values = []; + if (value.add) { + for (const add of value.add) { + adding_values.push(add[1]); + } + } + for (const l of [adding_values, value.update]) { + if (!jQuery.isEmptyObject(l)) { + for (const v of l) { + for (const f of Object.keys(v)) { + if (!(f in fields) && + (f != 'id') && + (!~f.indexOf('.'))) { + new_field_names[f] = true; + } + } + } + } + } + if (!jQuery.isEmptyObject(new_field_names)) { + var args = { + 'method': 'model.' + this.description.relation + + '.fields_get', + 'params': [Object.keys(new_field_names), context] + }; + try { + new_fields = Sao.rpc(args, record.model.session, false); + } catch (e) { + return; + } + } else { + new_fields = {}; + } + } + + var group = record._values[this.name]; + if (value && value.delete) { + for (const record_id of value.delete) { + const record2 = group.get(record_id); + if (record2) { + group.remove(record2, false, false, false); + } + } + } + if (value && value.remove) { + for (const record_id of value.remove) { + const record2 = group.get(record_id); + if (record2) { + group.remove(record2, true, false, false); + } + } + } + + if (value && (value.add || value.update)) { + let vals_to_set = {}; + // First set already added fields to prevent triggering a + // second on_change call + if (value.update) { + for (const vals of value.update) { + if (!vals.id) { + continue; + } + const record2 = group.get(vals.id); + if (record2) { + for (var key in vals) { + if (!Object.prototype.hasOwnProperty.call( + new_field_names, key)) { + vals_to_set[key] = vals[key]; + } + } + record2.set_on_change(vals_to_set); + } + } + } + + group.add_fields(new_fields); + if (value.add) { + for (const vals of value.add) { + let new_record; + const index = vals[0]; + const data = vals[1]; + const id_ = data.id; + delete data.id; + if (id_) { + new_record = group.get(id_); + } + if (!new_record) { + new_record = group.new_(false, id_); + } + group.add(new_record, index, false); + new_record.set_on_change(data); + } + } + if (value.update) { + for (const vals of value.update) { + if (!vals.id) { + continue; + } + const record2 = group.get(vals.id); + if (record2) { + let to_update = Object.fromEntries( + Object.entries(vals).filter( + ([k, v]) => { + !Object.prototype.hasOwnProperty.call( + vals_to_set, k) + } + )); + record2.set_on_change(to_update); + } + } + } + } + }, + _set_default_value: function(record, model) { + if (record._values[this.name] !== undefined) { + return; + } + if (!model) { + model = new Sao.Model(this.description.relation); + } + if (record.model.name == this.description.relation) { + model = record.model; + } + var group = Sao.Group(model, {}, []); + group.set_parent(record); + group.parent_name = this.description.relation_field; + group.child_name = this.name; + group.parent_datetime_field = this.description.datetime_field; + record._values[this.name] = group; + }, + get_timestamp: function(record) { + var timestamps = {}; + var group = record._values[this.name] || []; + var records = group.filter(function(record) { + return record.modified; + }); + for (const record of jQuery.extend( + records, group.record_removed, group.record_deleted)) { + jQuery.extend(timestamps, record.get_timestamp()); + } + return timestamps; + }, + get_eval: function(record) { + var result = []; + var group = record._values[this.name]; + if (group === undefined) return result; + + var record_removed = group.record_removed; + var record_deleted = group.record_deleted; + for (const record2 of group) { + if (~record_removed.indexOf(record2) || + ~record_deleted.indexOf(record2)) + continue; + result.push(record2.id); + } + return result; + }, + get_on_change_value: function(record) { + var result = []; + var group = record._values[this.name]; + if (group === undefined) return result; + for (const record2 of group) { + if (!record2.deleted && !record2.removed) + result.push(record2.get_on_change_value( + [this.description.relation_field || ''])); + } + return result; + }, + get_removed_ids: function(record) { + return record._values[this.name].record_removed.map(function(r) { + return r.id; + }); + }, + get_domain: function(record) { + var domains = this.get_domains(record); + var attr_domain = domains[1]; + // Forget screen_domain because it only means at least one record + // and not all records + return attr_domain; + }, + validation_domains: function(record, pre_validate) { + return this.get_domains(record, pre_validate)[0]; + }, + validate: function(record, softvalidation, pre_validate) { + var invalid = false; + var inversion = new Sao.common.DomainInversion(); + var ldomain = inversion.localize_domain(inversion.domain_inversion( + record.group.clean4inversion(pre_validate || []), this.name, + Sao.common.EvalEnvironment(record)), this.name); + if (typeof ldomain == 'boolean') { + if (ldomain) { + ldomain = []; + } else { + ldomain = [['id', '=', null]]; + } + } + for (const record2 of (record._values[this.name] || [])) { + if (!record2.get_loaded() && (record2.id >= 0) && + jQuery.isEmptyObject(pre_validate)) { + continue; + } + if (!record2.validate(null, softvalidation, ldomain)) { + invalid = 'children'; + } + } + var test = Sao.field.One2Many._super.validate.call(this, record, + softvalidation, pre_validate); + if (test && invalid) { + this.get_state_attrs(record).invalid = invalid; + return false; + } + return test; + }, + set_state: function(record, states) { + this._set_default_value(record); + Sao.field.One2Many._super.set_state.call(this, record, states); + }, + _is_empty: function(record) { + return jQuery.isEmptyObject(this.get_eval(record)); + } + }); + + Sao.field.Many2Many = Sao.class_(Sao.field.One2Many, { + get_on_change_value: function(record) { + return this.get_eval(record); + } + }); + + Sao.field.Reference = Sao.class_(Sao.field.Field, { + _default: null, + get_client: function(record) { + if (record._values[this.name]) { + var model = record._values[this.name][0]; + var name = ( + record._values[this.name + '.'] || {}).rec_name || ''; + return [model, name]; + } else { + return null; + } + }, + get: function(record) { + if (record._values[this.name] && + record._values[this.name][0] && + record._values[this.name][1] !== null && + record._values[this.name][1] >= -1) { + return record._values[this.name].join(','); + } + return null; + }, + set_client: function(record, value, force_change) { + if (value) { + if (typeof(value) == 'string') { + value = value.split(','); + } + var ref_model = value[0]; + var ref_id = value[1]; + var rec_name; + if (ref_id instanceof Array) { + rec_name = ref_id[1]; + ref_id = ref_id[0]; + } else { + if (ref_id && !isNaN(parseInt(ref_id, 10))) { + ref_id = parseInt(ref_id, 10); + } + if ([ref_model, ref_id].join(',') == this.get(record)) { + rec_name = ( + record._values[this.name + '.'] || {}).rec_name || ''; + } else { + rec_name = ''; + } + } + Sao.setdefault( + record._values, this.name + '.', {}).rec_name = rec_name; + value = [ref_model, ref_id]; + } + Sao.field.Reference._super.set_client.call( + this, record, value, force_change); + }, + set: function(record, value) { + if (!value) { + record._values[this.name] = this._default; + return; + } + var ref_model, ref_id; + if (typeof(value) == 'string') { + ref_model = value.split(',')[0]; + ref_id = value.split(',')[1]; + if (!ref_id) { + ref_id = null; + } else if (!isNaN(parseInt(ref_id, 10))) { + ref_id = parseInt(ref_id, 10); + } + } else { + ref_model = value[0]; + ref_id = value[1]; + } + var rec_name = ( + record._values[this.name + '.'] || {}).rec_name || ''; + if (ref_model && ref_id !== null && ref_id >= 0) { + if (!rec_name && ref_id >= 0) { + rec_name = Sao.rpc({ + 'method': 'model.' + ref_model + '.read', + 'params': [[ref_id], ['rec_name'], record.get_context()] + }, record.model.session, false)[0].rec_name; + } + } else if (ref_model) { + rec_name = ''; + } else { + rec_name = ref_id; + } + Sao.setdefault( + record._values, this.name + '.', {}).rec_name = rec_name; + record._values[this.name] = [ref_model, ref_id]; + }, + get_on_change_value: function(record) { + if ((record.group.parent_name == this.name) && + record.group.parent) { + return [record.group.parent.model.name, + record.group.parent.get_on_change_value( + [record.group.child_name])]; + } + return Sao.field.Reference._super.get_on_change_value.call( + this, record); + }, + get_context: function(record, record_context, local) { + var context = Sao.field.Reference._super.get_context.call( + this, record, record_context, local); + if (this.description.datetime_field) { + context._datetime = record.get_eval()[ + this.description.datetime_field]; + } + return context; + }, + validation_domains: function(record, pre_validate) { + return this.get_domains(record, pre_validate)[0]; + }, + get_domains: function(record, pre_validate) { + var model = null; + if (record._values[this.name]) { + model = record._values[this.name][0]; + } + var domains = Sao.field.Reference._super.get_domains.call( + this, record, pre_validate); + domains[1] = domains[1][model] || []; + return domains; + }, + get_domain: function(record) { + var model = null; + if (record._values[this.name]) { + model = record._values[this.name][0]; + } + var domains = this.get_domains(record); + var screen_domain = domains[0]; + var attr_domain = domains[1]; + var inversion = new Sao.common.DomainInversion(); + screen_domain = inversion.filter_leaf( + screen_domain, this.name, model); + screen_domain = inversion.prepare_reference_domain( + screen_domain, this.name); + return inversion.concat([ + inversion.localize_domain(screen_domain, this.name, true), + attr_domain]); + }, + get_search_order: function(record) { + var order = Sao.field.Reference._super.get_search_order.call( + this, record); + if (order !== null) { + var model = null; + if (record._values[this.name]) { + model = record._values[this.name][0]; + } + order = order[model] || null; + } + return order; + }, + get_models: function(record) { + var domains = this.get_domains(record); + var inversion = new Sao.common.DomainInversion(); + var screen_domain = inversion.prepare_reference_domain( + domains[0], this.name); + return inversion.extract_reference_models( + inversion.concat([screen_domain, domains[1]]), + this.name); + }, + _is_empty: function(record) { + var result = Sao.field.Reference._super._is_empty.call( + this, record); + if (!result && record._values[this.name][1] < 0) { + result = true; + } + return result; + }, + }); + + Sao.field.Binary = Sao.class_(Sao.field.Field, { + _default: null, + _has_changed: function(previous, value) { + return previous != value; + }, + get_size: function(record) { + var data = record._values[this.name] || 0; + if ((data instanceof Uint8Array) || + (typeof(data) == 'string')) { + return data.length; + } + return data; + }, + get_data: function(record) { + var data = record._values[this.name]; + var prm = jQuery.when(data); + if (!(data instanceof Uint8Array) && + (typeof(data) != 'string') && + (data !== null)) { + if (record.id < 0) { + return prm; + } + var context = record.get_context(); + prm = record.model.execute('read', [[record.id], [this.name]], + context).then(data => { + data = data[0][this.name]; + this.set(record, data); + return data; + }); + } + return prm; + } + }); + + Sao.field.Dict = Sao.class_(Sao.field.Field, { + _default: {}, + _single_value: false, + init: function(description) { + Sao.field.Dict._super.init.call(this, description); + this.schema_model = new Sao.Model(description.schema_model); + this.keys = {}; + }, + set: function(record, value) { + if (value) { + // Order keys to allow comparison with stringify + var keys = []; + for (var key in value) { + keys.push(key); + } + keys.sort(); + var new_value = {}; + for (var index in keys) { + key = keys[index]; + new_value[key] = value[key]; + } + value = new_value; + } + Sao.field.Dict._super.set.call(this, record, value); + }, + get: function(record) { + return jQuery.extend( + {}, Sao.field.Dict._super.get.call(this, record)); + }, + get_client: function(record) { + return Sao.field.Dict._super.get_client.call(this, record); + }, + validation_domains: function(record, pre_validate) { + return this.get_domains(record, pre_validate)[0]; + }, + get_domain: function(record) { + var inversion = new Sao.common.DomainInversion(); + var domains = this.get_domains(record); + var screen_domain = domains[0]; + var attr_domain = domains[1]; + return inversion.concat([ + inversion.localize_domain(screen_domain), + attr_domain]); + }, + date_format: function(record) { + var context = this.get_context(record); + return Sao.common.date_format(context.date_format); + }, + time_format: function(record) { + return '%X'; + }, + add_keys: function(keys, record) { + var context = this.get_context(record); + var domain = this.get_domain(record); + var batchlen = Math.min(10, Sao.config.limit); + + keys = jQuery.extend([], keys); + const update_keys = values => { + for (const k of values) { + this.keys[k.name] = k; + } + }; + + var prms = []; + while (keys.length > 0) { + var sub_keys = keys.splice(0, batchlen); + prms.push(this.schema_model.execute('search_get_keys', + [[['name', 'in', sub_keys], domain], + Sao.config.limit], + context) + .then(update_keys)); + } + return jQuery.when.apply(jQuery, prms); + }, + add_new_keys: function(ids, record) { + var context = this.get_context(record); + return this.schema_model.execute('get_keys', [ids], context) + .then(new_fields => { + var names = []; + for (const new_field of new_fields) { + this.keys[new_field.name] = new_field; + names.push(new_field.name); + } + return names; + }); + }, + validate: function(record, softvalidation, pre_validate) { + var valid = Sao.field.Dict._super.validate.call( + this, record, softvalidation, pre_validate); + + if (this.description.readonly) { + return valid; + } + + var decoder = new Sao.PYSON.Decoder(); + var field_value = this.get_eval(record); + var domain = []; + for (var key in field_value) { + if (!(key in this.keys)) { + continue; + } + var key_domain = this.keys[key].domain; + if (key_domain) { + domain.push(decoder.decode(key_domain)); + } + } + + var inversion = new Sao.common.DomainInversion(); + var valid_value = inversion.eval_domain(domain, field_value); + if (!valid_value) { + this.get_state_attrs(record).invalid = 'domain'; + } + + return valid && valid_value; + } + }); +}()); diff --git a/naliia_sao_custom/sao.less b/naliia_sao_custom/sao.less new file mode 100644 index 0000000..5feebc4 --- /dev/null +++ b/naliia_sao_custom/sao.less @@ -0,0 +1,1637 @@ +/* This file is part of Tryton. The COPYRIGHT file at the top level of + this repository contains the full copyright notices and license terms. */ +@import "bootstrap"; +@import "bootstrap-rtl"; +@import "sao-variables"; +html { + .user-select(none); +} + +html[theme="default"] { + @import "theme"; +} + +.body { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; + + > .navbar { + margin-bottom: 0; + } +} + +// Fix double rtl prefix +.float-rtl-grid-columns(@class, @rtl-prefix) { + .col(@index) { // initial + @item: ~".col-@{class}-@{index}"; + .col((@index + 1), @item); + } + .col(@index, @list) when (@index =< @grid-columns) { // general + @item: ~".col-@{class}-@{index}"; + .col((@index + 1), ~"@{list}, @{item}"); + } + .col(@index, @list) when (@index > @grid-columns) { // terminal + @{list} { + float: right; + } + } + .col(1); // kickstart it +} + +// Backport from Bootstrap 4 +.stretched-link { + &::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + // Just in case `pointer-events: none` is set on a parent + pointer-events: auto; + content: ""; + // IE10 bugfix, see https://stackoverflow.com/questions/16947967/ie10-hover-pseudo-class-doesnt-work-without-background-color + background-color: rgba(0, 0, 0, 0); + } +} + +.radio, +.checkbox { + margin-top: 0; + margin-bottom: 0; +} + +.btn-horizontal { + .text-overflow() +} + +.input-group > .form-control-feedback { + z-index: 3; +} + +.input-group-addon { + > .label { + position: absolute; + right: 0px; + top: -5px; + } +} + +.navbar-inverse { + .close { + color: @navbar-inverse-link-color; + + &:hover, + &:focus { + color: @navbar-inverse-link-hover-color; + background-color: @navbar-inverse-link-hover-bg; + } + } + .active .close { + &, + &:hover, + &:focus { + color: @navbar-inverse-link-active-color; + background-color: @navbar-inverse-link-active-bg; + } + } +} + +.navbar { + .icon { + display: inline-block; + height: unit(@line-height-base, em); + vertical-align: middle; + } +} + +.navbar-nav { + @media (min-width: @grid-float-breakpoint) { + float:none; + } +} + +.btn-primary { + .icon { + filter: brightness(0) invert(1); + } +} + +.panel-heading { + a { + color: inherit; + } +} + +.modal-header { + background-color: @brand-primary; + color: #fff; + + .modal-title { + small { + color: @gray-lighter; + } + } +} + +.alert { + .user-select(text); +} + +#tablist { + display: flex; + overflow-x: auto; + + > li { + flex: auto; + min-width: 9em; + > a { + > span { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + /* For IE */ + display: block; + margin-right: 15px; + } + [dir="rtl"] & > span { + margin-right: 0; + margin-left: 15px; + } + } + } +} + +@media screen and (max-width: @screen-xs-max) { + #tablist { + display: block; + + > li { + float: none; + } + } +} + +#main { + bottom: 0; + display: flex; + flex-direction: row; + gap: .5rem; + left: 0; + position: absolute; + right: 0; + top: 6rem; +} + +#menu, #tabs { + display: flex; + overflow: auto; + + .navbar-brand { + .title { + display: inline-block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } +} + +#tabs { + flex: 1; + overflow-x: hidden; + padding: 0 5px; +} + +@media screen and (max-width: @screen-md-max) { + #menu, #tabs { + .navbar-brand { + .title { + max-width: 180px; + } + } + } +} + +@media screen and (max-width: @screen-sm-max) { + #menu, #tabs { + .navbar-brand { + .title { + max-width: 170px; + } + } + } +} + +@media screen and (max-width: @screen-xs-max) { + #menu, #tabs { + padding-left: 0; + padding-right: 0; + + .navbar-brand { + padding-left: 0; + padding-right: 0; + + .title { + max-width: 70px; + } + } + } +} + +#menu { + overflow-y: auto; + padding: 0; + background-color: @navbar-default-bg; + border-color: @panel-default-border; + border-style: solid; + border-radius: 0 @panel-border-radius @panel-border-radius 0; + border-width: 1px; + .treeview { + height: auto; + .cell { + .user-select(none); + } + } + @media (min-width: @screen-md-min) { + resize: horizontal; + width: 35rem; + min-width: 20ch; + max-width: 100vw; + } + @media (max-width: (@screen-sm-max)) { + width: 100%; + } +} + +[dir="rtl"] #menu { + border-right: none; +} +@media screen and (max-width: @screen-sm-max) { + #menu { + border-right: none; + border-left: none; + border-width: none; + } + .active #menu { + border-width: 1px; + } + [dir="rtl"] .active #menu { + border-right: none; + } +} + +#tabcontent { + display: flex; + flex: 1; + width: 100%; + + > .tab-pane > .panel { + display: flex; + flex-direction: column; + flex: 1; + margin-bottom: 5px; + padding-bottom: 0; + + > .panel-body { + display: flex; + flex: 1; + flex-direction: row; + padding: 5px 0; + min-height: 0; + + > div { + display: inline-flex; + + &:first-child { + flex: 2; + } + } + } + } + + > .tab-pane.active { + /* override bootstrap which sets display to block */ + display: flex; + flex: 1; + } + + .sidebar { + border-color: @panel-default-border; + border-style: solid; + border-width: 0 0 0 1px; + flex: 1; + overflow: unset; + + .sidebar-resizer { + display: flex; + flex-direction: column; + height: 100%; + max-width: 100vw; + min-width: 100%; + overflow: hidden; + resize: inline; + transform: scaleX(-1); + } + + .sidebar-content { + display: flex; + flex-direction: column; + flex: 1; + transform: scaleX(-1); + height: 100%; + } + } +} + +@media screen and (max-width: @screen-xs-max) { + #tabcontent { + .sidebar:not(:empty) { + flex: 2; + + > .sidebar-resizer { + resize: none; + } + } + } +} + +@media screen and (max-width: @screen-sm-max) { + #tabcontent { + .sidebar { + visibility: collapse; + } + } + #tabcontent[data-view-type="form"] { + display: block; + + > .tab-pane > .panel > .panel-body { + flex-direction: column; + } + .sidebar { + visibility: unset; + } + } +} + +@media screen and (min-width: @screen-sm-min) { + #global-search-entry { + width: 10em; + -webkit-transition: width .5s ease; + -o-transition: width .5s ease; + transition: width .5s ease; + + .global-search-container:focus-within & { + width: 20em; + } + } +} + +#user-preferences > a { + max-width: 30em; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + + > img { + margin: -5px 5px; + width: 30px; + + &[src=''] { + width: 0; + } + + &.img-badge { + margin-left: -15px; + margin-bottom: -25px; + width: 15px; + } + } +} + +.attachment-preview { + border-bottom: 1px solid @hr-border; + display: flex; + flex-direction: column; + flex: 1; + min-height: 200px; + + .screen-container { + overflow: auto; + } + + .btn-group { + margin-bottom: 10px; + margin-top: 10px; + } +} + +.chat { + border-bottom: 1px solid @hr-border; + display: flex; + flex-direction: column; + flex: 1; + height: 100%; + min-height: 200px; + padding-bottom: 20px; // Like .tab-form + padding-left: 5px; + padding-right: 5px; + + .chat-messages-outer { + display: flex; + flex-direction: column; + flex: 1; + justify-content: flex-end; + overflow: hidden; + } + + .chat-messages { + max-height: 100%; + overflow-y: auto; + } + + .chat-message { + margin-top: 5px; + } + + .chat-content { + white-space: pre-wrap; + word-wrap: break-word; + + } + + .chat-content-internal { + color: @text-muted; + } + + .media-body.well { + border-radius: .5rem; + margin: 0; + } + + hr { + border-style: dotted; + margin-bottom: 5px; + margin-top: 5px; + width: 100%; + } + + textarea { + min-height: 60px; + resize: vertical; + } + + .checkbox { + margin-bottom: 10px; + margin-top: 10px; + } +} + + +.list-group-item-variant(selected; @state-selected-bg; @state-selected-text); +.table-row-variant(selected; @state-selected-bg); +/* Duplicate bootstrap variant to have precedence over selected */ +.table-row-variant(success; @state-success-bg); +.table-row-variant(warning; @state-warning-bg); +.table-row-variant(danger; @state-danger-bg); + +html.accesskey { + + *[accesskey] ~ span[data-accesskey]:after, + *[accesskey]:after { + background-color: @brand-info; + color: #fff; + font-size: x-small; + padding: 0 2px; + position: absolute; + text-transform: uppercase; + margin: 0 -1em; + z-index: 5; + } + + input[accesskey][type="checkbox"]:after { + background-color: initial; + } + + *[accesskey] ~ span[data-accesskey] { + float: right; + position: relative; + + &:after { + content: attr(data-accesskey); + } + } + + *[accesskey]:after { + content: attr(accesskey); + } + + input[accesskey][type="checkbox"], + input[accesskey][type="checkbox"], + select[accesskey] { + & ~ span[data-accesskey] { + bottom: 1em; + } + } +} + +.tab-form, .tab-board { + padding-bottom: 20px; + + nav.toolbar { + position: -webkit-sticky; + position: sticky; + top: 0px; + z-index: @zindex-navbar - 1; + + .close { + margin-right: 5px; + margin-left: 5px; + } + } + + .navbar-text { + .badge { + max-width: 7em; + min-width: 7em; + overflow: hidden; + text-overflow: ellipsis; + } + } + + .navbar-btn { + .badge { + position: absolute; + top: -5px; + right: -5px; + z-index: 1000; + } + } + + .tab-domain { + overflow-x: auto; + max-width: calc(100vw - 10px); + flex: 0 0 content; + + > .nav-tabs { + display: inline-flex; + white-space: nowrap; + width: 1px; + } + .badge { + min-width: 3em; + } + } +} + +@media screen and (max-height: 750px) { + .tab-form, .tab-board { + .navbar-header > ul { + min-width: 320px; + > li { + float: left; + width: 50%; + } + } + } +} + +@media screen and (max-width: @screen-xs-max) { + nav.toolbar { + padding-left: 0; + padding-right: 0; + } +} + +.modal-body { + overflow-x: auto; + max-height: calc(100vh - 200px); +} + +@media screen and (max-height: 500px) { + .modal-body { + max-height: 300px; + } +} + +.modal-lg { + .modal-content { + height: auto; + border-radius: 0; + } +} + +@media screen and (min-width: @screen-sm-min) { + .modal-dialog.modal-lg { + width: auto; + margin: 30px; + } +} + +input[type='number'] { + text-align: right; + text-align: end; +} + +input[type='color'] { + .btn { + height: @line-height-base; + } + .btn-lg { + height: @line-height-large; + } + .btn-sm { + height: @line-height-small; + } + .btn-xs { + height: @line-height-small; + } +} + +.input-file { + > input[type='file'] { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0; + cursor: pointer; + + li& { + top: auto; + height: auto; + + &:hover + a, &:focus + a { + background-color: @dropdown-link-hover-bg; + color: @dropdown-link-hover-color; + text-decoration: none; + } + } + } +} + +/* Hide empty image displayed as broken image */ +img[src=''], +img:not([src]) { + visibility: hidden; +} + +img.icon { + height: unit(@line-height-base, em); + [dir="rtl"] & { + transform: scaleX(-1); + } +} + +.screen-container, .board { + display: flex; + flex-direction: column; + flex: 1; +} + +.filter-box { + margin: 5px 0; +} + +@media screen and (max-width: @screen-sm-max) { + .filter-box { + button[disabled] { + display: none; + } + } +} + +.content-box { + display: flex; + flex-direction: column; + flex: 1; + overflow-y: auto; +} + +.tree-container { + display: flex; + flex-direction: column; + min-height: 0; + + .tree-dragged-image { + display: block; + height: 0; + left: 0; + position: absolute; + top: 0; + width: 0; + } +} + +.wizard-form { + width: 100%; +} + +.list-form { + overflow-y: auto; +} + +.treeview { + overflow-x: auto; + + > table.tree { + width: 100%; + table-layout: fixed; + border: 1px solid transparent; + + &.table-bordered { + border-color: @table-border-color; + } + + col.selection-state, col.favorite, col.tree-menu { + width: 30px; + } + + td.draggable-handle, td.optional { + > img { + .center-block(); + } + } + td.draggable-handle { + cursor: grab; + } + th.selection-state { + > input { + margin-top: 0; + margin-bottom: 0; + } + } + th.selection-state, td.selection-state { + > input { + .center-block(); + } + } + > thead > tr > th { + position: relative; + padding: 5px; + + > label { + display: inline-block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0; + + &.sortable { + cursor: pointer; + } + } + + > div.resizer { + z-index: 1; + position: absolute; + top: 0; + inset-inline-end: -5px; + width: 2px; + height: 100%; + cursor: ew-resize; + padding: 0 4px; + background-color: transparent; + } + + &.tree-menu { + cursor: pointer; + overflow: visible; + } + text-align: center; + &.char, &.text, &.many2one, &.one2one, &.date, &.time, &.selection, + &.reference, &.url, &.email, &.callto, &.sip { + text-align: left; + text-align: start; + } + &.timedelta, &.float, &.numeric, &.integer { + text-align: right; + text-align: end; + } + } + > thead > tr:first-child { + position: sticky; + top: 0; + z-index: 100; + + th { + border: 1px solid transparent; + border-bottom: 2px solid @table-border-color; + background-color: @body-bg; + } + + &:hover th { + border: 1px solid @table-border-color; + border-bottom-width: 2px; + } + } + > tfoot > tr { + bottom: 0; + position: sticky; + z-index: 100; + + th { + background-color: @body-bg; + & > label { + display: none; + } + & > div.value { + .user-select(text); + white-space: pre; + } + } + } + > tbody > tr > td { + cursor: pointer; + > * { + vertical-align: middle; + } + } + > tbody > tr.dragged-row { + background-color: @state-info-bg; + } + + img.column-affix, a.column-affix > img { + width: unit(@line-height-base, em); + height: unit(@line-height-base, em); + display: block; + } + + tr.more-row { + text-align: center; + } + } + .editabletree-char, .editabletree-date, .editabletree-datetime, + .editabletree-integer, .editabletree-float, .editabletree-selection, + .editabletree-timedelta, .editabletree-boolean, .editabletree-many2one, + .editabletree-one2many, .editabletree-reference, .editabletree-time { + width: 100%; + + input[type='checkbox'] { + margin-top: 0; + margin-left: auto; + margin-right: auto; + } + + > .input-group { + width: 100%; + } + } + + @media screen and (min-width: @screen-sm-min) { + .editabletree-reference { + > .input-sm, > .input-group { + width: 50%; + } + } + } + + td { + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + &.edited { + /* We have to define an overflow:visible in order for the + completion widget to be shown */ + overflow: visible; + padding: 0 0; + } + > .column-text { + white-space: pre; + } + } + .cell { + display: flex; + justify-content: space-between; + .user-select(text); + + > * { + align-self: center; + } + + .widget, .widget-editable { + min-width: 0; + flex-grow: 2; + + > * { + width: 100%; + } + } + .widget { + > * { + overflow: hidden; + text-overflow: ellipsis; + } + > input[type="checkbox"], + > input[type="radio"] { + overflow: unset; + } + } + .prefix { + padding-right: .5 * @table-cell-padding; + [dir="rtl"] & { + padding-right: 0; + padding-left: .5 * @table-cell-padding; + } + } + .suffix { + padding-left: .5 * @table-cell-padding; + [dir="rtl"] & { + padding-left: 0; + padding-right: .5 * @table-cell-padding; + } + } + } + .expander { + cursor: pointer; + > img { + float: left; + [dir="rtl"] & { + float: right; + } + width: unit(@line-height-base, em); + height: unit(@line-height-base, em); + } + } + label { + font-weight: normal; + display: inline; + &.required { + font-weight: bold; + } + &.editable { + font-style: italic; + } + } + .btn { + padding-top: 0; + padding-bottom: 0; + } + + > table.table-bordered { + border: 1px solid @table-border-color; + > thead, + > tbody, + > tfoot { + > tr:first-child { + > th, + > td { + border: 1px solid @table-border-color; + } + } + } + > thead > tr:first-child { + > th, + > td { + border-bottom-width: 2px; + } + } + } +} + +.form, .board { + width: 100%; + height: 100%; + .form-container, .form-hcontainer, .form-vcontainer { + display: grid; + width: 100%; + height: 100%; + column-gap: 5px; + row-gap: 5px; + } + .form-item { + display: flex; + + > .btn { + margin: 5px 0; + } + } + .form-notebook { + border-color: @panel-default-border; + border-style: solid; + border-width: 1px; + + .nav-tabs { + background: @navbar-default-bg; + margin-bottom: 5px; + } + } + .form-label { + white-space: pre-wrap; + width: max-content; + max-width: 80ch; + } + .form-char, .form-password, .form-color, .form-integer, .form-float, + .form-timedelta, .form-selection, .form-multiselection, .form-url, + .form-email, .form-callto, .form-sip, .form-pyson { + input, select { + min-width: 8ch; + } + } + .form-date { + input { + width: calc(10ch + @input-height-base); + } + } + .form-time { + input { + width: calc(8ch + @input-height-base); + } + } + .form-datetime { + input { + width: calc(19ch + @input-height-base); + } + } + .form-many2one, .form-one2one, .form-reference, .form-binary { + select { + min-width: 8ch; + } + input { + min-width: 12ch; + + &[type='file'] { + min-width: unset; + } + } + } + + .form-selection { + select.form-control { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + + @media screen and (min-width: @screen-sm-min) { + .form-reference { + > .input-sm, > .input-group { + width: 50%; + } + } + } + @media screen and (max-width: @screen-xs-max) { + .form-reference { + > .input-sm, > .input-group { + width: 100%; + } + } + } + + .form-url, .form-email, .form-callto, .form-sip { + a > img { + width: 1em; + height: 1em; + } + } + .form-many2one > .input-group { + width: 100%; + } + .form-one2many-menu::after, .form-many2many-menu::after { + content: ""; + display: table; + clear: both; + } + .form-one2many-menu, .form-many2many-menu { + .form-one2many-string, .form-many2many-string { + display: inline-table; + float: left; + margin: 5px; + [dir="rtl"] & { + float: right; + } + } + .form-one2many-toolbar, .form-many2many-toolbar { + display: inline-table; + float: right; + [dir="rtl"] & { + float: left; + } + .badge { + max-width: 5em; + min-width: 5em; + overflow: hidden; + text-overflow: ellipsis; + } + } + } + .form-one2many-content, .form-many2many-content { + padding: 5px; + + .treeview, .list-form { + height: auto; + min-height: 150px; + max-height: 300px; + } + } + .form-text, .form-richtext { + display: flex; + + .input-group { + display: flex; + width: 100%; + + textarea, .richtext { + height: 100%; + line-height: 2.5ex; + min-height: 12.5ex; + overflow: auto; + resize: vertical; + } + + > span { + flex-basis: fit-content; + } + } + } + .form-richtext { + > .btn-toolbar { + min-width: 450px; + } + } + .form-separator { + label { + margin-top: 10px; + } + hr { + margin-top: 0; + margin-bottom: 5px; + } + } + .form-image { + margin: 2px; + + .caption { + min-width: 120px; + } + } + .form-document { + object { + object-fit: scale-down; + object-position: center top; + max-width: 100%; + min-height: 50vh; + height: 100%; + width: 100%; + @media screen and (max-width: @screen-xs-max) { + min-height: 25vh; + } + } + } + label { + font-weight: normal; + display: inline; + padding: 0 5px; + &.required { + font-weight: bold; + } + &.editable { + font-style: italic; + } + } + .nav-tabs { + margin-bottom: 15px; + } + .panel-heading { + padding: 2px 2px; + } + fieldset.form-group_ { + overflow: auto; + > legend { + font-size: @font-size-base; + margin-bottom: 5px; + } + .form-container, .form-hcontainer, .form-vcontainer { + vertical-align: middle; + } + } + + .xexpand { + width: 100%; + } + + .xfill { + justify-content: stretch; + } + + .yexpand { + height: 100%; + } + + .xalign-start { + justify-self: start; + justify-content: start; + } + + .xalign-center { + justify-self: center; + justify-content: center; + } + + .xalign-end { + justify-self: end; + justify-content: end; + } + + .yalign-start { + align-items: start; + } + + .yalign-center { + align-items: center; + } + + .yalign-end { + align-items: end; + } + + .yfill { + align-self: stretch; + } +} + +.form-binary, .editabletree-binary { + min-width: calc(5 * 2.4em); + + input:last-of-type { + text-align: right; + text-align: end; + } +} + +.form-multiselection, .dict-multiselection { + select { + option:before { + content: "☐ "; + } + option:checked:before { + content: "☑ "; + } + } + + &.yexpand { + select { + min-height: 150px; + max-height: 400px; + } + } +} + +.form-integer, .form-float, .form-timedelta, +.dict-integer, .dict-float, .dict-numeric, +.editabletree-integer, .editabletree-float, .editabletree-timedelta { + input { + text-align: right; + text-align: end; + } +} +.column-integer, .column-float, .column-timedelta, .column-binary { + text-align: right; + text-align: end; +} +.column-many2many, .column-one2many { + text-align: center; +} +input.column-boolean { + .center-block(); +} + +.column-many2one, .column-reference { + a:hover:after { + content: " 🔗"; + display: inline-block; + } +} + +.form-date, .form-datetime, .form-time, +.dict-date, .dict-datetime, +.input-date, .input-datetime-local, .input-time, +.editabletree-date, .editabletree-datetime, .editabletree-time { + .icon-input { + overflow-y: hidden; + } + input[type="date"], input[type="datetime-local"], input[type="time"] { + min-width: 0; + opacity: 0; + position: absolute; + width: calc(100% + 2em); + left: -2em; + + &::-webkit-calendar-picker-indicator { + bottom: 0; + left: 0; + position: absolute; + top: 0; + width: 100%; + height: 100%; + } + } +} + +.dict-label { + text-align: right; + text-align: end; +} + +.form-dict-container { + display: grid; + grid-template-columns: fit-content(50%) 1fr; +} + +.dict-row { + display: grid; + grid-template-columns: subgrid; + grid-column: 1 / span 2; + padding: 2px; +} + +.calendar { + width: 100%; + height: 100%; +} + +.graph { + min-height: 400px; +} + +.progress { + margin-bottom: 0px; +} + +.window-form { + .window-form-toolbar { + text-align: right; + text-align: end; + } +} + +.csv { + .modal-dialog { + .column-fields { + max-height: 400px; + overflow: auto; + white-space: nowrap; + } + li.dragged-row { + background-color: @state-info-bg; + } + } +} + +.email { + .email-richtext { + line-height: 2.5ex; + max-height: 50ex; + min-height: 12.5ex; + overflow: auto; + resize: vertical; + } + input[type='file'] { + display: inline-block; + } + .close { + float: none; + } +} + +.filter-window { + select[multiple] { + min-height: 150px; + max-height: 400px; + + option:before { + content: "☐ "; + } + option:checked:before { + content: "☑ "; + } + } +} + +@media screen and (max-width: @screen-xs-max) { + .form-dict-container { + grid-template-columns: 100%; + } + .dict-row { + grid-column: 1; + } + .dict-label { + text-align: left; + text-align: start; + } + .form-link { + display: none; + } + + .form { + .form-container, .form-hcontainer, .form-vcontainer { + display: block; + + .form-item { + padding: 2px 0; + } + } + + .xalign-end { + justify-self: start; + justify-content: start; + } + } +} + +@media screen and (max-width: @screen-xs-max) { + .responsive.scrollbar { + display: none; + > div { + min-width: unset !important; + } + } + table.responsive, + table.responsive > thead, + table.responsive > thead > tr, + table.responsive > thead > tr > th:not(.invisible), + table.responsive > tbody, + table.responsive > tbody > tr, + table.responsive > tbody > tr > td:not(.invisible), + table.responsive > tfoot, + table.responsive > tfoot > tr, + table.responsive > tfoot > tr > td:not(.invisible) { + display: block !important; + } + table.responsive > thead > tr > th.invisible, + table.responsive > tbody > tr > td.invisible, + table.responsive > tfoot > tr > td.invisible { + display: none; + } + table.responsive { + min-width: unset !important; + /* Hide table headers (but not display: none; for accessiblity) */ + > thead > tr { + position: absolute !important; + top: -9999px; + left: -9999px; + } + > thead > tr, + > tbody > tr > td { + max-width: unset !important; + text-align: left !important; + text-align: start !important; + /* Force height to empty content */ + & > span:empty { + min-height: calc(@line-height-computed + @table-condensed-cell-padding); + display: block; + } + } + + .more-row, + .cell { + .btn { + display: block; + width: 100%; + font-size: @font-size-base; + } + } + + tfoot { + background-color: @body-bg; + border: 1px solid @table-border-color; + position: sticky; + top: 0; + z-index: 100; + > tr { + & > td:empty, + > td > label { + display: none !important; + } + & th { + border: none; + & > label { + display: inline !important; + } + } + } + } + } + table.responsive-noheader { + > tbody > tr > td { + width: 100% !important; + } + } + table.responsive-header { + > tbody > tr { + border: 1px solid @table-border-color; + } + > tbody > tr > td, + > tfoot > tr > td { + /* Behave like a "row" */ + border: none; + position: relative; + } + > tbody > tr, + > tfoot > tr { + > td[data-title]:before { + /* Now like a table header */ + position: absolute; + /* Top/left values mimic padding */ + top: @table-condensed-cell-padding; + left: @table-condensed-cell-padding; + padding-right: calc(@table-condensed-cell-padding * 2); + [dir="rtl"] & { + left: unset; + right: @table-condensed-cell-padding; + padding-right: 0; + padding-left: calc(@table-condensed-cell-padding * 2); + } + text-align: left; + text-align: start; + overflow: hidden; + text-overflow: ellipsis; + /* Label */ + content: attr(data-title); + } + > td.required:before { + font-weight: bold; + } + > td.editable:before { + font-style: italic; + } + } + } +} + +@keyframes blink { + 50% { + color: transparent; + } +} + +#processing { + position: fixed; + top: 0px; + width: 100%; + z-index: 2000; + + .dot { + animation: 1s blink infinite; + + &:nth-child(2) { + animation-delay: 250ms; + } + &:nth-child(3) { + animation-delay: 500ms; + } + } +} + +.scrollbar { + flex: 0 0 content; + overflow: auto; + + > div { + height: 5px; + } +} + +.btn-code-scanner { + bottom: 0; + margin: 20px; + position: fixed; + right: 0; + text-align: right; + z-index: 1030; +} + +.modal .btn-code-scanner { + margin: 5px; + position: sticky; +} + +.infobar { + line-height: @line-height-computed; + position: fixed; + top: 30px; + left: 50%; + transform: translateX(-50%); + z-index: 1000; + min-width: 25%; + text-align: center; + font-size: @font-size-large; +} + +img.global-search-icon { + width: 2em; + height: 2em; +} + +img.favorite-icon { + width: 1em; + height: 1em; +} + +@import "input-icon"; +@import (optional) "custom.less"; diff --git a/naliia_sao_custom/view.py b/naliia_sao_custom/view.py new file mode 100644 index 0000000..03632b9 --- /dev/null +++ b/naliia_sao_custom/view.py @@ -0,0 +1,881 @@ +# This file is part of Tryton. The COPYRIGHT file at the top level of +# this repository contains the full copyright notices and license terms. +import json +import os + +from lxml import etree +from sql import Literal, Null + +from trytond.cache import Cache, MemoryCache +from trytond.i18n import gettext +from trytond.model import Index, ModelSQL, ModelView, fields, sequence_ordered +from trytond.model.exceptions import ValidationError +from trytond.pool import Pool +from trytond.pyson import PYSON, Bool, Eval, If, PYSONDecoder +from trytond.rpc import RPC +from trytond.tools import file_open +from trytond.transaction import Transaction +from trytond.wizard import Button, StateView, Wizard + +from ..action import DomainError, ViewError + +# Numbers taken from Bootstrap's breakpoints +WIDTH_BREAKPOINTS = [ + 1400, + 1200, + 992, + 768, + 576, + ] + + +class XMLError(ValidationError): + pass + + +class View( + fields.fmany2one( + 'model_ref', 'model', 'ir.model,name', "Model", + ondelete='CASCADE'), + fields.fmany2one( + 'field_children', 'field_childs,model', + 'ir.model.field,name,model', + "Children Field", + domain=[ + ('model', '=', Eval('model')), + ], + states={ + 'invisible': Eval('type') != 'tree', + }), + fields.fmany2one( + 'module_ref', 'module', 'ir.module,name', "Module", + readonly=True, ondelete='CASCADE'), + sequence_ordered('priority', "Priority"), ModelSQL, ModelView): + "View" + __name__ = 'ir.ui.view' + model = fields.Char('Model', states={ + 'required': Eval('type') != 'board', + }) + type = fields.Selection([ + (None, ''), + ('tree', 'Tree'), + ('form', 'Form'), + ('graph', 'Graph'), + ('calendar', 'Calendar'), + ('board', 'Board'), + ('list-form', "List Form"), + ], 'View Type', + domain=[ + If(Bool(Eval('inherit')), + ('type', '=', None), + ('type', '!=', None)), + ], + depends=['inherit']) + type_string = type.translated('type') + data = fields.Text('Data') + name = fields.Char('Name', states={ + 'invisible': ~(Eval('module') & Eval('name')), + }, depends=['module'], readonly=True) + arch = fields.Function(fields.Text('View Architecture', states={ + 'readonly': Bool(Eval('name')), + }, depends=['name']), 'get_arch', setter='set_arch') + basis = fields.Function(fields.Boolean("Basis"), 'get_basis') + inherit = fields.Many2One('ir.ui.view', 'Inherited View', + ondelete='CASCADE') + extensions = fields.One2Many( + 'ir.ui.view', 'inherit', "Extensions", + filter=[ + ('basis', '=', False), + ], + domain=[ + ('model', '=', Eval('model')), + ('type', '=', None), + ], + states={ + 'invisible': ~Eval('type'), + }, + order=[('id', None)]) + field_childs = fields.Char('Children Field', states={ + 'invisible': Eval('type') != 'tree', + }, depends=['type']) + module = fields.Char('Module', states={ + 'invisible': ~Eval('module'), + }, readonly=True) + domain = fields.Char('Domain', states={ + 'invisible': ~Eval('inherit'), + }, depends=['inherit']) + _get_rng_cache = MemoryCache('ir_ui_view.get_rng', context=False) + _view_get_cache = Cache('ir_ui_view.view_get') + __module_index = None + + @classmethod + def __setup__(cls): + super().__setup__() + table = cls.__table__() + cls.priority.required = True + + cls.__rpc__['view_get'] = RPC(instantiate=0, cache=dict(days=1)) + cls._buttons.update({ + 'show': { + 'readonly': Eval('type') != 'form', + 'invisible': ~Eval('basis', False), + 'depends': ['type', 'basis'], + }, + }) + cls._sql_indexes.update({ + Index(table, + (table.model, Index.Equality()), + (table.inherit, Index.Range())), + Index( + table, + (table.id, Index.Range()), + (table.inherit, Index.Range())), + }) + + @staticmethod + def default_priority(): + return 16 + + @staticmethod + def default_module(): + return Transaction().context.get('module') + + def get_basis(self, name): + return not self.inherit or self.model != self.inherit.model + + @classmethod + def domain_basis(cls, domain, tables): + table, _ = tables[None] + if 'inherit' not in tables: + inherit = cls.__table__() + tables['inherit'] = { + None: (inherit, table.inherit == inherit.id), + } + else: + inherit, _ = tables['inherit'][None] + expression = (table.inherit == Null) | (table.model != inherit.model) + + _, operator, value = domain + if operator in {'=', '!='}: + if (operator == '=') != value: + expression = ~expression + elif operator in {'in', 'not in'}: + if True in value and False not in value: + pass + elif False in value and True not in value: + expression = ~expression + else: + expression = Literal(True) + else: + expression = Literal(True) + return expression + + def get_rec_name(self, name): + return ' '.join(filter(None, [ + self.model_ref.rec_name if self.model_ref else '', + '(%s)' % ( + self.inherit.rec_name if self.inherit else + self.type_string), + ])) + + @classmethod + def search_rec_name(cls, name, clause): + return [('model_ref.rec_name', *clause[1:])] + + @classmethod + @ModelView.button_action('ir.act_view_show') + def show(cls, views): + pass + + @classmethod + def get_rng(cls, type_): + key = (cls.__name__, type_) + rng = cls._get_rng_cache.get(key) + if rng is None: + if type_ == 'list-form': + type_ = 'form' + rng_name = os.path.join(os.path.dirname(__file__), type_ + '.rng') + with open(rng_name, 'rb') as fp: + rng = etree.fromstring(fp.read()) + cls._get_rng_cache.set(key, rng) + return rng + + @property + def rng_type(self): + if self.inherit: + return self.inherit.rng_type + return self.type + + @classmethod + def validate(cls, views): + super().validate(views) + cls.check_xml(views) + + @classmethod + def check_xml(cls, views): + "Check XML" + for view in views: + if not view.arch: + continue + xml = view.arch.strip() + if not xml: + continue + tree = etree.fromstring(xml) + + if hasattr(etree, 'RelaxNG'): + validator = etree.RelaxNG(etree=cls.get_rng(view.rng_type)) + if not validator.validate(tree): + error_log = '\n'.join(map(str, + validator.error_log.filter_from_errors())) + raise XMLError( + gettext('ir.msg_view_invalid_xml', name=view.rec_name), + error_log) + root_element = tree.getroottree().getroot() + + # validate pyson attributes + validates = { + 'states': fields.states_validate, + } + + def encode(element): + for attr in ('states', 'domain', 'spell'): + if not element.get(attr): + continue + try: + value = PYSONDecoder().decode(element.get(attr)) + validates.get(attr, lambda a: True)(value) + except Exception as e: + error_log = '%s: <%s %s="%s"/>' % ( + e, element.get('id') or element.get('name'), attr, + element.get(attr)) + raise XMLError( + gettext( + 'ir.msg_view_invalid_xml', name=view.rec_name), + error_log) from e + for child in element: + encode(child) + encode(root_element) + + def get_arch(self, name): + value = None + if self.name and self.module: + path = os.path.join(self.module, 'view', self.name + '.xml') + try: + with file_open(path, + subdir='modules', mode='r', encoding='utf-8') as fp: + value = fp.read() + except IOError: + pass + if not value: + value = self.data + return value + + @classmethod + def set_arch(cls, views, name, value): + cls.write(views, {'data': value}) + + @classmethod + def on_modification(cls, mode, records, field_names=None): + super().on_modification(mode, records, field_names=field_names) + cls._view_get_cache.clear() + ModelView._fields_view_get_cache.clear() + + @property + def _module_index(self): + from trytond.modules import create_graph, get_modules + if self.__class__.__module_index is None: + graph = create_graph(get_modules(with_test=Pool.test)) + modules = [m.name for m in graph] + self.__class__.__module_index = { + m: i for i, m in enumerate(reversed(modules))} + return self.__class__.__module_index + + def view_get(self, model=None): + key = (self.id, model) + result = self._view_get_cache.get(key) + if result: + return result + if self.inherit: + if self.inherit.model == model: + return self.inherit.view_get(model=model) + else: + arch = self.inherit.view_get(self.inherit.model)['arch'] + else: + arch = self.arch + + views = self.__class__.search(['OR', [ + ('inherit', '=', self.id), + ('model', '=', model), + ], [ + ('id', '=', self.id), + ('inherit', '!=', None), + ], + ]) + views.sort( + key=lambda v: self._module_index.get(v.module, -1), reverse=True) + parser = etree.XMLParser(remove_comments=True, resolve_entities=False) + tree = etree.fromstring(arch, parser=parser) + decoder = PYSONDecoder({'context': Transaction().context}) + for view in views: + if view.domain and not decoder.decode(view.domain): + continue + if not view.arch or not view.arch.strip(): + continue + tree_inherit = etree.fromstring(view.arch, parser=parser) + tree = self.inherit_apply(tree, tree_inherit) + if model: + root = tree.getroottree().getroot() + self._translate(root, model, Transaction().language) + arch = etree.tostring(tree, encoding='utf-8').decode('utf-8') + result = { + 'type': self.rng_type, + 'view_id': self.id, + 'arch': arch, + 'field_childs': self.field_childs, + } + self._view_get_cache.set(key, result) + return result + + @classmethod + def inherit_apply(cls, tree, inherit): + root_inherit = inherit.getroottree().getroot() + for element in root_inherit: + expr = element.get('expr') + targets = tree.xpath(expr) + assert targets, "No elements found for expression %r" % expr + for target in targets: + position = element.get('position', 'inside') + new_tree = getattr(cls, '_inherit_apply_%s' % position)( + tree, element, target) + if new_tree: + tree = new_tree + return tree + + @classmethod + def _inherit_apply_replace(cls, tree, element, target): + parent = target.getparent() + if parent is None: + tree, = element + return tree + cls._inherit_apply_after(tree, element, target) + parent.remove(target) + + @classmethod + def _inherit_apply_replace_attributes(cls, tree, element, target): + child, = element + for attr in child.attrib: + target.set(attr, child.get(attr)) + + @classmethod + def _inherit_apply_inside(cls, tree, element, target): + target.extend(list(element)) + + @classmethod + def _inherit_apply_after(cls, tree, element, target): + parent = target.getparent() + next_ = target.getnext() + if next_ is not None: + for child in element: + index = parent.index(next_) + parent.insert(index, child) + else: + parent.extend(list(element)) + + @classmethod + def _inherit_apply_before(cls, tree, element, target): + parent = target.getparent() + for child in element: + index = parent.index(target) + parent.insert(index, child) + + @classmethod + def _translate(cls, element, model, language): + pool = Pool() + Translation = pool.get('ir.translation') + for attr in ['string', 'sum', 'confirm', 'help']: + if element.get(attr): + translation = Translation.get_source( + model, 'view', language, element.get(attr)) + if translation: + element.set(attr, translation) + for child in element: + cls._translate(child, model, language) + + +class ShowViewStart(ModelView): + 'Show view' + __name__ = 'ir.ui.view.show.start' + __no_slots__ = True + + +class ShowView(Wizard): + 'Show view' + __name__ = 'ir.ui.view.show' + + class ShowStateView(StateView): + + def __init__(self, model_name, buttons): + StateView.__init__(self, model_name, None, buttons) + + def get_view(self, wizard, state_name): + pool = Pool() + View = pool.get('ir.ui.view') + view_id = Transaction().context.get('active_id') + if not view_id: + # Set type to please ModuleTestCase.test_wizards + return {'type': 'form'} + view = View(view_id) + Model = pool.get(view.model) + return Model.fields_view_get(view_id=view.id) + + def get_defaults(self, wizard, state_name, fields): + return {} + + start = ShowStateView('ir.ui.view.show.start', [ + Button('Close', 'end', 'tryton-close', default=True), + ]) + + +class ViewTreeWidth( + fields.fmany2one( + 'model_ref', 'model', 'ir.model,name', "Model", + required=True, ondelete='CASCADE'), + fields.fmany2one( + 'field_ref', 'field,model', 'ir.model.field,name,model', "Field", + required=True, ondelete='CASCADE', + domain=[ + ('model', '=', Eval('model')), + ]), + ModelSQL, ModelView): + "View Tree Width" + __name__ = 'ir.ui.view_tree_width' + model = fields.Char('Model', required=True) + field = fields.Char('Field', required=True) + user = fields.Many2One('res.user', 'User', required=True, + ondelete='CASCADE') + screen_width = fields.Integer("Screen Width") + width = fields.Integer('Width', required=True) + + @classmethod + def __setup__(cls): + super().__setup__() + table = cls.__table__() + cls.__rpc__.update({ + 'set_width': RPC(readonly=False), + 'reset_width': RPC(readonly=False), + }) + cls._sql_indexes.add( + Index( + table, + (table.user, Index.Range()), + (table.model, Index.Equality()), + (table.field, Index.Equality()))) + + def get_rec_name(self, name): + return f'{self.field_ref.rec_name} @ {self.model_ref.rec_name}' + + @classmethod + def search_rec_name(cls, name, clause): + operator = clause[1] + if operator.startswith('!') or operator.startswith('not '): + bool_op = 'AND' + else: + bool_op = 'OR' + return [bool_op, + ('model_ref.rec_name', *clause[1:]), + ('field_ref.rec_name', *clause[1:]), + ] + + @classmethod + def on_modification(cls, mode, records, field_names=None): + super().on_modification(mode, records, field_names=field_names) + ModelView._fields_view_get_cache.clear() + + @classmethod + def get_width(cls, model, width): + for screen_width in WIDTH_BREAKPOINTS: + if width >= screen_width: + break + else: + screen_width = 0 + + user = Transaction().user + records = cls.search([ + ('user', '=', user), + ('model', '=', model), + ('screen_width', '=', screen_width), + ]) + + if not records: + records = cls.search([ + ('user', '=', user), + ('model', '=', model), + ['OR', + ('screen_width', '<=', screen_width), + ('screen_width', '=', None), + ], + ], + order=[ + ('screen_width', 'DESC NULLS LAST'), + ]) + widths = {} + for width in records: + if width.field not in widths: + widths[width.field] = width.width + return widths + + @classmethod + def set_width(cls, model, fields, width): + ''' + Set width for the current user on the model. + fields is a dictionary with key: field name and value: width. + ''' + for screen_width in WIDTH_BREAKPOINTS: + if width >= screen_width: + break + else: + screen_width = 0 + + user_id = Transaction().user + records = cls.search([ + ('user', '=', user_id), + ('model', '=', model), + ('field', 'in', list(fields.keys())), + ['OR', + ('screen_width', '=', screen_width), + ('screen_width', '=', None), + ], + ]) + + fields = fields.copy() + to_save, to_delete = [], [] + for tree_width in records: + if tree_width.screen_width == screen_width: + if tree_width.field in fields: + tree_width.width = fields.pop(tree_width.field) + to_save.append(tree_width) + else: + to_delete.append(tree_width) + + for name, width in fields.items(): + to_save.append(cls( + user=user_id, + model=model, + field=name, + screen_width=screen_width, + width=width)) + + if to_save: + cls.save(to_save) + if to_delete: + cls.delete(to_delete) + + @classmethod + def reset_width(cls, model, width): + for screen_width in WIDTH_BREAKPOINTS: + if width >= screen_width: + break + else: + screen_width = 0 + + user_id = Transaction().user + records = cls.search([ + ('user', '=', user_id), + ('model', '=', model), + ['OR', + ('screen_width', '=', screen_width), + ('screen_width', '=', None), + ], + ]) + cls.delete(records) + + +class ViewTreeOptional( + fields.fmany2one( + 'model_ref', 'model', 'ir.model,name', "Model", + required=True, ondelete='CASCADE'), + fields.fmany2one( + 'field_ref', 'field,model', 'ir.model.field,name,model', "Field", + required=True, ondelete='CASCADE', + domain=[ + ('model', '=', Eval('model')), + ]), + ModelSQL, ModelView): + "View Tree Optional" + __name__ = 'ir.ui.view_tree_optional' + view = fields.Many2One( + 'ir.ui.view', "View", required=True, ondelete='CASCADE') + user = fields.Many2One( + 'res.user', "User", required=True, ondelete='CASCADE') + model = fields.Char("Model", required=True) + field = fields.Char("Field", required=True) + value = fields.Boolean("Value") + + @classmethod + def __setup__(cls): + super().__setup__() + cls.__rpc__.update({ + 'set_optional': RPC(readonly=False), + }) + table = cls.__table__() + cls._sql_indexes.add( + Index( + table, + (table.user, Index.Range()), + (table.view, Index.Range()))) + + @classmethod + def __register__(cls, module): + pool = Pool() + View = pool.get('ir.ui.view') + table = cls.__table__() + view = View.__table__() + table_h = cls.__table_handler__(module) + cursor = Transaction().connection.cursor() + + # Migration from 7.2: rename view_id into view + table_h.column_rename('view_id', 'view') + + super().__register__(module) + + # Migration from 7.2: add model + cursor.execute(*table.update( + [table.model], + [view.select(view.model, where=view.id == table.view)], + where=table.model == Null)) + + @classmethod + def validate_fields(cls, records, fields_names): + super().validate_fields(records, fields_names) + cls.check_view(records, fields_names) + + @classmethod + def check_view(cls, records, fields_names=None): + if fields_names and 'view' not in fields_names: + return + for record in records: + if record.view and record.view.rng_type != 'tree': + raise ViewError(gettext( + 'ir.msg_view_tree_optional_type', + view=record.view.rec_name)) + + @classmethod + def on_modification(cls, mode, record, field_names=None): + super().on_modification(mode, record, field_names=field_names) + ModelView._fields_view_get_cache.clear() + + @classmethod + def set_optional(cls, view_id, fields): + "Store optional field that must be displayed" + pool = Pool() + View = pool.get('ir.ui.view') + user = Transaction().user + view = View(view_id) + records = cls.search([ + ('view', '=', view.id), + ('user', '=', user), + ('field', 'in', list(fields)), + ]) + cls.delete(records) + to_create = [] + for field, value in fields.items(): + to_create.append({ + 'view': view, + 'user': user, + 'model': view.model, + 'field': field, + 'value': bool(value), + }) + if to_create: + cls.create(to_create) + + +class ViewTreeState( + fields.fmany2one( + 'model_ref', 'model', 'ir.model,name', "Model", + required=True, ondelete='CASCADE'), + fields.fmany2one( + 'child_field', 'child_name,model', 'ir.model.field,name,model', + "Child Field", ondelete='CASCADE', + domain=[ + ('model', '=', Eval('model')), + ]), + ModelSQL, ModelView): + 'View Tree State' + __name__ = 'ir.ui.view_tree_state' + _rec_name = 'model' + model = fields.Char('Model', required=True) + domain = fields.Char('Domain', required=True) + user = fields.Many2One('res.user', 'User', required=True, + ondelete='CASCADE') + child_name = fields.Char('Child Name') + nodes = fields.Text('Expanded Nodes') + selected_nodes = fields.Text('Selected Nodes') + + @classmethod + def __setup__(cls): + super().__setup__() + cls.__rpc__.update({ + 'set': RPC(readonly=False, check_access=False), + 'get': RPC(check_access=False, cache=dict(days=1)), + }) + + table = cls.__table__() + cls._sql_indexes.add( + Index( + table, + (table.user, Index.Range()), + (table.model, Index.Equality()), + (table.child_name, Index.Equality()), + (table.domain, Index.Equality()))) + + @staticmethod + def default_nodes(): + return '[]' + + @staticmethod + def default_selected_nodes(): + return '[]' + + @classmethod + def set(cls, model, domain, child_name, nodes, selected_nodes): + # Normalize the json domain + domain = json.dumps(json.loads(domain), separators=(',', ':')) + current_user = Transaction().user + records = cls.search([ + ('user', '=', current_user), + ('model', '=', model), + ('domain', '=', domain), + ('child_name', '=', child_name), + ]) + cls.delete(records) + cls.create([{ + 'user': current_user, + 'model': model, + 'domain': domain, + 'child_name': child_name, + 'nodes': nodes, + 'selected_nodes': selected_nodes, + }]) + + @classmethod + def get(cls, model, domain, child_name): + # Normalize the json domain + domain = json.dumps(json.loads(domain), separators=(',', ':')) + current_user = Transaction().user + try: + expanded_info, = cls.search([ + ('user', '=', current_user), + ('model', '=', model), + ('domain', '=', domain), + ('child_name', '=', child_name), + ], + limit=1) + except ValueError: + return (cls.default_nodes(), cls.default_selected_nodes()) + state = cls(expanded_info) + return (state.nodes or cls.default_nodes(), + state.selected_nodes or cls.default_selected_nodes()) + + +class ViewSearch( + fields.fmany2one( + 'model_ref', 'model', 'ir.model,name', "Model", + required=True, ondelete='CASCADE'), + ModelSQL, ModelView): + "View Search" + __name__ = 'ir.ui.view_search' + + name = fields.Char('Name', required=True) + model = fields.Char('Model', required=True) + domain = fields.Char('Domain', help="The PYSON domain.") + user = fields.Many2One('res.user', 'User', ondelete='CASCADE') + + @classmethod + def __setup__(cls): + super().__setup__() + cls.__rpc__.update({ + 'get': RPC(check_access=False), + 'set': RPC(check_access=False, readonly=False), + 'unset': RPC(check_access=False, readonly=False), + }) + + @staticmethod + def default_user(): + return Transaction().user + + @classmethod + def validate_fields(cls, searches, field_names): + super().validate_fields(searches, field_names) + cls.check_domain(searches, field_names) + + @classmethod + def check_domain(cls, searches, field_names): + decoder = PYSONDecoder() + if field_names and 'domain' not in field_names: + return + for search in searches: + try: + value = decoder.decode(search.domain) + except Exception as exception: + raise DomainError( + gettext('ir.msg_view_search_invalid_domain', + domain=search.domain, + search=search.rec_name)) from exception + if isinstance(value, PYSON): + if not value.types() == set([list]): + raise DomainError( + gettext('ir.msg_view_search_invalid_domain', + domain=search.domain, + search=search.rec_name)) + elif not isinstance(value, list): + raise DomainError( + gettext('ir.msg_view_search_invalid_domain', + domain=search.domain, + search=search.rec_name)) + else: + try: + fields.domain_validate(value) + except Exception as exception: + raise DomainError( + gettext('ir.msg_view_search_invalid_domain', + domain=search.domain, + search=search.rec_name)) from exception + + @classmethod + def get(cls): + decoder = PYSONDecoder() + user = Transaction().user + searches = cls.search_read(['OR', + ('user', '=', user), + ('user', '=', None), + ], + order=[('model', 'ASC'), ('name', 'ASC')], + fields_names=['id', 'name', 'model', 'domain', '_delete']) + result = {} + for search in searches: + result.setdefault(search['model'], []).append(( + search['id'], + search['name'], + decoder.decode(search['domain']), + search['_delete'])) + return result + + @classmethod + def set(cls, name, model, domain): + user = Transaction().user + search, = cls.create([{ + 'name': name, + 'model': model, + 'domain': domain, + 'user': user, + }]) + return search.id + + @classmethod + def unset(cls, id): + user = Transaction().user + cls.delete(cls.search([ + ('id', '=', id), + ('user', '=', user), + ])) diff --git a/naliia_sao_custom/window.js b/naliia_sao_custom/window.js new file mode 100644 index 0000000..8871e64 --- /dev/null +++ b/naliia_sao_custom/window.js @@ -0,0 +1,2882 @@ +/* This file is part of Tryton. The COPYRIGHT file at the top level of + this repository contains the full copyright notices and license terms. */ +(function() { + 'use strict'; + + var ENCODINGS = ["866", "ansi_x3.4-1968", "arabic", "ascii", + "asmo-708", "big5", "big5-hkscs", "chinese", "cn-big5", "cp1250", + "cp1251", "cp1252", "cp1253", "cp1254", "cp1255", "cp1256", + "cp1257", "cp1258", "cp819", "cp866", "csbig5", "cseuckr", + "cseucpkdfmtjapanese", "csgb2312", "csibm866", "csiso2022jp", + "csiso2022kr", "csiso58gb231280", "csiso88596e", "csiso88596i", + "csiso88598e", "csiso88598i", "csisolatin1", "csisolatin2", + "csisolatin3", "csisolatin4", "csisolatin5", "csisolatin6", + "csisolatin9", "csisolatinarabic", "csisolatincyrillic", + "csisolatingreek", "csisolatinhebrew", "cskoi8r", "csksc56011987", + "csmacintosh", "csshiftjis", "cyrillic", "dos-874", "ecma-114", + "ecma-118", "elot_928", "euc-jp", "euc-kr", "gb18030", "gb2312", + "gb_2312", "gb_2312-80", "gbk", "greek", "greek8", "hebrew", + "hz-gb-2312", "ibm819", "ibm866", "iso-2022-cn", "iso-2022-cn-ext", + "iso-2022-jp", "iso-2022-kr", "iso-8859-1", "iso-8859-10", + "iso-8859-11", "iso-8859-13", "iso-8859-14", "iso-8859-15", + "iso-8859-16", "iso-8859-2", "iso-8859-3", "iso-8859-4", + "iso-8859-5", "iso-8859-6", "iso-8859-6-e", "iso-8859-6-i", + "iso-8859-7", "iso-8859-8", "iso-8859-8-e", "iso-8859-8-i", + "iso-8859-9", "iso-ir-100", "iso-ir-101", "iso-ir-109", + "iso-ir-110", "iso-ir-126", "iso-ir-127", "iso-ir-138", + "iso-ir-144", "iso-ir-148", "iso-ir-149", "iso-ir-157", "iso-ir-58", + "iso8859-1", "iso8859-10", "iso8859-11", "iso8859-13", "iso8859-14", + "iso8859-15", "iso8859-2", "iso8859-3", "iso8859-4", "iso8859-5", + "iso8859-6", "iso8859-7", "iso8859-8", "iso8859-9", "iso88591", + "iso885910", "iso885911", "iso885913", "iso885914", "iso885915", + "iso88592", "iso88593", "iso88594", "iso88595", "iso88596", + "iso88597", "iso88598", "iso88599", "iso_8859-1", "iso_8859-15", + "iso_8859-1:1987", "iso_8859-2", "iso_8859-2:1987", "iso_8859-3", + "iso_8859-3:1988", "iso_8859-4", "iso_8859-4:1988", "iso_8859-5", + "iso_8859-5:1988", "iso_8859-6", "iso_8859-6:1987", "iso_8859-7", + "iso_8859-7:1987", "iso_8859-8", "iso_8859-8:1988", "iso_8859-9", + "iso_8859-9:1989", "koi", "koi8", "koi8-r", "koi8-ru", "koi8-u", + "koi8_r", "korean", "ks_c_5601-1987", "ks_c_5601-1989", "ksc5601", + "ksc_5601", "l1", "l2", "l3", "l4", "l5", "l6", "l9", "latin1", + "latin2", "latin3", "latin4", "latin5", "latin6", "logical", "mac", + "macintosh", "ms932", "ms_kanji", "shift-jis", "shift_jis", "sjis", + "sun_eu_greek", "tis-620", "unicode-1-1-utf-8", "us-ascii", + "utf-16", "utf-16be", "utf-16le", "utf-8", "utf8", "visual", + "windows-1250", "windows-1251", "windows-1252", "windows-1253", + "windows-1254", "windows-1255", "windows-1256", "windows-1257", + "windows-1258", "windows-31j", "windows-874", "windows-949", + "x-cp1250", "x-cp1251", "x-cp1252", "x-cp1253", "x-cp1254", + "x-cp1255", "x-cp1256", "x-cp1257", "x-cp1258", "x-euc-jp", "x-gbk", + "x-mac-cyrillic", "x-mac-roman", "x-mac-ukrainian", "x-sjis", + "x-user-defined", "x-x-big5"]; + + Sao.Window = {}; + + Sao.Window.InfoBar = Sao.class_(Object, { + init: function() { + this.el = jQuery('
', { + 'class': 'infobar', + }); + this.__messages = new Set(); + }, + add: function(message, type, kind) { + kind = kind || null; + if (!message) { + return; + } + var key = JSON.stringify([message, type]); + if (!this.__messages.has(key)) { + var infobar = jQuery('
', { + 'class': 'alert alert-dismissible alert-' + ( + type || 'error'), + 'role': 'alert', + }).append(jQuery('