@things-factory/board-ui 6.2.52 → 6.2.58

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 (44) hide show
  1. package/client/board-list/board-tile-list.ts +13 -12
  2. package/client/board-list/group-bar.ts +7 -6
  3. package/client/bootstrap.ts +0 -5
  4. package/client/pages/board-list-page.ts +0 -5
  5. package/client/pages/board-modeller-page.ts +9 -2
  6. package/client/viewparts/board-basic-info.ts +8 -5
  7. package/client/viewparts/board-info.ts +1 -5
  8. package/client/viewparts/board-versions.ts +14 -7
  9. package/client/viewparts/group-info.ts +10 -4
  10. package/dist-client/board-list/board-tile-list.d.ts +0 -1
  11. package/dist-client/board-list/board-tile-list.js +10 -16
  12. package/dist-client/board-list/board-tile-list.js.map +1 -1
  13. package/dist-client/board-list/group-bar.d.ts +0 -1
  14. package/dist-client/board-list/group-bar.js +5 -10
  15. package/dist-client/board-list/group-bar.js.map +1 -1
  16. package/dist-client/bootstrap.js +0 -3
  17. package/dist-client/bootstrap.js.map +1 -1
  18. package/dist-client/pages/board-list-page.d.ts +0 -1
  19. package/dist-client/pages/board-list-page.js +0 -11
  20. package/dist-client/pages/board-list-page.js.map +1 -1
  21. package/dist-client/pages/board-modeller-page.d.ts +1 -1
  22. package/dist-client/pages/board-modeller-page.js +11 -2
  23. package/dist-client/pages/board-modeller-page.js.map +1 -1
  24. package/dist-client/tsconfig.tsbuildinfo +1 -1
  25. package/dist-client/viewparts/board-basic-info.d.ts +2 -2
  26. package/dist-client/viewparts/board-basic-info.js +11 -8
  27. package/dist-client/viewparts/board-basic-info.js.map +1 -1
  28. package/dist-client/viewparts/board-info.d.ts +0 -1
  29. package/dist-client/viewparts/board-info.js +1 -8
  30. package/dist-client/viewparts/board-info.js.map +1 -1
  31. package/dist-client/viewparts/board-versions.js +11 -7
  32. package/dist-client/viewparts/board-versions.js.map +1 -1
  33. package/dist-client/viewparts/group-info.js +7 -4
  34. package/dist-client/viewparts/group-info.js.map +1 -1
  35. package/dist-server/tsconfig.tsbuildinfo +1 -1
  36. package/package.json +4 -4
  37. package/client/actions/permissions.ts +0 -1
  38. package/client/reducers/permissions.ts +0 -41
  39. package/dist-client/actions/permissions.d.ts +0 -1
  40. package/dist-client/actions/permissions.js +0 -2
  41. package/dist-client/actions/permissions.js.map +0 -1
  42. package/dist-client/reducers/permissions.d.ts +0 -4
  43. package/dist-client/reducers/permissions.js +0 -32
  44. package/dist-client/reducers/permissions.js.map +0 -1
@@ -7,6 +7,7 @@ import { customElement, property, state, query } from 'lit/decorators.js'
7
7
  import { keyed } from 'lit/directives/keyed.js'
8
8
 
9
9
  import { client } from '@operato/graphql'
10
+ import { privileged } from '@things-factory/auth-base/dist-client'
10
11
 
11
12
  @customElement('board-tile-list')
