@openremote/or-dashboard-builder 1.2.0-snapshot.20240512154942

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.
Files changed (146) hide show
  1. package/README.md +156 -0
  2. package/build.gradle +15 -0
  3. package/lib/controls/dashboard-refresh-controls.d.ts +17 -0
  4. package/lib/controls/dashboard-refresh-controls.js +17 -0
  5. package/lib/controls/dashboard-refresh-controls.js.map +1 -0
  6. package/lib/index.d.ts +71 -0
  7. package/lib/index.js +285 -0
  8. package/lib/index.js.map +1 -0
  9. package/lib/or-dashboard-boardsettings.d.ts +19 -0
  10. package/lib/or-dashboard-boardsettings.js +121 -0
  11. package/lib/or-dashboard-boardsettings.js.map +1 -0
  12. package/lib/or-dashboard-browser.d.ts +9 -0
  13. package/lib/or-dashboard-browser.js +35 -0
  14. package/lib/or-dashboard-browser.js.map +1 -0
  15. package/lib/or-dashboard-engine.d.ts +4 -0
  16. package/lib/or-dashboard-engine.js +1 -0
  17. package/lib/or-dashboard-engine.js.map +1 -0
  18. package/lib/or-dashboard-keyhandler.d.ts +6 -0
  19. package/lib/or-dashboard-keyhandler.js +1 -0
  20. package/lib/or-dashboard-keyhandler.js.map +1 -0
  21. package/lib/or-dashboard-preview.d.ts +70 -0
  22. package/lib/or-dashboard-preview.js +155 -0
  23. package/lib/or-dashboard-preview.js.map +1 -0
  24. package/lib/or-dashboard-tree.d.ts +25 -0
  25. package/lib/or-dashboard-tree.js +62 -0
  26. package/lib/or-dashboard-tree.js.map +1 -0
  27. package/lib/or-dashboard-widgetcontainer.d.ts +23 -0
  28. package/lib/or-dashboard-widgetcontainer.js +20 -0
  29. package/lib/or-dashboard-widgetcontainer.js.map +1 -0
  30. package/lib/or-dashboard-widgetsettings.d.ts +15 -0
  31. package/lib/or-dashboard-widgetsettings.js +16 -0
  32. package/lib/or-dashboard-widgetsettings.js.map +1 -0
  33. package/lib/panels/assettypes-panel.d.ts +44 -0
  34. package/lib/panels/assettypes-panel.js +51 -0
  35. package/lib/panels/assettypes-panel.js.map +1 -0
  36. package/lib/panels/attributes-panel.d.ts +41 -0
  37. package/lib/panels/attributes-panel.js +126 -0
  38. package/lib/panels/attributes-panel.js.map +1 -0
  39. package/lib/panels/thresholds-panel.d.ts +39 -0
  40. package/lib/panels/thresholds-panel.js +129 -0
  41. package/lib/panels/thresholds-panel.js.map +1 -0
  42. package/lib/service/dashboard-service.d.ts +13 -0
  43. package/lib/service/dashboard-service.js +1 -0
  44. package/lib/service/dashboard-service.js.map +1 -0
  45. package/lib/service/widget-service.d.ts +8 -0
  46. package/lib/service/widget-service.js +1 -0
  47. package/lib/service/widget-service.js.map +1 -0
  48. package/lib/settings/attribute-input-settings.d.ts +13 -0
  49. package/lib/settings/attribute-input-settings.js +36 -0
  50. package/lib/settings/attribute-input-settings.js.map +1 -0
  51. package/lib/settings/chart-settings.d.ts +30 -0
  52. package/lib/settings/chart-settings.js +144 -0
  53. package/lib/settings/chart-settings.js.map +1 -0
  54. package/lib/settings/gauge-settings.d.ts +15 -0
  55. package/lib/settings/gauge-settings.js +37 -0
  56. package/lib/settings/gauge-settings.js.map +1 -0
  57. package/lib/settings/image-settings.d.ts +17 -0
  58. package/lib/settings/image-settings.js +52 -0
  59. package/lib/settings/image-settings.js.map +1 -0
  60. package/lib/settings/kpi-settings.d.ts +15 -0
  61. package/lib/settings/kpi-settings.js +47 -0
  62. package/lib/settings/kpi-settings.js.map +1 -0
  63. package/lib/settings/map-settings.d.ts +21 -0
  64. package/lib/settings/map-settings.js +72 -0
  65. package/lib/settings/map-settings.js.map +1 -0
  66. package/lib/settings/table-settings.d.ts +14 -0
  67. package/lib/settings/table-settings.js +33 -0
  68. package/lib/settings/table-settings.js.map +1 -0
  69. package/lib/style.d.ts +1 -0
  70. package/lib/style.js +99 -0
  71. package/lib/style.js.map +1 -0
  72. package/lib/util/or-asset-widget.d.ts +20 -0
  73. package/lib/util/or-asset-widget.js +1 -0
  74. package/lib/util/or-asset-widget.js.map +1 -0
  75. package/lib/util/or-widget.d.ts +31 -0
  76. package/lib/util/or-widget.js +1 -0
  77. package/lib/util/or-widget.js.map +1 -0
  78. package/lib/util/settings-panel.d.ts +9 -0
  79. package/lib/util/settings-panel.js +56 -0
  80. package/lib/util/settings-panel.js.map +1 -0
  81. package/lib/util/widget-config.d.ts +2 -0
  82. package/lib/util/widget-config.js +1 -0
  83. package/lib/util/widget-config.js.map +1 -0
  84. package/lib/util/widget-settings.d.ts +23 -0
  85. package/lib/util/widget-settings.js +1 -0
  86. package/lib/util/widget-settings.js.map +1 -0
  87. package/lib/widgets/attribute-input-widget.d.ts +24 -0
  88. package/lib/widgets/attribute-input-widget.js +31 -0
  89. package/lib/widgets/attribute-input-widget.js.map +1 -0
  90. package/lib/widgets/chart-widget.d.ts +25 -0
  91. package/lib/widgets/chart-widget.js +15 -0
  92. package/lib/widgets/chart-widget.js.map +1 -0
  93. package/lib/widgets/gauge-widget.d.ts +22 -0
  94. package/lib/widgets/gauge-widget.js +12 -0
  95. package/lib/widgets/gauge-widget.js.map +1 -0
  96. package/lib/widgets/image-widget.d.ts +25 -0
  97. package/lib/widgets/image-widget.js +54 -0
  98. package/lib/widgets/image-widget.js.map +1 -0
  99. package/lib/widgets/kpi-widget.d.ts +21 -0
  100. package/lib/widgets/kpi-widget.js +8 -0
  101. package/lib/widgets/kpi-widget.js.map +1 -0
  102. package/lib/widgets/map-widget.d.ts +39 -0
  103. package/lib/widgets/map-widget.js +9 -0
  104. package/lib/widgets/map-widget.js.map +1 -0
  105. package/lib/widgets/table-widget.d.ts +25 -0
  106. package/lib/widgets/table-widget.js +12 -0
  107. package/lib/widgets/table-widget.js.map +1 -0
  108. package/package.json +32 -0
  109. package/src/controls/dashboard-refresh-controls.ts +100 -0
  110. package/src/index.ts +731 -0
  111. package/src/or-dashboard-boardsettings.ts +249 -0
  112. package/src/or-dashboard-browser.ts +160 -0
  113. package/src/or-dashboard-engine.ts +17 -0
  114. package/src/or-dashboard-keyhandler.ts +25 -0
  115. package/src/or-dashboard-preview.ts +713 -0
  116. package/src/or-dashboard-tree.ts +304 -0
  117. package/src/or-dashboard-widgetcontainer.ts +155 -0
  118. package/src/or-dashboard-widgetsettings.ts +91 -0
  119. package/src/panels/assettypes-panel.ts +311 -0
  120. package/src/panels/attributes-panel.ts +304 -0
  121. package/src/panels/thresholds-panel.ts +285 -0
  122. package/src/service/dashboard-service.ts +89 -0
  123. package/src/service/widget-service.ts +48 -0
  124. package/src/settings/attribute-input-settings.ts +79 -0
  125. package/src/settings/chart-settings.ts +306 -0
  126. package/src/settings/gauge-settings.ts +93 -0
  127. package/src/settings/image-settings.ts +175 -0
  128. package/src/settings/kpi-settings.ts +106 -0
  129. package/src/settings/map-settings.ts +185 -0
  130. package/src/settings/table-settings.ts +92 -0
  131. package/src/style.ts +104 -0
  132. package/src/util/or-asset-widget.ts +110 -0
  133. package/src/util/or-widget.ts +60 -0
  134. package/src/util/settings-panel.ts +93 -0
  135. package/src/util/widget-config.ts +2 -0
  136. package/src/util/widget-settings.ts +58 -0
  137. package/src/widgets/attribute-input-widget.ts +143 -0
  138. package/src/widgets/chart-widget.ts +203 -0
  139. package/src/widgets/gauge-widget.ts +111 -0
  140. package/src/widgets/image-widget.ts +180 -0
  141. package/src/widgets/kpi-widget.ts +97 -0
  142. package/src/widgets/map-widget.ts +187 -0
  143. package/src/widgets/table-widget.ts +157 -0
  144. package/tsconfig.json +15 -0
  145. package/tsconfig.tsbuildinfo +1 -0
  146. package/webpack.config.js +10 -0
