From a1ef28460d3a6f96c9d3815c253c239091050456 Mon Sep 17 00:00:00 2001 From: Florian Strohmaier Date: Tue, 20 Nov 2018 13:54:48 +0100 Subject: [PATCH 01/59] Layout: Create collapsible ghost --- application/layouts/scripts/layout.phtml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/application/layouts/scripts/layout.phtml b/application/layouts/scripts/layout.phtml index f3699d6c5..549a842a3 100644 --- a/application/layouts/scripts/layout.phtml +++ b/application/layouts/scripts/layout.phtml @@ -76,6 +76,10 @@ $innerLayoutScript = $this->layout()->innerLayout . '.phtml'; } }()); + From 9a1b7f0cf8ddf2ae702d9fe3483b051232a8e619 Mon Sep 17 00:00:00 2001 From: Florian Strohmaier Date: Tue, 20 Nov 2018 13:55:25 +0100 Subject: [PATCH 02/59] Add ifont icons for collapsible button --- application/fonts/fontello-ifont/config.json | 12 ++++++++++++ .../fonts/fontello-ifont/css/ifont-codes.css | 2 ++ .../fontello-ifont/css/ifont-embedded.css | 14 ++++++++------ .../fontello-ifont/css/ifont-ie7-codes.css | 2 ++ .../fonts/fontello-ifont/css/ifont-ie7.css | 2 ++ .../fonts/fontello-ifont/css/ifont.css | 16 +++++++++------- application/fonts/fontello-ifont/demo.html | 12 +++++++----- .../fonts/fontello-ifont/font/ifont.eot | Bin 45480 -> 45952 bytes .../fonts/fontello-ifont/font/ifont.svg | 4 ++++ .../fonts/fontello-ifont/font/ifont.ttf | Bin 45324 -> 45796 bytes .../fonts/fontello-ifont/font/ifont.woff | Bin 27320 -> 27516 bytes .../fonts/fontello-ifont/font/ifont.woff2 | Bin 22700 -> 22804 bytes 12 files changed, 46 insertions(+), 18 deletions(-) diff --git a/application/fonts/fontello-ifont/config.json b/application/fonts/fontello-ifont/config.json index 8bf9e7a12..2bb7917f0 100755 --- a/application/fonts/fontello-ifont/config.json +++ b/application/fonts/fontello-ifont/config.json @@ -833,6 +833,18 @@ "css": "th-list", "code": 61449, "src": "mfglabs" + }, + { + "uid": "63b3012c8cbe3654ba5bea598235aa3a", + "css": "angle-double-up", + "code": 61698, + "src": "fontawesome" + }, + { + "uid": "dfec4ffa849d8594c2e4b86f6320b8a6", + "css": "angle-double-down", + "code": 61699, + "src": "fontawesome" } ] } \ No newline at end of file diff --git a/application/fonts/fontello-ifont/css/ifont-codes.css b/application/fonts/fontello-ifont/css/ifont-codes.css index 9a2c9eb9a..bf9c0648e 100755 --- a/application/fonts/fontello-ifont/css/ifont-codes.css +++ b/application/fonts/fontello-ifont/css/ifont-codes.css @@ -135,5 +135,7 @@ .icon-th-list:before { content: '\f009'; } /* '' */ .icon-th-thumb-empty:before { content: '\f00b'; } /* '' */ .icon-github-circled:before { content: '\f09b'; } /* '' */ +.icon-angle-double-up:before { content: '\f102'; } /* '' */ +.icon-angle-double-down:before { content: '\f103'; } /* '' */ .icon-history:before { content: '\f1da'; } /* '' */ .icon-binoculars:before { content: '\f1e5'; } /* '' */ \ No newline at end of file diff --git a/application/fonts/fontello-ifont/css/ifont-embedded.css b/application/fonts/fontello-ifont/css/ifont-embedded.css index 72b02936e..cfd782c45 100755 --- a/application/fonts/fontello-ifont/css/ifont-embedded.css +++ b/application/fonts/fontello-ifont/css/ifont-embedded.css @@ -1,15 +1,15 @@ @font-face { font-family: 'ifont'; - src: url('../font/ifont.eot?38542570'); - src: url('../font/ifont.eot?38542570#iefix') format('embedded-opentype'), - url('../font/ifont.svg?38542570#ifont') format('svg'); + src: url('../font/ifont.eot?49367129'); + src: url('../font/ifont.eot?49367129#iefix') format('embedded-opentype'), + url('../font/ifont.svg?49367129#ifont') format('svg'); font-weight: normal; font-style: normal; } @font-face { font-family: 'ifont'; - src: url('data:application/octet-stream;base64,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') format('woff'), - url('data:application/octet-stream;base64,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6DoAAOg6AAAAOwAA6DsAAOg7AAAAPAAA6DwAAOg8AAAAPQAA6D0AAOg9AAAAPgAA6D4AAOg+AAAAPwAA6D8AAOg/AAAAQAAA6EAAAOhAAAAAQQAA6EEAAOhBAAAAQgAA6EIAAOhCAAAAQwAA6EMAAOhDAAAARAAA6EQAAOhEAAAARQAA6EUAAOhFAAAARgAA6EYAAOhGAAAARwAA6EcAAOhHAAAASAAA6EgAAOhIAAAASQAA6EkAAOhJAAAASgAA6EoAAOhKAAAASwAA6EsAAOhLAAAATAAA6EwAAOhMAAAATQAA6E0AAOhNAAAATgAA6E4AAOhOAAAATwAA6E8AAOhPAAAAUAAA6FAAAOhQAAAAUQAA6FEAAOhRAAAAUgAA6FIAAOhSAAAAUwAA6FMAAOhTAAAAVAAA6FQAAOhUAAAAVQAA6FUAAOhVAAAAVgAA6FYAAOhWAAAAVwAA6FcAAOhXAAAAWAAA6FgAAOhYAAAAWQAA6FkAAOhZAAAAWgAA6FoAAOhaAAAAWwAA6FsAAOhbAAAAXAAA6FwAAOhcAAAAXQAA6F0AAOhdAAAAXgAA6F4AAOheAAAAXwAA6F8AAOhfAAAAYAAA6GAAAOhgAAAAYQAA6GEAAOhhAAAAYgAA6GIAAOhiAAAAYwAA6GMAAOhjAAAAZAAA6GQAAOhkAAAAZQAA6GUAAOhlAAAAZgAA6GYAAOhmAAAAZwAA6GcAAOhnAAAAaAAA6GgAAOhoAAAAaQAA6GkAAOhpAAAAagAA6GoAAOhqAAAAawAA6GsAAOhrAAAAbAAA6GwAAOhsAAAAbQAA6G0AAOhtAAAAbgAA6G4AAOhuAAAAbwAA6G8AAOhvAAAAcAAA6HAAAOhwAAAAcQAA6HEAAOhxAAAAcgAA6HIAAOhyAAAAcwAA6HMAAOhzAAAAdAAA6HQAAOh0AAAAdQAA6HUAAOh1AAAAdgAA6HYAAOh2AAAAdwAA6HcAAOh3AAAAeAAA6HgAAOh4AAAAeQAA6HkAAOh5AAAAegAA6HoAAOh6AAAAewAA6HsAAOh7AAAAfAAA6HwAAOh8AAAAfQAA6H0AAOh9AAAAfgAA6H4AAOh+AAAAfwAA6H8AAOh/AAAAgAAA6IAAAOiAAAAAgQAA6IEAAOiBAAAAggAA6IMAAOiDAAAAgwAA6IQAAOiEAAAAhAAA6IUAAOiFAAAAhQAA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UgBlAGcAdQBsAGEAcgBpAGYAbwBuAHQAaQBmAG8AbgB0AFYAZQByAHMAaQBvAG4AIAAxAC4AMABpAGYAbwBuAHQARwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABzAHYAZwAyAHQAdABmACAAZgByAG8AbQAgAEYAbwBuAHQAZQBsAGwAbwAgAHAAcgBvAGoAZQBjAHQALgBoAHQAdABwADoALwAvAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAAAAAAIAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiwECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgEvATABMQEyATMBNAE1ATYBNwE4ATkBOgE7ATwBPQE+AT8BQAFBAUIBQwFEAUUBRgFHAUgBSQFKAUsBTAFNAU4BTwFQAVEBUgFTAVQBVQFWAVcBWAFZAVoBWwFcAV0BXgFfAWABYQFiAWMBZAFlAWYBZwFoAWkBagFrAWwBbQFuAW8BcAFxAXIBcwF0AXUBdgF3AXgBeQF6AXsBfAF9AX4BfwGAAYEBggGDAYQBhQGGAYcBiAGJAYoBiwGMAAlkYXNoYm9hcmQEdXNlcgV1c2VycwJvawZjYW5jZWwEcGx1cwVtaW51cwxmb2xkZXItZW1wdHkIZG93bmxvYWQGdXBsb2FkA2dpdAVjdWJlcwhkYXRhYmFzZQVnYXVnZQdzaXRlbWFwDHNvcnQtbmFtZS11cA5zb3J0LW5hbWUtZG93bgltZWdhcGhvbmUDYnVnBXRhc2tzBmZpbHRlcgNvZmYEYm9vawVwYXN0ZQhzY2lzc29ycwVnbG9iZQVjbG91ZAVmbGFzaAhiYXJjaGFydAhkb3duLWRpcgZ1cC1kaXIIbGVmdC1kaXIJcmlnaHQtZGlyCWRvd24tb3BlbgpyaWdodC1vcGVuB3VwLW9wZW4JbGVmdC1vcGVuBnVwLWJpZwlyaWdodC1iaWcIbGVmdC1iaWcIZG93bi1iaWcPcmVzaXplLWZ1bGwtYWx0C3Jlc2l6ZS1mdWxsDHJlc2l6ZS1zbWFsbARtb3ZlEXJlc2l6ZS1ob3Jpem9udGFsD3Jlc2l6ZS12ZXJ0aWNhbAd6b29tLWluBWJsb2NrCHpvb20tb3V0CWxpZ2h0YnVsYgVjbG9jawl2b2x1bWUtdXALdm9sdW1lLWRvd24Kdm9sdW1lLW9mZgRtdXRlA21pYwdlbmR0aW1lCXN0YXJ0dGltZQ5jYWxlbmRhci1lbXB0eQhjYWxlbmRhcgZ3cmVuY2gHc2xpZGVycwhzZXJ2aWNlcwdzZXJ2aWNlBXBob25lCGZpbGUtcGRmCWZpbGUtd29yZApmaWxlLWV4Y2VsCGRvYy10ZXh0BXRyYXNoDWNvbW1lbnQtZW1wdHkHY29tbWVudARjaGF0CmNoYXQtZW1wdHkEYmVsbAhiZWxsLWFsdA1hdHRlbnRpb24tYWx0BXByaW50BGVkaXQHZm9yd2FyZAVyZXBseQlyZXBseS1hbGwDZXllA3RhZwR0YWdzDWxvY2stb3Blbi1hbHQJbG9jay1vcGVuBGxvY2sEaG9tZQRpbmZvBGhlbHAGc2VhcmNoCGZsYXBwaW5nBnJld2luZApjaGFydC1saW5lCGJlbGwtb2ZmDmJlbGwtb2ZmLWVtcHR5BHBsdWcHZXllLW9mZglhcnJvd3MtY3cCY3cEaG9zdAl0aHVtYnMtdXALdGh1bWJzLWRvd24Hc3Bpbm5lcgZhdHRhY2gIa2V5Ym9hcmQEbWVudQR3aWZpBG1vb24JY2hhcnQtcGllCmNoYXJ0LWFyZWEJY2hhcnQtYmFyBmJlYWtlcgVtYWdpYwVzcGluNgpkb3duLXNtYWxsCmxlZnQtc21hbGwLcmlnaHQtc21hbGwIdXAtc21hbGwDcGluEWFuZ2xlLWRvdWJsZS1sZWZ0EmFuZ2xlLWRvdWJsZS1yaWdodAZjaXJjbGUMaW5mby1jaXJjbGVkB3R3aXR0ZXIQZmFjZWJvb2stc3F1YXJlZA1ncGx1cy1zcXVhcmVkEWF0dGVudGlvbi1jaXJjbGVkBWNoZWNrCnJlc2NoZWR1bGUNd2FybmluZy1lbXB0eQd0aC1saXN0DnRoLXRodW1iLWVtcHR5DmdpdGh1Yi1jaXJjbGVkB2hpc3RvcnkKYmlub2N1bGFycwAAAAABAAH//wAPAAAAAAAAAAAAAAAAAAAAAAAYABgAGAAYA1P/aQNT/2mwACwgsABVWEVZICBLuAAOUUuwBlNaWLA0G7AoWWBmIIpVWLACJWG5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') format('truetype'); + src: url('data:application/octet-stream;base64,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') format('woff'), + url('data:application/octet-stream;base64,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6DkAAOg5AAAAOgAA6DoAAOg6AAAAOwAA6DsAAOg7AAAAPAAA6DwAAOg8AAAAPQAA6D0AAOg9AAAAPgAA6D4AAOg+AAAAPwAA6D8AAOg/AAAAQAAA6EAAAOhAAAAAQQAA6EEAAOhBAAAAQgAA6EIAAOhCAAAAQwAA6EMAAOhDAAAARAAA6EQAAOhEAAAARQAA6EUAAOhFAAAARgAA6EYAAOhGAAAARwAA6EcAAOhHAAAASAAA6EgAAOhIAAAASQAA6EkAAOhJAAAASgAA6EoAAOhKAAAASwAA6EsAAOhLAAAATAAA6EwAAOhMAAAATQAA6E0AAOhNAAAATgAA6E4AAOhOAAAATwAA6E8AAOhPAAAAUAAA6FAAAOhQAAAAUQAA6FEAAOhRAAAAUgAA6FIAAOhSAAAAUwAA6FMAAOhTAAAAVAAA6FQAAOhUAAAAVQAA6FUAAOhVAAAAVgAA6FYAAOhWAAAAVwAA6FcAAOhXAAAAWAAA6FgAAOhYAAAAWQAA6FkAAOhZAAAAWgAA6FoAAOhaAAAAWwAA6FsAAOhbAAAAXAAA6FwAAOhcAAAAXQAA6F0AAOhdAAAAXgAA6F4AAOheAAAAXwAA6F8AAOhfAAAAYAAA6GAAAOhgAAAAYQAA6GEAAOhhAAAAYgAA6GIAAOhiAAAAYwAA6GMAAOhjAAAAZAAA6GQAAOhkAAAAZQAA6GUAAOhlAAAAZgAA6GYAAOhmAAAAZwAA6GcAAOhnAAAAaAAA6GgAAOhoAAAAaQAA6GkAAOhpAAAAagAA6GoAAOhqAAAAawAA6GsAAOhrAAAAbAAA6GwAAOhsAAAAbQAA6G0AAOhtAAAAbgAA6G4AAOhuAAAAbwAA6G8AAOhvAAAAcAAA6HAAAOhwAAAAcQAA6HEAAOhxAAAAcgAA6HIAAOhyAAAAcwAA6HMAAOhzAAAAdAAA6HQAAOh0AAAAdQAA6HUAAOh1AAAAdgAA6HYAAOh2AAAAdwAA6HcAAOh3AAAAeAAA6HgAAOh4AAAAeQAA6HkAAOh5AAAAegAA6HoAAOh6AAAAewAA6HsAAOh7AAAAfAAA6HwAAOh8AAAAfQAA6H0AAOh9AAAAfgAA6H4AAOh+AAAAfwAA6H8AAOh/AAAAgAAA6IAAAOiAAAAAgQAA6IEAAOiBAAAAggAA6IMAAOiDAAAAgwAA6IQAAOiEAAAAhAAA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AXsBfAF9AX4BfwGAAYEBggGDAYQBhQGGAYcBiAGJAYoBiwGMAY0BjgAJZGFzaGJvYXJkBHVzZXIFdXNlcnMCb2sGY2FuY2VsBHBsdXMFbWludXMMZm9sZGVyLWVtcHR5CGRvd25sb2FkBnVwbG9hZANnaXQFY3ViZXMIZGF0YWJhc2UFZ2F1Z2UHc2l0ZW1hcAxzb3J0LW5hbWUtdXAOc29ydC1uYW1lLWRvd24JbWVnYXBob25lA2J1ZwV0YXNrcwZmaWx0ZXIDb2ZmBGJvb2sFcGFzdGUIc2Npc3NvcnMFZ2xvYmUFY2xvdWQFZmxhc2gIYmFyY2hhcnQIZG93bi1kaXIGdXAtZGlyCGxlZnQtZGlyCXJpZ2h0LWRpcglkb3duLW9wZW4KcmlnaHQtb3Blbgd1cC1vcGVuCWxlZnQtb3BlbgZ1cC1iaWcJcmlnaHQtYmlnCGxlZnQtYmlnCGRvd24tYmlnD3Jlc2l6ZS1mdWxsLWFsdAtyZXNpemUtZnVsbAxyZXNpemUtc21hbGwEbW92ZRFyZXNpemUtaG9yaXpvbnRhbA9yZXNpemUtdmVydGljYWwHem9vbS1pbgVibG9jawh6b29tLW91dAlsaWdodGJ1bGIFY2xvY2sJdm9sdW1lLXVwC3ZvbHVtZS1kb3duCnZvbHVtZS1vZmYEbXV0ZQNtaWMHZW5kdGltZQlzdGFydHRpbWUOY2FsZW5kYXItZW1wdHkIY2FsZW5kYXIGd3JlbmNoB3NsaWRlcnMIc2VydmljZXMHc2VydmljZQVwaG9uZQhmaWxlLXBkZglmaWxlLXdvcmQKZmlsZS1leGNlbAhkb2MtdGV4dAV0cmFzaA1jb21tZW50LWVtcHR5B2NvbW1lbnQEY2hhdApjaGF0LWVtcHR5BGJlbGwIYmVsbC1hbHQNYXR0ZW50aW9uLWFsdAVwcmludARlZGl0B2ZvcndhcmQFcmVwbHkJcmVwbHktYWxsA2V5ZQN0YWcEdGFncw1sb2NrLW9wZW4tYWx0CWxvY2stb3BlbgRsb2NrBGhvbWUEaW5mbwRoZWxwBnNlYXJjaAhmbGFwcGluZwZyZXdpbmQKY2hhcnQtbGluZQhiZWxsLW9mZg5iZWxsLW9mZi1lbXB0eQRwbHVnB2V5ZS1vZmYJYXJyb3dzLWN3AmN3BGhvc3QJdGh1bWJz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') format('truetype'); } /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ @@ -17,7 +17,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'ifont'; - src: url('../font/ifont.svg?38542570#ifont') format('svg'); + src: url('../font/ifont.svg?49367129#ifont') format('svg'); } } */ @@ -188,5 +188,7 @@ .icon-th-list:before { content: '\f009'; } /* '' */ .icon-th-thumb-empty:before { content: '\f00b'; } /* '' */ .icon-github-circled:before { content: '\f09b'; } /* '' */ +.icon-angle-double-up:before { content: '\f102'; } /* '' */ +.icon-angle-double-down:before { content: '\f103'; } /* '' */ .icon-history:before { content: '\f1da'; } /* '' */ .icon-binoculars:before { content: '\f1e5'; } /* '' */ \ No newline at end of file diff --git a/application/fonts/fontello-ifont/css/ifont-ie7-codes.css b/application/fonts/fontello-ifont/css/ifont-ie7-codes.css index 597de64cc..cee567f71 100755 --- a/application/fonts/fontello-ifont/css/ifont-ie7-codes.css +++ b/application/fonts/fontello-ifont/css/ifont-ie7-codes.css @@ -135,5 +135,7 @@ .icon-th-list { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-th-thumb-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-github-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-angle-double-up { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-angle-double-down { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-history { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-binoculars { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } \ No newline at end of file diff --git a/application/fonts/fontello-ifont/css/ifont-ie7.css b/application/fonts/fontello-ifont/css/ifont-ie7.css index ed00ba2a8..0f9eb1132 100755 --- a/application/fonts/fontello-ifont/css/ifont-ie7.css +++ b/application/fonts/fontello-ifont/css/ifont-ie7.css @@ -146,5 +146,7 @@ .icon-th-list { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-th-thumb-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-github-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-angle-double-up { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-angle-double-down { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-history { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-binoculars { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } \ No newline at end of file diff --git a/application/fonts/fontello-ifont/css/ifont.css b/application/fonts/fontello-ifont/css/ifont.css index 6ffac7a31..76030f743 100755 --- a/application/fonts/fontello-ifont/css/ifont.css +++ b/application/fonts/fontello-ifont/css/ifont.css @@ -1,11 +1,11 @@ @font-face { font-family: 'ifont'; - src: url('../font/ifont.eot?15561604'); - src: url('../font/ifont.eot?15561604#iefix') format('embedded-opentype'), - url('../font/ifont.woff2?15561604') format('woff2'), - url('../font/ifont.woff?15561604') format('woff'), - url('../font/ifont.ttf?15561604') format('truetype'), - url('../font/ifont.svg?15561604#ifont') format('svg'); + src: url('../font/ifont.eot?42867337'); + src: url('../font/ifont.eot?42867337#iefix') format('embedded-opentype'), + url('../font/ifont.woff2?42867337') format('woff2'), + url('../font/ifont.woff?42867337') format('woff'), + url('../font/ifont.ttf?42867337') format('truetype'), + url('../font/ifont.svg?42867337#ifont') format('svg'); font-weight: normal; font-style: normal; } @@ -15,7 +15,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'ifont'; - src: url('../font/ifont.svg?15561604#ifont') format('svg'); + src: url('../font/ifont.svg?42867337#ifont') format('svg'); } } */ @@ -191,5 +191,7 @@ .icon-th-list:before { content: '\f009'; } /* '' */ .icon-th-thumb-empty:before { content: '\f00b'; } /* '' */ .icon-github-circled:before { content: '\f09b'; } /* '' */ +.icon-angle-double-up:before { content: '\f102'; } /* '' */ +.icon-angle-double-down:before { content: '\f103'; } /* '' */ .icon-history:before { content: '\f1da'; } /* '' */ .icon-binoculars:before { content: '\f1e5'; } /* '' */ \ No newline at end of file diff --git a/application/fonts/fontello-ifont/demo.html b/application/fonts/fontello-ifont/demo.html index d85eb178a..8eb449c22 100755 --- a/application/fonts/fontello-ifont/demo.html +++ b/application/fonts/fontello-ifont/demo.html @@ -229,11 +229,11 @@ body { } @font-face { font-family: 'ifont'; - src: url('./font/ifont.eot?97051739'); - src: url('./font/ifont.eot?97051739#iefix') format('embedded-opentype'), - url('./font/ifont.woff?97051739') format('woff'), - url('./font/ifont.ttf?97051739') format('truetype'), - url('./font/ifont.svg?97051739#ifont') format('svg'); + src: url('./font/ifont.eot?11177247'); + src: url('./font/ifont.eot?11177247#iefix') format('embedded-opentype'), + url('./font/ifont.woff?11177247') format('woff'), + url('./font/ifont.ttf?11177247') format('truetype'), + url('./font/ifont.svg?11177247#ifont') format('svg'); font-weight: normal; font-style: normal; } @@ -502,6 +502,8 @@ body {
icon-github-circled0xf09b
+
icon-angle-double-up0xf102
+
icon-angle-double-down0xf103
icon-history0xf1da
icon-binoculars0xf1e5
diff --git a/application/fonts/fontello-ifont/font/ifont.eot b/application/fonts/fontello-ifont/font/ifont.eot index 3a9092fa4d5401454ffb411139da459f23229230..effc782d4f0b7649e0612014c42ac21f21a67919 100755 GIT binary patch delta 1008 zcmZvaUr19?9LImZbMHMjoi?+ZGnpthGngX8axeX{g4SaXAx1&W{S~&|i<_oT(}hs} zsbpfAh9VW#qkD~>e29qbEpa2V6xW}J4T>Vf^}CxwiRW_8@BY5$_dECdIo$crtbc>? z{sh3hSZg%;0RS%nK$|P*)K0ydXrO!^py-^dCsNDb=NQ1#H?&{t)qKIB zv3pl2{|;c#e9o{&dKu-56!-Z8ecq;Txe7C#B{FL9M} zH{}+8Fw*;Rvn@A4!Yu%13#cwCQ>0FRcbp*G|UdKQ&|P0D{$ z{WDDsM;?6g2LWau1Mq6C%cHHIwNmfGwfHz*#m;yJebG5U>IR$!A^+A$v6%YjKtvs& zoDc+H>4EfMrYK{`Ol5`aN_IV$14u*q=C;OmH2ti920}S1Sh@XFVHNEmFgj5L2{_1! zw@gNP80cP*$5(|v@r+PpEYXkPv-(P7B=J>r@g}#=HNl8gdl4v?6n0uz`jq5y)5bO&COQfX2YE>&6U6(jPxW|Z~i zsLhTo$4yvqVo#N|bF;Lcr;<{cXyzP6N>Jo^F}hprkx7@5Nl7wuy-bp}Hu+LsOr>^2 z&Pmj{byyvsdk3H%1vDZE%pswOqRNm2l`d0IsnV;MDiu>602P@48lq(W44JP%yS@-X zUf!h=!PX|Zr?2K+CsPHKy+qVx-JMRjUq>mpCITuZPrAr?GD!#N1c@&b=b70OTeDp^ zp8N?0A*~ZFA0EHI6XO>r?Kqm~pR_Q}VniED%uUr`Y2AgGqueo*|072euctQ{RV~a^ z5cVkENxYhUF4~RGkT2kAa;x1P6uPwo|K)D=Mo9K|h9hcMUvWogNOg4woLyluHTdL6 F$zPrL_1ypf delta 530 zcmY*VO-mb56g}@{oH&_CgI{z}C14hXO2Lh8y3j6)8$nzMtrQu@mjyBXYKlJld;KZ(1wd+5Uq#&FfyIHfpQO9Tbf1<;r=A1r zjexBCl(0^`i}VY^T3;YG_IUeS3~=lN3%h==GFl%!J_2&@NbmF$VZRnms4r6Q@oSOE zqhEtomWUq!Zw~}j#q`vD0rE7I-Pe>!o%6a~;KM^QxF;0NyVp2 + + + + diff --git a/application/fonts/fontello-ifont/font/ifont.ttf b/application/fonts/fontello-ifont/font/ifont.ttf index 8dd6019918eb9099b16078c27575fece6f49becc..ba72380196774767d56108ec122857a709eec245 100755 GIT binary patch delta 989 zcmZvaUr1AN6vxl`-FtsGXEw8&Gnpv<$zYlw=3XkZpgk2nh!_Pi_gC0dTOuHlk^nWTjEBPI9k+$gCZY>>)g#jiTCom=brEHoO8dQA2+tew$p5; zDe@Tr`v73T;kRoSKF+mL{sN%vvST#Vz(3^~!1E8Z-{96f{>j;y8i|#NXusP_g8WDPO1YErX0Jaq_9ZuvpCjQu z0PFIp4todh&jKvIB@<@9eN1Cw#XEp!8`RJcu=`zW%0!OxU8;Ynslm|vme&ukyb8eU zv=Nt3yCqiCS^6%bMPUqu80u*^i}-cH$0`OZRC z$ZlrS`8+@dGI#eiR?_rY|6B-Fs9??hU5mA}hrno}2oi9R6P-*(c?#%QkjHz4y?CD> z#d}0vw!A+kmbflDcsreQmKHpqC=?e=Qrs*qn4*|2E{G-G8z!eBL@~%5a1tzFxpbxu znIxmYm<=Q*slWuLiYS1fBAtNSq|}%cg-f-T7R89Xu>)oOak|Tj-JK?^K6j|f2Dw=} z##2eDQZ#dpA|)vDf*3idj>@D<$)qHixn3qodpW*d5L2m=$T^8Rx(=%Ygi8P|D4-ER zU^WRw6jg>KsC1NqN|kQKRHK**0I0|W&>A80J!HNft@?uq3i1J!2=;R1p1xXeolF%` z4iiz6b$2@9F&(Aonh20rEY7>Q@%z7ne-mRr->FVII(dtltZYQVX6s zYVToS*w8ZZM>J#3evD?#?22Fu3`~p&&Vt; Y$uFwpO3KX3PcF?#EGpi7aG5d>0Nh-j7XSbN diff --git a/application/fonts/fontello-ifont/font/ifont.woff b/application/fonts/fontello-ifont/font/ifont.woff index 2efa0ae11f4592af84e0a6c117e010b7a3a804ff..17736a5a37e48d6dd01b49280d0768b09e747dd4 100755 GIT binary patch delta 6060 zcmV;d7gOlC)dBq00Tg#nMn(Vu00000YkU9?00000vgDBzKY!k1ZDDW#00Gzl00R>M z00}}p(3U4-c61;B00is+000vJ001Bc*Z%@$aA$1*00jU500oc$01I%6k&szuVRLW* z01A)*000O8000O8000nYY;H^sWnp9h0ApYP001%o001@< z^lZ;)Xk}pl0DohY0000W0000a2loWwXl-003l^ z0003T0003TF9uZcZDDwD003pM0000W0000W0t5}dZeeX@003ps0004c00081#1w)2 zaBp*T003u9000BA000IZnBr({aB^jE003(M0001b0FzMxNdaV&n*lg~^7ssf0C=3` z*4J`dWf+CwSF$k}hZX_^(|hl|_uhN&ByCeOnk@W4^Jl>=L;OXalSa&;pfd9?#VPevo>3vt<3h! z7v_8C`}XgLkX=2S{&V(!ug8SVlP#02eXdScH_oR1$3^dCi32%^Wv{owCJy0H4)bb9 zc+Df(!ciQ}F>K{nRymI2Ie`;7iIX{nQ#p;(IfFAfi?cb0b2-oZzJLq4h>N*|OSz28 zxq>UXimSPXYq^f=xq%zGiJQ5FTe*$fxq~~oi@Ujpd%2JMd4LChd5DL3ghzRd$9aM$ zd5WibhG%(>=Xrq_d5M>Kg;#lv*V)E)-r!B%;%(mHUEbq;K41qQ@(~~N37_&ApYsJ@ z@)ck64d3z|-}3`I`H@}hW{sctnP2#o-}s$%znG=}e1HGH$EM-W(x3gbK1|tYn9h_F zL~5Ak)G*PhVbW87P8um^j+E0!$~h!8Y(UD{BsJV!%6TQ_q!yZKT{gQf?qAcafA^Ny_~s z<))HyXGyueq}*dtZZs)(o79k6DfgX}n@`FNAY~emG8agHnGmGR3R0#9Df5GrNkYm@ zA!WLdGG|DcIHb%TQl=0o^N5tmM9PdJWm=Ikw@8^_q|7o>rWz^pjg(18%FH8W`jIjR zNtuYG%tlhCBq{Tfl*viT3?*fnk}_9GnXshHT2iJiDf5?a5^PH4_$xh0QCuQ1`GWSW@0Ho{!Qnmsq`+<~ALCVe`WqXjaM@ZQyr0f<_whSrz zhLp`i$_^rB8?%^W7AgCSlubs;P9tTzk+SDV*?6SvK2o+IDf^I=%}C0Q zBxPHYvNuWDp#Jt4F}&^`F}$vg>{n*XBb%1l%E-|y2$BO96d-jUtR zeBX%mzX9fvvo5pS1UgWE*5EjGE{e+5 zR73>UcLY~|cgmw! z-~i_teSiI4LH5djb3yQm-Z?*rnmDI}2HKpDL(+LvhWffN7XU?)ltXw>q{9MAM-$<& zu4^c(3WCEtsvEiy3Tgo@;Kz1Is-)r=q0q+=ISd+UgTI{m;#rnb_dN;sJ;8o}^=3bO zl2X(58#q3!#%pY#afLSlC$=eg`9|Xk`*3p~;;Z6=BCU*nmQbqqSexP+q3Mnh;0tgI z9e!gg7Eki?WiT0zq)QoxML6c@MNn}7blM3Ap$p6)w2PIrDc-du*Wb9(pW6b73`c$d zi$fS>o_hv9_QF`9cQ1@@hj0GU5l?@adkf%?f8>70uex#8QK1dB_o7fnt#ngwPj|7< zk;|l#R%;@EhLtgB*>t#RY$A(_58b+;V{Csvc)jm7h&N?w+V5a>g`UGE0e_`N-(?Plu zZ?Nc2Jia$XcZF&n=Xa%M?Q58*VJ39DpYXV_w^q`(n0cZ_~rKSm0#QY%#_j~G`J@yO`i$G?Akde8f^>DJbNkRtv~!`+&$ zdPZAYV)2oQvnQ{QRQe#?HOW9Q^^uYk;H8V4t0*{tUuh5-c-+LxB(q`n-xHL?J3W1`Aq^T~Z`6#b9;V zRI>nUrO;0%3rV<4=T5~g2|^R+mdZD2=T~xMN$&cKLuP)x|8F`IHMpY>wU$gq9IcZ8 z+zG1_#)E|r{_`#?xM*LDSu7QW#}O$%j-r0U0mHTs#j+w{9xxhPlo9 zrdI0P?pt5qwnW=IkXly&TH_n$!lZ2f9m{g+$&16XZ^&3zUeB91WnOn|4D3{Y=~|w= zdCR%SzAbAT=3>8XVuAVB;xjvF%BzsO#AB=QxnOz~3YWNad+90hIkAZHU_|H?PS)=x zxcGD`5tn3@5$%kusC-XTk)`t*2&kx|v^?XIa1#qFxkh+l**C(BdOaZIGD&MwOSIGM z4C$VTHzG>{uBK$NgDT2TD0K>d@swgJq-|EpB8o%g%8ieVjH?vXh+jQi|2Bja`_J}A z?B6Tk|3jghrINYsuUQ``hkFvbx6s;SUD^>U$Nc_Gt5{(6U!5zx@CbyT?rCjH7Lz+0 zUoMvuncP3m?Cfq$rJg&C=Aa;#zD3jsc#SN?06tyZ|%T@}97r%JVGgl&s z51#Bl5sm~CiCu?s#cZ)<&#UwDxrsX~gH^M?%q~>(@qJHy^i-X_haG^uRZ$6?9A+kK zxnrgW@@EEt9Pt?c4)Un1?aIxVisOthJ7?A|B5YVPHN_OI5 zg>1zWAXprN#Eck05@0k%$Uxfb%(6UUDs7Z%X@^lb#{ossX31!}cCxRNYvq}_(4(!n zJ?Y*1Pr&@V{R_$yeKWfozaE|jIB<1p3kr%4%15W}zG}ZRvzsMl;ZR1SU6pCtXOStIM)v!;Q<49u z;FtZA)lzp?K9|j;Q-%>vr_&jO+lio@#}?4Hmg6>#8b^GL#e2DH33<_&C9@Q9{d-&o z)))0dgLq|?L@aiD{`SkQiGBh|iGze$-Q*ocd%reFw=K?|rs+*YRJ1izkF;ge12AaKT8&)D? zC9zM?{s!tnHyZf{M5L#iV9!S5LLSBPCAE>I7D;lyyXr%0KbgH^?hIM6+7 zI6}VbRf$s6ubx*?*HdKeVNF)NUe9UGyP9;OF@BB=>F4Ou@56Cblx0!1zo2N^GL92r zv}_fIiD9=Nr`{~zq!6%cf=U~oL>a*`A(cDTITxol z@-C)W=?JWUV8d>KCZKzGyROLt z8CE=sKc>lPg?Q5Jox1)Ozdk@W2Jk;{o$@uY%KplEu(S2l=C-)ul?V_H#ykL{vDHhp zg9yJ1jBG6z#x*)l+j=0YF_IzkTy|9dZNYx?=z?^A>D1%Wsqv!{d>*2doOz0!#N^=z z9$&C;g$_Ri2NzF;-X9u2`Zm0cN&72{C!=R5d18T^8J7NQ>1oLlbJz!4P{ZgHChPlB zM3OP)ZcyVy!pOCSqJMBE!AS;{U+jW3Gm^U@h?9B%gpNF68kylhi{7Hi)EhlK{s&h| zPKt+rt9zbSN&W@mG9M}TMpF?kPV(((#t5+s^I6uk!Sj#*+`9 zuR~=hf9={Ql(BtE_i&MYtJYYm9XwcLP&<3Rv2^yE-#E|Ud}Cqs8a$#0UwI{{C%aj1 zGd}Xq;!Es0Z(mL*33cIsFi`LFf$Rlt6!H*%zY;eKsg5t2%6-ukZXKE2w|8XMK)K}n z_EN|~#Th!z&@$dNfg_CCUFN;hc-KV1N?L_?efv$pV%zAv@iThg_!A2}G|dc30|B6AWZKWAfJ1(N zE(Kt>MKRz`mlJvK$WVW^R5ozVtyC(U5!-CC@40r!7I5s4syoM0RJuX9R_m^dxb{kO z-E~$BEHepK%zh(gtxA~5V>j>zez+zNC`H%t3x0t=!<2@ki5Zr~YIrSa4sTGN9lrsS z|9Shr|Gz7mdmOLvd3#DYF5E4g63(K33jUz5D4eUG&RCmFd^q<7P=z>$4{{8LtwhQ? z#azz{4xqO{u}b6{fTM$0!ek(L09n4EIXaNGS_gXYf&1t8?%7e>-c#(_+$K!Hl*gUt z$yTY*PIi7sqTQ)HkwN8BYBx?3am9>UBA+-?q-AacLIQH4$Sqba)hJ{^$&+_~`4EUz zBIAn1tGRc))yhh=TEi1(t$6WjP~V*F-H~c#MYAO|V4CF%70s##TcX88YDZ7IsrXxS zDczU!`}`WyM9H5}6gAb6^9LZLUwv`md!J&m!oVAqe5yB!>x;Kd3U~rpFeD=vi6kM+ z!nE96eEe5kqVBy^Z4q^=INmdV(o@ps&*}=+}$nT&@sF8?AIVgG7#ads>D^b}nmmTGQs?DvNj#`6r zYEwmdXXYh!o$^2m#ZOdM^KmmtQCL&|i_Q9HQBVl-Km?q+L7F310a(F!jm8ty4>*YV zS^@?qE~m0#F4i9vlaNGe7}XiI6<+6!GGSg_udZRGe?pn4obgOoVN#auT{O0~3wwp* z^&J5|B;vdq(VYe$f9P`C!DUIDs?hdYX_NaHUoZ~sKqgff_D|a z=tCKU@Mdx9K|POV8Juo}^Bz#uCI}>1Tmr&A!w`g8rFZ+*u8w>rwFR|0BWgq=VJsGlO0zcV*4A`+(%-Gs3@jU9%sP0`S=4ZHF6CI8D;9IsS*|6fhBu*?8>oMT{Q zU|;}Zl@|Y+cz&C&4BX5wfFcYxB&SS=(f=R+&t%!p91P@taxgG~L;+9846pzIc${Nk zWME(p`k%$Xz{>jn@&6|*`x$^DD4-VrnSKV~c${rfu?@mN4E)52MEjFONOW{;@dK~| z15hvn<+qWTgf(bVQqX`P#^?7Z4@z;eKeq4A4h_zcpuRfSbj%dxy%xj;NMGAZ3@KMk zHJimZ&rb?}{GljO`}l=7_^Stxs<#E?y>|}C9;O&gC;a7wc6C8bbOW@R!I^Z0<7jn{ z96byB1ng{_-g-*-V$VOQXJ{|gjTauW7evgc$2=$gn!}88UTa<9X-IyuU+oXLC6Ckm z{4ehHO0-UZ+(mNQ<(u1$&iwwpYq}e4gs>0051%0%e;4e{$nC5Y@9tk(4F*eCfUSFg=&vd+)u1;F3fH5L4+6yrr5;{b1blj6WGT|oP%?5 z9?r)FxDXfNVqAhtaTzYh6}S>t;c8riYjGW}#|^jU8XJ8&oN!rizB z_u>@p!~J*w58@#_j7RV&9>e2!0#D*8JdJ1YES|&jcmXfsCA^GR@G4%z>v#ii;w`+5 zcknLW!~6IEAL1i?j8E_>KEvl=$iR_5QPLdl$TN_A`3ajsU4R4ku#t>4C_up#d1VGNqPbf6I)e*l=N7un9}4G77m= zT^<(F-677H<`vVnZ!OJ*cCGm>mQ+{|5-rMVgZd+?rDnSEc^J9leoy-I9{B{BD2F(Q zHmN-56F9J^$%rFLi%!avNxSriNFMk;0AH#7+nYf|H2`5cU&_-CQVb^CIcNO6h#sBRX_)alG)<(xDBl zb~BlCRoB$mO{HkC0yic*^~=T|WF%$m7ti3FS?dl7f7N&^Y_)I^lnWabO0S$wLrtw* zC;jS<$T6*HY*`t&znOb>`r-NLK0001!JZgN-nUnGW delta 5882 zcmV7=(Xk}pl0DofW0000W0000a2loWuXl-003j; z0003P0003P=p+rVZDDwD003nC0000W0000W0s;-bZeeX@003ni0004c00081#1w)2 zaBp*T003r~000A|000H|m%4T7aB^jE003${0001b0FzMxNdaM#n*lg~^YILc0C=43 z*2j{Rbr^;5r(ql&1_e>UEan85BP!+u=8PyPm;;!_j4+C`a^;3QV^7st_FMrz-+adf z_h5JZrn~>uHT_lB`<~OlX~0Tt(hRKlhl$Ua{O##v`Ftg-md|G<`+U9DyYJ7TEKKL7 z^V4HX$Cpl=Jn0EJeCo-6DYpr0C+jBb|GO`rtnfe0cm=bZ&Kb=4IrFUMOwMABpK>U62#@j@kMjgi@)S?AogF;GvpmOt^Sr=|yu{1A!mGT- z>%75E-eebV@ix2J!#ljoUiR@G@ACm4@(~~N37_&ApR=C>e8HD|#n*hpw|vL<9OMUn zZaCIqXm6TIU%K0VbB$INcNjcr5oO4o6JSk_Nlv_Z` zeIVs#ka9;zxhr!d zhe^53q}*##LsF&Oby99UDfge0NkGa>AZ0p`GABrx7^KX94pOEFDf5Js$wJDEA!XW- zGIvOsK%~qfQl=6q^NEy6Mas+~WqOe^$4HrIq|7!_rW`5rj+Dtq$_ylB8j>;>NtuwO z%t}(GCMolilu1g;OeJNyk}_vWnYg6PUQ(toDf5_=$xOg7 z^PQAQPs+@HCuRDRvIj`n2&C)=Qnmys`+}6sLCOvxWt)()S4i0~r0g0}whk%#hm=i3 z%1$C>JCU-dNZDAV>@HHa7%BUVl+8xUjw5B;k+Szl*?^?%LQ=LODf^L>O-ahm^q0rT z_VgFWh~e?bh~aTzWVbS%8`-i<=STJ}(_m!;zlBRiO-6C)P?1@UpJ(g3sT1UgWE z^58bEGQQv2Q_^asm9&!VI2&1~Eh~;=U2%LwvE$froHoQI7r}KyN-mtFt&^Cxq0PW_ zGSib|pmd-d?Q~kEEimN|jsXg^VWtHJW+42L48xRRhNCbY7_Jhn`M$T3kKlr3Y4<(t z>h0To$M=2j`+h&Fk%z*lIW|Z!+)jFbX1m$Tq4azDpWJu$@)>FVJ0Cm-UmhMjjQn zc-jCBw9`HgN#{`+>g&R3KPZxf zl8SwVLLYNhcHM#@hN!tsj+L^W;)N)H~418Qv**O4bYi*f=y@Q_B}y5D_H#~KPx%wT*5>Z zGoicj4UemOYvDfekK(9*&?f|HdI5w{sz{gsN;BNemA|SyOh4nSV-I}3#Mq68=v5|@6hcAzm`ykOdwfo1n zpFMx}(9DJuW1Ff$&uFS$$>g@Z_r7~B-2Xl)rkZN^&>FvIVrKe(J<}r-k~9IcZ8+zG1_#sm2v{&<%in0L-bZI+C{ zgYyA4)w~zy?Sc*G0)^%G*5&(AnJ~KK@?u#Lerp@GGP%cphsn#Uf`mVn56ma>_B>UF zeSy~x3$zlfEk*@mNlks>+v2z=qt4YP{ajwhSs=3&1n^<7_N_=J) zO?eq|mv~?qJ{L?cL*Wt^t}i?$J|PxR9t;be!r|Jj1Q(x5#$%GKGNPT46_u}PDzbD^ z0|6Cvl$K{2B;3TpO0E%JSoDpsB3=&&*>u8Q(-P^lI)jEM>Z;{4tDi1TL!^uOf0Su&CB{+j)PQm7|x zc=N42_PI^LQdHN|tzw=z|8$S^!o3jsWKU~bqLA2Jf3Z}Gr?a1*+1%ZlOg?_h?GyhH zFR>q>KCr7cf%8&=$+FUd4)Z#AU2I|D3Rg4fg4t-Dr!Z%lqu);&OdwGr!Iu!A3EHBC=?FF<6HJ*3zykz7uyBfE282*Jj^WCa??zH>WFMbb{>O1JyA<5Lemd_ z@Bp`+Pt?Xj)Ud`>Xkf!pP}eC=Fd_+LA)rNRlxqwiD>L#Z74x7nR)G~;wfktmyhLy-zN$eA}z5#rOq8=#H{8-4R+FRqH zpsENu=&n(JiP$CF0O}!}7>@RT6fSXdu&P*L7rJK!N67cQDp88+>PZ!KJw?{;(PYKz z^&Hi_%Sk8d<0r_Feu57DAskdiSr%328Aa0;ahwRFWxX&=47>d}^k(=Xg@8>HR9g5X z$_S1L$t3w?6WVDJ(rG15btGox%6;V`N48qcxj40&cQM6EhhYgDb{#Z-0o_A4`W54- zcY|Xwj(3vpqSNP38*drLppiB{4#zPut_D{}(ov9_)w#7`ZM1XKG<^dRuE}yDhMEEUWW~$i`&e1Vi)&p6Mk_?&S zvZMOVIp@v&bJDpZ4@pOV#`jC`MTk&x<}r2{lY8%cXwJD7+5>C(rPu^meHaDjchT3@K{ z-d$x-J$|yjaQs`}ILY8-eQxv;+-n40dMRKex>;{CKJxG4bL=v&UsfmzHDQ-9Q0w!7 z>;-NV@({lgHw&qMt}mL(ebE$d9huy*ePqi(sp!6XDP*DSb{)5CneUju9!B*p@z!a+ zVb18#0`B5xlV>aP?_CXTt~ za+xz?TTS-8h8?m6Tsx%N7-K0a-6UMA8;%P%?3LCH$JtS^tpwOn=Z&bnEMX-MT){th zeMKHnijLz4{1X3$DGdn=Gi;kx@mSIv-k>}ub_FJXas9Xd?}+9a$18l?o)QiUw+csu zA2^bvWo`gM0&=6sZB{8(DP%#(k$3qJh!rA#>1fG-rW{tk*uu5V<95U^eUpL*oNO~)tK1Z#=M5u_3MXF3a&p+ z!G4kw5PgbnNrq}fB)?bpD6+0dD)_-iY&}c%7J9ZDh3&$@+P*x9@>-NkY8fVJ{Y9qG z(MDe(D$LQ~f)xp!(ZUzJgSKpJm<@P$uhbDiZ_Dwg(eX9Ro5)x+{)I> zpf}F@87tMeLGt1r;jcGbgCCUq@VQ5SSbx;uN&NqlUvh?C<lI0#{{f{Dc!hYJV_;-pU;tvn6>3M~`E9;3a5KLE ziZEP{@|_E#|3Chp$+Dk07|7*dU;>E(0A0Wg{s4HKV_;-pU=I49#lXPI`v38N|0gW_ z8Gs@vpc??0d>Xh0D2 z-hGlwl;X*DY`^!;k=_^q%DXXDqbe=xEzqt2b9IgALhdp4;x4~geT&ndw1|FAKdi}L zymat-djj>*7$SKXV;gncBG0sciyM2;b<|cRXV3-5Irc4c&aAx0@y(Ib#+e*8d*=e) zGquWt#zilG`>A)jN?QsXNI&r}y5&^f(OFPD zJDG`Q1ianZ#V+i1Q9Opn@dTd4Q+OKB;8{F}=kWqw#7lS?ui#a@hS%{1-o#sY8}Hy_!ytyQ+$Tc@ddtwK!zLz2qh}ikoXEKC^TrH(cu&fEF5|qV2#t*;1FNq8+?oJ z@I8LOkN63HKjRntir?@%{=lF33uo~6Bq@ZgGc8OJ^p;HM7rUcZvs|<}si0H64IA0^ zcCXZ`Ad^zlxlLT?b*r=}W_{zV&$+ak$@;A>Jc@Kqjj(kJ0uh4~7F6 z95ZC)A*E%nR4SC){g=HrV%rF%f<_Dmv7v%REEx8Ok#SxQ7 z=4@@K&Fjc2$u!%Tg>WEqve5{_fuWdrp|mT?WB_Yziur)(G|PqOlBbSNyU-ctWRdHp zq1J6HMWYokO>XX&tv|>}sn{=mf(zjs2T9$3dMoUV=9VC)Y~LM! z&!i95vXrb5-6q@eousi5VMvTlmiR0qvEp~yh)U+6Kl0>!5aXb-`5@2%?rv2(;FyIx zfGNlCi?&i;Fnz|GPdM=(&yY9ErO6fT`C+A7TtsdynHzJw6gl}fnc7o5cULSb|CKnh z_RkSGCWd)U`D)HmXHfKt7R+PI6CZUZ;cA|?bxYodd2QWG{-o4>cD8!WA=+%_nQV35 QD`D(p@(+y2-c6Ege4cnsfB*mh diff --git a/application/fonts/fontello-ifont/font/ifont.woff2 b/application/fonts/fontello-ifont/font/ifont.woff2 index 25ca736d59c822c44ed38b83f668c6f3c974d67f..f9c520d0b38c00a97baab06060b4a3dca5a48f4a 100755 GIT binary patch literal 22804 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�&9BV9Yc#IB|MWy@Pv^UPg9PMWGAYvZe5zaG(s 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 literal 22700 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

EMZ}@GxbdB^5pN2-~Id82diIx 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 Date: Tue, 20 Nov 2018 13:56:41 +0100 Subject: [PATCH 03/59] CSS: Style for collapsible control --- public/css/icinga/main.less | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/public/css/icinga/main.less b/public/css/icinga/main.less index 938dee3b9..05db9d06a 100644 --- a/public/css/icinga/main.less +++ b/public/css/icinga/main.less @@ -233,3 +233,40 @@ a:hover > .icon-cancel { width: 100%; } } + +// Collapsible Control + +.collapsible-container { + position: relative; + + .icon-angle-double-down { + display: none; + } + + &.collapsed .icon-angle-double-up { + display: none; + } + + &.collapsed .icon-angle-double-down { + display: inline-block; + } +} + +#collapsible-control-ghost { + display: none; +} + +.collapsible-control { + .rounded-corners(50%); + + background: @gray-lighter; + color: @gray; + width: 2em; + height: 2em; + position: absolute; + border: none; + z-index: 1; + -webkit-box-shadow: 0 0 1/3em rgba(0,0,0,.3); + -moz-box-shadow: 0 0 1/3em rgba(0,0,0,.3); + box-shadow: 0 0 1/3em rgba(0,0,0,.3); +} From b07ffd49876e126d789fb5b2b2f2a7240c29fe60 Mon Sep 17 00:00:00 2001 From: Florian Strohmaier Date: Wed, 21 Nov 2018 13:59:54 +0100 Subject: [PATCH 04/59] JS: Implement collapsible-container behavior --- application/layouts/scripts/layout.phtml | 2 +- library/Icinga/Web/JavaScript.php | 1 + public/css/icinga/main.less | 72 ++++++++++---- .../icinga/behavior/collapsibleContainer.js | 96 +++++++++++++++++++ 4 files changed, 152 insertions(+), 19 deletions(-) create mode 100644 public/js/icinga/behavior/collapsibleContainer.js diff --git a/application/layouts/scripts/layout.phtml b/application/layouts/scripts/layout.phtml index 549a842a3..2fbf412cc 100644 --- a/application/layouts/scripts/layout.phtml +++ b/application/layouts/scripts/layout.phtml @@ -76,7 +76,7 @@ $innerLayoutScript = $this->layout()->innerLayout . '.phtml'; } }()); - diff --git a/library/Icinga/Web/JavaScript.php b/library/Icinga/Web/JavaScript.php index a26a863c3..cb80ff647 100644 --- a/library/Icinga/Web/JavaScript.php +++ b/library/Icinga/Web/JavaScript.php @@ -24,6 +24,7 @@ class JavaScript 'js/icinga/timezone.js', 'js/icinga/behavior/application-state.js', 'js/icinga/behavior/autofocus.js', + 'js/icinga/behavior/collapsibleContainer.js', 'js/icinga/behavior/detach.js', 'js/icinga/behavior/tooltip.js', 'js/icinga/behavior/sparkline.js', diff --git a/public/css/icinga/main.less b/public/css/icinga/main.less index 05db9d06a..d5a70b1d2 100644 --- a/public/css/icinga/main.less +++ b/public/css/icinga/main.less @@ -161,13 +161,6 @@ a:hover > .icon-cancel { background-color: @tr-hover-color; cursor: pointer; } - - caption { - border-top: 1px solid @gray-light; - caption-side: bottom; - font-style: italic; - text-align: right; - } } .name-value-table { @@ -235,27 +228,68 @@ a:hover > .icon-cancel { } // Collapsible Control +.collapsible-table-container { + &.collapsed.has-collapsible .collapsible { + overflow: hidden; + max-height: 8em; + } +} -.collapsible-container { +.collapsible-container, +.collapsible-table-container { + &.collapsed:not(.has-collapsible), + &.collapsed.has-collapsible .collapsible { + overflow: hidden; + max-height: 96px; + } + + &.collapsed:not(.has-collapsible) { + .collapsible-control { + bottom: 4px; + } + } +} + +.collapsible-container, +.collapsible-table-container { position: relative; - .icon-angle-double-down { - display: none; + .table-wrapper { + overflow: hidden; } - &.collapsed .icon-angle-double-up { - display: none; + .collapsed .table-wrapper { + overflow: hidden; + max-height: 12em; } +} - &.collapsed .icon-angle-double-down { - display: inline-block; - } +.collapsible-control > i:before { + margin-right: 0; } #collapsible-control-ghost { display: none; } +.collapsible-control > .icon-angle-double-down { + display: none; +} + +.collapsible-control > .icon-angle-double-up { + display: block; +} + +.collapsed { + .collapsible-control > .icon-angle-double-up { + display: none; + } + + .collapsible-control > .icon-angle-double-down { + display: block; + } +} + .collapsible-control { .rounded-corners(50%); @@ -263,10 +297,12 @@ a:hover > .icon-cancel { color: @gray; width: 2em; height: 2em; + z-index: 1; position: absolute; border: none; - z-index: 1; + bottom: -1em; + right: .25em; -webkit-box-shadow: 0 0 1/3em rgba(0,0,0,.3); - -moz-box-shadow: 0 0 1/3em rgba(0,0,0,.3); - box-shadow: 0 0 1/3em rgba(0,0,0,.3); + -moz-box-shadow: 0 0 1/3em rgba(0,0,0,.3); + box-shadow: 0 0 1/3em rgba(0,0,0,.3); } diff --git a/public/js/icinga/behavior/collapsibleContainer.js b/public/js/icinga/behavior/collapsibleContainer.js new file mode 100644 index 000000000..e9c142a76 --- /dev/null +++ b/public/js/icinga/behavior/collapsibleContainer.js @@ -0,0 +1,96 @@ +/*! Icinga Web 2 | (c) 2016 Icinga Development Team | GPLv2+ */ + +;(function(Icinga, $) { + + 'use strict'; + + var expandedContainers = []; + var maxLength = 32; + var defaultNumOfRows = 2; + var defaultHeight = 36; + + function CollapsibleContainer(icinga) { + Icinga.EventListener.call(this, icinga); + + this.on('rendered', '#col2', this.onRendered, this); + this.on('click', '.collapsible-container .collapsible-control, .collapsible-table-container .collapsible-control', this.onControlClicked, this); + } + + CollapsibleContainer.prototype = new Icinga.EventListener(); + + CollapsibleContainer.prototype.onRendered = function(event) { + $(event.target).find('.collapsible-container').each(function() { + var $this = $(this); + + if ($this.find('.collapsible').length > 0) { + $this.addClass('has-collapsible'); + if ($this.find('.collapsible').innerHeight() > ($this.attr('data-height') || defaultHeight)) { + $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); + } + } else { + if ($this.innerHeight() > ($this.attr('data-height') || defaultHeight)) { + $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); + } + } + updateCollapsedState($this); + }); + + $(event.target).find('.collapsible-table-container').each(function() { + var $this = $(this); + + if ($this.find('.collapsible').length > 0) { + $this.addClass('has-collapsible'); + if ($this.find('tr').length > ($this.attr('data-numofrows') || defaultNumOfRows)) { + $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); + } + + if ($this.find('li').length > ($this.attr('data-numofrows') || defaultNumOfRows)) { + $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); + } + } + updateCollapsedState($this); + }); + }; + + CollapsibleContainer.prototype.onControlClicked = function(event) { + var $target = $(event.target); + var $c = $target.closest('.collapsible-container, .collapsible-table-container'); + + if ($c.hasClass('collapsed')) { + if (expandedContainers.length > maxLength - 1) { + expandedContainers.shift(); + } + expandedContainers.push($c.attr('id')); + } else { + expandedContainers.splice(expandedContainers.indexOf($c.attr('id')), 1); + } + + updateCollapsedState($c); + }; + + function updateCollapsedState($container, listener) { + var $collapsible; + if ($container.hasClass('has-collapsible')) { + $collapsible = $container.find('.collapsible'); + } else { + $collapsible = $container; + } + if (expandedContainers.indexOf($container.attr('id')) > -1) { + $container.removeClass('collapsed'); + $collapsible.css({ maxHeight: 'none' }); + } else { + $container.addClass('collapsed'); + if ($container.hasClass('collapsible-container')) { + $collapsible.css({ maxHeight: $container.data('height') || defaultHeight }); + } + if ($container.hasClass('collapsible-table-container')) { + $collapsible.css({ maxHeight: ($container.data('numofrows') || defaultNumOfRows) * $container.find('tr').height() }); + } + } + } + + Icinga.Behaviors = Icinga.Behaviors || {}; + + Icinga.Behaviors.collapsibleContainer = CollapsibleContainer; + +})(Icinga, jQuery); From 545d3355a9149905349e52f7c567896460175527 Mon Sep 17 00:00:00 2001 From: Florian Strohmaier Date: Thu, 6 Dec 2018 11:31:17 +0100 Subject: [PATCH 05/59] JS: Use can-collapse to flag containers with sufficient height --- .../icinga/behavior/collapsibleContainer.js | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/public/js/icinga/behavior/collapsibleContainer.js b/public/js/icinga/behavior/collapsibleContainer.js index e9c142a76..24fd1164b 100644 --- a/public/js/icinga/behavior/collapsibleContainer.js +++ b/public/js/icinga/behavior/collapsibleContainer.js @@ -24,12 +24,14 @@ if ($this.find('.collapsible').length > 0) { $this.addClass('has-collapsible'); - if ($this.find('.collapsible').innerHeight() > ($this.attr('data-height') || defaultHeight)) { + if ($this.find('.collapsible').innerHeight() > ($this.data('height') || defaultHeight)) { $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); + $this.addClass('can-collapse'); } } else { - if ($this.innerHeight() > ($this.attr('data-height') || defaultHeight)) { + if ($this.innerHeight() > ($this.data('height') || defaultHeight)) { $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); + $this.addClass('can-collapse'); } } updateCollapsedState($this); @@ -42,10 +44,12 @@ $this.addClass('has-collapsible'); if ($this.find('tr').length > ($this.attr('data-numofrows') || defaultNumOfRows)) { $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); + $this.addClass('can-collapse'); } if ($this.find('li').length > ($this.attr('data-numofrows') || defaultNumOfRows)) { $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); + $this.addClass('can-collapse'); } } updateCollapsedState($this); @@ -79,12 +83,14 @@ $container.removeClass('collapsed'); $collapsible.css({ maxHeight: 'none' }); } else { - $container.addClass('collapsed'); - if ($container.hasClass('collapsible-container')) { - $collapsible.css({ maxHeight: $container.data('height') || defaultHeight }); - } - if ($container.hasClass('collapsible-table-container')) { - $collapsible.css({ maxHeight: ($container.data('numofrows') || defaultNumOfRows) * $container.find('tr').height() }); + if ($container.hasClass('can-collapse')) { + $container.addClass('collapsed'); + if ($container.hasClass('collapsible-container')) { + $collapsible.css({maxHeight: $container.data('height') || defaultHeight}); + } + if ($container.hasClass('collapsible-table-container')) { + $collapsible.css({maxHeight: ($container.data('numofrows') || defaultNumOfRows) * $container.find('tr').height()}); + } } } } From 168cc33a697ccd22dd39c185bb6935515c4f6efe Mon Sep 17 00:00:00 2001 From: Florian Strohmaier Date: Thu, 6 Dec 2018 11:31:41 +0100 Subject: [PATCH 06/59] CSS: Fade collapsed containers --- public/css/icinga/main.less | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/public/css/icinga/main.less b/public/css/icinga/main.less index d5a70b1d2..4f3721149 100644 --- a/public/css/icinga/main.less +++ b/public/css/icinga/main.less @@ -306,3 +306,20 @@ a:hover > .icon-cancel { -moz-box-shadow: 0 0 1/3em rgba(0,0,0,.3); box-shadow: 0 0 1/3em rgba(0,0,0,.3); } + +.collapsible { + position: relative; +} + +.collapsed .collapsible:before, +:not(.has-collapsible).collapsed:before { + content: ""; + display: block; + height: 2em; + background: linear-gradient(rgba(255,255,255,0), white); + position: absolute; + bottom: 0; + left: 0; + right: 0; + z-index: 1; +} From d3e4fb65527205647cfa0597e498afb1b9353137 Mon Sep 17 00:00:00 2001 From: Florian Strohmaier Date: Thu, 6 Dec 2018 13:53:52 +0100 Subject: [PATCH 07/59] JS: Add code documentation --- .../icinga/behavior/collapsibleContainer.js | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/public/js/icinga/behavior/collapsibleContainer.js b/public/js/icinga/behavior/collapsibleContainer.js index 24fd1164b..8fd513551 100644 --- a/public/js/icinga/behavior/collapsibleContainer.js +++ b/public/js/icinga/behavior/collapsibleContainer.js @@ -1,4 +1,4 @@ -/*! Icinga Web 2 | (c) 2016 Icinga Development Team | GPLv2+ */ +/*! Icinga Web 2 | (c) 2018 Icinga Development Team | GPLv2+ */ ;(function(Icinga, $) { @@ -9,6 +9,13 @@ var defaultNumOfRows = 2; var defaultHeight = 36; + /** + * Behavior for collapsible containers. Creates collapsible containers from `

` + * or
` + * + * @param icinga Icinga The current Icinga Object + */ + function CollapsibleContainer(icinga) { Icinga.EventListener.call(this, icinga); @@ -18,6 +25,11 @@ CollapsibleContainer.prototype = new Icinga.EventListener(); + /** + * Initializes all collapsible-container elements. Triggered on rendering of a container. + * + * @param event Event The `onRender` event triggered by the rendered container + */ CollapsibleContainer.prototype.onRendered = function(event) { $(event.target).find('.collapsible-container').each(function() { var $this = $(this); @@ -56,6 +68,11 @@ }); }; + /** + * Event handler for clocking collapsible control. Toggles the collapsed state of the respective container. + * + * @param event Event The `onClick` event triggered by the clicked collapsible-control element + */ CollapsibleContainer.prototype.onControlClicked = function(event) { var $target = $(event.target); var $c = $target.closest('.collapsible-container, .collapsible-table-container'); @@ -72,7 +89,13 @@ updateCollapsedState($c); }; - function updateCollapsedState($container, listener) { + /** + * Renders the collapse state of the given container. Adds or removes class `collapsible` to containers and sets the + * height. + * + * @param $container jQuery The given collapsible container element + */ + function updateCollapsedState($container) { var $collapsible; if ($container.hasClass('has-collapsible')) { $collapsible = $container.find('.collapsible'); From e375822ef1d0adb4ed963efe89d413c989228ee2 Mon Sep 17 00:00:00 2001 From: Florian Strohmaier Date: Thu, 6 Dec 2018 15:03:55 +0100 Subject: [PATCH 08/59] CSS: Add hover effect for collapsible control --- public/css/icinga/main.less | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/public/css/icinga/main.less b/public/css/icinga/main.less index 4f3721149..8b8695836 100644 --- a/public/css/icinga/main.less +++ b/public/css/icinga/main.less @@ -323,3 +323,12 @@ a:hover > .icon-cancel { right: 0; z-index: 1; } + +.collapsible-control:hover:before { + content: ""; + display: block; + position: absolute; + top: -2px; right: -2px; bottom: -2px; left: -2px; + background: fade(@text-color, 10); + .rounded-corners(50%); +} From b73a608742584870eeed8218431268c523a142c3 Mon Sep 17 00:00:00 2001 From: Florian Strohmaier Date: Mon, 7 Jan 2019 16:07:52 +0100 Subject: [PATCH 09/59] JS: Check collapsible containers for unique collapsible-id --- .../icinga/behavior/collapsibleContainer.js | 50 +++++++++++-------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/public/js/icinga/behavior/collapsibleContainer.js b/public/js/icinga/behavior/collapsibleContainer.js index 8fd513551..730ef9d0b 100644 --- a/public/js/icinga/behavior/collapsibleContainer.js +++ b/public/js/icinga/behavior/collapsibleContainer.js @@ -34,16 +34,18 @@ $(event.target).find('.collapsible-container').each(function() { var $this = $(this); - if ($this.find('.collapsible').length > 0) { - $this.addClass('has-collapsible'); - if ($this.find('.collapsible').innerHeight() > ($this.data('height') || defaultHeight)) { - $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); - $this.addClass('can-collapse'); - } - } else { - if ($this.innerHeight() > ($this.data('height') || defaultHeight)) { - $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); - $this.addClass('can-collapse'); + if ($this.data('collapsible-id') && $('[data-collapsible-id=' + $this.data('collapsible-id') + ']').length < 2) { + if ($this.find('.collapsible').length > 0) { + $this.addClass('has-collapsible'); + if ($this.find('.collapsible').innerHeight() > ($this.data('height') || defaultHeight)) { + $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); + $this.addClass('can-collapse'); + } + } else { + if ($this.innerHeight() > ($this.data('height') || defaultHeight)) { + $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); + $this.addClass('can-collapse'); + } } } updateCollapsedState($this); @@ -52,16 +54,18 @@ $(event.target).find('.collapsible-table-container').each(function() { var $this = $(this); - if ($this.find('.collapsible').length > 0) { - $this.addClass('has-collapsible'); - if ($this.find('tr').length > ($this.attr('data-numofrows') || defaultNumOfRows)) { - $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); - $this.addClass('can-collapse'); - } + if ($this.data('collapsible-id') && $('[data-collapsible-id=' + $this.data('collapsible-id') + ']').length < 2) { + if ($this.find('.collapsible').length > 0) { + $this.addClass('has-collapsible'); + if ($this.find('tr').length > ($this.attr('data-numofrows') || defaultNumOfRows)) { + $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); + $this.addClass('can-collapse'); + } - if ($this.find('li').length > ($this.attr('data-numofrows') || defaultNumOfRows)) { - $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); - $this.addClass('can-collapse'); + if ($this.find('li').length > ($this.attr('data-numofrows') || defaultNumOfRows)) { + $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); + $this.addClass('can-collapse'); + } } } updateCollapsedState($this); @@ -81,11 +85,13 @@ if (expandedContainers.length > maxLength - 1) { expandedContainers.shift(); } - expandedContainers.push($c.attr('id')); + expandedContainers.push($c.data('collapsible-id')); } else { - expandedContainers.splice(expandedContainers.indexOf($c.attr('id')), 1); + expandedContainers.splice(expandedContainers.indexOf($c.data('collapsible-id')), 1); } + console.log(expandedContainers); + updateCollapsedState($c); }; @@ -102,7 +108,7 @@ } else { $collapsible = $container; } - if (expandedContainers.indexOf($container.attr('id')) > -1) { + if (expandedContainers.indexOf($container.data('collapsible-id')) > -1) { $container.removeClass('collapsed'); $collapsible.css({ maxHeight: 'none' }); } else { From 66084d6d94fe151496c70327232b6c847a56728f Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Thu, 6 Jun 2019 09:51:02 +0200 Subject: [PATCH 10/59] collapsibleContainer.js: Adjust id handling Id's are unique. Making this assumption is fine since anyone not abiding by this isn't my problem. --- .../icinga/behavior/collapsibleContainer.js | 66 +++++++++---------- 1 file changed, 30 insertions(+), 36 deletions(-) diff --git a/public/js/icinga/behavior/collapsibleContainer.js b/public/js/icinga/behavior/collapsibleContainer.js index 730ef9d0b..2f8df651a 100644 --- a/public/js/icinga/behavior/collapsibleContainer.js +++ b/public/js/icinga/behavior/collapsibleContainer.js @@ -4,8 +4,7 @@ 'use strict'; - var expandedContainers = []; - var maxLength = 32; + var expandedContainers = {}; var defaultNumOfRows = 2; var defaultHeight = 36; @@ -31,41 +30,37 @@ * @param event Event The `onRender` event triggered by the rendered container */ CollapsibleContainer.prototype.onRendered = function(event) { - $(event.target).find('.collapsible-container').each(function() { + $(event.target).find('.collapsible-container[data-collapsible-id]').each(function() { var $this = $(this); - if ($this.data('collapsible-id') && $('[data-collapsible-id=' + $this.data('collapsible-id') + ']').length < 2) { - if ($this.find('.collapsible').length > 0) { - $this.addClass('has-collapsible'); - if ($this.find('.collapsible').innerHeight() > ($this.data('height') || defaultHeight)) { - $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); - $this.addClass('can-collapse'); - } - } else { - if ($this.innerHeight() > ($this.data('height') || defaultHeight)) { - $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); - $this.addClass('can-collapse'); - } + if ($this.find('.collapsible').length > 0) { + $this.addClass('has-collapsible'); + if ($this.find('.collapsible').innerHeight() > ($this.data('height') || defaultHeight)) { + $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); + $this.addClass('can-collapse'); + } + } else { + if ($this.innerHeight() > ($this.data('height') || defaultHeight)) { + $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); + $this.addClass('can-collapse'); } } updateCollapsedState($this); }); - $(event.target).find('.collapsible-table-container').each(function() { + $(event.target).find('.collapsible-table-container[data-collapsible-id]').each(function() { var $this = $(this); - if ($this.data('collapsible-id') && $('[data-collapsible-id=' + $this.data('collapsible-id') + ']').length < 2) { - if ($this.find('.collapsible').length > 0) { - $this.addClass('has-collapsible'); - if ($this.find('tr').length > ($this.attr('data-numofrows') || defaultNumOfRows)) { - $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); - $this.addClass('can-collapse'); - } + if ($this.find('.collapsible').length > 0) { + $this.addClass('has-collapsible'); + if ($this.find('tr').length > ($this.attr('data-numofrows') || defaultNumOfRows)) { + $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); + $this.addClass('can-collapse'); + } - if ($this.find('li').length > ($this.attr('data-numofrows') || defaultNumOfRows)) { - $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); - $this.addClass('can-collapse'); - } + if ($this.find('li').length > ($this.attr('data-numofrows') || defaultNumOfRows)) { + $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); + $this.addClass('can-collapse'); } } updateCollapsedState($this); @@ -81,14 +76,7 @@ var $target = $(event.target); var $c = $target.closest('.collapsible-container, .collapsible-table-container'); - if ($c.hasClass('collapsed')) { - if (expandedContainers.length > maxLength - 1) { - expandedContainers.shift(); - } - expandedContainers.push($c.data('collapsible-id')); - } else { - expandedContainers.splice(expandedContainers.indexOf($c.data('collapsible-id')), 1); - } + expandedContainers[$c.data('collapsibleId')] = $c.is('.collapsed'); console.log(expandedContainers); @@ -108,7 +96,13 @@ } else { $collapsible = $container; } - if (expandedContainers.indexOf($container.data('collapsible-id')) > -1) { + + var collapsibleId = $container.data('collapsibleId'); + if (typeof expandedContainers[collapsibleId] === 'undefined') { + expandedContainers[collapsibleId] = false; + } + + if (expandedContainers[collapsibleId]) { $container.removeClass('collapsed'); $collapsible.css({ maxHeight: 'none' }); } else { From e6e43d07bf100d7934e1fe54b8ba9066e5a25bb0 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Thu, 6 Jun 2019 10:13:34 +0200 Subject: [PATCH 11/59] collapsibleContainer.js: Cleanup and streamline behavior implementation --- .../icinga/behavior/collapsibleContainer.js | 50 ++++++++++--------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/public/js/icinga/behavior/collapsibleContainer.js b/public/js/icinga/behavior/collapsibleContainer.js index 2f8df651a..1eb344061 100644 --- a/public/js/icinga/behavior/collapsibleContainer.js +++ b/public/js/icinga/behavior/collapsibleContainer.js @@ -4,9 +4,7 @@ 'use strict'; - var expandedContainers = {}; - var defaultNumOfRows = 2; - var defaultHeight = 36; + Icinga.Behaviors = Icinga.Behaviors || {}; /** * Behavior for collapsible containers. Creates collapsible containers from `
` @@ -14,14 +12,17 @@ * * @param icinga Icinga The current Icinga Object */ - - function CollapsibleContainer(icinga) { + var CollapsibleContainer = function (icinga) { Icinga.EventListener.call(this, icinga); this.on('rendered', '#col2', this.onRendered, this); this.on('click', '.collapsible-container .collapsible-control, .collapsible-table-container .collapsible-control', this.onControlClicked, this); - } + this.icinga = icinga; + this.expandedContainers = {}; + this.defaultNumOfRows = 2; + this.defaultHeight = 36; + }; CollapsibleContainer.prototype = new Icinga.EventListener(); /** @@ -30,22 +31,24 @@ * @param event Event The `onRender` event triggered by the rendered container */ CollapsibleContainer.prototype.onRendered = function(event) { + var _this = event.data.self; + $(event.target).find('.collapsible-container[data-collapsible-id]').each(function() { var $this = $(this); if ($this.find('.collapsible').length > 0) { $this.addClass('has-collapsible'); - if ($this.find('.collapsible').innerHeight() > ($this.data('height') || defaultHeight)) { + if ($this.find('.collapsible').innerHeight() > ($this.data('height') || _this.defaultHeight)) { $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); $this.addClass('can-collapse'); } } else { - if ($this.innerHeight() > ($this.data('height') || defaultHeight)) { + if ($this.innerHeight() > ($this.data('height') || _this.defaultHeight)) { $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); $this.addClass('can-collapse'); } } - updateCollapsedState($this); + _this.updateCollapsedState($this); }); $(event.target).find('.collapsible-table-container[data-collapsible-id]').each(function() { @@ -53,17 +56,17 @@ if ($this.find('.collapsible').length > 0) { $this.addClass('has-collapsible'); - if ($this.find('tr').length > ($this.attr('data-numofrows') || defaultNumOfRows)) { + if ($this.find('tr').length > ($this.attr('data-numofrows') || _this.defaultNumOfRows)) { $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); $this.addClass('can-collapse'); } - if ($this.find('li').length > ($this.attr('data-numofrows') || defaultNumOfRows)) { + if ($this.find('li').length > ($this.attr('data-numofrows') || _this.defaultNumOfRows)) { $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); $this.addClass('can-collapse'); } } - updateCollapsedState($this); + _this.updateCollapsedState($this); }); }; @@ -73,14 +76,15 @@ * @param event Event The `onClick` event triggered by the clicked collapsible-control element */ CollapsibleContainer.prototype.onControlClicked = function(event) { + var _this = event.data.self; var $target = $(event.target); var $c = $target.closest('.collapsible-container, .collapsible-table-container'); - expandedContainers[$c.data('collapsibleId')] = $c.is('.collapsed'); + _this.expandedContainers[$c.attr('id')] = $c.is('.collapsed'); - console.log(expandedContainers); + console.log(_this.expandedContainers); - updateCollapsedState($c); + _this.updateCollapsedState($c); }; /** @@ -89,7 +93,7 @@ * * @param $container jQuery The given collapsible container element */ - function updateCollapsedState($container) { + CollapsibleContainer.prototype.updateCollapsedState = function($container) { var $collapsible; if ($container.hasClass('has-collapsible')) { $collapsible = $container.find('.collapsible'); @@ -98,27 +102,25 @@ } var collapsibleId = $container.data('collapsibleId'); - if (typeof expandedContainers[collapsibleId] === 'undefined') { - expandedContainers[collapsibleId] = false; + if (typeof this.expandedContainers[collapsibleId] === 'undefined') { + this.expandedContainers[collapsibleId] = false; } - if (expandedContainers[collapsibleId]) { + if (this.expandedContainers[collapsibleId]) { $container.removeClass('collapsed'); $collapsible.css({ maxHeight: 'none' }); } else { if ($container.hasClass('can-collapse')) { $container.addClass('collapsed'); if ($container.hasClass('collapsible-container')) { - $collapsible.css({maxHeight: $container.data('height') || defaultHeight}); + $collapsible.css({maxHeight: $container.data('height') || this.defaultHeight}); } if ($container.hasClass('collapsible-table-container')) { - $collapsible.css({maxHeight: ($container.data('numofrows') || defaultNumOfRows) * $container.find('tr').height()}); + $collapsible.css({maxHeight: ($container.data('numofrows') || this.defaultNumOfRows) * $container.find('tr').height()}); } } } - } - - Icinga.Behaviors = Icinga.Behaviors || {}; + }; Icinga.Behaviors.collapsibleContainer = CollapsibleContainer; From ffe638ee365d9d935415264ca8a3a5c095dd707e Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Thu, 6 Jun 2019 10:16:00 +0200 Subject: [PATCH 12/59] collapsibleContainer.js: Don't expect a data attribute for a container's id --- .../js/icinga/behavior/collapsibleContainer.js | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/public/js/icinga/behavior/collapsibleContainer.js b/public/js/icinga/behavior/collapsibleContainer.js index 1eb344061..74f1f7f15 100644 --- a/public/js/icinga/behavior/collapsibleContainer.js +++ b/public/js/icinga/behavior/collapsibleContainer.js @@ -33,9 +33,14 @@ CollapsibleContainer.prototype.onRendered = function(event) { var _this = event.data.self; - $(event.target).find('.collapsible-container[data-collapsible-id]').each(function() { + $(event.target).find('.collapsible-container').each(function() { var $this = $(this); + if (typeof $this.attr('id') === 'undefined') { + _this.icinga.logger.warn('[collapsible] Container has no id: ', this); + return; + } + if ($this.find('.collapsible').length > 0) { $this.addClass('has-collapsible'); if ($this.find('.collapsible').innerHeight() > ($this.data('height') || _this.defaultHeight)) { @@ -51,9 +56,14 @@ _this.updateCollapsedState($this); }); - $(event.target).find('.collapsible-table-container[data-collapsible-id]').each(function() { + $(event.target).find('.collapsible-table-container').each(function() { var $this = $(this); + if (typeof $this.attr('id') === 'undefined') { + _this.icinga.logger.warn('[collapsible] Container has no id: ', this); + return; + } + if ($this.find('.collapsible').length > 0) { $this.addClass('has-collapsible'); if ($this.find('tr').length > ($this.attr('data-numofrows') || _this.defaultNumOfRows)) { @@ -101,7 +111,7 @@ $collapsible = $container; } - var collapsibleId = $container.data('collapsibleId'); + var collapsibleId = $container.attr('id'); if (typeof this.expandedContainers[collapsibleId] === 'undefined') { this.expandedContainers[collapsibleId] = false; } From 618ca25aec91a4ab0c20db19f33156bfcf1f8991 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Thu, 6 Jun 2019 11:58:51 +0200 Subject: [PATCH 13/59] collapsibleContainer.js: Simplify implementation and make it more flexible Handling is ok though the styles are outdated now and not working --- .../icinga/behavior/collapsibleContainer.js | 135 ++++++++---------- 1 file changed, 59 insertions(+), 76 deletions(-) diff --git a/public/js/icinga/behavior/collapsibleContainer.js b/public/js/icinga/behavior/collapsibleContainer.js index 74f1f7f15..31bf4b70a 100644 --- a/public/js/icinga/behavior/collapsibleContainer.js +++ b/public/js/icinga/behavior/collapsibleContainer.js @@ -7,8 +7,7 @@ Icinga.Behaviors = Icinga.Behaviors || {}; /** - * Behavior for collapsible containers. Creates collapsible containers from `
` - * or
` + * Behavior for collapsible containers. Creates collapsibles from `
` * * @param icinga Icinga The current Icinga Object */ @@ -16,7 +15,7 @@ Icinga.EventListener.call(this, icinga); this.on('rendered', '#col2', this.onRendered, this); - this.on('click', '.collapsible-container .collapsible-control, .collapsible-table-container .collapsible-control', this.onControlClicked, this); + this.on('click', '.collapsible + .collapsible-control', this.onControlClicked, this); this.icinga = icinga; this.expandedContainers = {}; @@ -26,112 +25,96 @@ CollapsibleContainer.prototype = new Icinga.EventListener(); /** - * Initializes all collapsible-container elements. Triggered on rendering of a container. + * Initializes all collapsibles. Triggered on rendering of a container. * * @param event Event The `onRender` event triggered by the rendered container */ CollapsibleContainer.prototype.onRendered = function(event) { var _this = event.data.self; - $(event.target).find('.collapsible-container').each(function() { - var $this = $(this); + $('.collapsible', event.currentTarget).each(function() { + var $collapsible = $(this); - if (typeof $this.attr('id') === 'undefined') { - _this.icinga.logger.warn('[collapsible] Container has no id: ', this); - return; + if (_this.canCollapse($collapsible)) { + $collapsible.after($('#collapsible-control-ghost').clone().removeAttr('id')); + $collapsible.addClass('can-collapse'); + _this.updateCollapsedState($collapsible); } - - if ($this.find('.collapsible').length > 0) { - $this.addClass('has-collapsible'); - if ($this.find('.collapsible').innerHeight() > ($this.data('height') || _this.defaultHeight)) { - $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); - $this.addClass('can-collapse'); - } - } else { - if ($this.innerHeight() > ($this.data('height') || _this.defaultHeight)) { - $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); - $this.addClass('can-collapse'); - } - } - _this.updateCollapsedState($this); - }); - - $(event.target).find('.collapsible-table-container').each(function() { - var $this = $(this); - - if (typeof $this.attr('id') === 'undefined') { - _this.icinga.logger.warn('[collapsible] Container has no id: ', this); - return; - } - - if ($this.find('.collapsible').length > 0) { - $this.addClass('has-collapsible'); - if ($this.find('tr').length > ($this.attr('data-numofrows') || _this.defaultNumOfRows)) { - $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); - $this.addClass('can-collapse'); - } - - if ($this.find('li').length > ($this.attr('data-numofrows') || _this.defaultNumOfRows)) { - $this.append($('#collapsible-control-ghost').clone().removeAttr('id')); - $this.addClass('can-collapse'); - } - } - _this.updateCollapsedState($this); }); }; /** - * Event handler for clocking collapsible control. Toggles the collapsed state of the respective container. + * Event handler for toggling collapsibles. Switches the collapsed state of the respective container. * * @param event Event The `onClick` event triggered by the clicked collapsible-control element */ CollapsibleContainer.prototype.onControlClicked = function(event) { var _this = event.data.self; - var $target = $(event.target); - var $c = $target.closest('.collapsible-container, .collapsible-table-container'); + var $target = $(event.currentTarget); + var $collapsible = $target.prev('.collapsible'); - _this.expandedContainers[$c.attr('id')] = $c.is('.collapsed'); - - console.log(_this.expandedContainers); - - _this.updateCollapsedState($c); + if (! $collapsible.length) { + _this.icinga.logger.error('[Collapsible] Collapsible control has no associated .collapsible: ', $target); + } else { + _this.updateCollapsedState($collapsible); + } }; /** * Renders the collapse state of the given container. Adds or removes class `collapsible` to containers and sets the * height. * - * @param $container jQuery The given collapsible container element + * @param $collapsible jQuery The given collapsible container element */ - CollapsibleContainer.prototype.updateCollapsedState = function($container) { - var $collapsible; - if ($container.hasClass('has-collapsible')) { - $collapsible = $container.find('.collapsible'); - } else { - $collapsible = $container; + CollapsibleContainer.prototype.updateCollapsedState = function($collapsible) { + var collapsiblePath = this.icinga.utils.getCSSPath($collapsible); + if (typeof this.expandedContainers[collapsiblePath] === 'undefined') { + this.expandedContainers[collapsiblePath] = $collapsible.is('.collapsed'); } - var collapsibleId = $container.attr('id'); - if (typeof this.expandedContainers[collapsibleId] === 'undefined') { - this.expandedContainers[collapsibleId] = false; - } - - if (this.expandedContainers[collapsibleId]) { - $container.removeClass('collapsed'); + if (this.expandedContainers[collapsiblePath]) { + this.expandedContainers[collapsiblePath] = false; + $collapsible.removeClass('collapsed'); $collapsible.css({ maxHeight: 'none' }); } else { - if ($container.hasClass('can-collapse')) { - $container.addClass('collapsed'); - if ($container.hasClass('collapsible-container')) { - $collapsible.css({maxHeight: $container.data('height') || this.defaultHeight}); - } - if ($container.hasClass('collapsible-table-container')) { - $collapsible.css({maxHeight: ($container.data('numofrows') || this.defaultNumOfRows) * $container.find('tr').height()}); - } + this.expandedContainers[collapsiblePath] = true; + $collapsible.addClass('collapsed'); + + var rowSelector = this.getRowSelector($collapsible); + if (!! rowSelector) { + var $rows = $(rowSelector, $collapsible).slice(0, $collapsible.data('numofrows') || this.defaultNumOfRows); + + var totalHeight = 0; + $rows.outerHeight(function (_, height) { + totalHeight += height; + }); + + $collapsible.css({maxHeight: totalHeight}); + } else { + $collapsible.css({maxHeight: $collapsible.data('height') || this.defaultHeight}); } } }; + CollapsibleContainer.prototype.getRowSelector = function ($collapsible) { + if ($collapsible.is('table')) { + return '> tbody > th, > tbody > tr'; + } else if ($collapsible.is('ul, ol')) { + return '> li'; + } + + return ''; + }; + + CollapsibleContainer.prototype.canCollapse = function ($collapsible) { + var rowSelector = this.getRowSelector($collapsible); + if (!! rowSelector) { + return $(rowSelector, $collapsible).length > ($collapsible.data('numofrows') || this.defaultNumOfRows); + } else { + return $collapsible.innerHeight() > ($collapsible.data('height') || this.defaultHeight); + } + }; + Icinga.Behaviors.collapsibleContainer = CollapsibleContainer; })(Icinga, jQuery); From fb83bee92432547db0a9cf5dee3a7654093cd6a6 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Thu, 6 Jun 2019 13:58:06 +0200 Subject: [PATCH 14/59] css: Make collapsible styles work with the new markup --- application/layouts/scripts/layout.phtml | 10 +- public/css/icinga/main.less | 143 +++++++++-------------- 2 files changed, 63 insertions(+), 90 deletions(-) diff --git a/application/layouts/scripts/layout.phtml b/application/layouts/scripts/layout.phtml index 2fbf412cc..880aed521 100644 --- a/application/layouts/scripts/layout.phtml +++ b/application/layouts/scripts/layout.phtml @@ -76,10 +76,12 @@ $innerLayoutScript = $this->layout()->innerLayout . '.phtml'; } }()); - +
+ +
diff --git a/public/css/icinga/main.less b/public/css/icinga/main.less index 8b8695836..4cd7087c5 100644 --- a/public/css/icinga/main.less +++ b/public/css/icinga/main.less @@ -228,107 +228,78 @@ a:hover > .icon-cancel { } // Collapsible Control -.collapsible-table-container { - &.collapsed.has-collapsible .collapsible { - overflow: hidden; - max-height: 8em; - } -} - -.collapsible-container, -.collapsible-table-container { - &.collapsed:not(.has-collapsible), - &.collapsed.has-collapsible .collapsible { - overflow: hidden; - max-height: 96px; - } - - &.collapsed:not(.has-collapsible) { - .collapsible-control { - bottom: 4px; - } - } -} - -.collapsible-container, -.collapsible-table-container { - position: relative; - - .table-wrapper { - overflow: hidden; - } - - .collapsed .table-wrapper { - overflow: hidden; - max-height: 12em; - } -} - -.collapsible-control > i:before { - margin-right: 0; -} - #collapsible-control-ghost { display: none; } -.collapsible-control > .icon-angle-double-down { - display: none; +.collapsible-control { + position: relative; + + button { + .rounded-corners(50%); + + background: @gray-lighter; + color: @gray; + width: 2em; + height: 2em; + z-index: 1; + position: absolute; + border: none; + bottom: -1em; + right: .25em; + -webkit-box-shadow: 0 0 1/3em rgba(0,0,0,.3); + -moz-box-shadow: 0 0 1/3em rgba(0,0,0,.3); + box-shadow: 0 0 1/3em rgba(0,0,0,.3); + + &:hover:before { + content: ""; + display: block; + position: absolute; + top: -2px; + right: -2px; + bottom: -2px; + left: -2px; + background: fade(@text-color, 10); + .rounded-corners(50%); + } + } } -.collapsible-control > .icon-angle-double-up { - display: block; -} - -.collapsed { - .collapsible-control > .icon-angle-double-up { +.collapsible.can-collapse:not(.collapsed) + .collapsible-control button { + > i.expand-icon { display: none; } - .collapsible-control > .icon-angle-double-down { - display: block; + > i.collapse-icon { + display: unset; } } -.collapsible-control { - .rounded-corners(50%); +.collapsible.collapsed + .collapsible-control button { + > i.expand-icon { + display: unset; + } - background: @gray-lighter; - color: @gray; - width: 2em; - height: 2em; - z-index: 1; - position: absolute; - border: none; - bottom: -1em; - right: .25em; - -webkit-box-shadow: 0 0 1/3em rgba(0,0,0,.3); - -moz-box-shadow: 0 0 1/3em rgba(0,0,0,.3); - box-shadow: 0 0 1/3em rgba(0,0,0,.3); + > i.collapse-icon { + display: none; + } } -.collapsible { +// Collapsibles + +.collapsible.collapsed { position: relative; -} + overflow: hidden; -.collapsed .collapsible:before, -:not(.has-collapsible).collapsed:before { - content: ""; - display: block; - height: 2em; - background: linear-gradient(rgba(255,255,255,0), white); - position: absolute; - bottom: 0; - left: 0; - right: 0; - z-index: 1; -} - -.collapsible-control:hover:before { - content: ""; - display: block; - position: absolute; - top: -2px; right: -2px; bottom: -2px; left: -2px; - background: fade(@text-color, 10); - .rounded-corners(50%); + &:before { + content: ""; + display: block; + height: 2em; + background: linear-gradient(rgba(255,255,255,0), white); + position: absolute; + bottom: 0; + left: 0; + right: 0; + z-index: 1; + } } From 1032a944b4de1d916d921440d41e1f0432b6e07c Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Thu, 6 Jun 2019 14:16:50 +0200 Subject: [PATCH 15/59] collapsibleContainer.js: Properly set an collapsible's height --- public/js/icinga/behavior/collapsibleContainer.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/public/js/icinga/behavior/collapsibleContainer.js b/public/js/icinga/behavior/collapsibleContainer.js index 31bf4b70a..1df625c22 100644 --- a/public/js/icinga/behavior/collapsibleContainer.js +++ b/public/js/icinga/behavior/collapsibleContainer.js @@ -75,7 +75,7 @@ if (this.expandedContainers[collapsiblePath]) { this.expandedContainers[collapsiblePath] = false; $collapsible.removeClass('collapsed'); - $collapsible.css({ maxHeight: 'none' }); + $collapsible.css({display: '', height: ''}); } else { this.expandedContainers[collapsiblePath] = true; $collapsible.addClass('collapsed'); @@ -84,14 +84,14 @@ if (!! rowSelector) { var $rows = $(rowSelector, $collapsible).slice(0, $collapsible.data('numofrows') || this.defaultNumOfRows); - var totalHeight = 0; + var totalHeight = $rows.offset().top - $collapsible.offset().top; $rows.outerHeight(function (_, height) { totalHeight += height; }); - $collapsible.css({maxHeight: totalHeight}); + $collapsible.css({display: 'block', height: totalHeight}); } else { - $collapsible.css({maxHeight: $collapsible.data('height') || this.defaultHeight}); + $collapsible.css({display: 'block', height: $collapsible.data('height') || this.defaultHeight}); } } }; From d6f7582df672f149d1ba78544239c9cb8edeb182 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Thu, 6 Jun 2019 14:39:40 +0200 Subject: [PATCH 16/59] collapsibleContainer.js: Update documentation --- .../icinga/behavior/collapsibleContainer.js | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/public/js/icinga/behavior/collapsibleContainer.js b/public/js/icinga/behavior/collapsibleContainer.js index 1df625c22..f76a55c49 100644 --- a/public/js/icinga/behavior/collapsibleContainer.js +++ b/public/js/icinga/behavior/collapsibleContainer.js @@ -1,4 +1,4 @@ -/*! Icinga Web 2 | (c) 2018 Icinga Development Team | GPLv2+ */ +/*! Icinga Web 2 | (c) 2019 Icinga GmbH | GPLv2+ */ ;(function(Icinga, $) { @@ -7,7 +7,7 @@ Icinga.Behaviors = Icinga.Behaviors || {}; /** - * Behavior for collapsible containers. Creates collapsibles from `
` + * Behavior for collapsible containers. * * @param icinga Icinga The current Icinga Object */ @@ -61,7 +61,7 @@ }; /** - * Renders the collapse state of the given container. Adds or removes class `collapsible` to containers and sets the + * Applies the collapse state of the given container. Adds or removes class `collapsed` to containers and sets the * height. * * @param $collapsible jQuery The given collapsible container element @@ -96,6 +96,13 @@ } }; + /** + * Return an appropriate row element selector + * + * @param $collapsible jQuery The given collapsible container element + * + * @returns {string} + */ CollapsibleContainer.prototype.getRowSelector = function ($collapsible) { if ($collapsible.is('table')) { return '> tbody > th, > tbody > tr'; @@ -106,6 +113,13 @@ return ''; }; + /** + * Check whether the given collapsible needs to collapse + * + * @param $collapsible jQuery The given collapsible container element + * + * @returns {boolean} + */ CollapsibleContainer.prototype.canCollapse = function ($collapsible) { var rowSelector = this.getRowSelector($collapsible); if (!! rowSelector) { From 0574f44bd959f413a34fac361d038a5fd419cd03 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Thu, 6 Jun 2019 14:40:48 +0200 Subject: [PATCH 17/59] colllapsibleContainer.js: Rename to collapsible.js --- library/Icinga/Web/JavaScript.php | 2 +- .../{collapsibleContainer.js => collapsible.js} | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) rename public/js/icinga/behavior/{collapsibleContainer.js => collapsible.js} (88%) diff --git a/library/Icinga/Web/JavaScript.php b/library/Icinga/Web/JavaScript.php index cb80ff647..f906dbb05 100644 --- a/library/Icinga/Web/JavaScript.php +++ b/library/Icinga/Web/JavaScript.php @@ -24,7 +24,7 @@ class JavaScript 'js/icinga/timezone.js', 'js/icinga/behavior/application-state.js', 'js/icinga/behavior/autofocus.js', - 'js/icinga/behavior/collapsibleContainer.js', + 'js/icinga/behavior/collapsible.js', 'js/icinga/behavior/detach.js', 'js/icinga/behavior/tooltip.js', 'js/icinga/behavior/sparkline.js', diff --git a/public/js/icinga/behavior/collapsibleContainer.js b/public/js/icinga/behavior/collapsible.js similarity index 88% rename from public/js/icinga/behavior/collapsibleContainer.js rename to public/js/icinga/behavior/collapsible.js index f76a55c49..243b3684b 100644 --- a/public/js/icinga/behavior/collapsibleContainer.js +++ b/public/js/icinga/behavior/collapsible.js @@ -11,7 +11,7 @@ * * @param icinga Icinga The current Icinga Object */ - var CollapsibleContainer = function (icinga) { + var Collapsible = function (icinga) { Icinga.EventListener.call(this, icinga); this.on('rendered', '#col2', this.onRendered, this); @@ -22,14 +22,14 @@ this.defaultNumOfRows = 2; this.defaultHeight = 36; }; - CollapsibleContainer.prototype = new Icinga.EventListener(); + Collapsible.prototype = new Icinga.EventListener(); /** * Initializes all collapsibles. Triggered on rendering of a container. * * @param event Event The `onRender` event triggered by the rendered container */ - CollapsibleContainer.prototype.onRendered = function(event) { + Collapsible.prototype.onRendered = function(event) { var _this = event.data.self; $('.collapsible', event.currentTarget).each(function() { @@ -48,7 +48,7 @@ * * @param event Event The `onClick` event triggered by the clicked collapsible-control element */ - CollapsibleContainer.prototype.onControlClicked = function(event) { + Collapsible.prototype.onControlClicked = function(event) { var _this = event.data.self; var $target = $(event.currentTarget); var $collapsible = $target.prev('.collapsible'); @@ -66,7 +66,7 @@ * * @param $collapsible jQuery The given collapsible container element */ - CollapsibleContainer.prototype.updateCollapsedState = function($collapsible) { + Collapsible.prototype.updateCollapsedState = function($collapsible) { var collapsiblePath = this.icinga.utils.getCSSPath($collapsible); if (typeof this.expandedContainers[collapsiblePath] === 'undefined') { this.expandedContainers[collapsiblePath] = $collapsible.is('.collapsed'); @@ -103,7 +103,7 @@ * * @returns {string} */ - CollapsibleContainer.prototype.getRowSelector = function ($collapsible) { + Collapsible.prototype.getRowSelector = function ($collapsible) { if ($collapsible.is('table')) { return '> tbody > th, > tbody > tr'; } else if ($collapsible.is('ul, ol')) { @@ -120,7 +120,7 @@ * * @returns {boolean} */ - CollapsibleContainer.prototype.canCollapse = function ($collapsible) { + Collapsible.prototype.canCollapse = function ($collapsible) { var rowSelector = this.getRowSelector($collapsible); if (!! rowSelector) { return $(rowSelector, $collapsible).length > ($collapsible.data('numofrows') || this.defaultNumOfRows); @@ -129,6 +129,6 @@ } }; - Icinga.Behaviors.collapsibleContainer = CollapsibleContainer; + Icinga.Behaviors.Collapsible = Collapsible; })(Icinga, jQuery); From 0ed030410f038a2fe4928db513bda9da4b7a25fb Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Thu, 6 Jun 2019 14:52:58 +0200 Subject: [PATCH 18/59] collapsible.js: Listen for rendered events on all containers not just #col2 --- public/js/icinga/behavior/collapsible.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/js/icinga/behavior/collapsible.js b/public/js/icinga/behavior/collapsible.js index 243b3684b..4870ee501 100644 --- a/public/js/icinga/behavior/collapsible.js +++ b/public/js/icinga/behavior/collapsible.js @@ -14,7 +14,7 @@ var Collapsible = function (icinga) { Icinga.EventListener.call(this, icinga); - this.on('rendered', '#col2', this.onRendered, this); + this.on('rendered', '.container', this.onRendered, this); this.on('click', '.collapsible + .collapsible-control', this.onControlClicked, this); this.icinga = icinga; From 3122af2838176adafdaa2221112add8387f0f7ee Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Thu, 6 Jun 2019 15:30:56 +0200 Subject: [PATCH 19/59] collapsible.js: Properly track a collapsible's state across navigation --- public/js/icinga/behavior/collapsible.js | 89 ++++++++++++++---------- 1 file changed, 52 insertions(+), 37 deletions(-) diff --git a/public/js/icinga/behavior/collapsible.js b/public/js/icinga/behavior/collapsible.js index 4870ee501..625bfa478 100644 --- a/public/js/icinga/behavior/collapsible.js +++ b/public/js/icinga/behavior/collapsible.js @@ -18,7 +18,7 @@ this.on('click', '.collapsible + .collapsible-control', this.onControlClicked, this); this.icinga = icinga; - this.expandedContainers = {}; + this.collapsibleStates = {}; this.defaultNumOfRows = 2; this.defaultHeight = 36; }; @@ -34,11 +34,22 @@ $('.collapsible', event.currentTarget).each(function() { var $collapsible = $(this); + var collapsiblePath = _this.icinga.utils.getCSSPath($collapsible); + // Assumes that any newly rendered elements are expanded if (_this.canCollapse($collapsible)) { $collapsible.after($('#collapsible-control-ghost').clone().removeAttr('id')); $collapsible.addClass('can-collapse'); - _this.updateCollapsedState($collapsible); + + if (typeof _this.collapsibleStates[collapsiblePath] === 'undefined') { + _this.collapsibleStates[collapsiblePath] = true; + _this.collapse($collapsible); + } else if (_this.collapsibleStates[collapsiblePath]) { + _this.collapse($collapsible); + } + } else { + // This collapsible is not large enough (anymore) + delete _this.collapsibleStates[collapsiblePath]; } }); }; @@ -56,42 +67,13 @@ if (! $collapsible.length) { _this.icinga.logger.error('[Collapsible] Collapsible control has no associated .collapsible: ', $target); } else { - _this.updateCollapsedState($collapsible); - } - }; - - /** - * Applies the collapse state of the given container. Adds or removes class `collapsed` to containers and sets the - * height. - * - * @param $collapsible jQuery The given collapsible container element - */ - Collapsible.prototype.updateCollapsedState = function($collapsible) { - var collapsiblePath = this.icinga.utils.getCSSPath($collapsible); - if (typeof this.expandedContainers[collapsiblePath] === 'undefined') { - this.expandedContainers[collapsiblePath] = $collapsible.is('.collapsed'); - } - - if (this.expandedContainers[collapsiblePath]) { - this.expandedContainers[collapsiblePath] = false; - $collapsible.removeClass('collapsed'); - $collapsible.css({display: '', height: ''}); - } else { - this.expandedContainers[collapsiblePath] = true; - $collapsible.addClass('collapsed'); - - var rowSelector = this.getRowSelector($collapsible); - if (!! rowSelector) { - var $rows = $(rowSelector, $collapsible).slice(0, $collapsible.data('numofrows') || this.defaultNumOfRows); - - var totalHeight = $rows.offset().top - $collapsible.offset().top; - $rows.outerHeight(function (_, height) { - totalHeight += height; - }); - - $collapsible.css({display: 'block', height: totalHeight}); + var collapsiblePath = _this.icinga.utils.getCSSPath($collapsible); + if (_this.collapsibleStates[collapsiblePath]) { + _this.collapsibleStates[collapsiblePath] = false; + _this.expand($collapsible); } else { - $collapsible.css({display: 'block', height: $collapsible.data('height') || this.defaultHeight}); + _this.collapsibleStates[collapsiblePath] = true; + _this.collapse($collapsible); } } }; @@ -129,6 +111,39 @@ } }; + /** + * Collapse the given collapsible + * + * @param $collapsible jQuery The given collapsible container element + */ + Collapsible.prototype.collapse = function ($collapsible) { + $collapsible.addClass('collapsed'); + + var rowSelector = this.getRowSelector($collapsible); + if (!! rowSelector) { + var $rows = $(rowSelector, $collapsible).slice(0, $collapsible.data('numofrows') || this.defaultNumOfRows); + + var totalHeight = $rows.offset().top - $collapsible.offset().top; + $rows.outerHeight(function (_, height) { + totalHeight += height; + }); + + $collapsible.css({display: 'block', height: totalHeight}); + } else { + $collapsible.css({display: 'block', height: $collapsible.data('height') || this.defaultHeight}); + } + }; + + /** + * Expand the given collapsible + * + * @param $collapsible jQuery The given collapsible container element + */ + Collapsible.prototype.expand = function ($collapsible) { + $collapsible.removeClass('collapsed'); + $collapsible.css({display: '', height: ''}); + }; + Icinga.Behaviors.Collapsible = Collapsible; })(Icinga, jQuery); From ba44240b68a5ab125bcb91523f5c7c6ec9f32325 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Thu, 6 Jun 2019 15:53:20 +0200 Subject: [PATCH 20/59] collapsible.js: Store and load states form localStorage --- public/js/icinga/behavior/collapsible.js | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/public/js/icinga/behavior/collapsible.js b/public/js/icinga/behavior/collapsible.js index 625bfa478..7ce5b7791 100644 --- a/public/js/icinga/behavior/collapsible.js +++ b/public/js/icinga/behavior/collapsible.js @@ -18,9 +18,10 @@ this.on('click', '.collapsible + .collapsible-control', this.onControlClicked, this); this.icinga = icinga; - this.collapsibleStates = {}; this.defaultNumOfRows = 2; this.defaultHeight = 36; + + this.collapsibleStates = this.getStateFromStorage(); }; Collapsible.prototype = new Icinga.EventListener(); @@ -144,6 +145,27 @@ $collapsible.css({display: '', height: ''}); }; + /** + * Load the collapsible states from storage + * + * @returns {{}} + */ + Collapsible.prototype.getStateFromStorage = function () { + var state = localStorage.getItem('collapsible.state'); + if (!! state) { + return JSON.parse(state); + } + + return {}; + }; + + /** + * Save the collapsible states to storage + */ + Collapsible.prototype.destroy = function () { + localStorage.setItem('collapsible.state', JSON.stringify(this.collapsibleStates)); + }; + Icinga.Behaviors.Collapsible = Collapsible; })(Icinga, jQuery); From b8bdd743a2311f08d947194450ddc367b3e82409 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Fri, 7 Jun 2019 07:33:28 +0200 Subject: [PATCH 21/59] collapsible.js: Remove useless `> tbody > th` row selector --- public/js/icinga/behavior/collapsible.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/js/icinga/behavior/collapsible.js b/public/js/icinga/behavior/collapsible.js index 7ce5b7791..e415b9baf 100644 --- a/public/js/icinga/behavior/collapsible.js +++ b/public/js/icinga/behavior/collapsible.js @@ -88,7 +88,7 @@ */ Collapsible.prototype.getRowSelector = function ($collapsible) { if ($collapsible.is('table')) { - return '> tbody > th, > tbody > tr'; + return '> tbody > tr'; } else if ($collapsible.is('ul, ol')) { return '> li'; } From 1ae1dc387f1b1d3c7b6aad7281398c0dda84732c Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Fri, 7 Jun 2019 08:11:19 +0200 Subject: [PATCH 22/59] collapsible.js: Rename `numofrows` to `visible-rows` --- public/js/icinga/behavior/collapsible.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/js/icinga/behavior/collapsible.js b/public/js/icinga/behavior/collapsible.js index e415b9baf..210b0b37b 100644 --- a/public/js/icinga/behavior/collapsible.js +++ b/public/js/icinga/behavior/collapsible.js @@ -18,7 +18,7 @@ this.on('click', '.collapsible + .collapsible-control', this.onControlClicked, this); this.icinga = icinga; - this.defaultNumOfRows = 2; + this.defaultVisibleRows = 2; this.defaultHeight = 36; this.collapsibleStates = this.getStateFromStorage(); @@ -106,7 +106,7 @@ Collapsible.prototype.canCollapse = function ($collapsible) { var rowSelector = this.getRowSelector($collapsible); if (!! rowSelector) { - return $(rowSelector, $collapsible).length > ($collapsible.data('numofrows') || this.defaultNumOfRows); + return $(rowSelector, $collapsible).length > ($collapsible.data('visibleRows') || this.defaultVisibleRows); } else { return $collapsible.innerHeight() > ($collapsible.data('height') || this.defaultHeight); } @@ -122,7 +122,7 @@ var rowSelector = this.getRowSelector($collapsible); if (!! rowSelector) { - var $rows = $(rowSelector, $collapsible).slice(0, $collapsible.data('numofrows') || this.defaultNumOfRows); + var $rows = $(rowSelector, $collapsible).slice(0, $collapsible.data('visibleRows') || this.defaultVisibleRows); var totalHeight = $rows.offset().top - $collapsible.offset().top; $rows.outerHeight(function (_, height) { From 6f28a5c3e13479bdc1970bc26b2fd57030b5f661 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Fri, 7 Jun 2019 08:13:36 +0200 Subject: [PATCH 23/59] collapsible.js: Rename `height` to `visible-height` --- public/js/icinga/behavior/collapsible.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/js/icinga/behavior/collapsible.js b/public/js/icinga/behavior/collapsible.js index 210b0b37b..2823c394c 100644 --- a/public/js/icinga/behavior/collapsible.js +++ b/public/js/icinga/behavior/collapsible.js @@ -19,7 +19,7 @@ this.icinga = icinga; this.defaultVisibleRows = 2; - this.defaultHeight = 36; + this.defaultVisibleHeight = 36; this.collapsibleStates = this.getStateFromStorage(); }; @@ -108,7 +108,7 @@ if (!! rowSelector) { return $(rowSelector, $collapsible).length > ($collapsible.data('visibleRows') || this.defaultVisibleRows); } else { - return $collapsible.innerHeight() > ($collapsible.data('height') || this.defaultHeight); + return $collapsible.innerHeight() > ($collapsible.data('visibleHeight') || this.defaultVisibleHeight); } }; @@ -131,7 +131,7 @@ $collapsible.css({display: 'block', height: totalHeight}); } else { - $collapsible.css({display: 'block', height: $collapsible.data('height') || this.defaultHeight}); + $collapsible.css({display: 'block', height: $collapsible.data('visibleHeight') || this.defaultVisibleHeight}); } }; From 1748404efea5d60211cd6b0e8af91ed52e506465 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Fri, 7 Jun 2019 09:17:13 +0200 Subject: [PATCH 24/59] collapsible.js: Enhance how we'll utilize `localStorage` --- public/js/icinga/behavior/collapsible.js | 43 +++++++++++------------- 1 file changed, 19 insertions(+), 24 deletions(-) diff --git a/public/js/icinga/behavior/collapsible.js b/public/js/icinga/behavior/collapsible.js index 2823c394c..ff87a0790 100644 --- a/public/js/icinga/behavior/collapsible.js +++ b/public/js/icinga/behavior/collapsible.js @@ -18,10 +18,11 @@ this.on('click', '.collapsible + .collapsible-control', this.onControlClicked, this); this.icinga = icinga; + this.expanded = new Set(); this.defaultVisibleRows = 2; this.defaultVisibleHeight = 36; - this.collapsibleStates = this.getStateFromStorage(); + this.loadStorage(); }; Collapsible.prototype = new Icinga.EventListener(); @@ -42,15 +43,9 @@ $collapsible.after($('#collapsible-control-ghost').clone().removeAttr('id')); $collapsible.addClass('can-collapse'); - if (typeof _this.collapsibleStates[collapsiblePath] === 'undefined') { - _this.collapsibleStates[collapsiblePath] = true; - _this.collapse($collapsible); - } else if (_this.collapsibleStates[collapsiblePath]) { + if (! _this.expanded.has(collapsiblePath)) { _this.collapse($collapsible); } - } else { - // This collapsible is not large enough (anymore) - delete _this.collapsibleStates[collapsiblePath]; } }); }; @@ -69,12 +64,12 @@ _this.icinga.logger.error('[Collapsible] Collapsible control has no associated .collapsible: ', $target); } else { var collapsiblePath = _this.icinga.utils.getCSSPath($collapsible); - if (_this.collapsibleStates[collapsiblePath]) { - _this.collapsibleStates[collapsiblePath] = false; - _this.expand($collapsible); - } else { - _this.collapsibleStates[collapsiblePath] = true; + if (_this.expanded.has(collapsiblePath)) { + _this.expanded.delete(collapsiblePath); _this.collapse($collapsible); + } else { + _this.expanded.add(collapsiblePath); + _this.expand($collapsible); } } }; @@ -146,24 +141,24 @@ }; /** - * Load the collapsible states from storage - * - * @returns {{}} + * Load state from storage */ - Collapsible.prototype.getStateFromStorage = function () { - var state = localStorage.getItem('collapsible.state'); - if (!! state) { - return JSON.parse(state); + Collapsible.prototype.loadStorage = function () { + var expanded = localStorage.getItem('collapsible.expanded'); + if (!! expanded) { + this.expanded = new Set(JSON.parse(expanded)); } - - return {}; }; /** - * Save the collapsible states to storage + * Save state to storage */ Collapsible.prototype.destroy = function () { - localStorage.setItem('collapsible.state', JSON.stringify(this.collapsibleStates)); + if (this.expanded.size > 0) { + localStorage.setItem('collapsible.expanded', JSON.stringify(Array.from(this.expanded.values()))); + } else { + localStorage.removeItem('collapsible.expanded'); + } }; Icinga.Behaviors.Collapsible = Collapsible; From ec2a6b5c78360d3476930cceb1f8711463d75d24 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Fri, 7 Jun 2019 10:46:32 +0200 Subject: [PATCH 25/59] collapsible.js: Use namespace `behavior` for local storage entries --- public/js/icinga/behavior/collapsible.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/js/icinga/behavior/collapsible.js b/public/js/icinga/behavior/collapsible.js index ff87a0790..70f658320 100644 --- a/public/js/icinga/behavior/collapsible.js +++ b/public/js/icinga/behavior/collapsible.js @@ -144,7 +144,7 @@ * Load state from storage */ Collapsible.prototype.loadStorage = function () { - var expanded = localStorage.getItem('collapsible.expanded'); + var expanded = localStorage.getItem('behavior.collapsible.expanded'); if (!! expanded) { this.expanded = new Set(JSON.parse(expanded)); } @@ -155,9 +155,9 @@ */ Collapsible.prototype.destroy = function () { if (this.expanded.size > 0) { - localStorage.setItem('collapsible.expanded', JSON.stringify(Array.from(this.expanded.values()))); + localStorage.setItem('behavior.collapsible.expanded', JSON.stringify(Array.from(this.expanded.values()))); } else { - localStorage.removeItem('collapsible.expanded'); + localStorage.removeItem('behavior.collapsible.expanded'); } }; From 9a6b1cffd6ab6f128c0882ded2e90d5a6c3c5324 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Fri, 7 Jun 2019 11:05:33 +0200 Subject: [PATCH 26/59] collapsible.js: Don't use Set features which IE11 doesn't support --- public/js/icinga/behavior/collapsible.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/public/js/icinga/behavior/collapsible.js b/public/js/icinga/behavior/collapsible.js index 70f658320..c68797386 100644 --- a/public/js/icinga/behavior/collapsible.js +++ b/public/js/icinga/behavior/collapsible.js @@ -146,7 +146,10 @@ Collapsible.prototype.loadStorage = function () { var expanded = localStorage.getItem('behavior.collapsible.expanded'); if (!! expanded) { - this.expanded = new Set(JSON.parse(expanded)); + // .forEach() is used because IE11 doesn't support constructor arguments + JSON.parse(expanded).forEach(function (value) { + this.expanded.add(value); + }, this); } }; @@ -155,7 +158,13 @@ */ Collapsible.prototype.destroy = function () { if (this.expanded.size > 0) { - localStorage.setItem('behavior.collapsible.expanded', JSON.stringify(Array.from(this.expanded.values()))); + var expanded = []; + // .forEach() is used because IE11 doesn't support .values() + this.expanded.forEach(function(value) { + expanded.push(value); + }); + + localStorage.setItem('behavior.collapsible.expanded', JSON.stringify(expanded)); } else { localStorage.removeItem('behavior.collapsible.expanded'); } From a642117c8a025d1be1cbcba07cc21fa15f194b91 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Tue, 25 Jun 2019 13:46:39 +0200 Subject: [PATCH 27/59] collapsible.js: Remove superflous spaces after the `function` keyword --- public/js/icinga/behavior/collapsible.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/public/js/icinga/behavior/collapsible.js b/public/js/icinga/behavior/collapsible.js index c68797386..68b3ef5a1 100644 --- a/public/js/icinga/behavior/collapsible.js +++ b/public/js/icinga/behavior/collapsible.js @@ -11,7 +11,7 @@ * * @param icinga Icinga The current Icinga Object */ - var Collapsible = function (icinga) { + var Collapsible = function(icinga) { Icinga.EventListener.call(this, icinga); this.on('rendered', '.container', this.onRendered, this); @@ -81,7 +81,7 @@ * * @returns {string} */ - Collapsible.prototype.getRowSelector = function ($collapsible) { + Collapsible.prototype.getRowSelector = function($collapsible) { if ($collapsible.is('table')) { return '> tbody > tr'; } else if ($collapsible.is('ul, ol')) { @@ -98,7 +98,7 @@ * * @returns {boolean} */ - Collapsible.prototype.canCollapse = function ($collapsible) { + Collapsible.prototype.canCollapse = function($collapsible) { var rowSelector = this.getRowSelector($collapsible); if (!! rowSelector) { return $(rowSelector, $collapsible).length > ($collapsible.data('visibleRows') || this.defaultVisibleRows); @@ -112,7 +112,7 @@ * * @param $collapsible jQuery The given collapsible container element */ - Collapsible.prototype.collapse = function ($collapsible) { + Collapsible.prototype.collapse = function($collapsible) { $collapsible.addClass('collapsed'); var rowSelector = this.getRowSelector($collapsible); @@ -120,7 +120,7 @@ var $rows = $(rowSelector, $collapsible).slice(0, $collapsible.data('visibleRows') || this.defaultVisibleRows); var totalHeight = $rows.offset().top - $collapsible.offset().top; - $rows.outerHeight(function (_, height) { + $rows.outerHeight(function(_, height) { totalHeight += height; }); @@ -135,7 +135,7 @@ * * @param $collapsible jQuery The given collapsible container element */ - Collapsible.prototype.expand = function ($collapsible) { + Collapsible.prototype.expand = function($collapsible) { $collapsible.removeClass('collapsed'); $collapsible.css({display: '', height: ''}); }; @@ -143,11 +143,11 @@ /** * Load state from storage */ - Collapsible.prototype.loadStorage = function () { + Collapsible.prototype.loadStorage = function() { var expanded = localStorage.getItem('behavior.collapsible.expanded'); if (!! expanded) { // .forEach() is used because IE11 doesn't support constructor arguments - JSON.parse(expanded).forEach(function (value) { + JSON.parse(expanded).forEach(function(value) { this.expanded.add(value); }, this); } @@ -156,7 +156,7 @@ /** * Save state to storage */ - Collapsible.prototype.destroy = function () { + Collapsible.prototype.destroy = function() { if (this.expanded.size > 0) { var expanded = []; // .forEach() is used because IE11 doesn't support .values() From 754f45566adfbda567ea92c981c8957c86d157a3 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Tue, 25 Jun 2019 14:36:03 +0200 Subject: [PATCH 28/59] collapsible.js: Make storage working with multiple tabs --- public/js/icinga/behavior/collapsible.js | 56 +++++++++++++++--------- 1 file changed, 36 insertions(+), 20 deletions(-) diff --git a/public/js/icinga/behavior/collapsible.js b/public/js/icinga/behavior/collapsible.js index 68b3ef5a1..3c4a3f945 100644 --- a/public/js/icinga/behavior/collapsible.js +++ b/public/js/icinga/behavior/collapsible.js @@ -18,11 +18,9 @@ this.on('click', '.collapsible + .collapsible-control', this.onControlClicked, this); this.icinga = icinga; - this.expanded = new Set(); + this.state = new StateStorage(); this.defaultVisibleRows = 2; this.defaultVisibleHeight = 36; - - this.loadStorage(); }; Collapsible.prototype = new Icinga.EventListener(); @@ -43,7 +41,7 @@ $collapsible.after($('#collapsible-control-ghost').clone().removeAttr('id')); $collapsible.addClass('can-collapse'); - if (! _this.expanded.has(collapsiblePath)) { + if (! _this.state.isExpanded(collapsiblePath)) { _this.collapse($collapsible); } } @@ -64,11 +62,11 @@ _this.icinga.logger.error('[Collapsible] Collapsible control has no associated .collapsible: ', $target); } else { var collapsiblePath = _this.icinga.utils.getCSSPath($collapsible); - if (_this.expanded.has(collapsiblePath)) { - _this.expanded.delete(collapsiblePath); + if (_this.state.isExpanded(collapsiblePath)) { + _this.state.collapse(collapsiblePath); _this.collapse($collapsible); } else { - _this.expanded.add(collapsiblePath); + _this.state.expand(collapsiblePath); _this.expand($collapsible); } } @@ -140,27 +138,47 @@ $collapsible.css({display: '', height: ''}); }; - /** - * Load state from storage - */ - Collapsible.prototype.loadStorage = function() { + Icinga.Behaviors.Collapsible = Collapsible; + + // State-Storage abstraction, not for use externally until we've had time to think this properly through + + var StateStorage = function() {}; + + StateStorage.prototype.isExpanded = function(selector) { + return this.load().has(selector); + }; + + StateStorage.prototype.expand = function(selector) { + var set = this.load(); + set.add(selector); + this.save(set); + }; + + StateStorage.prototype.collapse = function(selector) { + var set = this.load(); + set.delete(selector); + this.save(set); + }; + + StateStorage.prototype.load = function () { + var set = new Set(); + var expanded = localStorage.getItem('behavior.collapsible.expanded'); if (!! expanded) { // .forEach() is used because IE11 doesn't support constructor arguments JSON.parse(expanded).forEach(function(value) { - this.expanded.add(value); + set.add(value); }, this); } + + return set; }; - /** - * Save state to storage - */ - Collapsible.prototype.destroy = function() { - if (this.expanded.size > 0) { + StateStorage.prototype.save = function(set) { + if (set.size > 0) { var expanded = []; // .forEach() is used because IE11 doesn't support .values() - this.expanded.forEach(function(value) { + set.forEach(function(value) { expanded.push(value); }); @@ -170,6 +188,4 @@ } }; - Icinga.Behaviors.Collapsible = Collapsible; - })(Icinga, jQuery); From c5ebaa2bded5a8a3a5ae0d726f1c62967749033b Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Thu, 27 Jun 2019 15:22:12 +0200 Subject: [PATCH 29/59] main.less: Don't use `unset`, IE11 does not support it --- public/css/icinga/main.less | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/css/icinga/main.less b/public/css/icinga/main.less index 4cd7087c5..2c1f463c7 100644 --- a/public/css/icinga/main.less +++ b/public/css/icinga/main.less @@ -271,13 +271,13 @@ a:hover > .icon-cancel { } > i.collapse-icon { - display: unset; + display: inline; } } .collapsible.collapsed + .collapsible-control button { > i.expand-icon { - display: unset; + display: inline; } > i.collapse-icon { From fc782b59a97c4d53321126878d78b6adf2001c97 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Fri, 28 Jun 2019 08:29:01 +0200 Subject: [PATCH 30/59] collapsible.js: Don't collapse containers which are near to the maximum --- public/js/icinga/behavior/collapsible.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/public/js/icinga/behavior/collapsible.js b/public/js/icinga/behavior/collapsible.js index 3c4a3f945..c2509a3ba 100644 --- a/public/js/icinga/behavior/collapsible.js +++ b/public/js/icinga/behavior/collapsible.js @@ -101,7 +101,16 @@ if (!! rowSelector) { return $(rowSelector, $collapsible).length > ($collapsible.data('visibleRows') || this.defaultVisibleRows); } else { - return $collapsible.innerHeight() > ($collapsible.data('visibleHeight') || this.defaultVisibleHeight); + var actualHeight = $collapsible.innerHeight(), + maxHeight = $collapsible.data('visibleHeight') || this.defaultVisibleHeight; + + if (actualHeight <= maxHeight) { + return false; + } + + // Although the height seems larger than what it should be, make sure it's not just a small fraction + // i.e. more than 12 pixel and at least 10% difference + return actualHeight - maxHeight > 12 && actualHeight / maxHeight >= 1.1; } }; From a99f653a63bf2e02514b2d94654a8b73861f6a69 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Fri, 28 Jun 2019 10:49:14 +0200 Subject: [PATCH 31/59] collapsible.js: Don't process collapsible containers multiple times --- public/js/icinga/behavior/collapsible.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/js/icinga/behavior/collapsible.js b/public/js/icinga/behavior/collapsible.js index c2509a3ba..111eed06e 100644 --- a/public/js/icinga/behavior/collapsible.js +++ b/public/js/icinga/behavior/collapsible.js @@ -32,7 +32,7 @@ Collapsible.prototype.onRendered = function(event) { var _this = event.data.self; - $('.collapsible', event.currentTarget).each(function() { + $('.collapsible:not(.can-collapse)', event.currentTarget).each(function() { var $collapsible = $(this); var collapsiblePath = _this.icinga.utils.getCSSPath($collapsible); From 9f858a9073b6a181903328e73fc13fc86ee46b2d Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Fri, 28 Jun 2019 15:51:07 +0200 Subject: [PATCH 32/59] ui.js: Trigger event `layout-change` when the layout changes --- public/js/icinga/ui.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/js/icinga/ui.js b/public/js/icinga/ui.js index c29121bd3..670a353a3 100644 --- a/public/js/icinga/ui.js +++ b/public/js/icinga/ui.js @@ -268,6 +268,9 @@ this.currentLayout = matched[1]; if (this.currentLayout === 'poor' || this.currentLayout === 'minimal') { this.layout1col(); + } else { + // layout1col() also triggers this, that's why an else is required + $('#layout').trigger('layout-change'); } return true; } @@ -293,6 +296,7 @@ this.icinga.logger.debug('Switching to single col'); $('#layout').removeClass('twocols'); this.closeContainer($('#col2')); + $('#layout').trigger('layout-change'); // one-column layouts never have any selection active $('#col1').removeData('icinga-actiontable-former-href'); this.icinga.behaviors.actiontable.clearAll(); @@ -315,6 +319,7 @@ this.icinga.logger.debug('Switching to double col'); $('#layout').addClass('twocols'); this.fixControls(); + $('#layout').trigger('layout-change'); }, getAvailableColumnSpace: function () { From 0140fdf485f548f372fd691a7c7df8e198788d6a Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Fri, 28 Jun 2019 15:51:53 +0200 Subject: [PATCH 33/59] collapsible.js: Use `scrollHeight` to measure a container's actual height --- public/js/icinga/behavior/collapsible.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/js/icinga/behavior/collapsible.js b/public/js/icinga/behavior/collapsible.js index 111eed06e..7b593b87f 100644 --- a/public/js/icinga/behavior/collapsible.js +++ b/public/js/icinga/behavior/collapsible.js @@ -101,7 +101,7 @@ if (!! rowSelector) { return $(rowSelector, $collapsible).length > ($collapsible.data('visibleRows') || this.defaultVisibleRows); } else { - var actualHeight = $collapsible.innerHeight(), + var actualHeight = $collapsible[0].scrollHeight, maxHeight = $collapsible.data('visibleHeight') || this.defaultVisibleHeight; if (actualHeight <= maxHeight) { From beae5b5921b8a55c89dad3975453fa17a311d240 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Fri, 28 Jun 2019 15:52:41 +0200 Subject: [PATCH 34/59] collapsible.js: Update collapsible states when the layout changes --- public/js/icinga/behavior/collapsible.js | 32 +++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/public/js/icinga/behavior/collapsible.js b/public/js/icinga/behavior/collapsible.js index 7b593b87f..c9feea71a 100644 --- a/public/js/icinga/behavior/collapsible.js +++ b/public/js/icinga/behavior/collapsible.js @@ -14,6 +14,7 @@ var Collapsible = function(icinga) { Icinga.EventListener.call(this, icinga); + this.on('layout-change', this.onLayoutChange, this); this.on('rendered', '.container', this.onRendered, this); this.on('click', '.collapsible + .collapsible-control', this.onControlClicked, this); @@ -34,13 +35,42 @@ $('.collapsible:not(.can-collapse)', event.currentTarget).each(function() { var $collapsible = $(this); - var collapsiblePath = _this.icinga.utils.getCSSPath($collapsible); // Assumes that any newly rendered elements are expanded if (_this.canCollapse($collapsible)) { $collapsible.after($('#collapsible-control-ghost').clone().removeAttr('id')); $collapsible.addClass('can-collapse'); + if (! _this.state.isExpanded(_this.icinga.utils.getCSSPath($collapsible))) { + _this.collapse($collapsible); + } + } + }); + }; + + /** + * Updates all collapsibles. + * + * @param event Event The `layout-change` event triggered by window resizing or column changes + */ + Collapsible.prototype.onLayoutChange = function(event) { + var _this = event.data.self; + + $('.collapsible').each(function() { + var $collapsible = $(this); + var collapsiblePath = _this.icinga.utils.getCSSPath($collapsible); + + if ($collapsible.is('.can-collapse')) { + if (! _this.canCollapse($collapsible)) { + $collapsible.next('.collapsible-control').remove(); + $collapsible.removeClass('can-collapse'); + _this.expand($collapsible); + } + } else if (_this.canCollapse($collapsible)) { + // It's expanded but shouldn't + $collapsible.after($('#collapsible-control-ghost').clone().removeAttr('id')); + $collapsible.addClass('can-collapse'); + if (! _this.state.isExpanded(collapsiblePath)) { _this.collapse($collapsible); } From 12aa079e5c350a0cb0bdddbca18e18d0a6c9bfab Mon Sep 17 00:00:00 2001 From: Florian Strohmaier Date: Mon, 1 Jul 2019 11:02:55 +0200 Subject: [PATCH 35/59] CSS: Fix collapsible-control icon alignment in Firefox --- public/css/icinga/main.less | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/css/icinga/main.less b/public/css/icinga/main.less index 2c1f463c7..753fa230f 100644 --- a/public/css/icinga/main.less +++ b/public/css/icinga/main.less @@ -245,6 +245,7 @@ a:hover > .icon-cancel { z-index: 1; position: absolute; border: none; + padding: 0; bottom: -1em; right: .25em; -webkit-box-shadow: 0 0 1/3em rgba(0,0,0,.3); @@ -263,6 +264,10 @@ a:hover > .icon-cancel { .rounded-corners(50%); } } + + button i:before { + margin-right: 0; + } } .collapsible.can-collapse:not(.collapsed) + .collapsible-control button { From b45b38d73dace52f9d9a7a8114145c3c8c6a6c8c Mon Sep 17 00:00:00 2001 From: Florian Strohmaier Date: Mon, 1 Jul 2019 11:12:18 +0200 Subject: [PATCH 36/59] CSS: Calculate hover effect offset correctly --- public/css/icinga/main.less | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/public/css/icinga/main.less b/public/css/icinga/main.less index 753fa230f..a83073eed 100644 --- a/public/css/icinga/main.less +++ b/public/css/icinga/main.less @@ -256,10 +256,10 @@ a:hover > .icon-cancel { content: ""; display: block; position: absolute; - top: -2px; - right: -2px; - bottom: -2px; - left: -2px; + top: -1/6em; + right: -1/6em; + bottom: -1/6em; + left: -1/6em; background: fade(@text-color, 10); .rounded-corners(50%); } From e2cddc2d46105587abd7b963610b4cd1b1489ab2 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Tue, 2 Jul 2019 09:44:32 +0200 Subject: [PATCH 37/59] js: Introduce storage.js, a localStorage abstraction layer --- library/Icinga/Web/JavaScript.php | 1 + public/js/icinga/storage.js | 359 ++++++++++++++++++++++++++++++ 2 files changed, 360 insertions(+) create mode 100644 public/js/icinga/storage.js diff --git a/library/Icinga/Web/JavaScript.php b/library/Icinga/Web/JavaScript.php index f906dbb05..eacbb8aa5 100644 --- a/library/Icinga/Web/JavaScript.php +++ b/library/Icinga/Web/JavaScript.php @@ -13,6 +13,7 @@ class JavaScript 'js/helpers.js', 'js/icinga.js', 'js/icinga/logger.js', + 'js/icinga/storage.js', 'js/icinga/utils.js', 'js/icinga/ui.js', 'js/icinga/timer.js', diff --git a/public/js/icinga/storage.js b/public/js/icinga/storage.js new file mode 100644 index 000000000..0334234dc --- /dev/null +++ b/public/js/icinga/storage.js @@ -0,0 +1,359 @@ +/*! Icinga Web 2 | (c) 2019 Icinga GmbH | GPLv2+ */ + +(function (Icinga, $) { + + 'use strict'; + + /** + * Icinga.Storage + * + * localStorage access + */ + Icinga.Storage = function() { + + /** + * Namespace separator being used + * + * @type {string} + */ + this.keySeparator = '.'; + + /** + * Callbacks for storage events on particular keys + * + * @type {{function}} + */ + this.subscribers = {}; + + this.setup(); + }; + + Icinga.Storage.prototype = { + + /** + * Prefix the given key + * + * Base implementation, noop. + * + * @param {string} key + * @returns {string} + */ + prefixKey: function(key) { + return key; + }, + + /** + * Store the given key-value pair + * + * @param {string} key + * @param {*} value + * + * @returns {void} + */ + set: function(key, value) { + localStorage.setItem(this.prefixKey(key), JSON.stringify(value)); + }, + + /** + * Get value for the given key + * + * @param {string} key + * + * @returns {*} + */ + get: function(key) { + return JSON.parse(localStorage.getItem(this.prefixKey(key))); + }, + + /** + * Remove given key from storage + * + * @param {string} key + * + * @returns {void} + */ + remove: function(key) { + localStorage.removeItem(this.prefixKey(key)); + }, + + /** + * Subscribe with a callback for events on a particular key + * + * @param {string} key + * @param {function} callback + * + * @returns {void} + */ + subscribe: function(key, callback) { + this.subscribers[this.prefixKey(key)] = callback; + }, + + /** + * Pass storage events to subscribers + * + * @param {StorageEvent} event + */ + onStorage: function(event) { + if (typeof this.subscribers[event.key] !== 'undefined') { + this.subscribers[event.key](JSON.parse(event.oldValue), JSON.parse(event.newValue)); + } + }, + + /** + * Add the event listener + * + * @returns {void} + */ + setup: function() { + window.addEventListener('storage', this.onStorage.bind(this)); + }, + + /** + * Remove the event listener + * + * @returns {void} + */ + destroy: function() { + window.removeEventListener('storage', this.onStorage.bind(this)); + } + }; + + /** + * Icinga.BehaviorStorage + * + * @param {string} behaviorName + * @constructor + */ + Icinga.BehaviorStorage = function(behaviorName) { + + /** + * The behavior's name + * + * @type {string} + */ + this.behaviorName = behaviorName; + + Icinga.Storage.call(this); + }; + Icinga.BehaviorStorage.prototype = Object.create(Icinga.Storage.prototype); + + /** + * Prefix the given key with `behavior..` + * + * @param {string} key + * + * @returns {string} + */ + Icinga.BehaviorStorage.prototype.prefixKey = function(key) { + return 'behavior' + this.keySeparator + this.behaviorName + this.keySeparator + key; + }; + + /** + * Icinga.Storage.StorageAwareSet + * + * Emits events `StorageAwareSetDelete` and `StorageAwareSetAdd` in case an update occurs in the storage. + * + * @param {Array} values + * @constructor + */ + Icinga.Storage.StorageAwareSet = function(values) { + + /** + * Storage object + * + * @type {Icinga.Storage} + */ + this.storage = undefined; + + /** + * Storage key + * + * @type {string} + */ + this.key = undefined; + + /** + * The internal (real) set + * + * @type {Set<*>} + */ + this.data = new Set(); + + // items is not passed directly because IE11 doesn't support constructor arguments + if (typeof values !== 'undefined' && !! values && values.length) { + values.forEach(function(value) { + this.data.add(value); + }, this); + } + }; + + /** + * Create a new StorageAwareSet for the given storage and key + * + * @param {Icinga.Storage} storage + * @param {string} key + * + * @returns {Icinga.Storage.StorageAwareSet} + */ + Icinga.Storage.StorageAwareSet.withStorage = function(storage, key) { + return (new Icinga.Storage.StorageAwareSet(storage.get(key)).setStorage(storage, key)); + }; + + Icinga.Storage.StorageAwareSet.prototype = { + + /** + * Bind this set to the given storage and key + * + * @param {Icinga.Storage} storage + * @param {string} key + * + * @returns {this} + */ + setStorage: function(storage, key) { + this.storage = storage; + this.key = key; + + storage.subscribe(key, this.onChange.bind(this)); + return this; + }, + + /** + * Return a boolean indicating this set got a storage + * + * @returns {boolean} + */ + hasStorage: function() { + return typeof this.storage !== 'undefined' && typeof this.key !== 'undefined'; + }, + + /** + * Update the set + * + * @param {Array} oldValue + * @param {Array} newValue + */ + onChange: function(oldValue, newValue) { + // Check for deletions first + this.values().forEach(function (value) { + if (newValue.indexOf(value) < 0) { + this.data.delete(value); + $(window).trigger('StorageAwareSetDelete', value); + } + }, this); + + // Now check for new entries + newValue.forEach(function(value) { + if (! this.data.has(value)) { + this.data.add(value); + $(window).trigger('StorageAwareSetAdd', value); + } + }, this); + }, + + /** + * Return the number of (unique) elements in the set + * + * @returns {number} + */ + get size() { + return this.data.size; + }, + + /** + * Append the given value to the end of the set + * + * @param value + * + * @returns {this} + */ + add: function(value) { + this.data.add(value); + + if (this.hasStorage()) { + this.storage.set(this.key, this.values()); + } + + return this; + }, + + /** + * Remove all elements from the set + * + * @returns {void} + */ + clear: function() { + if (this.hasStorage()) { + this.storage.remove(this.key); + } + + return this.data.clear(); + }, + + /** + * Remove the given value from the set + * + * @param value + * + * @returns {boolean} + */ + delete: function(value) { + var retVal = this.data.delete(value); + + if (this.hasStorage()) { + this.storage.set(this.key, this.values()); + } + + return retVal; + }, + + /** + * Returns an iterable of [v,v] pairs for every value v in the set. + * + * @returns {IterableIterator<[*, *]>} + */ + entries: function() { + return this.data.entries(); + }, + + /** + * Execute a provided function once for each value in the Set object, in insertion order. + * + * @param callback + * + * @returns {void} + */ + forEach: function(callback) { + return this.data.forEach(callback); + }, + + /** + * Return a boolean indicating whether an element with the specified value exists in a Set object or not. + * + * @param value + * + * @returns {boolean} + */ + has: function(value) { + return this.data.has(value); + }, + + /** + * Returns an array of values in the set. + * + * @returns {Array} + */ + values: function() { + var list = []; + + if (this.size > 0) { + // .forEach() is used because IE11 doesn't support .values() + this.forEach(function(value) { + list.push(value); + }); + } + + return list; + } + }; + +}(Icinga, jQuery)); From ffec2ebd4c0d6edb9a24b62630ad69ccb326dfee Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Tue, 2 Jul 2019 09:48:23 +0200 Subject: [PATCH 38/59] collapsible.js: Utilize storage.js --- public/js/icinga/behavior/collapsible.js | 96 +++++++++++------------- 1 file changed, 42 insertions(+), 54 deletions(-) diff --git a/public/js/icinga/behavior/collapsible.js b/public/js/icinga/behavior/collapsible.js index c9feea71a..75f44b6b5 100644 --- a/public/js/icinga/behavior/collapsible.js +++ b/public/js/icinga/behavior/collapsible.js @@ -19,9 +19,15 @@ this.on('click', '.collapsible + .collapsible-control', this.onControlClicked, this); this.icinga = icinga; - this.state = new StateStorage(); this.defaultVisibleRows = 2; this.defaultVisibleHeight = 36; + + $(window).on('StorageAwareSetAdd', { self: this }, this.onExternalExpansion); + $(window).on('StorageAwareSetDelete', { self: this }, this.onExternalCollapse); + this.state = new Icinga.Storage.StorageAwareSet.withStorage( + new Icinga.BehaviorStorage('collapsible'), + 'expanded' + ); }; Collapsible.prototype = new Icinga.EventListener(); @@ -41,7 +47,7 @@ $collapsible.after($('#collapsible-control-ghost').clone().removeAttr('id')); $collapsible.addClass('can-collapse'); - if (! _this.state.isExpanded(_this.icinga.utils.getCSSPath($collapsible))) { + if (! _this.state.has(_this.icinga.utils.getCSSPath($collapsible))) { _this.collapse($collapsible); } } @@ -71,13 +77,43 @@ $collapsible.after($('#collapsible-control-ghost').clone().removeAttr('id')); $collapsible.addClass('can-collapse'); - if (! _this.state.isExpanded(collapsiblePath)) { + if (! _this.state.has(collapsiblePath)) { _this.collapse($collapsible); } } }); }; + /** + * A collapsible got expanded in another window, try to apply this here as well + * + * @param {Event} event + * @param {string} collapsiblePath + */ + Collapsible.prototype.onExternalExpansion = function(event, collapsiblePath) { + var _this = event.data.self; + var $collapsible = $(collapsiblePath); + + if ($collapsible.length) { + _this.expand($collapsible); + } + }; + + /** + * A collapsible got collapsed in another window, try to apply this here as well + * + * @param {Event} event + * @param {string} collapsiblePath + */ + Collapsible.prototype.onExternalCollapse = function(event, collapsiblePath) { + var _this = event.data.self; + var $collapsible = $(collapsiblePath); + + if ($collapsible.length) { + _this.collapse($collapsible); + } + }; + /** * Event handler for toggling collapsibles. Switches the collapsed state of the respective container. * @@ -92,11 +128,11 @@ _this.icinga.logger.error('[Collapsible] Collapsible control has no associated .collapsible: ', $target); } else { var collapsiblePath = _this.icinga.utils.getCSSPath($collapsible); - if (_this.state.isExpanded(collapsiblePath)) { - _this.state.collapse(collapsiblePath); + if (_this.state.has(collapsiblePath)) { + _this.state.delete(collapsiblePath); _this.collapse($collapsible); } else { - _this.state.expand(collapsiblePath); + _this.state.add(collapsiblePath); _this.expand($collapsible); } } @@ -179,52 +215,4 @@ Icinga.Behaviors.Collapsible = Collapsible; - // State-Storage abstraction, not for use externally until we've had time to think this properly through - - var StateStorage = function() {}; - - StateStorage.prototype.isExpanded = function(selector) { - return this.load().has(selector); - }; - - StateStorage.prototype.expand = function(selector) { - var set = this.load(); - set.add(selector); - this.save(set); - }; - - StateStorage.prototype.collapse = function(selector) { - var set = this.load(); - set.delete(selector); - this.save(set); - }; - - StateStorage.prototype.load = function () { - var set = new Set(); - - var expanded = localStorage.getItem('behavior.collapsible.expanded'); - if (!! expanded) { - // .forEach() is used because IE11 doesn't support constructor arguments - JSON.parse(expanded).forEach(function(value) { - set.add(value); - }, this); - } - - return set; - }; - - StateStorage.prototype.save = function(set) { - if (set.size > 0) { - var expanded = []; - // .forEach() is used because IE11 doesn't support .values() - set.forEach(function(value) { - expanded.push(value); - }); - - localStorage.setItem('behavior.collapsible.expanded', JSON.stringify(expanded)); - } else { - localStorage.removeItem('behavior.collapsible.expanded'); - } - }; - })(Icinga, jQuery); From 3b7a1a5ab4fb1d97248952ea88162790442226b3 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Wed, 3 Jul 2019 15:56:08 +0200 Subject: [PATCH 39/59] storage.js: Add method `on` to `StorageAwareSet` --- public/js/icinga/behavior/collapsible.js | 6 +++--- public/js/icinga/storage.js | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/public/js/icinga/behavior/collapsible.js b/public/js/icinga/behavior/collapsible.js index 75f44b6b5..642f3f89c 100644 --- a/public/js/icinga/behavior/collapsible.js +++ b/public/js/icinga/behavior/collapsible.js @@ -22,12 +22,12 @@ this.defaultVisibleRows = 2; this.defaultVisibleHeight = 36; - $(window).on('StorageAwareSetAdd', { self: this }, this.onExternalExpansion); - $(window).on('StorageAwareSetDelete', { self: this }, this.onExternalCollapse); this.state = new Icinga.Storage.StorageAwareSet.withStorage( new Icinga.BehaviorStorage('collapsible'), 'expanded' - ); + ) + .on('add', { self: this }, this.onExternalExpansion) + .on('delete', { self: this }, this.onExternalCollapse); }; Collapsible.prototype = new Icinga.EventListener(); diff --git a/public/js/icinga/storage.js b/public/js/icinga/storage.js index 0334234dc..d30a9d1e2 100644 --- a/public/js/icinga/storage.js +++ b/public/js/icinga/storage.js @@ -250,6 +250,27 @@ }, this); }, + /** + * Register an event handler to handle storage updates + * + * Available events are: add, delete + * + * @param {string} event + * @param {object} data + * @param {function} handler + * + * @returns {this} + */ + on: function(event, data, handler) { + $(window).on( + 'StorageAwareSet' + event.charAt(0).toUpperCase() + event.slice(1), + data, + handler + ); + + return this; + }, + /** * Return the number of (unique) elements in the set * From 95dee43f5b43e0dbf358865c7c0f64fa36be0546 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Thu, 4 Jul 2019 10:21:50 +0200 Subject: [PATCH 40/59] storage.js: Just use a factory to create behavior storages --- public/js/icinga/behavior/collapsible.js | 2 +- public/js/icinga/storage.js | 55 +++++++++--------------- 2 files changed, 21 insertions(+), 36 deletions(-) diff --git a/public/js/icinga/behavior/collapsible.js b/public/js/icinga/behavior/collapsible.js index 642f3f89c..7f24f54f1 100644 --- a/public/js/icinga/behavior/collapsible.js +++ b/public/js/icinga/behavior/collapsible.js @@ -23,7 +23,7 @@ this.defaultVisibleHeight = 36; this.state = new Icinga.Storage.StorageAwareSet.withStorage( - new Icinga.BehaviorStorage('collapsible'), + Icinga.Storage.BehaviorStorage('collapsible'), 'expanded' ) .on('add', { self: this }, this.onExternalExpansion) diff --git a/public/js/icinga/storage.js b/public/js/icinga/storage.js index d30a9d1e2..939733c9c 100644 --- a/public/js/icinga/storage.js +++ b/public/js/icinga/storage.js @@ -8,15 +8,17 @@ * Icinga.Storage * * localStorage access + * + * @param {string} prefix */ - Icinga.Storage = function() { + Icinga.Storage = function(prefix) { /** - * Namespace separator being used + * Prefix to use for keys * * @type {string} */ - this.keySeparator = '.'; + this.prefix = prefix; /** * Callbacks for storage events on particular keys @@ -28,17 +30,30 @@ this.setup(); }; + /** + * Create a new storage with `behavior.` as prefix + * + * @param {string} name + * + * @returns {Icinga.Storage} + */ + Icinga.Storage.BehaviorStorage = function(name) { + return new Icinga.Storage('behavior.' + name); + }; + Icinga.Storage.prototype = { /** * Prefix the given key * - * Base implementation, noop. - * * @param {string} key * @returns {string} */ prefixKey: function(key) { + if (typeof this.prefix !== 'undefined') { + return this.prefix + '.' + key; + } + return key; }, @@ -118,36 +133,6 @@ } }; - /** - * Icinga.BehaviorStorage - * - * @param {string} behaviorName - * @constructor - */ - Icinga.BehaviorStorage = function(behaviorName) { - - /** - * The behavior's name - * - * @type {string} - */ - this.behaviorName = behaviorName; - - Icinga.Storage.call(this); - }; - Icinga.BehaviorStorage.prototype = Object.create(Icinga.Storage.prototype); - - /** - * Prefix the given key with `behavior..` - * - * @param {string} key - * - * @returns {string} - */ - Icinga.BehaviorStorage.prototype.prefixKey = function(key) { - return 'behavior' + this.keySeparator + this.behaviorName + this.keySeparator + key; - }; - /** * Icinga.Storage.StorageAwareSet * From 03fc052749de2b4b42fd661efdb8860d75d5f101 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Mon, 8 Jul 2019 13:26:32 +0200 Subject: [PATCH 41/59] storage.js: Directly use scope `window` to access `localStorage` --- public/js/icinga/storage.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/js/icinga/storage.js b/public/js/icinga/storage.js index 939733c9c..653541f62 100644 --- a/public/js/icinga/storage.js +++ b/public/js/icinga/storage.js @@ -66,7 +66,7 @@ * @returns {void} */ set: function(key, value) { - localStorage.setItem(this.prefixKey(key), JSON.stringify(value)); + window.localStorage.setItem(this.prefixKey(key), JSON.stringify(value)); }, /** @@ -77,7 +77,7 @@ * @returns {*} */ get: function(key) { - return JSON.parse(localStorage.getItem(this.prefixKey(key))); + return JSON.parse(window.localStorage.getItem(this.prefixKey(key))); }, /** @@ -88,7 +88,7 @@ * @returns {void} */ remove: function(key) { - localStorage.removeItem(this.prefixKey(key)); + window.localStorage.removeItem(this.prefixKey(key)); }, /** From 8377a2d09606a37415dac79dc38f79eaaa0c207c Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Mon, 8 Jul 2019 13:34:38 +0200 Subject: [PATCH 42/59] storage.js: Don't use .bind() to define a callbacks context --- public/js/icinga/storage.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/public/js/icinga/storage.js b/public/js/icinga/storage.js index 653541f62..791263e79 100644 --- a/public/js/icinga/storage.js +++ b/public/js/icinga/storage.js @@ -96,11 +96,12 @@ * * @param {string} key * @param {function} callback + * @param {object} context * * @returns {void} */ - subscribe: function(key, callback) { - this.subscribers[this.prefixKey(key)] = callback; + subscribe: function(key, callback, context) { + this.subscribers[this.prefixKey(key)] = [callback, context]; }, /** @@ -110,7 +111,8 @@ */ onStorage: function(event) { if (typeof this.subscribers[event.key] !== 'undefined') { - this.subscribers[event.key](JSON.parse(event.oldValue), JSON.parse(event.newValue)); + var subscriber = this.subscribers[event.key]; + subscriber[0].call(subscriber[1], JSON.parse(event.newValue), JSON.parse(event.oldValue), event); } }, @@ -198,7 +200,7 @@ this.storage = storage; this.key = key; - storage.subscribe(key, this.onChange.bind(this)); + storage.subscribe(key, this.onChange, this); return this; }, @@ -214,10 +216,9 @@ /** * Update the set * - * @param {Array} oldValue * @param {Array} newValue */ - onChange: function(oldValue, newValue) { + onChange: function(newValue) { // Check for deletions first this.values().forEach(function (value) { if (newValue.indexOf(value) < 0) { From cbd1e1bb92451d3fab882a4595c39b1303f09156 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Tue, 9 Jul 2019 11:35:41 +0200 Subject: [PATCH 43/59] storage.js: Drop `StorageAwareSet` and replace it with `StorageAwareMap` --- public/js/icinga/behavior/collapsible.js | 4 +- public/js/icinga/storage.js | 158 +++++++++++++++-------- 2 files changed, 109 insertions(+), 53 deletions(-) diff --git a/public/js/icinga/behavior/collapsible.js b/public/js/icinga/behavior/collapsible.js index 7f24f54f1..245f021e4 100644 --- a/public/js/icinga/behavior/collapsible.js +++ b/public/js/icinga/behavior/collapsible.js @@ -22,7 +22,7 @@ this.defaultVisibleRows = 2; this.defaultVisibleHeight = 36; - this.state = new Icinga.Storage.StorageAwareSet.withStorage( + this.state = new Icinga.Storage.StorageAwareMap.withStorage( Icinga.Storage.BehaviorStorage('collapsible'), 'expanded' ) @@ -132,7 +132,7 @@ _this.state.delete(collapsiblePath); _this.collapse($collapsible); } else { - _this.state.add(collapsiblePath); + _this.state.set(collapsiblePath, 1); _this.expand($collapsible); } } diff --git a/public/js/icinga/storage.js b/public/js/icinga/storage.js index 791263e79..21d427047 100644 --- a/public/js/icinga/storage.js +++ b/public/js/icinga/storage.js @@ -47,6 +47,7 @@ * Prefix the given key * * @param {string} key + * * @returns {string} */ prefixKey: function(key) { @@ -136,14 +137,14 @@ }; /** - * Icinga.Storage.StorageAwareSet + * Icinga.Storage.StorageAwareMap * - * Emits events `StorageAwareSetDelete` and `StorageAwareSetAdd` in case an update occurs in the storage. + * Emits events `StorageAwareMapDelete` and `StorageAwareMapAdd` in case an update occurs in the storage. * - * @param {Array} values + * @param {object} items * @constructor */ - Icinga.Storage.StorageAwareSet = function(values) { + Icinga.Storage.StorageAwareMap = function(items) { /** * Storage object @@ -160,36 +161,36 @@ this.key = undefined; /** - * The internal (real) set + * The internal (real) map * - * @type {Set<*>} + * @type {Map<*>} */ - this.data = new Set(); + this.data = new Map(); // items is not passed directly because IE11 doesn't support constructor arguments - if (typeof values !== 'undefined' && !! values && values.length) { - values.forEach(function(value) { - this.data.add(value); + if (typeof items !== 'undefined' && !! items) { + Object.keys(items).forEach(function(key) { + this.data.set(key, items[key]); }, this); } }; /** - * Create a new StorageAwareSet for the given storage and key + * Create a new StorageAwareMap for the given storage and key * * @param {Icinga.Storage} storage * @param {string} key * - * @returns {Icinga.Storage.StorageAwareSet} + * @returns {Icinga.Storage.StorageAwareMap} */ - Icinga.Storage.StorageAwareSet.withStorage = function(storage, key) { - return (new Icinga.Storage.StorageAwareSet(storage.get(key)).setStorage(storage, key)); + Icinga.Storage.StorageAwareMap.withStorage = function(storage, key) { + return (new Icinga.Storage.StorageAwareMap(storage.get(key)).setStorage(storage, key)); }; - Icinga.Storage.StorageAwareSet.prototype = { + Icinga.Storage.StorageAwareMap.prototype = { /** - * Bind this set to the given storage and key + * Bind this map to the given storage and key * * @param {Icinga.Storage} storage * @param {string} key @@ -205,7 +206,7 @@ }, /** - * Return a boolean indicating this set got a storage + * Return a boolean indicating this map got a storage * * @returns {boolean} */ @@ -214,24 +215,24 @@ }, /** - * Update the set + * Update the map * - * @param {Array} newValue + * @param {object} newValue */ onChange: function(newValue) { // Check for deletions first - this.values().forEach(function (value) { - if (newValue.indexOf(value) < 0) { - this.data.delete(value); - $(window).trigger('StorageAwareSetDelete', value); + this.keys().forEach(function (key) { + if (typeof newValue[key] === 'undefined') { + this.data.delete(key); + $(window).trigger('StorageAwareMapDelete', key); } }, this); // Now check for new entries - newValue.forEach(function(value) { - if (! this.data.has(value)) { - this.data.add(value); - $(window).trigger('StorageAwareSetAdd', value); + Object.keys(newValue).forEach(function(key) { + if (! this.data.has(key)) { + this.data.set(key, newValue[key]); + $(window).trigger('StorageAwareMapAdd', key); } }, this); }, @@ -249,7 +250,7 @@ */ on: function(event, data, handler) { $(window).on( - 'StorageAwareSet' + event.charAt(0).toUpperCase() + event.slice(1), + 'StorageAwareMap' + event.charAt(0).toUpperCase() + event.slice(1), data, handler ); @@ -258,7 +259,7 @@ }, /** - * Return the number of (unique) elements in the set + * Return the number of key/value pairs in the map * * @returns {number} */ @@ -267,24 +268,25 @@ }, /** - * Append the given value to the end of the set + * Set the value for the key in the map * - * @param value + * @param {string} key + * @param {*} value * * @returns {this} */ - add: function(value) { - this.data.add(value); + set: function(key, value) { + this.data.set(key, value); if (this.hasStorage()) { - this.storage.set(this.key, this.values()); + this.storage.set(this.key, this.toObject()); } return this; }, /** - * Remove all elements from the set + * Remove all key/value pairs from the map * * @returns {void} */ @@ -297,35 +299,43 @@ }, /** - * Remove the given value from the set + * Remove the given key from the map * - * @param value + * @param {string} key * * @returns {boolean} */ - delete: function(value) { - var retVal = this.data.delete(value); + delete: function(key) { + var retVal = this.data.delete(key); if (this.hasStorage()) { - this.storage.set(this.key, this.values()); + this.storage.set(this.key, this.toObject()); } return retVal; }, /** - * Returns an iterable of [v,v] pairs for every value v in the set. + * Return a list of [key, value] pairs for every item in the map * - * @returns {IterableIterator<[*, *]>} + * @returns {Array} */ entries: function() { - return this.data.entries(); + var list = []; + + if (this.size > 0) { + this.forEach(function (value, key) { + list.push([key, value]); + }); + } + + return list; }, /** - * Execute a provided function once for each value in the Set object, in insertion order. + * Execute a provided function once for each item in the map, in insertion order * - * @param callback + * @param {function} callback * * @returns {void} */ @@ -334,18 +344,47 @@ }, /** - * Return a boolean indicating whether an element with the specified value exists in a Set object or not. + * Return the value associated to the key, or undefined if there is none * - * @param value + * @param {string} key * - * @returns {boolean} + * @returns {*} */ - has: function(value) { - return this.data.has(value); + get: function(key) { + return this.data.get(key); }, /** - * Returns an array of values in the set. + * Return a boolean asserting whether a value has been associated to the key in the map + * + * @param {string} key + * + * @returns {boolean} + */ + has: function(key) { + return this.data.has(key); + }, + + /** + * Return an array of keys in the map + * + * @returns {Array} + */ + keys: function() { + var list = []; + + if (this.size > 0) { + // .forEach() is used because IE11 doesn't support .keys() + this.forEach(function(_, key) { + list.push(key); + }); + } + + return list; + }, + + /** + * Return an array of values in the map * * @returns {Array} */ @@ -360,6 +399,23 @@ } return list; + }, + + /** + * Return this map as simple object + * + * @returns {object} + */ + toObject: function() { + var obj = {}; + + if (this.size > 0) { + this.forEach(function (value, key) { + obj[key] = value; + }); + } + + return obj; } }; From c5beabf89194a42b9c1fbb7e3eea6f0a51ab7f54 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Tue, 9 Jul 2019 15:55:52 +0200 Subject: [PATCH 44/59] storage.js: Cleanup `StorageAwareMap` key corpses after 90 days --- public/js/icinga/storage.js | 96 ++++++++++++++++++++++++++----------- 1 file changed, 67 insertions(+), 29 deletions(-) diff --git a/public/js/icinga/storage.js b/public/js/icinga/storage.js index 21d427047..12a484051 100644 --- a/public/js/icinga/storage.js +++ b/public/js/icinga/storage.js @@ -4,6 +4,8 @@ 'use strict'; + const KEY_TTL = 7776000000; // 90 days (90×24×60×60×1000) + /** * Icinga.Storage * @@ -184,7 +186,21 @@ * @returns {Icinga.Storage.StorageAwareMap} */ Icinga.Storage.StorageAwareMap.withStorage = function(storage, key) { - return (new Icinga.Storage.StorageAwareMap(storage.get(key)).setStorage(storage, key)); + var items = storage.get(key); + if (typeof items !== 'undefined' && !! items) { + Object.keys(items).forEach(function(key) { + var value = items[key]; + + if (typeof value !== 'object' || typeof value['lastAccess'] === 'undefined') { + items[key] = {'value': value, 'lastAccess': Date.now()}; + } else if (Date.now() - value['lastAccess'] > KEY_TTL) { + delete items[key]; + } + }, this); + } + + storage.set(key, items); + return (new Icinga.Storage.StorageAwareMap(items).setStorage(storage, key)); }; Icinga.Storage.StorageAwareMap.prototype = { @@ -214,13 +230,31 @@ return typeof this.storage !== 'undefined' && typeof this.key !== 'undefined'; }, + /** + * Update the storage + * + * @returns {void} + */ + updateStorage: function() { + if (! this.hasStorage()) { + return; + } + + if (this.size > 0) { + this.storage.set(this.key, this.toObject()); + } else { + this.storage.remove(this.key); + } + }, + /** * Update the map * - * @param {object} newValue + * @param {object} newValue + * @param {object} oldValue */ - onChange: function(newValue) { - // Check for deletions first + onChange: function(newValue, oldValue) { + // Check for deletions first. Uses keys() to iterate over a copy this.keys().forEach(function (key) { if (typeof newValue[key] === 'undefined') { this.data.delete(key); @@ -230,8 +264,11 @@ // Now check for new entries Object.keys(newValue).forEach(function(key) { - if (! this.data.has(key)) { - this.data.set(key, newValue[key]); + var known = this.data.has(key); + // Always override any known value as we want to keep track of all `lastAccess` changes + this.data.set(key, newValue[key]); + + if (! known) { $(window).trigger('StorageAwareMapAdd', key); } }, this); @@ -276,12 +313,9 @@ * @returns {this} */ set: function(key, value) { - this.data.set(key, value); - - if (this.hasStorage()) { - this.storage.set(this.key, this.toObject()); - } + this.data.set(key, {'value': value, 'lastAccess': Date.now()}); + this.updateStorage(); return this; }, @@ -291,11 +325,8 @@ * @returns {void} */ clear: function() { - if (this.hasStorage()) { - this.storage.remove(this.key); - } - - return this.data.clear(); + this.data.clear(); + this.updateStorage(); }, /** @@ -308,10 +339,7 @@ delete: function(key) { var retVal = this.data.delete(key); - if (this.hasStorage()) { - this.storage.set(this.key, this.toObject()); - } - + this.updateStorage(); return retVal; }, @@ -324,8 +352,8 @@ var list = []; if (this.size > 0) { - this.forEach(function (value, key) { - list.push([key, value]); + this.data.forEach(function (value, key) { + list.push([key, value['value']]); }); } @@ -336,11 +364,18 @@ * Execute a provided function once for each item in the map, in insertion order * * @param {function} callback + * @param {object} thisArg * * @returns {void} */ - forEach: function(callback) { - return this.data.forEach(callback); + forEach: function(callback, thisArg) { + if (typeof thisArg === 'undefined') { + thisArg = this; + } + + return this.data.forEach(function(value, key) { + callback.call(thisArg, value['value'], key); + }); }, /** @@ -351,7 +386,10 @@ * @returns {*} */ get: function(key) { - return this.data.get(key); + var value = this.data.get(key)['value']; + this.set(key, value); // Update `lastAccess` + + return value; }, /** @@ -375,7 +413,7 @@ if (this.size > 0) { // .forEach() is used because IE11 doesn't support .keys() - this.forEach(function(_, key) { + this.data.forEach(function(_, key) { list.push(key); }); } @@ -393,8 +431,8 @@ if (this.size > 0) { // .forEach() is used because IE11 doesn't support .values() - this.forEach(function(value) { - list.push(value); + this.data.forEach(function(value) { + list.push(value['value']); }); } @@ -410,7 +448,7 @@ var obj = {}; if (this.size > 0) { - this.forEach(function (value, key) { + this.data.forEach(function (value, key) { obj[key] = value; }); } From 363486277b72c121349180987f3d8ab3a0143c6e Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Wed, 10 Jul 2019 07:33:07 +0200 Subject: [PATCH 45/59] storage.js: Rename Storage.subscribe to onChange --- public/js/icinga/storage.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/js/icinga/storage.js b/public/js/icinga/storage.js index 12a484051..05661dbff 100644 --- a/public/js/icinga/storage.js +++ b/public/js/icinga/storage.js @@ -103,7 +103,7 @@ * * @returns {void} */ - subscribe: function(key, callback, context) { + onChange: function(key, callback, context) { this.subscribers[this.prefixKey(key)] = [callback, context]; }, @@ -217,7 +217,7 @@ this.storage = storage; this.key = key; - storage.subscribe(key, this.onChange, this); + storage.onChange(key, this.onChange, this); return this; }, From 8937e11a090ce31599f86c6ed7b6cdcec17d01bd Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Wed, 10 Jul 2019 07:51:48 +0200 Subject: [PATCH 46/59] storage.js: Properly handle if keys are entirely removed --- public/js/icinga/storage.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/public/js/icinga/storage.js b/public/js/icinga/storage.js index 05661dbff..d700e4122 100644 --- a/public/js/icinga/storage.js +++ b/public/js/icinga/storage.js @@ -251,17 +251,20 @@ * Update the map * * @param {object} newValue - * @param {object} oldValue */ - onChange: function(newValue, oldValue) { + onChange: function(newValue) { // Check for deletions first. Uses keys() to iterate over a copy this.keys().forEach(function (key) { - if (typeof newValue[key] === 'undefined') { + if (newValue === null || typeof newValue[key] === 'undefined') { this.data.delete(key); $(window).trigger('StorageAwareMapDelete', key); } }, this); + if (newValue === null) { + return; + } + // Now check for new entries Object.keys(newValue).forEach(function(key) { var known = this.data.has(key); From 383895fd921a82fa4b2acdb19d1ff9c4f639a051 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Wed, 10 Jul 2019 07:52:21 +0200 Subject: [PATCH 47/59] storage.js: Pass the value to event subscribers of StorageAwareMap --- public/js/icinga/storage.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/public/js/icinga/storage.js b/public/js/icinga/storage.js index d700e4122..af6b3bb1f 100644 --- a/public/js/icinga/storage.js +++ b/public/js/icinga/storage.js @@ -256,8 +256,8 @@ // Check for deletions first. Uses keys() to iterate over a copy this.keys().forEach(function (key) { if (newValue === null || typeof newValue[key] === 'undefined') { + $(window).trigger('StorageAwareMapDelete', [key, this.data.get(key)['value']]); this.data.delete(key); - $(window).trigger('StorageAwareMapDelete', key); } }, this); @@ -272,7 +272,7 @@ this.data.set(key, newValue[key]); if (! known) { - $(window).trigger('StorageAwareMapAdd', key); + $(window).trigger('StorageAwareMapAdd', [key, newValue[key]['value']]); } }, this); }, @@ -280,7 +280,8 @@ /** * Register an event handler to handle storage updates * - * Available events are: add, delete + * Available events are: add, delete. The handler receives the + * key and its value as second and third argument, respectively. * * @param {string} event * @param {object} data From 0f16e20d92af17a3e4436a0ecc8519ca26776481 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Wed, 10 Jul 2019 08:04:10 +0200 Subject: [PATCH 48/59] storage.js: Write `null` instead of `undefined` to the storage `undefined` causes the key to be ignored by JSON.stringify --- public/js/icinga/behavior/collapsible.js | 2 +- public/js/icinga/storage.js | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/public/js/icinga/behavior/collapsible.js b/public/js/icinga/behavior/collapsible.js index 245f021e4..0a4302d2a 100644 --- a/public/js/icinga/behavior/collapsible.js +++ b/public/js/icinga/behavior/collapsible.js @@ -132,7 +132,7 @@ _this.state.delete(collapsiblePath); _this.collapse($collapsible); } else { - _this.state.set(collapsiblePath, 1); + _this.state.set(collapsiblePath); _this.expand($collapsible); } } diff --git a/public/js/icinga/storage.js b/public/js/icinga/storage.js index af6b3bb1f..03e3f3a2a 100644 --- a/public/js/icinga/storage.js +++ b/public/js/icinga/storage.js @@ -312,11 +312,15 @@ * Set the value for the key in the map * * @param {string} key - * @param {*} value + * @param {*} value Default null * * @returns {this} */ set: function(key, value) { + if (typeof value === 'undefined') { + value = null; + } + this.data.set(key, {'value': value, 'lastAccess': Date.now()}); this.updateStorage(); From 2ac848828a8607b53fc060d4b002f6c5c20f44a4 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Wed, 10 Jul 2019 08:33:53 +0200 Subject: [PATCH 49/59] storage.js: Prevent conflicts with other apps accessing the same storage --- public/js/icinga/storage.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/public/js/icinga/storage.js b/public/js/icinga/storage.js index 03e3f3a2a..6c33fb89a 100644 --- a/public/js/icinga/storage.js +++ b/public/js/icinga/storage.js @@ -53,11 +53,12 @@ * @returns {string} */ prefixKey: function(key) { + var prefix = 'icinga.'; if (typeof this.prefix !== 'undefined') { - return this.prefix + '.' + key; + prefix = prefix + this.prefix + '.'; } - return key; + return prefix + key; }, /** @@ -113,6 +114,13 @@ * @param {StorageEvent} event */ onStorage: function(event) { + var url = icinga.utils.parseUrl(event.url); + if (! url.path.startsWith(icinga.config.baseUrl)) { + // A localStorage is shared between all paths on the same origin. + // So we need to make sure it's us who made a change. + return; + } + if (typeof this.subscribers[event.key] !== 'undefined') { var subscriber = this.subscribers[event.key]; subscriber[0].call(subscriber[1], JSON.parse(event.newValue), JSON.parse(event.oldValue), event); From 2fd7ba5aed5e9947f15d3281d38770ff73b4610c Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Wed, 10 Jul 2019 09:32:33 +0200 Subject: [PATCH 50/59] 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. --- public/js/icinga/storage.js | 74 ++++++++++++++----------------------- 1 file changed, 27 insertions(+), 47 deletions(-) diff --git a/public/js/icinga/storage.js b/public/js/icinga/storage.js index 6c33fb89a..8be8e68e5 100644 --- a/public/js/icinga/storage.js +++ b/public/js/icinga/storage.js @@ -21,17 +21,34 @@ * @type {string} */ this.prefix = prefix; - - /** - * Callbacks for storage events on particular keys - * - * @type {{function}} - */ - this.subscribers = {}; - - this.setup(); }; + /** + * Callbacks for storage events on particular keys + * + * @type {{function}} + */ + Icinga.Storage.subscribers = {}; + + /** + * Pass storage events to subscribers + * + * @param {StorageEvent} event + */ + window.addEventListener('storage', function(event) { + var url = icinga.utils.parseUrl(event.url); + if (! url.path.startsWith(icinga.config.baseUrl)) { + // A localStorage is shared between all paths on the same origin. + // So we need to make sure it's us who made a change. + return; + } + + if (typeof Icinga.Storage.subscribers[event.key] !== 'undefined') { + var subscriber = Icinga.Storage.subscribers[event.key]; + subscriber[0].call(subscriber[1], JSON.parse(event.newValue), JSON.parse(event.oldValue), event); + } + }); + /** * Create a new storage with `behavior.` as prefix * @@ -105,44 +122,7 @@ * @returns {void} */ onChange: function(key, callback, context) { - this.subscribers[this.prefixKey(key)] = [callback, context]; - }, - - /** - * Pass storage events to subscribers - * - * @param {StorageEvent} event - */ - onStorage: function(event) { - var url = icinga.utils.parseUrl(event.url); - if (! url.path.startsWith(icinga.config.baseUrl)) { - // A localStorage is shared between all paths on the same origin. - // So we need to make sure it's us who made a change. - return; - } - - if (typeof this.subscribers[event.key] !== 'undefined') { - var subscriber = this.subscribers[event.key]; - subscriber[0].call(subscriber[1], JSON.parse(event.newValue), JSON.parse(event.oldValue), event); - } - }, - - /** - * Add the event listener - * - * @returns {void} - */ - setup: function() { - window.addEventListener('storage', this.onStorage.bind(this)); - }, - - /** - * Remove the event listener - * - * @returns {void} - */ - destroy: function() { - window.removeEventListener('storage', this.onStorage.bind(this)); + Icinga.Storage.subscribers[this.prefixKey(key)] = [callback, context]; } }; From c05291296ac15965f921f753a744d94e97fd0d8b Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Wed, 10 Jul 2019 09:51:06 +0200 Subject: [PATCH 51/59] collapsible.js: Only apply external expansions/collapses if necessary --- public/js/icinga/behavior/collapsible.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/js/icinga/behavior/collapsible.js b/public/js/icinga/behavior/collapsible.js index 0a4302d2a..7f8962262 100644 --- a/public/js/icinga/behavior/collapsible.js +++ b/public/js/icinga/behavior/collapsible.js @@ -94,7 +94,7 @@ var _this = event.data.self; var $collapsible = $(collapsiblePath); - if ($collapsible.length) { + if ($collapsible.length && $collapsible.is('.can-collapse')) { _this.expand($collapsible); } }; @@ -109,7 +109,7 @@ var _this = event.data.self; var $collapsible = $(collapsiblePath); - if ($collapsible.length) { + if ($collapsible.length && _this.canCollapse($collapsible)) { _this.collapse($collapsible); } }; From 2bf050f57d1512f6f197a1f472e8d594406e8233 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Wed, 10 Jul 2019 16:03:47 +0200 Subject: [PATCH 52/59] storage.js: Don't use the native event mechanism but a simple callback handling --- public/js/icinga/behavior/collapsible.js | 16 +++---- public/js/icinga/storage.js | 58 +++++++++++++++++------- 2 files changed, 49 insertions(+), 25 deletions(-) diff --git a/public/js/icinga/behavior/collapsible.js b/public/js/icinga/behavior/collapsible.js index 7f8962262..5c07edfff 100644 --- a/public/js/icinga/behavior/collapsible.js +++ b/public/js/icinga/behavior/collapsible.js @@ -26,8 +26,8 @@ Icinga.Storage.BehaviorStorage('collapsible'), 'expanded' ) - .on('add', { self: this }, this.onExternalExpansion) - .on('delete', { self: this }, this.onExternalCollapse); + .on('add', this.onExternalExpansion, this) + .on('delete', this.onExternalCollapse, this); }; Collapsible.prototype = new Icinga.EventListener(); @@ -90,12 +90,11 @@ * @param {Event} event * @param {string} collapsiblePath */ - Collapsible.prototype.onExternalExpansion = function(event, collapsiblePath) { - var _this = event.data.self; + Collapsible.prototype.onExternalExpansion = function(collapsiblePath) { var $collapsible = $(collapsiblePath); if ($collapsible.length && $collapsible.is('.can-collapse')) { - _this.expand($collapsible); + this.expand($collapsible); } }; @@ -105,12 +104,11 @@ * @param {Event} event * @param {string} collapsiblePath */ - Collapsible.prototype.onExternalCollapse = function(event, collapsiblePath) { - var _this = event.data.self; + Collapsible.prototype.onExternalCollapse = function(collapsiblePath) { var $collapsible = $(collapsiblePath); - if ($collapsible.length && _this.canCollapse($collapsible)) { - _this.collapse($collapsible); + if ($collapsible.length && this.canCollapse($collapsible)) { + this.collapse($collapsible); } }; diff --git a/public/js/icinga/storage.js b/public/js/icinga/storage.js index 8be8e68e5..2f991afcb 100644 --- a/public/js/icinga/storage.js +++ b/public/js/icinga/storage.js @@ -1,6 +1,6 @@ /*! Icinga Web 2 | (c) 2019 Icinga GmbH | GPLv2+ */ -(function (Icinga, $) { +;(function (Icinga) { 'use strict'; @@ -129,8 +129,6 @@ /** * Icinga.Storage.StorageAwareMap * - * Emits events `StorageAwareMapDelete` and `StorageAwareMapAdd` in case an update occurs in the storage. - * * @param {object} items * @constructor */ @@ -150,6 +148,16 @@ */ this.key = undefined; + /** + * Event listeners for our internal events + * + * @type {{}} + */ + this.eventListeners = { + 'add': [], + 'delete': [] + }; + /** * The internal (real) map * @@ -244,8 +252,9 @@ // Check for deletions first. Uses keys() to iterate over a copy this.keys().forEach(function (key) { if (newValue === null || typeof newValue[key] === 'undefined') { - $(window).trigger('StorageAwareMapDelete', [key, this.data.get(key)['value']]); + var value = this.data.get(key)['value']; this.data.delete(key); + this.trigger('delete', key, value); } }, this); @@ -260,7 +269,7 @@ this.data.set(key, newValue[key]); if (! known) { - $(window).trigger('StorageAwareMapAdd', [key, newValue[key]['value']]); + this.trigger('add', key, newValue[key]['value']); } }, this); }, @@ -268,25 +277,42 @@ /** * Register an event handler to handle storage updates * - * Available events are: add, delete. The handler receives the - * key and its value as second and third argument, respectively. + * Available events are: add, delete. The callback receives the + * key and its value as first and second argument, respectively. * * @param {string} event - * @param {object} data - * @param {function} handler + * @param {function} callback + * @param {object} thisArg * * @returns {this} */ - on: function(event, data, handler) { - $(window).on( - 'StorageAwareMap' + event.charAt(0).toUpperCase() + event.slice(1), - data, - handler - ); + on: function(event, callback, thisArg) { + if (typeof this.eventListeners[event] === 'undefined') { + throw new Error('Invalid event "' + event + '"'); + } + this.eventListeners[event].push([callback, thisArg]); return this; }, + /** + * Trigger all event handlers for the given event + * + * @param {string} event + * @param {string} key + * @param {*} value + */ + trigger: function(event, key, value) { + this.eventListeners[event].forEach(function (handler) { + var thisArg = handler[1]; + if (typeof thisArg === 'undefined') { + thisArg = this; + } + + handler[0].call(thisArg, key, value); + }); + }, + /** * Return the number of key/value pairs in the map * @@ -453,4 +479,4 @@ } }; -}(Icinga, jQuery)); +}(Icinga)); From 9561057b814f0b0befb3e04bc4c008790545815a Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Wed, 10 Jul 2019 16:12:04 +0200 Subject: [PATCH 53/59] storage.js: Allow to subscribe with multiple handlers to the same key --- public/js/icinga/storage.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/public/js/icinga/storage.js b/public/js/icinga/storage.js index 2f991afcb..b27af9f66 100644 --- a/public/js/icinga/storage.js +++ b/public/js/icinga/storage.js @@ -44,8 +44,9 @@ } if (typeof Icinga.Storage.subscribers[event.key] !== 'undefined') { - var subscriber = Icinga.Storage.subscribers[event.key]; - subscriber[0].call(subscriber[1], JSON.parse(event.newValue), JSON.parse(event.oldValue), event); + Icinga.Storage.subscribers[event.key].forEach(function (subscriber) { + subscriber[0].call(subscriber[1], JSON.parse(event.newValue), JSON.parse(event.oldValue), event); + }); } }); @@ -122,7 +123,13 @@ * @returns {void} */ onChange: function(key, callback, context) { - Icinga.Storage.subscribers[this.prefixKey(key)] = [callback, context]; + var prefixedKey = this.prefixKey(key); + + if (typeof Icinga.Storage.subscribers[prefixedKey] === 'undefined') { + Icinga.Storage.subscribers[prefixedKey] = []; + } + + Icinga.Storage.subscribers[prefixedKey].push([callback, context]); } }; From f11de266f466e9a4be5ccaaed952f1c24b0177ac Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Mon, 15 Jul 2019 13:31:01 +0200 Subject: [PATCH 54/59] storage.js: Avoid to call JSON.parse with an empty string IE11 seems not to like this.. --- public/js/icinga/storage.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/public/js/icinga/storage.js b/public/js/icinga/storage.js index b27af9f66..7693a791b 100644 --- a/public/js/icinga/storage.js +++ b/public/js/icinga/storage.js @@ -44,8 +44,17 @@ } if (typeof Icinga.Storage.subscribers[event.key] !== 'undefined') { + var newValue = null, + oldValue = null; + if (event.newValue.length) { + newValue = JSON.parse(event.newValue); + } + if (event.oldValue.length) { + oldValue = JSON.parse(event.oldValue); + } + Icinga.Storage.subscribers[event.key].forEach(function (subscriber) { - subscriber[0].call(subscriber[1], JSON.parse(event.newValue), JSON.parse(event.oldValue), event); + subscriber[0].call(subscriber[1], newValue, oldValue, event); }); } }); From 22805514843424f9040ed92af86691a053d2c463 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Mon, 15 Jul 2019 13:31:55 +0200 Subject: [PATCH 55/59] storage.js: Use substring instead of startsWith on strings IE11 doesn't support startsWith.. --- public/js/icinga/storage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/js/icinga/storage.js b/public/js/icinga/storage.js index 7693a791b..276b87eaf 100644 --- a/public/js/icinga/storage.js +++ b/public/js/icinga/storage.js @@ -37,7 +37,7 @@ */ window.addEventListener('storage', function(event) { var url = icinga.utils.parseUrl(event.url); - if (! url.path.startsWith(icinga.config.baseUrl)) { + if (! url.path.substring(0, icinga.config.baseUrl.length) === icinga.config.baseUrl) { // A localStorage is shared between all paths on the same origin. // So we need to make sure it's us who made a change. return; From c976eb48c96543f600d73544bc8ab3a5c1bafa0c Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Wed, 17 Jul 2019 11:22:46 +0200 Subject: [PATCH 56/59] storage.js: Properly handle invalid values --- public/js/icinga/storage.js | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/public/js/icinga/storage.js b/public/js/icinga/storage.js index 276b87eaf..1d0e374bb 100644 --- a/public/js/icinga/storage.js +++ b/public/js/icinga/storage.js @@ -46,11 +46,24 @@ if (typeof Icinga.Storage.subscribers[event.key] !== 'undefined') { var newValue = null, oldValue = null; - if (event.newValue.length) { - newValue = JSON.parse(event.newValue); + if (!! event.newValue) { + try { + newValue = JSON.parse(event.newValue); + } catch(error) { + icinga.logger.error('[Storage] Failed to parse new value (\`' + event.newValue + + '\`) for key "' + event.key + '". Error was: ' + error); + event.storageArea.removeItem(event.key); + return; + } } - if (event.oldValue.length) { - oldValue = JSON.parse(event.oldValue); + if (!! event.oldValue) { + try { + oldValue = JSON.parse(event.oldValue); + } catch(error) { + icinga.logger.warn('[Storage] Failed to parse old value (\`' + event.oldValue + + '\`) of key "' + event.key + '". Error was: ' + error); + oldValue = null; + } } Icinga.Storage.subscribers[event.key].forEach(function (subscriber) { @@ -108,7 +121,17 @@ * @returns {*} */ get: function(key) { - return JSON.parse(window.localStorage.getItem(this.prefixKey(key))); + key = this.prefixKey(key); + var value = window.localStorage.getItem(key); + + try { + return JSON.parse(value); + } catch(error) { + icinga.logger.error('[Storage] Failed to parse value (\`' + value + + '\`) of key "' + key + '". Error was: ' + error); + window.localStorage.removeItem(key); + return null; + } }, /** From 5c290e1b681a26383bbf919c68b501fc3949545b Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Wed, 17 Jul 2019 12:45:56 +0200 Subject: [PATCH 57/59] collapsible.js: Rename event callbacks `onExternalCollapse` => `onCollapse` `onExternalExpansion` => `onExpand` --- public/js/icinga/behavior/collapsible.js | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/public/js/icinga/behavior/collapsible.js b/public/js/icinga/behavior/collapsible.js index 5c07edfff..080e8beff 100644 --- a/public/js/icinga/behavior/collapsible.js +++ b/public/js/icinga/behavior/collapsible.js @@ -26,9 +26,10 @@ Icinga.Storage.BehaviorStorage('collapsible'), 'expanded' ) - .on('add', this.onExternalExpansion, this) - .on('delete', this.onExternalCollapse, this); + .on('add', this.onExpand, this) + .on('delete', this.onCollapse, this); }; + Collapsible.prototype = new Icinga.EventListener(); /** @@ -87,10 +88,9 @@ /** * A collapsible got expanded in another window, try to apply this here as well * - * @param {Event} event * @param {string} collapsiblePath */ - Collapsible.prototype.onExternalExpansion = function(collapsiblePath) { + Collapsible.prototype.onExpand = function(collapsiblePath) { var $collapsible = $(collapsiblePath); if ($collapsible.length && $collapsible.is('.can-collapse')) { @@ -101,10 +101,9 @@ /** * A collapsible got collapsed in another window, try to apply this here as well * - * @param {Event} event * @param {string} collapsiblePath */ - Collapsible.prototype.onExternalCollapse = function(collapsiblePath) { + Collapsible.prototype.onCollapse = function(collapsiblePath) { var $collapsible = $(collapsiblePath); if ($collapsible.length && this.canCollapse($collapsible)) { @@ -165,8 +164,8 @@ if (!! rowSelector) { return $(rowSelector, $collapsible).length > ($collapsible.data('visibleRows') || this.defaultVisibleRows); } else { - var actualHeight = $collapsible[0].scrollHeight, - maxHeight = $collapsible.data('visibleHeight') || this.defaultVisibleHeight; + var actualHeight = $collapsible[0].scrollHeight; + var maxHeight = $collapsible.data('visibleHeight') || this.defaultVisibleHeight; if (actualHeight <= maxHeight) { return false; From cfa3af51db3085aae8244763314247539eca44d9 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Wed, 17 Jul 2019 12:46:14 +0200 Subject: [PATCH 58/59] storage.js: Don't return in `StorageAwareMap.forEach` --- public/js/icinga/storage.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/js/icinga/storage.js b/public/js/icinga/storage.js index 1d0e374bb..6447a3a74 100644 --- a/public/js/icinga/storage.js +++ b/public/js/icinga/storage.js @@ -1,6 +1,6 @@ /*! Icinga Web 2 | (c) 2019 Icinga GmbH | GPLv2+ */ -;(function (Icinga) { +;(function(Icinga) { 'use strict'; @@ -434,7 +434,7 @@ thisArg = this; } - return this.data.forEach(function(value, key) { + this.data.forEach(function(value, key) { callback.call(thisArg, value['value'], key); }); }, From 8893db0cbcf3d6934e70dbea772628e77bb9bd0e Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Thu, 18 Jul 2019 07:43:42 +0200 Subject: [PATCH 59/59] js: Drop a StorageAwareMap entirely from storage if all keys expired --- public/js/icinga/storage.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/public/js/icinga/storage.js b/public/js/icinga/storage.js index 6447a3a74..d9df2c668 100644 --- a/public/js/icinga/storage.js +++ b/public/js/icinga/storage.js @@ -234,7 +234,12 @@ }, this); } - storage.set(key, items); + if (!! items && items.length) { + storage.set(key, items); + } else if(items !== null) { + storage.remove(key); + } + return (new Icinga.Storage.StorageAwareMap(items).setStorage(storage, key)); };