Commit Graph

846 Commits

Author SHA1 Message Date
Florian Strohmaier c06aec0471 Remove unused code 2019-12-06 15:36:34 +01:00
Florian Strohmaier cfbeb26354 JS: Disable fixControls() 2019-12-06 15:36:34 +01:00
Johannes Meyer cc065b949b js: Use custom event `icinga-init` to trigger initial render events
The `load` event is not really only fired *after all shared resources are loaded*.
Just Chromium ensures this event is fired only after `ready` and `DOMContentLoaded`.
FF, IE and Safari don't so we need our own post-init event: `icinga-init`
2019-11-26 16:00:21 +01:00
Johannes Meyer 48098a2830 js: Don't initialize modules using a `beforerender` event
`beforerender` is already too late. Module initialization
done using an event handler is wrong anyway. It's some
kind of bootstrapping after all and should be performed
by parts of the code which is directly responsible for
DOM content handling of modules. (i.e. loader.js)

This change though introduces a side-effect which was
not the case previously: Nested `.container` elements
trigger `rendered` events now. I've introduced this to
ensure we're also lazy loading modules and let them
handle their `rendered` events right after a redirect
which rerendered the layout. (Only `#layout` got a
`rendered` event then prior to this change)
2019-11-21 09:55:20 +01:00
Johannes Meyer 7f78c1a8a8 js: Properly initialize modules and don't trigger `rendered` events twice
Cleans up how our JS initializes module javascript. Previously the `rendered`
event only got fired upon page load if a module got loaded as well. This is
now decoupled and `rendered` events fire for all containers and the entire
layout upon page load.

Notable changes:
* A `load` event initializes modules and triggers `rendered` on `.container` and `#layout` elements
* Module javascript (module.js) is still lazy loaded but with a `beforerender` event, not `rendered`
* Previously `#layout` received a `rendered` event during bootstrapping, this is not the case anymore
* Initial search value preservation now got its own handler `events.onRenderedMenu()`
* Initial dashlet loading now git its own handler `events.loadDashlets()`
2019-11-20 16:22:56 +01:00
Johannes Meyer 47c2a8bdc1 js: Utilize `utils.objectsEqual()` in `actiontable.select()` 2019-11-20 16:22:56 +01:00
Johannes Meyer 2dbf9ca8ab js: Properly parse/decode query params in `utils.parseParams()` 2019-11-20 16:22:56 +01:00
Johannes Meyer 5f739deea3 loader.js: Enhance __BACK__ handling 2019-11-05 15:04:23 +01:00
Johannes Meyer da565f4d16 loader.js: Refresh left twice in case right has been closed..
..if the redirect target is `__BACK__`
2019-11-04 17:25:05 +01:00
Johannes Meyer 42e596f457 loader.js: Navigate back if redirect target is `__BACK__` 2019-11-04 16:03:54 +01:00
Johannes Meyer a13d2b1e48 js: Introduce behavior modal.js 2019-11-04 12:46:30 +01:00
Johannes Meyer c0cac6fe3c loader.js: Allow to use a separate target for redirections 2019-11-04 12:46:30 +01:00
Johannes Meyer 0e5e046ae5 js: Split event handling and processing of form submits 2019-11-04 12:46:30 +01:00
Johannes Meyer 50bf126d36 js: Move function events.getLinkTargetFor to loader.js 2019-11-04 12:46:30 +01:00
Johannes Meyer 2896cbd781 loader.js: Avoid named capture groups to parse multipart content
fixes #3975
2019-10-07 14:35:49 +02:00
Johannes Meyer a8dc609b62 loader.js: Add support for multipart content
refs #3953
2019-09-25 10:34:24 +02:00
Johannes Meyer dda49b5ff1 loader.js: Drop redundant method `cacheLoadedIcons` 2019-09-25 10:34:24 +02:00
Johannes Meyer da513a746d loader.js: Add support for extra updates
refs #3953
2019-09-25 10:34:24 +02:00
Johannes Meyer 329f54cc96 ui.js: Don't generate a container id if its parent is #col1
refs #3953
2019-09-25 10:34:24 +02:00
Johannes Meyer b15c012671 loader.js: Only pre-wrap a search response's html with a div
It's not required for all responses anymore.

