@things-factory/integration-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.
@@ -11,7 +11,7 @@ import { HelpDecoratedRenderer } from '@operato/help/help-decorated-renderer.js'
11
11
  import { notify, openPopup } from '@operato/layout'
12
12
  import { i18next, localize } from '@operato/i18n'
13
13
  import { PageView } from '@operato/shell'
14
- import { CommonButtonStyles, CommonGristStyles, ScrollbarStyles } from '@operato/styles'
14
+ import { CommonButtonStyles, CommonGristStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles'
15
15
  import { isMobileDevice } from '@operato/utils'
16
16
  import { FetchOption } from '@operato/data-grist'
17
17
  import { p13n } from '@operato/p13n'
@@ -24,14 +24,11 @@ import {
24
24
 
25
25
  @customElement('connection-page')
26
26
  export class Connection extends p13n(localize(i18next)(PageView)) { static styles = [
27
+ /* The work surface frame for a list screen (ADR-0060 decision 8). */
28
+ WorkSurfacePageStyles,
27
29
  CommonGristStyles,
28
30
  ScrollbarStyles,
29
31
  css`
30
- :host { display: flex;
31
- flex-direction: column;
32
-
33
- overflow: hidden;
34
- }
35
32
 
36
33
  ox-grist { overflow-y: auto;
37
34
  flex: 1;
@@ -398,7 +395,7 @@ export class Connection extends p13n(localize(i18next)(PageView)) { static sty
398
395
  }
399
396
  }
400
397
 
401
- async _deleteConnections(name) { if (
398
+ async _deleteConnections() { if (
402
399
  await OxPrompt.confirmDelete({ count: this.grist?.selected?.length })
403
400
  ) { const names = this.grist.selected.map(record => record.name)
404
401
  if (names && names.length > 0) { const response = await client.mutate({ mutation: gql`
@@ -1,3 +1,5 @@
1
+ import '@operato/list-state/ox-page-state.js'
2
+
1
3
  import '../analysis/graph-viewer.js'
2
4
 
3
5
  import gql from 'graphql-tag'
@@ -7,7 +9,7 @@ import { customElement, query, state } from 'lit/decorators.js'
7
9
  import { client } from '@operato/graphql'
8
10
  import { i18next, localize } from '@operato/i18n'
9
11
  import { PageView } from '@operato/shell'
10
- import { ScrollbarStyles } from '@operato/styles'
12
+ import { ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles'
11
13
  import { GraphData, Node, Relationship } from '../analysis/graph-data.js'
12
14
  import { GraphViewer } from '../analysis/graph-viewer.js'
13
15
  import { GraphViewerStyles } from '../analysis/graph-viewer-style'
@@ -15,22 +17,16 @@ import { GraphViewerStyles } from '../analysis/graph-viewer-style'
15
17
  @customElement('integration-analysis')
16
18
  export class IntegrationAnalysis extends localize(i18next)(PageView) {
17
19
  static styles = [
20
+ /* The frame owns the page shell; the graph is the content it sizes (ADR-0060 decision 8). */
21
+ WorkSurfacePageStyles,
18
22
  GraphViewerStyles,
19
23
  ScrollbarStyles,
20
24
  css`
21
25
  :host {
22
26
  position: relative;
23
-
24
- display: flex;
25
- flex-direction: column;
26
-
27
- overflow: hidden;
28
- background-color: var(--md-sys-color-background);
29
- padding: 0;
30
27
  }
31
28
 
32
29
  [graph-container] {
33
- flex: 1;
34
30
  margin: 0;
35
31
  padding: 0;
36
32
  }
@@ -47,6 +43,8 @@ export class IntegrationAnalysis extends localize(i18next)(PageView) {
47
43
  @state() private graphViewer?: GraphViewer
48
44
  @state() private analysis?: { nodes: Node[]; relationships: Relationship[] }
49
45
  @state() private info?: { cls: string; property: string; value: string } | null
46
+ @state() private loaded = false
47
+ @state() private loadError: unknown = null
50
48
 
51
49
  @query('[graph-container]') container!: HTMLDivElement
52
50
  @query('[node-info]') nodeInfo!: HTMLAnchorElement
@@ -62,18 +60,34 @@ export class IntegrationAnalysis extends localize(i18next)(PageView) {
62
60
  }
63
61
 
64
62
  render() {
63
+ /*
64
+ * The graph is the whole screen. Reading and failing both drew an empty canvas, so a failed read
65
+ * looked like an integration with nothing in it (ADR-0060 decision 8).
66
+ */
67
+ return html`<ox-page-state
68
+ .loading=${!this.loaded && !this.loadError}
69
+ .error=${this.loadError}
70
+ @retry=${() => this.fetchIntegrationAnalysis()}
71
+ >${this.renderGraph()}</ox-page-state
72
+ >`
73
+ }
74
+
75
+ renderGraph() {
65
76
  const info = this.info
66
77
 
67
78
  return html`
68
79
  <div
69
80
  graph-container
81
+ class="page-fill"
70
82
  @node-mouseenter=${(e: CustomEvent) => console.log(e.detail)}
71
83
  @node-mouseleave=${(e: CustomEvent) => console.log(e.detail)}
72
84
  ></div>
73
85
  <div class="graph-info">
74
- ${info
75
- ? html`<a href="#" class="${info.cls}" node-info><strong>${info.property}</strong>${info.value}</a>`
76
- : nothing}
86
+ ${
87
+ info
88
+ ? html`<a href="#" class="${info.cls}" node-info><strong>${info.property}</strong>${info.value}</a>`
89
+ : nothing
90
+ }
77
91
  </div>
78
92
  `
79
93
  }
@@ -150,15 +164,26 @@ export class IntegrationAnalysis extends localize(i18next)(PageView) {
150
164
  }
151
165
 
152
166
  async fetchIntegrationAnalysis() {
153
- const response = await client.query({
154
- query: gql`
155
- query {
156
- integrationAnalysis
157
- }
158
- `
159
- })
167
+ this.loadError = null
168
+
169
+ try {
170
+ const response = await client.query({
171
+ query: gql`
172
+ query {
173
+ integrationAnalysis
174
+ }
175
+ `
176
+ })
160
177
 
161
- this.analysis = response.data.integrationAnalysis
178
+ if (response.errors?.length) {
179
+ throw response.errors[0]
180
+ }
181
+
182
+ this.loaded = true
183
+ this.analysis = response.data.integrationAnalysis
184
+ } catch (error) {
185
+ this.loadError = error
186
+ }
162
187
  }
163
188
 
164
189
  async onSearch(search: string) {
@@ -1,3 +1,5 @@
1
+ import '@operato/list-state/ox-page-state.js'
2
+
1
3
  import '../viewparts/monitoring-summary.js'
2
4
  import '../viewparts/pending-q-monitor.js'
3
5
  import '../viewparts/scenarios-monitor.js'
@@ -10,7 +12,7 @@ import { customElement, property, state } from 'lit/decorators.js'
10
12
  import { client, subscribe } from '@operato/graphql'
11
13
  import { i18next, localize } from '@operato/i18n'
12
14
  import { PageView, InheritedValueType } from '@operato/shell'
13
- import { ScrollbarStyles } from '@operato/styles'
15
+ import { ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles'
14
16
 
15
17
  function IS_SCENARIO_RUNNING(state) {
16
18
  return state && state !== 'UNLOADED'
@@ -36,14 +38,12 @@ export class IntegrationMonitor extends localize(i18next)(PageView) {
36
38
  static ScenarioInstanceStatus = ['READY', 'STARTED', 'STOPPED', 'HALTED']
37
39
 
38
40
  static styles = [
41
+ /* The frame owns the page shell; the two monitors are the content it sizes (ADR-0060 decision 8). */
42
+ WorkSurfacePageStyles,
39
43
  ScrollbarStyles,
40
44
  css`
45
+ /* The panels are bordered boxes, so they keep a gutter off the window edge. */
41
46
  :host {
42
- display: flex;
43
- flex-direction: column;
44
-
45
- overflow: hidden;
46
- background-color: var(--md-sys-color-background);
47
47
  padding: var(--spacing-large);
48
48
  }
49
49
 
@@ -52,7 +52,6 @@ export class IntegrationMonitor extends localize(i18next)(PageView) {
52
52
  }
53
53
 
54
54
  content {
55
- flex: 1;
56
55
  display: flex;
57
56
  flex-direction: row;
58
57
 
@@ -95,6 +94,9 @@ export class IntegrationMonitor extends localize(i18next)(PageView) {
95
94
  @property({ type: Array }) connections: any
96
95
  @property({ type: Object }) colorIndex: any
97
96
 
97
+ @state() loaded = false
98
+ @state() loadError: unknown = null
99
+
98
100
  scenarioInstanceStateSubscription: any
99
101
  scenarioQueueStateSubscription: any
100
102
  connectionStateSubscription: any
@@ -107,13 +109,24 @@ export class IntegrationMonitor extends localize(i18next)(PageView) {
107
109
  }
108
110
 
109
111
  render() {
112
+ /*
113
+ * Scenarios and connections are read before anything is drawn. Reading and failing both left the
114
+ * summary at zero and the panels empty, so a stopped server read as "nothing is running"
115
+ * (ADR-0060 decision 8).
116
+ */
117
+ return html`<ox-page-state .loading=${!this.loaded && !this.loadError} .error=${this.loadError} @retry=${this.load}>
118
+ ${this.renderMonitor()}
119
+ </ox-page-state>`
120
+ }
121
+
122
+ renderMonitor() {
110
123
  return html`
111
124
  <integration-summary
112
125
  .pendings=${this.pendings}
113
126
  .scenarios=${this.scenarios}
114
127
  .connections=${this.connections}
115
128
  ></integration-summary>
116
- <content>
129
+ <content class="page-fill">
117
130
  <scenarios-monitor
118
131
  .scenarios=${this.scenarios}
119
132
  .pendings=${this.pendings}
@@ -128,15 +141,26 @@ export class IntegrationMonitor extends localize(i18next)(PageView) {
128
141
  async pageUpdated(changes) {
129
142
  if ('active' in changes) {
130
143
  if (this.active) {
131
- await this.fetchScenarios()
132
- await this.fetchConnections()
133
- await this.startSubscribe()
144
+ await this.load()
134
145
  } else {
135
146
  await this.stopSubscribe()
136
147
  }
137
148
  }
138
149
  }
139
150
 
151
+ load = async () => {
152
+ this.loadError = null
153
+
154
+ try {
155
+ await this.fetchScenarios()
156
+ await this.fetchConnections()
157
+ await this.startSubscribe()
158
+ this.loaded = true
159
+ } catch (error) {
160
+ this.loadError = error
161
+ }
162
+ }
163
+
140
164
  async fetchScenarios() {
141
165
  const response = await client.query({
142
166
  query: gql`
@@ -183,6 +207,10 @@ export class IntegrationMonitor extends localize(i18next)(PageView) {
183
207
  }
184
208
  })
185
209
 
210
+ if (response.errors?.length) {
211
+ throw response.errors[0]
212
+ }
213
+
186
214
  var colorIndex = {}
187
215
  this.scenarios = (response.data.responses.items || []).map(scenario => {
188
216
  var color = toColor(scenario.id)
@@ -221,6 +249,10 @@ export class IntegrationMonitor extends localize(i18next)(PageView) {
221
249
  }
222
250
  })
223
251
 
252
+ if (response.errors?.length) {
253
+ throw response.errors[0]
254
+ }
255
+
224
256
  this.connections = response.data.responses.items || []
225
257
  // .map(connection => {
226
258
  // var color = toColor(scenario.id)
@@ -13,7 +13,7 @@ import { i18next, localize } from '@operato/i18n'
13
13
  import { notify, openPopup } from '@operato/layout'
14
14
  import { OxPrompt } from '@operato/popup/ox-prompt.js'
15
15
  import { navigate, PageView } from '@operato/shell'
16
- import { CommonButtonStyles, CommonGristStyles, ScrollbarStyles } from '@operato/styles'
16
+ import { CommonButtonStyles, CommonGristStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles'
17
17
  import { isMobileDevice } from '@operato/utils'
18
18
  import { FetchOption } from '@operato/data-grist'
19
19
  import { p13n } from '@operato/p13n'
@@ -23,18 +23,11 @@ function IS_SCENARIO_RUNNING(state) { return state && state !== 'UNLOADED'
23
23
 
24
24
  @customElement('scenario-page')
25
25
  export class Scenario extends p13n(localize(i18next)(PageView)) { static get styles() { return [
26
+ /* The work surface frame for a list screen (ADR-0060 decision 8). */
27
+ WorkSurfacePageStyles,
26
28
  CommonGristStyles,
27
29
  ScrollbarStyles,
28
30
  css`
29
- :host { display: flex;
30
- flex-direction: column;
31
-
32
- overflow: hidden;
33
- }
34
-
35
- ox-grist { overflow-y: auto;
36
- flex: 1;
37
- }
38
31
  `
39
32
  ]
40
33
  }
@@ -84,7 +77,7 @@ export class Scenario extends p13n(localize(i18next)(PageView)) { static get s
84
77
  }
85
78
 
86
79
  render() { return html`
87
- <ox-grist
80
+ <ox-grist class="page-fill"
88
81
  .mode=${isMobileDevice() ? 'LIST' : 'GRID'}
89
82
  .config=${this.gristConfig}
90
83
  .fetchHandler=${this.fetchHandler.bind(this)}
@@ -5,7 +5,7 @@ import { customElement, property, query } from 'lit/decorators.js'
5
5
  import gql from 'graphql-tag'
6
6
 
7
7
  import { PageView } from '@operato/shell'
8
- import { CommonHeaderStyles, CommonGristStyles, CommonButtonStyles, ScrollbarStyles } from '@operato/styles'
8
+ import { CommonHeaderStyles, CommonGristStyles, CommonButtonStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles'
9
9
  import { ColumnConfig, DataGrist, FetchOption, SortersControl } from '@operato/data-grist'
10
10
  import { client } from '@operato/graphql'
11
11
  import { i18next, localize } from '@operato/i18n'
@@ -16,21 +16,16 @@ import { p13n } from '@operato/p13n'
16
16
 
17
17
  @customElement('state-register-page')
18
18
  export class StateRegisterListPage extends p13n(localize(i18next)(PageView)) { static styles = [
19
+ /* The work surface frame for a list screen (ADR-0060 decision 8). */
20
+ WorkSurfacePageStyles,
19
21
  ScrollbarStyles,
20
22
  CommonGristStyles,
21
23
  CommonHeaderStyles,
22
24
  css`
23
- :host { display: flex;
24
-
25
- width: 100%;
26
-
25
+ :host {
27
26
  --grid-record-emphasized-background-color: #8b0000;
28
27
  --grid-record-emphasized-color: #ff6b6b;
29
- }
30
-
31
- ox-grist { overflow-y: auto;
32
- flex: 1;
33
- }
28
+ }
34
29
  `
35
30
  ]
36
31
 
@@ -61,7 +56,7 @@ export class StateRegisterListPage extends p13n(localize(i18next)(PageView)) {
61
56
  render() { const mode = this.mode || (isMobileDevice() ? 'CARD' : 'GRID')
62
57
 
63
58
  return html`
64
- <ox-grist
59
+ <ox-grist class="page-fill"
65
60
  .mode=${mode}
66
61
  .config=${this.gristConfig}
67
62
  .fetchHandler=${this.fetchHandler.bind(this)}
@@ -31,7 +31,7 @@ export declare class Connection extends Connection_base {
31
31
  danger: boolean;
32
32
  };
33
33
  title: string;
34
- action: (name: any) => Promise<void>;
34
+ action: () => Promise<void>;
35
35
  }[];
36
36
  exportable: {
37
37
  name: string;
@@ -54,7 +54,7 @@ export declare class Connection extends Connection_base {
54
54
  */
55
55
  _annotateReadiness(items: any[]): Promise<any[]>;
56
56
  fetchConnectors(): Promise<void>;
57
- _deleteConnections(name: any): Promise<void>;
57
+ _deleteConnections(): Promise<void>;
58
58
  _updateConnectionManager(): Promise<void>;
59
59
  connect(record: any): Promise<void>;
60
60
  disconnect(record: any): Promise<void>;
@@ -11,7 +11,7 @@ import { HelpDecoratedRenderer } from '@operato/help/help-decorated-renderer.js'
11
11
  import { notify, openPopup } from '@operato/layout';
12
12
  import { i18next, localize } from '@operato/i18n';
13
13
  import { PageView } from '@operato/shell';
14
- import { CommonButtonStyles, CommonGristStyles, ScrollbarStyles } from '@operato/styles';
14
+ import { CommonButtonStyles, CommonGristStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles';
15
15
  import { isMobileDevice } from '@operato/utils';
16
16
  import { p13n } from '@operato/p13n';
17
17
  import { createEnvVarActionInjector, diagnoseReadiness, resolveEnvVars } from '../viewparts/env-var-action-injector.js';
@@ -21,14 +21,11 @@ let Connection = class Connection extends p13n(localize(i18next)(PageView)) {
21
21
  this.active = false;
22
22
  }
23
23
  static { this.styles = [
24
+ /* The work surface frame for a list screen (ADR-0060 decision 8). */
25
+ WorkSurfacePageStyles,
24
26
  CommonGristStyles,
25
27
  ScrollbarStyles,
26
28
  css `
27
- :host { display: flex;
28
- flex-direction: column;
29
-
30
- overflow: hidden;
31
- }
32
29
 
33
30
  ox-grist { overflow-y: auto;
34
31
  flex: 1;
@@ -383,7 +380,7 @@ let Connection = class Connection extends p13n(localize(i18next)(PageView)) {
383
380
  console.error('fetch connectors error');
384
381
  }
385
382
  }
386
- async _deleteConnections(name) {
383
+ async _deleteConnections() {
387
384
  if (await OxPrompt.confirmDelete({ count: this.grist?.selected?.length })) {
388
385
  const names = this.grist.selected.map(record => record.name);
389
386
  if (names && names.length > 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../client/pages/connection.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-grist/ox-grist.js'\nimport './connection-importer.js'\n\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\nimport { OxPrompt } from '@operato/popup'\nimport { DataGrist } from '@operato/data-grist/ox-grist.js'\nimport { client } from '@operato/graphql'\nimport { HelpDecoratedRenderer } from '@operato/help/help-decorated-renderer.js'\nimport { notify, openPopup } from '@operato/layout'\nimport { i18next, localize } from '@operato/i18n'\nimport { PageView } from '@operato/shell'\nimport { CommonButtonStyles, CommonGristStyles, ScrollbarStyles } from '@operato/styles'\nimport { isMobileDevice } from '@operato/utils'\nimport { FetchOption } from '@operato/data-grist'\nimport { p13n } from '@operato/p13n'\nimport {\n createEnvVarActionInjector,\n diagnoseReadiness,\n resolveEnvVars\n} from '../viewparts/env-var-action-injector.js'\n\n\n@customElement('connection-page')\nexport class Connection extends p13n(localize(i18next)(PageView)) { static styles = [\n CommonGristStyles,\n ScrollbarStyles,\n css`\n :host { display: flex;\n flex-direction: column;\n\n overflow: hidden;\n }\n\n ox-grist { overflow-y: auto;\n flex: 1;\n }\n `\n ]\n\n @property({ type: Boolean }) active: boolean = false\n @property({ type: Object }) gristConfig: any\n @property({ type: Object }) connectors: any\n\n @query('ox-grist') grist!: DataGrist\n\n get context() { return { title: i18next.t('text.connection list'),\n search: { handler: search => { this.grist.searchText = search\n },\n value: this.grist?.searchText || ''\n },\n // 필터가 설정되면, 아래 코멘트 해제\n // filter: { // handler: () => { // const display = this.headroom.style.display\n // this.headroom.style.display = display !== 'none' ? 'none' : 'flex'\n // }\n // },\n help: 'integration/ui/connection',\n actions: [\n { title: i18next.t('button.save'),\n action: this._updateConnectionManager.bind(this),\n ...CommonButtonStyles.save\n },\n { title: i18next.t('button.delete'),\n action: this._deleteConnections.bind(this),\n ...CommonButtonStyles.delete\n }\n ],\n exportable: { name: i18next.t('text.connection list'),\n data: this.exportHandler.bind(this)\n },\n importable: { handler: this.importHandler.bind(this)\n }\n }\n }\n\n render() { return html`\n <ox-grist\n .mode=${isMobileDevice() ? 'LIST' : 'GRID'}\n .config=${this.gristConfig}\n .fetchHandler=${this.fetchHandler.bind(this)}\n .personalConfigProvider=${this.getPagePreferenceProvider('ox-grist')!}\n >\n <ox-grist-personalizer slot=\"setting\"></ox-grist-personalizer>\n </ox-grist>\n `\n }\n\n async pageInitialized() { this.fetchConnectors()\n\n this.gristConfig = { list: { fields: ['name', 'description', 'type', 'active'] },\n columns: [\n { type: 'gutter', gutterName: 'sequence' },\n { type: 'gutter', gutterName: 'row-selector', multiple: true },\n { type: 'gutter',\n gutterName: 'button',\n name: 'state',\n icon: record => (!record ? 'link' : !record.id ? '' : record.state == 'CONNECTED' ? 'link_off' : 'link'),\n iconOnly: false,\n title: record =>\n !record\n ? i18next.t('button.connect')\n : !record.id\n ? ''\n : record.state == 'CONNECTED'\n ? i18next.t('button.disconnect')\n : i18next.t('button.connect'),\n width: 80,\n handlers: { click: (columns, data, column, record, rowIndex) => { if (!record || !record.name || record.__dirty__ == '+') { return\n }\n if (record.state == 'CONNECTED') { this.disconnect(record)\n } else { this.connect(record)\n }\n }\n }\n },\n { type: 'object',\n name: 'domain',\n hidden: true\n },\n { type: 'string',\n name: 'name',\n label: true,\n header: i18next.t('field.name'),\n record: { editable: true,\n mandatory: true\n },\n filter: 'search',\n sortable: true,\n width: 150,\n validation: function (after, before, record, column) { /* connected 상태에서는 이름을 바꿀 수 없다. */\n if (record.state == 'CONNECTED') { notify({ level: 'warn',\n message: 'connection name cannot be changed during connected.'\n })\n return false\n }\n return true\n }\n },\n { type: 'string',\n name: 'description',\n label: true,\n header: i18next.t('field.description'),\n record: { editable: true\n },\n filter: 'search',\n width: 200\n },\n { type: 'checkbox',\n name: 'active',\n label: true,\n header: i18next.t('field.startup-connect'),\n record: { editable: true,\n align: 'center'\n },\n sortable: true,\n width: 60\n },\n { type: 'checkbox',\n name: 'onDemand',\n label: true,\n header: i18next.t('field.on-demand'),\n record: { editable: true\n },\n width: 120\n },\n {\n type: 'select',\n name: 'inheritanceMode',\n label: true,\n header: i18next.t('field.inheritance-mode') || '상속 모드',\n record: {\n editable: true,\n // GraphQL enum 이름 (대문자) 을 value 로 사용 — type-graphql registerEnumType 이\n // 노출하는 형식과 일치해야 함. 서버 내부 runtime 값('isolate'/'share') 으로의\n // 변환은 GraphQL 레이어가 자동.\n options: [\n { display: '(connector 기본)', value: null },\n { display: 'ISOLATE — 자식별 격리 인스턴스 (기본·안전)', value: 'ISOLATE' },\n { display: 'SHARE — 자식이 부모 인스턴스 공유', value: 'SHARE' }\n ]\n },\n // SHARE 의 의미는 select 옵션 라벨에 명시 (\"자식이 부모 인스턴스 공유\").\n // 운영자가 의식적으로 선택. native confirm() 차단 다이얼로그 제거 — 잘못 선택해도\n // 즉시 ISOLATE / (connector 기본) 으로 되돌릴 수 있음.\n width: 200\n },\n { type: 'connector',\n name: 'type',\n label: true,\n header: i18next.t('field.type'),\n record: { renderer: HelpDecoratedRenderer,\n editable: true,\n help: value => this.connectors?.[value]?.help,\n mandatory: true\n },\n filter: 'search',\n sortable: true,\n width: 200\n },\n { type: 'string',\n name: 'endpoint',\n header: i18next.t('field.endpoint'),\n record: { editable: true,\n mandatory: true\n },\n filter: 'search',\n sortable: true,\n width: 280\n },\n { type: 'parameters',\n name: 'params',\n header: i18next.t('field.params'),\n record: { editable: true,\n options: async (value, column, record, row, field) => { // 등록된 connector 가 아닌 type 을 가진 Connection 에서 디스트럭처 죽음을 막고,\n // 동시에 운영자가 데이터 측 문제를 인지할 수 있도록 콘솔 경고를 남김.\n let connectorEntry: any = null\n if (record.type) { connectorEntry = this.connectors?.[record.type] || null\n if (!connectorEntry && this.connectors) { console.warn(\n `[connection] connector type '${record.type}' (connection '${record.name}') is not registered. ` +\n `Server-side package missing or not bootstrapped.`\n )\n }\n }\n const { name, help, parameterSpec: spec } = connectorEntry || ({} as any)\n const context = this.grist\n\n // useDomainAttribute params 의 EnvVar 해소 상태 사전 조회\n const domainAttrParams = (Array.isArray(spec) ? spec : []).filter((p: any) => p?.useDomainAttribute && p?.name)\n const keys = domainAttrParams.map((p: any) => `Connection::${record.name}::${p.name}`)\n const resolutions = await resolveEnvVars(keys)\n\n return { name,\n help,\n spec,\n context,\n objectified: true,\n actionInjector: createEnvVarActionInjector(\n (propName: string) => `Connection::${record.name}::${propName}`,\n resolutions,\n () => this.grist.fetch()\n )\n }\n },\n renderer: 'json5'\n },\n width: 100\n },\n {\n type: 'string',\n name: '_readiness',\n header: i18next.t('field.domain-attribute-readiness') || '준비 상태',\n record: {\n editable: false,\n renderer: (_v: any, _c: any, r: any) => {\n const d = r?._readiness\n if (!d) return ''\n return d.label\n }\n },\n width: 180\n },\n { type: 'resource-object',\n name: 'edge',\n header: i18next.t('field.edge-server'),\n record: { editable: true,\n options: { queryName: 'edges'\n }\n },\n sortable: true,\n width: 120\n },\n { type: 'resource-object',\n name: 'updater',\n header: i18next.t('field.updater'),\n record: { editable: false\n },\n sortable: true,\n width: 120\n },\n { type: 'datetime',\n name: 'updatedAt',\n header: i18next.t('field.updated_at'),\n record: { editable: false\n },\n sortable: true,\n width: 180\n }\n ],\n rows: { selectable: { multiple: true\n }\n },\n sorters: [\n { name: 'name'\n }\n ]\n }\n }\n\n async fetchHandler({ page, limit, sortings = [], filters = [] }: FetchOption) { const response = await client.query({ query: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) { responses: connections(filters: $filters, pagination: $pagination, sortings: $sortings) { items { id\n domain { id\n name\n description\n }\n name\n description\n type\n edge { id\n name\n }\n endpoint\n active\n onDemand\n inheritanceMode\n state\n params\n updater { id\n name\n description\n }\n updatedAt\n }\n total\n }\n }\n `,\n variables: { filters,\n pagination: { page, limit },\n sortings\n }\n })\n\n const items = response.data.responses.items || []\n const records = await this._annotateReadiness(items)\n\n return { total: response.data.responses.total || 0,\n records\n }\n }\n\n /**\n * 한 페이지 분 connections 에 대해 useDomainAttribute params 키를 모두 모아 단일\n * envVarResolutions 호출로 해소한다. 그 후 각 connection 의 키 부분집합에 대해\n * diagnoseReadiness 로 _readiness 를 주입.\n */\n async _annotateReadiness(items: any[]): Promise<any[]> { if (!items || items.length === 0) return items\n if (!this.connectors) { // connectors 로딩 전 호출되었으면 일단 그대로\n return items\n }\n\n type ConnKeys = { conn: any; keys: string[] }\n const perConn: ConnKeys[] = []\n const allKeys: string[] = []\n\n for (const conn of items) { const connector = this.connectors[conn.type]\n const spec = Array.isArray(connector?.parameterSpec) ? connector.parameterSpec : []\n const keys = spec\n .filter((p: any) => p?.useDomainAttribute && p?.name)\n .map((p: any) => `Connection::${conn.name}::${p.name}`)\n perConn.push({ conn, keys })\n allKeys.push(...keys)\n }\n\n const uniqueKeys = Array.from(new Set(allKeys))\n const resolutions = await resolveEnvVars(uniqueKeys)\n\n return perConn.map(({ conn, keys }) => ({ ...conn,\n _readiness: diagnoseReadiness(resolutions, keys)\n }))\n }\n\n async fetchConnectors() { const response = await client.query({ query: gql`\n query { connectors { items { name\n help\n parameterSpec { type\n name\n label\n placeholder\n property\n styles\n useDomainAttribute\n }\n }\n }\n }\n `\n })\n\n if (!response.errors) { this.connectors = response.data.connectors.items.reduce((connectors, connector) => { connectors[connector.name] = connector\n return connectors\n }, {})\n\n // connectors 가 준비된 시점에 readiness 가 비어있다면 한 번 더 fetch\n if (this.grist?.dirtyData?.records?.some?.((r: any) => !r._readiness)) { this.grist.fetch()\n }\n } else { console.error('fetch connectors error')\n }\n }\n\n async _deleteConnections(name) { if (\n await OxPrompt.confirmDelete({ count: this.grist?.selected?.length })\n ) { const names = this.grist.selected.map(record => record.name)\n if (names && names.length > 0) { const response = await client.mutate({ mutation: gql`\n mutation ($names: [String!]!) { deleteConnections(names: $names)\n }\n `,\n variables: { names\n }\n })\n\n if (!response.errors) { this.grist.fetch()\n\n notify({ message: i18next.t('text.info_x_successfully', { x: i18next.t('text.delete')\n })\n })\n }\n }\n }\n }\n\n async _updateConnectionManager() { var patches = this.grist.dirtyRecords\n\n if (patches && patches.length) { patches = patches.map(connection => { let patchField: any = connection.id ? { id: connection.id } : {}\n const dirtyFields = connection.__dirtyfields__\n for (let key in dirtyFields) { patchField[key] = dirtyFields[key].after\n }\n patchField.cuFlag = connection.__dirty__\n\n return patchField\n })\n\n const response = await client.mutate({ mutation: gql`\n mutation ($patches: [ConnectionPatch!]!) { updateMultipleConnection(patches: $patches) { name\n }\n }\n `,\n variables: { patches\n }\n })\n\n if (!response.errors) this.grist.fetch()\n }\n }\n\n async connect(record) { var response = await client.mutate({ mutation: gql`\n mutation ($name: String!) { connectConnection(name: $name) { state\n }\n }\n `,\n variables: { name: record.name\n }\n })\n\n var state = response.data.connectConnection.state\n\n record.state = state\n\n this.grist.refresh()\n\n notify({ level: 'info',\n message: `${state == 'CONNECTED' ? 'success' : 'fail'} to connect : ${record.name}`\n })\n }\n\n async disconnect(record) { var response = await client.mutate({ mutation: gql`\n mutation ($name: String!) { disconnectConnection(name: $name) { state\n }\n }\n `,\n variables: { name: record.name\n }\n })\n\n var state = response.data.disconnectConnection.state\n\n record.state = state\n\n this.grist.refresh()\n\n notify({ level: 'info',\n message: `${state == 'CONNECTED' ? 'fail' : 'success'} to disconnect : ${record.name}`\n })\n }\n\n async exportHandler() { const exportTargets = this.grist.selected.length ? this.grist.selected : this.grist.dirtyData.records\n const targetFieldSet = new Set(['id', 'name', 'type', 'description', 'endpoint', 'params'])\n\n return exportTargets.map(connection => { let tempObj = {}\n for (const field of targetFieldSet) { tempObj[field] = connection[field]\n }\n\n return tempObj\n })\n }\n\n async importHandler(records) { openPopup(\n html`\n <connection-importer\n .connections=${records}\n @imported=${() => { history.back()\n this.grist.fetch()\n }}\n ></connection-importer>\n `,\n { backdrop: true,\n size: 'large',\n title: i18next.t('title.import connection')\n }\n )\n }\n}\n"]}
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../client/pages/connection.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-grist/ox-grist.js'\nimport './connection-importer.js'\n\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\nimport { OxPrompt } from '@operato/popup'\nimport { DataGrist } from '@operato/data-grist/ox-grist.js'\nimport { client } from '@operato/graphql'\nimport { HelpDecoratedRenderer } from '@operato/help/help-decorated-renderer.js'\nimport { notify, openPopup } from '@operato/layout'\nimport { i18next, localize } from '@operato/i18n'\nimport { PageView } from '@operato/shell'\nimport { CommonButtonStyles, CommonGristStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles'\nimport { isMobileDevice } from '@operato/utils'\nimport { FetchOption } from '@operato/data-grist'\nimport { p13n } from '@operato/p13n'\nimport {\n createEnvVarActionInjector,\n diagnoseReadiness,\n resolveEnvVars\n} from '../viewparts/env-var-action-injector.js'\n\n\n@customElement('connection-page')\nexport class Connection extends p13n(localize(i18next)(PageView)) { static styles = [\n /* The work surface frame for a list screen (ADR-0060 decision 8). */\n WorkSurfacePageStyles,\n CommonGristStyles,\n ScrollbarStyles,\n css`\n\n ox-grist { overflow-y: auto;\n flex: 1;\n }\n `\n ]\n\n @property({ type: Boolean }) active: boolean = false\n @property({ type: Object }) gristConfig: any\n @property({ type: Object }) connectors: any\n\n @query('ox-grist') grist!: DataGrist\n\n get context() { return { title: i18next.t('text.connection list'),\n search: { handler: search => { this.grist.searchText = search\n },\n value: this.grist?.searchText || ''\n },\n // 필터가 설정되면, 아래 코멘트 해제\n // filter: { // handler: () => { // const display = this.headroom.style.display\n // this.headroom.style.display = display !== 'none' ? 'none' : 'flex'\n // }\n // },\n help: 'integration/ui/connection',\n actions: [\n { title: i18next.t('button.save'),\n action: this._updateConnectionManager.bind(this),\n ...CommonButtonStyles.save\n },\n { title: i18next.t('button.delete'),\n action: this._deleteConnections.bind(this),\n ...CommonButtonStyles.delete\n }\n ],\n exportable: { name: i18next.t('text.connection list'),\n data: this.exportHandler.bind(this)\n },\n importable: { handler: this.importHandler.bind(this)\n }\n }\n }\n\n render() { return html`\n <ox-grist\n .mode=${isMobileDevice() ? 'LIST' : 'GRID'}\n .config=${this.gristConfig}\n .fetchHandler=${this.fetchHandler.bind(this)}\n .personalConfigProvider=${this.getPagePreferenceProvider('ox-grist')!}\n >\n <ox-grist-personalizer slot=\"setting\"></ox-grist-personalizer>\n </ox-grist>\n `\n }\n\n async pageInitialized() { this.fetchConnectors()\n\n this.gristConfig = { list: { fields: ['name', 'description', 'type', 'active'] },\n columns: [\n { type: 'gutter', gutterName: 'sequence' },\n { type: 'gutter', gutterName: 'row-selector', multiple: true },\n { type: 'gutter',\n gutterName: 'button',\n name: 'state',\n icon: record => (!record ? 'link' : !record.id ? '' : record.state == 'CONNECTED' ? 'link_off' : 'link'),\n iconOnly: false,\n title: record =>\n !record\n ? i18next.t('button.connect')\n : !record.id\n ? ''\n : record.state == 'CONNECTED'\n ? i18next.t('button.disconnect')\n : i18next.t('button.connect'),\n width: 80,\n handlers: { click: (columns, data, column, record, rowIndex) => { if (!record || !record.name || record.__dirty__ == '+') { return\n }\n if (record.state == 'CONNECTED') { this.disconnect(record)\n } else { this.connect(record)\n }\n }\n }\n },\n { type: 'object',\n name: 'domain',\n hidden: true\n },\n { type: 'string',\n name: 'name',\n label: true,\n header: i18next.t('field.name'),\n record: { editable: true,\n mandatory: true\n },\n filter: 'search',\n sortable: true,\n width: 150,\n validation: function (after, before, record, column) { /* connected 상태에서는 이름을 바꿀 수 없다. */\n if (record.state == 'CONNECTED') { notify({ level: 'warn',\n message: 'connection name cannot be changed during connected.'\n })\n return false\n }\n return true\n }\n },\n { type: 'string',\n name: 'description',\n label: true,\n header: i18next.t('field.description'),\n record: { editable: true\n },\n filter: 'search',\n width: 200\n },\n { type: 'checkbox',\n name: 'active',\n label: true,\n header: i18next.t('field.startup-connect'),\n record: { editable: true,\n align: 'center'\n },\n sortable: true,\n width: 60\n },\n { type: 'checkbox',\n name: 'onDemand',\n label: true,\n header: i18next.t('field.on-demand'),\n record: { editable: true\n },\n width: 120\n },\n {\n type: 'select',\n name: 'inheritanceMode',\n label: true,\n header: i18next.t('field.inheritance-mode') || '상속 모드',\n record: {\n editable: true,\n // GraphQL enum 이름 (대문자) 을 value 로 사용 — type-graphql registerEnumType 이\n // 노출하는 형식과 일치해야 함. 서버 내부 runtime 값('isolate'/'share') 으로의\n // 변환은 GraphQL 레이어가 자동.\n options: [\n { display: '(connector 기본)', value: null },\n { display: 'ISOLATE — 자식별 격리 인스턴스 (기본·안전)', value: 'ISOLATE' },\n { display: 'SHARE — 자식이 부모 인스턴스 공유', value: 'SHARE' }\n ]\n },\n // SHARE 의 의미는 select 옵션 라벨에 명시 (\"자식이 부모 인스턴스 공유\").\n // 운영자가 의식적으로 선택. native confirm() 차단 다이얼로그 제거 — 잘못 선택해도\n // 즉시 ISOLATE / (connector 기본) 으로 되돌릴 수 있음.\n width: 200\n },\n { type: 'connector',\n name: 'type',\n label: true,\n header: i18next.t('field.type'),\n record: { renderer: HelpDecoratedRenderer,\n editable: true,\n help: value => this.connectors?.[value]?.help,\n mandatory: true\n },\n filter: 'search',\n sortable: true,\n width: 200\n },\n { type: 'string',\n name: 'endpoint',\n header: i18next.t('field.endpoint'),\n record: { editable: true,\n mandatory: true\n },\n filter: 'search',\n sortable: true,\n width: 280\n },\n { type: 'parameters',\n name: 'params',\n header: i18next.t('field.params'),\n record: { editable: true,\n options: async (value, column, record, row, field) => { // 등록된 connector 가 아닌 type 을 가진 Connection 에서 디스트럭처 죽음을 막고,\n // 동시에 운영자가 데이터 측 문제를 인지할 수 있도록 콘솔 경고를 남김.\n let connectorEntry: any = null\n if (record.type) { connectorEntry = this.connectors?.[record.type] || null\n if (!connectorEntry && this.connectors) { console.warn(\n `[connection] connector type '${record.type}' (connection '${record.name}') is not registered. ` +\n `Server-side package missing or not bootstrapped.`\n )\n }\n }\n const { name, help, parameterSpec: spec } = connectorEntry || ({} as any)\n const context = this.grist\n\n // useDomainAttribute params 의 EnvVar 해소 상태 사전 조회\n const domainAttrParams = (Array.isArray(spec) ? spec : []).filter((p: any) => p?.useDomainAttribute && p?.name)\n const keys = domainAttrParams.map((p: any) => `Connection::${record.name}::${p.name}`)\n const resolutions = await resolveEnvVars(keys)\n\n return { name,\n help,\n spec,\n context,\n objectified: true,\n actionInjector: createEnvVarActionInjector(\n (propName: string) => `Connection::${record.name}::${propName}`,\n resolutions,\n () => this.grist.fetch()\n )\n }\n },\n renderer: 'json5'\n },\n width: 100\n },\n {\n type: 'string',\n name: '_readiness',\n header: i18next.t('field.domain-attribute-readiness') || '준비 상태',\n record: {\n editable: false,\n renderer: (_v: any, _c: any, r: any) => {\n const d = r?._readiness\n if (!d) return ''\n return d.label\n }\n },\n width: 180\n },\n { type: 'resource-object',\n name: 'edge',\n header: i18next.t('field.edge-server'),\n record: { editable: true,\n options: { queryName: 'edges'\n }\n },\n sortable: true,\n width: 120\n },\n { type: 'resource-object',\n name: 'updater',\n header: i18next.t('field.updater'),\n record: { editable: false\n },\n sortable: true,\n width: 120\n },\n { type: 'datetime',\n name: 'updatedAt',\n header: i18next.t('field.updated_at'),\n record: { editable: false\n },\n sortable: true,\n width: 180\n }\n ],\n rows: { selectable: { multiple: true\n }\n },\n sorters: [\n { name: 'name'\n }\n ]\n }\n }\n\n async fetchHandler({ page, limit, sortings = [], filters = [] }: FetchOption) { const response = await client.query({ query: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) { responses: connections(filters: $filters, pagination: $pagination, sortings: $sortings) { items { id\n domain { id\n name\n description\n }\n name\n description\n type\n edge { id\n name\n }\n endpoint\n active\n onDemand\n inheritanceMode\n state\n params\n updater { id\n name\n description\n }\n updatedAt\n }\n total\n }\n }\n `,\n variables: { filters,\n pagination: { page, limit },\n sortings\n }\n })\n\n const items = response.data.responses.items || []\n const records = await this._annotateReadiness(items)\n\n return { total: response.data.responses.total || 0,\n records\n }\n }\n\n /**\n * 한 페이지 분 connections 에 대해 useDomainAttribute params 키를 모두 모아 단일\n * envVarResolutions 호출로 해소한다. 그 후 각 connection 의 키 부분집합에 대해\n * diagnoseReadiness 로 _readiness 를 주입.\n */\n async _annotateReadiness(items: any[]): Promise<any[]> { if (!items || items.length === 0) return items\n if (!this.connectors) { // connectors 로딩 전 호출되었으면 일단 그대로\n return items\n }\n\n type ConnKeys = { conn: any; keys: string[] }\n const perConn: ConnKeys[] = []\n const allKeys: string[] = []\n\n for (const conn of items) { const connector = this.connectors[conn.type]\n const spec = Array.isArray(connector?.parameterSpec) ? connector.parameterSpec : []\n const keys = spec\n .filter((p: any) => p?.useDomainAttribute && p?.name)\n .map((p: any) => `Connection::${conn.name}::${p.name}`)\n perConn.push({ conn, keys })\n allKeys.push(...keys)\n }\n\n const uniqueKeys = Array.from(new Set(allKeys))\n const resolutions = await resolveEnvVars(uniqueKeys)\n\n return perConn.map(({ conn, keys }) => ({ ...conn,\n _readiness: diagnoseReadiness(resolutions, keys)\n }))\n }\n\n async fetchConnectors() { const response = await client.query({ query: gql`\n query { connectors { items { name\n help\n parameterSpec { type\n name\n label\n placeholder\n property\n styles\n useDomainAttribute\n }\n }\n }\n }\n `\n })\n\n if (!response.errors) { this.connectors = response.data.connectors.items.reduce((connectors, connector) => { connectors[connector.name] = connector\n return connectors\n }, {})\n\n // connectors 가 준비된 시점에 readiness 가 비어있다면 한 번 더 fetch\n if (this.grist?.dirtyData?.records?.some?.((r: any) => !r._readiness)) { this.grist.fetch()\n }\n } else { console.error('fetch connectors error')\n }\n }\n\n async _deleteConnections() { if (\n await OxPrompt.confirmDelete({ count: this.grist?.selected?.length })\n ) { const names = this.grist.selected.map(record => record.name)\n if (names && names.length > 0) { const response = await client.mutate({ mutation: gql`\n mutation ($names: [String!]!) { deleteConnections(names: $names)\n }\n `,\n variables: { names\n }\n })\n\n if (!response.errors) { this.grist.fetch()\n\n notify({ message: i18next.t('text.info_x_successfully', { x: i18next.t('text.delete')\n })\n })\n }\n }\n }\n }\n\n async _updateConnectionManager() { var patches = this.grist.dirtyRecords\n\n if (patches && patches.length) { patches = patches.map(connection => { let patchField: any = connection.id ? { id: connection.id } : {}\n const dirtyFields = connection.__dirtyfields__\n for (let key in dirtyFields) { patchField[key] = dirtyFields[key].after\n }\n patchField.cuFlag = connection.__dirty__\n\n return patchField\n })\n\n const response = await client.mutate({ mutation: gql`\n mutation ($patches: [ConnectionPatch!]!) { updateMultipleConnection(patches: $patches) { name\n }\n }\n `,\n variables: { patches\n }\n })\n\n if (!response.errors) this.grist.fetch()\n }\n }\n\n async connect(record) { var response = await client.mutate({ mutation: gql`\n mutation ($name: String!) { connectConnection(name: $name) { state\n }\n }\n `,\n variables: { name: record.name\n }\n })\n\n var state = response.data.connectConnection.state\n\n record.state = state\n\n this.grist.refresh()\n\n notify({ level: 'info',\n message: `${state == 'CONNECTED' ? 'success' : 'fail'} to connect : ${record.name}`\n })\n }\n\n async disconnect(record) { var response = await client.mutate({ mutation: gql`\n mutation ($name: String!) { disconnectConnection(name: $name) { state\n }\n }\n `,\n variables: { name: record.name\n }\n })\n\n var state = response.data.disconnectConnection.state\n\n record.state = state\n\n this.grist.refresh()\n\n notify({ level: 'info',\n message: `${state == 'CONNECTED' ? 'fail' : 'success'} to disconnect : ${record.name}`\n })\n }\n\n async exportHandler() { const exportTargets = this.grist.selected.length ? this.grist.selected : this.grist.dirtyData.records\n const targetFieldSet = new Set(['id', 'name', 'type', 'description', 'endpoint', 'params'])\n\n return exportTargets.map(connection => { let tempObj = {}\n for (const field of targetFieldSet) { tempObj[field] = connection[field]\n }\n\n return tempObj\n })\n }\n\n async importHandler(records) { openPopup(\n html`\n <connection-importer\n .connections=${records}\n @imported=${() => { history.back()\n this.grist.fetch()\n }}\n ></connection-importer>\n `,\n { backdrop: true,\n size: 'large',\n title: i18next.t('title.import connection')\n }\n )\n }\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import '@operato/list-state/ox-page-state.js';
1
2
  import '../analysis/graph-viewer.js';
2
3
  import { PageView } from '@operato/shell';
3
4
  declare const IntegrationAnalysis_base: (new (...args: any[]) => import("lit").LitElement) & typeof PageView;
@@ -6,6 +7,8 @@ export declare class IntegrationAnalysis extends IntegrationAnalysis_base {
6
7
  private graphViewer?;
7
8
  private analysis?;
8
9
  private info?;
10
+ private loaded;
11
+ private loadError;
9
12
  container: HTMLDivElement;
10
13
  nodeInfo: HTMLAnchorElement;
11
14
  get context(): {
@@ -16,6 +19,7 @@ export declare class IntegrationAnalysis extends IntegrationAnalysis_base {
16
19
  help: string;
17
20
  };
18
21
  render(): import("lit-html").TemplateResult<1>;
22
+ renderGraph(): import("lit-html").TemplateResult<1>;
19
23
  updated(changes: any): void;
20
24
  pageUpdated(changes: any): Promise<void>;
21
25
  fetchIntegrationAnalysis(): Promise<void>;