@things-factory/board-ui 6.1.23 → 6.1.28

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 (59) hide show
  1. package/client/{board-provider.js → board-provider.ts} +5 -5
  2. package/client/data-grist/{board-editor.js → board-editor.ts} +31 -34
  3. package/client/data-grist/{board-renderer.js → board-renderer.ts} +10 -13
  4. package/client/pages/{board-modeller-page.js → board-modeller-page.ts} +44 -57
  5. package/client/pages/{board-player-page.js → board-player-page.ts} +51 -57
  6. package/client/pages/{board-viewer-page.js → board-viewer-page.ts} +50 -58
  7. package/client/pages/{printable-board-viewer-page.js → printable-board-viewer-page.ts} +2 -2
  8. package/client/pages/share/share-importer.ts +97 -0
  9. package/client/pages/share/share-list-page.ts +358 -0
  10. package/client/setting-let/{board-view-setting-let.js → board-view-setting-let.ts} +15 -21
  11. package/client/things-scene-import.d.ts +4 -0
  12. package/dist-client/board-provider.d.ts +3 -0
  13. package/dist-client/board-provider.js +77 -0
  14. package/dist-client/board-provider.js.map +1 -0
  15. package/dist-client/bootstrap.d.ts +2 -0
  16. package/dist-client/bootstrap.js +13 -0
  17. package/dist-client/bootstrap.js.map +1 -0
  18. package/dist-client/data-grist/board-editor.d.ts +14 -0
  19. package/dist-client/data-grist/board-editor.js +108 -0
  20. package/dist-client/data-grist/board-editor.js.map +1 -0
  21. package/dist-client/data-grist/board-renderer.d.ts +2 -0
  22. package/dist-client/data-grist/board-renderer.js +133 -0
  23. package/dist-client/data-grist/board-renderer.js.map +1 -0
  24. package/dist-client/index.d.ts +5 -0
  25. package/dist-client/index.js +6 -0
  26. package/dist-client/index.js.map +1 -0
  27. package/dist-client/pages/board-modeller-page.d.ts +48 -0
  28. package/dist-client/pages/board-modeller-page.js +284 -0
  29. package/dist-client/pages/board-modeller-page.js.map +1 -0
  30. package/dist-client/pages/board-player-page.d.ts +43 -0
  31. package/dist-client/pages/board-player-page.js +225 -0
  32. package/dist-client/pages/board-player-page.js.map +1 -0
  33. package/dist-client/pages/board-viewer-page.d.ts +39 -0
  34. package/dist-client/pages/board-viewer-page.js +224 -0
  35. package/dist-client/pages/board-viewer-page.js.map +1 -0
  36. package/dist-client/pages/printable-board-viewer-page.d.ts +11 -0
  37. package/dist-client/pages/printable-board-viewer-page.js +43 -0
  38. package/dist-client/pages/printable-board-viewer-page.js.map +1 -0
  39. package/dist-client/pages/share/share-importer.d.ts +22 -0
  40. package/dist-client/pages/share/share-importer.js +100 -0
  41. package/dist-client/pages/share/share-importer.js.map +1 -0
  42. package/dist-client/pages/share/share-list-page.d.ts +62 -0
  43. package/dist-client/pages/share/share-list-page.js +341 -0
  44. package/dist-client/pages/share/share-list-page.js.map +1 -0
  45. package/dist-client/pages/things-scene-components-with-tools.import +0 -0
  46. package/dist-client/pages/things-scene-components.import +0 -0
  47. package/dist-client/route.d.ts +1 -0
  48. package/dist-client/route.js +17 -0
  49. package/dist-client/route.js.map +1 -0
  50. package/dist-client/setting-let/board-view-setting-let.d.ts +14 -0
  51. package/dist-client/setting-let/board-view-setting-let.js +70 -0
  52. package/dist-client/setting-let/board-view-setting-let.js.map +1 -0
  53. package/dist-client/themes/board-theme.css +107 -0
  54. package/dist-client/tsconfig.tsbuildinfo +1 -0
  55. package/dist-server/tsconfig.tsbuildinfo +1 -1
  56. package/package.json +12 -8
  57. /package/client/{bootstrap.js → bootstrap.ts} +0 -0
  58. /package/client/{index.js → index.ts} +0 -0
  59. /package/client/{route.js → route.ts} +0 -0
