diff options
Diffstat (limited to 'public')
-rw-r--r-- | public/css/combined.less | 969 | ||||
-rw-r--r-- | public/js/combined.js | 69 | ||||
-rw-r--r-- | public/js/loader.js | 54 | ||||
-rw-r--r-- | public/js/module.js | 19 |
4 files changed, 1111 insertions, 0 deletions
diff --git a/public/css/combined.less b/public/css/combined.less new file mode 100644 index 0000000..422a94c --- /dev/null +++ b/public/css/combined.less @@ -0,0 +1,969 @@ +@color-diff-ins: @color-ok; +@color-diff-del: @color-critical; +@color-diff-changed-old: fade(@color-critical, 30%); +@color-diff-changed-new: fade(@color-ok, 30%); +@color-diff-green-shade-light: #dfd; +@color-diff-pale-green: #9e9; +@color-diff-text-on-diff: #051030; +@color-change-replace-del: #e99; + +.Differences { + width: 100%; + table-layout: fixed; + empty-cells: show; +} + +.Differences thead { + display: none; +} + +.Differences thead th { + text-align: left; + padding-left: 4 / 14 * 16em; +} + +.Differences tbody th { + text-align: right; + width: 4em; + padding: 1px 2px; + border-right: 1px solid @gray-light; + background: @gray-lightest; + font-weight: normal; + vertical-align: top; +} + +.Differences tbody td { + color: @text-color; + width: 50%; + .preformatted(); + word-break: break-all; +} + +.DifferencesSideBySide { + ins, del { + text-decoration: none; + } + + .ChangeInsert { + td.Left { + background: @gray-lighter; + } + td.Right { + background: @color-diff-changed-new; + color: @color-diff-text-on-diff; + } + } + + .ChangeDelete { + td.Left { + background: @color-diff-changed-old; + color: @color-diff-text-on-diff; + } + td.Right { + background: @gray-lighter; + } + } + + .ChangeReplace { + td.Left { + background: @color-diff-changed-old; + color: @color-diff-text-on-diff; + del { + background: @color-diff-del; + } + } + + td.Right { + background: @color-diff-changed-new; + color: @color-diff-text-on-diff; + ins { + background: @color-diff-ins; + } + } + + } +} + +.Differences .Skipped { + background: @gray-lightest; +} + +.DifferencesInline .ChangeReplace .Left, +.DifferencesInline .ChangeDelete .Left { + background: @color-diff-changed-old; +} + +.DifferencesInline .ChangeReplace .Right, +.DifferencesInline .ChangeInsert .Right { + background: @color-diff-green-shade-light; +} + +.DifferencesInline .ChangeReplace ins { + background: @color-diff-pale-green; +} + +.DifferencesInline .ChangeReplace del { + background: @color-change-replace-del; +} + +.DifferencesInline { + tr td:last-child { + width: 90%; + } + tr th:first-child { + width: 5%; + } + tr th:nth-child(2) { + width: 5%; + } + ins, del { + text-decoration: none; + } +} + +#layout.compact-layout, #layout.default-layout { + &.twocols table.Differences { + th { + font-size: 0.75em; + } + td { + font-size: 0.916em; + } + } +} +div.gipfl-action-bar { + > * { + vertical-align: middle; + } + .pagination-control { + float: none; + clear: none; + display: inline-block; + line-height: inherit; + margin: 0; + } + + form input { + margin: 0; + } +} + +div.gipfl-action-bar a, div.gipfl-action-bar form i { + color: @icinga-blue; +} + +div.gipfl-action-bar a.badge { + color: inherit; +} + +div.gipfl-action-bar > a { + margin-right: 1em; +} + +#layout.twocols div.gipfl-action-bar .pagination-control { + li { + display: none; + } + + li:nth-child(1), li.active, li:last-child { + display: list-item; + } + + li.active a { + border-bottom: none; + } +} + +/** Dropdown in action bar **/ +div.gipfl-action-bar ul { + padding: 0; + margin: 0; + + li { + list-style-type: none; + a { display: block; } + } +} + +div.gipfl-action-bar > ul { + display: inline-block; + > li { + display: inline-block; + } + ul { + padding: 0.5em 1em 0 0; + min-width: 10em; + position: absolute; + display: none; + background-color: @menu-flyout-bg-color; + border: 1px solid @gray-light; + box-shadow: 0.3em 0.3em 0.3em 0 rgba(0, 0, 0, 0.2); + + a { + display: block; + padding: 0.3em 0.5em 0.3em 1em; + margin: 0; + outline: none; + color: @menu-flyout-color; + + &:hover { + text-decoration: underline; + &:before { + text-decoration: none; + } + } + } + + li.active a { + font-weight: bold; + } + } + > li:hover ul { + display: block; + z-index: 2; + } + > li > a { + padding: 0.2em 0.5em; + } + > li:hover { + background-color: @tr-active-color; + border-top-left-radius: 0.1em; + border-top-right-radius: 0.1em; + & > a { + color: @icinga-blue; + text-decoration: none; + } + } +} +/** END of dropdown in action bar **/ +form.gipfl-quicksearch { + display: block; + input.search { + width: 8em; + min-width: unset; + border: none; + background-color: inherit; + padding-left: 2em; + margin-left: 1.5em; + font-size: 0.75em; + font-weight: normal; + &:focus { + width: 16em; + border: none; + } + } +} +@gipfl-color-low-sat-blue: #dae3e6; +// map Icinga vars, to avoid warnings in other files +@gipfl-color-main: @icinga-blue; +@gipfl-color-text: @text-color; +@gipfl-color-gray-light: @gray-light; +@gipfl-bg-element: #f2f1f0; +@gipfl-bg-element: @low-sat-blue; +@gipfl-icon-font: 'ifont'; +/** + * Lightweight support for small collapsible components + * + * @since v0.6.0 + */ +.gipfl-collapsible-control { + display: block; + border-bottom: 1px solid @gipfl-color-gray-light; + &:hover { + cursor: pointer; + text-decoration: none; + } + &::after { + font-family: @gipfl-icon-font; + content: '\f103'; + float: right; + margin-right: 0.5em; + color: @gipfl-color-gray-light; + } + &:hover { + &::after { + color: @gipfl-color-text; + } + } + &:focus { + text-decoration: none; + &::after { + color: @gipfl-color-main; + } + } +} + +.gipfl-collapsible .collapsed { + :not(.gipfl-collapsible-control) { + display: none; + } + .gipfl-collapsible-control { + &::after { + content: '\e87a'; + } + } +} + +ul.gipfl-collapsible { + list-style-type: none; + margin: 0; + padding: 0; + li { + margin: 0; + } + .gipfl-collapsible-control { + font-weight: bold; + line-height: 2em; + } +} +/** + * State Hints + * + * @since v0.6.0 + */ +div.gipfl-widget-hint { + border: 1px solid @text-color; + padding: 0.5em; + line-height: 2em; + max-width: 60em; + border-left-width: 3em; + border-radius: 0.25em; + margin-bottom: 1em; + background-color: @body-bg-color; + box-shadow: fade(@text-color, 30%) 1em 0 1.5em 0; + &:before { + position: relative; + margin-left: -1.4em; + margin-right: 0.5em; + height: 100%; + vertical-align: middle; + font-family: 'ifont'; + color: white; + font-size: 2em; + } + &.ok { + border-color: @color-ok; + box-shadow: fade(@color-ok, 30%) 1em 0 1.5em 0; + } + &.info { + border-color: @color-pending; + box-shadow: fade(@color-pending, 30%) 1em 0 1.5em 0; + } + &.warning { + border-color: @color-warning; + box-shadow: fade(@color-warning, 30%) 1em 0 1.5em 0; + } + &.error { + border-color: @color-critical; + box-shadow: fade(@color-critical, 30%) 1em 0 1.5em 0; + } + &.critical:before, &.error:before { + content: '\e881'; + } + &.warning:before { + content: '\e881'; + } + &.info:before { + content: '\e87d'; + } + &.ok:before { + content: '\e803'; + } + a { + text-decoration: underline; + } +} +table.gipfl-name-value-table { + width: 100%; + > tbody > tr > th { + color: @text-color-light; + // Reset default font-weight + font-weight: bold; + padding-left: 0; + text-align: right; + vertical-align: top; + width: 12em; + } + > tbody > tr > td { + vertical-align: top; + } +} + +table.gipfl-name-value-table a { + color: @icinga-blue; +} + +table.gipfl-name-value-table pre { + background-color: transparent; + margin: 0; + padding: 0; + font-size: unset; + display: inline; +} +form.gipfl-form { + input[type="submit"] { + margin-right: 0.5em; + } + input[type="submit"]:first-of-type { + background-color: @icinga-blue; + color: @text-color-inverted; + border: 2px solid @icinga-blue; + font-weight: bold; + } + + select:not([multiple]) { + padding-right: 1.5625em; + background-image: url(../img/select-icon.svg); + background-repeat: no-repeat; + background-position: right center; + background-size: contain; + } + + input.validated { + background-color: fade(@color-ok, 30%); + border-color: @color-ok; + } + + :not(output):-moz-ui-invalid, :not(output).invalid { + background-color: fade(@color-critical, 30%); + border-color: @color-critical; + box-shadow: none; + } + + input[type=text].input-with-button { + max-width: 30em; + min-width: 18em; + width: 80%; + margin: 0; + border-top-right-radius: unset; + border-bottom-right-radius: unset; + border-right-style: none; + &:focus { + border-right-style: none; + } + } + + input[type=submit].input-element-related-button { + width: 20%; + max-width: 6em; + background-color: @icinga-blue; + color: @text-color-inverted; + border: 1px solid @icinga-blue; + border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + -webkit-border-radius: 0 3px 3px 0; + line-height: 2em; + height: 2.4em; + padding: 0; + margin: 0 1em 0 0; + &:hover { + background-color: @text-color-inverted; + color: @icinga-blue; + border-color: @icinga-blue; + } + } + p.gipfl-widget-hint { + max-width: 52.5em; + } + p.gipfl-element-description { + max-width: 36em; + } +} +form.gipfl-form { + label { + line-height: 2em; + } + dl { + margin: 0; + padding: 0; + &.active { + dt label { + text-decoration: underline; + } + } + } + + dt { + padding: 0; + margin: 0.5em 0 0 0; + display: inline-block; + vertical-align: top; + min-width: 8em; + max-width: 16em; + min-height: 2.5em; + width: 27%; + label { + color: @text-color; + font-weight: bold; + width: 12em; + font-size: inherit; + + &:hover { + text-decoration: underline; + cursor: pointer; + } + } + + &.errors label { + color: @color-critical; + } + } + + dd { + padding: 0.3em 0.5em; + margin: 0; + display: inline-block; + width: 73%; + min-height: 2.5em; + vertical-align: top; + + &.errors { + input[type=text], select { + border-color: @color-critical; + } + } + + &.full-width { + padding: 0.5em; + width: 100%; + } + + &:after { + display: block; + content: ''; + } + + ul.errors, ul.gipfl-form-element-errors { + list-style-type: none; + padding-left: 0.3em; + + li { + color: @colorCritical; + padding: 0.3em; + } + } + } + + input[type="text"], + input[type="password"], + input[type="number"], + input[type="datetime-local"], + input[type="date"], + input[type="time"], + textarea, + select { + background-color: @gipfl-bg-element; + } + + .errors label { + color: @color-critical; + } + + textarea { + height: auto; + max-width: 100%; + } + + input[type=file] { + background-color: @text-color-inverted; + padding-right: 1em; + } + + input[type=submit] { + .button(); + transition: none; // Avoid flickering on autosubmit + border-width: 1px; + margin-top: 0.5em; + + &:disabled { + border-color: @gray-light; + // background-color: @gray-light; + // color: #fff; + cursor: wait; + } + &:first-of-type { + border-width: 2px; + } + } + + select { + border: 1px solid #ddd; + cursor: pointer; + } + + input, + select, + select option, + textarea { + -webkit-appearance: none; + -moz-appearance: none; + } + + select::-ms-expand, + input::-ms-expand, + textarea::-ms-expand { // for IE 11 + display: none; + } + + input[type=submit].link-button { + color: @icinga-blue; + background: none; + border: none; + font-weight: normal; + padding: 0; + margin: 0; + text-align: left; + + &:hover { + text-decoration: underline; + } + } + + ul.form-errors { + list-style-type: none; + margin-bottom: 0.5em; + padding: 0; + + ul.errors { + list-style-type: none; + padding: 0; + } + + ul.errors li { + background: @color-critical; + font-weight: bold; + padding: 0.5em 1em; + color: white; + } + } + + input[type=text], input[type=password], textarea, select { + max-width: 36em; + min-width: 20em; + width: 100%; + } + input:not([type=submit]), + textarea, + select { + line-height: 2em; + height: 2.4em; + padding-left: 0.5em; + border-style: solid; + border-color: @gray-lighter; + border-width: 1px; + border-radius: 3px; + color: @text-color; + + &:hover { + border-color: @gray; + } + + &:focus, &:focus:hover { + border-color: @icinga-blue; + outline: none; + } + } + // duplicated from 40 -> ordering problem + input.validated { + background-color: fade(@color-ok, 30%); + border-color: @color-ok; + } + textarea { + height: unset; + min-height: 2.4em; + resize: vertical; + } + + input.search { + background-image: url("../img/icons/search.png"); + background-repeat: no-repeat; + padding-left: 2em; + } + + select[multiple], select[multiple=multiple] { + height: auto; + } + + select option { + height: 2em; + padding-top: 0.3em; + } + + #_FAKE_SUBMIT { + position: absolute; + left: -100%; + } + + select::-moz-focus-inner { + border: 0; + } + + select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #000; + } + + select[value=""] { + color: blue; + border: 1px solid #666; + // background-color: white; + } + + select option { + color: inherit; + padding-left: 0.5em; + } + + // default option + select option[value=""] { + // color: #aaa; + } + + fieldset { + margin: 0; + min-width: 36em; + + padding: 0 0 1.5em 0; + border: none; + + legend { + margin: 0 0 0.5em 0; + font-size: 1em; + border-bottom: 1px solid @gray-light; + font-weight: bold; + display: block; + width: 100%; + padding-left: 1em; + line-height: 2em; + cursor: pointer; + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + + &:hover { + border-color: @text-color; + } + + &::before { + // icon: down-dir + font-family: 'ifont'; + content: '\e81d'; + margin-left: -1em; + padding-top: 0; + float: left; + color: inherit; + } + } + + &.collapsed { + dl, dd, dt, ul, div { + display: none; + } + + legend { + margin: 0; + } + legend::before { + // icon: right-dir + content: '\e820'; + } + + margin-bottom: 0.2em; + padding-bottom: 0; + } + } +} + +#layout.minimal-layout div.content form.gipfl-form { + dt, dd { + display: block; + width: auto; + } + + dt label { + color: @text-color; + } + + fieldset { + min-width: unset; + } + + input[type=text], input[type=password], textarea, select { + max-width: unset; + min-width: unset; + border-color: @gray-light; + } + + dd.active { + input[type=text], input[type=password], textarea, select { + border-color: @icinga-blue; + } + } + + fieldset.collapsed { + dd, dt, ul, div { + display: none; + } + } +} + +#layout.minimal-layout div.content form.gipfl-form { + ul.extensible-set { + max-width: unset; + border: 1px solid @gray-light; + } + + dd.active ul.extensible-set { + border: 1px solid @icinga-blue; + + input[type=submit]:first-of-type { + border-width: 1px; + } + } + + dd input.related-action[type='submit'] { + display: none; + } + + dd.active li.active input.related-action[type='submit'] { + display: inline-block; + } + + dd.active ul.extensible-set, ul.extensible-set.sortable { + input[type=text], select { + width: 100%; + } + + input[type=text] { + // background-color: white; + border: 1px solid white; + } + } +} +form.gipfl-inline-form { + display: inline-block; + select { + width: auto; + min-width: unset; + max-width: unset; + border: none; + padding: 0 0.5em; + margin: 0; + line-height: unset; + box-sizing:border-box; + height: 1.5em; + + &:hover { + border: none; + } + + &:focus { + border: none; + } + } + input[type=submit] { + padding: 0 0.25em; + margin: 0 1em 0 0; + border: none; + line-height: unset; + box-sizing: border-box; + } +} +.Differences { + width: 100%; + table-layout: fixed; + empty-cells: show; +} + +.Differences thead { + display: none; +} + +.Differences thead th { + text-align: left; + padding-left: 4 / 14 * 16em; +} +.Differences tbody th { + text-align: right; + width: 4em; + padding: 1px 2px; + border-right: 1px solid @gray-light; + background: @gray-lightest; + font-weight: normal; + vertical-align: top; +} + +.Differences tbody td { + width: 50%; + .preformatted(); + word-break: break-all; +} + +@color-diff-ins: #bfb; +@color-diff-del: #faa; +@color-diff-changed-old: #fdd; +@color-diff-changed-new: #efe; + +.DifferencesSideBySide { + ins, del { + text-decoration: none; + } + + .ChangeInsert { + td.Left { + background: @gray-lighter; + } + td.Right { + background: @color-diff-ins; + } + } + + .ChangeDelete { + td.Left { + background: @color-diff-del; + } + td.Right { + background: @gray-lighter; + } + } + + .ChangeReplace { + td.Left { + background: @color-diff-changed-old; + del { + background: @color-diff-del; + } + } + + td.Right { + background: @color-diff-changed-new; + ins { + background: @color-diff-ins; + } + } + + } +} + +.Differences .Skipped { + background: @gray-lightest; +} + +.DifferencesInline .ChangeReplace .Left, +.DifferencesInline .ChangeDelete .Left { + background: #fdd; +} + +.DifferencesInline .ChangeReplace .Right, +.DifferencesInline .ChangeInsert .Right { + background: #dfd; +} + +.DifferencesInline .ChangeReplace ins { + background: #9e9; +} + +.DifferencesInline .ChangeReplace del { + background: #e99; +} diff --git a/public/js/combined.js b/public/js/combined.js new file mode 100644 index 0000000..83b19a5 --- /dev/null +++ b/public/js/combined.js @@ -0,0 +1,69 @@ +(function(window, $) { + 'use strict'; + + var Web = function () { + }; + + Web.prototype = { + initialize: function (icinga) { + this.icinga = icinga; + $(document).on('focus', 'form.gipfl-form input, form.gipfl-form textarea, form.gipfl-form select', this.formElementFocus); + $(document).on('click', '.gipfl-collapsible-control', this.toggleCollapsible); + }, + + toggleCollapsible: function (ev) { + var $toggle = $(ev.currentTarget); + var $collapsible = $toggle.parent(); + $collapsible.toggleClass('collapsed'); + }, + + formElementFocus: function (ev) { + var $input = $(ev.currentTarget); + if ($input.closest('form.editor').length) { + return; + } + var $set = $input.closest('.extensible-set'); + if ($set.length) { + var $textInputs = $('input[type=text]', $set); + if ($textInputs.length > 1) { + $textInputs.not(':first').attr('tabIndex', '-1'); + } + } + + var $dd = $input.closest('dd'); + if ($dd.attr('id') && $dd.attr('id').match(/button/)) { + return; + } + var $li = $input.closest('li'); + var $dt = $dd.prev(); + var $form = $dd.closest('form'); + + $form.find('dt, dd, dl, li').removeClass('active'); + $li.addClass('active'); + $dt.addClass('active'); + $dd.addClass('active'); + $dt.closest('dl').addClass('active'); + }, + + highlightFormErrors: function ($container) { + $container.find('dd ul.errors').each(function (idx, ul) { + var $ul = $(ul); + var $dd = $ul.closest('dd'); + var $dt = $dd.prev(); + + $dt.addClass('errors'); + $dd.addClass('errors'); + }); + }, + + toggleFieldset: function (ev) { + ev.stopPropagation(); + var $fieldset = $(ev.currentTarget).closest('fieldset'); + $fieldset.toggleClass('collapsed'); + this.fixFieldsetInfo($fieldset); + this.openedFieldsets[$fieldset.attr('id')] = ! $fieldset.hasClass('collapsed'); + } + }; + + window.incubatorComponentLoader.addComponent(new Web()); +})(window, jQuery); diff --git a/public/js/loader.js b/public/js/loader.js new file mode 100644 index 0000000..6cd3073 --- /dev/null +++ b/public/js/loader.js @@ -0,0 +1,54 @@ +(function(window, $) { + 'use strict'; + + var IncubatorComponentLoader = function () { + this.components = []; + }; + + IncubatorComponentLoader.prototype = { + initialize: function (icinga) { + this.icinga = icinga; + // Trigger module loading - always + icinga.module('incubator'); + $.each(this.components, function (_, component) { + component.initialize(icinga); + }); + icinga.logger.info('Incubator is ready'); + }, + + addComponent: function (component) { + this.components.push(component); + }, + + destroy: function () { + // Eventually: this.unbindEventHandlers(); + + $.each(this.components, function (_, component) { + if (typeof component.destroy === 'function') { + component.destroy(); + } + }); + + this.components = []; + this.icinga = null; + } + }; + + var startup; + var w = window; + function safeLaunch() + { + if (typeof(w.icinga) !== 'undefined' && w.icinga.initialized) { + clearInterval(startup); + w.incubatorComponentLoader.initialize(w.icinga); + } else { + console.log('Incubator module is still waiting for icinga'); + } + } + + $(document).ready(function () { + startup = setInterval(safeLaunch, 30); + safeLaunch(); + }); + w.incubatorComponentLoader = new IncubatorComponentLoader(); +})(window, jQuery); diff --git a/public/js/module.js b/public/js/module.js new file mode 100644 index 0000000..ff4086f --- /dev/null +++ b/public/js/module.js @@ -0,0 +1,19 @@ +(function(window, $) { + 'use strict'; + + var Incubator = function (icinga) { + this.icinga = icinga; + }; + + Incubator.prototype = { + initialize: function (icinga) { + }, + + destroy: function () { + window.incubatorComponentLoader.destroy(); + this.icinga = null; + } + }; + + Icinga.availableModules.incubator = Incubator; +})(window, jQuery); |