@things-factory/operato-board 6.1.145 → 6.1.147

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 (33) hide show
  1. package/dist-client/graphql/board.d.ts +13 -1
  2. package/dist-client/graphql/board.js +42 -12
  3. package/dist-client/graphql/board.js.map +1 -1
  4. package/dist-client/pages/board-list-page.js +32 -4
  5. package/dist-client/pages/board-list-page.js.map +1 -1
  6. package/dist-client/tsconfig.tsbuildinfo +1 -1
  7. package/dist-client/viewparts/board-basic-info.d.ts +47 -0
  8. package/dist-client/viewparts/board-basic-info.js +626 -0
  9. package/dist-client/viewparts/board-basic-info.js.map +1 -0
  10. package/dist-client/viewparts/board-info.d.ts +3 -14
  11. package/dist-client/viewparts/board-info.js +37 -395
  12. package/dist-client/viewparts/board-info.js.map +1 -1
  13. package/dist-client/viewparts/board-versions.d.ts +12 -0
  14. package/dist-client/viewparts/board-versions.js +154 -0
  15. package/dist-client/viewparts/board-versions.js.map +1 -0
  16. package/dist-client/viewparts/group-info.d.ts +4 -0
  17. package/dist-client/viewparts/group-info.js +57 -6
  18. package/dist-client/viewparts/group-info.js.map +1 -1
  19. package/dist-server/tsconfig.tsbuildinfo +1 -1
  20. package/helps/faq/databinding-copy-paste.md +22 -0
  21. package/helps/faq/images/databinding-copy-paste-01.png +0 -0
  22. package/helps/faq/images/style-copy-paste-01.png +0 -0
  23. package/helps/faq/images/tablecell-size-adjusting-01.png +0 -0
  24. package/helps/faq/style-copy-paste.md +22 -0
  25. package/helps/faq/tablecell-size-adjusting.md +13 -0
  26. package/helps/faq.md +14 -0
  27. package/package.json +18 -17
  28. package/schema.gql +34 -1
  29. package/translations/en.json +6 -0
  30. package/translations/ja.json +6 -0
  31. package/translations/ko.json +6 -0
  32. package/translations/ms.json +6 -0
  33. package/translations/zh.json +6 -0
