@things-factory/board-ui 6.1.32 → 6.1.40

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 (32) hide show
  1. package/client/bootstrap.ts +8 -1
  2. package/client/data-grist/color-map-editor.ts +13 -0
  3. package/client/data-grist/color-ranges-editor.ts +13 -0
  4. package/client/pages/theme/theme-editors.ts +56 -0
  5. package/client/pages/{share/share-list-page.ts → theme/theme-list-page.ts} +23 -73
  6. package/client/route.ts +4 -0
  7. package/dist-client/bootstrap.js +7 -1
  8. package/dist-client/bootstrap.js.map +1 -1
  9. package/dist-client/data-grist/color-map-editor.d.ts +7 -0
  10. package/dist-client/data-grist/color-map-editor.js +16 -0
  11. package/dist-client/data-grist/color-map-editor.js.map +1 -0
  12. package/dist-client/data-grist/color-ranges-editor.d.ts +7 -0
  13. package/dist-client/data-grist/color-ranges-editor.js +16 -0
  14. package/dist-client/data-grist/color-ranges-editor.js.map +1 -0
  15. package/dist-client/pages/theme/theme-editors.d.ts +5 -0
  16. package/dist-client/pages/theme/theme-editors.js +53 -0
  17. package/dist-client/pages/theme/theme-editors.js.map +1 -0
  18. package/dist-client/pages/theme/theme-list-page.d.ts +49 -0
  19. package/dist-client/pages/theme/theme-list-page.js +300 -0
  20. package/dist-client/pages/theme/theme-list-page.js.map +1 -0
  21. package/dist-client/route.js +3 -0
  22. package/dist-client/route.js.map +1 -1
  23. package/dist-client/tsconfig.tsbuildinfo +1 -1
  24. package/dist-server/tsconfig.tsbuildinfo +1 -1
  25. package/package.json +2 -2
  26. package/things-factory.config.js +4 -0
  27. package/translations/en.json +5 -3
  28. package/translations/ja.json +2 -0
  29. package/translations/ko.json +2 -0
  30. package/translations/ms.json +2 -0
  31. package/translations/zh.json +2 -0
  32. package/client/pages/share/share-importer.ts +0 -97