package/README.md ADDED
@@ -0,0 +1,156 @@
1
+ # or-dashboard-builder
2
+ ### All-in-one bundle for creating dashboards with OpenRemote data.
3
+
4
+ This component is the core of the Insights page on our OpenRemote manager,<br />
5
+ where users can build dashboards with widgets, for monitoring their assets in their preferred way.<br />
6
+ It is quite an extensive piece of code, so some apps using this (such as or standalone Insights app)<br />
7
+ might not need the full package.<br />
8
+ <br />
9
+ It is structured to support the additions of custom widgets, whereof a short tutorial is shown below.
10
+
11
+
12
+ ---
13
+
14
+ ## Install
15
+ ```bash
16
+ npm i @openremote/or-dashboard-builder
17
+ yarn add @openremote/or-dashboard-builder
18
+ ```
19
+
20
+
21
+
22
+ ## Terminology:
23
+
24
+ To be clear about what all functionalities are meant for, we created a list of terms used within `or-dashboard-builder`.
25
+ Here it is:
26
+
27
+ | Term | Definition |
28
+ |---------------|--------------------------------------------------------------------------------------------------------------------------------------------------|
29
+ | **Dashboard** | The board / area that contains widgets. (stored in database) |
30
+ | **Widget** | The object on the dashboard that contains information like content (stored in database) |
31
+ | *WidgetContainer* | Wrapper that displays widget content, header, and its actions |
32
+ | *WidgetSettings* | The available settings to customise WidgetConfig,
33
+ | **Insights** | 'The showcase term' we use for the page in our Manager App. We also have an "Insights app" that is a standalone app for viewing your dashboards. |
34
+
35
+ <br/>
36
+
37
+ Here is an overview of all elements used:
38
+
39
+ | HTML Tag | Description |
40
+ |----------------------------|----------------------------------------------------------------------------------|
41
+ | or-dashboard-builder | Contains the layout of the full dashboard builder. Keeps track of state as well. |
42
+ | or-dashboard-preview | Manages grid, and the widgets loaded onto it. |
43
+ | or-dashboard-browser | Lists widget(s) in cards that can be dragged onto `or-dashboard-preview` |
44
+ | or-dashboard-tree | Lists dashboards |
45
+ | or-dashboard-boardsettings | Managing dashboard settings |
46
+ | or-dashboard-widgetsettings | Wrapper that displays settings of the selected widget (`or-widget-settings`)
47
+ | or-widget-container | Manages the loaded widget in that container |
48
+ | or-widget-settings | Loads and saves widget settings based on the selected widget. |
49
+
50
+ *or-dashboard-engine is a logic class to inject in Gridstack for overriding grid behavior.*<br />
51
+ *or-dashboard-keyhandler is used to handle keystrokes from the user*
52
+ <br />
53
+ <br />
54
+
55
+ ## Creating your own Widget
56
+
57
+ Add your widget manifest to the `registerWidgetTypes()` function in `index.ts`.<br />
58
+ This will register the widget, and handle all functions automatically.
59
+ ```typescript
60
+ export function registerWidgetTypes() {
61
+ widgetTypes.set("linechart", ChartWidget.getManifest());
62
+ widgetTypes.set("gauge", GaugeWidget.getManifest());
63
+ ...
64
+ // add here
65
+ }
66
+ ```
67
+
68
+ From there, you can add your custom class to the `/widgets` folder and build your HTMLElements.<br />
69
+ It is **required** to inherit from `or-widget`, *(or an extended class of it such as or-asset-widget)*<br />
70
+ and your custom config should extend on `WidgetConfig`<br />
71
+ <br />
72
+
73
+
74
+ ### Example of a custom Widget
75
+
76
+ Here is a code example of how to create custom widgets.<br />
77
+ Feel free to copy, put it in seperate files, and adjust it to your needs.<br />
78
+ Looking into our existing widgets also helps understanding the codebase.
79
+
80
+ ```typescript
81
+ import {CustomWidgetConfig} from "./custom-widget";
82
+
83
+ export interface CustomWidgetConfig extends WidgetConfig {
84
+ attributeRefs: AttributeRef[];
85
+ customFieldOne: string;
86
+ customFieldTwo: number;
87
+ }
88
+
89
+ function getDefaultWidgetConfig(): CustomWidgetConfig {
90
+ return {
91
+ attributeRefs: [],
92
+ customFieldOne: "default text",
93
+ customFieldTwo: 0
94
+ };
95
+ }
96
+
97
+ @customElement("custom-widget")
98
+ export class CustomWidget extends OrWidget {
99
+
100
+ // Override of widgetConfig with extended type
101
+ protected readonly widgetConfig!: CustomWidgetConfig;
102
+
103
+ static getManifest(): WidgetManifest {
104
+ return {
105
+ displayName: "Custom widget", // name to display in widget browser
106
+ displayIcon: "gauge", // icon to display in widget browser. Uses <or-icon> and https://materialdesignicons.com
107
+ minColumnWidth: 1,
108
+ minColumnHeight: 1,
109
+ getContentHtml(config: CustomWidgetConfig): OrWidget {
110
+ return new CustomWidget(config);
111
+ },
112
+ getSettingsHtml(config: CustomWidgetConfig): WidgetSettings {
113
+ return new CustomSettings(config);
114
+ },
115
+ getDefaultConfig(): CustomWidgetConfig {
116
+ return getDefaultWidgetConfig();
117
+ }
118
+ }
119
+ }
120
+
121
+ public refreshContent(force: boolean) {
122
+ // function that executes on refresh of the widget.
123
+ // It's normally a 'silent' function that, for example, fetches the data of assets again.
124
+ }
125
+
126
+ protected render(): TemplateResult {
127
+ return html`
128
+ <span>Custom field one: </span>
129
+ <span>${this.widgetConfig.customFieldOne}</span>
130
+ `;
131
+ }
132
+
133
+ }
134
+
135
+ // Settings element
136
+ // This can be placed in a seperate file if preferred.
137
+ @customElement("custom-settings")
138
+ export class CustomSettings extends WidgetSettings {
139
+
140
+ // Override of widgetConfig with extended type
141
+ protected readonly widgetConfig!: CustomWidgetConfig;
142
+
143
+ protected render(): TemplateResult {
144
+ return html`
145
+ <span>Custom settings</span>
146
+ <button @click="${() => this.onButtonClick()}">Click to customize text</button>
147
+ `;
148
+ }
149
+
150
+ protected onButtonClick() {
151
+ this.widgetConfig.customFieldOne = "custom text";
152
+ this.notifyConfigUpdate();
153
+ }
154
+ }
155
+
156
+ ```
package/build.gradle ADDED
@@ -0,0 +1,15 @@
1
+ buildDir = "dist"
2
+
3
+ task clean() {
4
+ doLast {
5
+ delete "dist"
6
+ }
7
+ }
8
+
9
+ task prepareUi() {
10
+ dependsOn clean, npmPrepare
11
+ }
12
+
13
+ task publishUi() {
14
+ dependsOn clean, npmPublish
15
+ }
@@ -0,0 +1,17 @@
1
+ import { LitElement, PropertyValues, TemplateResult } from "lit";
2
+ import { DashboardRefreshInterval } from "@openremote/model";
3
+ export declare function intervalToMillis(interval: DashboardRefreshInterval): number | undefined;
4
+ export declare class IntervalSelectEvent extends CustomEvent<DashboardRefreshInterval> {
5
+ static readonly NAME = "interval-select";
6
+ constructor(interval: DashboardRefreshInterval);
7
+ }
8
+ export declare class DashboardRefreshControls extends LitElement {
9
+ protected interval: DashboardRefreshInterval;
10
+ protected readonly: boolean;
11
+ protected intervalOptions: DashboardRefreshInterval[];
12
+ protected willUpdate(changedProps: PropertyValues): void;
13
+ protected render(): TemplateResult;
14
+ protected onIntervalSelect(stringOptions: string[], value: string): void;
15
+ protected getIntervalString(interval: DashboardRefreshInterval): string;
16
+ protected getRefreshOptions(): string[];
17
+ }
@@ -0,0 +1,17 @@
1
+ var __decorate=this&&this.__decorate||function(e,t,r,n){var o,i=arguments.length,s=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,n);else for(var l=e.length-1;l>=0;l--)(o=e[l])&&(s=(i<3?o(s):i>3?o(t,r,s):o(t,r))||s);return i>3&&s&&Object.defineProperty(t,r,s),s};import{InputType}from"@openremote/or-mwc-components/or-mwc-input";import{getContentWithMenuTemplate}from"@openremote/or-mwc-components/or-mwc-menu";import{html,LitElement}from"lit";import{customElement,property}from"lit/decorators.js";import{when}from"lit/directives/when.js";export function intervalToMillis(e){switch(e){case"OFF":default:return;case"ONE_MIN":return 6e4;case"FIVE_MIN":return 3e5;case"QUARTER":return 9e5;case"ONE_HOUR":return 36e5}}export class IntervalSelectEvent extends CustomEvent{constructor(e){super(IntervalSelectEvent.NAME,{bubbles:!0,composed:!0,detail:e})}}IntervalSelectEvent.NAME="interval-select";let DashboardRefreshControls=class extends LitElement{constructor(){super(...arguments),this.interval="OFF",this.readonly=!0,this.intervalOptions=["OFF","ONE_MIN","FIVE_MIN","QUARTER","ONE_HOUR"]}willUpdate(e){super.willUpdate(e),e.has("interval")&&void 0!==this.interval&&this.dispatchEvent(new IntervalSelectEvent(this.interval))}render(){const e=this.getRefreshOptions(),t=this.getIntervalString(this.interval);return html`
2
+ <div style="height: 100%; display: flex; align-items: center;">
3
+ ${when(this.readonly,(()=>html`
4
+ ${when("OFF"===this.interval,(()=>html`
5
+ <or-mwc-input .type="${InputType.BUTTON}" icon="pause" disabled="true" style="height: 36px; margin-top: -12px;"></or-mwc-input>
6
+ `),(()=>html`
7
+ <or-mwc-input .type="${InputType.BUTTON}" label="${t}" disabled="true"></or-mwc-input>
8
+ `))}
9
+ `),(()=>html`
10
+ ${getContentWithMenuTemplate("OFF"===this.interval?html`
11
+ <or-mwc-input .type="${InputType.BUTTON}" icon="pause" style="height: 36px; margin-top: -12px;"></or-mwc-input>
12
+ `:html`
13
+ <or-mwc-input .type="${InputType.BUTTON}" label="${t}"></or-mwc-input>
14
+ `,e.map((e=>({value:e}))),t,(t=>this.onIntervalSelect(e,t)),void 0,!1,!0,!0)}
15
+ `))}
16
+ </div>
17
+ `}onIntervalSelect(e,t){this.interval=this.intervalOptions[e.indexOf(t)]}getIntervalString(e){return`dashboard.interval.${e.toLowerCase()}`}getRefreshOptions(){return this.intervalOptions.map((e=>this.getIntervalString(e)))}};__decorate([property()],DashboardRefreshControls.prototype,"interval",void 0),__decorate([property()],DashboardRefreshControls.prototype,"readonly",void 0),DashboardRefreshControls=__decorate([customElement("dashboard-refresh-controls")],DashboardRefreshControls);export{DashboardRefreshControls};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-refresh-controls.js","sourceRoot":"","sources":["../../src/controls/dashboard-refresh-controls.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,4CAA4C,CAAC;AAErE,OAAO,EAAC,0BAA0B,EAAC,MAAM,2CAA2C,CAAC;AACrF,OAAO,EAAC,IAAI,EAAE,UAAU,EAAiC,MAAM,KAAK,CAAC;AACrE,OAAO,EAAC,aAAa,EAAE,QAAQ,EAAC,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAC,IAAI,EAAC,MAAM,wBAAwB,CAAC;AAG5C,MAAM,UAAU,gBAAgB,CAAC,QAAkC;IAC/D,QAAQ,QAAQ,EAAE,CAAC;QACf;YACI,OAAO,SAAS,CAAC;QACrB;YACI,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QACvB;YACI,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC3B;YACI,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC5B;YACI,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC5B;YACI,OAAO,SAAS,CAAC;IACzB,CAAC;AACL,CAAC;AAED,MAAM,OAAO,mBAAoB,SAAQ,WAAqC;IAI1E,YAAY,QAAkC;QAC1C,KAAK,CAAC,mBAAmB,CAAC,IAAI,EAAE;YAC5B,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,QAAQ;SACnB,CAAC,CAAC;IACP,CAAC;;AARsB,wBAAI,GAAG,iBAAiB,CAAC;AAY7C,IAAM,wBAAwB,GAA9B,MAAM,wBAAyB,SAAQ,UAAU;IAAjD;;QAGO,aAAQ,4CAA0D;QAGlE,aAAQ,GAAG,IAAI,CAAC;QAE1B,+HAA+H;QACrH,oBAAe,GAAG,sPAAwK,CAAA;IAmDxM,CAAC;IAjDa,UAAU,CAAC,YAA4B;QAC7C,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAC/B,IAAI,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC9D,IAAI,CAAC,aAAa,CAAC,IAAI,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/D,CAAC;IACL,CAAC;IAES,MAAM;QACZ,MAAM,eAAe,GAAa,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpD,OAAO,IAAI,CAAA;;kBAED,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAA;sBAC1B,IAAI,CAAC,IAAI,CAAC,QAAQ,6CAAiC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAA;+CACtC,SAAS,CAAC,MAAM;qBAC1C,EAAE,GAAG,EAAE,CAAC,IAAI,CAAA;+CACc,SAAS,CAAC,MAAM,YAAY,KAAK;qBAC3D,CAAC;iBACL,EAAE,GAAG,EAAE,CAAC,IAAI,CAAA;sBACP,0BAA0B,CACpB,IAAI,CAAC,QAAQ,6CAAiC,CAAC,CAAC,CAAC,IAAI,CAAA;uDAC1B,SAAS,CAAC,MAAM;6BAC1C,CAAC,CAAC,CAAC,IAAI,CAAA;uDACmB,SAAS,CAAC,MAAM,YAAY,KAAK;6BAC3D,EACD,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,KAAK,EAAE,CAAC,EAAc,CAAA,CAAC,EAClD,KAAK,EACL,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,eAAe,EAAE,MAAgB,CAAC,EACpE,SAAS,EACT,KAAK,EACL,IAAI,EACJ,IAAI,CACX;iBACJ,CAAC;;SAET,CAAC;IACN,CAAC;IAES,gBAAgB,CAAC,aAAuB,EAAE,KAAa;QAC7D,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,OAAO,CAAC,KAAiC,CAAC,CAAC,CAAC;IACnG,CAAC;IAES,iBAAiB,CAAC,QAAkC;QAC1D,OAAO,CAAC,sBAAsB,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC5D,CAAC;IAES,iBAAiB;QACvB,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClF,CAAC;CACJ,CAAA;AAzDa;IADT,QAAQ,EAAE;0DACiE;AAGlE;IADT,QAAQ,EAAE;0DACe;AANjB,wBAAwB;IADpC,aAAa,CAAC,4BAA4B,CAAC;GAC/B,wBAAwB,CA4DpC"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,71 @@
1
+ import { LitElement, PropertyValues } from "lit";
2
+ import "./or-dashboard-tree";
3
+ import "./or-dashboard-browser";
4
+ import "./or-dashboard-preview";
5
+ import "./or-dashboard-widgetsettings";
6
+ import "./or-dashboard-boardsettings";
7
+ import "./controls/dashboard-refresh-controls";
8
+ import "@openremote/or-icon";
9
+ import { Dashboard, DashboardAccess, DashboardRefreshInterval, DashboardScalingPreset, DashboardScreenPreset, DashboardTemplate, DashboardWidget } from "@openremote/model";
10
+ import "@openremote/or-mwc-components/or-mwc-tabs";
11
+ import { OrDashboardPreview } from "./or-dashboard-preview";
12
+ import { WidgetManifest } from "./util/or-widget";
13
+ import { IntervalSelectEvent } from "./controls/dashboard-refresh-controls";
14
+ export interface DashboardBuilderConfig {
15
+ }
16
+ export declare const MAX_BREAKPOINT = 1000000;
17
+ export declare function scalingPresetToString(scalingPreset: DashboardScalingPreset | undefined): string;
18
+ export declare function dashboardAccessToString(access: DashboardAccess): string;
19
+ export declare function sortScreenPresets(presets: DashboardScreenPreset[], largetosmall?: boolean): DashboardScreenPreset[];
20
+ export declare function getActivePreset(gridWidth: number, presets: DashboardScreenPreset[]): DashboardScreenPreset | undefined;
21
+ export declare const widgetTypes: Map<string, WidgetManifest>;
22
+ export declare function registerWidgetTypes(): void;
23
+ export declare class OrDashboardBuilder extends LitElement {
24
+ static get styles(): import("lit").CSSResult[];
25
+ protected readonly config: DashboardBuilderConfig | undefined;
26
+ protected readonly editMode: boolean;
27
+ protected readonly fullscreen: boolean;
28
+ protected readonly selectedId: string | undefined;
29
+ protected realm: string;
30
+ protected readonly userId: string;
31
+ protected readonly readonly: boolean;
32
+ protected dashboards: Dashboard[] | undefined;
33
+ protected currentTemplate: DashboardTemplate | undefined;
34
+ protected selectedDashboard: Dashboard | undefined;
35
+ protected selectedWidgetId: string | undefined;
36
+ protected initialDashboardJSON: string | undefined;
37
+ protected initialTemplateJSON: string | undefined;
38
+ protected refreshInterval: DashboardRefreshInterval;
39
+ protected isInitializing: boolean;
40
+ protected isLoading: boolean;
41
+ protected hasChanged: boolean;
42
+ protected dashboardPreview?: OrDashboardPreview;
43
+ protected refreshTimer?: ReturnType<typeof setInterval>;
44
+ private readonly keyEmitter;
45
+ constructor();
46
+ connectedCallback(): void;
47
+ disconnectedCallback(): void;
48
+ willUpdate(changedProps: PropertyValues): void;
49
+ protected setRefreshTimer(millis: number | undefined): void;
50
+ protected clearRefreshTimer(): void;
51
+ loadAllDashboards(realm: string): Promise<void>;
52
+ updated(changedProperties: Map<string, any>): void;
53
+ protected onWidgetCreation(widget: DashboardWidget): void;
54
+ deleteWidget(widget: DashboardWidget): void;
55
+ selectWidget(widget: DashboardWidget): void;
56
+ deselectWidget(): void;
57
+ selectDashboard(dashboard: Dashboard | undefined): void;
58
+ changeDashboardName(value: string): void;
59
+ openDashboardInInsights(): void;
60
+ shareUrl(method: string): void;
61
+ saveDashboard(): void;
62
+ protected _isReadonly(): boolean;
63
+ protected _hasEditAccess(): boolean;
64
+ protected _hasViewAccess(): boolean;
65
+ protected sidebarMenuIndex: number;
66
+ protected showDashboardTree: boolean;
67
+ private readonly menuItems;
68
+ private readonly tabItems;
69
+ render(): any;
70
+ protected onIntervalSelect(ev: IntervalSelectEvent): void;
71
+ }
package/lib/index.js ADDED
@@ -0,0 +1,285 @@
1
+ var __decorate=this&&this.__decorate||function(e,t,i,s){var r,d=arguments.length,a=d<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,i,s);else for(var o=e.length-1;o>=0;o--)(r=e[o])&&(a=(d<3?r(a):d>3?r(t,i,a):r(t,i))||a);return d>3&&a&&Object.defineProperty(t,i,a),a},__awaiter=this&&this.__awaiter||function(e,t,i,s){return new(i||(i=Promise))((function(r,d){function a(e){try{l(s.next(e))}catch(e){d(e)}}function o(e){try{l(s.throw(e))}catch(e){d(e)}}function l(e){var t;e.done?r(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(a,o)}l((s=s.apply(e,t||[])).next())}))};import{css,html,LitElement,unsafeCSS}from"lit";import{customElement,property,query,state}from"lit/decorators.js";import{when}from"lit/directives/when.js";import{styleMap}from"lit/directives/style-map.js";import"./or-dashboard-tree";import"./or-dashboard-browser";import"./or-dashboard-preview";import"./or-dashboard-widgetsettings";import"./or-dashboard-boardsettings";import"./controls/dashboard-refresh-controls";import{InputType}from"@openremote/or-mwc-components/or-mwc-input";import"@openremote/or-icon";import{style}from"./style";import manager,{DefaultColor1,DefaultColor3,DefaultColor5,Util}from"@openremote/core";import"@openremote/or-mwc-components/or-mwc-tabs";import{showSnackbar}from"@openremote/or-mwc-components/or-mwc-snackbar";import{i18next}from"@openremote/or-translate";import{showOkCancelDialog}from"@openremote/or-mwc-components/or-mwc-dialog";import{DashboardKeyEmitter}from"./or-dashboard-keyhandler";import{ChartWidget}from"./widgets/chart-widget";import{GaugeWidget}from"./widgets/gauge-widget";import{intervalToMillis}from"./controls/dashboard-refresh-controls";import{ImageWidget}from"./widgets/image-widget";import{KpiWidget}from"./widgets/kpi-widget";import{MapWidget}from"./widgets/map-widget";import{AttributeInputWidget}from"./widgets/attribute-input-widget";import{TableWidget}from"./widgets/table-widget";const styling=css`
2
+
3
+ @media only screen and (min-width: 641px){
4
+ #tree {
5
+ min-width: 300px !important;
6
+ }
7
+ }
8
+ @media only screen and (max-width: 641px) {
9
+ #tree {
10
+ flex: 1 !important;
11
+ }
12
+ #builder {
13
+ max-height: inherit !important;
14
+ }
15
+ }
16
+
17
+ #tree {
18
+ flex: 0;
19
+ align-items: stretch;
20
+ z-index: 1;
21
+ box-shadow: rgb(0 0 0 / 21%) 0px 1px 3px 0px;
22
+ }
23
+
24
+ /* Header related styling */
25
+ #header {
26
+ background: var(--or-app-color1, ${unsafeCSS(DefaultColor1)});
27
+ }
28
+ #header-wrapper {
29
+ padding: 14px 30px;
30
+ display: flex;
31
+ flex-direction: row;
32
+ align-items: center;
33
+ border-bottom: 1px solid ${unsafeCSS(DefaultColor5)};
34
+ }
35
+ #header-title {
36
+ font-size: 18px;
37
+ }
38
+ #header-title > or-icon {
39
+ margin-right: 10px;
40
+ }
41
+ #header-actions {
42
+ flex: 1 1 auto;
43
+ text-align: right;
44
+ }
45
+ #header-actions-content {
46
+ display: flex;
47
+ flex-direction: row;
48
+ align-items: center;
49
+ float: right;
50
+ }
51
+
52
+ /* Header related styling */
53
+ @media screen and (max-width: 700px) {
54
+ #fullscreen-header-wrapper {
55
+ padding: 11px !important;
56
+ }
57
+ }
58
+ #fullscreen-header-wrapper {
59
+ min-height: 36px;
60
+ padding: 20px 30px 15px;
61
+ display: flex;
62
+ flex-direction: row;
63
+ align-items: center;
64
+ }
65
+ #fullscreen-header-title {
66
+ font-size: 18px;
67
+ font-weight: bold;
68
+ color: var(--or-app-color3, ${unsafeCSS(DefaultColor3)});
69
+ }
70
+ #fullscreen-header-title > or-mwc-input {
71
+ margin-right: 4px;
72
+ --or-icon-fill: ${unsafeCSS(DefaultColor3)};
73
+ }
74
+ #fullscreen-header-actions {
75
+ flex: 1 1 auto;
76
+ text-align: right;
77
+ }
78
+ #fullscreen-header-actions-content {
79
+ display: flex;
80
+ flex-direction: row;
81
+ align-items: center;
82
+ float: right;
83
+ }
84
+
85
+ /* ----------------------------- */
86
+ /* Editor/builder related styling */
87
+ #builder {
88
+ flex: 1 0 auto;
89
+ height: 100%;
90
+ }
91
+
92
+ /* ----------------------------- */
93
+ /* Sidebar related styling (drag and drop widgets / configuration) */
94
+ #sidebar {
95
+ vertical-align: top;
96
+ position: relative;
97
+ width: 300px;
98
+ background: white;
99
+ border-left: 1px solid ${unsafeCSS(DefaultColor5)};
100
+ }
101
+ #sidebar-widget-headeractions {
102
+ flex: 0;
103
+ display: flex;
104
+ flex-direction: row;
105
+ padding-right: 5px;
106
+ }
107
+ .settings-container {
108
+ display: flex;
109
+ flex-direction: column;
110
+ height: 100%;
111
+ }
112
+ #browser {
113
+ flex-grow: 1;
114
+ align-items: stretch;
115
+ z-index: 1;
116
+ max-width: 300px;
117
+ }
118
+
119
+ #save-btn { margin-left: 15px; }
120
+ #view-btn { margin-left: 18px; }
121
+
122
+ .small-btn {
123
+ height: 36px;
124
+ margin-top: -12px;
125
+ }
126
+
127
+ .hidescroll {
128
+ -ms-overflow-style: none; /* for Internet Explorer, Edge */
129
+ scrollbar-width: none; /* for Firefox */
130
+ }
131
+ .hidescroll::-webkit-scrollbar {
132
+ display: none; /* for Chrome, Safari, and Opera */
133
+ }
134
+ `;export const MAX_BREAKPOINT=1e6;export function scalingPresetToString(e){return null!=e?i18next.t("dashboard.presets."+e.toLowerCase()):"undefined"}export function dashboardAccessToString(e){return i18next.t("dashboard.access."+e.toLowerCase())}export function sortScreenPresets(e,t=!1){return e.sort(((e,i)=>{if(null!=e.breakpoint&&null!=i.breakpoint){if(e.breakpoint>i.breakpoint)return t?1:-1;if(e.breakpoint<i.breakpoint)return t?1:-1}return 0}))}export function getActivePreset(e,t){let i;return sortScreenPresets(t,!0).forEach((t=>{null!=t.breakpoint&&e<=t.breakpoint&&(i=t)})),i}export const widgetTypes=new Map;export function registerWidgetTypes(){widgetTypes.set("linechart",ChartWidget.getManifest()),widgetTypes.set("gauge",GaugeWidget.getManifest()),widgetTypes.set("image",ImageWidget.getManifest()),widgetTypes.set("kpi",KpiWidget.getManifest()),widgetTypes.set("map",MapWidget.getManifest()),widgetTypes.set("attributeinput",AttributeInputWidget.getManifest()),widgetTypes.set("table",TableWidget.getManifest())}let OrDashboardBuilder=class extends LitElement{static get styles(){return[styling,style]}constructor(){super(),this.editMode=!1,this.fullscreen=!0,this.realm=manager.displayRealm,this.readonly=!0,this.refreshInterval="OFF",this.keyEmitter=new DashboardKeyEmitter,this.sidebarMenuIndex=0,this.showDashboardTree=!0,this.menuItems=[{icon:"content-copy",text:i18next.t("copy")+" URL",value:"copy"},{icon:"open-in-new",text:i18next.t("dashboard.openInNewTab"),value:"tab"}],this.tabItems=[{name:i18next.t("dashboard.widgets")},{name:i18next.t("settings")}],this.isInitializing=!0,this.isLoading=!0,this.hasChanged=!1,registerWidgetTypes(),this.updateComplete.then((()=>{this.loadAllDashboards(this.realm)}))}connectedCallback(){super.connectedCallback(),this.keyEmitter.addListener("delete",(e=>{var t,i,s;if(this.selectedWidgetId){const e=null===(s=null===(i=null===(t=this.selectedDashboard)||void 0===t?void 0:t.template)||void 0===i?void 0:i.widgets)||void 0===s?void 0:s.find((e=>e.id==this.selectedWidgetId));e&&showOkCancelDialog(i18next.t("areYouSure"),i18next.t("dashboard.deleteWidgetWarning"),i18next.t("delete")).then((t=>{t&&this.deleteWidget(e)}))}})),this.keyEmitter.addListener("deselect",(e=>{this.deselectWidget()})),this.keyEmitter.addListener("save",(e=>{this.saveDashboard()}))}disconnectedCallback(){super.disconnectedCallback(),this.keyEmitter.removeAllListeners()}willUpdate(e){var t,i,s;if(super.willUpdate(e),this.isLoading=null==this.dashboards,this.isInitializing=null==this.dashboards,1!==e.size||!e.has("selectedWidget")){const e=Util.objectsEqual(this.selectedDashboard,this.initialDashboardJSON?JSON.parse(this.initialDashboardJSON):void 0),t=Util.objectsEqual(this.currentTemplate,this.initialTemplateJSON?JSON.parse(this.initialTemplateJSON):void 0);this.hasChanged=!e||!t}e.has("realm")&&void 0!==e.get("realm")&&this.realm&&this.loadAllDashboards(this.realm),e.has("selectedDashboard")&&(this.deselectWidget(),this.currentTemplate=null===(t=this.selectedDashboard)||void 0===t?void 0:t.template,this.editMode||(this.refreshInterval=(null===(i=this.currentTemplate)||void 0===i?void 0:i.refreshInterval)||"OFF",e.set("refreshInterval",this.refreshInterval)),this.dispatchEvent(new CustomEvent("selected",{detail:this.selectedDashboard}))),e.has("editMode")&&(this.deselectWidget(),this.refreshInterval="OFF",this.showDashboardTree=!0,this.editMode?this.refreshInterval="OFF":this.refreshInterval=(null===(s=this.currentTemplate)||void 0===s?void 0:s.refreshInterval)||"OFF",e.set("refreshInterval",this.refreshInterval)),e.has("refreshInterval")&&this.refreshInterval&&this.setRefreshTimer(intervalToMillis(this.refreshInterval))}setRefreshTimer(e){this.clearRefreshTimer(),void 0!==e&&(this.refreshTimer=setInterval((()=>{var e;this.deselectWidget(),null===(e=this.dashboardPreview)||void 0===e||e.refreshWidgets()}),e))}clearRefreshTimer(){this.refreshTimer&&(clearInterval(this.refreshTimer),this.refreshTimer=void 0)}loadAllDashboards(e){var t;return __awaiter(this,void 0,void 0,(function*(){yield manager.rest.api.DashboardResource.getAllRealmDashboards(e).then((e=>{this.dashboards=e.data})).catch((e=>{showSnackbar(void 0,"errorOccurred"),console.error(e)})),void 0!==this.selectedId&&(this.selectedDashboard=null===(t=this.dashboards)||void 0===t?void 0:t.find((e=>e.id==this.selectedId)))}))}updated(e){super.updated(e),e.has("currentTemplate")&&null!=this.selectedDashboard&&(this.selectedDashboard.template=this.currentTemplate)}onWidgetCreation(e){const t=JSON.parse(JSON.stringify(this.currentTemplate));t.widgets||(t.widgets=[]),t.widgets.push(e),this.currentTemplate=t}deleteWidget(e){var t;if(null!=this.currentTemplate&&null!=this.currentTemplate.widgets){const i=this.currentTemplate;i.widgets=null===(t=i.widgets)||void 0===t?void 0:t.filter((t=>t.id!=e.id)),this.currentTemplate=i}this.selectedWidgetId===e.id&&this.deselectWidget()}selectWidget(e){var t,i;const s=null===(i=null===(t=this.currentTemplate)||void 0===t?void 0:t.widgets)||void 0===i?void 0:i.find((t=>{var i,s;return(null===(i=t.gridItem)||void 0===i?void 0:i.id)==(null===(s=e.gridItem)||void 0===s?void 0:s.id)}));null!=s?this.selectedWidgetId=s.id:console.error("The selected widget does not exist!")}deselectWidget(){this.selectedWidgetId=void 0}selectDashboard(e){var t;if(null!=this.dashboards){if(this.selectedDashboard&&this.initialDashboardJSON){const e=this.dashboards.indexOf(this.selectedDashboard);e&&(this.dashboards[e]=JSON.parse(this.initialDashboardJSON))}this.selectedDashboard=e?this.dashboards.find((t=>t.id==e.id)):void 0,this.initialDashboardJSON=JSON.stringify(this.selectedDashboard),this.initialTemplateJSON=JSON.stringify(null===(t=this.selectedDashboard)||void 0===t?void 0:t.template)}}changeDashboardName(e){null!=this.selectedDashboard&&(this.selectedDashboard.displayName=e,this.requestUpdate("selectedDashboard"))}openDashboardInInsights(){var e;if(null!=this.selectedDashboard){const t=window.location.origin+"/insights/?realm="+manager.displayRealm+"#/view/"+this.selectedDashboard.id+"/true/";null===(e=window.open(t))||void 0===e||e.focus()}}shareUrl(e){var t;let i=window.location.href.replace("true","false");"copy"==e?navigator.clipboard.writeText(i):"tab"==e&&(null===(t=window.open(i,"_blank"))||void 0===t||t.focus())}saveDashboard(){null!=this.selectedDashboard&&!this._isReadonly()&&this._hasEditAccess()?(this.isLoading=!0,manager.rest.api.DashboardResource.update(this.selectedDashboard).then((()=>{var e;null!=this.dashboards&&null!=this.selectedDashboard&&(this.initialDashboardJSON=JSON.stringify(this.selectedDashboard),this.initialTemplateJSON=JSON.stringify(this.selectedDashboard.template),this.dashboards[null===(e=this.dashboards)||void 0===e?void 0:e.indexOf(this.selectedDashboard)]=this.selectedDashboard,this.currentTemplate=Object.assign({},this.selectedDashboard.template),showSnackbar(void 0,"dashboard.saveSuccessful"))})).catch((e=>{console.error(e),showSnackbar(void 0,"errorOccurred")})).finally((()=>{this.isLoading=!1}))):(console.error("The selected dashboard could not be found.."),showSnackbar(void 0,"errorOccurred"))}_isReadonly(){return this.readonly||!manager.hasRole("write:insights")}_hasEditAccess(){var e,t;return null!=this.userId&&("PRIVATE"!=(null===(e=this.selectedDashboard)||void 0===e?void 0:e.editAccess)||(null===(t=this.selectedDashboard)||void 0===t?void 0:t.ownerId)==this.userId)}_hasViewAccess(){var e,t;return null!=this.userId&&("PRIVATE"!=(null===(e=this.selectedDashboard)||void 0===e?void 0:e.viewAccess)||(null===(t=this.selectedDashboard)||void 0===t?void 0:t.ownerId)==this.userId)}render(){var e,t,i,s;window.matchMedia("(max-width: 600px)").matches&&this.editMode&&(this.dispatchEvent(new CustomEvent("editToggle",{detail:!1})),this.showDashboardTree=!0);const r={display:!this.editMode||!this._isReadonly()&&this._hasEditAccess()?void 0:"none",maxHeight:this.editMode?"calc(100vh - 77px - 50px)":"inherit"};return!this.isInitializing||null!=this.dashboards&&0==this.dashboards.length?html`
135
+ <div id="container">
136
+ ${this.showDashboardTree?html`
137
+ <or-dashboard-tree id="tree" class="${this.selectedDashboard?"hideMobile":void 0}"
138
+ .realm="${this.realm}" .hasChanged="${this.hasChanged}" .selected="${this.selectedDashboard}" .dashboards="${this.dashboards}" .showControls="${!0}" .userId="${this.userId}" .readonly="${this._isReadonly()}"
139
+ @created="${e=>{this.dispatchEvent(new CustomEvent("editToggle",{detail:!0}))}}"
140
+ @updated="${e=>{this.dashboards=e.detail,this.selectedDashboard=void 0}}"
141
+ @select="${e=>{this.selectDashboard(e.detail)}}"
142
+ ></or-dashboard-tree>
143
+ `:void 0}
144
+ <div class="${null==this.selectedDashboard?"hideMobile":void 0}" style="flex: 1; display: flex; flex-direction: column;">
145
+ ${this.editMode?html`
146
+ <div id="header" class="hideMobile">
147
+ <div id="header-wrapper">
148
+ <div id="header-title">
149
+ <or-icon icon="view-dashboard"></or-icon>
150
+ ${null!=this.selectedDashboard?html`
151
+ <or-mwc-input .type="${InputType.TEXT}" min="1" max="1023" comfortable required outlined .label="${i18next.t("name")+"* "}"
152
+ ?readonly="${this._isReadonly()}" .value="${this.selectedDashboard.displayName}"
153
+ .disabled="${this.isLoading}" style="width: 300px;"
154
+ @or-mwc-input-changed="${e=>{this.changeDashboardName(e.detail.value)}}"
155
+ ></or-mwc-input>
156
+ `:void 0}
157
+ </div>
158
+ <div id="header-actions">
159
+ <div id="header-actions-content">
160
+ ${when(this.selectedDashboard,(()=>html`
161
+ <or-mwc-input id="refresh-btn" class="small-btn" .disabled="${this.isLoading}" type="${InputType.BUTTON}" icon="refresh"
162
+ @or-mwc-input-changed="${()=>{var e;this.deselectWidget(),null===(e=this.dashboardPreview)||void 0===e||e.refreshPreview()}}">
163
+ </or-mwc-input>
164
+ <or-mwc-input id="responsive-btn" class="small-btn" .disabled="${this.isLoading}" type="${InputType.BUTTON}" icon="responsive"
165
+ @or-mwc-input-changed="${()=>{this.dispatchEvent(new CustomEvent("fullscreenToggle",{detail:!this.fullscreen}))}}">
166
+ </or-mwc-input>
167
+ <or-mwc-input id="share-btn" class="small-btn" .disabled="${this.isLoading}" type="${InputType.BUTTON}" icon="open-in-new"
168
+ @or-mwc-input-changed="${()=>{this.openDashboardInInsights()}}">
169
+ </or-mwc-input>
170
+ <or-mwc-input id="save-btn" ?hidden="${this._isReadonly()||!this._hasEditAccess()}" .disabled="${this.isLoading||!this.hasChanged}" type="${InputType.BUTTON}" raised label="save"
171
+ @or-mwc-input-changed="${()=>{this.saveDashboard()}}">
172
+ </or-mwc-input>
173
+ <or-mwc-input id="view-btn" ?hidden="${this._isReadonly()||!this._hasViewAccess()}" type="${InputType.BUTTON}" outlined icon="eye" label="viewAsset"
174
+ @or-mwc-input-changed="${()=>{this.dispatchEvent(new CustomEvent("editToggle",{detail:!1}))}}">
175
+ </or-mwc-input>
176
+ `))}
177
+ </div>
178
+ </div>
179
+ </div>
180
+ </div>
181
+ `:html`
182
+ <div id="fullscreen-header">
183
+ <div id="fullscreen-header-wrapper">
184
+ <div id="fullscreen-header-title" style="display: flex; align-items: center;">
185
+ <or-icon class="showMobile" style="margin-right: 10px;" icon="chevron-left" @click="${()=>{this.selectedDashboard=void 0}}"></or-icon>
186
+ <or-icon class="hideMobile" style="margin-right: 10px;" icon="menu" @click="${()=>{this.showDashboardTree=!this.showDashboardTree}}"></or-icon>
187
+ <span>${null===(e=this.selectedDashboard)||void 0===e?void 0:e.displayName}</span>
188
+ </div>
189
+ <div id="fullscreen-header-actions">
190
+ <div id="fullscreen-header-actions-content">
191
+ ${when(this.selectedDashboard,(()=>html`
192
+ <or-mwc-input id="refresh-btn" class="small-btn" .disabled="${null==this.selectedDashboard}" type="${InputType.BUTTON}" icon="refresh"
193
+ @or-mwc-input-changed="${()=>{var e;this.deselectWidget(),null===(e=this.dashboardPreview)||void 0===e||e.refreshPreview()}}"
194
+ ></or-mwc-input>
195
+ <dashboard-refresh-controls .interval="${this.refreshInterval}" .readonly="${!1}"
196
+ @interval-select="${e=>this.onIntervalSelect(e)}"
197
+ ></dashboard-refresh-controls>
198
+ <or-mwc-input id="share-btn" class="small-btn" .disabled="${null==this.selectedDashboard}" type="${InputType.BUTTON}" icon="open-in-new"
199
+ @or-mwc-input-changed="${()=>{this.openDashboardInInsights()}}"
200
+ ></or-mwc-input>
201
+ <or-mwc-input id="view-btn" class="hideMobile" ?hidden="${null==this.selectedDashboard||this._isReadonly()||!this._hasEditAccess()}" type="${InputType.BUTTON}" outlined icon="pencil" label="editAsset"
202
+ @or-mwc-input-changed="${()=>{this.dispatchEvent(new CustomEvent("editToggle",{detail:!0}))}}">
203
+ </or-mwc-input>
204
+ `))}
205
+ </div>
206
+ </div>
207
+ </div>
208
+ </div>
209
+ `}
210
+ <div id="content" style="flex: 1;">
211
+ <div id="container">
212
+ ${!this.editMode||!this._isReadonly()&&this._hasEditAccess()?void 0:html`
213
+ <div style="display: flex; justify-content: center; align-items: center; height: 100%;">
214
+ <span>${this._hasEditAccess()?i18next.t("errorOccurred"):i18next.t("noDashboardWriteAccess")}.</span>
215
+ </div>
216
+ `}
217
+ <div id="builder" style="${styleMap(r)}">
218
+ ${null!=this.selectedDashboard?html`
219
+ <or-dashboard-preview class="editor" style="background: transparent;"
220
+ .realm="${this.realm}" .template="${this.currentTemplate}"
221
+ .selectedWidget="${null===(s=null===(i=null===(t=this.selectedDashboard)||void 0===t?void 0:t.template)||void 0===i?void 0:i.widgets)||void 0===s?void 0:s.find((e=>e.id==this.selectedWidgetId))}" .editMode="${this.editMode}"
222
+ .fullscreen="${this.fullscreen}" .readonly="${this._isReadonly()}"
223
+ @selected="${e=>{this.selectWidget(e.detail)}}"
224
+ @deselected="${()=>{this.deselectWidget()}}"
225
+ @created="${e=>{this.onWidgetCreation(e.detail)}}"
226
+ @changed="${e=>{this.currentTemplate=e.detail.template}}"
227
+ ></or-dashboard-preview>
228
+ `:html`
229
+ <div style="display: flex; justify-content: center; align-items: center; height: 100%;">
230
+ <span>${i18next.t("noDashboardSelected")}</span>
231
+ </div>
232
+ `}
233
+ </div>
234
+ ${when(null!=this.selectedDashboard&&this.editMode&&!this._isReadonly()&&this._hasEditAccess(),(()=>{var e,t,i,s;const r=null===(i=null===(t=null===(e=this.selectedDashboard)||void 0===e?void 0:e.template)||void 0===t?void 0:t.widgets)||void 0===i?void 0:i.find((e=>e.id==this.selectedWidgetId));return html`
235
+ <div id="sidebar" class="hideMobile">
236
+ ${null!=this.selectedWidgetId?html`
237
+ <div class="settings-container">
238
+ <div id="menu-header">
239
+ <div id="title-container">
240
+ <span id="title" title="${null==r?void 0:r.displayName}">${null==r?void 0:r.displayName}</span>
241
+ </div>
242
+ <div id="sidebar-widget-headeractions">
243
+ <or-mwc-input type="${InputType.BUTTON}" icon="delete" @or-mwc-input-changed="${()=>{showOkCancelDialog(i18next.t("areYouSure"),i18next.t("dashboard.deleteWidgetWarning"),i18next.t("delete")).then((e=>{e&&this.deleteWidget(r)}))}}"></or-mwc-input>
244
+ <or-mwc-input type="${InputType.BUTTON}" icon="close" @or-mwc-input-changed="${()=>{this.deselectWidget()}}"></or-mwc-input>
245
+ </div>
246
+ </div>
247
+ <div id="content" class="hidescroll" style="flex: 1; overflow: hidden auto;">
248
+ <div style="position: relative;">
249
+ <or-dashboard-widgetsettings style="position: absolute;" .selectedWidget="${r}" .realm="${this.realm}"
250
+ @delete="${e=>{this.deleteWidget(e.detail)}}"
251
+ @update="${e=>{var t,i;this.currentTemplate=Object.assign({},null===(t=this.selectedDashboard)||void 0===t?void 0:t.template),e.detail.force&&(this.deselectWidget(),null===(i=this.dashboardPreview)||void 0===i||i.refreshPreview())}}"
252
+ ></or-dashboard-widgetsettings>
253
+ </div>
254
+ </div>
255
+ </div>
256
+ `:void 0}
257
+ <div class="settings-container" style="${null!=this.selectedWidgetId?css`display: none`:null}">
258
+ <div style="border-bottom: 1px solid ${unsafeCSS(DefaultColor5)};">
259
+ <or-mwc-tabs .items="${this.tabItems}" noScroll @activated="${e=>{this.sidebarMenuIndex=e.detail.index}}" style="pointer-events: ${this.selectedDashboard?void 0:"none"}"></or-mwc-tabs>
260
+ </div>
261
+ <div id="content" class="hidescroll" style="flex: 1; overflow: hidden auto;">
262
+ <div style="position: relative;">
263
+ <or-dashboard-browser id="browser" style="position: absolute; ${0!=this.sidebarMenuIndex?css`display: none`:null}"></or-dashboard-browser>
264
+ <or-dashboard-boardsettings style="position: absolute; ${1!=this.sidebarMenuIndex?css`display: none`:null}"
265
+ .dashboard="${this.selectedDashboard}" .showPerms="${(null===(s=this.selectedDashboard)||void 0===s?void 0:s.ownerId)==this.userId}"
266
+ @update="${e=>{var t,i;this.currentTemplate=Object.assign({},null===(t=this.selectedDashboard)||void 0===t?void 0:t.template),e.detail.force&&(this.deselectWidget(),null===(i=this.dashboardPreview)||void 0===i||i.refreshPreview())}}"
267
+ ></or-dashboard-boardsettings>
268
+ </div>
269
+ </div>
270
+ </div>
271
+ </div>
272
+ `}))}
273
+ </div>
274
+ </div>
275
+ </div>
276
+ </div>
277
+ `:html`
278
+ <div id="container" style="justify-content: center; align-items: center;">
279
+ ${this.isInitializing?html`
280
+ <span>${i18next.t("loading")}.</span>
281
+ `:html`
282
+ <span>${i18next.t("errorOccurred")}.</span>
283
+ `}
284
+ </div>
285
+ `}onIntervalSelect(e){this.refreshInterval=e.detail}};__decorate([property()],OrDashboardBuilder.prototype,"config",void 0),__decorate([property()],OrDashboardBuilder.prototype,"editMode",void 0),__decorate([property()],OrDashboardBuilder.prototype,"fullscreen",void 0),__decorate([property()],OrDashboardBuilder.prototype,"selectedId",void 0),__decorate([property()],OrDashboardBuilder.prototype,"realm",void 0),__decorate([property()],OrDashboardBuilder.prototype,"userId",void 0),__decorate([property()],OrDashboardBuilder.prototype,"readonly",void 0),__decorate([state()],OrDashboardBuilder.prototype,"dashboards",void 0),__decorate([state()],OrDashboardBuilder.prototype,"currentTemplate",void 0),__decorate([state()],OrDashboardBuilder.prototype,"selectedDashboard",void 0),__decorate([state()],OrDashboardBuilder.prototype,"selectedWidgetId",void 0),__decorate([state()],OrDashboardBuilder.prototype,"initialDashboardJSON",void 0),__decorate([state()],OrDashboardBuilder.prototype,"initialTemplateJSON",void 0),__decorate([state()],OrDashboardBuilder.prototype,"refreshInterval",void 0),__decorate([state()],OrDashboardBuilder.prototype,"isInitializing",void 0),__decorate([state()],OrDashboardBuilder.prototype,"isLoading",void 0),__decorate([state()],OrDashboardBuilder.prototype,"hasChanged",void 0),__decorate([query("or-dashboard-preview")],OrDashboardBuilder.prototype,"dashboardPreview",void 0),__decorate([state()],OrDashboardBuilder.prototype,"sidebarMenuIndex",void 0),__decorate([state()],OrDashboardBuilder.prototype,"showDashboardTree",void 0),OrDashboardBuilder=__decorate([customElement("or-dashboard-builder")],OrDashboardBuilder);export{OrDashboardBuilder};