refs #3953
2019-09-25 10:34:24 +02:00
Johannes Meyer f98f988aff Remove tristate form element 2019-09-23 08:36:24 +02:00
Johannes Meyer 5333bbf04d loader.js: Also set title directly if layout is base target 2019-08-02 15:42:58 +02:00
Johannes Meyer b31dd77812
Merge pull request #3676 from Icinga/feature/form-styling
Improve look of our forms
2019-07-30 08:26:08 +02:00
Johannes Meyer 5849c06314 storage.js: Don't try and allow to register events for non-local backends 2019-07-30 08:17:29 +02:00
Eric Lippmann 62d4e73d5a Use session storage for sidebar state
The sidebar state is now maintained per tab/window because users view
different things in different tabs/windows. E.g. users work with a
specific module constantly clicking through the menu while having
other tabs/windows with some important dashboards open.
When the sidebar is closed in one tab/widnow, it should not close
the sidebar in the other tabs/windows.
2019-07-30 08:14:49 +02:00
Eric Lippmann a1a18feb04 js/storage: Allow to set the storage backend 2019-07-30 08:14:49 +02:00
Johannes Meyer eb0d808aec collapsible.js: Enhance height calculations
`data-visible-height` now only covers the actual content height
2019-07-29 16:02:48 +02:00
Johannes Meyer 8cd6a46388 collapsible.js: Add support for custom control elements 2019-07-29 10:19:29 +02:00
Johannes Meyer d0eca387ee js: Also handle spinner elements which are not direct descendants of an element 2019-07-29 10:17:59 +02:00
Johannes Meyer a4848803c8 collapsible.js: Listen on `#layout` for rendered events 2019-07-26 16:23:18 +02:00
Johannes Meyer 91a8bdf786 collapsible.js: Don't collapse until at least twice the visible space is required 2019-07-26 07:36:17 +02:00
Johannes Meyer 74cb0ef3c9 collapsible.js: Don't enforce `data-visible-rows` for tables and lists 2019-07-26 07:36:17 +02:00
Johannes Meyer 2179518904 storage.js: Properly check if we have any keys left before clearing the storage 2019-07-26 07:36:17 +02:00
Johannes Meyer f1db972cc5 ui.js: Only set tabindex=-1 on elements which are otherwise not focusable 2019-07-22 13:41:52 +02:00
Johannes Meyer dd4cfaba50 navigation.js: Store and load sidebar collapse state from localStorage
resolves #3628
2019-07-18 09:43:22 +02:00
Johannes Meyer f8d3f43965 js: Drop vendor library tipsy 2019-07-18 07:57:14 +02:00
Johannes Meyer ec3a6b0572 ui.js: Don't use jquery blur shorthand but the element's native method 2019-07-18 07:57:14 +02:00
Johannes Meyer b168c3d7db js: Don't use jquery.focus shorthand anymore, but icinga.ui.focusElement 2019-07-18 07:57:14 +02:00
Johannes Meyer f844094475 ui.js: Don't use deprecated .size() method but property .length 2019-07-18 07:57:14 +02:00
Johannes Meyer 6323a065ea loader.js: Keep using the promise interface for complete callbacks 2019-07-18 07:57:14 +02:00
Johannes Meyer 5cf71c9bbd js: Drop iframe-upload fallback for IE 2019-07-18 07:57:14 +02:00
Jennifer Mourek f6a5f952bb loader.js: Remove comment 2019-07-18 07:56:09 +02:00
Florian Strohmaier 5fe264be6a JS: Fix errors
refs #3813
2019-07-18 07:56:09 +02:00
Johannes Meyer 8893db0cbc js: Drop a StorageAwareMap entirely from storage if all keys expired 2019-07-18 07:43:42 +02:00
Johannes Meyer cfa3af51db storage.js: Don't return in `StorageAwareMap.forEach` 2019-07-17 13:12:41 +02:00
Johannes Meyer 5c290e1b68 collapsible.js: Rename event callbacks
`onExternalCollapse` => `onCollapse`
`onExternalExpansion` => `onExpand`
2019-07-17 13:12:41 +02:00
Johannes Meyer c976eb48c9 storage.js: Properly handle invalid values 2019-07-17 13:12:41 +02:00
Johannes Meyer 2280551484 storage.js: Use substring instead of startsWith on strings
IE11 doesn't support startsWith..
2019-07-17 13:12:41 +02:00
Johannes Meyer f11de266f4 storage.js: Avoid to call JSON.parse with an empty string
IE11 seems not to like this..
2019-07-17 13:12:41 +02:00
Johannes Meyer 9561057b81 storage.js: Allow to subscribe with multiple handlers to the same key 2019-07-17 13:12:41 +02:00
Johannes Meyer 2bf050f57d storage.js: Don't use the native event mechanism but a simple callback handling 2019-07-17 13:12:41 +02:00
Johannes Meyer c05291296a collapsible.js: Only apply external expansions/collapses if necessary 2019-07-17 13:12:41 +02:00
Johannes Meyer 2fd7ba5aed storage.js: Utilize a single event listener for all storage events
It doesn't make sense to register an event listener for every
created storage instance. They're all using entirely different
keys after all.
2019-07-17 13:12:41 +02:00
Johannes Meyer 2ac848828a storage.js: Prevent conflicts with other apps accessing the same storage 2019-07-17 13:12:41 +02:00
Johannes Meyer 0f16e20d92 storage.js: Write `null` instead of `undefined` to the storage
`undefined` causes the key to be ignored by JSON.stringify
2019-07-17 13:12:41 +02:00
Johannes Meyer 383895fd92 storage.js: Pass the value to event subscribers of StorageAwareMap 2019-07-17 13:12:41 +02:00
Johannes Meyer 8937e11a09 storage.js: Properly handle if keys are entirely removed 2019-07-17 13:12:41 +02:00
Johannes Meyer 363486277b storage.js: Rename Storage.subscribe to onChange 2019-07-17 13:12:41 +02:00
Johannes Meyer c5beabf891 storage.js: Cleanup `StorageAwareMap` key corpses after 90 days 2019-07-17 13:12:41 +02:00
Johannes Meyer cbd1e1bb92 storage.js: Drop `StorageAwareSet` and replace it with `StorageAwareMap` 2019-07-17 13:12:41 +02:00
Johannes Meyer 8377a2d096 storage.js: Don't use .bind() to define a callbacks context 2019-07-17 13:12:41 +02:00
Johannes Meyer 03fc052749 storage.js: Directly use scope `window` to access `localStorage` 2019-07-17 13:12:41 +02:00
Johannes Meyer 95dee43f5b storage.js: Just use a factory to create behavior storages 2019-07-17 13:12:41 +02:00
Johannes Meyer 3b7a1a5ab4 storage.js: Add method `on` to `StorageAwareSet` 2019-07-17 13:12:41 +02:00
Johannes Meyer ffec2ebd4c collapsible.js: Utilize storage.js 2019-07-17 13:12:41 +02:00
Johannes Meyer e2cddc2d46 js: Introduce storage.js, a localStorage abstraction layer 2019-07-17 13:12:41 +02:00
Johannes Meyer beae5b5921 collapsible.js: Update collapsible states when the layout changes 2019-07-17 13:12:41 +02:00
Johannes Meyer 0140fdf485 collapsible.js: Use `scrollHeight` to measure a container's actual height 2019-07-17 13:12:41 +02:00
Johannes Meyer 9f858a9073 ui.js: Trigger event `layout-change` when the layout changes 2019-07-17 13:12:41 +02:00
Johannes Meyer a99f653a63 collapsible.js: Don't process collapsible containers multiple times 2019-07-17 13:12:41 +02:00
Johannes Meyer fc782b59a9 collapsible.js: Don't collapse containers which are near to the maximum 2019-07-17 13:12:41 +02:00
Johannes Meyer 754f45566a collapsible.js: Make storage working with multiple tabs 2019-07-17 13:12:41 +02:00
Johannes Meyer a642117c8a collapsible.js: Remove superflous spaces after the `function` keyword 2019-07-17 13:12:41 +02:00
Johannes Meyer 9a6b1cffd6 collapsible.js: Don't use Set features which IE11 doesn't support 2019-07-17 13:12:41 +02:00
Johannes Meyer ec2a6b5c78 collapsible.js: Use namespace `behavior` for local storage entries 2019-07-17 13:12:41 +02:00
Johannes Meyer 1748404efe collapsible.js: Enhance how we'll utilize `localStorage` 2019-07-17 13:12:41 +02:00
Johannes Meyer 6f28a5c3e1 collapsible.js: Rename `height` to `visible-height` 2019-07-17 13:12:41 +02:00
Johannes Meyer 1ae1dc387f collapsible.js: Rename `numofrows` to `visible-rows` 2019-07-17 13:12:41 +02:00
Johannes Meyer b8bdd743a2 collapsible.js: Remove useless `> tbody > th` row selector 2019-07-17 13:12:41 +02:00
Johannes Meyer ba44240b68 collapsible.js: Store and load states form localStorage 2019-07-17 13:12:41 +02:00
Johannes Meyer 3122af2838 collapsible.js: Properly track a collapsible's state across navigation 2019-07-17 13:12:41 +02:00
Johannes Meyer 0ed030410f collapsible.js: Listen for rendered events on all containers
not just #col2
2019-07-17 13:12:41 +02:00
Johannes Meyer 0574f44bd9 colllapsibleContainer.js: Rename to collapsible.js 2019-07-17 13:12:41 +02:00
Johannes Meyer d6f7582df6 collapsibleContainer.js: Update documentation 2019-07-17 13:12:41 +02:00
Johannes Meyer 1032a944b4 collapsibleContainer.js: Properly set an collapsible's height 2019-07-17 13:12:41 +02:00
Johannes Meyer 618ca25aec collapsibleContainer.js: Simplify implementation and make it more flexible
Handling is ok though the styles are outdated now and not working
2019-07-17 13:12:41 +02:00
Johannes Meyer ffe638ee36 collapsibleContainer.js: Don't expect a data attribute for a container's id 2019-07-17 13:12:41 +02:00
Johannes Meyer e6e43d07bf collapsibleContainer.js: Cleanup and streamline behavior implementation 2019-07-17 13:12:41 +02:00
Johannes Meyer 66084d6d94 collapsibleContainer.js: Adjust id handling
Id's are unique. Making this assumption is fine since anyone
not abiding by this isn't my problem.
2019-07-17 13:12:41 +02:00
Florian Strohmaier b73a608742 JS: Check collapsible containers for unique collapsible-id 2019-07-17 13:12:41 +02:00
Florian Strohmaier d3e4fb6552 JS: Add code documentation 2019-07-17 13:12:41 +02:00
Florian Strohmaier 545d3355a9 JS: Use can-collapse to flag containers with sufficient height 2019-07-17 13:12:41 +02:00
Florian Strohmaier b07ffd4987 JS: Implement collapsible-container behavior 2019-07-17 13:12:41 +02:00
Johannes Meyer f6d40a9d1c loader.js: Directly set the window's title for full layout requests
refs #3851
2019-07-15 08:24:44 +02:00
Loei Petrus Marogi 302422d814 Allow to fully customize click and submit handling
resolves #3767
2019-05-27 14:34:38 +02:00
Johannes Meyer b4979b75a9
Merge pull request #3723 from Icinga/feature/ctrl-click-does-not-open-links-in-new-tab-3722
Make ctrl-click open new tab
2019-05-24 13:01:52 +02:00
Jennifer Mourek b6f8df5ddc Disallow new tab opening on anything but anchors 2019-05-24 11:09:05 +02:00
Johannes Meyer 82d6b22697
Merge pull request #3775 from Icinga/bugfix/improve-mobile-menu
Improve mobile menu
2019-05-24 10:56:02 +02:00
Jennifer Mourek 1c666d88e6 Prevent new tab opening in tables and href="#" 2019-05-23 11:04:11 +02:00
Jennifer Mourek 26d696372f Exclude multiselect rows from the open new tab feature 2019-05-21 15:06:16 +02:00
Florian Strohmaier 574c76ab42 Improve mobile menu 2019-05-06 14:49:41 +02:00
Johannes Meyer 43c87d2388 loader.js: Return in onComplete upon handled redirects
Got changed with f12a5741b8. Triggering
rendered events for stuff that's never displayed doesn't seem right.
2019-04-30 09:23:59 +02:00
Johannes Meyer 50f5aa0ac3 Revert "utils.js: Utilize ids of forms and elements in getCssPath"
This reverts commit c835f02953.
2019-04-25 10:11:45 +02:00
Johannes Meyer f72aa291bc
Merge pull request #3610 from Icinga/fix/window-id-cannot-be-used-to-differentiate-containers-3609
Fix window id cannot be used to differentiate containers
2019-04-17 11:38:48 +02:00
Johannes Meyer c835f02953 utils.js: Utilize ids of forms and elements in getCssPath
They're now reliable again :)