12
13
  export class BoardTileList extends LitElement {
@@ -107,7 +108,6 @@ export class BoardTileList extends LitElement {
107
108
  `
108
109
  ]
109
110
 
110
- @property({ type: Boolean, attribute: 'creatable' }) creatable: boolean = false
111
111
  @property({ type: Array }) boards: any[] = []
112
112
  @property({ type: Array }) favorites: any[] = []
113
113
  @property({ type: Array }) groups: any[] = []
@@ -169,17 +169,18 @@ export class BoardTileList extends LitElement {
169
169
  var boards = this.boards || []
170
170
 
171
171
  return html`
172
- ${this.creatable
173
- ? html`
174
- <ox-board-creation-card
175
- .groups=${this.groups}
176
- .defaultGroup=${this.group}
177
- @create-board=${e => this.onCreateBoard(e)}
178
- card
179
- create
180
- ></ox-board-creation-card>
181
- `
182
- : html``}
172
+ ${privileged(
173
+ { privilege: 'mutation', category: 'board' },
174
+ html`
175
+ <ox-board-creation-card
176
+ .groups=${this.groups}
177
+ .defaultGroup=${this.group}
178
+ @create-board=${e => this.onCreateBoard(e)}
179
+ card
180
+ create
181
+ ></ox-board-creation-card>
182
+ `
183
+ )}
183
184
  ${keyed(
184
185
  Date.now(),
185
186
  boards.map(
@@ -5,6 +5,7 @@ import { customElement, property } from 'lit/decorators.js'
5
5
 
6
6
  import ScrollBooster from 'scrollbooster'
7
7
 
8
+ import { privileged } from '@things-factory/auth-base/dist-client'
8
9
  import { longpressable } from '@things-factory/utils'
9
10
 
10
11
  @customElement('group-bar')
@@ -70,7 +71,6 @@ export default class GroupBar extends LitElement {
70
71
  @property({ type: Array }) groups?: any[]
71
72
  @property({ type: String }) groupId?: string
72
73
  @property({ type: String }) targetPage?: string
73
- @property({ type: Boolean, attribute: true }) creatable?: boolean
74
74
 
75
75
  private __sb?: ScrollBooster
76
76
 
@@ -85,11 +85,12 @@ export default class GroupBar extends LitElement {
85
85
  <a href="${this.targetPage}/favor"><mwc-icon>star</mwc-icon></a>
86
86
  </li>
87
87
 
88
- ${this.creatable
89
- ? html`<li ?active=${this.groupId === 'mywork'}>
90
- <a href="${this.targetPage}/mywork"><mwc-icon>engineering</mwc-icon></a>
91
- </li>`
92
- : nothing}
88
+ ${privileged(
89
+ { privilege: 'mutation', category: 'board' },
90
+ html`<li ?active=${this.groupId === 'mywork'}>
91
+ <a href="${this.targetPage}/mywork"><mwc-icon>engineering</mwc-icon></a>
92
+ </li>`
93
+ )}
93
94
  ${(this.groups || []).map(
94
95
  group => html`
95
96
  <li ?active=${this.groupId === group.id} @long-press=${e => this.infoGroup(group.id)}>
@@ -8,9 +8,6 @@ import { BoardEditor } from './data-grist/board-editor'
8
8
  import { BoardRenderer } from './data-grist/board-renderer'
9
9
  import { ColorMapEditor } from './data-grist/color-map-editor'
10
10
  import { ColorRangesEditor } from './data-grist/color-ranges-editor'
11
- import { store } from '@operato/shell'
12
-
13
- import permissions from './reducers/permissions'
14
11
 
15
12
  export default function bootstrap() {
16
13
  registerRenderer('board', BoardRenderer)
@@ -25,8 +22,6 @@ export default function bootstrap() {
25
22
  'board-selector': 'ox-property-editor-board-selector'
26
23
  })
27
24
 
28
- store.addReducers({ permissions })
29
-
30
25
  /* append viewpart anchor to asidebar */
31
26
  appendViewpart({
32
27
  name: 'viewpart-info',
@@ -66,7 +66,6 @@ export class BoardListPage extends localize(i18next)(connect(store)(InfiniteScro
66
66
  @property({ type: Array }) groups: any[] = []
67
67
  @property({ type: Array }) boards: any[] = []
68
68
  @property({ type: Array }) favorites: any[] = []
69
- @property({ type: Array }) boardPermissions: any[] = []
70
69
 
71
70
  @state() searchText: string = ''
72
71
 
@@ -116,7 +115,6 @@ export class BoardListPage extends localize(i18next)(connect(store)(InfiniteScro
116
115
  .groupId=${this.groupId}
117
116
  targetPage="board-list"
118
117
  @info-group=${e => this.onInfoGroup(e.detail)}
119
- ?creatable=${this.boardPermissions?.includes('Modeller')}
120
118
  ></group-bar>
121
119
 
122
120
  <board-tile-list
@@ -126,7 +124,6 @@ export class BoardListPage extends localize(i18next)(connect(store)(InfiniteScro
126
124
  .groups=${this.groups}
127
125
  .group=${this.groupId}
128
126
  search-text=${this.searchText}
129
- ?creatable=${this.boardPermissions?.includes('Modeller')}
130
127
  @info-board=${e => this.onInfoBoard(e.detail)}
131
128
  @scroll=${e => {
132
129
  this.onScroll(e)
@@ -288,7 +285,6 @@ export class BoardListPage extends localize(i18next)(connect(store)(InfiniteScro
288
285
 
289
286
  stateChanged(state) {
290
287
  this.favorites = state.favorite.favorites
291
- this.boardPermissions = state.permissions.boardPermissions
292
288
  }
293
289
 
294
290
  firstUpdated() {
@@ -352,7 +348,6 @@ export class BoardListPage extends localize(i18next)(connect(store)(InfiniteScro
352
348
  <board-info
353
349
  .board=${board}
354
350
  .groupId=${this.groupId}
355
- ?enable-modeller=${this.boardPermissions?.includes('Modeller')}
356
351
  @clone-board=${e => this.onCloneBoard(e.detail)}
357
352
  @release-board=${e => this.onReleaseBoard(e.detail)}
358
353
  @revert-board-version=${e => this.onRevertBoardVersion(e.detail)}
@@ -9,6 +9,7 @@ import { connect } from 'pwa-helpers/connect-mixin.js'
9
9
  import { BoardModeller } from '@operato/board/ox-board-modeller.js'
10
10
  import { OxPropertyEditor } from '@operato/property-editor'
11
11
  import { PageView, store } from '@operato/shell'
12
+ import { hasPrivilege } from '@things-factory/auth-base/dist-client'
12
13
  import { client, gqlContext } from '@operato/graphql'
13
14
  import { i18next } from '@operato/i18n'
14
15
  import { OxPrompt } from '@operato/popup/ox-prompt.js'
@@ -170,9 +171,15 @@ export class BoardModellerPage extends connect(store)(PageView) {
170
171
  }
171
172
  }
172
173
 
173
- updated(changes) {
174
+ async updated(changes) {
174
175
  if (changes.has('boardId')) {
175
- this.refresh()
176
+ if (await hasPrivilege({ privilege: 'mutation', category: 'board' })) {
177
+ this.refresh()
178
+ } else {
179
+ this.boardId = null
180
+ this.model = null
181
+ this.modeller?.close()
182
+ }
176
183
  }
177
184
  }
178
185
 
@@ -1,7 +1,7 @@
1
1
  import '@material/mwc-icon'
2
2
 
3
3
  import gql from 'graphql-tag'
4
- import { css, html, LitElement } from 'lit'
4
+ import { css, html, LitElement, nothing } from 'lit'
5
5
  import { customElement, property, state } from 'lit/decorators.js'
6
6
  import { connect } from 'pwa-helpers/connect-mixin'
7
7
 
@@ -9,6 +9,7 @@ import { i18next } from '@operato/i18n'
9
9
  import { client } from '@operato/graphql'
10
10
  import { navigate, store } from '@operato/shell'
11
11
  import { OxPrompt } from '@operato/popup/ox-prompt.js'
12
+ import { hasPrivilege } from '@things-factory/auth-base/dist-client'
12
13
 
13
14
  @customElement('board-basic-info')
14
15
  export class BoardInfo extends connect(store)(LitElement) {
@@ -181,13 +182,13 @@ export class BoardInfo extends connect(store)(LitElement) {
181
182
 
182
183
  @property({ type: String }) boardId?: string
183
184
  @property({ type: String }) groupId?: string
184
- @property({ type: Boolean, attribute: 'enable-modeller' }) enableModeller?: boolean
185
185
 
186
186
  @state() board: any
187
187
  @state() boardGroupList: any[] = []
188
188
  @state() playGroupList: any[] = []
189
189
  @state() showTarget: boolean = false
190
190
  @state() subdomain?: string
191
+ @state() enableModeller?: boolean = false
191
192
 
192
193
  @state() targetDomains: { id: string; name: string; subdomain: string }[] = []
193
194
  @state() targetGroups: { id: string; name: string }[] = []
@@ -236,7 +237,7 @@ export class BoardInfo extends connect(store)(LitElement) {
236
237
  >${this.showTarget ? 'arrow_drop_up' : 'arrow_drop_down'}</mwc-icon
237
238
  >
238
239
  `
239
- : html``}
240
+ : nothing}
240
241
  </div>
241
242
  ${this.showTarget
242
243
  ? html`
@@ -408,7 +409,9 @@ export class BoardInfo extends connect(store)(LitElement) {
408
409
  this.targetSubdomain = this.targetSubdomain ?? this.subdomain
409
410
  }
410
411
 
411
- firstUpdated() {
412
+ async firstUpdated() {
413
+ this.enableModeller = await hasPrivilege({ privilege: 'mutation', category: 'board' })
414
+
412
415
  this.refresh()
413
416
  }
414
417
 
@@ -462,7 +465,7 @@ export class BoardInfo extends connect(store)(LitElement) {
462
465
  total
463
466
  }
464
467
 
465
- domainsWithPrivilege(name: "mutation", category: "board") {
468
+ domainsWithPrivilege(privilege: "mutation", category: "board") {
466
469
  name
467
470
  subdomain
468
471
  }
@@ -59,7 +59,6 @@ export class BoardInfo extends LitElement {
59
59
  ]
60
60
 
61
61
  @property({ type: Object }) board?: { id: string; name: string }
62
- @property({ type: Boolean, attribute: 'enable-modeller' }) enableModeller?: boolean
63
62
 
64
63
  @state() tab: string = 'basic'
65
64
 
@@ -72,10 +71,7 @@ export class BoardInfo extends LitElement {
72
71
  </div>
73
72
  <div content>
74
73
  ${this.tab == 'basic'
75
- ? html`<board-basic-info
76
- boardId=${ifDefined(this.board?.id)}
77
- ?enable-modeller=${this.enableModeller}
78
- ></board-basic-info>`
74
+ ? html`<board-basic-info boardId=${ifDefined(this.board?.id)}></board-basic-info>`
79
75
  : this.tab == 'versions'
80
76
  ? html`<board-versions boardId=${ifDefined(this.board?.id)}></board-versions>`
81
77
  : html`<board-info-link .board=${this.board}></board-info-link>`}
@@ -6,6 +6,7 @@ import { customElement, property, state } from 'lit/decorators.js'
6
6
 
7
7
  import { i18next } from '@operato/i18n'
8
8
  import { client } from '@operato/graphql'
9
+ import { privileged } from '@things-factory/auth-base/dist-client'
9
10
 
10
11
  @customElement('board-versions')
11
12
  export class BoardVersions extends LitElement {
@@ -91,13 +92,19 @@ export class BoardVersions extends LitElement {
91
92
  <mwc-icon>schedule</mwc-icon> ${new Date(version.updatedAt).toLocaleString()}
92
93
  </span>
93
94
  </div>
94
- <mwc-button
95
- dense
96
- raised
97
- label=${String(i18next.t('button.revert-board-version'))}
98
- @click=${() => this.revertBoardVersion(version.version)}
99
- icon="recycling"
100
- ></mwc-button>
95
+
96
+ ${privileged(
97
+ { privilege: 'mutation', category: 'board' },
98
+ html`
99
+ <mwc-button
100
+ dense
101
+ raised
102
+ label=${String(i18next.t('button.revert-board-version'))}
103
+ @click=${() => this.revertBoardVersion(version.version)}
104
+ icon="recycling"
105
+ ></mwc-button>
106
+ `
107
+ )}
101
108
  </div>
102
109
  `
103
110
  )}
@@ -3,6 +3,7 @@ import { customElement, property, state } from 'lit/decorators.js'
3
3
  import { ifDefined } from 'lit/directives/if-defined.js'
4
4
 
5
5
  import { ScrollbarStyles } from '@operato/styles'
6
+ import { privileged } from '@things-factory/auth-base/dist-client'
6
7
 
7
8
  import './group-info-basic'
8
9
  import './group-info-import'
@@ -63,10 +64,15 @@ export class GroupInfo extends LitElement {
63
64
 
64
65
  render() {
65
66
  return html`
66
- <div tab>
67
- <span @click=${() => (this.tab = 'basic')} ?active=${this.tab == 'basic'}>basic</span>
68
- <span @click=${() => (this.tab = 'import')} ?active=${this.tab == 'import'}>import</span>
69
- </div>
67
+ ${privileged(
68
+ { privilege: 'mutation', category: 'board' },
69
+ html`
70
+ <div tab>
71
+ <span @click=${() => (this.tab = 'basic')} ?active=${this.tab == 'basic'}>basic</span>
72
+ <span @click=${() => (this.tab = 'import')} ?active=${this.tab == 'import'}>import</span>
73
+ </div>
74
+ `
75
+ )}
70
76
  <div content>
71
77
  ${this.tab == 'basic'
72
78
  ? html`<group-info-basic groupId=${ifDefined(this.groupId)}></group-info-basic>`
@@ -3,7 +3,6 @@ import '@material/mwc-icon';
3
3
  import { LitElement, PropertyValues } from 'lit';
4
4
  export declare class BoardTileList extends LitElement {
5
5
  static styles: import("lit").CSSResult[];
6
- creatable: boolean;
7
6
  boards: any[];
8
7
  favorites: any[];
9
8
  groups: any[];
@@ -6,10 +6,10 @@ import { css, html, LitElement } from 'lit';
6
6
  import { customElement, property } from 'lit/decorators.js';
7
7
  import { keyed } from 'lit/directives/keyed.js';
8
8
  import { client } from '@operato/graphql';
9
+ import { privileged } from '@things-factory/auth-base/dist-client';
9
10
  let BoardTileList = class BoardTileList extends LitElement {
10
11
  constructor() {
11
12
  super(...arguments);
12
- this.creatable = false;
13
13
  this.boards = [];
14
14
  this.favorites = [];
15
15
  this.groups = [];
@@ -58,17 +58,15 @@ let BoardTileList = class BoardTileList extends LitElement {
58
58
  render() {
59
59
  var boards = this.boards || [];
60
60
  return html `
61
- ${this.creatable
62
- ? html `
63
- <ox-board-creation-card
64
- .groups=${this.groups}
65
- .defaultGroup=${this.group}
66
- @create-board=${e => this.onCreateBoard(e)}
67
- card
68
- create
69
- ></ox-board-creation-card>
70
- `
71
- : html ``}
61
+ ${privileged({ privilege: 'mutation', category: 'board' }, html `
62
+ <ox-board-creation-card
63
+ .groups=${this.groups}
64
+ .defaultGroup=${this.group}
65
+ @create-board=${e => this.onCreateBoard(e)}
66
+ card
67
+ create
68
+ ></ox-board-creation-card>
69
+ `)}
72
70
  ${keyed(Date.now(), boards.map(board => html `
73
71
  <div card draggable="true" id=${board.id}>
74
72
  <a href="board-viewer/${board.id}"> <img src=${board.thumbnail} /> </a>
@@ -234,10 +232,6 @@ BoardTileList.styles = [
234
232
  }
235
233
  `
236
234
  ];
237
- __decorate([
238
- property({ type: Boolean, attribute: 'creatable' }),
239
- __metadata("design:type", Boolean)
240
- ], BoardTileList.prototype, "creatable", void 0);
241
235
  __decorate([
242
236
  property({ type: Array }),
243
237
  __metadata("design:type", Array)
@@ -1 +1 @@
1
- {"version":3,"file":"board-tile-list.js","sourceRoot":"","sources":["../../client/board-list/board-tile-list.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/board/ox-board-creation-card.js'\nimport '@material/mwc-icon'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement, PropertyValues } from 'lit'\nimport { customElement, property, state, query } from 'lit/decorators.js'\nimport { keyed } from 'lit/directives/keyed.js'\n\nimport { client } from '@operato/graphql'\n\n@customElement('board-tile-list')\nexport class BoardTileList extends LitElement {\n static styles = [\n css`\n :host {\n overflow: auto;\n padding: var(--popup-content-padding);\n display: grid;\n\n grid-template-columns: var(--card-list-template);\n grid-auto-rows: var(--card-list-rows-height);\n grid-gap: 20px;\n --mdc-button-horizontal-padding: var(--padding-default);\n }\n\n [card] {\n position: relative;\n align-items: center;\n overflow: hidden;\n }\n\n [card][create] {\n overflow: visible;\n background-color: initial;\n }\n\n [card] > a {\n display: flex;\n }\n\n [card]:hover {\n cursor: pointer;\n }\n\n [name] {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n margin-top: var(--margin-narrow);\n width: calc(100% - 45px);\n color: var(--primary-text-color);\n font-weight: bolder;\n font-size: var(--fontsize-small);\n }\n\n img {\n display: block;\n\n margin: auto;\n max-width: 100%;\n max-height: 100%;\n }\n\n mwc-icon[iconBtn] {\n float: right;\n margin-top: -20px;\n margin-left: 2px;\n color: var(--board-list-star-color);\n font-size: 1.4em;\n }\n mwc-icon[info] {\n color: var(--primary-color);\n }\n\n mwc-icon[iconBtn][favored],\n mwc-icon[info]:hover {\n color: var(--board-list-star-active-color);\n }\n\n a {\n display: block;\n border-radius: var(--card-list-border-radius);\n border: var(--border-dark-color);\n box-sizing: border-box;\n background-color: var(--card-list-background-color);\n margin: 0px;\n height: calc(100% - 25px);\n }\n\n :host > *:hover [info] {\n opacity: 1;\n -webkit-transition: opacity 0.8s;\n -moz-transition: opacity 0.8s;\n -o-transition: opacity 0.8s;\n transition: opacity 0.8s;\n }\n\n [draggable='true'] {\n cursor: grab;\n }\n\n @media screen and (max-width: 800px), screen and (max-height: 600px) {\n ox-board-creation-card {\n display: none;\n }\n }\n `\n ]\n\n @property({ type: Boolean, attribute: 'creatable' }) creatable: boolean = false\n @property({ type: Array }) boards: any[] = []\n @property({ type: Array }) favorites: any[] = []\n @property({ type: Array }) groups: any[] = []\n @property({ type: String }) group?: string\n @property({ type: String, attribute: 'search-text' }) searchText?: string\n @property({ type: Boolean, attribute: 'reorderable' }) reorderable: boolean = false\n\n private draggedItem\n\n connectedCallback() {\n super.connectedCallback()\n\n if (this.reorderable) {\n this.renderRoot.addEventListener('dragstart', (e: Event) => {\n const target = e.target! as HTMLElement\n this.draggedItem = target.closest('[card]')\n ;(e as DragEvent).dataTransfer?.setData('text/plain', target.innerHTML)\n })\n\n this.renderRoot.addEventListener('dragover', (e: Event) => {\n e.preventDefault()\n\n const target = e.target! as HTMLElement\n const targetItem = target.closest('[card]')\n if (targetItem && targetItem !== this.draggedItem) {\n const targetRect = targetItem.getBoundingClientRect()\n const mousePos = (e as DragEvent).clientX - targetRect.left\n\n if (mousePos < targetRect.width / 2) {\n // 마우스 위치가 아이템 좌측 반절에 있을 때\n this.renderRoot.insertBefore(this.draggedItem, targetItem)\n } else {\n // 마우스 위치가 아이템 우측 반절에 있을 때\n this.renderRoot.insertBefore(this.draggedItem, targetItem.nextSibling)\n }\n }\n })\n\n this.renderRoot.addEventListener('drop', (e: Event) => {\n e.preventDefault()\n\n const boardIds = Array.from(this.renderRoot.querySelectorAll('[card]'))\n .map(board => board.getAttribute('id'))\n .filter(Boolean)\n\n this.dispatchEvent(\n new CustomEvent('reordered', {\n detail: {\n groupId: this.group,\n boardIds\n }\n })\n )\n })\n }\n }\n\n render() {\n var boards = this.boards || []\n\n return html`\n ${this.creatable\n ? html`\n <ox-board-creation-card\n .groups=${this.groups}\n .defaultGroup=${this.group}\n @create-board=${e => this.onCreateBoard(e)}\n card\n create\n ></ox-board-creation-card>\n `\n : html``}\n ${keyed(\n Date.now(),\n boards.map(\n board =>\n html`\n <div card draggable=\"true\" id=${board.id}>\n <a href=\"board-viewer/${board.id}\"> <img src=${board.thumbnail} /> </a>\n\n <div name>${board.name}</div>\n <!-- <div description>${board.description}</div> -->\n\n <mwc-icon\n iconBtn\n info\n @click=${e => {\n this.infoBoard(board)\n e.preventDefault()\n }}\n >info</mwc-icon\n >\n\n ${(this.favorites || []).includes(board.id)\n ? html` <mwc-icon iconBtn favored @click=${e => this.removeFavorite(board.id)}>star</mwc-icon> `\n : html` <mwc-icon iconBtn @click=${e => this.addFavorite(board.id)}>star_border</mwc-icon> `}\n </div>\n `\n )\n )}\n `\n }\n\n updated(changes: PropertyValues<this>) {\n var creationCard = this.renderRoot.querySelector('ox-board-creation-card') as any\n if (creationCard) {\n creationCard.reset()\n }\n }\n\n onCreateBoard(e) {\n this.dispatchEvent(\n new CustomEvent('create-board', {\n detail: e.detail\n })\n )\n }\n\n infoBoard(board) {\n this.dispatchEvent(\n new CustomEvent('info-board', {\n detail: board\n })\n )\n }\n\n async removeFavorite(boardId) {\n await client.query({\n query: gql`\n mutation {\n deleteFavorite(routing: \"${boardId}\")\n }\n `\n })\n\n this.refreshFavorites()\n }\n\n async addFavorite(boardId) {\n await client.query({\n query: gql`\n mutation {\n createFavorite(favorite: {\n routing: \"${boardId}\"\n }) {\n id\n routing\n }\n }\n `\n })\n\n this.refreshFavorites()\n }\n\n async refreshFavorites() {\n this.dispatchEvent(new CustomEvent('refresh-favorites'))\n }\n}\n"]}
1
+ {"version":3,"file":"board-tile-list.js","sourceRoot":"","sources":["../../client/board-list/board-tile-list.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/board/ox-board-creation-card.js'\nimport '@material/mwc-icon'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement, PropertyValues } from 'lit'\nimport { customElement, property, state, query } from 'lit/decorators.js'\nimport { keyed } from 'lit/directives/keyed.js'\n\nimport { client } from '@operato/graphql'\nimport { privileged } from '@things-factory/auth-base/dist-client'\n\n@customElement('board-tile-list')\nexport class BoardTileList extends LitElement {\n static styles = [\n css`\n :host {\n overflow: auto;\n padding: var(--popup-content-padding);\n display: grid;\n\n grid-template-columns: var(--card-list-template);\n grid-auto-rows: var(--card-list-rows-height);\n grid-gap: 20px;\n --mdc-button-horizontal-padding: var(--padding-default);\n }\n\n [card] {\n position: relative;\n align-items: center;\n overflow: hidden;\n }\n\n [card][create] {\n overflow: visible;\n background-color: initial;\n }\n\n [card] > a {\n display: flex;\n }\n\n [card]:hover {\n cursor: pointer;\n }\n\n [name] {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n margin-top: var(--margin-narrow);\n width: calc(100% - 45px);\n color: var(--primary-text-color);\n font-weight: bolder;\n font-size: var(--fontsize-small);\n }\n\n img {\n display: block;\n\n margin: auto;\n max-width: 100%;\n max-height: 100%;\n }\n\n mwc-icon[iconBtn] {\n float: right;\n margin-top: -20px;\n margin-left: 2px;\n color: var(--board-list-star-color);\n font-size: 1.4em;\n }\n mwc-icon[info] {\n color: var(--primary-color);\n }\n\n mwc-icon[iconBtn][favored],\n mwc-icon[info]:hover {\n color: var(--board-list-star-active-color);\n }\n\n a {\n display: block;\n border-radius: var(--card-list-border-radius);\n border: var(--border-dark-color);\n box-sizing: border-box;\n background-color: var(--card-list-background-color);\n margin: 0px;\n height: calc(100% - 25px);\n }\n\n :host > *:hover [info] {\n opacity: 1;\n -webkit-transition: opacity 0.8s;\n -moz-transition: opacity 0.8s;\n -o-transition: opacity 0.8s;\n transition: opacity 0.8s;\n }\n\n [draggable='true'] {\n cursor: grab;\n }\n\n @media screen and (max-width: 800px), screen and (max-height: 600px) {\n ox-board-creation-card {\n display: none;\n }\n }\n `\n ]\n\n @property({ type: Array }) boards: any[] = []\n @property({ type: Array }) favorites: any[] = []\n @property({ type: Array }) groups: any[] = []\n @property({ type: String }) group?: string\n @property({ type: String, attribute: 'search-text' }) searchText?: string\n @property({ type: Boolean, attribute: 'reorderable' }) reorderable: boolean = false\n\n private draggedItem\n\n connectedCallback() {\n super.connectedCallback()\n\n if (this.reorderable) {\n this.renderRoot.addEventListener('dragstart', (e: Event) => {\n const target = e.target! as HTMLElement\n this.draggedItem = target.closest('[card]')\n ;(e as DragEvent).dataTransfer?.setData('text/plain', target.innerHTML)\n })\n\n this.renderRoot.addEventListener('dragover', (e: Event) => {\n e.preventDefault()\n\n const target = e.target! as HTMLElement\n const targetItem = target.closest('[card]')\n if (targetItem && targetItem !== this.draggedItem) {\n const targetRect = targetItem.getBoundingClientRect()\n const mousePos = (e as DragEvent).clientX - targetRect.left\n\n if (mousePos < targetRect.width / 2) {\n // 마우스 위치가 아이템 좌측 반절에 있을 때\n this.renderRoot.insertBefore(this.draggedItem, targetItem)\n } else {\n // 마우스 위치가 아이템 우측 반절에 있을 때\n this.renderRoot.insertBefore(this.draggedItem, targetItem.nextSibling)\n }\n }\n })\n\n this.renderRoot.addEventListener('drop', (e: Event) => {\n e.preventDefault()\n\n const boardIds = Array.from(this.renderRoot.querySelectorAll('[card]'))\n .map(board => board.getAttribute('id'))\n .filter(Boolean)\n\n this.dispatchEvent(\n new CustomEvent('reordered', {\n detail: {\n groupId: this.group,\n boardIds\n }\n })\n )\n })\n }\n }\n\n render() {\n var boards = this.boards || []\n\n return html`\n ${privileged(\n { privilege: 'mutation', category: 'board' },\n html`\n <ox-board-creation-card\n .groups=${this.groups}\n .defaultGroup=${this.group}\n @create-board=${e => this.onCreateBoard(e)}\n card\n create\n ></ox-board-creation-card>\n `\n )}\n ${keyed(\n Date.now(),\n boards.map(\n board =>\n html`\n <div card draggable=\"true\" id=${board.id}>\n <a href=\"board-viewer/${board.id}\"> <img src=${board.thumbnail} /> </a>\n\n <div name>${board.name}</div>\n <!-- <div description>${board.description}</div> -->\n\n <mwc-icon\n iconBtn\n info\n @click=${e => {\n this.infoBoard(board)\n e.preventDefault()\n }}\n >info</mwc-icon\n >\n\n ${(this.favorites || []).includes(board.id)\n ? html` <mwc-icon iconBtn favored @click=${e => this.removeFavorite(board.id)}>star</mwc-icon> `\n : html` <mwc-icon iconBtn @click=${e => this.addFavorite(board.id)}>star_border</mwc-icon> `}\n </div>\n `\n )\n )}\n `\n }\n\n updated(changes: PropertyValues<this>) {\n var creationCard = this.renderRoot.querySelector('ox-board-creation-card') as any\n if (creationCard) {\n creationCard.reset()\n }\n }\n\n onCreateBoard(e) {\n this.dispatchEvent(\n new CustomEvent('create-board', {\n detail: e.detail\n })\n )\n }\n\n infoBoard(board) {\n this.dispatchEvent(\n new CustomEvent('info-board', {\n detail: board\n })\n )\n }\n\n async removeFavorite(boardId) {\n await client.query({\n query: gql`\n mutation {\n deleteFavorite(routing: \"${boardId}\")\n }\n `\n })\n\n this.refreshFavorites()\n }\n\n async addFavorite(boardId) {\n await client.query({\n query: gql`\n mutation {\n createFavorite(favorite: {\n routing: \"${boardId}\"\n }) {\n id\n routing\n }\n }\n `\n })\n\n this.refreshFavorites()\n }\n\n async refreshFavorites() {\n this.dispatchEvent(new CustomEvent('refresh-favorites'))\n }\n}\n"]}
@@ -5,7 +5,6 @@ export default class GroupBar extends LitElement {
5
5
  groups?: any[];
6
6
  groupId?: string;
7
7
  targetPage?: string;
8
- creatable?: boolean;
9
8
  private __sb?;
10
9
  render(): import("lit-html").TemplateResult<1>;
11
10
  infoGroup(groupId?: string): void;
@@ -1,8 +1,9 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
2
  import '@material/mwc-icon';
3
- import { css, html, nothing, LitElement } from 'lit';
3
+ import { css, html, LitElement } from 'lit';
4
4
  import { customElement, property } from 'lit/decorators.js';
5
5
  import ScrollBooster from 'scrollbooster';
6
+ import { privileged } from '@things-factory/auth-base/dist-client';
6
7
  import { longpressable } from '@things-factory/utils';
7
8
  let GroupBar = class GroupBar extends LitElement {
8
9
  render() {
@@ -16,11 +17,9 @@ let GroupBar = class GroupBar extends LitElement {
16
17
  <a href="${this.targetPage}/favor"><mwc-icon>star</mwc-icon></a>
17
18
  </li>
18
19
 
19
- ${this.creatable
20
- ? html `<li ?active=${this.groupId === 'mywork'}>
21
- <a href="${this.targetPage}/mywork"><mwc-icon>engineering</mwc-icon></a>
22
- </li>`
23
- : nothing}
20
+ ${privileged({ privilege: 'mutation', category: 'board' }, html `<li ?active=${this.groupId === 'mywork'}>
21
+ <a href="${this.targetPage}/mywork"><mwc-icon>engineering</mwc-icon></a>
22
+ </li>`)}
24
23
  ${(this.groups || []).map(group => html `
25
24
  <li ?active=${this.groupId === group.id} @long-press=${e => this.infoGroup(group.id)}>
26
25
  <a href=${`${this.targetPage}/${group.id}`}>${group.name}</a>
@@ -139,10 +138,6 @@ __decorate([
139
138
  property({ type: String }),
140
139
  __metadata("design:type", String)
141
140
  ], GroupBar.prototype, "targetPage", void 0);
142
- __decorate([
143
- property({ type: Boolean, attribute: true }),
144
- __metadata("design:type", Boolean)
145
- ], GroupBar.prototype, "creatable", void 0);
146
141
  GroupBar = __decorate([
147
142
  customElement('group-bar')
148
143
  ], GroupBar);
@@ -1 +1 @@
1
- {"version":3,"file":"group-bar.js","sourceRoot":"","sources":["../../client/board-list/group-bar.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/mwc-icon'\n\nimport { css, html, nothing, LitElement } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport ScrollBooster from 'scrollbooster'\n\nimport { longpressable } from '@things-factory/utils'\n\n@customElement('group-bar')\nexport default class GroupBar extends LitElement {\n static styles = [\n css`\n :host {\n background-color: var(--group-bar-background-color);\n\n overflow-x: hidden;\n }\n\n ul {\n display: flex;\n list-style: none;\n margin: 0;\n padding: 0;\n white-space: nowrap;\n }\n\n li {\n display: inline-block;\n padding: 0px 3px;\n\n border-bottom: var(--group-bar-line);\n }\n\n li[active] {\n border-color: var(--group-bar-active-line-color);\n }\n\n li a {\n display: block;\n padding: 5px 4px 1px 4px;\n text-decoration: none;\n font: var(--group-bar-textbutton);\n color: rgba(255, 255, 255, 0.8);\n }\n\n li[active] a {\n font: var(--group-bar-textbutton-active);\n color: rgba(255, 255, 255, 1);\n }\n\n li[padding] {\n flex: 1;\n }\n\n li[add] {\n padding: 5px 4px 1px 4px;\n }\n\n li[add] * {\n color: rgba(255, 255, 255, 0.5);\n }\n\n mwc-icon {\n vertical-align: middle;\n }\n `\n ]\n\n @property({ type: Array }) groups?: any[]\n @property({ type: String }) groupId?: string\n @property({ type: String }) targetPage?: string\n @property({ type: Boolean, attribute: true }) creatable?: boolean\n\n private __sb?: ScrollBooster\n\n render() {\n return html`\n <ul>\n <li ?active=${!this.groupId}>\n <a href=${this.targetPage || ''}><mwc-icon>dashboard</mwc-icon></a>\n </li>\n\n <li ?active=${this.groupId === 'favor'}>\n <a href=\"${this.targetPage}/favor\"><mwc-icon>star</mwc-icon></a>\n </li>\n\n ${this.creatable\n ? html`<li ?active=${this.groupId === 'mywork'}>\n <a href=\"${this.targetPage}/mywork\"><mwc-icon>engineering</mwc-icon></a>\n </li>`\n : nothing}\n ${(this.groups || []).map(\n group => html`\n <li ?active=${this.groupId === group.id} @long-press=${e => this.infoGroup(group.id)}>\n <a href=${`${this.targetPage}/${group.id}`}>${group.name}</a>\n </li>\n `\n )}\n\n <li padding></li>\n\n <li add>\n <mwc-icon @click=${e => this.infoGroup()}>add</mwc-icon>\n </li>\n </ul>\n `\n }\n\n infoGroup(groupId?: string) {\n this.dispatchEvent(\n new CustomEvent('info-group', {\n detail: groupId\n })\n )\n }\n\n onWheelEvent(e) {\n var delta = Math.max(-1, Math.min(1, e.wheelDelta || -e.detail))\n this.scrollLeft -= delta * 40\n\n e.preventDefault()\n }\n\n updated(change) {\n if (change.has('groups')) {\n /* groups가 바뀔 때마다, contents의 폭이 달라지므로, 다시 폭을 계산해준다. */\n this.__sb && this.__sb.updateMetrics()\n }\n\n if (change.has('groupId')) {\n var active = this.renderRoot.querySelector('li[active]')\n active && active.scrollIntoView()\n }\n }\n\n firstUpdated() {\n var scrollTarget = this.renderRoot.querySelector('ul')\n\n /* long-press */\n longpressable(scrollTarget)\n\n scrollTarget!.addEventListener('mousewheel', this.onWheelEvent.bind(this), false)\n\n this.__sb = new ScrollBooster({\n viewport: this,\n content: scrollTarget,\n mode: 'x',\n onUpdate: data => {\n this.scrollLeft = data.position.x\n }\n })\n }\n}\n"]}
1
+ {"version":3,"file":"group-bar.js","sourceRoot":"","sources":["../../client/board-list/group-bar.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/mwc-icon'\n\nimport { css, html, nothing, LitElement } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport ScrollBooster from 'scrollbooster'\n\nimport { privileged } from '@things-factory/auth-base/dist-client'\nimport { longpressable } from '@things-factory/utils'\n\n@customElement('group-bar')\nexport default class GroupBar extends LitElement {\n static styles = [\n css`\n :host {\n background-color: var(--group-bar-background-color);\n\n overflow-x: hidden;\n }\n\n ul {\n display: flex;\n list-style: none;\n margin: 0;\n padding: 0;\n white-space: nowrap;\n }\n\n li {\n display: inline-block;\n padding: 0px 3px;\n\n border-bottom: var(--group-bar-line);\n }\n\n li[active] {\n border-color: var(--group-bar-active-line-color);\n }\n\n li a {\n display: block;\n padding: 5px 4px 1px 4px;\n text-decoration: none;\n font: var(--group-bar-textbutton);\n color: rgba(255, 255, 255, 0.8);\n }\n\n li[active] a {\n font: var(--group-bar-textbutton-active);\n color: rgba(255, 255, 255, 1);\n }\n\n li[padding] {\n flex: 1;\n }\n\n li[add] {\n padding: 5px 4px 1px 4px;\n }\n\n li[add] * {\n color: rgba(255, 255, 255, 0.5);\n }\n\n mwc-icon {\n vertical-align: middle;\n }\n `\n ]\n\n @property({ type: Array }) groups?: any[]\n @property({ type: String }) groupId?: string\n @property({ type: String }) targetPage?: string\n\n private __sb?: ScrollBooster\n\n render() {\n return html`\n <ul>\n <li ?active=${!this.groupId}>\n <a href=${this.targetPage || ''}><mwc-icon>dashboard</mwc-icon></a>\n </li>\n\n <li ?active=${this.groupId === 'favor'}>\n <a href=\"${this.targetPage}/favor\"><mwc-icon>star</mwc-icon></a>\n </li>\n\n ${privileged(\n { privilege: 'mutation', category: 'board' },\n html`<li ?active=${this.groupId === 'mywork'}>\n <a href=\"${this.targetPage}/mywork\"><mwc-icon>engineering</mwc-icon></a>\n </li>`\n )}\n ${(this.groups || []).map(\n group => html`\n <li ?active=${this.groupId === group.id} @long-press=${e => this.infoGroup(group.id)}>\n <a href=${`${this.targetPage}/${group.id}`}>${group.name}</a>\n </li>\n `\n )}\n\n <li padding></li>\n\n <li add>\n <mwc-icon @click=${e => this.infoGroup()}>add</mwc-icon>\n </li>\n </ul>\n `\n }\n\n infoGroup(groupId?: string) {\n this.dispatchEvent(\n new CustomEvent('info-group', {\n detail: groupId\n })\n )\n }\n\n onWheelEvent(e) {\n var delta = Math.max(-1, Math.min(1, e.wheelDelta || -e.detail))\n this.scrollLeft -= delta * 40\n\n e.preventDefault()\n }\n\n updated(change) {\n if (change.has('groups')) {\n /* groups가 바뀔 때마다, contents의 폭이 달라지므로, 다시 폭을 계산해준다. */\n this.__sb && this.__sb.updateMetrics()\n }\n\n if (change.has('groupId')) {\n var active = this.renderRoot.querySelector('li[active]')\n active && active.scrollIntoView()\n }\n }\n\n firstUpdated() {\n var scrollTarget = this.renderRoot.querySelector('ul')\n\n /* long-press */\n longpressable(scrollTarget)\n\n scrollTarget!.addEventListener('mousewheel', this.onWheelEvent.bind(this), false)\n\n this.__sb = new ScrollBooster({\n viewport: this,\n content: scrollTarget,\n mode: 'x',\n onUpdate: data => {\n this.scrollLeft = data.position.x\n }\n })\n }\n}\n"]}
@@ -6,8 +6,6 @@ import { BoardEditor } from './data-grist/board-editor';
6
6
  import { BoardRenderer } from './data-grist/board-renderer';
7
7
  import { ColorMapEditor } from './data-grist/color-map-editor';
8
8
  import { ColorRangesEditor } from './data-grist/color-ranges-editor';
9
- import { store } from '@operato/shell';
10
- import permissions from './reducers/permissions';
11
9
  export default function bootstrap() {
12
10
  registerRenderer('board', BoardRenderer);
13
11
  registerRenderer('color-map', OxGristRendererJson5);
@@ -18,7 +16,6 @@ export default function bootstrap() {
18
16
  OxPropertyEditor.register({
19
17
  'board-selector': 'ox-property-editor-board-selector'
20
18
  });
21
- store.addReducers({ permissions });
22
19
  /* append viewpart anchor to asidebar */
23
20
  appendViewpart({
24
21
  name: 'viewpart-info',
@@ -1 +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,oBAAoB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAC5F,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAEnE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAA;AACpE,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAEtC,OAAO,WAAW,MAAM,wBAAwB,CAAA;AAEhD,MAAM,CAAC,OAAO,UAAU,SAAS;IAC/B,gBAAgB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;IACxC,gBAAgB,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAA;IACnD,gBAAgB,CAAC,cAAc,EAAE,oBAAoB,CAAC,CAAA;IAEtD,cAAc,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IACpC,cAAc,CAAC,WAAW,EAAE,cAAc,CAAC,CAAA;IAC3C,cAAc,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAA;IAEjD,gBAAgB,CAAC,QAAQ,CAAC;QACxB,gBAAgB,EAAE,mCAAmC;KACtD,CAAC,CAAA;IAEF,KAAK,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC,CAAA;IAElC,wCAAwC;IACxC,cAAc,CAAC;QACb,IAAI,EAAE,eAAe;QACrB,QAAQ,EAAE;YACR,IAAI,EAAE,KAAK;YACX,QAAQ,EAAE,MAAM;YAChB,QAAQ,EAAE,IAAI;SACf;QACD,QAAQ,EAAE,iBAAiB,CAAC,QAAQ;KACrC,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import '@operato/board/ox-property-editor-board-selector.js'\n\nimport { OxPropertyEditor } from '@operato/property-editor'\nimport { OxGristRendererJson5, registerEditor, registerRenderer } from '@operato/data-grist'\nimport { appendViewpart, VIEWPART_POSITION } from '@operato/layout'\n\nimport { BoardEditor } from './data-grist/board-editor'\nimport { BoardRenderer } from './data-grist/board-renderer'\nimport { ColorMapEditor } from './data-grist/color-map-editor'\nimport { ColorRangesEditor } from './data-grist/color-ranges-editor'\nimport { store } from '@operato/shell'\n\nimport permissions from './reducers/permissions'\n\nexport default function bootstrap() {\n registerRenderer('board', BoardRenderer)\n registerRenderer('color-map', OxGristRendererJson5)\n registerRenderer('color-ranges', OxGristRendererJson5)\n\n registerEditor('board', BoardEditor)\n registerEditor('color-map', ColorMapEditor)\n registerEditor('color-ranges', ColorRangesEditor)\n\n OxPropertyEditor.register({\n 'board-selector': 'ox-property-editor-board-selector'\n })\n\n store.addReducers({ permissions })\n\n /* append viewpart anchor to asidebar */\n appendViewpart({\n name: 'viewpart-info',\n viewpart: {\n show: false,\n hovering: 'edge',\n backdrop: true\n },\n position: VIEWPART_POSITION.ASIDEBAR\n })\n}\n"]}
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,oBAAoB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAC5F,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAEnE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAA;AAEpE,MAAM,CAAC,OAAO,UAAU,SAAS;IAC/B,gBAAgB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;IACxC,gBAAgB,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAA;IACnD,gBAAgB,CAAC,cAAc,EAAE,oBAAoB,CAAC,CAAA;IAEtD,cAAc,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IACpC,cAAc,CAAC,WAAW,EAAE,cAAc,CAAC,CAAA;IAC3C,cAAc,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAA;IAEjD,gBAAgB,CAAC,QAAQ,CAAC;QACxB,gBAAgB,EAAE,mCAAmC;KACtD,CAAC,CAAA;IAEF,wCAAwC;IACxC,cAAc,CAAC;QACb,IAAI,EAAE,eAAe;QACrB,QAAQ,EAAE;YACR,IAAI,EAAE,KAAK;YACX,QAAQ,EAAE,MAAM;YAChB,QAAQ,EAAE,IAAI;SACf;QACD,QAAQ,EAAE,iBAAiB,CAAC,QAAQ;KACrC,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import '@operato/board/ox-property-editor-board-selector.js'\n\nimport { OxPropertyEditor } from '@operato/property-editor'\nimport { OxGristRendererJson5, registerEditor, registerRenderer } from '@operato/data-grist'\nimport { appendViewpart, VIEWPART_POSITION } from '@operato/layout'\n\nimport { BoardEditor } from './data-grist/board-editor'\nimport { BoardRenderer } from './data-grist/board-renderer'\nimport { ColorMapEditor } from './data-grist/color-map-editor'\nimport { ColorRangesEditor } from './data-grist/color-ranges-editor'\n\nexport default function bootstrap() {\n registerRenderer('board', BoardRenderer)\n registerRenderer('color-map', OxGristRendererJson5)\n registerRenderer('color-ranges', OxGristRendererJson5)\n\n registerEditor('board', BoardEditor)\n registerEditor('color-map', ColorMapEditor)\n registerEditor('color-ranges', ColorRangesEditor)\n\n OxPropertyEditor.register({\n 'board-selector': 'ox-property-editor-board-selector'\n })\n\n /* append viewpart anchor to asidebar */\n appendViewpart({\n name: 'viewpart-info',\n viewpart: {\n show: false,\n hovering: 'edge',\n backdrop: true\n },\n position: VIEWPART_POSITION.ASIDEBAR\n })\n}\n"]}
@@ -26,7 +26,6 @@ export declare class BoardListPage extends BoardListPage_base {
26
26
  groups: any[];
27
27
  boards: any[];
28
28
  favorites: any[];
29
- boardPermissions: any[];
30
29
  searchText: string;
31
30
  scrollTargetEl: HTMLElement;
32
31
  private _page;
@@ -48,21 +48,18 @@ let BoardListPage = class BoardListPage extends localize(i18next)(connect(store)
48
48
  this.groups = [];
49
49
  this.boards = [];
50
50
  this.favorites = [];
51
- this.boardPermissions = [];
52
51
  this.searchText = '';
53
52
  this._page = 1;
54
53
  this._total = 0;
55
54
  this._infiniteScrollOptions.limit = 50;
56
55
  }
57
56
  render() {
58
- var _a, _b;
59
57
  return html `
60
58
  <group-bar
61
59
  .groups=${this.groups}
62
60
  .groupId=${this.groupId}
63
61
  targetPage="board-list"
64
62
  @info-group=${e => this.onInfoGroup(e.detail)}
65
- ?creatable=${(_a = this.boardPermissions) === null || _a === void 0 ? void 0 : _a.includes('Modeller')}
66
63
  ></group-bar>
67
64
 
68
65
  <board-tile-list
@@ -72,7 +69,6 @@ let BoardListPage = class BoardListPage extends localize(i18next)(connect(store)
72
69
  .groups=${this.groups}
73
70
  .group=${this.groupId}
74
71
  search-text=${this.searchText}
75
- ?creatable=${(_b = this.boardPermissions) === null || _b === void 0 ? void 0 : _b.includes('Modeller')}
76
72
  @info-board=${e => this.onInfoBoard(e.detail)}
77
73
  @scroll=${e => {
78
74
  this.onScroll(e);
@@ -208,7 +204,6 @@ let BoardListPage = class BoardListPage extends localize(i18next)(connect(store)
208
204
  }
209
205
  stateChanged(state) {
210
206
  this.favorites = state.favorite.favorites;
211
- this.boardPermissions = state.permissions.boardPermissions;
212
207
  }
213
208
  firstUpdated() {
214
209
  const list = this.scrollTargetEl;
@@ -255,13 +250,11 @@ let BoardListPage = class BoardListPage extends localize(i18next)(connect(store)
255
250
  });
256
251
  }
257
252
  async onInfoBoard(board) {
258
- var _a;
259
253
  openOverlay('viewpart-info', {
260
254
  template: html `
261
255
  <board-info
262
256
  .board=${board}
263
257
  .groupId=${this.groupId}
264
- ?enable-modeller=${(_a = this.boardPermissions) === null || _a === void 0 ? void 0 : _a.includes('Modeller')}
265
258
  @clone-board=${e => this.onCloneBoard(e.detail)}
266
259
  @release-board=${e => this.onReleaseBoard(e.detail)}
267
260
  @revert-board-version=${e => this.onRevertBoardVersion(e.detail)}
@@ -535,10 +528,6 @@ __decorate([
535
528
  property({ type: Array }),
536
529
  __metadata("design:type", Array)
537
530
  ], BoardListPage.prototype, "favorites", void 0);
538
- __decorate([
539
- property({ type: Array }),
540
- __metadata("design:type", Array)
541
- ], BoardListPage.prototype, "boardPermissions", void 0);
542
531
  __decorate([
543
532
  state(),
544
533
  __metadata("design:type", String)