@things-factory/board-ui 10.1.46 → 10.1.50

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.
@@ -596,7 +596,7 @@ let BoardInfo = class BoardInfo extends LitElement {
596
596
  async deleteBoard() {
597
597
  if (await OxPrompt.open({
598
598
  title: i18next.t('text.are_you_sure'),
599
- text: i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }),
599
+ text: i18next.t('text.sure_to_x', { x: i18next.t('button.delete') }),
600
600
  confirmButton: { text: i18next.t('button.confirm') },
601
601
  cancelButton: { text: i18next.t('button.cancel') }
602
602
  })) {
@@ -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 /* 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"]}
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('button.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"]}
@@ -146,7 +146,7 @@ let BoardTemplateInfo = class BoardTemplateInfo extends LitElement {
146
146
  async onDelete() {
147
147
  if (await OxPrompt.open({
148
148
  title: i18next.t('text.are_you_sure'),
149
- text: i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }),
149
+ text: i18next.t('text.sure_to_x', { x: i18next.t('button.delete') }),
150
150
  confirmButton: { text: i18next.t('button.confirm') },
151
151
  cancelButton: { text: i18next.t('button.cancel') }
152
152
  })) {
@@ -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 '@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
+ {"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('button.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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/board-ui",
3
- "version": "10.1.46",
3
+ "version": "10.1.50",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "dist-client/index.js",
6
6
  "things-factory": true,
@@ -43,11 +43,12 @@
43
43
  "@operato/shell": "^10.0.0",
44
44
  "@operato/styles": "^10.0.0",
45
45
  "@operato/utils": "^10.0.0",
46
- "@things-factory/barcode-base": "^10.1.46",
47
- "@things-factory/board-ai": "^10.1.46",
48
- "@things-factory/fav-base": "^10.1.46",
49
- "@things-factory/setting-base": "^10.1.46",
46
+ "@things-factory/ai-assistant": "^10.1.50",
47
+ "@things-factory/barcode-base": "^10.1.47",
48
+ "@things-factory/board-ai": "^10.1.50",
49
+ "@things-factory/fav-base": "^10.1.47",
50
+ "@things-factory/setting-base": "^10.1.47",
50
51
  "@things-factory/utils": "^10.1.20"
51
52
  },
52
- "gitHead": "d3467cde550453f3348fed0ed6c79a12a6ba0db4"
53
+ "gitHead": "4700d39d70eb5fae4ad56cf47ea0b966c8516ae2"
53
54
  }
@@ -13,7 +13,6 @@
13
13
  "button.bring-forward": "bring forward",
14
14
  "button.bring-to-back": "bring to back",
15
15
  "button.bring-to-front": "bring to front",
16
- "button.cancel": "cancel",
17
16
  "button.cancel-request-confirm": "Re-Edit",
18
17
  "button.cancel-request-release": "Re-Edit",
19
18
  "button.change_password": "Change Password",
@@ -21,16 +20,10 @@
21
20
  "button.check-initialized": "Check Initialized Settings",
22
21
  "button.choose another": "choose another file",
23
22
  "button.clear": "Clear",
24
- "button.close": "Close",
25
- "button.confirm": "confirm",
26
- "button.copy": "copy",
27
23
  "button.copy to draft": "copy to draft",
28
24
  "button.copy-link": "Copy headless link",
29
- "button.create": "create",
30
25
  "button.create board": "create board",
31
26
  "button.decrease-font": "decrease font",
32
- "button.delete": "delete",
33
- "button.detail": "detail",
34
27
  "button.diff with draft": "diff with draft",
35
28
  "button.diff with previous": "diff with previous",
36
29
  "button.duplicate": "Duplicate…",
@@ -57,7 +50,6 @@
57
50
  "button.open-import": "Import",
58
51
  "button.open-modeller": "Open in modeller",
59
52
  "button.profile": "profile",
60
- "button.redo": "redo",
61
53
  "button.refresh": "refresh",
62
54
  "button.regenerate": "regenerate",
63
55
  "button.register-template": "register template",
@@ -73,7 +65,6 @@
73
65
  "button.retry": "retry",
74
66
  "button.revert-board-version": "revert version",
75
67
  "button.role-list": "Roles",
76
- "button.save": "save",
77
68
  "button.save as new board": "save as new board",
78
69
  "button.script": "script",
79
70
  "button.self-confirm": "Self confirm",
@@ -87,9 +78,7 @@
87
78
  "button.submit": "Submit",
88
79
  "button.toggle-property-panel": "toggle property panel",
89
80
  "button.toggle_sidebar": "Menu Toggle",
90
- "button.undo": "undo",
91
81
  "button.ungroup": "ungroup",
92
- "button.update": "update",
93
82
  "button.upload": "Upload",
94
83
  "button.version-up": "version up",
95
84
  "button.view": "view",
@@ -110,7 +99,6 @@
110
99
  "error.your license due date is x, please renewal your license!": "Your license due date is {x}, please renewal your license!",
111
100
  "error.your license is expired! expired date is [x]": "Your license is expired! Expired date is [{x}]",
112
101
  "error.your license is not valid in this host": "Your license is not valid in this host!",
113
- "field.email": "E-mail",
114
102
  "field.password": "password",
115
103
  "field.tags": "tags",
116
104
  "field.visibility": "visibility",
@@ -241,7 +229,6 @@
241
229
  "label.delay": "Delay",
242
230
  "label.delete": "Delete",
243
231
  "label.depth": "depth",
244
- "label.description": "description",
245
232
  "label.dimension": "dimension",
246
233
  "label.direction": "Direction",
247
234
  "label.disabled": "disabled",
@@ -398,7 +385,6 @@
398
385
  "label.move_to_admin": "Move to Administrator Page",
399
386
  "label.multi-axis": "Multi Axis",
400
387
  "label.multiple": "multiple",
401
- "label.name": "Name",
402
388
  "label.ndns": "No Data No Show",
403
389
  "label.ndnsp": "No Data No Spreading",
404
390
  "label.near": "Near",
@@ -736,7 +722,6 @@
736
722
  "text.latest": "latest",
737
723
  "text.leaved from play-group": "board '{board}' leaved from play-group '{playGroup}'",
738
724
  "text.link copied": "Link copied",
739
- "text.loading": "Loading...",
740
725
  "text.login_failure": "Login failure.",
741
726
  "text.model-overlay": "Because this label is status of {1} \n, you can not edit more.",
742
727
  "text.model-overlay-authority-not-allow-change": "Cause of your authority, you can not edit more.",
@@ -759,7 +744,6 @@
759
744
  "text.no difference from previous": "no difference from the previous version",
760
745
  "text.no existing files": "No drawing or image files found. Use the 'From New Drawing' tab to upload.",
761
746
  "text.no playgroup": "no playgroup is specified in the address, or the specified playgroup was not found.",
762
- "text.no released version information available": "no released version information available",
763
747
  "text.no templates": "No templates available.",
764
748
  "text.only-edit-status-label-can-be-deleted": "Only EDIT Status Label allow to be deleted!",
765
749
  "text.only-edit-status-label-can-be-saved": "Only authorized user and EDIT Status Label allow to be updated!",
@@ -16,21 +16,14 @@
16
16
  "button.bring-forward": "最前面へ移動",
17
17
  "button.bring-to-back": "背面へ移動",
18
18
  "button.bring-to-front": "前面へ移動",
19
- "button.cancel": "キャンセル",
20
19
  "button.cancel-request-confirm": "再編集",
21
20
  "button.cancel-request-release": "再編集",
22
21
  "button.change_password": "パスワード変更",
23
22
  "button.check": "チェック",
24
23
  "button.check-initialized": "初期化設定チェック",
25
24
  "button.clear": "フォーム リセット",
26
- "button.close": "閉じる",
27
- "button.confirm": "確認",
28
- "button.copy": "コピー",
29
25
  "button.copy to draft": "ドラフトにコピー",
30
- "button.create": "作成",
31
26
  "button.decrease-font": "フォント サイズ縮小",
32
- "button.delete": "削除",
33
- "button.detail": "詳細",
34
27
  "button.diff with draft": "ドラフトと比較",
35
28
  "button.diff with previous": "前のバージョンと比較",
36
29
  "button.edit": "修正",
@@ -52,7 +45,6 @@
52
45
  "button.new-group": "新しいグループ",
53
46
  "button.open-import": "読み込み",
54
47
  "button.profile": "プロフィール",
55
- "button.redo": "やり直す",
56
48
  "button.refresh": "リロード",
57
49
  "button.register-template": "テンプレートを登録",
58
50
  "button.reject": "拒む",
@@ -66,7 +58,6 @@
66
58
  "button.reset_password": "パスワード リセット",
67
59
  "button.revert-board-version": "バージョンを戻す",
68
60
  "button.role-list": "ロール",
69
- "button.save": "保存",
70
61
  "button.script": "スクリプト",
71
62
  "button.self-confirm": "自己配布",
72
63
  "button.send-backward": "最背面へ移動",
@@ -78,9 +69,7 @@
78
69
  "button.submit": "確認",
79
70
  "button.toggle-property-panel": "プロパティパネル表示/非表示",
80
71
  "button.toggle_sidebar": "メニュー トグル",
81
- "button.undo": "取り消す",
82
72
  "button.ungroup": "グループ解除",
83
- "button.update": "修正",
84
73
  "button.upload": "アップロード",
85
74
  "button.version-up": "バージョンアップ",
86
75
  "button.view": "見る",
@@ -217,7 +206,6 @@
217
206
  "label.delay": "遅延",
218
207
  "label.delete": "削除",
219
208
  "label.depth": "深さ",
220
- "label.description": "説明",
221
209
  "label.dimension": "大きさ",
222
210
  "label.direction": "方向",
223
211
  "label.disabled": "使用不能",
@@ -230,7 +218,6 @@
230
218
  "label.donut-style": "ドーナッツ スタイル",
231
219
  "label.draggable": "ドラッグ機能",
232
220
  "label.duration": "継続時間",
233
- "label.email": "メール",
234
221
  "label.email-id": "メールID",
235
222
  "label.email_address": "メール",
236
223
  "label.emphasize": "強調",
@@ -357,7 +344,6 @@
357
344
  "label.move_to_admin": "管理者ページに移動",
358
345
  "label.multi-axis": "2軸",
359
346
  "label.multiple": "多重",
360
- "label.name": "名前",
361
347
  "label.ndns": "No Data No Show",
362
348
  "label.ndnsp": "No Data No Spreading",
363
349
  "label.near": "Near",
@@ -683,7 +669,6 @@
683
669
  "text.no difference from draft": "ドラフトとの差分はありません",
684
670
  "text.no difference from previous": "前のバージョンとの差分はありません",
685
671
  "text.no playgroup": "アドレスに再生グループが指定されていないか、指定されたグループが見つかりませんでした。",
686
- "text.no released version information available": "リリースされたバージョン情報はありません",
687
672
  "text.only-edit-status-label-can-be-deleted": "編集状態のBoardのみ削除できます!",
688
673
  "text.only-edit-status-label-can-be-saved": "権限が付与されたユーザーと編集状態のBoardのみ修正できます!",
689
674
  "text.password_inited": "パスワード リセット",
@@ -749,5 +734,92 @@
749
734
  "title.update-preferences": "設定修正",
750
735
  "title.update-user": "ユーザー修正",
751
736
  "title.update-variable": "変数修正",
752
- "title.warn": "警告"
737
+ "title.warn": "警告",
738
+ "button.choose another": "別のファイルを選択",
739
+ "button.copy-link": "ヘッドレスリンクをコピー",
740
+ "button.create board": "新規ボード作成",
741
+ "button.duplicate": "複製…",
742
+ "button.export-json": "JSONでエクスポート",
743
+ "button.import another": "別の図面をインポート",
744
+ "button.open modeller": "モデラーを開く",
745
+ "button.open-modeller": "モデラーで開く",
746
+ "button.regenerate": "再リクエスト",
747
+ "button.retry": "再試行",
748
+ "button.save as new board": "新しいボードとして保存",
749
+ "button.start import": "変換開始",
750
+ "button.start over": "最初から",
751
+ "hint.choose variant": "同じ図面に対するAIの異なる解釈です。最も適切なものを選択してください。",
752
+ "hint.regenerate variants": "気に入る案がなければAIに再リクエスト",
753
+ "hint.user prompt": "任意 — 例:'FABリソグラフィ区域、中央の大きな四角形はstocker、細い直線はOHTレール'",
754
+ "label.ai analysis": "AI分析サマリー",
755
+ "label.ai client": "AIモデル",
756
+ "label.ai intent": "AIの意図 / 進め方",
757
+ "label.assembling": "ボード組み立て",
758
+ "label.binding": "データバインディング",
759
+ "label.board description": "ボード説明",
760
+ "label.categories": "カテゴリー",
761
+ "label.choose variant": "AI案の選択",
762
+ "label.completed": "完了",
763
+ "label.confidence": "信頼度",
764
+ "label.create board": "新規ボード作成",
765
+ "label.done": "完了",
766
+ "label.draft": "下書き",
767
+ "label.entities": "エンティティ",
768
+ "label.failed": "失敗",
769
+ "label.from-existing-drawing": "既存の図面から",
770
+ "label.from-new-drawing": "新しい図面から",
771
+ "label.from-scratch": "最初から",
772
+ "label.from-template": "テンプレートから",
773
+ "label.generic": "一般オブジェクト",
774
+ "label.image size": "画像サイズ",
775
+ "label.import progress": "変換の進行状況",
776
+ "label.mapping": "マッピング",
777
+ "label.matched": "マッピング済み",
778
+ "label.mimetype": "MIMEタイプ",
779
+ "label.modeller toolbar contextual": "選択対象の横にフローティング",
780
+ "label.modeller toolbar docked": "キャンバス上部に固定",
781
+ "label.modeller toolbar fixed": "すべてのツールを備えた基本ツールバー",
782
+ "label.new board name": "新しいボード名",
783
+ "label.no group": "(グループなし)",
784
+ "label.parsing": "解析",
785
+ "label.queued": "待機中",
786
+ "label.reasoning": "根拠",
787
+ "label.review": "確認",
788
+ "label.select file": "ファイル選択",
789
+ "label.upload": "アップロード",
790
+ "label.user hint": "ユーザーヒント",
791
+ "label.user prompt": "図面の説明 / 強調したい点",
792
+ "label.view type": "図面の種類",
793
+ "label.viewtype perspective-3d": "3Dレンダー / 鳥瞰図",
794
+ "label.viewtype photo": "写真",
795
+ "label.viewtype top-down": "平面図 (top-down)",
796
+ "label.warnings": "警告",
797
+ "placeholder.board description": "ボードの詳しい説明(任意)",
798
+ "placeholder.board name": "新しいボード",
799
+ "placeholder.search file": "ファイル名で検索",
800
+ "placeholder.search template": "テンプレートを検索",
801
+ "placeholder.user prompt": "図面についての補足説明を入力してください(任意)",
802
+ "text.appliance token needs security privilege": "アクセストークンを追加するには、ドメイン所有者であるか、セキュリティ照会権限が必要です。",
803
+ "text.board-template hint": "このボードを新しいボードの出発点として使えるよう、テンプレートとして保管します。",
804
+ "text.create board": "新規ボード作成",
805
+ "text.drop or click to upload": "図面をドラッグ&ドロップまたはクリック",
806
+ "text.duplicate": "複製",
807
+ "text.duplicate hint": "このボードを別のドメインまたはグループにコピーします。同じドメイン内では新しい名前を付けてください。",
808
+ "text.edit group": "編集",
809
+ "text.headless-link hint": "アプリケーションの枠なしで、このボードだけを全画面で開きます。ウォールディスプレイやキオスク用です。",
810
+ "text.import success": "ボードを作成しました",
811
+ "text.link copied": "リンクをコピーしました",
812
+ "text.modeller toolbar contextual": "選択したものに合うツールだけを表示します。上段には元に戻す、やり直し、フィット、プレビュー、パネルのみ残ります。",
813
+ "text.modeller toolbar docked": "同じ選択ツールをキャンバス上部中央に固定し、図形やハンドルを隠しません。",
814
+ "text.modeller toolbar fixed": "すべてのツールを上部の1行に常に表示します。",
815
+ "text.no existing files": "図面/画像ファイルがありません。「新しい図面から」タブを使用してください。",
816
+ "text.no templates": "テンプレートがありません。",
817
+ "text.perspective notice": "Perspective図面はfloor plan上の位置推定が難しいです — 位置精度が低い場合があるため、確認のうえ調整してください。",
818
+ "text.play-group membership applies at once": "プレイグループをタップすると、このボードがすぐに追加または削除されます。",
819
+ "text.plays in": "プレイグループ",
820
+ "text.save before release": "先に変更内容を保存してください",
821
+ "text.saving": "保存中...",
822
+ "text.updated by": "修正",
823
+ "text.uploading": "アップロード中...",
824
+ "title.create board": "新規ボード作成"
753
825
  }