@things-factory/kpi 9.1.19 → 10.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/client/pages/kpi/kpi-list-page.ts +339 -525
  2. package/client/pages/kpi/kpi-tree-page.ts +135 -207
  3. package/client/pages/kpi-metric/kpi-metric-list-page.ts +146 -226
  4. package/client/pages/kpi-metric-value/kpi-metric-value-editor-page.ts +187 -295
  5. package/client/pages/kpi-metric-value/kpi-metric-value-list-page.ts +123 -194
  6. package/client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.ts +57 -91
  7. package/client/pages/kpi-statistic/kpi-statistic-editor-page.ts +180 -278
  8. package/client/pages/kpi-statistic/kpi-statistic-list-page.ts +186 -286
  9. package/client/pages/kpi-value/kpi-value-editor-page.ts +189 -292
  10. package/client/pages/kpi-value/kpi-value-list-page.ts +170 -264
  11. package/dist-client/pages/kpi/kpi-list-page.d.ts +0 -6
  12. package/dist-client/pages/kpi/kpi-list-page.js +150 -282
  13. package/dist-client/pages/kpi/kpi-list-page.js.map +1 -1
  14. package/dist-client/pages/kpi/kpi-tree-page.d.ts +1 -7
  15. package/dist-client/pages/kpi/kpi-tree-page.js +76 -127
  16. package/dist-client/pages/kpi/kpi-tree-page.js.map +1 -1
  17. package/dist-client/pages/kpi-metric/kpi-metric-list-page.d.ts +0 -6
  18. package/dist-client/pages/kpi-metric/kpi-metric-list-page.js +62 -116
  19. package/dist-client/pages/kpi-metric/kpi-metric-list-page.js.map +1 -1
  20. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.d.ts +1 -7
  21. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js +82 -140
  22. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js.map +1 -1
  23. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.d.ts +0 -6
  24. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js +54 -98
  25. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js.map +1 -1
  26. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.d.ts +1 -7
  27. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js +30 -57
  28. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js.map +1 -1
  29. package/dist-client/pages/kpi-statistic/kpi-statistic-editor-page.d.ts +1 -7
  30. package/dist-client/pages/kpi-statistic/kpi-statistic-editor-page.js +91 -153
  31. package/dist-client/pages/kpi-statistic/kpi-statistic-editor-page.js.map +1 -1
  32. package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.d.ts +0 -6
  33. package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.js +81 -155
  34. package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.js.map +1 -1
  35. package/dist-client/pages/kpi-value/kpi-value-editor-page.d.ts +1 -7
  36. package/dist-client/pages/kpi-value/kpi-value-editor-page.js +80 -136
  37. package/dist-client/pages/kpi-value/kpi-value-editor-page.js.map +1 -1
  38. package/dist-client/pages/kpi-value/kpi-value-list-page.d.ts +0 -6
  39. package/dist-client/pages/kpi-value/kpi-value-list-page.js +73 -134
  40. package/dist-client/pages/kpi-value/kpi-value-list-page.js.map +1 -1
  41. package/dist-client/tsconfig.tsbuildinfo +1 -1
  42. package/dist-server/service/index.d.ts +1 -1
  43. package/dist-server/tsconfig.tsbuildinfo +1 -1
  44. package/package.json +18 -18
  45. package/client/tsconfig.json +0 -11
  46. package/dist-server/tsconfig.json +0 -10
  47. package/server/@types/index.d.ts +0 -11
  48. package/server/calculator/evaluator.ts +0 -45
  49. package/server/calculator/functions.ts +0 -67
  50. package/server/calculator/index.ts +0 -4
  51. package/server/calculator/parser.ts +0 -137
  52. package/server/calculator/provider.ts +0 -10
  53. package/server/controllers/index.ts +0 -2
  54. package/server/controllers/kpi-metric-value-provider.ts +0 -79
  55. package/server/controllers/kpi-value-provider.ts +0 -51
  56. package/server/index.ts +0 -6
  57. package/server/migrations/1752190849680-seed-kpi-metrics.ts +0 -124
  58. package/server/migrations/1752190849681-seed-kpi.ts +0 -356
  59. package/server/migrations/1752192090123-add-grades-to-kpi.ts +0 -67
  60. package/server/migrations/1752192090124-add-kpi-statistics.ts +0 -719
  61. package/server/migrations/1752192090128-seed-kpi-org-scope.ts +0 -132
  62. package/server/migrations/1752192090129-seed-kpi-values.ts +0 -207
  63. package/server/migrations/grade-data/x11-performance-table.json +0 -962
  64. package/server/migrations/grade-data/x12-performance-table.json +0 -611
  65. package/server/migrations/grade-data/x14-performance-table.json +0 -42
  66. package/server/migrations/grade-data/x21-performance-table.json +0 -889
  67. package/server/migrations/grade-data/x22-performance-table.json +0 -1064
  68. package/server/migrations/grade-data/x23-performance-table.json +0 -42
  69. package/server/migrations/grade-data/x31-performance-table.json +0 -644
  70. package/server/migrations/grade-data/x32-performance-table.json +0 -993
  71. package/server/migrations/grade-data/x33-performance-table.json +0 -195
  72. package/server/migrations/grade-data/x34-performance-table.json +0 -12
  73. package/server/migrations/grade-data/x35-performance-table.json +0 -42
  74. package/server/migrations/grade-data/x41-performance-table.json +0 -825
  75. package/server/migrations/grade-data/x42-performance-table.json +0 -786
  76. package/server/migrations/grade-data/x43-performance-table.json +0 -12
  77. package/server/migrations/grade-data/x44-performance-table.json +0 -42
  78. package/server/migrations/grade-data/x51-performance-table.json +0 -924
  79. package/server/migrations/grade-data/x52-performance-table.json +0 -42
  80. package/server/migrations/grade-data/x61-performance-table.json +0 -261
  81. package/server/migrations/grade-data/x62-performance-table.json +0 -42
  82. package/server/migrations/index.ts +0 -9
  83. package/server/migrations/seed-data/kpi-metrics-seed.json +0 -454
  84. package/server/migrations/seed-data/kpi-org-scope-seed.json +0 -1676
  85. package/server/migrations/seed-data/kpi-scopes-seed.json +0 -121
  86. package/server/migrations/seed-data/kpi-values-seed.json +0 -402
  87. package/server/migrations/seed-data/kpis-seed.json +0 -488
  88. package/server/migrations/seed-data/scope-definitions-seed.json +0 -90
  89. package/server/routes.ts +0 -81
  90. package/server/service/index.ts +0 -51
  91. package/server/service/kpi/aggregate-kpi.ts +0 -103
  92. package/server/service/kpi/event-subscriber.ts +0 -29
  93. package/server/service/kpi/index.ts +0 -9
  94. package/server/service/kpi/kpi-formula.service.ts +0 -164
  95. package/server/service/kpi/kpi-grade.types.ts +0 -28
  96. package/server/service/kpi/kpi-history.ts +0 -126
  97. package/server/service/kpi/kpi-mutation.ts +0 -553
  98. package/server/service/kpi/kpi-query.ts +0 -224
  99. package/server/service/kpi/kpi-type.ts +0 -151
  100. package/server/service/kpi/kpi.ts +0 -254
  101. package/server/service/kpi-alert/index.ts +0 -3
  102. package/server/service/kpi-alert/kpi-alert-query.ts +0 -59
  103. package/server/service/kpi-alert/kpi-alert-type.ts +0 -20
  104. package/server/service/kpi-metric/aggregate-kpi-metric.ts +0 -132
  105. package/server/service/kpi-metric/index.ts +0 -7
  106. package/server/service/kpi-metric/kpi-metric-mutation.ts +0 -309
  107. package/server/service/kpi-metric/kpi-metric-query.ts +0 -70
  108. package/server/service/kpi-metric/kpi-metric-type.ts +0 -111
  109. package/server/service/kpi-metric/kpi-metric.ts +0 -134
  110. package/server/service/kpi-metric-value/index.ts +0 -7
  111. package/server/service/kpi-metric-value/kpi-metric-value-mutation.ts +0 -270
  112. package/server/service/kpi-metric-value/kpi-metric-value-query.ts +0 -62
  113. package/server/service/kpi-metric-value/kpi-metric-value-type.ts +0 -82
  114. package/server/service/kpi-metric-value/kpi-metric-value.ts +0 -93
  115. package/server/service/kpi-org-scope/index.ts +0 -6
  116. package/server/service/kpi-org-scope/kpi-org-scope-mutation.ts +0 -173
  117. package/server/service/kpi-org-scope/kpi-org-scope-query.ts +0 -127
  118. package/server/service/kpi-org-scope/kpi-org-scope-type.ts +0 -68
  119. package/server/service/kpi-org-scope/kpi-org-scope.ts +0 -123
  120. package/server/service/kpi-scope/index.ts +0 -11
  121. package/server/service/kpi-scope/kpi-scope-mutation.ts +0 -129
  122. package/server/service/kpi-scope/kpi-scope-query.ts +0 -63
  123. package/server/service/kpi-scope/kpi-scope-type.ts +0 -96
  124. package/server/service/kpi-scope/kpi-scope.ts +0 -143
  125. package/server/service/kpi-statistic/index.ts +0 -7
  126. package/server/service/kpi-statistic/kpi-statistic-batch.service.ts +0 -231
  127. package/server/service/kpi-statistic/kpi-statistic-calculation.service.ts +0 -410
  128. package/server/service/kpi-statistic/kpi-statistic-mutation.ts +0 -291
  129. package/server/service/kpi-statistic/kpi-statistic-query.ts +0 -146
  130. package/server/service/kpi-statistic/kpi-statistic-type.ts +0 -152
  131. package/server/service/kpi-statistic/kpi-statistic.ts +0 -199
  132. package/server/service/kpi-value/index.ts +0 -7
  133. package/server/service/kpi-value/kpi-value-mutation.ts +0 -432
  134. package/server/service/kpi-value/kpi-value-query.ts +0 -61
  135. package/server/service/kpi-value/kpi-value-score.service.ts +0 -106
  136. package/server/service/kpi-value/kpi-value-type.ts +0 -122
  137. package/server/service/kpi-value/kpi-value.ts +0 -160
  138. package/server/service/utils/value-date-util.ts +0 -119
  139. package/server/tsconfig.json +0 -10
  140. package/server/types/global.d.ts +0 -8