@@ -0,0 +1,300 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import '@operato/data-grist';
3
+ import { CommonButtonStyles, CommonGristStyles, ScrollbarStyles } from '@operato/styles';
4
+ import { PageView, store } from '@operato/shell';
5
+ import { css, html } from 'lit';
6
+ import { customElement, property, query } from 'lit/decorators.js';
7
+ import { connect } from 'pwa-helpers/connect-mixin';
8
+ import gql from 'graphql-tag';
9
+ import { ScopedElementsMixin } from '@open-wc/scoped-elements';
10
+ import { DataGrist, getEditor, getRenderer } from '@operato/data-grist';
11
+ import { client } from '@operato/graphql';
12
+ import { i18next, localize } from '@operato/i18n';
13
+ import { notify } from '@operato/layout';
14
+ import { OxPopup } from '@operato/popup';
15
+ import { isMobileDevice } from '@operato/utils';
16
+ // export interface ThemeType {
17
+ // name: string
18
+ // propType: string
19
+ // }
20
+ // var ThemeTypes: { [name: string]: ThemeType } = {
21
+ // Legend: {
22
+ // name: 'Legend',
23
+ // propType: 'legend'
24
+ // }
25
+ // }
26
+ let ThemeListPage = class ThemeListPage extends connect(store)(localize(i18next)(ScopedElementsMixin(PageView))) {
27
+ constructor() {
28
+ super(...arguments);
29
+ this.mode = isMobileDevice() ? 'CARD' : 'GRID';
30
+ }
31
+ get context() {
32
+ return {
33
+ search: {
34
+ handler: (search) => {
35
+ this.grist.searchText = search;
36
+ },
37
+ placeholder: i18next.t('title.theme list'),
38
+ value: this.grist.searchText
39
+ },
40
+ filter: {
41
+ handler: () => {
42
+ this.grist.toggleHeadroom();
43
+ }
44
+ },
45
+ help: 'board-service/theme',
46
+ actions: [
47
+ Object.assign({ title: i18next.t('button.save'), action: this._updateTheme.bind(this) }, CommonButtonStyles.save),
48
+ Object.assign({ title: i18next.t('button.delete'), action: this._deleteTheme.bind(this) }, CommonButtonStyles.delete)
49
+ ]
50
+ };
51
+ }
52
+ render() {
53
+ const mode = this.mode || (isMobileDevice() ? 'CARD' : 'GRID');
54
+ return html `
55
+ <ox-grist .mode=${mode} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}>
56
+ <div slot="headroom">
57
+ <div id="filters">
58
+ <ox-filters-form autofocus without-search></ox-filters-form>
59
+ </div>
60
+
61
+ <div id="sorters">
62
+ Sort
63
+ <mwc-icon
64
+ @click=${e => {
65
+ const target = e.currentTarget;
66
+ this.sortersControl.open({
67
+ right: 0,
68
+ top: target.offsetTop + target.offsetHeight
69
+ });
70
+ }}
71
+ >expand_more</mwc-icon
72
+ >
73
+ <ox-popup id="sorter-control">
74
+ <ox-sorters-control> </ox-sorters-control>
75
+ </ox-popup>
76
+ </div>
77
+
78
+ <div id="modes">
79
+ <mwc-icon @click=${() => (this.mode = 'GRID')} ?active=${mode == 'GRID'}>grid_on</mwc-icon>
80
+ <mwc-icon @click=${() => (this.mode = 'LIST')} ?active=${mode == 'LIST'}>format_list_bulleted</mwc-icon>
81
+ <mwc-icon @click=${() => (this.mode = 'CARD')} ?active=${mode == 'CARD'}>apps</mwc-icon>
82
+ </div>
83
+ </div>
84
+ </ox-grist>
85
+ `;
86
+ }
87
+ async pageInitialized(lifecycle) {
88
+ this.gristConfig = {
89
+ list: {
90
+ fields: ['name', 'description'],
91
+ details: ['type', 'updatedAt']
92
+ },
93
+ columns: [
94
+ { type: 'gutter', gutterName: 'sequence' },
95
+ { type: 'gutter', gutterName: 'row-selector', multiple: true },
96
+ {
97
+ type: 'string',
98
+ name: 'name',
99
+ header: i18next.t('field.name'),
100
+ record: {
101
+ editable: true
102
+ },
103
+ filter: 'search',
104
+ sortable: true,
105
+ width: 150
106
+ },
107
+ {
108
+ type: 'string',
109
+ name: 'description',
110
+ header: i18next.t('field.description'),
111
+ record: {
112
+ editable: true
113
+ },
114
+ filter: 'search',
115
+ width: 200
116
+ },
117
+ {
118
+ type: 'select',
119
+ name: 'type',
120
+ header: i18next.t('field.type'),
121
+ record: {
122
+ options: ['', 'color-map', 'color-ranges', 'color', 'text'],
123
+ editable: true
124
+ },
125
+ width: 120
126
+ },
127
+ {
128
+ type: 'string',
129
+ name: 'value',
130
+ header: i18next.t('field.value'),
131
+ record: {
132
+ editor: function (value, column, record, rowIndex, field) {
133
+ return getEditor(record.type || 'text')(value, column, record, rowIndex, field);
134
+ },
135
+ renderer: function (value, column, record, rowIndex, field) {
136
+ return getRenderer(record.type || 'text')(value, column, record, rowIndex, field);
137
+ },
138
+ editable: true
139
+ },
140
+ sortable: true,
141
+ width: 180
142
+ },
143
+ {
144
+ type: 'resource-object',
145
+ name: 'updater',
146
+ header: i18next.t('field.updater'),
147
+ record: {
148
+ editable: false
149
+ },
150
+ sortable: true,
151
+ width: 120
152
+ },
153
+ {
154
+ type: 'datetime',
155
+ name: 'updatedAt',
156
+ header: i18next.t('field.updated_at'),
157
+ record: {
158
+ editable: false
159
+ },
160
+ sortable: true,
161
+ width: 180
162
+ }
163
+ ],
164
+ rows: {
165
+ selectable: {
166
+ multiple: true
167
+ }
168
+ },
169
+ sorters: [
170
+ {
171
+ name: 'name'
172
+ }
173
+ ]
174
+ };
175
+ }
176
+ async pageUpdated(changes, lifecycle) {
177
+ if (this.active) {
178
+ // do something here when this page just became as active
179
+ }
180
+ }
181
+ async fetchHandler({ page = 1, limit = 100, sortings = [], filters = [] }) {
182
+ const response = await client.query({
183
+ query: gql `
184
+ query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
185
+ responses: themes(filters: $filters, pagination: $pagination, sortings: $sortings) {
186
+ items {
187
+ id
188
+ name
189
+ description
190
+ type
191
+ value
192
+ updater {
193
+ id
194
+ name
195
+ }
196
+ updatedAt
197
+ }
198
+ total
199
+ }
200
+ }
201
+ `,
202
+ variables: {
203
+ filters,
204
+ pagination: { page, limit },
205
+ sortings
206
+ }
207
+ });
208
+ return {
209
+ total: response.data.responses.total || 0,
210
+ records: response.data.responses.items || []
211
+ };
212
+ }
213
+ async _deleteTheme() {
214
+ if (confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }))) {
215
+ const ids = this.grist.selected.map(record => record.id);
216
+ if (ids && ids.length > 0) {
217
+ const response = await client.mutate({
218
+ mutation: gql `
219
+ mutation ($ids: [String!]!) {
220
+ deleteThemes(ids: $ids)
221
+ }
222
+ `,
223
+ variables: {
224
+ ids
225
+ }
226
+ });
227
+ if (!response.errors) {
228
+ this.grist.fetch();
229
+ notify({
230
+ message: i18next.t('text.info_x_successfully', { x: i18next.t('text.delete') })
231
+ });
232
+ }
233
+ }
234
+ }
235
+ }
236
+ async _updateTheme() {
237
+ let patches = this.grist.dirtyRecords;
238
+ if (patches && patches.length) {
239
+ patches = patches.map(patch => {
240
+ let patchField = patch.id ? { id: patch.id } : {};
241
+ const dirtyFields = patch.__dirtyfields__;
242
+ for (let key in dirtyFields) {
243
+ patchField[key] = dirtyFields[key].after;
244
+ }
245
+ patchField.cuFlag = patch.__dirty__;
246
+ return patchField;
247
+ });
248
+ const response = await client.mutate({
249
+ mutation: gql `
250
+ mutation ($patches: [ThemePatch!]!) {
251
+ updateMultipleTheme(patches: $patches) {
252
+ name
253
+ }
254
+ }
255
+ `,
256
+ variables: {
257
+ patches
258
+ }
259
+ });
260
+ if (!response.errors) {
261
+ this.grist.fetch();
262
+ }
263
+ }
264
+ }
265
+ };
266
+ ThemeListPage.styles = [
267
+ ScrollbarStyles,
268
+ CommonGristStyles,
269
+ css `
270
+ :host {
271
+ display: flex;
272
+
273
+ width: 100%;
274
+
275
+ --grid-record-emphasized-background-color: red;
276
+ --grid-record-emphasized-color: yellow;
277
+ }
278
+ `
279
+ ];
280
+ __decorate([
281
+ property({ type: Object }),
282
+ __metadata("design:type", Object)
283
+ ], ThemeListPage.prototype, "gristConfig", void 0);
284
+ __decorate([
285
+ property({ type: String }),
286
+ __metadata("design:type", String)
287
+ ], ThemeListPage.prototype, "mode", void 0);
288
+ __decorate([
289
+ query('ox-grist'),
290
+ __metadata("design:type", DataGrist)
291
+ ], ThemeListPage.prototype, "grist", void 0);
292
+ __decorate([
293
+ query('#sorter-control'),
294
+ __metadata("design:type", OxPopup)
295
+ ], ThemeListPage.prototype, "sortersControl", void 0);
296
+ ThemeListPage = __decorate([
297
+ customElement('theme-list-page')
298
+ ], ThemeListPage);
299
+ export { ThemeListPage };
300
+ //# sourceMappingURL=theme-list-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-list-page.js","sourceRoot":"","sources":["../../../client/pages/theme/theme-list-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-grist'\n\nimport { CommonButtonStyles, CommonGristStyles, ScrollbarStyles } from '@operato/styles'\nimport { PageView, store } from '@operato/shell'\nimport { css, html } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\nimport { connect } from 'pwa-helpers/connect-mixin'\nimport gql from 'graphql-tag'\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements'\nimport { ColumnConfig, DataGrist, FetchOption, SortersControl, getEditor, getRenderer } from '@operato/data-grist'\n\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify, openPopup } from '@operato/layout'\nimport { OxPopup } from '@operato/popup'\nimport { isMobileDevice } from '@operato/utils'\nimport { buildThemeValueRecordConfig } from './theme-editors'\n\n// export interface ThemeType {\n// name: string\n// propType: string\n// }\n\n// var ThemeTypes: { [name: string]: ThemeType } = {\n// Legend: {\n// name: 'Legend',\n// propType: 'legend'\n// }\n// }\n\n@customElement('theme-list-page')\nexport class ThemeListPage extends connect(store)(localize(i18next)(ScopedElementsMixin(PageView))) {\n static styles = [\n ScrollbarStyles,\n CommonGristStyles,\n css`\n :host {\n display: flex;\n\n width: 100%;\n\n --grid-record-emphasized-background-color: red;\n --grid-record-emphasized-color: yellow;\n }\n `\n ]\n\n @property({ type: Object }) gristConfig: any\n @property({ type: String }) mode: 'CARD' | 'GRID' | 'LIST' = isMobileDevice() ? 'CARD' : 'GRID'\n\n @query('ox-grist') private grist!: DataGrist\n @query('#sorter-control') private sortersControl!: OxPopup\n\n get context() {\n return {\n search: {\n handler: (search: string) => {\n this.grist.searchText = search\n },\n placeholder: i18next.t('title.theme list'),\n value: this.grist.searchText\n },\n filter: {\n handler: () => {\n this.grist.toggleHeadroom()\n }\n },\n help: 'board-service/theme',\n actions: [\n {\n title: i18next.t('button.save'),\n action: this._updateTheme.bind(this),\n ...CommonButtonStyles.save\n },\n {\n title: i18next.t('button.delete'),\n action: this._deleteTheme.bind(this),\n ...CommonButtonStyles.delete\n }\n ]\n }\n }\n\n render() {\n const mode = this.mode || (isMobileDevice() ? 'CARD' : 'GRID')\n\n return html`\n <ox-grist .mode=${mode} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}>\n <div slot=\"headroom\">\n <div id=\"filters\">\n <ox-filters-form autofocus without-search></ox-filters-form>\n </div>\n\n <div id=\"sorters\">\n Sort\n <mwc-icon\n @click=${e => {\n const target = e.currentTarget\n this.sortersControl.open({\n right: 0,\n top: target.offsetTop + target.offsetHeight\n })\n }}\n >expand_more</mwc-icon\n >\n <ox-popup id=\"sorter-control\">\n <ox-sorters-control> </ox-sorters-control>\n </ox-popup>\n </div>\n\n <div id=\"modes\">\n <mwc-icon @click=${() => (this.mode = 'GRID')} ?active=${mode == 'GRID'}>grid_on</mwc-icon>\n <mwc-icon @click=${() => (this.mode = 'LIST')} ?active=${mode == 'LIST'}>format_list_bulleted</mwc-icon>\n <mwc-icon @click=${() => (this.mode = 'CARD')} ?active=${mode == 'CARD'}>apps</mwc-icon>\n </div>\n </div>\n </ox-grist>\n `\n }\n\n async pageInitialized(lifecycle: any) {\n this.gristConfig = {\n list: {\n fields: ['name', 'description'],\n details: ['type', 'updatedAt']\n },\n columns: [\n { type: 'gutter', gutterName: 'sequence' },\n { type: 'gutter', gutterName: 'row-selector', multiple: true },\n {\n type: 'string',\n name: 'name',\n header: i18next.t('field.name'),\n record: {\n editable: true\n },\n filter: 'search',\n sortable: true,\n width: 150\n },\n {\n type: 'string',\n name: 'description',\n header: i18next.t('field.description'),\n record: {\n editable: true\n },\n filter: 'search',\n width: 200\n },\n {\n type: 'select',\n name: 'type',\n header: i18next.t('field.type'),\n record: {\n options: ['', 'color-map', 'color-ranges', 'color', 'text'],\n editable: true\n },\n width: 120\n },\n {\n type: 'string',\n name: 'value',\n header: i18next.t('field.value'),\n record: {\n editor: function (value, column, record, rowIndex, field) {\n return getEditor(record.type || 'text')(value, column, record, rowIndex, field)\n },\n renderer: function (value, column, record, rowIndex, field) {\n return getRenderer(record.type || 'text')(value, column, record, rowIndex, field)\n },\n editable: true\n },\n sortable: true,\n width: 180\n },\n {\n type: 'resource-object',\n name: 'updater',\n header: i18next.t('field.updater'),\n record: {\n editable: false\n },\n sortable: true,\n width: 120\n },\n {\n type: 'datetime',\n name: 'updatedAt',\n header: i18next.t('field.updated_at'),\n record: {\n editable: false\n },\n sortable: true,\n width: 180\n }\n ],\n rows: {\n selectable: {\n multiple: true\n }\n },\n sorters: [\n {\n name: 'name'\n }\n ]\n }\n }\n\n async pageUpdated(changes: any, lifecycle: any) {\n if (this.active) {\n // do something here when this page just became as active\n }\n }\n\n async fetchHandler({ page = 1, limit = 100, sortings = [], filters = [] }: FetchOption) {\n const response = await client.query({\n query: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {\n responses: themes(filters: $filters, pagination: $pagination, sortings: $sortings) {\n items {\n id\n name\n description\n type\n value\n updater {\n id\n name\n }\n updatedAt\n }\n total\n }\n }\n `,\n variables: {\n filters,\n pagination: { page, limit },\n sortings\n }\n })\n\n return {\n total: response.data.responses.total || 0,\n records: response.data.responses.items || []\n }\n }\n\n async _deleteTheme() {\n if (confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }))) {\n const ids = this.grist.selected.map(record => record.id)\n if (ids && ids.length > 0) {\n const response = await client.mutate({\n mutation: gql`\n mutation ($ids: [String!]!) {\n deleteThemes(ids: $ids)\n }\n `,\n variables: {\n ids\n }\n })\n\n if (!response.errors) {\n this.grist.fetch()\n notify({\n message: i18next.t('text.info_x_successfully', { x: i18next.t('text.delete') })\n })\n }\n }\n }\n }\n\n async _updateTheme() {\n let patches = this.grist.dirtyRecords\n if (patches && patches.length) {\n patches = patches.map(patch => {\n let patchField: any = patch.id ? { id: patch.id } : {}\n const dirtyFields = patch.__dirtyfields__\n for (let key in dirtyFields) {\n patchField[key] = dirtyFields[key].after\n }\n patchField.cuFlag = patch.__dirty__\n\n return patchField\n })\n\n const response = await client.mutate({\n mutation: gql`\n mutation ($patches: [ThemePatch!]!) {\n updateMultipleTheme(patches: $patches) {\n name\n }\n }\n `,\n variables: {\n patches\n }\n })\n\n if (!response.errors) {\n this.grist.fetch()\n }\n }\n }\n}\n"]}
@@ -12,6 +12,9 @@ export default function route(page) {
12
12
  case 'printable-board-viewer':
13
13
  import('./pages/printable-board-viewer-page');
14
14
  return page;
15
+ case 'theme-list':
16
+ import('./pages/theme/theme-list-page');
17
+ return page;
15
18
  }
