@things-factory/kpi 10.1.25 → 10.1.27

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.
@@ -1,5 +1,4 @@
1
1
  import '@operato/data-tree'
2
- import '@operato/context/ox-context-page-toolbar.js'
3
2
  import './kpi-view'
4
3
 
5
4
  import gql from 'graphql-tag'
@@ -138,14 +137,12 @@ export class KpiTreePage extends localize(i18next)(ScopedElementsMixin(PageView)
138
137
  data: this.exportHandler.bind(this)
139
138
  },
140
139
  importable: { handler: this.importHandler.bind(this)
141
- },
142
- toolbar: false
140
+ }
143
141
  }
144
142
  }
145
143
 
146
144
  render() { return html`
147
145
  <div class="header">
148
- <ox-context-page-toolbar class="actions" .context=${this.context}></ox-context-page-toolbar>
149
146
  </div>
150
147
 
151
148
  <content>
@@ -1,5 +1,4 @@
1
1
  import '@operato/data-tree';
2
- import '@operato/context/ox-context-page-toolbar.js';
3
2
  import './kpi-view';
4
3
  import { PropertyValues } from 'lit';
5
4
  import { PageView } from '@operato/shell';
@@ -35,7 +34,6 @@ export declare class KpiTreePage extends KpiTreePage_base {
35
34
  importable: {
36
35
  handler: (records: any[]) => Promise<void>;
37
36
  };
38
- toolbar: boolean;
39
37
  };
40
38
  render(): import("lit-html").TemplateResult<1>;
41
39
  updated(changes: PropertyValues<this>): void;
@@ -1,6 +1,5 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
2
  import '@operato/data-tree';
3
- import '@operato/context/ox-context-page-toolbar.js';
4
3
  import './kpi-view';
5
4
  import gql from 'graphql-tag';
6
5
  import { css, html } from 'lit';
@@ -132,14 +131,12 @@ let KpiTreePage = class KpiTreePage extends localize(i18next)(ScopedElementsMixi
132
131
  data: this.exportHandler.bind(this)
133
132
  },
134
133
  importable: { handler: this.importHandler.bind(this)
135
- },
136
- toolbar: false
134
+ }
137
135
  };
138
136
  }
139
137
  render() {
140
138
  return html `
141
139
  <div class="header">
142
- <ox-context-page-toolbar class="actions" .context=${this.context}></ox-context-page-toolbar>
143
140
  </div>
144
141
 
145
142
  <content>
@@ -1 +1 @@
1
- {"version":3,"file":"kpi-tree-page.js","sourceRoot":"","sources":["../../../client/pages/kpi/kpi-tree-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-tree'\nimport '@operato/context/ox-context-page-toolbar.js'\nimport './kpi-view'\n\nimport gql from 'graphql-tag'\nimport { css, html, PropertyValues } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { CommonHeaderStyles, ScrollbarStyles } from '@operato/styles'\nimport { CustomAlert, PageView } from '@operato/shell'\n\nimport { KpiImporter } from './kpi-importer'\nimport { KpiView } from './kpi-view'\n\nconst SubKpiFragment = gql`\n fragment SubKpiFragment on Kpi { id\n name\n description\n active\n formula\n periodType\n scoreFormula\n grades\n vizType\n vizMeta\n weight\n schedule\n scheduleId\n timezone\n version\n isLeaf\n parent { id\n name\n }\n updater { id\n name\n }\n updatedAt\n creator { id\n name\n }\n createdAt\n }\n`\n\n@customElement('kpi-tree-page')\nexport class KpiTreePage extends localize(i18next)(ScopedElementsMixin(PageView)) { static styles = [\n CommonHeaderStyles,\n ScrollbarStyles,\n css`\n :host { display: flex;\n flex-direction: column;\n width: 100%;\n overflow: auto;\n }\n\n content { flex: 1;\n display: flex;\n flex-direction: row;\n }\n\n div[editor] { width: 400px;\n display: flex;\n flex-direction: column;\n border-left: 1px solid var(--md-sys-color-outline-variant);\n }\n\n ox-tree-horizontal { flex: 1;\n overflow: auto;\n }\n\n kpi-view { flex: 1;\n padding: var(--spacing-medium);\n background-color: var(--md-sys-color-surface-variant);\n overflow: auto;\n }\n\n .footer { display: flex;\n gap: var(--spacing-small);\n padding: var(--spacing-medium);\n border-top: 1px solid var(--md-sys-color-outline-variant);\n background-color: var(--md-sys-color-surface);\n }\n\n .footer button { display: flex;\n align-items: center;\n gap: var(--spacing-small);\n padding: var(--spacing-small) var(--spacing-medium);\n border: 1px solid var(--md-sys-color-outline);\n border-radius: var(--md-sys-shape-corner-small);\n background-color: var(--md-sys-color-surface);\n color: var(--md-sys-color-on-surface);\n cursor: pointer;\n }\n\n .footer button:hover { background-color: var(--md-sys-color-secondary-container);\n }\n\n .footer button[disabled] { color: var(--md-sys-color-surface-dim);\n background-color: transparent;\n cursor: not-allowed;\n }\n\n .footer button[done] { background-color: var(--md-sys-color-primary);\n color: var(--md-sys-color-on-primary);\n }\n\n .footer div[filler] { flex: 1;\n }\n `\n ]\n\n static get scopedElements() { return { 'kpi-importer': KpiImporter\n }\n }\n\n @state() root?: any\n @state() selected?: any\n @state() kpi?: any\n @state() modified: boolean = false\n @state() appendable: boolean = false\n\n @query('kpi-view') kpiView!: KpiView\n\n get context() { return { title: i18next.t('title.kpi tree'),\n help: 'kpi/kpi',\n actions: [\n { icon: 'delete',\n title: i18next.t('button.delete'),\n action: this.delete.bind(this),\n emphasis: { danger: true\n }\n }\n ].filter(Boolean),\n exportable: { name: i18next.t('title.kpi tree'),\n data: this.exportHandler.bind(this)\n },\n importable: { handler: this.importHandler.bind(this)\n },\n toolbar: false\n }\n }\n\n render() { return html`\n <div class=\"header\">\n <ox-context-page-toolbar class=\"actions\" .context=${this.context}></ox-context-page-toolbar>\n </div>\n\n <content>\n <ox-tree-horizontal\n .data=${this.root}\n .selected=${this.selected}\n @select=${this.onSelect.bind(this)}\n id-property=\"name\"\n label-property=\"\"\n description-property=\"description\"\n ></ox-tree-horizontal>\n\n <div editor>\n <kpi-view\n .kpi=${this.kpi}\n @property-change=${(e: CustomEvent) => { const { name } = e.detail || {}\n this.modified = true\n this.appendable = name && name !== this.selected?.name\n }}\n ></kpi-view>\n <div class=\"footer\">\n <button @click=${this.reset.bind(this)}>\n <md-icon>restart_alt</md-icon>\n ${i18next.t('button.reset')}\n </button>\n <div filler></div>\n <button @click=${this.create.bind(this)} ?disabled=${!this.appendable}>\n <md-icon>add</md-icon>\n ${i18next.t('button.add')}\n </button>\n <button @click=${this.save.bind(this)} ?disabled=${!this.modified} done>\n <md-icon>save</md-icon>\n ${i18next.t('button.save')}\n </button>\n </div>\n </div>\n </content>\n `\n }\n\n updated(changes: PropertyValues<this>) { if (changes.has('selected')) { this.modified = false\n this.kpi = { ...this.selected }\n }\n }\n\n onSelect(e: CustomEvent) { this.selected = e.detail\n this.updateContext()\n }\n\n reset() { if (this.kpiView) { this.kpiView.kpi = {}\n }\n }\n\n async create() { const { id: parentId } = this.selected || {}\n const { name, description, formula, active, isLeaf, weight } = this.kpi || {}\n\n const kpi = { name,\n description,\n formula,\n active: active !== false,\n isLeaf: isLeaf !== false,\n weight: weight || 1\n } as any\n\n if (parentId) { kpi.parent = { id: parentId }\n }\n\n const response = await client.mutate({ mutation: gql`\n mutation ($kpi: NewKpi!) { createKpi(kpi: $kpi) { ...SubKpiFragment\n }\n }\n ${SubKpiFragment}\n `,\n variables: { kpi\n }\n })\n\n this.selected = response.data.createKpi\n this.updateContext()\n\n await this.fetch()\n }\n\n async save() { const { id, name, description, formula, active, isLeaf, weight } = this.kpi || {}\n\n if (!id) { await CustomAlert({ type: 'warning',\n title: i18next.t('message.kpi_not_selected'),\n text: i18next.t('message.select_kpi_first'),\n confirmButton: { text: i18next.t('button.confirm') }\n })\n return\n }\n\n const patch = { name,\n description,\n formula,\n active,\n isLeaf,\n weight\n } as any\n\n const response = await client.mutate({ mutation: gql`\n mutation ($id: String!, $patch: KpiPatch!) { updateKpi(id: $id, patch: $patch) { ...SubKpiFragment\n }\n }\n ${SubKpiFragment}\n `,\n variables: { id,\n patch\n }\n })\n\n this.selected = response.data.updateKpi\n this.fetch()\n }\n\n async delete() { if (!this.selected) { await CustomAlert({ type: 'warning',\n title: i18next.t('message.kpi_not_selected'),\n text: i18next.t('message.select_kpi_first'),\n confirmButton: { text: i18next.t('button.confirm') }\n })\n return\n }\n\n const children = this.selected?.children\n if (children && children.length > 0) { await CustomAlert({ type: 'warning',\n title: i18next.t('message.kpis_with_children_cannot_be_deleted'),\n text: i18next.t('message.kpi_having_children_cannot_be_deleted'),\n confirmButton: { text: i18next.t('button.confirm') }\n })\n return\n }\n\n if (confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }))) { const { id } = this.selected || {}\n\n await client.mutate({ mutation: gql`\n mutation ($ids: [String!]!) { deleteKpis(ids: $ids)\n }\n `,\n variables: { ids: [id]\n }\n })\n\n this.selected = {}\n this.updateContext()\n await this.fetch()\n }\n }\n\n async pageInitialized(lifecycle: any) { this.fetch()\n }\n\n async pageUpdated(changes: any, lifecycle: any) { if (this.active) { // do something here when this page just became as active\n }\n }\n\n async fetch() { const response = await client.query({ query: gql`\n query { kpiTree { ...SubKpiFragment\n children { ...SubKpiFragment\n children { ...SubKpiFragment\n children { ...SubKpiFragment\n children { ...SubKpiFragment\n children { ...SubKpiFragment\n children { ...SubKpiFragment\n children { ...SubKpiFragment\n }\n }\n }\n }\n }\n }\n }\n }\n }\n ${SubKpiFragment}\n `\n })\n\n const records = response.data.kpiTree || []\n /* 다중루트를 지원하기 위해서 this.root 에 모든 루트를 저장하라. */\n this.root = records\n }\n\n async exportHandler() { // Export functionality can be implemented here\n }\n\n async importHandler(records: any[]) { // Import functionality can be implemented here\n }\n}\n"]}
1
+ {"version":3,"file":"kpi-tree-page.js","sourceRoot":"","sources":["../../../client/pages/kpi/kpi-tree-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-tree'\nimport './kpi-view'\n\nimport gql from 'graphql-tag'\nimport { css, html, PropertyValues } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { CommonHeaderStyles, ScrollbarStyles } from '@operato/styles'\nimport { CustomAlert, PageView } from '@operato/shell'\n\nimport { KpiImporter } from './kpi-importer'\nimport { KpiView } from './kpi-view'\n\nconst SubKpiFragment = gql`\n fragment SubKpiFragment on Kpi { id\n name\n description\n active\n formula\n periodType\n scoreFormula\n grades\n vizType\n vizMeta\n weight\n schedule\n scheduleId\n timezone\n version\n isLeaf\n parent { id\n name\n }\n updater { id\n name\n }\n updatedAt\n creator { id\n name\n }\n createdAt\n }\n`\n\n@customElement('kpi-tree-page')\nexport class KpiTreePage extends localize(i18next)(ScopedElementsMixin(PageView)) { static styles = [\n CommonHeaderStyles,\n ScrollbarStyles,\n css`\n :host { display: flex;\n flex-direction: column;\n width: 100%;\n overflow: auto;\n }\n\n content { flex: 1;\n display: flex;\n flex-direction: row;\n }\n\n div[editor] { width: 400px;\n display: flex;\n flex-direction: column;\n border-left: 1px solid var(--md-sys-color-outline-variant);\n }\n\n ox-tree-horizontal { flex: 1;\n overflow: auto;\n }\n\n kpi-view { flex: 1;\n padding: var(--spacing-medium);\n background-color: var(--md-sys-color-surface-variant);\n overflow: auto;\n }\n\n .footer { display: flex;\n gap: var(--spacing-small);\n padding: var(--spacing-medium);\n border-top: 1px solid var(--md-sys-color-outline-variant);\n background-color: var(--md-sys-color-surface);\n }\n\n .footer button { display: flex;\n align-items: center;\n gap: var(--spacing-small);\n padding: var(--spacing-small) var(--spacing-medium);\n border: 1px solid var(--md-sys-color-outline);\n border-radius: var(--md-sys-shape-corner-small);\n background-color: var(--md-sys-color-surface);\n color: var(--md-sys-color-on-surface);\n cursor: pointer;\n }\n\n .footer button:hover { background-color: var(--md-sys-color-secondary-container);\n }\n\n .footer button[disabled] { color: var(--md-sys-color-surface-dim);\n background-color: transparent;\n cursor: not-allowed;\n }\n\n .footer button[done] { background-color: var(--md-sys-color-primary);\n color: var(--md-sys-color-on-primary);\n }\n\n .footer div[filler] { flex: 1;\n }\n `\n ]\n\n static get scopedElements() { return { 'kpi-importer': KpiImporter\n }\n }\n\n @state() root?: any\n @state() selected?: any\n @state() kpi?: any\n @state() modified: boolean = false\n @state() appendable: boolean = false\n\n @query('kpi-view') kpiView!: KpiView\n\n get context() { return { title: i18next.t('title.kpi tree'),\n help: 'kpi/kpi',\n actions: [\n { icon: 'delete',\n title: i18next.t('button.delete'),\n action: this.delete.bind(this),\n emphasis: { danger: true\n }\n }\n ].filter(Boolean),\n exportable: { name: i18next.t('title.kpi tree'),\n data: this.exportHandler.bind(this)\n },\n importable: { handler: this.importHandler.bind(this)\n }\n }\n }\n\n render() { return html`\n <div class=\"header\">\n </div>\n\n <content>\n <ox-tree-horizontal\n .data=${this.root}\n .selected=${this.selected}\n @select=${this.onSelect.bind(this)}\n id-property=\"name\"\n label-property=\"\"\n description-property=\"description\"\n ></ox-tree-horizontal>\n\n <div editor>\n <kpi-view\n .kpi=${this.kpi}\n @property-change=${(e: CustomEvent) => { const { name } = e.detail || {}\n this.modified = true\n this.appendable = name && name !== this.selected?.name\n }}\n ></kpi-view>\n <div class=\"footer\">\n <button @click=${this.reset.bind(this)}>\n <md-icon>restart_alt</md-icon>\n ${i18next.t('button.reset')}\n </button>\n <div filler></div>\n <button @click=${this.create.bind(this)} ?disabled=${!this.appendable}>\n <md-icon>add</md-icon>\n ${i18next.t('button.add')}\n </button>\n <button @click=${this.save.bind(this)} ?disabled=${!this.modified} done>\n <md-icon>save</md-icon>\n ${i18next.t('button.save')}\n </button>\n </div>\n </div>\n </content>\n `\n }\n\n updated(changes: PropertyValues<this>) { if (changes.has('selected')) { this.modified = false\n this.kpi = { ...this.selected }\n }\n }\n\n onSelect(e: CustomEvent) { this.selected = e.detail\n this.updateContext()\n }\n\n reset() { if (this.kpiView) { this.kpiView.kpi = {}\n }\n }\n\n async create() { const { id: parentId } = this.selected || {}\n const { name, description, formula, active, isLeaf, weight } = this.kpi || {}\n\n const kpi = { name,\n description,\n formula,\n active: active !== false,\n isLeaf: isLeaf !== false,\n weight: weight || 1\n } as any\n\n if (parentId) { kpi.parent = { id: parentId }\n }\n\n const response = await client.mutate({ mutation: gql`\n mutation ($kpi: NewKpi!) { createKpi(kpi: $kpi) { ...SubKpiFragment\n }\n }\n ${SubKpiFragment}\n `,\n variables: { kpi\n }\n })\n\n this.selected = response.data.createKpi\n this.updateContext()\n\n await this.fetch()\n }\n\n async save() { const { id, name, description, formula, active, isLeaf, weight } = this.kpi || {}\n\n if (!id) { await CustomAlert({ type: 'warning',\n title: i18next.t('message.kpi_not_selected'),\n text: i18next.t('message.select_kpi_first'),\n confirmButton: { text: i18next.t('button.confirm') }\n })\n return\n }\n\n const patch = { name,\n description,\n formula,\n active,\n isLeaf,\n weight\n } as any\n\n const response = await client.mutate({ mutation: gql`\n mutation ($id: String!, $patch: KpiPatch!) { updateKpi(id: $id, patch: $patch) { ...SubKpiFragment\n }\n }\n ${SubKpiFragment}\n `,\n variables: { id,\n patch\n }\n })\n\n this.selected = response.data.updateKpi\n this.fetch()\n }\n\n async delete() { if (!this.selected) { await CustomAlert({ type: 'warning',\n title: i18next.t('message.kpi_not_selected'),\n text: i18next.t('message.select_kpi_first'),\n confirmButton: { text: i18next.t('button.confirm') }\n })\n return\n }\n\n const children = this.selected?.children\n if (children && children.length > 0) { await CustomAlert({ type: 'warning',\n title: i18next.t('message.kpis_with_children_cannot_be_deleted'),\n text: i18next.t('message.kpi_having_children_cannot_be_deleted'),\n confirmButton: { text: i18next.t('button.confirm') }\n })\n return\n }\n\n if (confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }))) { const { id } = this.selected || {}\n\n await client.mutate({ mutation: gql`\n mutation ($ids: [String!]!) { deleteKpis(ids: $ids)\n }\n `,\n variables: { ids: [id]\n }\n })\n\n this.selected = {}\n this.updateContext()\n await this.fetch()\n }\n }\n\n async pageInitialized(lifecycle: any) { this.fetch()\n }\n\n async pageUpdated(changes: any, lifecycle: any) { if (this.active) { // do something here when this page just became as active\n }\n }\n\n async fetch() { const response = await client.query({ query: gql`\n query { kpiTree { ...SubKpiFragment\n children { ...SubKpiFragment\n children { ...SubKpiFragment\n children { ...SubKpiFragment\n children { ...SubKpiFragment\n children { ...SubKpiFragment\n children { ...SubKpiFragment\n children { ...SubKpiFragment\n }\n }\n }\n }\n }\n }\n }\n }\n }\n ${SubKpiFragment}\n `\n })\n\n const records = response.data.kpiTree || []\n /* 다중루트를 지원하기 위해서 this.root 에 모든 루트를 저장하라. */\n this.root = records\n }\n\n async exportHandler() { // Export functionality can be implemented here\n }\n\n async importHandler(records: any[]) { // Import functionality can be implemented here\n }\n}\n"]}