@@ -0,0 +1,97 @@
1
+ import '@operato/data-grist'
2
+
3
+ import gql from 'graphql-tag'
4
+ import { css, html, LitElement } from 'lit'
5
+ import { property } from 'lit/decorators.js'
6
+
7
+ import { client } from '@operato/graphql'
8
+ import { i18next } from '@operato/i18n'
9
+ import { isMobileDevice } from '@operato/utils'
10
+
11
+ export class ShareImporter extends LitElement {
12
+ static styles = [
13
+ css`
14
+ :host {
15
+ display: flex;
16
+ flex-direction: column;
17
+
18
+ background-color: #fff;
19
+ }
20
+
21
+ ox-grist {
22
+ flex: 1;
23
+ }
24
+
25
+ .button-container {
26
+ display: flex;
27
+ margin-left: auto;
28
+ padding: var(--padding-default);
29
+ }
30
+
31
+ mwc-button {
32
+ margin-left: var(--margin-default);
33
+ }
34
+ `
35
+ ]
36
+
37
+ @property({ type: Array }) shares: any[] = []
38
+ @property({ type: Object }) columns = {
39
+ list: { fields: ['name', 'description'] },
40
+ pagination: { infinite: true },
41
+ columns: [
42
+ {
43
+ type: 'string',
44
+ name: 'name',
45
+ header: i18next.t('field.name'),
46
+ width: 150
47
+ },
48
+ {
49
+ type: 'string',
50
+ name: 'description',
51
+ header: i18next.t('field.description'),
52
+ width: 200
53
+ },
54
+ {
55
+ type: 'checkbox',
56
+ name: 'active',
57
+ header: i18next.t('field.active'),
58
+ width: 60
59
+ }
60
+ ]
61
+ }
62
+
63
+
64
+ render() {
65
+ return html`
66
+ <ox-grist
67
+ .mode=${isMobileDevice() ? 'LIST' : 'GRID'}
68
+ .config=${this.columns}
69
+ .data=${
70
+ {
71
+ records: this.shares
72
+ }
73
+ }
74
+ ></ox-grist>
75
+
76
+ <div class="button-container">
77
+ <mwc-button raised @click="${this.save.bind(this)}">${i18next.t('button.save')}</mwc-button>
78
+ </div>
79
+ `
80
+ }
81
+
82
+ async save() {
83
+ const response = await client.mutate({
84
+ mutation: gql`
85
+ mutation importShares($shares: [SharePatch!]!) {
86
+ importShares(shares: $shares)
87
+ }
88
+ `,
89
+ variables: { shares: this.shares }
90
+ })
91
+
92
+ if (response.errors?.length) return
93
+
94
+ this.dispatchEvent(new CustomEvent('imported'))
95
+ }
96
+ }
97
+
@@ -0,0 +1,358 @@
1
+ import '@operato/data-grist'
2
+
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 { ColumnConfig, DataGrist, FetchOption, SortersControl, getEditor, getRenderer } from '@operato/data-grist'
11
+
12
+ import { client } from '@operato/graphql'
13
+ import { i18next, localize } from '@operato/i18n'
14
+ import { notify, openPopup } from '@operato/layout'
15
+ import { OxPopup } from '@operato/popup'
16
+ import { isMobileDevice } from '@operato/utils'
17
+
18
+ import { ShareImporter } from './share-importer'
19
+
20
+ // export interface ShareType {
21
+ // name: string
22
+ // propType: string
23
+ // }
24
+
25
+ // var ShareTypes: { [name: string]: ShareType } = {
26
+ // Legend: {
27
+ // name: 'Legend',
28
+ // propType: 'legend'
29
+ // }
30
+ // }
31
+
32
+ @customElement('share-list-page')
33
+ export class ShareListPage extends connect(store)(localize(i18next)(ScopedElementsMixin(PageView))) {
34
+ static styles = [
35
+ ScrollbarStyles,
36
+ CommonGristStyles,
37
+ css`
38
+ :host {
39
+ display: flex;
40
+
41
+ width: 100%;
42
+
43
+ --grid-record-emphasized-background-color: red;
44
+ --grid-record-emphasized-color: yellow;
45
+ }
46
+ `
47
+ ]
48
+
49
+ static get scopedElements() {
50
+ return {
51
+ 'share-importer': ShareImporter
52
+ }
53
+ }
54
+
55
+ @property({ type: Object }) gristConfig: any
56
+ @property({ type: String }) mode: 'CARD' | 'GRID' | 'LIST' = isMobileDevice() ? 'CARD' : 'GRID'
57
+
58
+ @query('ox-grist') private grist!: DataGrist
59
+ @query('#sorter-control') private sortersControl!: OxPopup
60
+
61
+ get context() {
62
+ return {
63
+ search: {
64
+ handler: (search: string) => {
65
+ this.grist.searchText = search
66
+ },
67
+ placeholder: i18next.t('title.share list'),
68
+ value: this.grist.searchText
69
+ },
70
+ filter: {
71
+ handler: () => {
72
+ this.grist.toggleHeadroom()
73
+ }
74
+ },
75
+ help: 'board-service/share',
76
+ actions: [
77
+ {
78
+ title: i18next.t('button.save'),
79
+ action: this._updateShare.bind(this),
80
+ ...CommonButtonStyles.save
81
+ },
82
+ {
83
+ title: i18next.t('button.delete'),
84
+ action: this._deleteShare.bind(this),
85
+ ...CommonButtonStyles.delete
86
+ }
87
+ ],
88
+ exportable: {
89
+ name: i18next.t('title.share list'),
90
+ data: this.exportHandler.bind(this)
91
+ },
92
+ importable: {
93
+ handler: this.importHandler.bind(this)
94
+ }
95
+ }
96
+ }
97
+
98
+ render() {
99
+ const mode = this.mode || (isMobileDevice() ? 'CARD' : 'GRID')
100
+
101
+ return html`
102
+ <ox-grist .mode=${mode} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}>
103
+ <div slot="headroom">
104
+ <div id="filters">
105
+ <ox-filters-form autofocus></ox-filters-form>
106
+ </div>
107
+
108
+ <div id="sorters">
109
+ Sort
110
+ <mwc-icon
111
+ @click=${e => {
112
+ const target = e.currentTarget
113
+ this.sortersControl.open({
114
+ right: 0,
115
+ top: target.offsetTop + target.offsetHeight
116
+ })
117
+ }}
118
+ >expand_more</mwc-icon
119
+ >
120
+ <ox-popup id="sorter-control">
121
+ <ox-sorters-control> </ox-sorters-control>
122
+ </ox-popup>
123
+ </div>
124
+
125
+ <div id="modes">
126
+ <mwc-icon @click=${() => (this.mode = 'GRID')} ?active=${mode == 'GRID'}>grid_on</mwc-icon>
127
+ <mwc-icon @click=${() => (this.mode = 'LIST')} ?active=${mode == 'LIST'}>format_list_bulleted</mwc-icon>
128
+ <mwc-icon @click=${() => (this.mode = 'CARD')} ?active=${mode == 'CARD'}>apps</mwc-icon>
129
+ </div>
130
+ </div>
131
+ </ox-grist>
132
+ `
133
+ }
134
+
135
+ async pageInitialized(lifecycle: any) {
136
+ this.gristConfig = {
137
+ list: {
138
+ fields: ['name', 'description'],
139
+ details: ['active', 'updatedAt']
140
+ },
141
+ columns: [
142
+ { type: 'gutter', gutterName: 'sequence' },
143
+ { type: 'gutter', gutterName: 'row-selector', multiple: true },
144
+ {
145
+ type: 'string',
146
+ name: 'name',
147
+ header: i18next.t('field.name'),
148
+ record: {
149
+ editable: true
150
+ },
151
+ filter: 'search',
152
+ sortable: true,
153
+ width: 150
154
+ },
155
+ {
156
+ type: 'string',
157
+ name: 'description',
158
+ header: i18next.t('field.description'),
159
+ record: {
160
+ editable: true
161
+ },
162
+ filter: 'search',
163
+ width: 200
164
+ },
165
+ {
166
+ type: 'select',
167
+ name: 'type',
168
+ header: i18next.t('field.type'),
169
+ record: {
170
+ options: ['', 'legend'],
171
+ editable: true
172
+ },
173
+ width: 120
174
+ },
175
+ {
176
+ type: 'string',
177
+ name: 'value',
178
+ header: i18next.t('field.value'),
179
+ record: {
180
+ editor: function (value, column, record, rowIndex, field) {
181
+ return getEditor(record.category)(value, column, record, rowIndex, field)
182
+ },
183
+ renderer: function (value, column, record, rowIndex, field) {
184
+ return getRenderer(record.category)(value, column, record, rowIndex, field)
185
+ },
186
+ editable: true
187
+ },
188
+ sortable: true,
189
+ width: 180
190
+ },
191
+ {
192
+ type: 'resource-object',
193
+ name: 'updater',
194
+ header: i18next.t('field.updater'),
195
+ record: {
196
+ editable: false
197
+ },
198
+ sortable: true,
199
+ width: 120
200
+ },
201
+ {
202
+ type: 'datetime',
203
+ name: 'updatedAt',
204
+ header: i18next.t('field.updated_at'),
205
+ record: {
206
+ editable: false
207
+ },
208
+ sortable: true,
209
+ width: 180
210
+ }
211
+ ],
212
+ rows: {
213
+ selectable: {
214
+ multiple: true
215
+ }
216
+ },
217
+ sorters: [
218
+ {
219
+ name: 'name'
220
+ }
221
+ ]
222
+ }
223
+ }
224
+
225
+ async pageUpdated(changes: any, lifecycle: any) {
226
+ if (this.active) {
227
+ // do something here when this page just became as active
228
+ }
229
+ }
230
+
231
+ async fetchHandler({ page = 1, limit = 100, sortings = [], filters = [] }: FetchOption) {
232
+ const response = await client.query({
233
+ query: gql`
234
+ query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
235
+ responses: shares(filters: $filters, pagination: $pagination, sortings: $sortings) {
236
+ items {
237
+ id
238
+ name
239
+ description
240
+ active
241
+ updater {
242
+ id
243
+ name
244
+ }
245
+ updatedAt
246
+ }
247
+ total
248
+ }
249
+ }
250
+ `,
251
+ variables: {
252
+ filters,
253
+ pagination: { page, limit },
254
+ sortings
255
+ }
256
+ })
257
+
258
+ return {
259
+ total: response.data.responses.total || 0,
260
+ records: response.data.responses.items || []
261
+ }
262
+ }
263
+
264
+ async _deleteShare() {
265
+ if (confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }))) {
266
+ const ids = this.grist.selected.map(record => record.id)
267
+ if (ids && ids.length > 0) {
268
+ const response = await client.mutate({
269
+ mutation: gql`
270
+ mutation ($ids: [String!]!) {
271
+ deleteShares(ids: $ids)
272
+ }
273
+ `,
274
+ variables: {
275
+ ids
276
+ }
277
+ })
278
+
279
+ if (!response.errors) {
280
+ this.grist.fetch()
281
+ notify({
282
+ message: i18next.t('text.info_x_successfully', { x: i18next.t('text.delete') })
283
+ })
284
+ }
285
+ }
286
+ }
287
+ }
288
+
289
+ async _updateShare() {
290
+ let patches = this.grist.dirtyRecords
291
+ if (patches && patches.length) {
292
+ patches = patches.map(patch => {
293
+ let patchField: any = patch.id ? { id: patch.id } : {}
294
+ const dirtyFields = patch.__dirtyfields__
295
+ for (let key in dirtyFields) {
296
+ patchField[key] = dirtyFields[key].after
297
+ }
298
+ patchField.cuFlag = patch.__dirty__
299
+
300
+ return patchField
301
+ })
302
+
303
+ const response = await client.mutate({
304
+ mutation: gql`
305
+ mutation ($patches: [SharePatch!]!) {
306
+ updateMultipleShare(patches: $patches) {
307
+ name
308
+ }
309
+ }
310
+ `,
311
+ variables: {
312
+ patches
313
+ }
314
+ })
315
+
316
+ if (!response.errors) {
317
+ this.grist.fetch()
318
+ }
319
+ }
320
+ }
321
+
322
+ async exportHandler() {
323
+ const exportTargets = this.grist.selected.length ? this.grist.selected : this.grist.dirtyData.records
324
+ const targetFieldSet = new Set(['id', 'name', 'description', 'active'])
325
+
326
+ return exportTargets.map(share => {
327
+ let tempObj = {}
328
+ for (const field of targetFieldSet) {
329
+ tempObj[field] = share[field]
330
+ }
331
+
332
+ return tempObj
333
+ })
334
+ }
335
+
336
+ async importHandler(records) {
337
+ const popup = openPopup(
338
+ html`
339
+ <share-importer
340
+ .shares=${records}
341
+ @imported=${() => {
342
+ history.back()
343
+ this.grist.fetch()
344
+ }}
345
+ ></share-importer>
346
+ `,
347
+ {
348
+ backdrop: true,
349
+ size: 'large',
350
+ title: i18next.t('title.import share')
351
+ }
352
+ )
353
+
354
+ popup.onclosed = () => {
355
+ this.grist.fetch()
356
+ }
357
+ }
358
+ }
@@ -4,28 +4,24 @@ import '@material/mwc-checkbox'
4
4
  import '@operato/i18n/ox-i18n.js'