@@ -1 +1 @@
1
- {"version":3,"file":"kpi-statistic-editor-page.js","sourceRoot":"","sources":["../../../client/pages/kpi-statistic/kpi-statistic-editor-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@material/web/button/elevated-button.js'\nimport '@material/web/textfield/outlined-text-field.js'\n\nimport { CommonButtonStyles, CommonHeaderStyles, ScrollbarStyles } from '@operato/styles'\nimport { PageView, store } from '@operato/shell'\nimport { css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify } from '@operato/layout'\nimport { connect } from 'pwa-helpers/connect-mixin'\nimport gql from 'graphql-tag'\n\ninterface KpiStatisticData {\n kpi: {\n id: string\n name: string\n }\n valueDate: string\n periodType: string\n statistics: {\n count?: number\n sum?: number\n range?: number\n mean?: number\n median?: number\n minimum?: number\n maximum?: number\n standardDeviation?: number\n variance?: number\n percentile25?: number\n percentile75?: number\n iqr?: number\n lowerFence?: number\n upperFence?: number\n isDirty?: boolean\n }\n}\n\ninterface EditorCell {\n field: string\n value: number | null\n isEditable: boolean\n isHighlighted: boolean\n}\n\n@customElement('kpi-statistic-editor-page')\nexport class KpiStatisticEditorPage extends connect(store)(localize(i18next)(ScopedElementsMixin(PageView))) {\n static styles = [\n CommonHeaderStyles,\n ScrollbarStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n padding: 20px;\n overflow-x: auto;\n }\n\n .header {\n display: flex;\n gap: 16px;\n align-items: center;\n margin-bottom: 20px;\n padding: 16px;\n background: var(--md-sys-color-surface-container);\n border-radius: 8px;\n }\n\n .controls {\n display: flex;\n gap: 12px;\n align-items: center;\n flex-wrap: wrap;\n }\n\n .table-container {\n flex: 1;\n overflow: auto;\n border: 1px solid var(--md-sys-color-outline);\n border-radius: 8px;\n }\n\n table {\n width: 100%;\n border-collapse: collapse;\n min-width: max-content;\n }\n\n th {\n background: var(--md-sys-color-surface-container-low);\n font-weight: 500;\n padding: 8px 12px;\n border: 1px solid var(--md-sys-color-outline-variant);\n min-width: 120px;\n height: 60px;\n vertical-align: middle;\n text-align: center;\n }\n\n td {\n padding: 8px 12px;\n border: 1px solid var(--md-sys-color-outline-variant);\n min-width: 120px;\n height: 60px;\n text-align: center;\n vertical-align: middle;\n }\n\n .kpi-header {\n position: sticky;\n left: 0;\n top: 0;\n z-index: 3;\n min-width: 200px;\n text-align: left;\n }\n\n .field-header {\n position: sticky;\n left: 0;\n top: 0;\n z-index: 2;\n min-width: 200px;\n text-align: center;\n }\n\n .kpi-name {\n position: sticky;\n left: 0;\n background: var(--md-sys-color-surface);\n font-weight: 500;\n min-width: 200px;\n text-align: left;\n z-index: 2;\n }\n\n tr:hover {\n background: var(--md-sys-color-surface-container-high);\n }\n\n td.editable-cell {\n cursor: pointer;\n background: var(--md-sys-color-primary-container);\n color: var(--md-sys-color-on-primary-container);\n }\n\n td.editable-cell:hover {\n background: var(--md-sys-color-primary-container-high);\n }\n\n td.highlighted-cell {\n background: var(--md-sys-color-secondary-container);\n color: var(--md-sys-color-on-secondary-container);\n font-weight: 500;\n }\n\n td.highlighted-cell:hover {\n background: var(--md-sys-color-secondary-container-high);\n }\n\n td.disabled-cell {\n background: var(--md-sys-color-surface-container);\n color: var(--md-sys-color-on-surface-variant);\n cursor: not-allowed;\n }\n\n .value-input {\n width: 100%;\n text-align: center;\n border: none;\n background: transparent;\n color: inherit;\n font-size: 12px;\n padding: 2px;\n }\n\n .value-input:focus {\n outline: 2px solid var(--md-sys-color-primary);\n border-radius: 4px;\n }\n\n .period-badge {\n font-size: 10px;\n padding: 2px 6px;\n border-radius: 4px;\n background: var(--md-sys-color-tertiary-container);\n color: var(--md-sys-color-on-tertiary-container);\n margin-left: 8px;\n }\n\n .loading {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 200px;\n color: var(--md-sys-color-on-surface-variant);\n }\n\n .error {\n color: var(--md-sys-color-error);\n padding: 16px;\n text-align: center;\n }\n\n .legend {\n display: flex;\n gap: 16px;\n margin-top: 16px;\n font-size: 12px;\n }\n\n .legend-item {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .legend-color {\n width: 16px;\n height: 16px;\n border-radius: 2px;\n }\n\n .field-group {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .field-name {\n font-size: 10px;\n color: var(--md-sys-color-on-surface-variant);\n font-weight: 500;\n }\n\n .field-value {\n font-size: 12px;\n font-weight: 500;\n }\n `\n ]\n\n @property({ type: String }) periodType: string = 'MONTH'\n @property({ type: String }) valueDate: string = ''\n @property({ type: String }) targetDate: string = '' // 기준 날짜 (예: 2025-08-03)\n\n @state() private kpis: KpiStatisticData[] = []\n @state() private loading: boolean = false\n @state() private error: string = ''\n @state() private editingCell: { kpi: { id: string }; field: string } | null = null\n @state() private _existingStatistics: any[] = []\n\n // 통계 필드 정의\n private readonly statisticFields = [\n { name: 'count', label: 'Count', group: 'basic' },\n { name: 'sum', label: 'Sum', group: 'basic' },\n { name: 'range', label: 'Range', group: 'basic' },\n { name: 'mean', label: 'Mean', group: 'central' },\n { name: 'median', label: 'Median', group: 'central' },\n { name: 'minimum', label: 'Min', group: 'range' },\n { name: 'maximum', label: 'Max', group: 'range' },\n { name: 'standardDeviation', label: 'Std Dev', group: 'dispersion' },\n { name: 'variance', label: 'Variance', group: 'dispersion' },\n { name: 'percentile25', label: 'P25', group: 'percentile' },\n { name: 'percentile75', label: 'P75', group: 'percentile' },\n { name: 'iqr', label: 'IQR', group: 'percentile' },\n { name: 'lowerFence', label: 'Lower Fence', group: 'fence' },\n { name: 'upperFence', label: 'Upper Fence', group: 'fence' }\n ]\n\n get context() {\n return {\n title: i18next.t('title.kpi statistic editor'),\n actions: [\n {\n title: i18next.t('button.save'),\n action: this._saveStatistics.bind(this),\n ...CommonButtonStyles.save\n },\n {\n title: i18next.t('button.cancel'),\n action: this._cancel.bind(this),\n ...CommonButtonStyles.cancel\n }\n ]\n }\n }\n\n render() {\n if (this.loading) {\n return html`\n <div class=\"loading\">\n <md-icon>hourglass_empty</md-icon>\n <span>데이터를 불러오는 중...</span>\n </div>\n `\n }\n\n if (this.error) {\n return html`\n <div class=\"error\">\n <md-icon>error</md-icon>\n <span>${this.error}</span>\n </div>\n `\n }\n\n return html`\n <div class=\"header\">\n <div class=\"controls\">\n <md-outlined-text-field\n label=\"기간 유형\"\n .value=${this.periodType}\n @input=${(e: any) => this._onPeriodChange(e.target.value)}\n style=\"width: 120px;\"\n ></md-outlined-text-field>\n\n <md-outlined-text-field\n label=\"기준 날짜\"\n type=\"date\"\n .value=${this.targetDate}\n @input=${(e: any) => this._onTargetDateChange(e.target.value)}\n style=\"width: 150px;\"\n ></md-outlined-text-field>\n\n <md-outlined-text-field\n label=\"값 날짜\"\n .value=${this.valueDate}\n @input=${(e: any) => (this.valueDate = e.target.value)}\n style=\"width: 150px;\"\n readonly\n ></md-outlined-text-field>\n\n <md-elevated-button @click=${this._loadData}>\n <md-icon slot=\"icon\">refresh</md-icon>\n 새로고침\n </md-elevated-button>\n </div>\n </div>\n\n <div class=\"table-container\">\n <table>\n <thead>\n <tr>\n <th class=\"kpi-header\">KPI명</th>\n ${this.statisticFields.map(\n field => html`\n <th class=\"field-header\">\n <div class=\"field-group\">\n <div class=\"field-name\">${field.label}</div>\n <div class=\"field-value\">${field.name}</div>\n </div>\n </th>\n `\n )}\n </tr>\n </thead>\n <tbody>\n ${this.kpis.map(\n kpi => html`\n <tr>\n <td class=\"kpi-name\">\n ${kpi.kpi.name}\n <span class=\"period-badge\">${kpi.periodType}</span>\n </td>\n ${this.statisticFields.map(\n field => html`\n <td\n class=${this._getCellClass(kpi, field.name)}\n @click=${() => this._startEdit(kpi.kpi.id, field.name)}\n >\n ${this._renderCellContent(kpi, field.name)}\n </td>\n `\n )}\n </tr>\n `\n )}\n </tbody>\n </table>\n </div>\n\n <div class=\"legend\">\n <div class=\"legend-item\">\n <div class=\"legend-color\" style=\"background: var(--md-sys-color-primary-container);\"></div>\n <span>편집 가능</span>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-color\" style=\"background: var(--md-sys-color-secondary-container);\"></div>\n <span>하이라이트 (중요 필드)</span>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-color\" style=\"background: var(--md-sys-color-surface-container);\"></div>\n <span>편집 불가</span>\n </div>\n </div>\n `\n }\n\n private _getCellClass(kpi: KpiStatisticData, fieldName: string): string {\n const isEditable = this._isFieldEditable(fieldName)\n const isHighlighted = this._isFieldHighlighted(fieldName)\n\n if (!isEditable) {\n return 'disabled-cell'\n }\n if (isHighlighted) {\n return 'highlighted-cell'\n }\n return 'editable-cell'\n }\n\n private _isFieldEditable(fieldName: string): boolean {\n // 모든 필드를 편집 가능하게 설정 (필요에 따라 제한 가능)\n return true\n }\n\n private _isFieldHighlighted(fieldName: string): boolean {\n // 중요 필드들을 하이라이트\n const importantFields = ['count', 'mean', 'median', 'minimum', 'maximum', 'standardDeviation']\n return importantFields.includes(fieldName)\n }\n\n private _renderCellContent(kpi: KpiStatisticData, fieldName: string) {\n const isEditing = this.editingCell?.kpi?.id === kpi.kpi.id && this.editingCell?.field === fieldName\n const value = kpi.statistics[fieldName]\n\n if (isEditing) {\n return html`\n <input\n class=\"value-input\"\n type=\"number\"\n step=\"0.01\"\n .value=${(value || '').toString()}\n @blur=${(e: any) => this._finishEdit(kpi.kpi.id, fieldName, parseFloat(e.target.value) || null)}\n @keydown=${(e: any) => e.key === 'Enter' && e.target.blur()}\n autofocus\n />\n `\n }\n\n return html`\n <span style=\"color: ${value !== null && value !== undefined ? 'inherit' : '#999'};\">\n ${value !== null && value !== undefined ? value.toLocaleString() : '클릭하여 입력'}\n </span>\n `\n }\n\n private _startEdit(kpiId: string, fieldName: string) {\n this.editingCell = { kpi: { id: kpiId }, field: fieldName }\n }\n\n private _finishEdit(kpiId: string, fieldName: string, value: number | null) {\n const kpi = this.kpis.find(k => k.kpi.id === kpiId)\n if (kpi) {\n const originalValue = this._findExistingStatistic(kpiId)?.[fieldName]\n const isChanged = originalValue !== value\n\n kpi.statistics[fieldName] = value\n kpi.statistics.isDirty = isChanged\n }\n this.editingCell = null\n }\n\n private async _loadData() {\n if (!this.valueDate) {\n this.error = '값 날짜를 입력해주세요.'\n return\n }\n\n this.loading = true\n this.error = ''\n\n try {\n // KPI 목록 조회\n const kpisResponse = await client.query({\n query: gql`\n query ($filters: [Filter!]) {\n kpis(filters: $filters) {\n items {\n id\n name\n periodType\n active\n category: parent {\n id\n name\n }\n }\n total\n }\n }\n `,\n variables: {\n filters: [{ name: 'active', operator: 'eq', value: true }]\n }\n })\n\n // 기존 KPI Statistic 데이터 조회\n const statisticsResponse = await client.query({\n query: gql`\n query ($filters: [Filter!]) {\n kpiStatistics(filters: $filters) {\n items {\n id\n kpi {\n id\n name\n }\n valueDate\n periodType\n count\n sum\n range\n mean\n median\n minimum\n maximum\n standardDeviation\n variance\n percentile25\n percentile75\n iqr\n lowerFence\n upperFence\n additionalStatistics\n metadata\n }\n total\n }\n }\n `,\n variables: {\n filters: [\n { name: 'valueDate', operator: 'eq', value: this.valueDate },\n { name: 'periodType', operator: 'eq', value: this.periodType }\n ]\n }\n })\n\n // KPI 목록을 기준으로 데이터 구성 (카테고리별로 필터링)\n console.log('KPI 원본 데이터:', kpisResponse.data.kpis.items)\n\n const filteredKpis = kpisResponse.data.kpis.items\n console.log('모든 KPI 포함:', filteredKpis)\n\n console.log('필터링된 KPI:', filteredKpis)\n\n this.kpis = filteredKpis.map((kpi: any) => ({\n kpi: kpi,\n valueDate: this.valueDate,\n periodType: this.periodType,\n statistics: {\n count: null,\n sum: null,\n range: null,\n mean: null,\n median: null,\n minimum: null,\n maximum: null,\n standardDeviation: null,\n variance: null,\n percentile25: null,\n percentile75: null,\n iqr: null,\n lowerFence: null,\n upperFence: null,\n isDirty: false\n }\n }))\n\n // 기존 KPI Statistic 데이터 저장\n this._existingStatistics = statisticsResponse.data.kpiStatistics.items\n console.log('기존 통계 데이터:', this._existingStatistics)\n\n // 기존 통계 데이터를 해당 KPI에 매핑\n statisticsResponse.data.kpiStatistics.items.forEach((statistic: any) => {\n const kpi = this.kpis.find(k => k.kpi.id === statistic.kpi.id) // KPI ID로 매칭\n console.log(`통계 데이터 매핑: statistic.kpi.id=${statistic.kpi.id}, 찾은 KPI:`, kpi?.kpi.name || '없음')\n if (kpi) {\n kpi.statistics = {\n count: statistic.count,\n sum: statistic.sum,\n range: statistic.range,\n mean: statistic.mean,\n median: statistic.median,\n minimum: statistic.minimum,\n maximum: statistic.maximum,\n standardDeviation: statistic.standardDeviation,\n variance: statistic.variance,\n percentile25: statistic.percentile25,\n percentile75: statistic.percentile75,\n iqr: statistic.iqr,\n lowerFence: statistic.lowerFence,\n upperFence: statistic.upperFence,\n isDirty: false\n }\n }\n })\n\n console.log('KPI 총 개수:', kpisResponse.data.kpis.total)\n console.log('KPI 목록:', kpisResponse.data.kpis.items)\n console.log('기존 통계 데이터:', this._existingStatistics)\n console.log('구성된 KPI 통계 데이터:', this.kpis)\n console.log('최종 KPI 배열 길이:', this.kpis.length)\n\n this.requestUpdate()\n } catch (error) {\n console.error('데이터 로드 중 오류:', error)\n this.error = '데이터를 불러오는 중 오류가 발생했습니다.'\n } finally {\n this.loading = false\n }\n }\n\n private async _saveStatistics() {\n try {\n const patches: any[] = []\n\n this.kpis.forEach(kpi => {\n // dirty 상태인 데이터만 처리\n if (kpi.statistics.isDirty) {\n const existingStatistic = this._findExistingStatistic(kpi.kpi.id)\n\n if (existingStatistic) {\n // 기존 데이터 업데이트\n const { isDirty, ...statisticsWithoutDirty } = kpi.statistics\n patches.push({\n id: existingStatistic.id,\n ...statisticsWithoutDirty,\n cuFlag: 'M'\n })\n } else {\n // 새로운 데이터 생성\n const { isDirty, ...statisticsWithoutDirty } = kpi.statistics\n patches.push({\n kpi: {\n id: kpi.kpi.id\n },\n valueDate: kpi.valueDate,\n periodType: kpi.periodType,\n ...statisticsWithoutDirty,\n additionalStatistics: {},\n metadata: {\n calculationMethod: 'manual',\n lastCalculated: new Date(),\n dataCount: kpi.statistics.count || 0\n },\n cuFlag: '+'\n })\n }\n }\n })\n\n if (patches.length === 0) {\n notify({ message: '저장할 데이터가 없습니다.' })\n return\n }\n\n const response = await client.mutate({\n mutation: gql`\n mutation ($patches: [KpiStatisticPatch!]!) {\n updateMultipleKpiStatistic(patches: $patches) {\n id\n kpi {\n id\n name\n }\n valueDate\n periodType\n }\n }\n `,\n variables: { patches }\n })\n\n if (!response.errors) {\n // 저장 후 dirty 상태 해제\n this.kpis.forEach(kpi => {\n kpi.statistics.isDirty = false\n })\n\n notify({ message: 'KPI 통계값이 성공적으로 저장되었습니다.' })\n this.requestUpdate()\n }\n } catch (error) {\n console.error('저장 중 오류:', error)\n notify({ message: '저장 중 오류가 발생했습니다.' })\n }\n }\n\n private _findExistingStatistic(kpiId: string) {\n return this._existingStatistics?.find((s: any) => s.kpi === kpiId)\n }\n\n private _onTargetDateChange(targetDate: string) {\n this.targetDate = targetDate\n this._calculateDateRange()\n }\n\n private _onPeriodChange(periodType: string) {\n this.periodType = periodType\n this._calculateDateRange()\n }\n\n private _calculateDateRange() {\n if (!this.targetDate || !this.periodType) return\n\n const target = new Date(this.targetDate)\n let valueDate: string\n\n switch (this.periodType) {\n case 'DAY':\n valueDate = target.toISOString().split('T')[0]\n break\n case 'WEEK':\n // 해당 주의 월요일\n const dayOfWeek = target.getDay()\n const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1\n const monday = new Date(target)\n monday.setDate(target.getDate() - daysToMonday)\n valueDate = monday.toISOString().split('T')[0]\n break\n case 'MONTH':\n valueDate = `${target.getFullYear()}-${String(target.getMonth() + 1).padStart(2, '0')}`\n break\n case 'QUARTER':\n const quarter = Math.floor(target.getMonth() / 3) + 1\n valueDate = `${target.getFullYear()}-Q${quarter}`\n break\n case 'YEAR':\n valueDate = target.getFullYear().toString()\n break\n default:\n valueDate = target.toISOString().split('T')[0]\n }\n\n this.valueDate = valueDate\n }\n\n private _cancel() {\n this.editingCell = null\n this._loadData() // 원본 데이터로 복원\n }\n\n async pageInitialized(lifecycle: any) {\n // 기본값 설정 - 현재 날짜를 기준으로\n if (!this.targetDate) {\n this.targetDate = new Date().toLocaleDateString('sv-SE')\n }\n\n // 기간 유형에 따라 날짜 범위 계산\n this._calculateDateRange()\n\n await this._loadData()\n }\n}\n"]}
1
+ {"version":3,"file":"kpi-statistic-editor-page.js","sourceRoot":"","sources":["../../../client/pages/kpi-statistic/kpi-statistic-editor-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@material/web/button/elevated-button.js'\nimport '@material/web/textfield/outlined-text-field.js'\n\nimport { CommonButtonStyles, CommonHeaderStyles, ScrollbarStyles } from '@operato/styles'\nimport { PageView } from '@operato/shell'\nimport { css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify } from '@operato/layout'\nimport gql from 'graphql-tag'\n\ninterface KpiStatisticData { kpi: { id: string\n name: string\n }\n valueDate: string\n periodType: string\n statistics: { count?: number\n sum?: number\n range?: number\n mean?: number\n median?: number\n minimum?: number\n maximum?: number\n standardDeviation?: number\n variance?: number\n percentile25?: number\n percentile75?: number\n iqr?: number\n lowerFence?: number\n upperFence?: number\n isDirty?: boolean\n }\n}\n\ninterface EditorCell { field: string\n value: number | null\n isEditable: boolean\n isHighlighted: boolean\n}\n\n@customElement('kpi-statistic-editor-page')\nexport class KpiStatisticEditorPage extends localize(i18next)(ScopedElementsMixin(PageView)) { static styles = [\n CommonHeaderStyles,\n ScrollbarStyles,\n css`\n :host { display: flex;\n flex-direction: column;\n padding: 20px;\n overflow-x: auto;\n }\n\n .header { display: flex;\n gap: 16px;\n align-items: center;\n margin-bottom: 20px;\n padding: 16px;\n background: var(--md-sys-color-surface-container);\n border-radius: 8px;\n }\n\n .controls { display: flex;\n gap: 12px;\n align-items: center;\n flex-wrap: wrap;\n }\n\n .table-container { flex: 1;\n overflow: auto;\n border: 1px solid var(--md-sys-color-outline);\n border-radius: 8px;\n }\n\n table { width: 100%;\n border-collapse: collapse;\n min-width: max-content;\n }\n\n th { background: var(--md-sys-color-surface-container-low);\n font-weight: 500;\n padding: 8px 12px;\n border: 1px solid var(--md-sys-color-outline-variant);\n min-width: 120px;\n height: 60px;\n vertical-align: middle;\n text-align: center;\n }\n\n td { padding: 8px 12px;\n border: 1px solid var(--md-sys-color-outline-variant);\n min-width: 120px;\n height: 60px;\n text-align: center;\n vertical-align: middle;\n }\n\n .kpi-header { position: sticky;\n left: 0;\n top: 0;\n z-index: 3;\n min-width: 200px;\n text-align: left;\n }\n\n .field-header { position: sticky;\n left: 0;\n top: 0;\n z-index: 2;\n min-width: 200px;\n text-align: center;\n }\n\n .kpi-name { position: sticky;\n left: 0;\n background: var(--md-sys-color-surface);\n font-weight: 500;\n min-width: 200px;\n text-align: left;\n z-index: 2;\n }\n\n tr:hover { background: var(--md-sys-color-surface-container-high);\n }\n\n td.editable-cell { cursor: pointer;\n background: var(--md-sys-color-primary-container);\n color: var(--md-sys-color-on-primary-container);\n }\n\n td.editable-cell:hover { background: var(--md-sys-color-primary-container-high);\n }\n\n td.highlighted-cell { background: var(--md-sys-color-secondary-container);\n color: var(--md-sys-color-on-secondary-container);\n font-weight: 500;\n }\n\n td.highlighted-cell:hover { background: var(--md-sys-color-secondary-container-high);\n }\n\n td.disabled-cell { background: var(--md-sys-color-surface-container);\n color: var(--md-sys-color-on-surface-variant);\n cursor: not-allowed;\n }\n\n .value-input { width: 100%;\n text-align: center;\n border: none;\n background: transparent;\n color: inherit;\n font-size: 12px;\n padding: 2px;\n }\n\n .value-input:focus { outline: 2px solid var(--md-sys-color-primary);\n border-radius: 4px;\n }\n\n .period-badge { font-size: 10px;\n padding: 2px 6px;\n border-radius: 4px;\n background: var(--md-sys-color-tertiary-container);\n color: var(--md-sys-color-on-tertiary-container);\n margin-left: 8px;\n }\n\n .loading { display: flex;\n justify-content: center;\n align-items: center;\n height: 200px;\n color: var(--md-sys-color-on-surface-variant);\n }\n\n .error { color: var(--md-sys-color-error);\n padding: 16px;\n text-align: center;\n }\n\n .legend { display: flex;\n gap: 16px;\n margin-top: 16px;\n font-size: 12px;\n }\n\n .legend-item { display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .legend-color { width: 16px;\n height: 16px;\n border-radius: 2px;\n }\n\n .field-group { display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .field-name { font-size: 10px;\n color: var(--md-sys-color-on-surface-variant);\n font-weight: 500;\n }\n\n .field-value { font-size: 12px;\n font-weight: 500;\n }\n `\n ]\n\n @property({ type: String }) periodType: string = 'MONTH'\n @property({ type: String }) valueDate: string = ''\n @property({ type: String }) targetDate: string = '' // 기준 날짜 (예: 2025-08-03)\n\n @state() private kpis: KpiStatisticData[] = []\n @state() private loading: boolean = false\n @state() private error: string = ''\n @state() private editingCell: { kpi: { id: string }; field: string } | null = null\n @state() private _existingStatistics: any[] = []\n\n // 통계 필드 정의\n private readonly statisticFields = [\n { name: 'count', label: 'Count', group: 'basic' },\n { name: 'sum', label: 'Sum', group: 'basic' },\n { name: 'range', label: 'Range', group: 'basic' },\n { name: 'mean', label: 'Mean', group: 'central' },\n { name: 'median', label: 'Median', group: 'central' },\n { name: 'minimum', label: 'Min', group: 'range' },\n { name: 'maximum', label: 'Max', group: 'range' },\n { name: 'standardDeviation', label: 'Std Dev', group: 'dispersion' },\n { name: 'variance', label: 'Variance', group: 'dispersion' },\n { name: 'percentile25', label: 'P25', group: 'percentile' },\n { name: 'percentile75', label: 'P75', group: 'percentile' },\n { name: 'iqr', label: 'IQR', group: 'percentile' },\n { name: 'lowerFence', label: 'Lower Fence', group: 'fence' },\n { name: 'upperFence', label: 'Upper Fence', group: 'fence' }\n ]\n\n get context() { return { title: i18next.t('title.kpi statistic editor'),\n actions: [\n { title: i18next.t('button.save'),\n action: this._saveStatistics.bind(this),\n ...CommonButtonStyles.save\n },\n { title: i18next.t('button.cancel'),\n action: this._cancel.bind(this),\n ...CommonButtonStyles.cancel\n }\n ]\n }\n }\n\n render() { if (this.loading) { return html`\n <div class=\"loading\">\n <md-icon>hourglass_empty</md-icon>\n <span>데이터를 불러오는 중...</span>\n </div>\n `\n }\n\n if (this.error) { return html`\n <div class=\"error\">\n <md-icon>error</md-icon>\n <span>${this.error}</span>\n </div>\n `\n }\n\n return html`\n <div class=\"header\">\n <div class=\"controls\">\n <md-outlined-text-field\n label=\"기간 유형\"\n .value=${this.periodType}\n @input=${(e: any) => this._onPeriodChange(e.target.value)}\n style=\"width: 120px;\"\n ></md-outlined-text-field>\n\n <md-outlined-text-field\n label=\"기준 날짜\"\n type=\"date\"\n .value=${this.targetDate}\n @input=${(e: any) => this._onTargetDateChange(e.target.value)}\n style=\"width: 150px;\"\n ></md-outlined-text-field>\n\n <md-outlined-text-field\n label=\"값 날짜\"\n .value=${this.valueDate}\n @input=${(e: any) => (this.valueDate = e.target.value)}\n style=\"width: 150px;\"\n readonly\n ></md-outlined-text-field>\n\n <md-elevated-button @click=${this._loadData}>\n <md-icon slot=\"icon\">refresh</md-icon>\n 새로고침\n </md-elevated-button>\n </div>\n </div>\n\n <div class=\"table-container\">\n <table>\n <thead>\n <tr>\n <th class=\"kpi-header\">KPI명</th>\n ${this.statisticFields.map(\n field => html`\n <th class=\"field-header\">\n <div class=\"field-group\">\n <div class=\"field-name\">${field.label}</div>\n <div class=\"field-value\">${field.name}</div>\n </div>\n </th>\n `\n )}\n </tr>\n </thead>\n <tbody>\n ${this.kpis.map(\n kpi => html`\n <tr>\n <td class=\"kpi-name\">\n ${kpi.kpi.name}\n <span class=\"period-badge\">${kpi.periodType}</span>\n </td>\n ${this.statisticFields.map(\n field => html`\n <td\n class=${this._getCellClass(kpi, field.name)}\n @click=${() => this._startEdit(kpi.kpi.id, field.name)}\n >\n ${this._renderCellContent(kpi, field.name)}\n </td>\n `\n )}\n </tr>\n `\n )}\n </tbody>\n </table>\n </div>\n\n <div class=\"legend\">\n <div class=\"legend-item\">\n <div class=\"legend-color\" style=\"background: var(--md-sys-color-primary-container);\"></div>\n <span>편집 가능</span>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-color\" style=\"background: var(--md-sys-color-secondary-container);\"></div>\n <span>하이라이트 (중요 필드)</span>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-color\" style=\"background: var(--md-sys-color-surface-container);\"></div>\n <span>편집 불가</span>\n </div>\n </div>\n `\n }\n\n private _getCellClass(kpi: KpiStatisticData, fieldName: string): string { const isEditable = this._isFieldEditable(fieldName)\n const isHighlighted = this._isFieldHighlighted(fieldName)\n\n if (!isEditable) { return 'disabled-cell'\n }\n if (isHighlighted) { return 'highlighted-cell'\n }\n return 'editable-cell'\n }\n\n private _isFieldEditable(fieldName: string): boolean { // 모든 필드를 편집 가능하게 설정 (필요에 따라 제한 가능)\n return true\n }\n\n private _isFieldHighlighted(fieldName: string): boolean { // 중요 필드들을 하이라이트\n const importantFields = ['count', 'mean', 'median', 'minimum', 'maximum', 'standardDeviation']\n return importantFields.includes(fieldName)\n }\n\n private _renderCellContent(kpi: KpiStatisticData, fieldName: string) { const isEditing = this.editingCell?.kpi?.id === kpi.kpi.id && this.editingCell?.field === fieldName\n const value = kpi.statistics[fieldName]\n\n if (isEditing) { return html`\n <input\n class=\"value-input\"\n type=\"number\"\n step=\"0.01\"\n .value=${(value || '').toString()}\n @blur=${(e: any) => this._finishEdit(kpi.kpi.id, fieldName, parseFloat(e.target.value) || null)}\n @keydown=${(e: any) => e.key === 'Enter' && e.target.blur()}\n autofocus\n />\n `\n }\n\n return html`\n <span style=\"color: ${value !== null && value !== undefined ? 'inherit' : '#999'};\">\n ${value !== null && value !== undefined ? value.toLocaleString() : '클릭하여 입력'}\n </span>\n `\n }\n\n private _startEdit(kpiId: string, fieldName: string) { this.editingCell = { kpi: { id: kpiId }, field: fieldName }\n }\n\n private _finishEdit(kpiId: string, fieldName: string, value: number | null) { const kpi = this.kpis.find(k => k.kpi.id === kpiId)\n if (kpi) { const originalValue = this._findExistingStatistic(kpiId)?.[fieldName]\n const isChanged = originalValue !== value\n\n kpi.statistics[fieldName] = value\n kpi.statistics.isDirty = isChanged\n }\n this.editingCell = null\n }\n\n private async _loadData() { if (!this.valueDate) { this.error = '값 날짜를 입력해주세요.'\n return\n }\n\n this.loading = true\n this.error = ''\n\n try { // KPI 목록 조회\n const kpisResponse = await client.query({ query: gql`\n query ($filters: [Filter!]) { kpis(filters: $filters) { items { id\n name\n periodType\n active\n category: parent { id\n name\n }\n }\n total\n }\n }\n `,\n variables: { filters: [{ name: 'active', operator: 'eq', value: true }]\n }\n })\n\n // 기존 KPI Statistic 데이터 조회\n const statisticsResponse = await client.query({ query: gql`\n query ($filters: [Filter!]) { kpiStatistics(filters: $filters) { items { id\n kpi { id\n name\n }\n valueDate\n periodType\n count\n sum\n range\n mean\n median\n minimum\n maximum\n standardDeviation\n variance\n percentile25\n percentile75\n iqr\n lowerFence\n upperFence\n additionalStatistics\n metadata\n }\n total\n }\n }\n `,\n variables: { filters: [\n { name: 'valueDate', operator: 'eq', value: this.valueDate },\n { name: 'periodType', operator: 'eq', value: this.periodType }\n ]\n }\n })\n\n // KPI 목록을 기준으로 데이터 구성 (카테고리별로 필터링)\n console.log('KPI 원본 데이터:', kpisResponse.data.kpis.items)\n\n const filteredKpis = kpisResponse.data.kpis.items\n console.log('모든 KPI 포함:', filteredKpis)\n\n console.log('필터링된 KPI:', filteredKpis)\n\n this.kpis = filteredKpis.map((kpi: any) => ({ kpi: kpi,\n valueDate: this.valueDate,\n periodType: this.periodType,\n statistics: { count: null,\n sum: null,\n range: null,\n mean: null,\n median: null,\n minimum: null,\n maximum: null,\n standardDeviation: null,\n variance: null,\n percentile25: null,\n percentile75: null,\n iqr: null,\n lowerFence: null,\n upperFence: null,\n isDirty: false\n }\n }))\n\n // 기존 KPI Statistic 데이터 저장\n this._existingStatistics = statisticsResponse.data.kpiStatistics.items\n console.log('기존 통계 데이터:', this._existingStatistics)\n\n // 기존 통계 데이터를 해당 KPI에 매핑\n statisticsResponse.data.kpiStatistics.items.forEach((statistic: any) => { const kpi = this.kpis.find(k => k.kpi.id === statistic.kpi.id) // KPI ID로 매칭\n console.log(`통계 데이터 매핑: statistic.kpi.id=${statistic.kpi.id}, 찾은 KPI:`, kpi?.kpi.name || '없음')\n if (kpi) { kpi.statistics = { count: statistic.count,\n sum: statistic.sum,\n range: statistic.range,\n mean: statistic.mean,\n median: statistic.median,\n minimum: statistic.minimum,\n maximum: statistic.maximum,\n standardDeviation: statistic.standardDeviation,\n variance: statistic.variance,\n percentile25: statistic.percentile25,\n percentile75: statistic.percentile75,\n iqr: statistic.iqr,\n lowerFence: statistic.lowerFence,\n upperFence: statistic.upperFence,\n isDirty: false\n }\n }\n })\n\n console.log('KPI 총 개수:', kpisResponse.data.kpis.total)\n console.log('KPI 목록:', kpisResponse.data.kpis.items)\n console.log('기존 통계 데이터:', this._existingStatistics)\n console.log('구성된 KPI 통계 데이터:', this.kpis)\n console.log('최종 KPI 배열 길이:', this.kpis.length)\n\n this.requestUpdate()\n } catch (error) { console.error('데이터 로드 중 오류:', error)\n this.error = '데이터를 불러오는 중 오류가 발생했습니다.'\n } finally { this.loading = false\n }\n }\n\n private async _saveStatistics() { try { const patches: any[] = []\n\n this.kpis.forEach(kpi => { // dirty 상태인 데이터만 처리\n if (kpi.statistics.isDirty) { const existingStatistic = this._findExistingStatistic(kpi.kpi.id)\n\n if (existingStatistic) { // 기존 데이터 업데이트\n const { isDirty, ...statisticsWithoutDirty } = kpi.statistics\n patches.push({ id: existingStatistic.id,\n ...statisticsWithoutDirty,\n cuFlag: 'M'\n })\n } else { // 새로운 데이터 생성\n const { isDirty, ...statisticsWithoutDirty } = kpi.statistics\n patches.push({ kpi: { id: kpi.kpi.id\n },\n valueDate: kpi.valueDate,\n periodType: kpi.periodType,\n ...statisticsWithoutDirty,\n additionalStatistics: {},\n metadata: { calculationMethod: 'manual',\n lastCalculated: new Date(),\n dataCount: kpi.statistics.count || 0\n },\n cuFlag: '+'\n })\n }\n }\n })\n\n if (patches.length === 0) { notify({ message: '저장할 데이터가 없습니다.' })\n return\n }\n\n const response = await client.mutate({ mutation: gql`\n mutation ($patches: [KpiStatisticPatch!]!) { updateMultipleKpiStatistic(patches: $patches) { id\n kpi { id\n name\n }\n valueDate\n periodType\n }\n }\n `,\n variables: { patches }\n })\n\n if (!response.errors) { // 저장 후 dirty 상태 해제\n this.kpis.forEach(kpi => { kpi.statistics.isDirty = false\n })\n\n notify({ message: 'KPI 통계값이 성공적으로 저장되었습니다.' })\n this.requestUpdate()\n }\n } catch (error) { console.error('저장 중 오류:', error)\n notify({ message: '저장 중 오류가 발생했습니다.' })\n }\n }\n\n private _findExistingStatistic(kpiId: string) { return this._existingStatistics?.find((s: any) => s.kpi === kpiId)\n }\n\n private _onTargetDateChange(targetDate: string) { this.targetDate = targetDate\n this._calculateDateRange()\n }\n\n private _onPeriodChange(periodType: string) { this.periodType = periodType\n this._calculateDateRange()\n }\n\n private _calculateDateRange() { if (!this.targetDate || !this.periodType) return\n\n const target = new Date(this.targetDate)\n let valueDate: string\n\n switch (this.periodType) { case 'DAY':\n valueDate = target.toISOString().split('T')[0]\n break\n case 'WEEK':\n // 해당 주의 월요일\n const dayOfWeek = target.getDay()\n const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1\n const monday = new Date(target)\n monday.setDate(target.getDate() - daysToMonday)\n valueDate = monday.toISOString().split('T')[0]\n break\n case 'MONTH':\n valueDate = `${target.getFullYear()}-${String(target.getMonth() + 1).padStart(2, '0')}`\n break\n case 'QUARTER':\n const quarter = Math.floor(target.getMonth() / 3) + 1\n valueDate = `${target.getFullYear()}-Q${quarter}`\n break\n case 'YEAR':\n valueDate = target.getFullYear().toString()\n break\n default:\n valueDate = target.toISOString().split('T')[0]\n }\n\n this.valueDate = valueDate\n }\n\n private _cancel() { this.editingCell = null\n this._loadData() // 원본 데이터로 복원\n }\n\n async pageInitialized(lifecycle: any) { // 기본값 설정 - 현재 날짜를 기준으로\n if (!this.targetDate) { this.targetDate = new Date().toLocaleDateString('sv-SE')\n }\n\n // 기간 유형에 따라 날짜 범위 계산\n this._calculateDateRange()\n\n await this._loadData()\n }\n}\n"]}
@@ -7,12 +7,6 @@ import { PageView } from '@operato/shell';
7
7
  import { FetchOption } from '@operato/data-grist';
