@things-factory/board-ui 10.1.44 → 10.1.46

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.
@@ -163,11 +163,6 @@ let BoardInfo = class BoardInfo extends LitElement {
163
163
  margin-top: 0;
164
164
  }
165
165
 
166
- [duplicate] .buttons {
167
- border-top: 0;
168
- padding-top: 0;
169
- }
170
-
171
166
  /* The footer stays put while the body scrolls. */
172
167
  [footer] {
173
168
  flex: none;
@@ -176,13 +171,6 @@ let BoardInfo = class BoardInfo extends LitElement {
176
171
  background: var(--info-dialog-surface, var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface)));
177
172
  }
178
173
 
179
- [footer] .buttons {
180
- border-top: 0;
181
- padding-top: 0;
182
- margin-top: 0;
183
- align-items: center;
184
- }
185
-
186
174
  [footer] [more] {
187
175
  position: relative;
188
176
  }
@@ -217,15 +205,6 @@ let BoardInfo = class BoardInfo extends LitElement {
217
205
  }
218
206
 
219
207
  @media (pointer: coarse) {
220
- [footer] {
221
- padding: 0;
222
- }
223
-
224
- [footer] .buttons {
225
- margin: 0;
226
- border-top: 0;
227
- }
228
-
229
208
  [footer] [more] {
230
209
  flex: 0 0 auto;
231
210
  }
@@ -313,7 +292,7 @@ let BoardInfo = class BoardInfo extends LitElement {
313
292
  </div>
314
293
 
315
294
  <div footer>
316
- <div class="buttons">
295
+ <div tools>
317
296
  <span more>
318
297
  <md-icon-button id="more-anchor" ?disabled=${!editable} @click=${() => (this.menu.open = !this.menu.open)}>
319
298
  <md-icon>more_vert</md-icon>
@@ -417,7 +396,7 @@ let BoardInfo = class BoardInfo extends LitElement {
417
396
  </label>
418
397
  </div>
419
398
  </div>
420
- <div class="buttons">
399
+ <div tools>
421
400
  <div filler></div>
422
401
  <md-text-button cap @click=${() => (this.duplicating = false)}>${i18next.t('button.cancel')}</md-text-button>
423
402
  <md-filled-button
@@ -1 +1 @@
1
- {"version":3,"file":"board-basic-info.js","sourceRoot":"","sources":["../../client/viewparts/board-basic-info.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@material/web/iconbutton/icon-button.js'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/button/outlined-button.js'\nimport '@material/web/button/text-button.js'\nimport '@material/web/chips/chip-set.js'\nimport '@material/web/chips/filter-chip.js'\nimport '@material/web/menu/menu.js'\nimport '@material/web/menu/menu-item.js'\nimport '@material/web/divider/divider.js'\nimport '@operato/input/ox-input-select-buttons.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement, nothing } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { i18next } from '@operato/i18n'\nimport { client } from '@operato/graphql'\nimport { navigate, AppController } from '@operato/shell'\nimport { OxPrompt } from '@operato/popup/ox-prompt.js'\nimport { CommonPopupStyles } from '@operato/styles'\nimport { hasPrivilege } from '@things-factory/auth-base/dist-client'\n\nimport { notify } from '../utils/notify-helper.js'\nimport { timeAgo } from '../utils/board-meta.js'\nimport { InfoFormStyles } from './info-dialog-styles.js'\n\n/**\n * The basic tab of the board dialog.\n *\n * ## The shape, and why\n *\n * Three kinds of thing used to share one scrolling form: fields that wait for Save, actions that\n * happen the moment you touch them (release, join a play group), and a copy-to-domain panel hidden\n * behind a caret next to the name. The Save button sat in the middle of all that and scrolled out\n * of view on a short screen.\n *\n * Now the dialog reads top to bottom as: what this is (a status band), what you can change (the\n * form, committed by Save), where it plays (membership chips, which apply at once and say so), and\n * a footer that never scrolls away: the primary Save, the way into the modeller, and everything\n * else - duplicate, export, release, delete - behind one \"more\" menu so the footer stays two\n * buttons wide. Duplicate opens its own small panel with its own Copy and Cancel.\n *\n * ## Colour\n *\n * The accent (board's earth brown) is spent on three things only: the filled Save, the selected\n * segment, and the pressed play-group chip. Everything else is the neutral scale - the status band\n * is a low surface, the draft pill a warm secondary container, released a soft tertiary green -\n * so the one thing you are meant to press is the one thing in colour.\n */\n@customElement('board-basic-info')\nexport class BoardInfo extends LitElement {\n static styles = [\n CommonPopupStyles,\n InfoFormStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n padding: 0;\n gap: 0;\n background: var(--info-dialog-surface, var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface)));\n }\n\n /* What this is: state, version, freshness, home group - one quiet line under the tabs. */\n .what {\n flex: none;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px 10px;\n margin: var(--spacing-medium, 8px) var(--popup-padding) 0;\n padding: 7px 10px;\n border-radius: var(--md-sys-shape-corner-small, 6px);\n background: var(--md-sys-color-surface-container-low);\n color: var(--md-sys-color-on-surface-variant);\n font-size: var(--popup-font-size-small);\n }\n\n .what [pill] {\n padding: 1px 8px;\n border-radius: 999px;\n font-size: 0.66rem;\n font-weight: 600;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--md-sys-color-on-secondary-container);\n background: var(--md-sys-color-secondary-container);\n }\n\n .what [pill][released] {\n color: var(--md-sys-color-on-tertiary-container);\n background: var(--md-sys-color-tertiary-container);\n }\n\n .what [dot]::before {\n content: '·';\n margin-right: 10px;\n color: var(--md-sys-color-outline);\n }\n\n .what b {\n font-weight: 500;\n color: var(--md-sys-color-on-surface);\n }\n\n [body] {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: var(--spacing-medium, 8px);\n padding: var(--spacing-medium, 8px) var(--popup-padding) var(--popup-padding);\n }\n\n .fields .row {\n display: flex;\n gap: var(--spacing-medium, 8px);\n }\n\n .fields .row > label {\n flex: 1;\n min-width: 0;\n }\n\n /* A choice of three reads faster as a segmented row than as three radios with labels. */\n ox-input-select-buttons {\n --md-filter-chip-container-height: 30px;\n --md-filter-chip-label-text-size: 0.76rem;\n }\n\n .chips {\n --md-filter-chip-container-height: 28px;\n --md-filter-chip-label-text-size: 0.74rem;\n --md-filter-chip-outline-color: var(--md-sys-color-outline-variant);\n --md-filter-chip-label-text-color: var(--md-sys-color-on-surface-variant);\n --md-filter-chip-selected-container-color: var(--md-sys-color-primary-container);\n --md-filter-chip-selected-label-text-color: var(--md-sys-color-on-primary-container);\n --md-filter-chip-selected-leading-icon-color: var(--md-sys-color-on-primary-container);\n }\n\n /* The duplicate panel is a small task inside the dialog: inset, with its own commit. */\n [duplicate] {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-medium, 8px);\n padding: var(--spacing-medium, 8px) var(--spacing-medium, 8px) var(--spacing-small, 4px);\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: var(--md-sys-shape-corner-small, 6px);\n background: var(--md-sys-color-surface-container-low);\n }\n\n [duplicate] .section {\n margin-top: 0;\n }\n\n [duplicate] .buttons {\n border-top: 0;\n padding-top: 0;\n }\n\n /* The footer stays put while the body scrolls. */\n [footer] {\n flex: none;\n padding: var(--spacing-medium, 8px) var(--popup-padding);\n border-top: 1px solid var(--md-sys-color-outline-variant);\n background: var(--info-dialog-surface, var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface)));\n }\n\n [footer] .buttons {\n border-top: 0;\n padding-top: 0;\n margin-top: 0;\n align-items: center;\n }\n\n [footer] [more] {\n position: relative;\n }\n\n md-menu {\n min-width: 220px;\n --md-menu-container-color: var(--md-sys-color-surface-container-lowest, #fff);\n --md-menu-container-shape: 10px;\n --md-menu-item-one-line-container-height: 40px;\n --md-menu-item-two-line-container-height: 52px;\n --md-menu-item-label-text-size: 0.84rem;\n --md-menu-item-supporting-text-size: 0.72rem;\n --md-menu-item-leading-space: 14px;\n --md-menu-item-trailing-space: 14px;\n }\n\n md-menu-item[cap] [slot='headline'] {\n text-transform: capitalize;\n }\n\n md-menu-item md-icon[slot='start'] {\n --md-icon-size: 18px;\n }\n\n md-menu-item[danger] {\n --md-menu-item-label-text-color: var(--md-sys-color-error);\n --md-menu-item-leading-icon-color: var(--md-sys-color-error);\n }\n\n md-icon-button {\n --md-icon-button-icon-color: var(--md-sys-color-on-surface-variant);\n }\n\n @media (pointer: coarse) {\n [footer] {\n padding: 0;\n }\n\n [footer] .buttons {\n margin: 0;\n border-top: 0;\n }\n\n [footer] [more] {\n flex: 0 0 auto;\n }\n }\n `\n ]\n\n @property({ type: String }) boardId?: string\n @property({ type: String }) groupId?: string\n\n @state() board: any\n @state() boardGroupList: any[] = []\n @state() playGroupList: any[] = []\n @state() duplicating: boolean = false\n @state() enableModeller?: boolean = false\n\n private _appCtrl = new AppController(this)\n\n @state() targetDomains: { id: string; name: string; subdomain: string }[] = []\n @state() targetGroups: { id: string; name: string }[] = []\n @state() targetSubdomain?: string\n @state() targetGroupId?: string\n\n @query('md-menu') private menu!: any\n\n private original: any\n\n render() {\n const board = this.board || { name: '', description: '', playGroups: [] }\n const boardGroupList = this.boardGroupList || []\n const memberOf = new Set((board.playGroups || []).map(group => group.id))\n const editable = !!this.enableModeller\n\n return html`\n ${this.renderWhat(board, boardGroupList)}\n\n <div body>\n <div class=\"fields\">\n <label>\n ${i18next.t('label.name')}\n <input\n type=\"text\"\n .value=${board.name || ''}\n @change=${e => (this.board = { ...this.board, name: e.target.value })}\n ?disabled=${!editable}\n />\n </label>\n\n <label>\n ${i18next.t('label.description')}\n <input\n type=\"text\"\n .value=${board.description || ''}\n @change=${e => (this.board = { ...this.board, description: e.target.value })}\n ?disabled=${!editable}\n />\n </label>\n\n <div class=\"row\">\n <label>\n ${i18next.t('label.board-type')}\n <ox-input-select-buttons\n .value=${board.type || 'main'}\n .options=${[\n { display: i18next.t('label.board-type-main'), value: 'main' },\n { display: i18next.t('label.board-type-sub'), value: 'sub' },\n { display: i18next.t('label.board-type-popup'), value: 'popup' }\n ]}\n @change=${(e: CustomEvent) => e.detail && (this.board = { ...this.board, type: e.detail })}\n ?disabled=${!editable}\n ></ox-input-select-buttons>\n </label>\n\n <label>\n ${i18next.t('label.group')}\n <select\n .value=${this.board?.groupId || ''}\n @change=${e => (this.board = { ...this.board, groupId: e.target.value })}\n ?disabled=${!editable}\n >\n <option value=\"\"></option>\n ${boardGroupList.map(\n item => html`<option value=${item.id} ?selected=${item.id == this.board?.groupId}>${item.name}</option>`\n )}\n </select>\n </label>\n </div>\n </div>\n\n ${this.duplicating ? this.renderDuplicate(board) : nothing}\n\n <div class=\"section\">${i18next.t('text.plays in', { defaultValue: 'Plays in' })}</div>\n <div class=\"note\">\n ${i18next.t('text.play-group membership applies at once', {\n defaultValue: 'Tap a play group to add or remove this board. This applies right away.'\n })}\n </div>\n <md-chip-set class=\"chips\">\n ${(this.playGroupList || []).map(\n item => html`\n <md-filter-chip\n label=${item.name}\n ?selected=${memberOf.has(item.id)}\n @click=${e => {\n e.target.selected ? this.joinPlayGroup(item) : this.leavePlayGroup(item)\n }}\n ></md-filter-chip>\n `\n )}\n </md-chip-set>\n </div>\n\n <div footer>\n <div class=\"buttons\">\n <span more>\n <md-icon-button id=\"more-anchor\" ?disabled=${!editable} @click=${() => (this.menu.open = !this.menu.open)}>\n <md-icon>more_vert</md-icon>\n </md-icon-button>\n <md-menu anchor=\"more-anchor\" positioning=\"popover\" anchor-corner=\"start-start\" menu-corner=\"end-start\">\n <md-menu-item @click=${() => (this.duplicating = true)}>\n <md-icon slot=\"start\">content_copy</md-icon>\n <div slot=\"headline\">${i18next.t('button.duplicate', { defaultValue: 'Duplicate…' })}</div>\n </md-menu-item>\n <md-menu-item @click=${this.exportBoard.bind(this)}>\n <md-icon slot=\"start\">download</md-icon>\n <div slot=\"headline\">${i18next.t('button.export-json', { defaultValue: 'Export as JSON' })}</div>\n </md-menu-item>\n <md-menu-item cap ?disabled=${!this.isReleasable} @click=${this.releaseBoard.bind(this)}>\n <md-icon slot=\"start\">new_releases</md-icon>\n <div slot=\"headline\">${i18next.t('button.release')}</div>\n ${this.isReleasable || board.state === 'released'\n ? nothing\n : html`<div slot=\"supporting-text\">\n ${i18next.t('text.save before release', { defaultValue: 'Save your changes first' })}\n </div>`}\n </md-menu-item>\n <md-divider></md-divider>\n <md-menu-item cap danger @click=${this.deleteBoard.bind(this)}>\n <md-icon slot=\"start\">delete_outline</md-icon>\n <div slot=\"headline\">${i18next.t('button.delete')}</div>\n </md-menu-item>\n </md-menu>\n </span>\n <div filler></div>\n <md-outlined-button ?disabled=${!editable} @click=${() => navigate(`board-modeller/${this.boardId}`)}>\n <md-icon slot=\"icon\">design_services</md-icon>${i18next.t('button.open-modeller', {\n defaultValue: 'Open in modeller'\n })}\n </md-outlined-button>\n <md-filled-button cap ?disabled=${!editable || !this.isDirty} @click=${this.updateBoard.bind(this)}>\n <md-icon slot=\"icon\">save</md-icon>${i18next.t('button.save')}\n </md-filled-button>\n </div>\n </div>\n `\n }\n\n private renderWhat(board: any, boardGroupList: any[]) {\n if (!this.board) {\n return nothing\n }\n\n const released = board.state === 'released'\n const group = boardGroupList.find(item => item.id == this.original?.groupId)\n const updater = board.updater?.name || board.creator?.name || ''\n const ago = timeAgo(board.updatedAt || board.createdAt)\n\n return html`\n <div class=\"what\">\n <span pill ?released=${released}>\n ${released\n ? i18next.t('label.released', { defaultValue: 'released' })\n : i18next.t('label.draft', { defaultValue: 'draft' })}\n </span>\n <span>v${board.version ?? 0}</span>\n ${group ? html`<span dot><b>${group.name}</b></span>` : nothing}\n ${updater\n ? html`<span dot>${i18next.t('text.updated by', { defaultValue: 'updated by' })} <b>${updater}</b> ${ago}</span>`\n : ago\n ? html`<span dot>${i18next.t('text.updated', { defaultValue: 'updated' })} ${ago}</span>`\n : nothing}\n </div>\n `\n }\n\n private renderDuplicate(board: any) {\n const sameAsSource =\n this.original?.name == board.name && this._appCtrl.domain?.subdomain == this.targetSubdomain\n\n return html`\n <div duplicate>\n <div class=\"section\">${i18next.t('text.duplicate', { defaultValue: 'Duplicate' })}</div>\n <div class=\"note\">\n ${i18next.t('text.duplicate hint', {\n defaultValue: 'Copies this board into a domain and group. Give it a new name when copying within this domain.'\n })}\n </div>\n <div class=\"fields\">\n <div class=\"row\">\n <label>\n ${i18next.t('label.domain')}\n <select\n @change=${e => {\n this.targetSubdomain = e.target.value\n this.getGroupsByDomain(this.targetSubdomain)\n }}\n .value=${this.targetSubdomain || ''}\n >\n <option value=\"\"></option>\n ${this.targetDomains.map(\n domain =>\n html`<option value=${domain.subdomain} ?selected=${domain.subdomain == this.targetSubdomain}>\n ${domain.name}\n </option>`\n )}\n </select>\n </label>\n <label>\n ${i18next.t('label.group')}\n <select @change=${e => (this.targetGroupId = e.target.value)} .value=${this.targetGroupId || ''}>\n <option value=\"\"></option>\n ${this.targetGroups.map(\n group => html`<option value=${group.id} ?selected=${group.id == this.targetGroupId}>${group.name}</option>`\n )}\n </select>\n </label>\n </div>\n </div>\n <div class=\"buttons\">\n <div filler></div>\n <md-text-button cap @click=${() => (this.duplicating = false)}>${i18next.t('button.cancel')}</md-text-button>\n <md-filled-button\n cap\n ?disabled=${!this.original?.name || !board.name || !this.targetSubdomain || sameAsSource}\n @click=${this.cloneBoard.bind(this)}\n >\n <md-icon slot=\"icon\">content_copy</md-icon>${i18next.t('button.copy')}\n </md-filled-button>\n </div>\n </div>\n `\n }\n\n async firstUpdated() {\n this.targetSubdomain = this.targetSubdomain ?? this._appCtrl.domain?.subdomain\n this.enableModeller = await hasPrivilege({ privilege: 'mutation', category: 'board' })\n\n this.refresh()\n }\n\n async refresh() {\n const response = (\n await client.query({\n query: gql`\n query FetchBoardById($id: String!) {\n board(id: $id) {\n id\n name\n description\n model\n group {\n id\n name\n }\n playGroups {\n id\n name\n }\n thumbnail\n createdAt\n creator {\n id\n name\n }\n type\n state\n version\n updatedAt\n updater {\n id\n name\n }\n }\n\n groups {\n items {\n id\n name\n description\n }\n }\n\n playGroups {\n items {\n id\n name\n description\n }\n total\n }\n\n domainsWithPrivilege(privilege: \"mutation\", category: \"board\") {\n name\n subdomain\n }\n }\n `,\n variables: { id: this.boardId }\n })\n ).data\n\n const board = response.board\n this.groupId = board.group?.id\n\n this.board = { ...board, groupId: this.groupId }\n this.original = { ...this.board }\n\n this.boardGroupList = response.groups.items\n this.playGroupList = response.playGroups.items\n\n this.targetDomains = response.domainsWithPrivilege\n this.targetGroups = response.groups.items\n this.targetGroupId = this.groupId\n }\n\n async getGroupsByDomain(subdomain?: string) {\n this.targetGroups = []\n this.targetGroupId = ''\n\n if (!subdomain) {\n return\n }\n\n const response2 = (\n await client.query({\n query: gql`\n query {\n groups {\n items {\n id\n name\n description\n }\n }\n }\n `,\n variables: { id: this.boardId },\n context: {\n headers: {\n 'x-things-factory-domain': subdomain\n }\n }\n })\n ).data\n\n this.targetGroups = response2.groups.items\n }\n\n /** Something in the form differs from what the server has. */\n get isDirty() {\n if (!this.board || !this.original) {\n return false\n }\n\n const { name, description, groupId, type } = this.board\n\n return (\n this.original.name != name ||\n (this.original.description || '') != (description || '') ||\n (this.original.groupId || '') != (groupId || '') ||\n this.original.type != type\n )\n }\n\n get isReleasable() {\n if (!this.board || this.board.state == 'released') {\n return false\n }\n\n return !this.isDirty\n }\n\n async cloneBoard() {\n if (!this.original.name || (this.board.name == this.original.name && this._appCtrl.domain?.subdomain == this.targetSubdomain)) {\n notify('error', i18next.t('error.name must be unique from the original board', { name: this.original.name }))\n return\n }\n\n const { id, name, description } = this.board\n\n this.dispatchEvent(\n new CustomEvent('clone-board', {\n detail: {\n id,\n name,\n description,\n targetSubdomain: this.targetSubdomain,\n targetGroupId: this.targetGroupId\n },\n bubbles: true,\n composed: true\n })\n )\n\n this.close()\n }\n\n async exportBoard() {\n const board = { ...this.board, model: JSON.parse(this.board.model) }\n\n const json = JSON.stringify(board, null, 2)\n const blob = new Blob([json], { type: 'application/json;charset=utf-8' })\n\n const blobUrl = URL.createObjectURL(blob)\n\n const link = document.createElement('a')\n link.href = blobUrl\n link.download = `${board.name}.json`\n\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n\n URL.revokeObjectURL(blobUrl)\n }\n\n async releaseBoard() {\n const { id } = this.board\n\n // 릴리즈 코멘트(선택) 입력 — OxPrompt.prompt(모달, native prompt 대체). 취소 시 릴리즈 중단.\n const comment = await OxPrompt.prompt({\n type: 'question',\n title: String(i18next.t('button.release')),\n text: String(i18next.t('text.release comment optional')),\n multiline: true,\n confirmButton: { text: String(i18next.t('button.release')) },\n cancelButton: { text: String(i18next.t('button.cancel')) }\n })\n if (comment === null) return\n\n this.dispatchEvent(\n new CustomEvent('release-board', {\n detail: {\n id,\n comment: comment.trim() || null\n },\n bubbles: true,\n composed: true\n })\n )\n }\n\n async updateBoard() {\n const { id, name, description, groupId, type } = this.board\n /* model 정보를 제외하고 업데이트 */\n\n this.dispatchEvent(\n new CustomEvent('update-board', {\n detail: { id, name, description, groupId, type },\n bubbles: true,\n composed: true\n })\n )\n\n /* The form is what the server now has; Save goes quiet until the next edit. */\n this.original = { ...this.board }\n this.requestUpdate()\n }\n\n async deleteBoard() {\n if (\n await OxPrompt.open({\n title: i18next.t('text.are_you_sure'),\n text: i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }),\n confirmButton: { text: i18next.t('button.confirm') },\n cancelButton: { text: i18next.t('button.cancel') }\n })\n ) {\n this.dispatchEvent(\n new CustomEvent('delete-board', {\n detail: this.board,\n bubbles: true,\n composed: true\n })\n )\n\n this.close()\n }\n }\n\n async joinPlayGroup(group) {\n this.dispatchEvent(\n new CustomEvent('join-playgroup', {\n detail: {\n board: this.board,\n playGroup: group\n },\n bubbles: true,\n composed: true\n })\n )\n }\n\n async leavePlayGroup(group) {\n this.dispatchEvent(\n new CustomEvent('leave-playgroup', {\n detail: {\n board: this.board,\n playGroup: group\n },\n bubbles: true,\n composed: true\n })\n )\n }\n\n close() {\n history.back()\n }\n}\n"]}
1
+ {"version":3,"file":"board-basic-info.js","sourceRoot":"","sources":["../../client/viewparts/board-basic-info.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@material/web/iconbutton/icon-button.js'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/button/outlined-button.js'\nimport '@material/web/button/text-button.js'\nimport '@material/web/chips/chip-set.js'\nimport '@material/web/chips/filter-chip.js'\nimport '@material/web/menu/menu.js'\nimport '@material/web/menu/menu-item.js'\nimport '@material/web/divider/divider.js'\nimport '@operato/input/ox-input-select-buttons.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement, nothing } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { i18next } from '@operato/i18n'\nimport { client } from '@operato/graphql'\nimport { navigate, AppController } from '@operato/shell'\nimport { OxPrompt } from '@operato/popup/ox-prompt.js'\nimport { CommonPopupStyles } from '@operato/styles'\nimport { hasPrivilege } from '@things-factory/auth-base/dist-client'\n\nimport { notify } from '../utils/notify-helper.js'\nimport { timeAgo } from '../utils/board-meta.js'\nimport { InfoFormStyles } from './info-dialog-styles.js'\n\n/**\n * The basic tab of the board dialog.\n *\n * ## The shape, and why\n *\n * Three kinds of thing used to share one scrolling form: fields that wait for Save, actions that\n * happen the moment you touch them (release, join a play group), and a copy-to-domain panel hidden\n * behind a caret next to the name. The Save button sat in the middle of all that and scrolled out\n * of view on a short screen.\n *\n * Now the dialog reads top to bottom as: what this is (a status band), what you can change (the\n * form, committed by Save), where it plays (membership chips, which apply at once and say so), and\n * a footer that never scrolls away: the primary Save, the way into the modeller, and everything\n * else - duplicate, export, release, delete - behind one \"more\" menu so the footer stays two\n * buttons wide. Duplicate opens its own small panel with its own Copy and Cancel.\n *\n * ## Colour\n *\n * The accent (board's earth brown) is spent on three things only: the filled Save, the selected\n * segment, and the pressed play-group chip. Everything else is the neutral scale - the status band\n * is a low surface, the draft pill a warm secondary container, released a soft tertiary green -\n * so the one thing you are meant to press is the one thing in colour.\n */\n@customElement('board-basic-info')\nexport class BoardInfo extends LitElement {\n static styles = [\n CommonPopupStyles,\n InfoFormStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n padding: 0;\n gap: 0;\n background: var(--info-dialog-surface, var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface)));\n }\n\n /* What this is: state, version, freshness, home group - one quiet line under the tabs. */\n .what {\n flex: none;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px 10px;\n margin: var(--spacing-medium, 8px) var(--popup-padding) 0;\n padding: 7px 10px;\n border-radius: var(--md-sys-shape-corner-small, 6px);\n background: var(--md-sys-color-surface-container-low);\n color: var(--md-sys-color-on-surface-variant);\n font-size: var(--popup-font-size-small);\n }\n\n .what [pill] {\n padding: 1px 8px;\n border-radius: 999px;\n font-size: 0.66rem;\n font-weight: 600;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--md-sys-color-on-secondary-container);\n background: var(--md-sys-color-secondary-container);\n }\n\n .what [pill][released] {\n color: var(--md-sys-color-on-tertiary-container);\n background: var(--md-sys-color-tertiary-container);\n }\n\n .what [dot]::before {\n content: '·';\n margin-right: 10px;\n color: var(--md-sys-color-outline);\n }\n\n .what b {\n font-weight: 500;\n color: var(--md-sys-color-on-surface);\n }\n\n [body] {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: var(--spacing-medium, 8px);\n padding: var(--spacing-medium, 8px) var(--popup-padding) var(--popup-padding);\n }\n\n .fields .row {\n display: flex;\n gap: var(--spacing-medium, 8px);\n }\n\n .fields .row > label {\n flex: 1;\n min-width: 0;\n }\n\n /* A choice of three reads faster as a segmented row than as three radios with labels. */\n ox-input-select-buttons {\n --md-filter-chip-container-height: 30px;\n --md-filter-chip-label-text-size: 0.76rem;\n }\n\n .chips {\n --md-filter-chip-container-height: 28px;\n --md-filter-chip-label-text-size: 0.74rem;\n --md-filter-chip-outline-color: var(--md-sys-color-outline-variant);\n --md-filter-chip-label-text-color: var(--md-sys-color-on-surface-variant);\n --md-filter-chip-selected-container-color: var(--md-sys-color-primary-container);\n --md-filter-chip-selected-label-text-color: var(--md-sys-color-on-primary-container);\n --md-filter-chip-selected-leading-icon-color: var(--md-sys-color-on-primary-container);\n }\n\n /* The duplicate panel is a small task inside the dialog: inset, with its own commit. */\n [duplicate] {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-medium, 8px);\n padding: var(--spacing-medium, 8px) var(--spacing-medium, 8px) var(--spacing-small, 4px);\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: var(--md-sys-shape-corner-small, 6px);\n background: var(--md-sys-color-surface-container-low);\n }\n\n [duplicate] .section {\n margin-top: 0;\n }\n\n /* The footer stays put while the body scrolls. */\n [footer] {\n flex: none;\n padding: var(--spacing-medium, 8px) var(--popup-padding);\n border-top: 1px solid var(--md-sys-color-outline-variant);\n background: var(--info-dialog-surface, var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface)));\n }\n\n [footer] [more] {\n position: relative;\n }\n\n md-menu {\n min-width: 220px;\n --md-menu-container-color: var(--md-sys-color-surface-container-lowest, #fff);\n --md-menu-container-shape: 10px;\n --md-menu-item-one-line-container-height: 40px;\n --md-menu-item-two-line-container-height: 52px;\n --md-menu-item-label-text-size: 0.84rem;\n --md-menu-item-supporting-text-size: 0.72rem;\n --md-menu-item-leading-space: 14px;\n --md-menu-item-trailing-space: 14px;\n }\n\n md-menu-item[cap] [slot='headline'] {\n text-transform: capitalize;\n }\n\n md-menu-item md-icon[slot='start'] {\n --md-icon-size: 18px;\n }\n\n md-menu-item[danger] {\n --md-menu-item-label-text-color: var(--md-sys-color-error);\n --md-menu-item-leading-icon-color: var(--md-sys-color-error);\n }\n\n md-icon-button {\n --md-icon-button-icon-color: var(--md-sys-color-on-surface-variant);\n }\n\n @media (pointer: coarse) {\n [footer] [more] {\n flex: 0 0 auto;\n }\n }\n `\n ]\n\n @property({ type: String }) boardId?: string\n @property({ type: String }) groupId?: string\n\n @state() board: any\n @state() boardGroupList: any[] = []\n @state() playGroupList: any[] = []\n @state() duplicating: boolean = false\n @state() enableModeller?: boolean = false\n\n private _appCtrl = new AppController(this)\n\n @state() targetDomains: { id: string; name: string; subdomain: string }[] = []\n @state() targetGroups: { id: string; name: string }[] = []\n @state() targetSubdomain?: string\n @state() targetGroupId?: string\n\n @query('md-menu') private menu!: any\n\n private original: any\n\n render() {\n const board = this.board || { name: '', description: '', playGroups: [] }\n const boardGroupList = this.boardGroupList || []\n const memberOf = new Set((board.playGroups || []).map(group => group.id))\n const editable = !!this.enableModeller\n\n return html`\n ${this.renderWhat(board, boardGroupList)}\n\n <div body>\n <div class=\"fields\">\n <label>\n ${i18next.t('label.name')}\n <input\n type=\"text\"\n .value=${board.name || ''}\n @change=${e => (this.board = { ...this.board, name: e.target.value })}\n ?disabled=${!editable}\n />\n </label>\n\n <label>\n ${i18next.t('label.description')}\n <input\n type=\"text\"\n .value=${board.description || ''}\n @change=${e => (this.board = { ...this.board, description: e.target.value })}\n ?disabled=${!editable}\n />\n </label>\n\n <div class=\"row\">\n <label>\n ${i18next.t('label.board-type')}\n <ox-input-select-buttons\n .value=${board.type || 'main'}\n .options=${[\n { display: i18next.t('label.board-type-main'), value: 'main' },\n { display: i18next.t('label.board-type-sub'), value: 'sub' },\n { display: i18next.t('label.board-type-popup'), value: 'popup' }\n ]}\n @change=${(e: CustomEvent) => e.detail && (this.board = { ...this.board, type: e.detail })}\n ?disabled=${!editable}\n ></ox-input-select-buttons>\n </label>\n\n <label>\n ${i18next.t('label.group')}\n <select\n .value=${this.board?.groupId || ''}\n @change=${e => (this.board = { ...this.board, groupId: e.target.value })}\n ?disabled=${!editable}\n >\n <option value=\"\"></option>\n ${boardGroupList.map(\n item => html`<option value=${item.id} ?selected=${item.id == this.board?.groupId}>${item.name}</option>`\n )}\n </select>\n </label>\n </div>\n </div>\n\n ${this.duplicating ? this.renderDuplicate(board) : nothing}\n\n <div class=\"section\">${i18next.t('text.plays in', { defaultValue: 'Plays in' })}</div>\n <div class=\"note\">\n ${i18next.t('text.play-group membership applies at once', {\n defaultValue: 'Tap a play group to add or remove this board. This applies right away.'\n })}\n </div>\n <md-chip-set class=\"chips\">\n ${(this.playGroupList || []).map(\n item => html`\n <md-filter-chip\n label=${item.name}\n ?selected=${memberOf.has(item.id)}\n @click=${e => {\n e.target.selected ? this.joinPlayGroup(item) : this.leavePlayGroup(item)\n }}\n ></md-filter-chip>\n `\n )}\n </md-chip-set>\n </div>\n\n <div footer>\n <div tools>\n <span more>\n <md-icon-button id=\"more-anchor\" ?disabled=${!editable} @click=${() => (this.menu.open = !this.menu.open)}>\n <md-icon>more_vert</md-icon>\n </md-icon-button>\n <md-menu anchor=\"more-anchor\" positioning=\"popover\" anchor-corner=\"start-start\" menu-corner=\"end-start\">\n <md-menu-item @click=${() => (this.duplicating = true)}>\n <md-icon slot=\"start\">content_copy</md-icon>\n <div slot=\"headline\">${i18next.t('button.duplicate', { defaultValue: 'Duplicate…' })}</div>\n </md-menu-item>\n <md-menu-item @click=${this.exportBoard.bind(this)}>\n <md-icon slot=\"start\">download</md-icon>\n <div slot=\"headline\">${i18next.t('button.export-json', { defaultValue: 'Export as JSON' })}</div>\n </md-menu-item>\n <md-menu-item cap ?disabled=${!this.isReleasable} @click=${this.releaseBoard.bind(this)}>\n <md-icon slot=\"start\">new_releases</md-icon>\n <div slot=\"headline\">${i18next.t('button.release')}</div>\n ${this.isReleasable || board.state === 'released'\n ? nothing\n : html`<div slot=\"supporting-text\">\n ${i18next.t('text.save before release', { defaultValue: 'Save your changes first' })}\n </div>`}\n </md-menu-item>\n <md-divider></md-divider>\n <md-menu-item cap danger @click=${this.deleteBoard.bind(this)}>\n <md-icon slot=\"start\">delete_outline</md-icon>\n <div slot=\"headline\">${i18next.t('button.delete')}</div>\n </md-menu-item>\n </md-menu>\n </span>\n <div filler></div>\n <md-outlined-button ?disabled=${!editable} @click=${() => navigate(`board-modeller/${this.boardId}`)}>\n <md-icon slot=\"icon\">design_services</md-icon>${i18next.t('button.open-modeller', {\n defaultValue: 'Open in modeller'\n })}\n </md-outlined-button>\n <md-filled-button cap ?disabled=${!editable || !this.isDirty} @click=${this.updateBoard.bind(this)}>\n <md-icon slot=\"icon\">save</md-icon>${i18next.t('button.save')}\n </md-filled-button>\n </div>\n </div>\n `\n }\n\n private renderWhat(board: any, boardGroupList: any[]) {\n if (!this.board) {\n return nothing\n }\n\n const released = board.state === 'released'\n const group = boardGroupList.find(item => item.id == this.original?.groupId)\n const updater = board.updater?.name || board.creator?.name || ''\n const ago = timeAgo(board.updatedAt || board.createdAt)\n\n return html`\n <div class=\"what\">\n <span pill ?released=${released}>\n ${released\n ? i18next.t('label.released', { defaultValue: 'released' })\n : i18next.t('label.draft', { defaultValue: 'draft' })}\n </span>\n <span>v${board.version ?? 0}</span>\n ${group ? html`<span dot><b>${group.name}</b></span>` : nothing}\n ${updater\n ? html`<span dot>${i18next.t('text.updated by', { defaultValue: 'updated by' })} <b>${updater}</b> ${ago}</span>`\n : ago\n ? html`<span dot>${i18next.t('text.updated', { defaultValue: 'updated' })} ${ago}</span>`\n : nothing}\n </div>\n `\n }\n\n private renderDuplicate(board: any) {\n const sameAsSource =\n this.original?.name == board.name && this._appCtrl.domain?.subdomain == this.targetSubdomain\n\n return html`\n <div duplicate>\n <div class=\"section\">${i18next.t('text.duplicate', { defaultValue: 'Duplicate' })}</div>\n <div class=\"note\">\n ${i18next.t('text.duplicate hint', {\n defaultValue: 'Copies this board into a domain and group. Give it a new name when copying within this domain.'\n })}\n </div>\n <div class=\"fields\">\n <div class=\"row\">\n <label>\n ${i18next.t('label.domain')}\n <select\n @change=${e => {\n this.targetSubdomain = e.target.value\n this.getGroupsByDomain(this.targetSubdomain)\n }}\n .value=${this.targetSubdomain || ''}\n >\n <option value=\"\"></option>\n ${this.targetDomains.map(\n domain =>\n html`<option value=${domain.subdomain} ?selected=${domain.subdomain == this.targetSubdomain}>\n ${domain.name}\n </option>`\n )}\n </select>\n </label>\n <label>\n ${i18next.t('label.group')}\n <select @change=${e => (this.targetGroupId = e.target.value)} .value=${this.targetGroupId || ''}>\n <option value=\"\"></option>\n ${this.targetGroups.map(\n group => html`<option value=${group.id} ?selected=${group.id == this.targetGroupId}>${group.name}</option>`\n )}\n </select>\n </label>\n </div>\n </div>\n <div tools>\n <div filler></div>\n <md-text-button cap @click=${() => (this.duplicating = false)}>${i18next.t('button.cancel')}</md-text-button>\n <md-filled-button\n cap\n ?disabled=${!this.original?.name || !board.name || !this.targetSubdomain || sameAsSource}\n @click=${this.cloneBoard.bind(this)}\n >\n <md-icon slot=\"icon\">content_copy</md-icon>${i18next.t('button.copy')}\n </md-filled-button>\n </div>\n </div>\n `\n }\n\n async firstUpdated() {\n this.targetSubdomain = this.targetSubdomain ?? this._appCtrl.domain?.subdomain\n this.enableModeller = await hasPrivilege({ privilege: 'mutation', category: 'board' })\n\n this.refresh()\n }\n\n async refresh() {\n const response = (\n await client.query({\n query: gql`\n query FetchBoardById($id: String!) {\n board(id: $id) {\n id\n name\n description\n model\n group {\n id\n name\n }\n playGroups {\n id\n name\n }\n thumbnail\n createdAt\n creator {\n id\n name\n }\n type\n state\n version\n updatedAt\n updater {\n id\n name\n }\n }\n\n groups {\n items {\n id\n name\n description\n }\n }\n\n playGroups {\n items {\n id\n name\n description\n }\n total\n }\n\n domainsWithPrivilege(privilege: \"mutation\", category: \"board\") {\n name\n subdomain\n }\n }\n `,\n variables: { id: this.boardId }\n })\n ).data\n\n const board = response.board\n this.groupId = board.group?.id\n\n this.board = { ...board, groupId: this.groupId }\n this.original = { ...this.board }\n\n this.boardGroupList = response.groups.items\n this.playGroupList = response.playGroups.items\n\n this.targetDomains = response.domainsWithPrivilege\n this.targetGroups = response.groups.items\n this.targetGroupId = this.groupId\n }\n\n async getGroupsByDomain(subdomain?: string) {\n this.targetGroups = []\n this.targetGroupId = ''\n\n if (!subdomain) {\n return\n }\n\n const response2 = (\n await client.query({\n query: gql`\n query {\n groups {\n items {\n id\n name\n description\n }\n }\n }\n `,\n variables: { id: this.boardId },\n context: {\n headers: {\n 'x-things-factory-domain': subdomain\n }\n }\n })\n ).data\n\n this.targetGroups = response2.groups.items\n }\n\n /** Something in the form differs from what the server has. */\n get isDirty() {\n if (!this.board || !this.original) {\n return false\n }\n\n const { name, description, groupId, type } = this.board\n\n return (\n this.original.name != name ||\n (this.original.description || '') != (description || '') ||\n (this.original.groupId || '') != (groupId || '') ||\n this.original.type != type\n )\n }\n\n get isReleasable() {\n if (!this.board || this.board.state == 'released') {\n return false\n }\n\n return !this.isDirty\n }\n\n async cloneBoard() {\n if (!this.original.name || (this.board.name == this.original.name && this._appCtrl.domain?.subdomain == this.targetSubdomain)) {\n notify('error', i18next.t('error.name must be unique from the original board', { name: this.original.name }))\n return\n }\n\n const { id, name, description } = this.board\n\n this.dispatchEvent(\n new CustomEvent('clone-board', {\n detail: {\n id,\n name,\n description,\n targetSubdomain: this.targetSubdomain,\n targetGroupId: this.targetGroupId\n },\n bubbles: true,\n composed: true\n })\n )\n\n this.close()\n }\n\n async exportBoard() {\n const board = { ...this.board, model: JSON.parse(this.board.model) }\n\n const json = JSON.stringify(board, null, 2)\n const blob = new Blob([json], { type: 'application/json;charset=utf-8' })\n\n const blobUrl = URL.createObjectURL(blob)\n\n const link = document.createElement('a')\n link.href = blobUrl\n link.download = `${board.name}.json`\n\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n\n URL.revokeObjectURL(blobUrl)\n }\n\n async releaseBoard() {\n const { id } = this.board\n\n // 릴리즈 코멘트(선택) 입력 — OxPrompt.prompt(모달, native prompt 대체). 취소 시 릴리즈 중단.\n const comment = await OxPrompt.prompt({\n type: 'question',\n title: String(i18next.t('button.release')),\n text: String(i18next.t('text.release comment optional')),\n multiline: true,\n confirmButton: { text: String(i18next.t('button.release')) },\n cancelButton: { text: String(i18next.t('button.cancel')) }\n })\n if (comment === null) return\n\n this.dispatchEvent(\n new CustomEvent('release-board', {\n detail: {\n id,\n comment: comment.trim() || null\n },\n bubbles: true,\n composed: true\n })\n )\n }\n\n async updateBoard() {\n const { id, name, description, groupId, type } = this.board\n /* model 정보를 제외하고 업데이트 */\n\n this.dispatchEvent(\n new CustomEvent('update-board', {\n detail: { id, name, description, groupId, type },\n bubbles: true,\n composed: true\n })\n )\n\n /* The form is what the server now has; Save goes quiet until the next edit. */\n this.original = { ...this.board }\n this.requestUpdate()\n }\n\n async deleteBoard() {\n if (\n await OxPrompt.open({\n title: i18next.t('text.are_you_sure'),\n text: i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }),\n confirmButton: { text: i18next.t('button.confirm') },\n cancelButton: { text: i18next.t('button.cancel') }\n })\n ) {\n this.dispatchEvent(\n new CustomEvent('delete-board', {\n detail: this.board,\n bubbles: true,\n composed: true\n })\n )\n\n this.close()\n }\n }\n\n async joinPlayGroup(group) {\n this.dispatchEvent(\n new CustomEvent('join-playgroup', {\n detail: {\n board: this.board,\n playGroup: group\n },\n bubbles: true,\n composed: true\n })\n )\n }\n\n async leavePlayGroup(group) {\n this.dispatchEvent(\n new CustomEvent('leave-playgroup', {\n detail: {\n board: this.board,\n playGroup: group\n },\n bubbles: true,\n composed: true\n })\n )\n }\n\n close() {\n history.back()\n }\n}\n"]}
@@ -49,23 +49,6 @@ let BoardInfoLink = class BoardInfoLink extends LitElement {
49
49
  border-top: 1px solid var(--md-sys-color-outline-variant);
50
50
  }
51
51
 
52
- [footer] .buttons {
53
- border-top: 0;
54
- padding-top: 0;
55
- margin-top: 0;
56
- align-items: center;
57
- }
58
-
59
- @media (pointer: coarse) {
60
- [footer] {
61
- padding: 0;
62
- }
63
-
64
- [footer] .buttons {
65
- margin: 0;
66
- border-top: 0;
67
- }
68
- }
69
52
  `
70
53
  ]; }
71
54
  render() {
@@ -80,7 +63,7 @@ let BoardInfoLink = class BoardInfoLink extends LitElement {
80
63
  </div>
81
64
 
82
65
  <div footer>
83
- <div class="buttons">
66
+ <div tools>
84
67
  <md-outlined-button @click=${this.copyLink.bind(this)}>
85
68
  <md-icon slot="icon">${this.copied ? 'check' : 'link'}</md-icon>
86
69
  ${this.copied
@@ -1 +1 @@
1
- {"version":3,"file":"board-info-link.js","sourceRoot":"","sources":["../../client/viewparts/board-info-link.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,4BAA4B,CAAA;AACnC,OAAO,yCAAyC,CAAA;AAEhD,OAAO,mBAAmB,CAAA;AAGnB,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,UAAU;IAAtC;;QA8DY,WAAM,GAAG,KAAK,CAAA;IA+BjC,CAAC;aA5FQ,WAAM,GAAG;QACd,iBAAiB;QACjB,cAAc;QACd,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAmDF;KACF,AAvDY,CAuDZ;IAQD,MAAM;QACJ,OAAO,IAAI,CAAA;;;;sBAIO,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE;wBAClB,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE;;;;;;;uCAOP,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;mCAC5B,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;cACnD,IAAI,CAAC,MAAM;YACX,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,EAAE,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;YAChE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,EAAE,EAAE,YAAY,EAAE,oBAAoB,EAAE,CAAC;;;;KAIhF,CAAA;IACH,CAAC;IAEO,KAAK,CAAC,QAAQ;QACpB,MAAM,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,CAAA;QAClC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QAClB,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,EAAE,IAAI,CAAC,CAAA;IAC/C,CAAC;;AAlC2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;4CAA0D;AAEtD;IAA9B,KAAK,CAAC,cAAc,CAAC;;kDAA0B;AAE/B;IAAhB,KAAK,EAAE;;6CAAuB;AA9DpB,aAAa;IADzB,aAAa,CAAC,iBAAiB,CAAC;GACpB,aAAa,CA6FzB","sourcesContent":["import { css, html, LitElement } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { i18next } from '@operato/i18n'\nimport { CommonPopupStyles } from '@operato/styles'\nimport { InfoFormStyles } from './info-dialog-styles.js'\nimport '@material/web/icon/icon.js'\nimport '@material/web/button/outlined-button.js'\n\nimport './link-builder.js'\n\n@customElement('board-info-link')\nexport class BoardInfoLink extends LitElement {\n static styles = [\n CommonPopupStyles,\n InfoFormStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n padding: 0;\n gap: 0;\n box-sizing: border-box;\n color: var(--md-sys-color-on-surface);\n background: var(--info-dialog-surface, var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface)));\n }\n\n [body] {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: var(--spacing-large, 16px);\n padding: var(--spacing-large, 16px);\n }\n\n link-builder {\n padding: 0;\n }\n\n /* Same fixed footer as the basic tab: the two commits of this tab, always in reach. */\n [footer] {\n flex: none;\n padding: var(--spacing-medium, 8px) var(--popup-padding);\n border-top: 1px solid var(--md-sys-color-outline-variant);\n }\n\n [footer] .buttons {\n border-top: 0;\n padding-top: 0;\n margin-top: 0;\n align-items: center;\n }\n\n @media (pointer: coarse) {\n [footer] {\n padding: 0;\n }\n\n [footer] .buttons {\n margin: 0;\n border-top: 0;\n }\n }\n `\n ]\n\n @property({ type: Object }) board?: { id: string; name: string; description: string }\n\n @query('link-builder') private linkBuilder!: any\n\n @state() private copied = false\n\n render() {\n return html`\n <div body>\n <link-builder\n command=\"headless-full\"\n target-id=${this.board?.id || ''}\n target-name=${this.board?.name || ''}\n ></link-builder>\n\n </div>\n\n <div footer>\n <div class=\"buttons\">\n <md-outlined-button @click=${this.copyLink.bind(this)}>\n <md-icon slot=\"icon\">${this.copied ? 'check' : 'link'}</md-icon>\n ${this.copied\n ? i18next.t('text.link copied', { defaultValue: 'Link copied' })\n : i18next.t('button.copy-link', { defaultValue: 'Copy headless link' })}\n </md-outlined-button>\n </div>\n </div>\n `\n }\n\n private async copyLink() {\n await this.linkBuilder?.copyLink()\n this.copied = true\n setTimeout(() => (this.copied = false), 2000)\n }\n}\n"]}
1
+ {"version":3,"file":"board-info-link.js","sourceRoot":"","sources":["../../client/viewparts/board-info-link.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,4BAA4B,CAAA;AACnC,OAAO,yCAAyC,CAAA;AAEhD,OAAO,mBAAmB,CAAA;AAGnB,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,UAAU;IAAtC;;QA6CY,WAAM,GAAG,KAAK,CAAA;IA+BjC,CAAC;aA3EQ,WAAM,GAAG;QACd,iBAAiB;QACjB,cAAc;QACd,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAkCF;KACF,AAtCY,CAsCZ;IAQD,MAAM;QACJ,OAAO,IAAI,CAAA;;;;sBAIO,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE;wBAClB,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE;;;;;;;uCAOP,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;mCAC5B,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;cACnD,IAAI,CAAC,MAAM;YACX,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,EAAE,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;YAChE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,EAAE,EAAE,YAAY,EAAE,oBAAoB,EAAE,CAAC;;;;KAIhF,CAAA;IACH,CAAC;IAEO,KAAK,CAAC,QAAQ;QACpB,MAAM,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,CAAA;QAClC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QAClB,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,EAAE,IAAI,CAAC,CAAA;IAC/C,CAAC;;AAlC2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;4CAA0D;AAEtD;IAA9B,KAAK,CAAC,cAAc,CAAC;;kDAA0B;AAE/B;IAAhB,KAAK,EAAE;;6CAAuB;AA7CpB,aAAa;IADzB,aAAa,CAAC,iBAAiB,CAAC;GACpB,aAAa,CA4EzB","sourcesContent":["import { css, html, LitElement } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { i18next } from '@operato/i18n'\nimport { CommonPopupStyles } from '@operato/styles'\nimport { InfoFormStyles } from './info-dialog-styles.js'\nimport '@material/web/icon/icon.js'\nimport '@material/web/button/outlined-button.js'\n\nimport './link-builder.js'\n\n@customElement('board-info-link')\nexport class BoardInfoLink extends LitElement {\n static styles = [\n CommonPopupStyles,\n InfoFormStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n padding: 0;\n gap: 0;\n box-sizing: border-box;\n color: var(--md-sys-color-on-surface);\n background: var(--info-dialog-surface, var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface)));\n }\n\n [body] {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: var(--spacing-large, 16px);\n padding: var(--spacing-large, 16px);\n }\n\n link-builder {\n padding: 0;\n }\n\n /* Same fixed footer as the basic tab: the two commits of this tab, always in reach. */\n [footer] {\n flex: none;\n padding: var(--spacing-medium, 8px) var(--popup-padding);\n border-top: 1px solid var(--md-sys-color-outline-variant);\n }\n\n `\n ]\n\n @property({ type: Object }) board?: { id: string; name: string; description: string }\n\n @query('link-builder') private linkBuilder!: any\n\n @state() private copied = false\n\n render() {\n return html`\n <div body>\n <link-builder\n command=\"headless-full\"\n target-id=${this.board?.id || ''}\n target-name=${this.board?.name || ''}\n ></link-builder>\n\n </div>\n\n <div footer>\n <div tools>\n <md-outlined-button @click=${this.copyLink.bind(this)}>\n <md-icon slot=\"icon\">${this.copied ? 'check' : 'link'}</md-icon>\n ${this.copied\n ? i18next.t('text.link copied', { defaultValue: 'Link copied' })\n : i18next.t('button.copy-link', { defaultValue: 'Copy headless link' })}\n </md-outlined-button>\n </div>\n </div>\n `\n }\n\n private async copyLink() {\n await this.linkBuilder?.copyLink()\n this.copied = true\n setTimeout(() => (this.copied = false), 2000)\n }\n}\n"]}
@@ -46,23 +46,6 @@ let BoardInfoTemplate = class BoardInfoTemplate extends LitElement {
46
46
  border-top: 1px solid var(--md-sys-color-outline-variant);
47
47
  }
48
48
 
49
- [footer] .buttons {
50
- border-top: 0;
51
- padding-top: 0;
52
- margin-top: 0;
53
- align-items: center;
54
- }
55
-
56
- @media (pointer: coarse) {
57
- [footer] {
58
- padding: 0;
59
- }
60
-
61
- [footer] .buttons {
62
- margin: 0;
63
- border-top: 0;
64
- }
65
- }
66
49
  `
67
50
  ]; }
68
51
  render() {
@@ -72,7 +55,7 @@ let BoardInfoTemplate = class BoardInfoTemplate extends LitElement {
72
55
  </div>
73
56
 
74
57
  <div footer>
75
- <div class="buttons">
58
+ <div tools>
76
59
  <div filler></div>
77
60
  <md-filled-button cap @click=${() => this.templateBuilder?.registerBoardAsTemplate()}>
78
61
  <md-icon slot="icon">bookmark_add</md-icon>${i18next.t('text.register-template')}
@@ -1 +1 @@
1
- {"version":3,"file":"board-info-template.js","sourceRoot":"","sources":["../../client/viewparts/board-info-template.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,4BAA4B,CAAA;AACnC,OAAO,uCAAuC,CAAA;AAC9C,OAAO,yCAAyC,CAAA;AAEhD,OAAO,6BAA6B,CAAA;AAG7B,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,UAAU;aACxC,WAAM,GAAG;QACd,iBAAiB;QACjB,cAAc;QACd,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAmDF;KACF,AAvDY,CAuDZ;IAMD,MAAM;QACJ,OAAO,IAAI,CAAA;;yCAE0B,IAAI,CAAC,KAAK;;;;;;yCAMV,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,uBAAuB,EAAE;yDACrC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC;;;;KAIvF,CAAA;IACH,CAAC;;AAnB2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;gDAA0D;AAE5C;IAAxC,KAAK,CAAC,wBAAwB,CAAC;;0DAA8B;AA5DnD,iBAAiB;IAD7B,aAAa,CAAC,qBAAqB,CAAC;GACxB,iBAAiB,CA8E7B","sourcesContent":["import { css, html, LitElement } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\nimport { i18next } from '@operato/i18n'\nimport { CommonPopupStyles } from '@operato/styles'\nimport { InfoFormStyles } from './info-dialog-styles.js'\nimport '@material/web/icon/icon.js'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/button/outlined-button.js'\n\nimport './board-template-builder.js'\n\n@customElement('board-info-template')\nexport class BoardInfoTemplate extends LitElement {\n static styles = [\n CommonPopupStyles,\n InfoFormStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n padding: 0;\n gap: 0;\n box-sizing: border-box;\n color: var(--md-sys-color-on-surface);\n background: var(--info-dialog-surface, var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface)));\n }\n\n [body] {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: var(--spacing-large, 16px);\n padding: var(--spacing-large, 16px);\n }\n\n board-template-builder {\n padding: 0;\n }\n\n /* Same fixed footer as the basic tab: the two commits of this tab, always in reach. */\n [footer] {\n flex: none;\n padding: var(--spacing-medium, 8px) var(--popup-padding);\n border-top: 1px solid var(--md-sys-color-outline-variant);\n }\n\n [footer] .buttons {\n border-top: 0;\n padding-top: 0;\n margin-top: 0;\n align-items: center;\n }\n\n @media (pointer: coarse) {\n [footer] {\n padding: 0;\n }\n\n [footer] .buttons {\n margin: 0;\n border-top: 0;\n }\n }\n `\n ]\n\n @property({ type: Object }) board?: { id: string; name: string; description: string }\n\n @query('board-template-builder') private templateBuilder!: any\n\n render() {\n return html`\n <div body>\n <board-template-builder .board=${this.board}></board-template-builder>\n </div>\n\n <div footer>\n <div class=\"buttons\">\n <div filler></div>\n <md-filled-button cap @click=${() => this.templateBuilder?.registerBoardAsTemplate()}>\n <md-icon slot=\"icon\">bookmark_add</md-icon>${i18next.t('text.register-template')}\n </md-filled-button>\n </div>\n </div>\n `\n }\n}\n"]}
1
+ {"version":3,"file":"board-info-template.js","sourceRoot":"","sources":["../../client/viewparts/board-info-template.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,4BAA4B,CAAA;AACnC,OAAO,uCAAuC,CAAA;AAC9C,OAAO,yCAAyC,CAAA;AAEhD,OAAO,6BAA6B,CAAA;AAG7B,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,UAAU;aACxC,WAAM,GAAG;QACd,iBAAiB;QACjB,cAAc;QACd,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAkCF;KACF,AAtCY,CAsCZ;IAMD,MAAM;QACJ,OAAO,IAAI,CAAA;;yCAE0B,IAAI,CAAC,KAAK;;;;;;yCAMV,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,uBAAuB,EAAE;yDACrC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC;;;;KAIvF,CAAA;IACH,CAAC;;AAnB2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;gDAA0D;AAE5C;IAAxC,KAAK,CAAC,wBAAwB,CAAC;;0DAA8B;AA3CnD,iBAAiB;IAD7B,aAAa,CAAC,qBAAqB,CAAC;GACxB,iBAAiB,CA6D7B","sourcesContent":["import { css, html, LitElement } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\nimport { i18next } from '@operato/i18n'\nimport { CommonPopupStyles } from '@operato/styles'\nimport { InfoFormStyles } from './info-dialog-styles.js'\nimport '@material/web/icon/icon.js'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/button/outlined-button.js'\n\nimport './board-template-builder.js'\n\n@customElement('board-info-template')\nexport class BoardInfoTemplate extends LitElement {\n static styles = [\n CommonPopupStyles,\n InfoFormStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n padding: 0;\n gap: 0;\n box-sizing: border-box;\n color: var(--md-sys-color-on-surface);\n background: var(--info-dialog-surface, var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface)));\n }\n\n [body] {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: var(--spacing-large, 16px);\n padding: var(--spacing-large, 16px);\n }\n\n board-template-builder {\n padding: 0;\n }\n\n /* Same fixed footer as the basic tab: the two commits of this tab, always in reach. */\n [footer] {\n flex: none;\n padding: var(--spacing-medium, 8px) var(--popup-padding);\n border-top: 1px solid var(--md-sys-color-outline-variant);\n }\n\n `\n ]\n\n @property({ type: Object }) board?: { id: string; name: string; description: string }\n\n @query('board-template-builder') private templateBuilder!: any\n\n render() {\n return html`\n <div body>\n <board-template-builder .board=${this.board}></board-template-builder>\n </div>\n\n <div footer>\n <div tools>\n <div filler></div>\n <md-filled-button cap @click=${() => this.templateBuilder?.registerBoardAsTemplate()}>\n <md-icon slot=\"icon\">bookmark_add</md-icon>${i18next.t('text.register-template')}\n </md-filled-button>\n </div>\n </div>\n `\n }\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import '@operato/popup/ox-popup-actions.js';
1
2
  import { LitElement } from 'lit';
2
3
  import '@material/web/icon/icon.js';
3
4
  import '@material/web/button/filled-button.js';
@@ -1,4 +1,5 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
+ import '@operato/popup/ox-popup-actions.js';
2
3
  import { html, css, LitElement } from 'lit';
3
4
  import { customElement, property, query, state } from 'lit/decorators.js';
4
5
  import gql from 'graphql-tag';
@@ -21,10 +22,6 @@ let BoardTemplateInfo = class BoardTemplateInfo extends LitElement {
21
22
  min-height: 72px;
22
23
  resize: vertical;
23
24
  }
24
-
25
- .buttons [filler] {
26
- flex: 1;
27
- }
28
25
  `
29
26
  ]; }
30
27
  constructor() {
@@ -102,22 +99,20 @@ let BoardTemplateInfo = class BoardTemplateInfo extends LitElement {
102
99
  })}</span>`}
103
100
  </div>
104
101
 
105
- <div class="buttons">
102
+ <ox-popup-actions>
106
103
  ${mine
107
104
  ? html `
108
- <md-text-button cap danger @click=${this.onDelete}>
105
+ <md-text-button slot="start" destructive cap @click=${this.onDelete}>
109
106
  <md-icon slot="icon">delete_outline</md-icon>${i18next.t('button.delete')}
110
107
  </md-text-button>
111
- <div filler></div>
112
- <md-filled-button cap @click=${this.onUpdate}>
108
+ <md-filled-button slot="confirm" cap @click=${this.onUpdate}>
113
109
  <md-icon slot="icon">save</md-icon>${i18next.t('button.save')}
114
110
  </md-filled-button>
115
111
  `
116
112
  : html `
117
- <div filler></div>
118
- <md-text-button cap @click=${() => history.back()}>${i18next.t('button.close', { defaultValue: 'close' })}</md-text-button>
113
+ <md-text-button slot="cancel" cap @click=${() => history.back()}>${i18next.t('button.close', { defaultValue: 'close' })}</md-text-button>
119
114
  `}
120
- </div>
115
+ </ox-popup-actions>
121
116
  `;
122
117
  }
123
118
  async onUpdate() {
@@ -1 +1 @@
1
- {"version":3,"file":"board-template-info.js","sourceRoot":"","sources":["../../client/viewparts/board-template-info.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, css, LitElement } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport gql from 'graphql-tag'\nimport { store } from '@operato/shell'\nimport { client } from '@operato/graphql'\nimport { i18next } from '@operato/i18n'\nimport { OxPrompt } from '@operato/popup'\nimport { CommonPopupStyles } from '@operato/styles'\nimport { InfoFormStyles } from './info-dialog-styles.js'\nimport '@material/web/icon/icon.js'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/button/text-button.js'\nimport { notify } from '../utils/notify-helper.js'\n\n@customElement('board-template-info')\nexport class BoardTemplateInfo extends LitElement {\n static styles = [\n CommonPopupStyles,\n InfoFormStyles,\n css`\n textarea {\n min-height: 72px;\n resize: vertical;\n }\n\n .buttons [filler] {\n flex: 1;\n }\n `\n ]\n\n constructor() {\n super()\n this.template = {\n name: '',\n description: '',\n visibility: 'private'\n }\n }\n\n @property({ type: Object }) template: any\n @state() username: string = ''\n\n @query('form') form!: HTMLFormElement\n\n private _unsubscribe?: () => void\n\n\n connectedCallback() {\n\n super.connectedCallback()\n\n this._applyState()\n\n this._unsubscribe = store.subscribe(() => this._applyState())\n\n }\n\n\n disconnectedCallback() {\n\n super.disconnectedCallback()\n\n this._unsubscribe?.()\n\n }\n\n\n private _applyState() {\n\n const __state__ = store.getState() as any\nthis.username = __state__.auth?.user?.username || ''\n\n }\n\n get isMine() {\n return this.template?.creator?.username === this.username\n }\n\n render() {\n const template = this.template || {}\n const mine = this.isMine\n const when = (value?: string) => (value ? new Date(value).toLocaleString() : '')\n\n return html`\n <form>\n <div class=\"fields\">\n <label>\n ${i18next.t('field.name')}\n <input\n name=\"name\"\n .value=${template.name || ''}\n @input=${e => (this.template.name = e.target.value)}\n ?disabled=${!mine}\n />\n </label>\n <label>\n ${i18next.t('field.description')}\n <textarea\n name=\"description\"\n .value=${template.description || ''}\n @input=${e => (this.template.description = e.target.value)}\n ?disabled=${!mine}\n ></textarea>\n </label>\n <label>\n ${i18next.t('field.visibility')}\n <select\n name=\"visibility\"\n .value=${template.visibility || 'private'}\n @change=${e => (this.template.visibility = e.target.value)}\n ?disabled=${!mine}\n >\n <option value=\"private\">${i18next.t('label.visibility-private')}</option>\n <option value=\"domain\">${i18next.t('label.visibility-domain')}</option>\n <option value=\"public\">${i18next.t('label.visibility-public')}</option>\n </select>\n </label>\n </div>\n </form>\n\n <div class=\"provenance\">\n <span>${i18next.t('label.creator')} <b>${template.creator?.name || '-'}</b> ${when(template.createdAt)}</span>\n ${mine\n ? ''\n : html`<span>${i18next.t('text.only the creator can edit a template', {\n defaultValue: 'Only the creator can change a template.'\n })}</span>`}\n </div>\n\n <div class=\"buttons\">\n ${mine\n ? html`\n <md-text-button cap danger @click=${this.onDelete}>\n <md-icon slot=\"icon\">delete_outline</md-icon>${i18next.t('button.delete')}\n </md-text-button>\n <div filler></div>\n <md-filled-button cap @click=${this.onUpdate}>\n <md-icon slot=\"icon\">save</md-icon>${i18next.t('button.save')}\n </md-filled-button>\n `\n : html`\n <div filler></div>\n <md-text-button cap @click=${() => history.back()}>${i18next.t('button.close', { defaultValue: 'close' })}</md-text-button>\n `}\n </div>\n `\n }\n\n async onUpdate() {\n const formData = new FormData(this.form)\n const patch: any = {}\n for (const [key, value] of formData.entries()) {\n patch[key] = value\n }\n\n try {\n await client.mutate({\n mutation: gql`\n mutation ($id: String!, $patch: BoardTemplatePatch!) {\n updateBoardTemplate(id: $id, patch: $patch) {\n id\n }\n }\n `,\n variables: {\n id: this.template.id,\n patch\n }\n })\n notify('info', i18next.t('text.board-template updated'))\n this.dispatchEvent(new CustomEvent('updated', { bubbles: true, composed: true }))\n history.back()\n } catch (ex) {\n notify('error', ex, ex)\n }\n }\n\n async onDelete() {\n if (\n await OxPrompt.open({\n title: i18next.t('text.are_you_sure'),\n text: i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }),\n confirmButton: { text: i18next.t('button.confirm') },\n cancelButton: { text: i18next.t('button.cancel') }\n })\n ) {\n try {\n await client.mutate({\n mutation: gql`\n mutation ($id: String!) {\n deleteBoardTemplate(id: $id)\n }\n `,\n variables: { id: this.template.id }\n })\n notify('info', i18next.t('text.board-template deleted'))\n this.dispatchEvent(new CustomEvent('deleted', { bubbles: true, composed: true }))\n history.back()\n } catch (ex) {\n notify('error', ex, ex)\n }\n }\n }\n\n}\n"]}
1
+ {"version":3,"file":"board-template-info.js","sourceRoot":"","sources":["../../client/viewparts/board-template-info.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/popup/ox-popup-actions.js'\nimport { html, css, LitElement } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport gql from 'graphql-tag'\nimport { store } from '@operato/shell'\nimport { client } from '@operato/graphql'\nimport { i18next } from '@operato/i18n'\nimport { OxPrompt } from '@operato/popup'\nimport { CommonPopupStyles } from '@operato/styles'\nimport { InfoFormStyles } from './info-dialog-styles.js'\nimport '@material/web/icon/icon.js'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/button/text-button.js'\nimport { notify } from '../utils/notify-helper.js'\n\n@customElement('board-template-info')\nexport class BoardTemplateInfo extends LitElement {\n static styles = [\n CommonPopupStyles,\n InfoFormStyles,\n css`\n textarea {\n min-height: 72px;\n resize: vertical;\n }\n `\n ]\n\n constructor() {\n super()\n this.template = {\n name: '',\n description: '',\n visibility: 'private'\n }\n }\n\n @property({ type: Object }) template: any\n @state() username: string = ''\n\n @query('form') form!: HTMLFormElement\n\n private _unsubscribe?: () => void\n\n\n connectedCallback() {\n\n super.connectedCallback()\n\n this._applyState()\n\n this._unsubscribe = store.subscribe(() => this._applyState())\n\n }\n\n\n disconnectedCallback() {\n\n super.disconnectedCallback()\n\n this._unsubscribe?.()\n\n }\n\n\n private _applyState() {\n\n const __state__ = store.getState() as any\nthis.username = __state__.auth?.user?.username || ''\n\n }\n\n get isMine() {\n return this.template?.creator?.username === this.username\n }\n\n render() {\n const template = this.template || {}\n const mine = this.isMine\n const when = (value?: string) => (value ? new Date(value).toLocaleString() : '')\n\n return html`\n <form>\n <div class=\"fields\">\n <label>\n ${i18next.t('field.name')}\n <input\n name=\"name\"\n .value=${template.name || ''}\n @input=${e => (this.template.name = e.target.value)}\n ?disabled=${!mine}\n />\n </label>\n <label>\n ${i18next.t('field.description')}\n <textarea\n name=\"description\"\n .value=${template.description || ''}\n @input=${e => (this.template.description = e.target.value)}\n ?disabled=${!mine}\n ></textarea>\n </label>\n <label>\n ${i18next.t('field.visibility')}\n <select\n name=\"visibility\"\n .value=${template.visibility || 'private'}\n @change=${e => (this.template.visibility = e.target.value)}\n ?disabled=${!mine}\n >\n <option value=\"private\">${i18next.t('label.visibility-private')}</option>\n <option value=\"domain\">${i18next.t('label.visibility-domain')}</option>\n <option value=\"public\">${i18next.t('label.visibility-public')}</option>\n </select>\n </label>\n </div>\n </form>\n\n <div class=\"provenance\">\n <span>${i18next.t('label.creator')} <b>${template.creator?.name || '-'}</b> ${when(template.createdAt)}</span>\n ${mine\n ? ''\n : html`<span>${i18next.t('text.only the creator can edit a template', {\n defaultValue: 'Only the creator can change a template.'\n })}</span>`}\n </div>\n\n <ox-popup-actions>\n ${mine\n ? html`\n <md-text-button slot=\"start\" destructive cap @click=${this.onDelete}>\n <md-icon slot=\"icon\">delete_outline</md-icon>${i18next.t('button.delete')}\n </md-text-button>\n <md-filled-button slot=\"confirm\" cap @click=${this.onUpdate}>\n <md-icon slot=\"icon\">save</md-icon>${i18next.t('button.save')}\n </md-filled-button>\n `\n : html`\n <md-text-button slot=\"cancel\" cap @click=${() => history.back()}>${i18next.t('button.close', { defaultValue: 'close' })}</md-text-button>\n `}\n </ox-popup-actions>\n `\n }\n\n async onUpdate() {\n const formData = new FormData(this.form)\n const patch: any = {}\n for (const [key, value] of formData.entries()) {\n patch[key] = value\n }\n\n try {\n await client.mutate({\n mutation: gql`\n mutation ($id: String!, $patch: BoardTemplatePatch!) {\n updateBoardTemplate(id: $id, patch: $patch) {\n id\n }\n }\n `,\n variables: {\n id: this.template.id,\n patch\n }\n })\n notify('info', i18next.t('text.board-template updated'))\n this.dispatchEvent(new CustomEvent('updated', { bubbles: true, composed: true }))\n history.back()\n } catch (ex) {\n notify('error', ex, ex)\n }\n }\n\n async onDelete() {\n if (\n await OxPrompt.open({\n title: i18next.t('text.are_you_sure'),\n text: i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }),\n confirmButton: { text: i18next.t('button.confirm') },\n cancelButton: { text: i18next.t('button.cancel') }\n })\n ) {\n try {\n await client.mutate({\n mutation: gql`\n mutation ($id: String!) {\n deleteBoardTemplate(id: $id)\n }\n `,\n variables: { id: this.template.id }\n })\n notify('info', i18next.t('text.board-template deleted'))\n this.dispatchEvent(new CustomEvent('deleted', { bubbles: true, composed: true }))\n history.back()\n } catch (ex) {\n notify('error', ex, ex)\n }\n }\n }\n\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import '@operato/popup/ox-popup-actions.js';
1
2
  import '@material/web/icon/icon.js';
2
3
  import '@material/web/button/filled-button.js';
3
4
  import '@material/web/button/text-button.js';
@@ -1,4 +1,5 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
+ import '@operato/popup/ox-popup-actions.js';
2
3
  import '@material/web/icon/icon.js';
3
4
  import '@material/web/button/filled-button.js';
4
5
  import '@material/web/button/text-button.js';
@@ -40,24 +41,22 @@ let GroupInfo = class GroupInfo extends LitElement {
40
41
 
41
42
  ${this.groupId ? this.renderProvenance(group) : ''}
42
43
 
43
- <div class="buttons">
44
+ <ox-popup-actions>
44
45
  ${this.groupId
45
46
  ? html `
46
- <md-text-button cap danger @click=${this.deleteGroup.bind(this)}>
47
+ <md-text-button slot="start" destructive cap @click=${this.deleteGroup.bind(this)}>
47
48
  <md-icon slot="icon">delete_outline</md-icon>${i18next.t('button.delete')}
48
49
  </md-text-button>
49
- <div filler></div>
50
- <md-filled-button cap @click=${this.updateGroup.bind(this)}>
50
+ <md-filled-button slot="confirm" cap @click=${this.updateGroup.bind(this)}>
51
51
  <md-icon slot="icon">save</md-icon>${i18next.t('button.save')}
52
52
  </md-filled-button>
53
53
  `
54
54
  : html `
55
- <div filler></div>
56
- <md-filled-button cap @click=${this.createGroup.bind(this)}>
55
+ <md-filled-button slot="confirm" cap @click=${this.createGroup.bind(this)}>
57
56
  <md-icon slot="icon">create_new_folder</md-icon>${i18next.t('button.create')}
58
57
  </md-filled-button>
59
58
  `}
60
- </div>
59
+ </ox-popup-actions>
61
60
  `;
62
61
  }
63
62
  renderProvenance(group) {
@@ -1 +1 @@
1
- {"version":3,"file":"group-info-basic.js","sourceRoot":"","sources":["../../client/viewparts/group-info-basic.ts"],"names":[],"mappings":";AAAA,OAAO,4BAA4B,CAAA;AACnC,OAAO,uCAAuC,CAAA;AAC9C,OAAO,qCAAqC,CAAA;AAE5C,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAElE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAEnD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAExD;;;;GAIG;AAEI,IAAM,SAAS,GAAf,MAAM,SAAU,SAAQ,UAAU;IAAlC;;QAKI,UAAK,GAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAA;IA+FrD,CAAC;aAnGQ,WAAM,GAAG,CAAC,iBAAiB,EAAE,cAAc,CAAC,AAAtC,CAAsC;IAMnD,MAAM;QACJ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAA;QAEzD,OAAO,IAAI,CAAA;;;YAGH,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;sCACG,KAAK,CAAC,IAAI,IAAI,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;;;;YAI7F,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC;;;qBAGrB,KAAK,CAAC,WAAW,IAAI,EAAE;sBACtB,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;;;;;QAK5D,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;;;UAG9C,IAAI,CAAC,OAAO;YACZ,CAAC,CAAC,IAAI,CAAA;kDACkC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;+DACd,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;;;6CAG5C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;qDACnB,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;;aAEhE;YACH,CAAC,CAAC,IAAI,CAAA;;6CAE6B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;kEACN,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;;aAE/E;;KAER,CAAA;IACH,CAAC;IAEO,gBAAgB,CAAC,KAAU;QACjC,MAAM,IAAI,GAAG,CAAC,KAAc,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAEhF,OAAO,IAAI,CAAA;;gBAEC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,KAAK,CAAC,OAAO,EAAE,IAAI,IAAI,GAAG,QAAQ,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;gBACxF,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,KAAK,CAAC,OAAO,EAAE,IAAI,IAAI,GAAG,QAAQ,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;;KAEnG,CAAA;IACH,CAAC;IAED,OAAO,CAAC,OAAO;QACb,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,EAAE,CAAA;QAChB,CAAC;IACH,CAAC;IAED,YAAY;QACV,UAAU,CAAC,GAAG,EAAE;YACd,CAAC;YAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,CAAS,EAAE,KAAK,EAAE,CAAA;QAC3D,CAAC,EAAE,GAAG,CAAC,CAAA;IACT,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAA;QAC5C,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAC/C,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAA;QAC7B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QAC1G,IAAI,CAAC,KAAK,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QAC1G,IAAI,CAAC,KAAK,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QAC1G,IAAI,CAAC,KAAK,EAAE,CAAA;IACd,CAAC;IAED,KAAK;QACH,OAAO,CAAC,IAAI,EAAE,CAAA;IAChB,CAAC;;AAhG2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;0CAAiB;AAEnC;IAAR,KAAK,EAAE;;wCAA2C;AALxC,SAAS;IADrB,aAAa,CAAC,kBAAkB,CAAC;GACrB,SAAS,CAoGrB","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/button/text-button.js'\n\nimport { html, LitElement } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { i18next } from '@operato/i18n'\nimport { CommonPopupStyles } from '@operato/styles'\n\nimport { fetchGroup } from '../graphql/group.js'\nimport { InfoFormStyles } from './info-dialog-styles.js'\n\n/**\n * The group form: a name, a description, and one commit button. Who made it and when is a\n * side note that only exists for a group that exists - a new group used to show two rows of\n * \"Invalid Date\" here.\n */\n@customElement('group-info-basic')\nexport class GroupInfo extends LitElement {\n static styles = [CommonPopupStyles, InfoFormStyles]\n\n @property({ type: String }) groupId?: string\n\n @state() group: any = { name: '', description: '' }\n\n render() {\n const group = this.group || { name: '', description: '' }\n\n return html`\n <div class=\"fields\">\n <label>\n ${i18next.t('label.name')}\n <input type=\"text\" .value=${group.name || ''} @change=${e => (this.group.name = e.target.value)} autofocus />\n </label>\n\n <label>\n ${i18next.t('label.description')}\n <input\n type=\"text\"\n .value=${group.description || ''}\n @change=${e => (this.group.description = e.target.value)}\n />\n </label>\n </div>\n\n ${this.groupId ? this.renderProvenance(group) : ''}\n\n <div class=\"buttons\">\n ${this.groupId\n ? html`\n <md-text-button cap danger @click=${this.deleteGroup.bind(this)}>\n <md-icon slot=\"icon\">delete_outline</md-icon>${i18next.t('button.delete')}\n </md-text-button>\n <div filler></div>\n <md-filled-button cap @click=${this.updateGroup.bind(this)}>\n <md-icon slot=\"icon\">save</md-icon>${i18next.t('button.save')}\n </md-filled-button>\n `\n : html`\n <div filler></div>\n <md-filled-button cap @click=${this.createGroup.bind(this)}>\n <md-icon slot=\"icon\">create_new_folder</md-icon>${i18next.t('button.create')}\n </md-filled-button>\n `}\n </div>\n `\n }\n\n private renderProvenance(group: any) {\n const when = (value?: string) => (value ? new Date(value).toLocaleString() : '')\n\n return html`\n <div class=\"provenance\">\n <span>${i18next.t('label.creator')} <b>${group.creator?.name || '-'}</b> ${when(group.createdAt)}</span>\n <span>${i18next.t('label.updater')} <b>${group.updater?.name || '-'}</b> ${when(group.updatedAt)}</span>\n </div>\n `\n }\n\n updated(changes) {\n if (changes.has('groupId')) {\n this.refresh()\n }\n }\n\n firstUpdated() {\n setTimeout(() => {\n ;(this.renderRoot.querySelector('input') as any)?.focus()\n }, 100)\n }\n\n async refresh() {\n if (!this.groupId) {\n this.group = { name: '', description: '' }\n } else {\n const response = await fetchGroup(this.groupId)\n this.group = response.group\n }\n }\n\n async createGroup() {\n this.dispatchEvent(new CustomEvent('create-group', { detail: this.group, bubbles: true, composed: true }))\n this.close()\n }\n\n async updateGroup() {\n this.dispatchEvent(new CustomEvent('update-group', { detail: this.group, bubbles: true, composed: true }))\n this.close()\n }\n\n async deleteGroup() {\n this.dispatchEvent(new CustomEvent('delete-group', { detail: this.group, bubbles: true, composed: true }))\n this.close()\n }\n\n close() {\n history.back()\n }\n}\n"]}
1
+ {"version":3,"file":"group-info-basic.js","sourceRoot":"","sources":["../../client/viewparts/group-info-basic.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/popup/ox-popup-actions.js'\nimport '@material/web/icon/icon.js'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/button/text-button.js'\n\nimport { html, LitElement } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { i18next } from '@operato/i18n'\nimport { CommonPopupStyles } from '@operato/styles'\n\nimport { fetchGroup } from '../graphql/group.js'\nimport { InfoFormStyles } from './info-dialog-styles.js'\n\n/**\n * The group form: a name, a description, and one commit button. Who made it and when is a\n * side note that only exists for a group that exists - a new group used to show two rows of\n * \"Invalid Date\" here.\n */\n@customElement('group-info-basic')\nexport class GroupInfo extends LitElement {\n static styles = [CommonPopupStyles, InfoFormStyles]\n\n @property({ type: String }) groupId?: string\n\n @state() group: any = { name: '', description: '' }\n\n render() {\n const group = this.group || { name: '', description: '' }\n\n return html`\n <div class=\"fields\">\n <label>\n ${i18next.t('label.name')}\n <input type=\"text\" .value=${group.name || ''} @change=${e => (this.group.name = e.target.value)} autofocus />\n </label>\n\n <label>\n ${i18next.t('label.description')}\n <input\n type=\"text\"\n .value=${group.description || ''}\n @change=${e => (this.group.description = e.target.value)}\n />\n </label>\n </div>\n\n ${this.groupId ? this.renderProvenance(group) : ''}\n\n <ox-popup-actions>\n ${this.groupId\n ? html`\n <md-text-button slot=\"start\" destructive cap @click=${this.deleteGroup.bind(this)}>\n <md-icon slot=\"icon\">delete_outline</md-icon>${i18next.t('button.delete')}\n </md-text-button>\n <md-filled-button slot=\"confirm\" cap @click=${this.updateGroup.bind(this)}>\n <md-icon slot=\"icon\">save</md-icon>${i18next.t('button.save')}\n </md-filled-button>\n `\n : html`\n <md-filled-button slot=\"confirm\" cap @click=${this.createGroup.bind(this)}>\n <md-icon slot=\"icon\">create_new_folder</md-icon>${i18next.t('button.create')}\n </md-filled-button>\n `}\n </ox-popup-actions>\n `\n }\n\n private renderProvenance(group: any) {\n const when = (value?: string) => (value ? new Date(value).toLocaleString() : '')\n\n return html`\n <div class=\"provenance\">\n <span>${i18next.t('label.creator')} <b>${group.creator?.name || '-'}</b> ${when(group.createdAt)}</span>\n <span>${i18next.t('label.updater')} <b>${group.updater?.name || '-'}</b> ${when(group.updatedAt)}</span>\n </div>\n `\n }\n\n updated(changes) {\n if (changes.has('groupId')) {\n this.refresh()\n }\n }\n\n firstUpdated() {\n setTimeout(() => {\n ;(this.renderRoot.querySelector('input') as any)?.focus()\n }, 100)\n }\n\n async refresh() {\n if (!this.groupId) {\n this.group = { name: '', description: '' }\n } else {\n const response = await fetchGroup(this.groupId)\n this.group = response.group\n }\n }\n\n async createGroup() {\n this.dispatchEvent(new CustomEvent('create-group', { detail: this.group, bubbles: true, composed: true }))\n this.close()\n }\n\n async updateGroup() {\n this.dispatchEvent(new CustomEvent('update-group', { detail: this.group, bubbles: true, composed: true }))\n this.close()\n }\n\n async deleteGroup() {\n this.dispatchEvent(new CustomEvent('delete-group', { detail: this.group, bubbles: true, composed: true }))\n this.close()\n }\n\n close() {\n history.back()\n }\n}\n"]}
@@ -36,7 +36,7 @@ let GroupInfoImport = class GroupInfoImport extends LitElement {
36
36
  return html `
37
37
  <ox-input-file accept="*/*" multiple="true"></ox-input-file>
38
38
 
39
- <div class="buttons">
39
+ <div tools>
40
40
  <label overwrite>
41
41
  <md-checkbox touch-target="wrapper" checked></md-checkbox>
42
42
  ${i18next.t('label.overwrite', { defaultValue: 'overwrite' })}
@@ -1 +1 @@
1
- {"version":3,"file":"group-info-import.js","sourceRoot":"","sources":["../../client/viewparts/group-info-import.ts"],"names":[],"mappings":";AAAA,OAAO,4BAA4B,CAAA;AACnC,OAAO,uCAAuC,CAAA;AAC9C,OAAO,oCAAoC,CAAA;AAC3C,OAAO,iCAAiC,CAAA;AAExC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAEzE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAEnD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAExD,4FAA4F;AAErF,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,UAAU;aACtC,WAAM,GAAG;QACd,iBAAiB;QACjB,cAAc;QACd,GAAG,CAAA;;;;;;;;;;;;;KAaF;KACF,AAjBY,CAiBZ;IASD,MAAM;QACJ,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,IAAI,CAAA,EAAE,CAAA;QACf,CAAC;QAED,OAAO,IAAI,CAAA;;;;;;YAMH,OAAO,CAAC,CAAC,CAAC,iBAAiB,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;;;uCAGhC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;kDAChB,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;KAG7E,CAAA;IACH,CAAC;IAED,OAAO,CAAC,OAAO;QACb,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,EAAE,CAAA;QAChB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAA;QAC5C,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAC/C,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAA;QAC7B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,eAAe,EAAE;YAC/B,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE;gBACN,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK;gBAC9B,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO;aAClC;SACF,CAAC,CACH,CAAA;QAED,IAAI,CAAC,KAAK,EAAE,CAAA;IACd,CAAC;IAED,KAAK;QACH,OAAO,CAAC,IAAI,EAAE,CAAA;IAChB,CAAC;;AA7D2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;gDAAiB;AAEnC;IAAR,KAAK,EAAE;;8CAAW;AAEK;IAAvB,KAAK,CAAC,eAAe,CAAC;;qDAAkB;AACnB;IAArB,KAAK,CAAC,aAAa,CAAC;;kDAAe;AAzBzB,eAAe;IAD3B,aAAa,CAAC,mBAAmB,CAAC;GACtB,eAAe,CAkF3B","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/checkbox/checkbox.js'\nimport '@operato/input/ox-input-file.js'\n\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\n\nimport { i18next } from '@operato/i18n'\nimport { CommonPopupStyles } from '@operato/styles'\n\nimport { fetchGroup } from '../graphql/index.js'\nimport { InfoFormStyles } from './info-dialog-styles.js'\n\n/** Import exported boards into this group: a drop zone, an overwrite switch, one button. */\n@customElement('group-info-import')\nexport class GroupInfoImport extends LitElement {\n static styles = [\n CommonPopupStyles,\n InfoFormStyles,\n css`\n ox-input-file {\n min-height: 120px;\n }\n\n label[overwrite] {\n display: flex;\n align-items: center;\n gap: var(--spacing-small, 4px);\n font-size: var(--popup-font-size-small);\n color: var(--md-sys-color-on-surface-variant);\n cursor: pointer;\n }\n `\n ]\n\n @property({ type: String }) groupId?: string\n\n @state() group: any\n\n @query('ox-input-file') fileUploader: any\n @query('md-checkbox') overwrite: any\n\n render() {\n if (!this.groupId) {\n return html``\n }\n\n return html`\n <ox-input-file accept=\"*/*\" multiple=\"true\"></ox-input-file>\n\n <div class=\"buttons\">\n <label overwrite>\n <md-checkbox touch-target=\"wrapper\" checked></md-checkbox>\n ${i18next.t('label.overwrite', { defaultValue: 'overwrite' })}\n </label>\n <div filler></div>\n <md-filled-button cap @click=${this.importBoard.bind(this)}>\n <md-icon slot=\"icon\">publish</md-icon>${i18next.t('button.import-board')}\n </md-filled-button>\n </div>\n `\n }\n\n updated(changes) {\n if (changes.has('groupId')) {\n this.refresh()\n }\n }\n\n async refresh() {\n if (!this.groupId) {\n this.group = { name: '', description: '' }\n } else {\n const response = await fetchGroup(this.groupId)\n this.group = response.group\n }\n }\n\n async importBoard() {\n this.dispatchEvent(\n new CustomEvent('import-boards', {\n bubbles: true,\n composed: true,\n detail: {\n group: this.group,\n files: this.fileUploader.files,\n overwrite: this.overwrite.checked\n }\n })\n )\n\n this.close()\n }\n\n close() {\n history.back()\n }\n}\n"]}
1
+ {"version":3,"file":"group-info-import.js","sourceRoot":"","sources":["../../client/viewparts/group-info-import.ts"],"names":[],"mappings":";AAAA,OAAO,4BAA4B,CAAA;AACnC,OAAO,uCAAuC,CAAA;AAC9C,OAAO,oCAAoC,CAAA;AAC3C,OAAO,iCAAiC,CAAA;AAExC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAEzE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAEnD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAExD,4FAA4F;AAErF,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,UAAU;aACtC,WAAM,GAAG;QACd,iBAAiB;QACjB,cAAc;QACd,GAAG,CAAA;;;;;;;;;;;;;KAaF;KACF,AAjBY,CAiBZ;IASD,MAAM;QACJ,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,IAAI,CAAA,EAAE,CAAA;QACf,CAAC;QAED,OAAO,IAAI,CAAA;;;;;;YAMH,OAAO,CAAC,CAAC,CAAC,iBAAiB,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;;;uCAGhC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;kDAChB,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;KAG7E,CAAA;IACH,CAAC;IAED,OAAO,CAAC,OAAO;QACb,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,EAAE,CAAA;QAChB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAA;QAC5C,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAC/C,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAA;QAC7B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,eAAe,EAAE;YAC/B,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE;gBACN,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK;gBAC9B,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO;aAClC;SACF,CAAC,CACH,CAAA;QAED,IAAI,CAAC,KAAK,EAAE,CAAA;IACd,CAAC;IAED,KAAK;QACH,OAAO,CAAC,IAAI,EAAE,CAAA;IAChB,CAAC;;AA7D2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;gDAAiB;AAEnC;IAAR,KAAK,EAAE;;8CAAW;AAEK;IAAvB,KAAK,CAAC,eAAe,CAAC;;qDAAkB;AACnB;IAArB,KAAK,CAAC,aAAa,CAAC;;kDAAe;AAzBzB,eAAe;IAD3B,aAAa,CAAC,mBAAmB,CAAC;GACtB,eAAe,CAkF3B","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/checkbox/checkbox.js'\nimport '@operato/input/ox-input-file.js'\n\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\n\nimport { i18next } from '@operato/i18n'\nimport { CommonPopupStyles } from '@operato/styles'\n\nimport { fetchGroup } from '../graphql/index.js'\nimport { InfoFormStyles } from './info-dialog-styles.js'\n\n/** Import exported boards into this group: a drop zone, an overwrite switch, one button. */\n@customElement('group-info-import')\nexport class GroupInfoImport extends LitElement {\n static styles = [\n CommonPopupStyles,\n InfoFormStyles,\n css`\n ox-input-file {\n min-height: 120px;\n }\n\n label[overwrite] {\n display: flex;\n align-items: center;\n gap: var(--spacing-small, 4px);\n font-size: var(--popup-font-size-small);\n color: var(--md-sys-color-on-surface-variant);\n cursor: pointer;\n }\n `\n ]\n\n @property({ type: String }) groupId?: string\n\n @state() group: any\n\n @query('ox-input-file') fileUploader: any\n @query('md-checkbox') overwrite: any\n\n render() {\n if (!this.groupId) {\n return html``\n }\n\n return html`\n <ox-input-file accept=\"*/*\" multiple=\"true\"></ox-input-file>\n\n <div tools>\n <label overwrite>\n <md-checkbox touch-target=\"wrapper\" checked></md-checkbox>\n ${i18next.t('label.overwrite', { defaultValue: 'overwrite' })}\n </label>\n <div filler></div>\n <md-filled-button cap @click=${this.importBoard.bind(this)}>\n <md-icon slot=\"icon\">publish</md-icon>${i18next.t('button.import-board')}\n </md-filled-button>\n </div>\n `\n }\n\n updated(changes) {\n if (changes.has('groupId')) {\n this.refresh()\n }\n }\n\n async refresh() {\n if (!this.groupId) {\n this.group = { name: '', description: '' }\n } else {\n const response = await fetchGroup(this.groupId)\n this.group = response.group\n }\n }\n\n async importBoard() {\n this.dispatchEvent(\n new CustomEvent('import-boards', {\n bubbles: true,\n composed: true,\n detail: {\n group: this.group,\n files: this.fileUploader.files,\n overwrite: this.overwrite.checked\n }\n })\n )\n\n this.close()\n }\n\n close() {\n history.back()\n }\n}\n"]}
@@ -179,7 +179,18 @@ export const InfoFormStyles = css `
179
179
  color: var(--md-sys-color-on-surface);
180
180
  }
181
181
 
182
- .buttons [filler] {
182
+ /*
183
+ * A tool row inside a dialog's body or footer - a menu, a copy-link button, an import option. It is
184
+ * not the dialog's closing command row, which is <ox-popup-actions>; it only lines its tools up.
185
+ */
186
+ [tools] {
187
+ display: flex;
188
+ justify-content: flex-end;
189
+ align-items: center;
190
+ gap: var(--spacing-small, 4px);
191
+ }
192
+
193
+ [tools] [filler] {
183
194
  flex: 1;
184
195
  }
185
196