Tuesday version 2.7 of Icinga Web 2 has been released and introduced some interesting new functionality for module developers. Now I’d like to tell you, my fellow colleague, some more details about this.
jQuery v3 – Migration Required
First a friendly warning. We’ve upgraded the jQuery version we ship to v3.4.1. This has previously been v2.1.0 so now with this major upgrade some deprecated methods and interfaces are gone.
_dev in your address bar to instruct Icinga Web 2 to serve the non-minimized version. (e.g.
jQuery migrate will be removed with Icinga Web 2 version 2.8.0. While this is still some time ahead, this (and the note in the upgrade documentation) is probably the only warning.
Persistence and Collapsible Containers
sessionStorage, it’s now time to inform yourself. (That’s an entire blogpost if described thoroughly)
There’s now an abstraction layer for this shipped with Icinga Web 2. It hides all the handling of complex datatypes and conflicts with other apps using the storage from you. That’s the object
Icinga.Storage which utilizes the
localStorage by default but also supports the
sessionStorage. Take a look here to see how this is used for Icinga Web 2’s sidebar.
Though, this is only the basic stuff. If you need to store more complex data and want to benefit from a storage’s event processing, take a look at the object
Icinga.Storage.StorageAwareMap. This is a proxy for
Map and allows to subscribe to change events of particular keys in the map. It also keeps track of a key’s age and removes it automatically if it hasn’t been accessed for 90 days.
Another new addition are collapsible HTML containers. This is provided by a behavior which makes use of the
StorageAwareMap, a perfect example use-case.
Making a container collapsible is as easy as possible. Just apply the CSS class
collapsible and you’re done. If you’re not satisfied with the default height, apply the data attribute
data-visible-height and give it the desired height in pixels. (For
ol‘s there is also
data-visible-rows.) Then, if you fancy a custom control by which users expand or collapse the container you can pass a CSS selector to
data-toggle-element which (if a direct descendant of the container) then acts as the toggle.
Custom XHR Without Dirty Hacks
Have you ever wanted/tried to process link clicks or form submissions by yourself? Well, I have and it was a nightmare every single time. Most of Icinga Web 2’s processing is fine. But of course there ever is this single behavior or side-effect which keeps getting in the way. This has now come to an end.
Meet data attribute
data-no-icinga-ajax which does exactly what it’s name suggests. Applied to an element it causes Icinga Web 2 to ignore click and submit events triggered by the element itself and all descendants.
Couldn’t be more simple, can it?
Hooks For Everyone
Previously hooks were only processed for logged-in users with the permission to access the module providing the hook. This for example prevented the audit module to register logins from users without the permission
module/audit and also didn’t allow to log failed logins.
When providing a hook it is now possible to have it run always. (
$this->provideHook($name, $implementation = null, $alwaysRun = false);)
Another case of hooks not being processed was the issue that, unlike in the web front-end, enabled modules were not loaded automatically on the CLI. Thus also their hooks were not registered. Now this has changed and also on the CLI all enabled modules are automatically loaded. If you’ve previously loaded the modules explicitly this is not required anymore. If you don’t need any other modules and want to avoid the overhead of loading them, you can disable this of course.
If you still don’t have enough of this, there’s also an entirely new hook available: ConfigFormEventsHook This hook enables you to influence every configuration form of Icinga Web 2. Extending a form’s validation or doing additional work once submission succeeded is now on the table.
That’s it. I hope these things are as useful to you as they were to us. And remember, we don’t mind any suggestions to further improve the integration of modules. You are the developer, you’ll know best what’s… best.