5
5
 
6
6
  import { css, html, LitElement } from 'lit'
7
+ import { customElement, property, query } from 'lit/decorators.js'
7
8
 
8
9
  import { i18next, localize } from '@operato/i18n'
9
10
  import { clientSettingStore } from '@operato/shell/object-store.js'
10
11
 
12
+ @customElement('board-view-setting-let')
11
13
  export class BoardViewSettingLet extends localize(i18next)(LitElement) {
12
- static get styles() {
13
- return [
14
- css`
15
- label {
16
- font: var(--label-font);
17
- color: var(--label-color);
18
- text-transform: var(--label-text-transform);
19
- }
20
- `
21
- ]
22
- }
14
+ static styles = [
15
+ css`
16
+ label {
17
+ font: var(--label-font);
18
+ color: var(--label-color);
19
+ text-transform: var(--label-text-transform);
20
+ }
21
+ `
22
+ ]
23
23
 
24
- static get properties() {
25
- return {
26
- autoRefresh: Boolean
27
- }
28
- }
24
+ @property({ type: Boolean }) autoRefresh?: boolean
29
25
 
30
26
  render() {
31
27
  return html`
@@ -33,10 +29,10 @@ export class BoardViewSettingLet extends localize(i18next)(LitElement) {
33
29
  <ox-i18n slot="title" msgid="title.board view setting"></ox-i18n>
34
30
 
35
31
  <div slot="content">
36
- <mwc-formfield label=${i18next.t('label.auto refresh board view')}>
32
+ <mwc-formfield label=${String(i18next.t('label.auto refresh board view'))}>
37
33
  <mwc-checkbox
38
34
  id="auto-refresh"
39
- @change=${e => this.onchange(e)}
35
+ @change=${e => this.onChange(e)}
40
36
  ?checked=${this.autoRefresh}
41
37
  ></mwc-checkbox>
42
38
  </mwc-formfield>
@@ -50,7 +46,7 @@ export class BoardViewSettingLet extends localize(i18next)(LitElement) {
50
46
  this.autoRefresh = autoRefresh
51
47
  }
52
48
 
53
- async onchange(e) {
49
+ async onChange(e) {
54
50
  this.autoRefresh = e.target.checked
55
51
 
56
52
  const { autoRefresh: valueFromStore } = (await clientSettingStore.get('board-view'))?.value || {}
@@ -70,5 +66,3 @@ export class BoardViewSettingLet extends localize(i18next)(LitElement) {
70
66
  }
71
67
  }
72
68
  }
73
-
74
- customElements.define('board-view-setting-let', BoardViewSettingLet)
@@ -0,0 +1,4 @@
1
+ declare module '*.import' {
2
+ const components: any
3
+ export default components
4
+ }
@@ -0,0 +1,3 @@
1
+ import { ReferenceMap, Scene } from '@hatiolab/things-scene';
2
+ export declare function createBoardProvider(): ReferenceMap<Scene>;
3
+ export declare const provider: ReferenceMap<Scene>;
@@ -0,0 +1,77 @@
1
+ import gql from 'graphql-tag';
2
+ import { create, error, ReferenceMap } from '@hatiolab/things-scene';
3
+ import { DataStorage } from '@operato/board';
4
+ import { client, gqlContext, subscribe } from '@operato/graphql';
5
+ export function createBoardProvider() {
6
+ var _provider = new ReferenceMap(async (boardId, resolve, reject) => {
7
+ var _a;
8
+ try {
9
+ const response = await client.query({
10
+ query: gql `
11
+ query FetchBoardById($id: String!) {
12
+ board(id: $id) {
13
+ model
14
+ }
15
+ }
16
+ `,
17
+ variables: { id: boardId },
18
+ context: gqlContext()
19
+ });
20
+ const board = (_a = response.data) === null || _a === void 0 ? void 0 : _a.board;
21
+ if (!board) {
22
+ reject(new Error('Failed to get the requested board.'));
23
+ return;
24
+ }
25
+ var model = JSON.parse(board.model);
26
+ var scene;
27
+ try {
28
+ scene = await provider.get(boardId);
29
+ console.warn('Board fetched more than twice.', boardId);
30
+ }
31
+ catch (e) {
32
+ scene = create({
33
+ model,
34
+ mode: 0,
35
+ refProvider: provider,
36
+ dataStorage: new DataStorage(boardId),
37
+ dataSubscriptionProvider: {
38
+ subscribe: async (tag, component) => {
39
+ return await subscribe({
40
+ query: gql `
41
+ subscription {
42
+ data(tag: "${tag}") {
43
+ tag
44
+ data
45
+ }
46
+ }
47
+ `
48
+ }, {
49
+ next: async ({ data }) => {
50
+ if (data) {
51
+ component.data = data.data.data;
52
+ }
53
+ }
54
+ });
55
+ },
56
+ dispose() { }
57
+ }
58
+ });
59
+ // s.app.baseUrl = undefined;
60
+ }
61
+ resolve(scene);
62
+ // resolve(scene, {
63
+ // ...board,
64
+ // model
65
+ // })
66
+ }
67
+ catch (e) {
68
+ error(e);
69
+ reject(e);
70
+ }
71
+ }, async (id, ref) => {
72
+ ref.dispose();
73
+ });
74
+ return _provider;
75
+ }
76
+ export const provider = createBoardProvider();
77
+ //# sourceMappingURL=board-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"board-provider.js","sourceRoot":"","sources":["../client/board-provider.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,aAAa,CAAA;AAE7B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAS,MAAM,wBAAwB,CAAA;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEhE,MAAM,UAAU,mBAAmB;IACjC,IAAI,SAAS,GAAG,IAAI,YAAY,CAC9B,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAgB,EAAE;;QAC/C,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;gBAClC,KAAK,EAAE,GAAG,CAAA;;;;;;WAMT;gBACD,SAAS,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE;gBAC1B,OAAO,EAAE,UAAU,EAAE;aACtB,CAAC,CAAA;YAEF,MAAM,KAAK,GAAG,MAAA,QAAQ,CAAC,IAAI,0CAAE,KAAK,CAAA;YAElC,IAAI,CAAC,KAAK,EAAE;gBACV,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAA;gBACvD,OAAM;aACP;YAED,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YAEnC,IAAI,KAAY,CAAA;YAEhB,IAAI;gBACF,KAAK,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;gBACnC,OAAO,CAAC,IAAI,CAAC,gCAAgC,EAAE,OAAO,CAAC,CAAA;aACxD;YAAC,OAAO,CAAC,EAAE;gBACV,KAAK,GAAG,MAAM,CAAC;oBACb,KAAK;oBACL,IAAI,EAAE,CAAC;oBACP,WAAW,EAAE,QAAe;oBAC5B,WAAW,EAAE,IAAI,WAAW,CAAC,OAAO,CAAC;oBACrC,wBAAwB,EAAE;wBACxB,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;4BAClC,OAAO,MAAM,SAAS,CACpB;gCACE,KAAK,EAAE,GAAG,CAAA;;6CAEe,GAAG;;;;;6BAKnB;6BACV,EACD;gCACE,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;oCACvB,IAAI,IAAI,EAAE;wCACR,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;qCAChC;gCACH,CAAC;6BACF,CACF,CAAA;wBACH,CAAC;wBAED,OAAO,KAAI,CAAC;qBACb;iBACF,CAAC,CAAA;gBAEF,6BAA6B;aAC9B;YAED,OAAO,CAAC,KAAK,CAAC,CAAA;YAEd,mBAAmB;YACnB,cAAc;YACd,UAAU;YACV,KAAK;SACN;QAAC,OAAO,CAAC,EAAE;YACV,KAAK,CAAC,CAAC,CAAC,CAAA;YACR,MAAM,CAAC,CAAC,CAAC,CAAA;SACV;IACH,CAAC,EACD,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE;QAChB,GAAG,CAAC,OAAO,EAAE,CAAA;IACf,CAAC,CACF,CAAA;IAED,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAA","sourcesContent":["import gql from 'graphql-tag'\n\nimport { create, error, ReferenceMap, Scene } from '@hatiolab/things-scene'\nimport { DataStorage } from '@operato/board'\nimport { client, gqlContext, subscribe } from '@operato/graphql'\n\nexport function createBoardProvider() {\n var _provider = new ReferenceMap<Scene>(\n async (boardId, resolve, reject): Promise<any> => {\n try {\n const response = await client.query({\n query: gql`\n query FetchBoardById($id: String!) {\n board(id: $id) {\n model\n }\n }\n `,\n variables: { id: boardId },\n context: gqlContext()\n })\n\n const board = response.data?.board\n\n if (!board) {\n reject(new Error('Failed to get the requested board.'))\n return\n }\n\n var model = JSON.parse(board.model)\n\n var scene: Scene\n\n try {\n scene = await provider.get(boardId)\n console.warn('Board fetched more than twice.', boardId)\n } catch (e) {\n scene = create({\n model,\n mode: 0,\n refProvider: provider as any,\n dataStorage: new DataStorage(boardId),\n dataSubscriptionProvider: {\n subscribe: async (tag, component) => {\n return await subscribe(\n {\n query: gql`\n subscription {\n data(tag: \"${tag}\") {\n tag\n data\n }\n }\n `\n },\n {\n next: async ({ data }) => {\n if (data) {\n component.data = data.data.data\n }\n }\n }\n )\n },\n\n dispose() {}\n }\n })\n\n // s.app.baseUrl = undefined;\n }\n\n resolve(scene)\n\n // resolve(scene, {\n // ...board,\n // model\n // })\n } catch (e) {\n error(e)\n reject(e)\n }\n },\n async (id, ref) => {\n ref.dispose()\n }\n )\n\n return _provider\n}\n\nexport const provider = createBoardProvider()\n"]}
@@ -0,0 +1,2 @@
1
+ import '@operato/board/ox-property-editor-board-selector.js';
2
+ export default function bootstrap(): void;
@@ -0,0 +1,13 @@
1
+ import '@operato/board/ox-property-editor-board-selector.js';
2
+ import { OxPropertyEditor } from '@operato/property-editor';
3
+ import { registerEditor, registerRenderer } from '@operato/data-grist';
4
+ import { BoardEditor } from './data-grist/board-editor';
5
+ import { BoardRenderer } from './data-grist/board-renderer';
6
+ export default function bootstrap() {
7
+ registerRenderer('board', BoardRenderer);
8
+ registerEditor('board', BoardEditor);
9
+ OxPropertyEditor.register({
10
+ 'board-selector': 'ox-property-editor-board-selector'
11
+ });
12
+ }
13
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../client/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,qDAAqD,CAAA;AAE5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAEtE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAE3D,MAAM,CAAC,OAAO,UAAU,SAAS;IAC/B,gBAAgB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;IACxC,cAAc,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IAEpC,gBAAgB,CAAC,QAAQ,CAAC;QACxB,gBAAgB,EAAE,mCAAmC;KACtD,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import '@operato/board/ox-property-editor-board-selector.js'\n\nimport { OxPropertyEditor } from '@operato/property-editor'\nimport { registerEditor, registerRenderer } from '@operato/data-grist'\n\nimport { BoardEditor } from './data-grist/board-editor'\nimport { BoardRenderer } from './data-grist/board-renderer'\n\nexport default function bootstrap() {\n registerRenderer('board', BoardRenderer)\n registerEditor('board', BoardEditor)\n\n OxPropertyEditor.register({\n 'board-selector': 'ox-property-editor-board-selector'\n })\n}\n"]}
@@ -0,0 +1,14 @@
1
+ import '@operato/board/ox-board-selector.js';
2
+ import './board-renderer';
3
+ import { OxGristEditor } from '@operato/data-grist';
4
+ export declare class BoardEditor extends OxGristEditor {
5
+ static styles: import("lit").CSSResult;
6
+ value: any;
7
+ column: any;
8
+ record: any;
9
+ row?: number;
10
+ popup: any;
11
+ render(): import("lit-html").TemplateResult<1>;
12
+ firstUpdated(): Promise<void>;
13
+ openSelector(): void;
14
+ }