fixes #2238
2019-04-17 11:25:10 +02:00
Johannes Meyer 4900040d47 js: Restore previous title when closing right column
fixes #3654
2019-04-16 09:29:42 +02:00
Johannes Meyer d8c4fcc517
Merge pull request #3661 from Icinga/feature/preserve-scroll-position-upon-form-submits
Preserve scroll position upon form submits
2019-04-16 08:04:15 +02:00
Johannes Meyer cb3528a7be js: Don't scroll to re-focused elements after auto-refreshes
refs #2048
refs #3295
refs #3492
refs #3518
2019-04-15 15:42:14 +02:00
Johannes Meyer f54f2f8627 js: Prevent flickering when refreshing scrolled content 2019-04-15 14:27:14 +02:00
Eric Lippmann 915c7b8fe5
Merge pull request #3504 from Icinga/fix/collapsible-sidebar-issues-3187
Fix collapsible sidebar issues
2019-03-21 09:09:27 +01:00
Jennifer Mourek 2c1abe13a1 Make ctrl-click open new tab
refs #3722
2019-03-20 14:19:14 +01:00
Jennifer Mourek b3b80fdc31 Make active first-level nav items better distinguishable 2019-03-20 11:07:39 +01:00
Jennifer Mourek 2e5515274e Adjust sidebar lug size and reduce flyout delay 2019-03-20 11:07:39 +01:00
Johannes Meyer 27569d09d8 loader.js: Preserve scroll position also for form submits
Restores the scroll position if:
* it's been a POST request
* the source and target url path is the same
* the target's url params do not change significantly
2019-01-10 15:32:28 +01:00
Johannes Meyer d2214ef0e4 loader.js: Pass-through previous request when peforming a redirection 2019-01-10 15:31:39 +01:00
Johannes Meyer 29a8184548 loader.js: Remember a request's method 2019-01-10 15:30:48 +01:00
Johannes Meyer 2a5a403573 utils.js: Add new method objectsEqual() 2019-01-10 15:30:05 +01:00
Eric Lippmann f8295ea825 Revert "Fix menu flickering on reload and broken layout w/o JS"
This reverts commit 3b06f06a04.

