@openremote/or-app 1.8.0-snapshot.20250725074716 → 1.8.0-snapshot.20250725120000

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/or-header.js CHANGED
@@ -1,302 +1,500 @@
1
- var __decorate=this&&this.__decorate||function(e,r,o,t){var i,a=arguments.length,n=a<3?r:null===t?t=Object.getOwnPropertyDescriptor(r,o):t;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,r,o,t);else for(var l=e.length-1;l>=0;l--)(i=e[l])&&(n=(a<3?i(n):a>3?i(r,o,n):i(r,o))||n);return a>3&&n&&Object.defineProperty(r,o,n),n},__awaiter=this&&this.__awaiter||function(e,r,o,t){return new(o||(o=Promise))(function(i,a){function n(e){try{d(t.next(e))}catch(e){a(e)}}function l(e){try{d(t.throw(e))}catch(e){a(e)}}function d(e){var r;e.done?i(e.value):((r=e.value)instanceof o?r:new o(function(e){e(r)})).then(n,l)}d((t=t.apply(e,r||[])).next())})};import{css as e,html as r,LitElement as o,unsafeCSS as t}from"lit";import{customElement as i,property as a,query as n,state as l}from"lit/decorators.js";import d,{DefaultBoxShadowBottom as s,DefaultColor1 as c,DefaultColor2 as h,DefaultColor3 as p,DefaultColor4 as m,DefaultColor5 as u,DefaultHeaderHeight as v,Util as g,DEFAULT_LANGUAGES as b}from"@openremote/core";import"@openremote/or-mwc-components/or-mwc-dialog";import"@openremote/or-icon";import{getContentWithMenuTemplate as f}from"@openremote/or-mwc-components/or-mwc-menu";import{router as x,updateRealm as w}from"./index";import{i18next as _}from"@openremote/or-translate";function getHeaderMenuItems(e){return e.filter(hasRequiredRole).map(e=>({text:e.text,value:e.value?e.value:"",icon:e.icon,href:e.href}))}function hasRequiredRole(e){return!e.roles||(Array.isArray(e.roles)?e.roles.some(e=>d.hasRole(e)):g.isFunction(e.roles)?e.roles():Object.entries(e.roles).some(([e,r])=>r.some(r=>d.hasRole(r,e))))}function getCurrentMenuItemRef(e){return window.location.hash.substr(2).split("/")[0]||e}let OrHeader=class extends o{constructor(){super(...arguments),this._drawerOpened=!1,this.alarmButton="bell-outline",this.alarmColor="--or-app-color3, ${unsafeCSS(DefaultColor3)}"}static get styles(){return e`
2
-
3
- :host {
4
- --internal-or-header-color: var(--or-header-color, var(--or-app-color1, ${t(c)}));
5
- --internal-or-header-selected-color: var(--or-header-selected-color, var(--or-app-color4, ${t(m)}));
6
- --internal-or-header-text-color: var(--or-header-text-color, var(--or-app-color3, inherit));
7
- --internal-or-header-height: var(--or-header-height, ${t(v)});
8
- --internal-or-header-logo-margin: var(--or-header-logo-margin, 0 40px 0 0);
9
- --internal-or-header-logo-height: var(--or-header-logo-height, var(--internal-or-header-height, ${t(v)}));
10
- --internal-or-header-item-size: var(--or-header-item-size, calc(${t(v)} - 20px));
11
- --internal-or-header-drawer-color: var(--or-header-drawer-color, var(--or-app-color2, ${t(h)}));
12
- --internal-or-header-drawer-text-color: var(--or-header-drawer-text-color, var(--or-app-color3, ${t(p)}));
13
- --internal-or-header-drawer-item-size: var(--or-header-drawer-item-size, 30px);
14
- --internal-or-header-drawer-separator-color: var(--or-header-drawer-separator-color, var(--or-app-color5, ${t(u)}));
15
-
16
- display: block;
17
- z-index: 4;
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
8
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
9
+ return new (P || (P = Promise))(function (resolve, reject) {
10
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
11
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
12
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
13
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
14
+ });
15
+ };
16
+ import { css, html, LitElement, unsafeCSS } from "lit";
17
+ import { customElement, property, query, state } from "lit/decorators.js";
18
+ import manager, { DefaultBoxShadowBottom, DefaultColor1, DefaultColor2, DefaultColor3, DefaultColor4, DefaultColor5, DefaultHeaderHeight, Util, DEFAULT_LANGUAGES } from "@openremote/core";
19
+ import "@openremote/or-mwc-components/or-mwc-dialog";
20
+ import "@openremote/or-icon";
21
+ import { getContentWithMenuTemplate } from "@openremote/or-mwc-components/or-mwc-menu";
22
+ import { router, updateRealm } from "./index";
23
+ import { i18next } from "@openremote/or-translate";
24
+ export { DEFAULT_LANGUAGES };
25
+ function getHeaderMenuItems(items) {
26
+ return items.filter(hasRequiredRole).map((option) => {
27
+ return {
28
+ text: option.text,
29
+ value: option.value ? option.value : "",
30
+ icon: option.icon,
31
+ href: option.href
32
+ };
33
+ });
34
+ }
35
+ function hasRequiredRole(option) {
36
+ if (!option.roles) {
37
+ return true;
38
+ }
39
+ if (Array.isArray(option.roles)) {
40
+ return option.roles.some((r) => manager.hasRole(r));
41
+ }
42
+ if (Util.isFunction(option.roles)) {
43
+ return option.roles();
44
+ }
45
+ return Object.entries(option.roles).some(([client, roles]) => roles.some((r) => manager.hasRole(r, client)));
46
+ }
47
+ function getCurrentMenuItemRef(defaultRef) {
48
+ const menu = window.location.hash.substr(2).split("/")[0];
49
+ return menu || defaultRef;
50
+ }
51
+ let OrHeader = class OrHeader extends LitElement {
52
+ constructor() {
53
+ super(...arguments);
54
+ this._drawerOpened = false;
55
+ this.alarmButton = 'bell-outline';
56
+ this.alarmColor = '--or-app-color3, ${unsafeCSS(DefaultColor3)}';
57
+ }
58
+ // language=CSS
59
+ static get styles() {
60
+ return css `
61
+
62
+ :host {
63
+ --internal-or-header-color: var(--or-header-color, var(--or-app-color1, ${unsafeCSS(DefaultColor1)}));
64
+ --internal-or-header-selected-color: var(--or-header-selected-color, var(--or-app-color4, ${unsafeCSS(DefaultColor4)}));
65
+ --internal-or-header-text-color: var(--or-header-text-color, var(--or-app-color3, inherit));
66
+ --internal-or-header-height: var(--or-header-height, ${unsafeCSS(DefaultHeaderHeight)});
67
+ --internal-or-header-logo-margin: var(--or-header-logo-margin, 0 40px 0 0);
68
+ --internal-or-header-logo-height: var(--or-header-logo-height, var(--internal-or-header-height, ${unsafeCSS(DefaultHeaderHeight)}));
69
+ --internal-or-header-item-size: var(--or-header-item-size, calc(${unsafeCSS(DefaultHeaderHeight)} - 20px));
70
+ --internal-or-header-drawer-color: var(--or-header-drawer-color, var(--or-app-color2, ${unsafeCSS(DefaultColor2)}));
71
+ --internal-or-header-drawer-text-color: var(--or-header-drawer-text-color, var(--or-app-color3, ${unsafeCSS(DefaultColor3)}));
72
+ --internal-or-header-drawer-item-size: var(--or-header-drawer-item-size, 30px);
73
+ --internal-or-header-drawer-separator-color: var(--or-header-drawer-separator-color, var(--or-app-color5, ${unsafeCSS(DefaultColor5)}));
74
+
75
+ display: block;
76
+ z-index: 4;
77
+ }
78
+
79
+ #toolbar-top {
80
+ display: flex;
81
+ padding: 0;
82
+ }
83
+
84
+ #logo-mobile {
85
+ margin: 8px;
86
+ height: calc(var(--internal-or-header-logo-height) - 16px);
87
+ display: block;
88
+ }
89
+
90
+ #logo {
91
+ display: none;
92
+ }
93
+
94
+ #header {
95
+ opacity: 1;
96
+ width: 100%;
97
+ height: var(--internal-or-header-height);
98
+ text-align: center;
99
+ background-color: var(--internal-or-header-color);
100
+ color: var(--internal-or-header-text-color);
101
+ --or-icon-fill: var(--internal-or-header-text-color);
102
+ --or-icon-height: calc(var(--internal-or-header-item-size) - 12px);
103
+ --or-icon-width: calc(var(--internal-or-header-item-size) - 12px);
104
+ z-index: 9999999;
105
+ }
106
+
107
+ .shadow {
108
+ -webkit-box-shadow: ${unsafeCSS(DefaultBoxShadowBottom)};
109
+ -moz-box-shadow: ${unsafeCSS(DefaultBoxShadowBottom)};
110
+ box-shadow: ${unsafeCSS(DefaultBoxShadowBottom)};
111
+ }
112
+
113
+ #drawer {
114
+ width: 100%;
115
+ position: absolute;
116
+ top: var(--internal-or-header-height);
117
+ max-height: 0;
118
+ height: calc(100% - var(--internal-or-header-height));
119
+ transition: max-height 0.25s ease-out;
120
+ background: var(--internal-or-header-drawer-color);
121
+ color: var(--internal-or-header-drawer-text-color);
122
+ --or-icon-fill: var(--internal-or-header-drawer-text-color);
123
+ --or-icon-height: calc(var(--internal-or-header-drawer-item-size) - 10px);
124
+ --or-icon-width: calc(var(--internal-or-header-drawer-item-size) - 10px);
125
+ overflow: auto;
126
+ }
127
+
128
+ #drawer[opened] {
129
+ max-height: 10000px;
130
+ transition: max-height 0.75s ease-in;
131
+ }
132
+
133
+ #drawer > div {
134
+ box-sizing: border-box;
135
+ width: 100%;
136
+ height: 100%;
137
+ padding: 10px 0px;
138
+ position: relative;
139
+ }
140
+
141
+ .menu-btn {
142
+ background: none;
143
+ border: none;
144
+ cursor: pointer;
145
+ padding: 0 16px;
146
+ height: 100%;
147
+ }
148
+
149
+ #menu-btn-mobile {
150
+ display: flex;
151
+ margin-left: auto;
152
+ --or-icon-height: calc(var(--internal-or-header-item-size) - 8px);
153
+ --or-icon-width: calc(var(--internal-or-header-item-size) - 8px);
154
+ }
155
+
156
+ #menu-btn-mobile #realm-picker > span{
157
+ max-width: 70px;
158
+ text-overflow: ellipsis;
159
+ overflow: hidden;
160
+ white-space: nowrap;
161
+ }
162
+
163
+ #menu-btn-desktop {
164
+ display: none;
165
+ }
166
+
167
+ #desktop-right {
168
+ margin-left: auto;
169
+ padding-right: 10px;
170
+ display: none;
171
+ }
172
+
173
+ .mobile-bottom-border {
174
+ border-top: 1px solid var(--internal-or-header-drawer-separator-color);
175
+ margin-top: 16px;
176
+ padding-top: 8px;
177
+ }
178
+
179
+ .menu-item {
180
+ opacity: 0.7;
181
+ cursor: pointer;
182
+ text-decoration: none !important;
183
+ color: inherit;
184
+ padding: 0 20px;
185
+ font-size: 14px;
186
+ }
187
+
188
+ .menu-item:hover,
189
+ .menu-item[selected] {
190
+ opacity: 1;
191
+ }
192
+ #desktop-left .menu-item or-icon {
193
+ margin-right: 10px;
194
+ }
195
+ #desktop-left .menu-item {
196
+ display: none;
197
+ line-height: calc(var(--internal-or-header-height) - 4px);
198
+ }
199
+
200
+ #desktop-right .menu-item {
201
+ line-height: var(--internal-or-header-height);
202
+ }
203
+
204
+ #drawer .menu-item {
205
+ display: block;
206
+ line-height: var(--internal-or-header-drawer-item-size);
207
+ margin: 6px 0;
208
+ padding: 8px 16px;
209
+ }
210
+
211
+ #drawer .menu-item or-icon {
212
+ margin: 0 10px;
213
+ }
214
+
215
+ #desktop-left .menu-item[selected] {
216
+ display: inline-block;
217
+ line-height: var(--internal-or-header-height);
218
+ }
219
+
220
+ or-mwc-menu {
221
+ margin-right: 10px;
222
+ display: block;
223
+ }
224
+
225
+ .or-language-container {
226
+ display: flex;
227
+ height: 50px;
228
+ align-items: center;
229
+ }
230
+
231
+ #realm-picker {
232
+ position: relative;
233
+ display: flex;
234
+ height: 50px;
235
+ align-items: center;
236
+ cursor: pointer;
237
+ margin-left: 10px;
238
+ }
239
+
240
+ #realm-picker > span {
241
+ margin-right: 2px;
242
+ }
243
+
244
+ /* Wide layout: when the viewport width is bigger than 768px, layout
245
+ changes to a wide layout. */
246
+ @media (min-width: 768px) {
247
+ #menu-btn-desktop {
248
+ display: block;
249
+ }
250
+
251
+ #menu-btn-mobile {
252
+ display: none;
253
+ }
254
+
255
+ #drawer {
256
+ display: none;
257
+ }
258
+
259
+ #desktop-right {
260
+ display: flex;
261
+ }
262
+
263
+ #desktop-left .menu-item {
264
+ display: inline-block;
265
+ }
266
+
267
+ #desktop-left .menu-item or-icon {
268
+ display: none;
269
+ }
270
+
271
+ #desktop-left .menu-item[selected] {
272
+ border-bottom: 4px solid var(--internal-or-header-selected-color);
273
+ line-height: calc(var(--internal-or-header-height) - 4px);
274
+ }
275
+
276
+ #logo {
277
+ margin: var(--internal-or-header-logo-margin);
278
+ height: var(--internal-or-header-logo-height);
279
+ display: block;
280
+ }
281
+
282
+ #logo-mobile {
283
+ display: none;
284
+ }
285
+
286
+ #desktop-left ::slotted(*) {
287
+ display: inline-block;
288
+ }
289
+
290
+ #desktop-left ::slotted(*[selected]) {
291
+ border-bottom: 4px solid var(--internal-or-header-selected-color);
292
+ line-height: calc(var(--internal-or-header-height) - 4px);
293
+ }
294
+ }
295
+
296
+ @media (min-width: 1024px) {
297
+
298
+
299
+ #desktop-left .menu-item or-icon{
300
+ display: inline-block;
301
+ }
302
+ }
303
+ `;
304
+ }
305
+ _onRealmSelect(realm) {
306
+ this.store.dispatch(updateRealm(realm));
307
+ }
308
+ shouldUpdate(changedProperties) {
309
+ if (changedProperties.has("config")) {
310
+ this.activeMenu = getCurrentMenuItemRef(this.config && this.config.mainMenu && this.config.mainMenu.length > 0 ? this.config.mainMenu[0].href : undefined);
311
+ }
312
+ if (changedProperties.has("realm")) {
313
+ this._getAlarmButton();
314
+ }
315
+ return super.shouldUpdate(changedProperties);
316
+ }
317
+ connectedCallback() {
318
+ super.connectedCallback();
319
+ this._subscribeEvents();
320
+ }
321
+ disconnectedCallback() {
322
+ super.disconnectedCallback();
323
+ this._unsubscribeEvents();
324
+ }
325
+ _subscribeEvents() {
326
+ return __awaiter(this, void 0, void 0, function* () {
327
+ if (manager.events) {
328
+ this._eventSubscriptionId = yield manager.events.subscribe({
329
+ eventType: "alarm"
330
+ }, (ev) => this._getAlarmButton());
18
331
  }
19
-
20
- #toolbar-top {
21
- display: flex;
22
- padding: 0;
332
+ });
333
+ }
334
+ _unsubscribeEvents() {
335
+ if (this._eventSubscriptionId) {
336
+ manager.events.unsubscribe(this._eventSubscriptionId);
337
+ this._eventSubscriptionId = undefined;
338
+ }
339
+ }
340
+ render() {
341
+ if (!this.config) {
342
+ return html ``;
343
+ }
344
+ const mainItems = this.config.mainMenu;
345
+ const secondaryItems = this.config.secondaryMenu;
346
+ return html `
347
+ <!-- Header -->
348
+ <div id="header" class="shadow">
349
+ <div id="toolbar-top">
350
+ <div><img id="logo" src="${this.logo}" /><img id="logo-mobile" src="${this.logoMobile}" /></div>
351
+
352
+ <!-- This gets hidden on a small screen-->
353
+ <nav id="toolbar-list">
354
+ <div id="desktop-left">
355
+ ${mainItems ? mainItems.filter(hasRequiredRole).map((headerItem) => {
356
+ return html `
357
+ <a class="menu-item" @click="${(e) => this._onHeaderItemSelect(headerItem)}" ?selected="${this.activeMenu === headerItem.href}"><or-icon icon="${headerItem.icon}"></or-icon><or-translate value="${headerItem.text}"></or-translate></a>
358
+ `;
359
+ }) : ``}
360
+ </div>
361
+ </nav>
362
+ <div id="desktop-right">
363
+ <div id="alarm-btn">
364
+ <a class="menu-item" @click="${(e) => router.navigate('alarms')}">
365
+ <or-icon icon="${this.alarmButton}" style="color:var(${this.alarmColor})" title="${i18next.t("alarm.alarm_plural")}"></or-icon>
366
+ </a>
367
+ </div>
368
+ ${this._getRealmMenu((value) => this._onRealmSelect(value))}
369
+ ${secondaryItems ? getContentWithMenuTemplate(html `
370
+ <button id="menu-btn-desktop" class="menu-btn" title="Menu"><or-icon icon="dots-vertical"></or-icon></button>
371
+ `, getHeaderMenuItems(secondaryItems), undefined, (value) => this._onSecondaryMenuSelect(value)) : ``}
372
+ </div>
373
+ <div id="menu-btn-mobile">
374
+ ${this._getRealmMenu((value) => this._onRealmSelect(value))}
375
+ <button id="menu-btn" class="menu-btn" title="Menu" @click="${this._toggleDrawer}"><or-icon icon="${this._drawerOpened ? "close" : "menu"}"></or-icon></button>
376
+ </div>
377
+ </div>
378
+ </div>
379
+ <div id="drawer" ?opened="${this._drawerOpened}" @click="${this._closeDrawer}">
380
+ <div>
381
+ <div id="mobile-top">
382
+ <nav id="drawer-list">
383
+ ${mainItems ? mainItems.filter((option) => !option.hideMobile && hasRequiredRole(option)).map((headerItem) => {
384
+ return html `
385
+ <a class="menu-item" @click="${(e) => this._onHeaderItemSelect(headerItem)}" ?selected="${this.activeMenu === headerItem.href}"><or-icon icon="${headerItem.icon}"></or-icon><or-translate value="${headerItem.text}"></or-translate></a>
386
+ `;
387
+ }) : ``}
388
+ </nav>
389
+ </div>
390
+
391
+ ${secondaryItems ? html `
392
+ <div id="mobile-bottom" class="${mainItems.length > 0 ? 'mobile-bottom-border' : ''}">
393
+ ${secondaryItems.filter((option) => !option.hideMobile && hasRequiredRole(option)).map((headerItem) => {
394
+ return html `
395
+ <a class="menu-item" @click="${(e) => this._onHeaderItemSelect(headerItem)}" ?selected="${this.activeMenu === headerItem.href}"><or-icon icon="${headerItem.icon}"></or-icon><or-translate value="${headerItem.text}"></or-translate></a>
396
+ `;
397
+ })}
398
+ </div>` : ``}
399
+ </div>
400
+ </div>
401
+ `;
402
+ }
403
+ _getRealmMenu(callback) {
404
+ const currentRealm = this.realms.find((t) => t.name === this.realm);
405
+ let realmTemplate = html `
406
+ <div id="realm-picker">
407
+ ${this.realms.length > 1 ? html `
408
+ <span>${currentRealm ? currentRealm.displayName : ""}</span>
409
+ <or-icon icon="chevron-down"></or-icon>
410
+ ` : ``}
411
+ </div>
412
+ `;
413
+ if (manager.isSuperUser()) {
414
+ const menuItems = this.realms.map((r) => {
415
+ return {
416
+ text: r.displayName,
417
+ value: r.name
418
+ };
419
+ });
420
+ realmTemplate = html `
421
+ ${getContentWithMenuTemplate(realmTemplate, menuItems, currentRealm ? currentRealm.name : undefined, (value) => callback(value))}
422
+ `;
423
+ }
424
+ return realmTemplate;
425
+ }
426
+ _getAlarmButton() {
427
+ return __awaiter(this, void 0, void 0, function* () {
428
+ let newAlarms = false;
429
+ if (manager.hasRole("read:alarms") || manager.hasRole("read:admin")) {
430
+ const response = yield manager.rest.api.AlarmResource.getAlarms({ realm: manager.displayRealm, status: "OPEN" /* Model.AlarmStatus.OPEN */ });
431
+ newAlarms = response.data.length > 0;
23
432
  }
24
-
25
- #logo-mobile {
26
- margin: 8px;
27
- height: calc(var(--internal-or-header-logo-height) - 16px);
28
- display: block;
433
+ this.alarmButton = newAlarms ? 'bell-badge-outline' : 'bell-outline';
434
+ this.alarmColor = newAlarms ? '--or-app-color4, ${unsafeCSS(DefaultColor4)}' : '--or-app-color3, ${unsafeCSS(DefaultColor3)}';
435
+ });
436
+ }
437
+ _onSecondaryMenuSelect(value) {
438
+ const headerItem = this.config.secondaryMenu.find((item) => item.value === value);
439
+ if (headerItem) {
440
+ this._onHeaderItemSelect(headerItem);
441
+ }
442
+ }
443
+ _onHeaderItemSelect(headerItem) {
444
+ if (headerItem.action) {
445
+ headerItem.action();
446
+ }
447
+ else if (headerItem.href) {
448
+ if (headerItem.absolute) {
449
+ window.location.href = headerItem.href;
29
450
  }
30
-
31
- #logo {
32
- display: none;
451
+ else {
452
+ router.navigate(headerItem.href);
33
453
  }
34
-
35
- #header {
36
- opacity: 1;
37
- width: 100%;
38
- height: var(--internal-or-header-height);
39
- text-align: center;
40
- background-color: var(--internal-or-header-color);
41
- color: var(--internal-or-header-text-color);
42
- --or-icon-fill: var(--internal-or-header-text-color);
43
- --or-icon-height: calc(var(--internal-or-header-item-size) - 12px);
44
- --or-icon-width: calc(var(--internal-or-header-item-size) - 12px);
45
- z-index: 9999999;
46
- }
47
-
48
- .shadow {
49
- -webkit-box-shadow: ${t(s)};
50
- -moz-box-shadow: ${t(s)};
51
- box-shadow: ${t(s)};
52
- }
53
-
54
- #drawer {
55
- width: 100%;
56
- position: absolute;
57
- top: var(--internal-or-header-height);
58
- max-height: 0;
59
- height: calc(100% - var(--internal-or-header-height));
60
- transition: max-height 0.25s ease-out;
61
- background: var(--internal-or-header-drawer-color);
62
- color: var(--internal-or-header-drawer-text-color);
63
- --or-icon-fill: var(--internal-or-header-drawer-text-color);
64
- --or-icon-height: calc(var(--internal-or-header-drawer-item-size) - 10px);
65
- --or-icon-width: calc(var(--internal-or-header-drawer-item-size) - 10px);
66
- overflow: auto;
67
- }
68
-
69
- #drawer[opened] {
70
- max-height: 10000px;
71
- transition: max-height 0.75s ease-in;
72
- }
73
-
74
- #drawer > div {
75
- box-sizing: border-box;
76
- width: 100%;
77
- height: 100%;
78
- padding: 10px 0px;
79
- position: relative;
80
- }
81
-
82
- .menu-btn {
83
- background: none;
84
- border: none;
85
- cursor: pointer;
86
- padding: 0 16px;
87
- height: 100%;
88
- }
89
-
90
- #menu-btn-mobile {
91
- display: flex;
92
- margin-left: auto;
93
- --or-icon-height: calc(var(--internal-or-header-item-size) - 8px);
94
- --or-icon-width: calc(var(--internal-or-header-item-size) - 8px);
95
- }
96
-
97
- #menu-btn-mobile #realm-picker > span{
98
- max-width: 70px;
99
- text-overflow: ellipsis;
100
- overflow: hidden;
101
- white-space: nowrap;
102
- }
103
-
104
- #menu-btn-desktop {
105
- display: none;
106
- }
107
-
108
- #desktop-right {
109
- margin-left: auto;
110
- padding-right: 10px;
111
- display: none;
112
- }
113
-
114
- .mobile-bottom-border {
115
- border-top: 1px solid var(--internal-or-header-drawer-separator-color);
116
- margin-top: 16px;
117
- padding-top: 8px;
118
- }
119
-
120
- .menu-item {
121
- opacity: 0.7;
122
- cursor: pointer;
123
- text-decoration: none !important;
124
- color: inherit;
125
- padding: 0 20px;
126
- font-size: 14px;
127
- }
128
-
129
- .menu-item:hover,
130
- .menu-item[selected] {
131
- opacity: 1;
132
- }
133
- #desktop-left .menu-item or-icon {
134
- margin-right: 10px;
135
- }
136
- #desktop-left .menu-item {
137
- display: none;
138
- line-height: calc(var(--internal-or-header-height) - 4px);
139
- }
140
-
141
- #desktop-right .menu-item {
142
- line-height: var(--internal-or-header-height);
143
- }
144
-
145
- #drawer .menu-item {
146
- display: block;
147
- line-height: var(--internal-or-header-drawer-item-size);
148
- margin: 6px 0;
149
- padding: 8px 16px;
150
- }
151
-
152
- #drawer .menu-item or-icon {
153
- margin: 0 10px;
154
- }
155
-
156
- #desktop-left .menu-item[selected] {
157
- display: inline-block;
158
- line-height: var(--internal-or-header-height);
159
- }
160
-
161
- or-mwc-menu {
162
- margin-right: 10px;
163
- display: block;
164
- }
165
-
166
- .or-language-container {
167
- display: flex;
168
- height: 50px;
169
- align-items: center;
170
- }
171
-
172
- #realm-picker {
173
- position: relative;
174
- display: flex;
175
- height: 50px;
176
- align-items: center;
177
- cursor: pointer;
178
- margin-left: 10px;
179
- }
180
-
181
- #realm-picker > span {
182
- margin-right: 2px;
183
- }
184
-
185
- /* Wide layout: when the viewport width is bigger than 768px, layout
186
- changes to a wide layout. */
187
- @media (min-width: 768px) {
188
- #menu-btn-desktop {
189
- display: block;
190
- }
191
-
192
- #menu-btn-mobile {
193
- display: none;
194
- }
195
-
196
- #drawer {
197
- display: none;
198
- }
199
-
200
- #desktop-right {
201
- display: flex;
202
- }
203
-
204
- #desktop-left .menu-item {
205
- display: inline-block;
206
- }
207
-
208
- #desktop-left .menu-item or-icon {
209
- display: none;
210
- }
211
-
212
- #desktop-left .menu-item[selected] {
213
- border-bottom: 4px solid var(--internal-or-header-selected-color);
214
- line-height: calc(var(--internal-or-header-height) - 4px);
215
- }
216
-
217
- #logo {
218
- margin: var(--internal-or-header-logo-margin);
219
- height: var(--internal-or-header-logo-height);
220
- display: block;
221
- }
222
-
223
- #logo-mobile {
224
- display: none;
225
- }
226
-
227
- #desktop-left ::slotted(*) {
228
- display: inline-block;
229
- }
230
-
231
- #desktop-left ::slotted(*[selected]) {
232
- border-bottom: 4px solid var(--internal-or-header-selected-color);
233
- line-height: calc(var(--internal-or-header-height) - 4px);
234
- }
235
- }
236
-
237
- @media (min-width: 1024px) {
238
-
239
-
240
- #desktop-left .menu-item or-icon{
241
- display: inline-block;
242
- }
243
- }
244
- `}_onRealmSelect(e){this.store.dispatch(w(e))}shouldUpdate(e){return e.has("config")&&(this.activeMenu=getCurrentMenuItemRef(this.config&&this.config.mainMenu&&this.config.mainMenu.length>0?this.config.mainMenu[0].href:void 0)),e.has("realm")&&this._getAlarmButton(),super.shouldUpdate(e)}connectedCallback(){super.connectedCallback(),this._subscribeEvents()}disconnectedCallback(){super.disconnectedCallback(),this._unsubscribeEvents()}_subscribeEvents(){return __awaiter(this,void 0,void 0,function*(){d.events&&(this._eventSubscriptionId=yield d.events.subscribe({eventType:"alarm"},e=>this._getAlarmButton()))})}_unsubscribeEvents(){this._eventSubscriptionId&&(d.events.unsubscribe(this._eventSubscriptionId),this._eventSubscriptionId=void 0)}render(){if(!this.config)return r``;let e=this.config.mainMenu,o=this.config.secondaryMenu;return r`
245
- <!-- Header -->
246
- <div id="header" class="shadow">
247
- <div id="toolbar-top">
248
- <div><img id="logo" src="${this.logo}" /><img id="logo-mobile" src="${this.logoMobile}" /></div>
249
-
250
- <!-- This gets hidden on a small screen-->
251
- <nav id="toolbar-list">
252
- <div id="desktop-left">
253
- ${e?e.filter(hasRequiredRole).map(e=>r`
254
- <a class="menu-item" @click="${r=>this._onHeaderItemSelect(e)}" ?selected="${this.activeMenu===e.href}"><or-icon icon="${e.icon}"></or-icon><or-translate value="${e.text}"></or-translate></a>
255
- `):""}
256
- </div>
257
- </nav>
258
- <div id="desktop-right">
259
- <div id="alarm-btn">
260
- <a class="menu-item" @click="${e=>x.navigate("alarms")}">
261
- <or-icon icon="${this.alarmButton}" style="color:var(${this.alarmColor})" title="${_.t("alarm.alarm_plural")}"></or-icon>
262
- </a>
263
- </div>
264
- ${this._getRealmMenu(e=>this._onRealmSelect(e))}
265
- ${o?f(r`
266
- <button id="menu-btn-desktop" class="menu-btn" title="Menu"><or-icon icon="dots-vertical"></or-icon></button>
267
- `,getHeaderMenuItems(o),void 0,e=>this._onSecondaryMenuSelect(e)):""}
268
- </div>
269
- <div id="menu-btn-mobile">
270
- ${this._getRealmMenu(e=>this._onRealmSelect(e))}
271
- <button id="menu-btn" class="menu-btn" title="Menu" @click="${this._toggleDrawer}"><or-icon icon="${this._drawerOpened?"close":"menu"}"></or-icon></button>
272
- </div>
273
- </div>
274
- </div>
275
- <div id="drawer" ?opened="${this._drawerOpened}" @click="${this._closeDrawer}">
276
- <div>
277
- <div id="mobile-top">
278
- <nav id="drawer-list">
279
- ${e?e.filter(e=>!e.hideMobile&&hasRequiredRole(e)).map(e=>r`
280
- <a class="menu-item" @click="${r=>this._onHeaderItemSelect(e)}" ?selected="${this.activeMenu===e.href}"><or-icon icon="${e.icon}"></or-icon><or-translate value="${e.text}"></or-translate></a>
281
- `):""}
282
- </nav>
283
- </div>
284
-
285
- ${o?r`
286
- <div id="mobile-bottom" class="${e.length>0?"mobile-bottom-border":""}">
287
- ${o.filter(e=>!e.hideMobile&&hasRequiredRole(e)).map(e=>r`
288
- <a class="menu-item" @click="${r=>this._onHeaderItemSelect(e)}" ?selected="${this.activeMenu===e.href}"><or-icon icon="${e.icon}"></or-icon><or-translate value="${e.text}"></or-translate></a>
289
- `)}
290
- </div>`:""}
291
- </div>
292
- </div>
293
- `}_getRealmMenu(e){let o=this.realms.find(e=>e.name===this.realm),t=r`
294
- <div id="realm-picker">
295
- ${this.realms.length>1?r`
296
- <span>${o?o.displayName:""}</span>
297
- <or-icon icon="chevron-down"></or-icon>
298
- `:""}
299
- </div>
300
- `;if(d.isSuperUser()){let i=this.realms.map(e=>({text:e.displayName,value:e.name}));t=r`
301
- ${f(t,i,o?o.name:void 0,r=>e(r))}
302
- `}return t}_getAlarmButton(){return __awaiter(this,void 0,void 0,function*(){let e=!1;(d.hasRole("read:alarms")||d.hasRole("read:admin"))&&(e=(yield d.rest.api.AlarmResource.getAlarms({realm:d.displayRealm,status:"OPEN"})).data.length>0),this.alarmButton=e?"bell-badge-outline":"bell-outline",this.alarmColor=e?"--or-app-color4, ${unsafeCSS(DefaultColor4)}":"--or-app-color3, ${unsafeCSS(DefaultColor3)}"})}_onSecondaryMenuSelect(e){let r=this.config.secondaryMenu.find(r=>r.value===e);r&&this._onHeaderItemSelect(r)}_onHeaderItemSelect(e){e.action?e.action():e.href&&(e.absolute?window.location.href=e.href:x.navigate(e.href))}_closeDrawer(){this._drawerOpened=!1}_toggleDrawer(){this._drawerOpened=!this._drawerOpened}};__decorate([a({type:Array})],OrHeader.prototype,"realms",void 0),__decorate([a({type:String})],OrHeader.prototype,"realm",void 0),__decorate([a({type:Object})],OrHeader.prototype,"store",void 0),__decorate([a({type:String})],OrHeader.prototype,"logo",void 0),__decorate([a({type:String})],OrHeader.prototype,"logoMobile",void 0),__decorate([a({type:Object})],OrHeader.prototype,"config",void 0),__decorate([n("div[id=mobile-bottom]")],OrHeader.prototype,"_mobileBottomDiv",void 0),__decorate([a()],OrHeader.prototype,"activeMenu",void 0),__decorate([l()],OrHeader.prototype,"_drawerOpened",void 0),__decorate([l()],OrHeader.prototype,"alarmButton",void 0),__decorate([l()],OrHeader.prototype,"alarmColor",void 0),OrHeader=__decorate([i("or-header")],OrHeader);export{b as DEFAULT_LANGUAGES,OrHeader};
454
+ }
455
+ }
456
+ _closeDrawer() {
457
+ this._drawerOpened = false;
458
+ }
459
+ _toggleDrawer() {
460
+ this._drawerOpened = !this._drawerOpened;
461
+ }
462
+ };
463
+ __decorate([
464
+ property({ type: Array })
465
+ ], OrHeader.prototype, "realms", void 0);
466
+ __decorate([
467
+ property({ type: String })
468
+ ], OrHeader.prototype, "realm", void 0);
469
+ __decorate([
470
+ property({ type: Object })
471
+ ], OrHeader.prototype, "store", void 0);
472
+ __decorate([
473
+ property({ type: String })
474
+ ], OrHeader.prototype, "logo", void 0);
475
+ __decorate([
476
+ property({ type: String })
477
+ ], OrHeader.prototype, "logoMobile", void 0);
478
+ __decorate([
479
+ property({ type: Object })
480
+ ], OrHeader.prototype, "config", void 0);
481
+ __decorate([
482
+ query("div[id=mobile-bottom]")
483
+ ], OrHeader.prototype, "_mobileBottomDiv", void 0);
484
+ __decorate([
485
+ property()
486
+ ], OrHeader.prototype, "activeMenu", void 0);
487
+ __decorate([
488
+ state()
489
+ ], OrHeader.prototype, "_drawerOpened", void 0);
490
+ __decorate([
491
+ state()
492
+ ], OrHeader.prototype, "alarmButton", void 0);
493
+ __decorate([
494
+ state()
495
+ ], OrHeader.prototype, "alarmColor", void 0);
496
+ OrHeader = __decorate([
497
+ customElement("or-header")
498
+ ], OrHeader);
499
+ export { OrHeader };
500
+ //# sourceMappingURL=or-header.js.map