@@ -0,0 +1,47 @@
1
+ import '@material/mwc-icon';
2
+ import { LitElement } from 'lit';
3
+ declare const BoardInfo_base: (new (...args: any[]) => {
4
+ _storeUnsubscribe: import("redux").Unsubscribe;
5
+ connectedCallback(): void;
6
+ disconnectedCallback(): void;
7
+ stateChanged(_state: unknown): void;
8
+ readonly isConnected: boolean;
9
+ }) & typeof LitElement;
10
+ export declare class BoardInfo extends BoardInfo_base {
11
+ static styles: import("lit").CSSResult[];
12
+ boardId?: string;
13
+ groupId?: string;
14
+ enableModeller?: boolean;
15
+ board: any;
16
+ boardGroupList: any[];
17
+ playGroupList: any[];
18
+ showTarget: boolean;
19
+ subdomain?: string;
20
+ targetDomains: {
21
+ id: string;
22
+ name: string;
23
+ subdomain: string;
24
+ }[];
25
+ targetGroups: {
26
+ id: string;
27
+ name: string;
28
+ }[];
29
+ targetSubdomain?: string;
30
+ targetGroupId?: string;
31
+ private original;
32
+ render(): import("lit-html").TemplateResult<1>;
33
+ stateChanged(state: any): void;
34
+ firstUpdated(): void;
35
+ refresh(): Promise<void>;
36
+ getGroupsByDomain(subdomain?: string): Promise<void>;
37
+ get isReleasable(): any;
38
+ cloneBoard(): Promise<void>;
39
+ exportBoard(): Promise<void>;
40
+ releaseBoard(): Promise<void>;
41
+ updateBoard(): Promise<void>;
42
+ deleteBoard(): Promise<void>;
43
+ joinPlayGroup(group: any): Promise<void>;
44
+ leavePlayGroup(group: any): Promise<void>;
45
+ close(): void;
46
+ }
47
+ export {};
@@ -0,0 +1,626 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import '@material/mwc-icon';
3
+ import gql from 'graphql-tag';
4
+ import { css, html, LitElement } from 'lit';
5
+ import { customElement, property, state } from 'lit/decorators.js';
6
+ import { connect } from 'pwa-helpers/connect-mixin';
7
+ import { i18next } from '@operato/i18n';
8
+ import { client } from '@operato/graphql';
9
+ import { navigate, store } from '@operato/shell';
10
+ let BoardInfo = class BoardInfo extends connect(store)(LitElement) {
11
+ constructor() {
12
+ super(...arguments);
13
+ this.boardGroupList = [];
14
+ this.playGroupList = [];
15
+ this.showTarget = false;
16
+ this.targetDomains = [];
17
+ this.targetGroups = [];
18
+ }
19
+ render() {
20
+ var _a;
21
+ var board = this.board || { name: '', description: '', playGroups: [] };
22
+ var boardGroupList = this.boardGroupList || [];
23
+ var playGroupList = (this.playGroupList || []).map(group => {
24
+ return Object.assign(Object.assign({}, group), { checked: false });
25
+ });
26
+ (board.playGroups || []).map(group => {
27
+ var playGroup = playGroupList.find(g => g.id == group.id);
28
+ if (playGroup) {
29
+ playGroup.checked = true;
30
+ }
31
+ });
32
+ return html `
33
+ ${board.thumbnail ? html ` <img src=${board.thumbnail} /> ` : html ``}
34
+
35
+ <form>
36
+ <fieldset>
37
+ <legend>${i18next.t('label.information')}</legend>
38
+ <label>${i18next.t('label.name')}</label>
39
+ <div oneline>
40
+ <input
41
+ type="text"
42
+ .value=${board.name}
43
+ @change=${e => (this.board = Object.assign(Object.assign({}, this.board), { name: e.target.value }))}
44
+ ?disabled=${!this.enableModeller}
45
+ />
46
+ ${this.enableModeller
47
+ ? html `
48
+ <mwc-icon
49
+ @click=${() => {
50
+ this.showTarget = !this.showTarget;
51
+ }}
52
+ tail
53
+ >${this.showTarget ? 'arrow_drop_up' : 'arrow_drop_down'}</mwc-icon
54
+ >
55
+ `
56
+ : html ``}
57
+ </div>
58
+ ${this.showTarget
59
+ ? html `
60
+ <div fullwidth target>
61
+ <label>${i18next.t('label.board-copy')}</label>
62
+ <div oneline>
63
+ <select
64
+ @change=${e => {
65
+ this.targetSubdomain = e.target.value;
66
+ this.getGroupsByDomain(this.targetSubdomain);
67
+ }}
68
+ placeholder="choose domain ..."
69
+ .value=${this.targetSubdomain}
70
+ ?disabled=${!this.enableModeller}
71
+ >
72
+ <option value=""></option>
73
+ ${this.targetDomains.map(domain => html `
74
+ <option .value=${domain.subdomain} ?selected=${domain.subdomain == this.targetSubdomain}>
75
+ ${domain.name}
76
+ </option>
77
+ `)}
78
+ </select>
79
+
80
+ <select
81
+ @change=${e => (this.targetGroupId = e.target.value)}
82
+ placeholder="choose group ..."
83
+ .value=${this.targetGroupId}
84
+ ?disabled=${!this.enableModeller}
85
+ >
86
+ <option value=""></option>
87
+ ${this.targetGroups.map(group => html `
88
+ <option .value=${group.id} ?selected=${group.id == this.targetGroupId}>
89
+ ${group.name}
90
+ </option>
91
+ `)}
92
+ </select>
93
+ </div>
94
+ <div oneline>
95
+ <mwc-button
96
+ dense
97
+ raised
98
+ label=${String(i18next.t('button.copy'))}
99
+ ?disabled=${!this.enableModeller ||
100
+ !((_a = this.original) === null || _a === void 0 ? void 0 : _a.name) ||
101
+ !this.board.name ||
102
+ !this.targetSubdomain ||
103
+ (this.original.name == this.board.name && this.subdomain == this.targetSubdomain)}
104
+ @click=${this.cloneBoard.bind(this)}
105
+ icon="content_copy"
106
+ right
107
+ ></mwc-button>
108
+ <mwc-button
109
+ dense
110
+ raised
111
+ label=${String(i18next.t('button.export'))}
112
+ @click=${this.exportBoard.bind(this)}
113
+ icon="download"
114
+ ></mwc-button>
115
+ </div>
116
+ </div>
117
+ `
118
+ : html ``}
119
+
120
+ <label>${i18next.t('label.description')}</label>
121
+ <input
122
+ type="text"
123
+ .value=${board.description}
124
+ @change=${e => (this.board = Object.assign(Object.assign({}, this.board), { description: e.target.value }))}
125
+ ?disabled=${!this.enableModeller}
126
+ />
127
+
128
+ <label>${i18next.t('label.group')}</label>
129
+ <select
130
+ @change=${e => (this.board = Object.assign(Object.assign({}, this.board), { groupId: e.target.value }))}
131
+ .value=${this.groupId || ''}
132
+ ?disabled=${!this.enableModeller}
133
+ >
134
+ <option value="" ?selected=${'' == this.groupId}></option>
135
+ ${boardGroupList.map(item => html ` <option .value=${item.id} ?selected=${item.id == this.groupId}>${item.name}</option> `)}
136
+ </select>
137
+ <label>${i18next.t('label.creator')}</label>
138
+ <span>
139
+ <mwc-icon>person</mwc-icon> ${(board.creator && board.creator.name) || 'anonymous'}
140
+ <mwc-icon>schedule</mwc-icon> ${new Date(Number(board.createdAt)).toLocaleString()}
141
+ </span>
142
+
143
+ <label>${i18next.t('label.updater')}</label>
144
+ <span>
145
+ <mwc-icon>person</mwc-icon> ${(board.updater && board.updater.name) || 'anonymouse'}
146
+ <mwc-icon>schedule</mwc-icon> ${new Date(Number(board.updatedAt)).toLocaleString()}
147
+ </span>
148
+
149
+ <label>${i18next.t('label.state')}</label>
150
+ <span state>
151
+ <div oneline>
152
+ <mwc-icon>signpost</mwc-icon> ${(board.state || '').toUpperCase()}
153
+ <mwc-icon>pin</mwc-icon> ${board.version}
154
+ </div>
155
+ <mwc-button
156
+ dense
157
+ raised
158
+ label=${String(i18next.t('button.release'))}
159
+ ?disabled=${!this.enableModeller || !this.isReleasable}
160
+ @click=${this.releaseBoard.bind(this)}
161
+ icon="new_releases"
162
+ ></mwc-button>
163
+ </span>
164
+
165
+ <div buttons>
166
+ <mwc-button
167
+ dense
168
+ raised
169
+ danger
170
+ label=${String(i18next.t('button.delete'))}
171
+ ?disabled=${!this.enableModeller}
172
+ @click=${this.deleteBoard.bind(this)}
173
+ icon="delete_outline"
174
+ ></mwc-button>
175
+ <mwc-button
176
+ dense
177
+ raised
178
+ label=${String(i18next.t('button.save'))}
179
+ ?disabled=${!this.enableModeller}
180
+ @click=${this.updateBoard.bind(this)}
181
+ icon="save"
182
+ ></mwc-button>
183
+ <mwc-button
184
+ dense
185
+ raised
186
+ label=${String(i18next.t('button.edit'))}
187
+ ?disabled=${!this.enableModeller}
188
+ @click=${() => navigate(`${'board-modeller/' + this.boardId}`)}
189
+ icon="drive_file_rename_outline"
190
+ ></mwc-button>
191
+ </div>
192
+ </fieldset>
193
+
194
+ <fieldset>
195
+ <legend>${i18next.t('label.play-group')}</legend>
196
+
197
+ ${playGroupList.map(item => html `
198
+ <input
199
+ type="checkbox"
200
+ value=${item.id}
201
+ .checked=${item.checked}
202
+ @change=${e => {
203
+ e.target.checked ? this.joinPlayGroup(item) : this.leavePlayGroup(item);
204
+ }}
205
+ />
206
+ <label>${item.name}</label>
207
+ `)}
208
+ </fieldset>
209
+ </form>
210
+ `;
211
+ }
212
+ stateChanged(state) {
213
+ var _a, _b, _c;
214
+ this.subdomain = (_b = (_a = state.app) === null || _a === void 0 ? void 0 : _a.domain) === null || _b === void 0 ? void 0 : _b.subdomain;
215
+ this.targetSubdomain = (_c = this.targetSubdomain) !== null && _c !== void 0 ? _c : this.subdomain;
216
+ }
217
+ firstUpdated() {
218
+ this.refresh();
219
+ }
220
+ async refresh() {
221
+ var _a;
222
+ var response = (await client.query({
223
+ query: gql `
224
+ query FetchBoardById($id: String!) {
225
+ board(id: $id) {
226
+ id
227
+ name
228
+ description
229
+ group {
230
+ id
231
+ name
232
+ }
233
+ playGroups {
234
+ id
235
+ name
236
+ }
237
+ thumbnail
238
+ createdAt
239
+ creator {
240
+ id
241
+ name
242
+ }
243
+ state
244
+ version
245
+ updatedAt
246
+ updater {
247
+ id
248
+ name
249
+ }
250
+ }
251
+
252
+ groups {
253
+ items {
254
+ id
255
+ name
256
+ description
257
+ }
258
+ }
259
+
260
+ playGroups {
261
+ items {
262
+ id
263
+ name
264
+ description
265
+ }
266
+ total
267
+ }
268
+
269
+ domainsWithPrivilege(name: "mutation", category: "board") {
270
+ name
271
+ subdomain
272
+ }
273
+ }
274
+ `,
275
+ variables: { id: this.boardId }
276
+ })).data;
277
+ this.board = response.board;
278
+ this.boardGroupList = response.groups.items;
279
+ this.playGroupList = response.playGroups.items;
280
+ this.original = Object.assign({}, this.board);
281
+ this.groupId = (_a = this.board.group) === null || _a === void 0 ? void 0 : _a.id;
282
+ this.targetDomains = response.domainsWithPrivilege;
283
+ this.targetGroups = response.groups.items;
284
+ this.targetGroupId = this.groupId;
285
+ }
286
+ async getGroupsByDomain(subdomain) {
287
+ this.targetGroups = [];
288
+ this.targetGroupId = '';
289
+ if (!subdomain) {
290
+ return;
291
+ }
292
+ var response = (await client.query({
293
+ query: gql `
294
+ query {
295
+ groups {
296
+ items {
297
+ id
298
+ name
299
+ description
300
+ }
301
+ }
302
+ }
303
+ `,
304
+ variables: { id: this.boardId },
305
+ context: {
306
+ headers: {
307
+ 'x-things-factory-domain': subdomain
308
+ }
309
+ }
310
+ })).data;
311
+ this.targetGroups = response.groups.items;
312
+ }
313
+ get isReleasable() {
314
+ if (!this.board || this.board.state == 'released') {
315
+ return false;
316
+ }
317
+ const { name, description, groupId } = this.board;
318
+ return (this.original &&
319
+ this.original.name == name &&
320
+ this.original.description == description &&
321
+ this.original.groupId == groupId);
322
+ }
323
+ async cloneBoard() {
324
+ if (!this.original.name || (this.board.name == this.original.name && this.subdomain == this.targetSubdomain)) {
325
+ document.dispatchEvent(new CustomEvent('notify', {
326
+ detail: {
327
+ level: 'error',
328
+ message: i18next.t('error.name must be unique from the original board', { name: this.original.name })
329
+ }
330
+ }));
331
+ return;
332
+ }
333
+ const { id, name, description } = this.board;
334
+ this.dispatchEvent(new CustomEvent('clone-board', {
335
+ detail: {
336
+ id,
337
+ name,
338
+ description,
339
+ targetSubdomain: this.targetSubdomain,
340
+ targetGroupId: this.targetGroupId
341
+ },
342
+ bubbles: true,
343
+ composed: true
344
+ }));
345
+ this.close();
346
+ }
347
+ async exportBoard() {
348
+ const json = JSON.stringify(this.board, null, 2);
349
+ const link = document.createElement('a');
350
+ link.setAttribute('href', encodeURI('data:application/json;charset=utf-8,' + json));
351
+ link.setAttribute('download', `${this.board.name}.json`);
352
+ document.body.appendChild(link);
353
+ link.click();
354
+ document.body.removeChild(link);
355
+ }
356
+ async releaseBoard() {
357
+ const { id } = this.board;
358
+ this.dispatchEvent(new CustomEvent('release-board', {
359
+ detail: {
360
+ id
361
+ },
362
+ bubbles: true,
363
+ composed: true
364
+ }));
365
+ this.close();
366
+ }
367
+ async updateBoard() {
368
+ this.dispatchEvent(new CustomEvent('update-board', {
369
+ detail: this.board,
370
+ bubbles: true,
371
+ composed: true
372
+ }));
373
+ this.close();
374
+ }
375
+ async deleteBoard() {
376
+ // TODO 삭제하려는 보드이름을 입력하게 해서, 한번 더 확인할 것.
377
+ this.dispatchEvent(new CustomEvent('delete-board', {
378
+ detail: this.board,
379
+ bubbles: true,
380
+ composed: true
381
+ }));
382
+ this.close();
383
+ }
384
+ async joinPlayGroup(group) {
385
+ this.dispatchEvent(new CustomEvent('join-playgroup', {
386
+ detail: {
387
+ board: this.board,
388
+ playGroup: group
389
+ },
390
+ bubbles: true,
391
+ composed: true
392
+ }));
393
+ }
394
+ async leavePlayGroup(group) {
395
+ this.dispatchEvent(new CustomEvent('leave-playgroup', {
396
+ detail: {
397
+ board: this.board,
398
+ playGroup: group
399
+ },
400
+ bubbles: true,
401
+ composed: true
402
+ }));
403
+ }
404
+ close() {
405
+ history.back();
406
+ }
407
+ };
408
+ BoardInfo.styles = [
409
+ css `
410
+ :host {
411
+ display: block;
412
+ background-color: var(--main-section-background-color);
413
+ position: relative;
414
+
415
+ --form-grid-gap: 2px 0;
416
+ --input-field-padding: var(--padding-default);
417
+ --legend-padding: var(--padding-default) 0 var(--padding-narrow) 0;
418
+ --mdc-button-horizontal-padding: var(--padding-default);
419
+ }
420
+
421
+ img {
422
+ display: block;
423
+
424
+ margin: auto;
425
+ max-width: 100%;
426
+ max-height: 100%;
427
+ border-bottom: 2px solid rgba(0, 0, 0, 0.1);
428
+ }
429
+
430
+ form {
431
+ display: grid;
432
+ grid-template-columns: repeat(12, 1fr);
433
+ grid-gap: var(--form-grid-gap);
434
+ grid-auto-rows: minmax(24px, auto);
435
+ padding: var(--padding-wide);
436
+ align-items: center;
437
+ }
438
+
439
+ [buttons] {
440
+ grid-column: span 12;
441
+ padding: var(--padding-default) 0;
442
+ text-align: right;
443
+ }
444
+
445
+ [buttons] * {
446
+ margin: 0 0 0 var(--margin-narrow);
447
+ }
448
+
449
+ [danger] {
450
+ float: left;
451
+ margin: 0 var(--margin-narrow) 0 0;
452
+ --mdc-theme-primary: var(--status-danger-color);
453
+ }
454
+
455
+ fieldset {
456
+ display: contents;
457
+ }
458
+
459
+ legend {
460
+ grid-column: span 12;
461
+ padding: var(--legend-padding);
462
+ font: var(--legend-font);
463
+ color: var(--legend-text-color);
464
+ text-transform: capitalize;
465
+ }
466
+
467
+ label {
468
+ grid-column: span 12;
469
+ text-transform: capitalize;
470
+ color: var(--label-color);
471
+ font: var(--label-font);
472
+ }
473
+
474
+ span {
475
+ grid-column: span 12;
476
+ border-bottom: var(--border-dark-color);
477
+ margin-bottom: var(--margin-default);
478
+ padding-bottom: var(--padding-narrow);
479
+ font: var(--input-field-font);
480
+ }
481
+
482
+ span[state] {
483
+ display: flex;
484
+ align-items: center;
485
+ justify-content: space-between;
486
+ }
487
+
488
+ span mwc-icon {
489
+ vertical-align: middle;
490
+ font-size: var(--fontsize-large);
491
+ color: var(--primary-color);
492
+ }
493
+
494
+ input,
495
+ table,
496
+ select,
497
+ textarea,
498
+ [custom-input] {
499
+ grid-column: span 12;
500
+
501
+ border: var(--input-field-border);
502
+ border-radius: var(--input-field-border-radius);
503
+ margin-bottom: var(--margin-default);
504
+ padding: var(--input-field-padding);
505
+ font: var(--input-field-font);
506
+ }
507
+
508
+ mwc-icon[tail] {
509
+ margin-bottom: var(--margin-default);
510
+ }
511
+
512
+ input[type='checkbox'],
513
+ input[type='radio'] {
514
+ place-self: center;
515
+ margin: 0;
516
+ grid-column: 1;
517
+ }
518
+
519
+ input[type='checkbox'] + label,
520
+ input[type='radio'] + label {
521
+ text-align: left;
522
+ grid-column: span 11 / auto;
523
+
524
+ font: var(--form-sublabel-font);
525
+ color: var(--form-sublabel-color);
526
+ }
527
+
528
+ input:focus {
529
+ outline: none;
530
+ border: 1px solid var(--focus-background-color);
531
+ }
532
+
533
+ div[fullwidth] {
534
+ grid-column: span 12 / auto;
535
+ border-bottom: var(--border-dark-color);
536
+
537
+ display: flex;
538
+ flex-direction: column;
539
+ align-items: stretch;
540
+ gap: var(--margin-default);
541
+ }
542
+
543
+ div[oneline] {
544
+ grid-column: span 12 / auto;
545
+
546
+ display: flex;
547
+ align-items: center;
548
+ gap: var(--margin-default);
549
+ }
550
+
551
+ div[oneline] input {
552
+ flex: 1;
553
+ }
554
+
555
+ div[oneline] select {
556
+ flex: 1;
557
+ }
558
+
559
+ div[oneline] mwc-button {
560
+ margin-bottom: var(--margin-default);
561
+ }
562
+
563
+ mwc-button[right] {
564
+ margin-left: auto;
565
+ }
566
+
567
+ @media screen and (max-width: 460px) {
568
+ :host {
569
+ width: 100vw;
570
+ }
571
+ }
572
+ `
573
+ ];
574
+ __decorate([
575
+ property({ type: String }),
576
+ __metadata("design:type", String)
577
+ ], BoardInfo.prototype, "boardId", void 0);
578
+ __decorate([
579
+ property({ type: String }),
580
+ __metadata("design:type", String)
581
+ ], BoardInfo.prototype, "groupId", void 0);
582
+ __decorate([
583
+ property({ type: Boolean, attribute: 'enable-modeller' }),
584
+ __metadata("design:type", Boolean)
585
+ ], BoardInfo.prototype, "enableModeller", void 0);
586
+ __decorate([
587
+ state(),
588
+ __metadata("design:type", Object)
589
+ ], BoardInfo.prototype, "board", void 0);
590
+ __decorate([
591
+ state(),
592
+ __metadata("design:type", Array)
593
+ ], BoardInfo.prototype, "boardGroupList", void 0);
594
+ __decorate([
595
+ state(),
596
+ __metadata("design:type", Array)
597
+ ], BoardInfo.prototype, "playGroupList", void 0);
598
+ __decorate([
599
+ state(),
600
+ __metadata("design:type", Boolean)
601
+ ], BoardInfo.prototype, "showTarget", void 0);
602
+ __decorate([
603
+ state(),
604
+ __metadata("design:type", String)
605
+ ], BoardInfo.prototype, "subdomain", void 0);
606
+ __decorate([
607
+ state(),
608
+ __metadata("design:type", Array)
609
+ ], BoardInfo.prototype, "targetDomains", void 0);
610
+ __decorate([
611
+ state(),
612
+ __metadata("design:type", Array)
613
+ ], BoardInfo.prototype, "targetGroups", void 0);
614
+ __decorate([
615
+ state(),
616
+ __metadata("design:type", String)
617
+ ], BoardInfo.prototype, "targetSubdomain", void 0);
618
+ __decorate([
619
+ state(),
620
+ __metadata("design:type", String)
621
+ ], BoardInfo.prototype, "targetGroupId", void 0);
622
+ BoardInfo = __decorate([
623
+ customElement('board-basic-info')
624
+ ], BoardInfo);
625
+ export { BoardInfo };
626
+ //# sourceMappingURL=board-basic-info.js.map