Breaks announcements.
2018-11-20 10:17:27 +01:00
Eric Lippmann 3b06f06a04 Fix menu flickering on reload and broken layout w/o JS
fixes #3629
fixes #3630
2018-11-20 10:06:41 +01:00
Eric Lippmann f0f9ab0eb7 JS: Simplify Date.isDst() 2018-11-16 09:00:32 +01:00
Eric Lippmann fbc7598a6b JS: Simplify Date.getStdTimezoneOffset()
refs #3607
2018-11-16 09:00:32 +01:00
h0rmiga d9b337a213 JS: Fix DST detection
refs #3607

Signed-off-by: Eric Lippmann <eric.lippmann@icinga.com>
2018-11-16 09:00:19 +01:00
Johannes Meyer c8a49414b1 js: Append a unique container id to the Window-Id
Generates a semi-random id for containers other than the menu and col1.
This id is then appended to the Window-Id of every request separated by
an underscore: `window-id_container-id`

refs #3609
2018-11-07 12:44:25 +01:00
Johannes Meyer 8212c51f8d js: Already set `window.name` prior bootstrapping our js runtime
Makes sure that the Window-Id already generated and utilized by the
server on the first request is used by subsequent requests instead
of a new one.

Also avoids that concurrent running id-less requests compete about
which one may set his assigned id. Now any subsequent request
already transmits the id assigned to the first one.