16
19
  }
17
20
  //# sourceMappingURL=route.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../client/route.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,IAAI;IAChC,QAAQ,IAAI,EAAE;QACZ,KAAK,cAAc;YACjB,MAAM,CAAC,2BAA2B,CAAC,CAAA;YACnC,OAAO,IAAI,CAAA;QAEb,KAAK,cAAc;YACjB,MAAM,CAAC,2BAA2B,CAAC,CAAA;YACnC,OAAO,IAAI,CAAA;QAEb,KAAK,gBAAgB;YACnB,MAAM,CAAC,6BAA6B,CAAC,CAAA;YACrC,OAAO,IAAI,CAAA;QAEb,KAAK,wBAAwB;YAC3B,MAAM,CAAC,qCAAqC,CAAC,CAAA;YAC7C,OAAO,IAAI,CAAA;KACd;AACH,CAAC","sourcesContent":["export default function route(page) {\n switch (page) {\n case 'board-viewer':\n import('./pages/board-viewer-page')\n return page\n\n case 'board-player':\n import('./pages/board-player-page')\n return page\n\n case 'board-modeller':\n import('./pages/board-modeller-page')\n return page\n\n case 'printable-board-viewer':\n import('./pages/printable-board-viewer-page')\n return page\n }\n}\n"]}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../client/route.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,IAAI;IAChC,QAAQ,IAAI,EAAE;QACZ,KAAK,cAAc;YACjB,MAAM,CAAC,2BAA2B,CAAC,CAAA;YACnC,OAAO,IAAI,CAAA;QAEb,KAAK,cAAc;YACjB,MAAM,CAAC,2BAA2B,CAAC,CAAA;YACnC,OAAO,IAAI,CAAA;QAEb,KAAK,gBAAgB;YACnB,MAAM,CAAC,6BAA6B,CAAC,CAAA;YACrC,OAAO,IAAI,CAAA;QAEb,KAAK,wBAAwB;YAC3B,MAAM,CAAC,qCAAqC,CAAC,CAAA;YAC7C,OAAO,IAAI,CAAA;QAEb,KAAK,YAAY;YACf,MAAM,CAAC,+BAA+B,CAAC,CAAA;YACvC,OAAO,IAAI,CAAA;KACd;AACH,CAAC","sourcesContent":["export default function route(page) {\n switch (page) {\n case 'board-viewer':\n import('./pages/board-viewer-page')\n return page\n\n case 'board-player':\n import('./pages/board-player-page')\n return page\n\n case 'board-modeller':\n import('./pages/board-modeller-page')\n return page\n\n case 'printable-board-viewer':\n import('./pages/printable-board-viewer-page')\n return page\n\n case 'theme-list':\n import('./pages/theme/theme-list-page')\n return page\n }\n}\n"]}