8
8
  import { KpiStatisticImporter } from './kpi-statistic-importer.js';
9
9
  declare const KpiStatisticListPage_base: (new (...args: any[]) => {
10
- _storeUnsubscribe: import("redux").Unsubscribe;
11
- connectedCallback(): void;
12
- disconnectedCallback(): void;
13
- stateChanged(_state: unknown): void;
14
- readonly isConnected: boolean;
15
- }) & (new (...args: any[]) => {
16
10
  __preferenceProviders: {
17
11
  [element: string]: import("@operato/p13n").PagePreferenceProvider;
18
12
  };
@@ -5,7 +5,7 @@ import '@operato/data-grist/ox-grist.js';
5
5
  import '@operato/data-grist/ox-filters-form.js';
6
6
  import '@operato/data-grist/ox-record-creator.js';
7
7
  import { CommonButtonStyles, CommonHeaderStyles, CommonGristStyles, ScrollbarStyles } from '@operato/styles';
8
- import { PageView, store } from '@operato/shell';
8
+ import { PageView } from '@operato/shell';
9
9
  import { css, html } from 'lit';
10
10
  import { customElement, property, query } from 'lit/decorators.js';
11
11
  import { ScopedElementsMixin } from '@open-wc/scoped-elements';
@@ -16,10 +16,9 @@ import { notify, openPopup } from '@operato/layout';
16
16
  import { OxPrompt } from '@operato/popup';
17
17
  import { isMobileDevice } from '@operato/utils';
18
18
  import { p13n } from '@operato/p13n';
19
- import { connect } from 'pwa-helpers/connect-mixin';
20
19
  import gql from 'graphql-tag';
21
20
  import { KpiStatisticImporter } from './kpi-statistic-importer.js';
22
- let KpiStatisticListPage = class KpiStatisticListPage extends connect(store)(p13n(localize(i18next)(ScopedElementsMixin(PageView)))) {
21
+ let KpiStatisticListPage = class KpiStatisticListPage extends p13n(localize(i18next)(ScopedElementsMixin(PageView))) {
23
22
  constructor() {
24
23
  super(...arguments);
25
24
  this.mode = isMobileDevice() ? 'CARD' : 'GRID';
@@ -29,65 +28,52 @@ let KpiStatisticListPage = class KpiStatisticListPage extends connect(store)(p13
29
28
  CommonGristStyles,
30
29
  CommonHeaderStyles,
31
30
  css `
32
- :host {
33
- display: flex;
31
+ :host { display: flex;
34
32
 
35
33
  width: 100%;
36
34
 
37
35
  --grid-record-emphasized-background-color: #8b0000;
38
36
  --grid-record-emphasized-color: #ff6b6b;
39
- }
37
+ }
40
38
 
41
- ox-grist {
42
- overflow-y: auto;
39
+ ox-grist { overflow-y: auto;
43
40
  flex: 1;
44
- }
41
+ }
45
42
 
46
- ox-filters-form {
47
- flex: 1;
48
- }
43
+ ox-filters-form { flex: 1;
44
+ }
49
45
  `
50
46
  ]; }
51
47
  static get scopedElements() {
52
- return {
53
- 'kpi-statistic-importer': KpiStatisticImporter
48
+ return { 'kpi-statistic-importer': KpiStatisticImporter
54
49
  };
55
50
  }
56
51
  get context() {
57
- return {
58
- title: i18next.t('title.kpi-statistic list'),
59
- search: {
60
- handler: (search) => {
52
+ return { title: i18next.t('title.kpi-statistic list'),
53
+ search: { handler: (search) => {
61
54
  this.grist.searchText = search;
62
55
  },
63
- value: this.grist.searchText
64
- },
65
- filter: {
66
- handler: () => {
56
+ value: this.grist.searchText },
57
+ filter: { handler: () => {
67
58
  this.grist.toggleHeadroom();
68
59
  }
69
60
  },
70
61
  help: 'kpi/kpi-statistic',
71
62
  actions: [
72
- {
73
- title: i18next.t('button.save'),
63
+ { title: i18next.t('button.save'),
74
64
  action: this._updateKpiStatistic.bind(this),
75
65
  ...CommonButtonStyles.save
76
66
  },
77
- {
78
- title: i18next.t('button.delete'),
67
+ { title: i18next.t('button.delete'),
79
68
  action: this._deleteKpiStatistic.bind(this),
80
69
  ...CommonButtonStyles.delete
81
70
  }
82
71
  ],
83
- exportable: {
84
- name: i18next.t('title.kpi-statistic list'),
72
+ exportable: { name: i18next.t('title.kpi-statistic list'),
85
73
  data: this.exportHandler.bind(this)
86
74
  },
87
- importable: {
88
- handler: this.importHandler.bind(this)
89
- }
90
- };
75
+ importable: { handler: this.importHandler.bind(this)
76
+ } };
91
77
  }
92
78
  render() {
93
79
  const mode = this.mode || (isMobileDevice() ? 'CARD' : 'GRID');
@@ -121,177 +107,140 @@ let KpiStatisticListPage = class KpiStatisticListPage extends connect(store)(p13
121
107
  `;
122
108
  }
123
109
  async pageInitialized(lifecycle) {
124
- this.gristConfig = {
125
- list: {
126
- fields: ['kpi', 'valueDate', 'periodType'],
110
+ this.gristConfig = { list: { fields: ['kpi', 'valueDate', 'periodType'],
127
111
  details: ['mean', 'median', 'count', 'updatedAt']
128
112
  },
129
113
  columns: [
130
114
  { type: 'gutter', gutterName: 'sequence' },
131
115
  { type: 'gutter', gutterName: 'row-selector', multiple: true },
132
- {
133
- type: 'resource-object',
116
+ { type: 'resource-object',
134
117
  name: 'kpi',
135
118
  header: i18next.t('field.kpi'),
136
- record: {
137
- editable: false
119
+ record: { editable: false
138
120
  },
139
121
  filter: 'search',
140
122
  sortable: true,
141
123
  width: 150
142
124
  },
143
- {
144
- type: 'string',
125
+ { type: 'string',
145
126
  name: 'valueDate',
146
127
  header: i18next.t('field.value_date'),
147
- record: {
148
- editable: true
128
+ record: { editable: true
149
129
  },
150
130
  filter: true,
151
131
  sortable: true,
152
132
  width: 120
153
133
  },
154
- {
155
- type: 'string',
134
+ { type: 'string',
156
135
  name: 'periodType',
157
136
  header: i18next.t('field.period_type'),
158
- record: {
159
- editable: true
137
+ record: { editable: true
160
138
  },
161
139
  filter: true,
162
140
  sortable: true,
163
141
  width: 100
164
142
  },
165
- {
166
- type: 'number',
143
+ { type: 'number',
167
144
  name: 'count',
168
145
  header: i18next.t('field.count'),
169
- record: {
170
- editable: false
146
+ record: { editable: false
171
147
  },
172
148
  sortable: true,
173
149
  width: 80
174
150
  },
175
- {
176
- type: 'number',
151
+ { type: 'number',
177
152
  name: 'mean',
178
153
  header: i18next.t('field.mean'),
179
- record: {
180
- editable: false
154
+ record: { editable: false
181
155
  },
182
156
  sortable: true,
183
157
  width: 100
184
158
  },
185
- {
186
- type: 'number',
159
+ { type: 'number',
187
160
  name: 'median',
188
161
  header: i18next.t('field.median'),
189
- record: {
190
- editable: false
162
+ record: { editable: false
191
163
  },
192
164
  sortable: true,
193
165
  width: 100
194
166
  },
195
- {
196
- type: 'number',
167
+ { type: 'number',
197
168
  name: 'minimum',
198
169
  header: i18next.t('field.minimum'),
199
- record: {
200
- editable: false
170
+ record: { editable: false
201
171
  },
202
172
  sortable: true,
203
173
  width: 100
204
174
  },
205
- {
206
- type: 'number',
175
+ { type: 'number',
207
176
  name: 'maximum',
208
177
  header: i18next.t('field.maximum'),
209
- record: {
210
- editable: false
178
+ record: { editable: false
211
179
  },
212
180
  sortable: true,
213
181
  width: 100
214
182
  },
215
- {
216
- type: 'number',
183
+ { type: 'number',
217
184
  name: 'standardDeviation',
218
185
  header: i18next.t('field.standard_deviation'),
219
- record: {
220
- editable: false
186
+ record: { editable: false
221
187
  },
222
188
  sortable: true,
223
189
  width: 120
224
190
  },
225
- {
226
- type: 'number',
191
+ { type: 'number',
227
192
  name: 'lowerFence',
228
193
  header: i18next.t('field.lower_fence'),
229
- record: {
230
- editable: false
194
+ record: { editable: false
231
195
  },
232
196
  sortable: true,
233
197
  width: 100
234
198
  },
235
- {
236
- type: 'number',
199
+ { type: 'number',
237
200
  name: 'upperFence',
238
201
  header: i18next.t('field.upper_fence'),
239
- record: {
240
- editable: false
202
+ record: { editable: false
241
203
  },
242
204
  sortable: true,
243
205
  width: 100
244
206
  },
245
- {
246
- type: 'resource-object',
207
+ { type: 'resource-object',
247
208
  name: 'updater',
248
209
  header: i18next.t('field.updater'),
249
- record: {
250
- editable: false
210
+ record: { editable: false
251
211
  },
252
212
  sortable: true,
253
213
  width: 120
254
214
  },
255
- {
256
- type: 'datetime',
215
+ { type: 'datetime',
257
216
  name: 'updatedAt',
258
217
  header: i18next.t('field.updated_at'),
259
- record: {
260
- editable: false
218
+ record: { editable: false
261
219
  },
262
220
  sortable: true,
263
221
  width: 180
264
222
  }
265
223
  ],
266
- rows: {
267
- appendable: false,
268
- selectable: {
269
- multiple: true
224
+ rows: { appendable: false,
225
+ selectable: { multiple: true
270
226
  }
271
227
  },
272
228
  sorters: [
273
- {
274
- name: 'kpi'
229
+ { name: 'kpi'
275
230
  }
276
231
  ]
277
232
  };
278
233
  }
279
234
  async pageUpdated(changes, lifecycle) {
280
- if (this.active) {
281
- // do something here when this page just became as active
235
+ if (this.active) { // do something here when this page just became as active
282
236
  }
283
237
  }
284
238
  async fetchHandler({ page = 1, limit = 100, sortings = [], filters = [] }) {
285
- const response = await client.query({
286
- query: gql `
287
- query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
288
- responses: kpiStatistics(filters: $filters, pagination: $pagination, sortings: $sortings) {
289
- items {
290
- id
291
- kpi {
292
- id
239
+ const response = await client.query({ query: gql `
240
+ query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) { responses: kpiStatistics(filters: $filters, pagination: $pagination, sortings: $sortings) { items { id
241
+ kpi { id
293
242
  name
294
- }
243
+ }
295
244
  valueDate
296
245
  periodType
297
246
  count
@@ -310,50 +259,42 @@ let KpiStatisticListPage = class KpiStatisticListPage extends connect(store)(p13
310
259
  upperFence
311
260
  additionalStatistics
312
261
  metadata
313
- updater {
314
- id
262
+ updater { id
315
263
  name
316
- }
264
+ }
317
265
  updatedAt
318
- }
266
+ }
319
267
  total
320
- }
321
- }
268
+ }
269
+ }
322
270
  `,
323
- variables: {
324
- filters,
271
+ variables: { filters,
325
272
  pagination: { page, limit },
326
273
  sortings
327
274
  }
328
275
  });
329
- return {
330
- total: response.data.responses.total || 0,
276
+ return { total: response.data.responses.total || 0,
331
277
  records: response.data.responses.items || []
332
278
  };
333
279
  }
334
280
  async _deleteKpiStatistic() {
335
- if (await OxPrompt.open({
336
- title: i18next.t('text.are_you_sure'),
281
+ if (await OxPrompt.open({ title: i18next.t('text.are_you_sure'),
337
282
  text: i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }),
338
283
  confirmButton: { text: i18next.t('button.confirm') },
339
284
  cancelButton: { text: i18next.t('button.cancel') }
340
285
  })) {
341
286
  const ids = this.grist.selected.map(record => record.id);
342
287
  if (ids && ids.length > 0) {
343
- const response = await client.mutate({
344
- mutation: gql `
345
- mutation ($ids: [String!]!) {
346
- deleteKpiStatistics(ids: $ids)
347
- }
288
+ const response = await client.mutate({ mutation: gql `
289
+ mutation ($ids: [String!]!) { deleteKpiStatistics(ids: $ids)
290
+ }
348
291
  `,
349
- variables: {
350
- ids
292
+ variables: { ids
351
293
  }
352
294
  });
353
295
  if (!response.errors) {
354
296
  this.grist.fetch();
355
- notify({
356
- message: i18next.t('text.info_x_successfully', { x: i18next.t('text.delete') })
297
+ notify({ message: i18next.t('text.info_x_successfully', { x: i18next.t('text.delete') })
357
298
  });
358
299
  }
359
300
  }
@@ -371,21 +312,16 @@ let KpiStatisticListPage = class KpiStatisticListPage extends connect(store)(p13
371
312
  patchField.cuFlag = patch.__dirty__;
372
313
  return patchField;
373
314
  });
374
- const response = await client.mutate({
375
- mutation: gql `
376
- mutation ($patches: [KpiStatisticPatch!]!) {
377
- updateMultipleKpiStatistic(patches: $patches) {
378
- kpi {
379
- id
315
+ const response = await client.mutate({ mutation: gql `
316
+ mutation ($patches: [KpiStatisticPatch!]!) { updateMultipleKpiStatistic(patches: $patches) { kpi { id
380
317
  name
381
- }
318
+ }
382
319
  valueDate
383
320
  periodType
384
- }
385
- }
321
+ }
322
+ }
386
323
  `,
387
- variables: {
388
- patches
324
+ variables: { patches
389
325
  }
390
326
  });
391
327
  if (!response.errors) {
@@ -395,26 +331,19 @@ let KpiStatisticListPage = class KpiStatisticListPage extends connect(store)(p13
395
331
  }
396
332
  async creationCallback(kpiStatistic) {
397
333
  try {
398
- const response = await client.query({
399
- query: gql `
400
- mutation ($kpiStatistic: NewKpiStatistic!) {
401
- createKpiStatistic(kpiStatistic: $kpiStatistic) {
402
- id
403
- }
404
- }
334
+ const response = await client.query({ query: gql `
335
+ mutation ($kpiStatistic: NewKpiStatistic!) { createKpiStatistic(kpiStatistic: $kpiStatistic) { id
336
+ }
337
+ }
405
338
  `,
406
- variables: {
407
- kpiStatistic
339
+ variables: { kpiStatistic
408
340
  },
409
- context: {
410
- hasUpload: true
341
+ context: { hasUpload: true
411
342
  }
412
343
  });
413
344
  if (!response.errors) {
414
345
  this.grist.fetch();
415
- document.dispatchEvent(new CustomEvent('notify', {
416
- detail: {
417
- message: i18next.t('text.data_created_successfully')
346
+ document.dispatchEvent(new CustomEvent('notify', { detail: { message: i18next.t('text.data_created_successfully')
418
347
  }
419
348
  }));
420
349
  }
@@ -422,9 +351,7 @@ let KpiStatisticListPage = class KpiStatisticListPage extends connect(store)(p13
422
351
  }
423
352
  catch (ex) {
424
353
  console.error(ex);
425
- document.dispatchEvent(new CustomEvent('notify', {
426
- detail: {
427
- type: 'error',
354
+ document.dispatchEvent(new CustomEvent('notify', { detail: { type: 'error',
428
355
  message: i18next.t('text.error')
429
356
  }
430
357
  }));
@@ -466,8 +393,7 @@ let KpiStatisticListPage = class KpiStatisticListPage extends connect(store)(p13
466
393
  this.grist.fetch();
467
394
  }}
468
395
  ></kpi-statistic-importer>
469
- `, {
470
- backdrop: true,
396
+ `, { backdrop: true,
471
397
  size: 'large',
472
398
  title: i18next.t('title.import kpi-statistic')
473
399
  });