And it resets `window.name` in case the user performs a manual
refresh so that the id used by the server is set/utilized.

refs #3609
2018-11-07 09:13:16 +01:00
Florian Strohmaier d1cbc4b05c JS: Remove excessive scroll events 2018-10-16 15:41:33 +02:00
Eric Lippmann 84e0c0c4fb
Merge pull request #3518 from Icinga/fix/anchor-navigation-not-working-3492
loader.js: Make anchor navigation working again
2018-07-16 10:00:35 +02:00
Johannes Meyer 5f4aa1e296 loader.js: Make anchor navigation working again
fixes #3492
2018-07-10 10:50:31 +02:00
Eric Lippmann d18d05ccee Introduce ApplicationStateHook
refs #2835
2018-07-09 16:28:25 +02:00
Johannes Meyer 990df95f36 loader.js: Allow to force HTTP to be used for JS redirection 2018-07-04 14:44:03 +02:00
Johannes Meyer 9294c830f8 tipsy: Don't use opacity but rgba to avoid having transparent text
refs #3418
2018-04-26 13:39:50 +02:00
Eric Lippmann 7fc9d7995f
Merge pull request #3425 from Icinga/fix/avoid-unnecessary-search-requests-3348
Don't search as long as the user is typing
2018-04-25 03:08:47 -04:00
Johannes Meyer c2b3bbb87b events.js: Don't search as long as the user is typing
500ms is for the average typist. Still fast enough, imho.

