@things-factory/setting-ui 10.1.27 → 10.1.29

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.
@@ -13,6 +13,10 @@ export declare class SettingList extends SettingList_base {
13
13
  private dataGrist;
14
14
  render(): import("lit-html").TemplateResult<1>;
15
15
  get context(): {
16
+ search: {
17
+ handler: (search: string) => void;
18
+ value: any;
19
+ };
16
20
  title: string;
17
21
  help: string;
18
22
  actions: {
@@ -7,7 +7,7 @@ import { getEditor, getRenderer } from '@operato/data-grist';
7
7
  import { i18next, localize } from '@operato/i18n';
8
8
  import { PageView, store } from '@operato/shell';
9
9
  import { client, gqlContext } from '@operato/graphql';
10
- import { CommonButtonStyles, CommonHeaderStyles, CommonGristStyles, ScrollbarStyles } from '@operato/styles';
10
+ import { CommonButtonStyles, CommonHeaderStyles, CommonGristStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles';
11
11
  import { OxPrompt } from '@operato/popup/ox-prompt.js';
12
12
  import { isMobileDevice } from '@operato/utils';
13
13
  import gql from 'graphql-tag';
@@ -20,21 +20,12 @@ let SettingList = class SettingList extends localize(i18next)(PageView) {
20
20
  this.refreshHandlers = [];
21
21
  }
22
22
  static { this.styles = [
23
+ /* 목록 화면이므로 작업면 골격을 쓴다 (ADR-0060 decision 8): 본문이 남은 자리를 채우고 스스로 구른다. */
24
+ WorkSurfacePageStyles,
23
25
  CommonGristStyles,
24
26
  ScrollbarStyles,
25
27
  CommonHeaderStyles,
26
28
  css `
27
- :host {
28
- display: flex;
29
- flex-direction: column;
30
- overflow: hidden;
31
- }
32
-
33
- ox-grist {
34
- overflow-y: auto;
35
- flex: 1;
36
- }
37
-
38
29
  ox-filters-form {
39
30
  flex: 1;
40
31
  }
@@ -42,10 +33,16 @@ let SettingList = class SettingList extends localize(i18next)(PageView) {
42
33
  ]; }
43
34
  render() {
44
35
  return html `
45
- <ox-grist .mode=${this.mode} auto-fetch .config=${this.config} .fetchHandler=${this.fetchHandler.bind(this)}>
36
+ <ox-grist
37
+ class="page-fill"
38
+ .mode=${this.mode}
39
+ auto-fetch
40
+ .config=${this.config}
41
+ .fetchHandler=${this.fetchHandler.bind(this)}
42
+ >
46
43
  <div slot="headroom" class="header">
47
44
  <div class="filters">
48
- <ox-filters-form></ox-filters-form>
45
+ <ox-filters-form without-search></ox-filters-form>
49
46
  </div>
50
47
  </div>
51
48
  </ox-grist>
@@ -53,6 +50,17 @@ let SettingList = class SettingList extends localize(i18next)(PageView) {
53
50
  }
54
51
  get context() {
55
52
  return {
53
+ /*
54
+ * Full text search sits in the title bar, the way these applications carry it
55
+ * (ADR-0060 decision 9; user instruction 2026-09-18 - framework screens included).
56
+ * It searches the columns that declare a search filter.
57
+ */
58
+ search: {
59
+ handler: (search) => {
60
+ this.dataGrist.searchText = search;
61
+ },
62
+ value: this.dataGrist?.searchText || ''
63
+ },
56
64
  title: i18next.t('title.setting'),
57
65
  help: 'setting/settings',
58
66
  actions: [
@@ -1 +1 @@
1
- {"version":3,"file":"setting-list.js","sourceRoot":"","sources":["../../client/pages/setting-list.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-grist/ox-grist.js'\nimport '@operato/data-grist/ox-filters-form.js'\nimport '@operato/data-grist/ox-sorters-control.js'\nimport '@operato/data-grist/ox-record-creator.js'\n\nimport { getEditor, getRenderer } from '@operato/data-grist'\nimport { i18next, localize } from '@operato/i18n'\nimport { PageView, store } from '@operato/shell'\nimport { client, gqlContext } from '@operato/graphql'\nimport { CommonButtonStyles, CommonHeaderStyles, CommonGristStyles, ScrollbarStyles } from '@operato/styles'\nimport { OxPrompt } from '@operato/popup/ox-prompt.js'\nimport { isMobileDevice } from '@operato/utils'\n\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\n@customElement('setting-list')\nexport class SettingList extends localize(i18next)(PageView) {\n static styles = [\n CommonGristStyles,\n ScrollbarStyles,\n CommonHeaderStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n ox-grist {\n overflow-y: auto;\n flex: 1;\n }\n\n ox-filters-form {\n flex: 1;\n }\n `\n ]\n\n @state() private config: any\n @state() private data: any\n @state() private mode: string = isMobileDevice() ? 'LIST' : 'GRID'\n @state() private refreshHandlers: any[] = []\n\n @query('ox-grist') private dataGrist: any\n\n render() {\n return html`\n <ox-grist .mode=${this.mode} auto-fetch .config=${this.config} .fetchHandler=${this.fetchHandler.bind(this)}>\n <div slot=\"headroom\" class=\"header\">\n <div class=\"filters\">\n <ox-filters-form></ox-filters-form>\n </div>\n </div>\n </ox-grist>\n `\n }\n\n get context() {\n return {\n title: i18next.t('title.setting'),\n help: 'setting/settings',\n actions: [\n {\n title: i18next.t('button.save'),\n action: this._saveSettings.bind(this),\n ...CommonButtonStyles.save\n },\n {\n title: i18next.t('button.delete'),\n action: this._deleteSettings.bind(this),\n ...CommonButtonStyles.delete\n }\n ],\n exportable: {\n name: i18next.t('title.setting'),\n data: this._exportableData.bind(this)\n },\n importable: {\n handler: () => {}\n }\n }\n }\n\n pageUpdated(changes, lifecycle) {\n if (this.active) {\n this.dataGrist.fetch()\n\n this.config = {\n list: {\n fields: ['name', 'description', 'value']\n },\n rows: { selectable: { multiple: true } },\n columns: [\n { type: 'gutter', gutterName: 'dirty' },\n { type: 'gutter', gutterName: 'sequence' },\n { type: 'gutter', gutterName: 'row-selector', multiple: true },\n {\n type: 'string',\n name: 'name',\n header: i18next.t('field.name'),\n record: { editable: true, align: 'left' },\n sortable: true,\n filter: 'search',\n width: 235\n },\n {\n type: 'string',\n name: 'description',\n header: i18next.t('field.description'),\n record: { editable: true, align: 'left' },\n sortable: true,\n filter: 'search',\n width: 275\n },\n {\n type: 'code',\n name: 'category',\n header: i18next.t('field.category'),\n record: { editable: true, codeName: 'SETTING_CATEGORIES' },\n sortable: true,\n filter: 'search',\n width: 100\n },\n {\n type: 'string',\n name: 'value',\n header: i18next.t('field.value'),\n record: {\n editor: function (value, column, record, rowIndex, field) {\n return getEditor(record.category)(value, column, record, rowIndex, field)\n },\n renderer: function (value, column, record, rowIndex, field) {\n return getRenderer(record.category)(value, column, record, rowIndex, field)\n },\n editable: true\n },\n sortable: true,\n width: 180\n },\n {\n type: 'object',\n name: 'updater',\n header: i18next.t('field.updater'),\n record: { editable: false, align: 'left' },\n sortable: true,\n width: 90\n },\n {\n type: 'datetime',\n name: 'updatedAt',\n header: i18next.t('field.updated_at'),\n record: { editable: false, align: 'left' },\n sortable: true,\n width: 180\n }\n ]\n }\n }\n }\n\n async fetchHandler({ filters, page, limit, sorters = [] }) {\n const pagination = { page, limit }\n const sortings = sorters\n\n const response = await client.query({\n query: gql`\n query settings($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {\n settings(filters: $filters, pagination: $pagination, sortings: $sortings) {\n items {\n id\n name\n description\n category\n value\n updatedAt\n updater {\n id\n name\n description\n }\n }\n total\n }\n }\n `,\n variables: { filters, pagination, sortings },\n context: gqlContext()\n })\n\n return {\n total: response.data.settings.total || 0,\n records: response.data.settings.items || []\n }\n }\n\n async _saveSettings() {\n let patches = this.dataGrist.dirtyRecords\n\n if (!patches?.length) {\n return this.showToast(i18next.t('text.nothing_changed'))\n }\n\n patches = patches.map(setting => {\n let patchField: any = setting.id ? { id: setting.id } : {}\n const dirtyFields = setting.__dirtyfields__\n for (let key in dirtyFields) {\n patchField[key] = dirtyFields[key].after\n }\n patchField.cuFlag = setting.__dirty__\n\n return patchField\n })\n\n let checkValidation = true\n patches.forEach(patch => {\n if (patch.cuFlag === '+' && (!patch.name || !patch.category)) return (checkValidation = false)\n })\n\n if (!checkValidation) return this.showToast(i18next.t('error.value is empty', { value: 'name or category' }))\n\n const response = await client.mutate({\n mutation: gql`\n mutation updateMultipleSetting($patches: [SettingPatch!]!) {\n updateMultipleSetting(patches: $patches) {\n name\n }\n }\n `,\n variables: { patches },\n context: gqlContext()\n })\n\n if (!response.errors) {\n this.showToast(i18next.t('text.data_updated_successfully'))\n this.dataGrist.fetch()\n this.applyRefreshHandlers()\n }\n }\n\n async _deleteSettings() {\n if (!this.dataGrist.selected?.length) {\n return this.showToast(i18next.t('text.there_is_nothing_to_delete'))\n }\n\n const names = this.dataGrist.selected.map(record => record.name)\n\n if (\n await OxPrompt.open({\n type: 'warning',\n title: i18next.t('button.delete'),\n text: i18next.t('text.are_you_sure'),\n confirmButton: { text: i18next.t('button.delete') },\n cancelButton: { text: i18next.t('button.cancel') }\n })\n ) {\n const response = await client.mutate({\n mutation: gql`\n mutation deleteSettings($names: [String!]!) {\n deleteSettings(names: $names)\n }\n `,\n variables: { names },\n context: gqlContext()\n })\n\n if (!response.errors) {\n await OxPrompt.open({\n type: 'success',\n title: i18next.t('text.completed'),\n text: i18next.t('text.data_deleted_successfully'),\n confirmButton: { text: i18next.t('button.confirm') }\n })\n\n this.dataGrist.fetch()\n this.applyRefreshHandlers()\n }\n }\n }\n\n applyRefreshHandlers() {\n this.refreshHandlers.forEach(refreshHandler => refreshHandler())\n }\n\n _exportableData() {\n return this.dataGrist.exportRecords()\n }\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.refreshHandlers = __state__.setting?.refreshHandlers || []\n\n }\n\n showToast(message) {\n document.dispatchEvent(new CustomEvent('notify', { detail: { message, option: { timer: 1000 } } }))\n }\n}\n"]}
1
+ {"version":3,"file":"setting-list.js","sourceRoot":"","sources":["../../client/pages/setting-list.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-grist/ox-grist.js'\nimport '@operato/data-grist/ox-filters-form.js'\nimport '@operato/data-grist/ox-sorters-control.js'\nimport '@operato/data-grist/ox-record-creator.js'\n\nimport { getEditor, getRenderer } from '@operato/data-grist'\nimport { i18next, localize } from '@operato/i18n'\nimport { PageView, store } from '@operato/shell'\nimport { client, gqlContext } from '@operato/graphql'\nimport {\n CommonButtonStyles,\n CommonHeaderStyles,\n CommonGristStyles,\n ScrollbarStyles,\n WorkSurfacePageStyles\n} from '@operato/styles'\nimport { OxPrompt } from '@operato/popup/ox-prompt.js'\nimport { isMobileDevice } from '@operato/utils'\n\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\n@customElement('setting-list')\nexport class SettingList extends localize(i18next)(PageView) {\n static styles = [\n /* 목록 화면이므로 작업면 골격을 쓴다 (ADR-0060 decision 8): 본문이 남은 자리를 채우고 스스로 구른다. */\n WorkSurfacePageStyles,\n CommonGristStyles,\n ScrollbarStyles,\n CommonHeaderStyles,\n css`\n ox-filters-form {\n flex: 1;\n }\n `\n ]\n\n @state() private config: any\n @state() private data: any\n @state() private mode: string = isMobileDevice() ? 'LIST' : 'GRID'\n @state() private refreshHandlers: any[] = []\n\n @query('ox-grist') private dataGrist: any\n\n render() {\n return html`\n <ox-grist\n class=\"page-fill\"\n .mode=${this.mode}\n auto-fetch\n .config=${this.config}\n .fetchHandler=${this.fetchHandler.bind(this)}\n >\n <div slot=\"headroom\" class=\"header\">\n <div class=\"filters\">\n <ox-filters-form without-search></ox-filters-form>\n </div>\n </div>\n </ox-grist>\n `\n }\n\n get context() {\n return {\n /*\n * Full text search sits in the title bar, the way these applications carry it\n * (ADR-0060 decision 9; user instruction 2026-09-18 - framework screens included).\n * It searches the columns that declare a search filter.\n */\n search: {\n handler: (search: string) => {\n this.dataGrist.searchText = search\n },\n value: this.dataGrist?.searchText || ''\n },\n title: i18next.t('title.setting'),\n help: 'setting/settings',\n actions: [\n {\n title: i18next.t('button.save'),\n action: this._saveSettings.bind(this),\n ...CommonButtonStyles.save\n },\n {\n title: i18next.t('button.delete'),\n action: this._deleteSettings.bind(this),\n ...CommonButtonStyles.delete\n }\n ],\n exportable: {\n name: i18next.t('title.setting'),\n data: this._exportableData.bind(this)\n },\n importable: {\n handler: () => {}\n }\n }\n }\n\n pageUpdated(changes, lifecycle) {\n if (this.active) {\n this.dataGrist.fetch()\n\n this.config = {\n list: {\n fields: ['name', 'description', 'value']\n },\n rows: { selectable: { multiple: true } },\n columns: [\n { type: 'gutter', gutterName: 'dirty' },\n { type: 'gutter', gutterName: 'sequence' },\n { type: 'gutter', gutterName: 'row-selector', multiple: true },\n {\n type: 'string',\n name: 'name',\n header: i18next.t('field.name'),\n record: { editable: true, align: 'left' },\n sortable: true,\n filter: 'search',\n width: 235\n },\n {\n type: 'string',\n name: 'description',\n header: i18next.t('field.description'),\n record: { editable: true, align: 'left' },\n sortable: true,\n filter: 'search',\n width: 275\n },\n {\n type: 'code',\n name: 'category',\n header: i18next.t('field.category'),\n record: { editable: true, codeName: 'SETTING_CATEGORIES' },\n sortable: true,\n filter: 'search',\n width: 100\n },\n {\n type: 'string',\n name: 'value',\n header: i18next.t('field.value'),\n record: {\n editor: function (value, column, record, rowIndex, field) {\n return getEditor(record.category)(value, column, record, rowIndex, field)\n },\n renderer: function (value, column, record, rowIndex, field) {\n return getRenderer(record.category)(value, column, record, rowIndex, field)\n },\n editable: true\n },\n sortable: true,\n width: 180\n },\n {\n type: 'object',\n name: 'updater',\n header: i18next.t('field.updater'),\n record: { editable: false, align: 'left' },\n sortable: true,\n width: 90\n },\n {\n type: 'datetime',\n name: 'updatedAt',\n header: i18next.t('field.updated_at'),\n record: { editable: false, align: 'left' },\n sortable: true,\n width: 180\n }\n ]\n }\n }\n }\n\n async fetchHandler({ filters, page, limit, sorters = [] }) {\n const pagination = { page, limit }\n const sortings = sorters\n\n const response = await client.query({\n query: gql`\n query settings($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {\n settings(filters: $filters, pagination: $pagination, sortings: $sortings) {\n items {\n id\n name\n description\n category\n value\n updatedAt\n updater {\n id\n name\n description\n }\n }\n total\n }\n }\n `,\n variables: { filters, pagination, sortings },\n context: gqlContext()\n })\n\n return {\n total: response.data.settings.total || 0,\n records: response.data.settings.items || []\n }\n }\n\n async _saveSettings() {\n let patches = this.dataGrist.dirtyRecords\n\n if (!patches?.length) {\n return this.showToast(i18next.t('text.nothing_changed'))\n }\n\n patches = patches.map(setting => {\n let patchField: any = setting.id ? { id: setting.id } : {}\n const dirtyFields = setting.__dirtyfields__\n for (let key in dirtyFields) {\n patchField[key] = dirtyFields[key].after\n }\n patchField.cuFlag = setting.__dirty__\n\n return patchField\n })\n\n let checkValidation = true\n patches.forEach(patch => {\n if (patch.cuFlag === '+' && (!patch.name || !patch.category)) return (checkValidation = false)\n })\n\n if (!checkValidation) return this.showToast(i18next.t('error.value is empty', { value: 'name or category' }))\n\n const response = await client.mutate({\n mutation: gql`\n mutation updateMultipleSetting($patches: [SettingPatch!]!) {\n updateMultipleSetting(patches: $patches) {\n name\n }\n }\n `,\n variables: { patches },\n context: gqlContext()\n })\n\n if (!response.errors) {\n this.showToast(i18next.t('text.data_updated_successfully'))\n this.dataGrist.fetch()\n this.applyRefreshHandlers()\n }\n }\n\n async _deleteSettings() {\n if (!this.dataGrist.selected?.length) {\n return this.showToast(i18next.t('text.there_is_nothing_to_delete'))\n }\n\n const names = this.dataGrist.selected.map(record => record.name)\n\n if (\n await OxPrompt.open({\n type: 'warning',\n title: i18next.t('button.delete'),\n text: i18next.t('text.are_you_sure'),\n confirmButton: { text: i18next.t('button.delete') },\n cancelButton: { text: i18next.t('button.cancel') }\n })\n ) {\n const response = await client.mutate({\n mutation: gql`\n mutation deleteSettings($names: [String!]!) {\n deleteSettings(names: $names)\n }\n `,\n variables: { names },\n context: gqlContext()\n })\n\n if (!response.errors) {\n await OxPrompt.open({\n type: 'success',\n title: i18next.t('text.completed'),\n text: i18next.t('text.data_deleted_successfully'),\n confirmButton: { text: i18next.t('button.confirm') }\n })\n\n this.dataGrist.fetch()\n this.applyRefreshHandlers()\n }\n }\n }\n\n applyRefreshHandlers() {\n this.refreshHandlers.forEach(refreshHandler => refreshHandler())\n }\n\n _exportableData() {\n return this.dataGrist.exportRecords()\n }\n\n private _unsubscribe?: () => void\n\n connectedCallback() {\n super.connectedCallback()\n\n this._applyState()\n\n this._unsubscribe = store.subscribe(() => this._applyState())\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n\n this._unsubscribe?.()\n }\n\n private _applyState() {\n const __state__ = store.getState() as any\n this.refreshHandlers = __state__.setting?.refreshHandlers || []\n }\n\n showToast(message) {\n document.dispatchEvent(new CustomEvent('notify', { detail: { message, option: { timer: 1000 } } }))\n }\n}\n"]}
@@ -9,6 +9,7 @@ export declare class SettingPage extends SettingPage_base {
9
9
  disconnectedCallback(): void;
10
10
  private _applyState;
11
11
  get context(): {
12
+ frame: string;
12
13
  title: string;
13
14
  };
14
15
  }
@@ -3,33 +3,40 @@ import { html, css } from 'lit';
3
3
  import { customElement, state } from 'lit/decorators.js';
4
4
  import { store, PageView } from '@operato/shell';
5
5
  import { i18next, localize } from '@operato/i18n';
6
+ import { DocumentPageStyles } from '@operato/styles';
6
7
  let SettingPage = class SettingPage extends localize(i18next)(PageView) {
7
8
  constructor() {
8
9
  super(...arguments);
9
10
  this._settings = [];
10
11
  }
11
12
  static { this.styles = [
13
+ DocumentPageStyles,
12
14
  css `
15
+ /*
16
+ * Settings are read and edited, so this is a document (ADR-0060 decision 8): one column, a
17
+ * readable width, and the spacing between cards decided by the frame.
18
+ *
19
+ * The card's own outer margin goes to zero so that spacing is decided in one place. With both
20
+ * alive, every screen that holds cards comes out with a different gap.
21
+ */
13
22
  :host {
14
- overflow-y: auto;
15
- background-color: var(--md-sys-color-background);
16
- }
17
- div {
18
- margin: var(--setting-icon-margin);
19
- height: var(--setting-icon-height);
20
- background: url(/assets/images/icon-setting.png) center top no-repeat;
21
- background-size: contain;
23
+ --setting-let-margin: 0;
22
24
  }
25
+
26
+ /*
27
+ * The 170px settings picture at the head is gone. The title bar already carries the screen
28
+ * name, so the picture repeated it and pushed one setting card off the first screen.
29
+ *
30
+ * Its rule matched every div on the page, so a second div anywhere here became a 170px
31
+ * picture too.
32
+ */
23
33
  `
24
34
  ]; }
25
35
  render() {
26
36
  var _sortedSettings = this._settings.sort((a, b) => {
27
37
  return a.seq - b.seq;
28
38
  });
29
- return html `
30
- <div class="page-icon"></div>
31
- ${_sortedSettings.map(setting => html ` ${setting.template} `)}
32
- `;
39
+ return html ` <div class="page">${_sortedSettings.map(setting => html ` ${setting.template} `)}</div> `;
33
40
  }
34
41
  connectedCallback() {
35
42
  super.connectedCallback();
@@ -46,6 +53,11 @@ let SettingPage = class SettingPage extends localize(i18next)(PageView) {
46
53
  }
47
54
  get context() {
48
55
  return {
56
+ /*
57
+ * 이 화면이 어떤 틀인가 — 동작 줄이 이것을 읽고 자기 오른쪽 끝을 내용에 맞춘다
58
+ * (ADR-0060 결정 9 보탬). 안 적으면 창 폭이고, 그것은 작업면의 모양이다.
59
+ */
60
+ frame: 'document',
49
61
  title: i18next.t('title.setting')
50
62
  };
51
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"setting.js","sourceRoot":"","sources":["../../client/pages/setting.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAC/B,OAAO,EAAE,aAAa,EAAmB,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAG1C,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,QAAQ,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC;IAArD;;QAgBY,cAAS,GAAU,EAAE,CAAA;IAgDxC,CAAC;aA/DQ,WAAM,GAAG;QACd,GAAG,CAAA;;;;;;;;;;;KAWF;KACF,AAbY,CAaZ;IAID,MAAM;QACJ,IAAI,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACjD,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAA;QACtB,CAAC,CAAC,CAAA;QAEF,OAAO,IAAI,CAAA;;QAEP,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAA,IAAI,OAAO,CAAC,QAAQ,GAAG,CAAC;KAC9D,CAAA;IACH,CAAC;IAKD,iBAAiB;QAEf,KAAK,CAAC,iBAAiB,EAAE,CAAA;QAEzB,IAAI,CAAC,WAAW,EAAE,CAAA;QAElB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;IAE/D,CAAC;IAGD,oBAAoB;QAElB,KAAK,CAAC,oBAAoB,EAAE,CAAA;QAE5B,IAAI,CAAC,YAAY,EAAE,EAAE,CAAA;IAEvB,CAAC;IAGO,WAAW;QAEjB,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,EAAS,CAAA;QAC7C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAA;IAEzC,CAAC;IAED,IAAI,OAAO;QACT,OAAO;YACL,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;SAClC,CAAA;IACH,CAAC;;AA/CgB;IAAhB,KAAK,EAAE;;8CAA8B;AAhB3B,WAAW;IADvB,aAAa,CAAC,cAAc,CAAC;GACjB,WAAW,CAgEvB","sourcesContent":["import { html, css } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { store, PageView } from '@operato/shell'\nimport { i18next, localize } from '@operato/i18n'\n\n@customElement('setting-page')\nexport class SettingPage extends localize(i18next)(PageView) {\n static styles = [\n css`\n :host {\n overflow-y: auto;\n background-color: var(--md-sys-color-background);\n }\n div {\n margin: var(--setting-icon-margin);\n height: var(--setting-icon-height);\n background: url(/assets/images/icon-setting.png) center top no-repeat;\n background-size: contain;\n }\n `\n ]\n\n @state() private _settings: any[] = []\n\n render() {\n var _sortedSettings = this._settings.sort((a, b) => {\n return a.seq - b.seq\n })\n\n return html`\n <div class=\"page-icon\"></div>\n ${_sortedSettings.map(setting => html` ${setting.template} `)}\n `\n }\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._settings = __state__.setting.settings\n\n }\n\n get context() {\n return {\n title: i18next.t('title.setting')\n }\n }\n}\n"]}
1
+ {"version":3,"file":"setting.js","sourceRoot":"","sources":["../../client/pages/setting.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAC/B,OAAO,EAAE,aAAa,EAAmB,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAG7C,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,QAAQ,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC;IAArD;;QAyBY,cAAS,GAAU,EAAE,CAAA;IAyCxC,CAAC;aAjEQ,WAAM,GAAG;QACd,kBAAkB;QAClB,GAAG,CAAA;;;;;;;;;;;;;;;;;;;KAmBF;KACF,AAtBY,CAsBZ;IAID,MAAM;QACJ,IAAI,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACjD,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAA;QACtB,CAAC,CAAC,CAAA;QAEF,OAAO,IAAI,CAAA,sBAAsB,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAA,IAAI,OAAO,CAAC,QAAQ,GAAG,CAAC,SAAS,CAAA;IACvG,CAAC;IAID,iBAAiB;QACf,KAAK,CAAC,iBAAiB,EAAE,CAAA;QAEzB,IAAI,CAAC,WAAW,EAAE,CAAA;QAElB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;IAC/D,CAAC;IAED,oBAAoB;QAClB,KAAK,CAAC,oBAAoB,EAAE,CAAA;QAE5B,IAAI,CAAC,YAAY,EAAE,EAAE,CAAA;IACvB,CAAC;IAEO,WAAW;QACjB,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,EAAS,CAAA;QACzC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAA;IAC7C,CAAC;IAED,IAAI,OAAO;QACT,OAAO;YACC;;;SAGH;YACH,KAAK,EAAE,UAAU;YACvB,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;SAC5B,CAAA;IACH,CAAC;;AAxCgB;IAAhB,KAAK,EAAE;;8CAA8B;AAzB3B,WAAW;IADvB,aAAa,CAAC,cAAc,CAAC;GACjB,WAAW,CAkEvB","sourcesContent":["import { html, css } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { store, PageView } from '@operato/shell'\nimport { i18next, localize } from '@operato/i18n'\nimport { DocumentPageStyles } from '@operato/styles'\n\n@customElement('setting-page')\nexport class SettingPage extends localize(i18next)(PageView) {\n static styles = [\n DocumentPageStyles,\n css`\n /*\n * Settings are read and edited, so this is a document (ADR-0060 decision 8): one column, a\n * readable width, and the spacing between cards decided by the frame.\n *\n * The card's own outer margin goes to zero so that spacing is decided in one place. With both\n * alive, every screen that holds cards comes out with a different gap.\n */\n :host {\n --setting-let-margin: 0;\n }\n\n /*\n * The 170px settings picture at the head is gone. The title bar already carries the screen\n * name, so the picture repeated it and pushed one setting card off the first screen.\n *\n * Its rule matched every div on the page, so a second div anywhere here became a 170px\n * picture too.\n */\n `\n ]\n\n @state() private _settings: any[] = []\n\n render() {\n var _sortedSettings = this._settings.sort((a, b) => {\n return a.seq - b.seq\n })\n\n return html` <div class=\"page\">${_sortedSettings.map(setting => html` ${setting.template} `)}</div> `\n }\n\n private _unsubscribe?: () => void\n\n connectedCallback() {\n super.connectedCallback()\n\n this._applyState()\n\n this._unsubscribe = store.subscribe(() => this._applyState())\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n\n this._unsubscribe?.()\n }\n\n private _applyState() {\n const __state__ = store.getState() as any\n this._settings = __state__.setting.settings\n }\n\n get context() {\n return {\n /*\n * 이 화면이 어떤 틀인가 — 동작 줄이 이것을 읽고 자기 오른쪽 끝을 내용에 맞춘다\n * (ADR-0060 결정 9 보탬). 안 적으면 창 폭이고, 그것은 작업면의 모양이다.\n */\n frame: 'document',\ntitle: i18next.t('title.setting')\n }\n }\n}\n"]}