refs #3348
2018-04-24 12:33:04 +02:00
Johannes Meyer 9857021d2c Revert "loader.js: place focus at the end of text inputs"
This reverts commit d1fd7e4be7.
Browsers seem to do this on their own natively. Way better.

refs #3348
2018-04-24 11:18:10 +02:00
Alexander A. Klimov 41b105136d Preserve collapsed FilterEditor subtrees across auto-refreshes
refs #2964
2018-04-06 13:54:51 +02:00
Alexander A. Klimov 38438449e4 Revert "Performance data: render pie charts without freezing the UI"
This reverts commit f2b2b6a91a.

refs #3344
2018-04-06 09:36:24 +02:00
Johannes Meyer 7483a168f9 actiontable.js: Use `event.currentTarget` instead of the closest tr
This event is triggered due to delegation. If any onclick event is able
to bubble up this far that it gets triggered we can safely use whatever
it has been triggered for. (i.e. it can only be a tr[href])

refs #3298
2018-01-22 13:23:28 +01:00
lippserd 0b9ae48530
Merge pull request #3288 from Icinga/bugfix/performance-problem-lots-of-performance-data-2894
Performance data: render pie charts without freezing the UI
2018-01-19 16:16:54 +01:00
Alexander A. Klimov f2b2b6a91a Performance data: render pie charts without freezing the UI
refs #2894
2018-01-19 16:14:42 +01:00
Alexander A. Klimov 68870ca411 Icinga.Loader.prototype.renderContentToContainer(): preserve scroll position despite the focus 2018-01-19 15:32:54 +01:00
lippserd f92c35c193
Merge pull request #3262 from Icinga/bugfix/browser-history-multiple-columns-2779
Make navigation via browser history working as expected
2018-01-17 12:03:03 +01:00
Alexander A. Klimov 5a7ecb825a Drop unneccessary browser history steps
... which are non-desired columns contents combinations

refs #2779
2018-01-16 12:25:22 +01:00
Alexander A. Klimov 1f61744b57 Make search reset control working across auto-refresh
refs #2753
2018-01-15 15:09:50 +01:00
lippserd 83faa2671c
Merge pull request #3174 from Icinga/fix/fullscreen-layout
Don't discard fullscreen when detecting the layout
2017-12-15 10:13:05 +01:00
Eric Lippmann cb83a7dea3 JS: Always request application-state
Icinga Web 2 version 2.5.0 suspends auto-refresh if the tab is inactive.
This also pauses the application-state requests which are intended to refresh the session and announcements.
If a tab is inactive for longer than the PHP session timeout (session.gc_maxlifetime in php.ini), users are automatically logged out.
With this patch Web 2 will always request application-state. Even if auto-refresh is disabled.
2017-12-04 14:25:23 +01:00
Eric Lippmann e77c3c8169 Don't take fullscreen into account when detecting the layout
The fullscreen-layout class is just a layout modifier.
2017-11-29 15:12:51 +01:00
Alexander A. Klimov 48133aae91 Flyover: select #main instead of div#main 2017-11-27 16:51:55 +01:00
Alexander A. Klimov 59054dd01c Collapse all expanded flyovers on any click not inside any flyover 2017-11-27 16:35:18 +01:00
Alexander A. Klimov 8afd2f8a32 Handle multiple toggles per flyover 2017-11-27 16:32:52 +01:00
Eric Lippmann 47ca9bd32f JS: Fix sidebar position 2017-11-27 15:12:15 +01:00
lippserd 8f1f8d4471
Merge pull request #3100 from Icinga/feature/expandable-content
Implement persistent "Show more" spoilers
2017-11-27 14:44:15 +01:00