@things-factory/integration-ui 10.1.111 → 10.1.116

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.
@@ -227,9 +227,16 @@ export class Connection extends p13n(localize(i18next)(PageView)) { static sty
227
227
  const keys = domainAttrParams.map((p: any) => `Connection::${record.name}::${p.name}`)
228
228
  const resolutions = await resolveEnvVars(keys)
229
229
 
230
+ /* A secret still stored in params is not sent (ADR-0112): its hint shows as the placeholder, so the
231
+ * field reads as in use, and saving sends nothing back - a placeholder is not a value. */
232
+ const hints = record.secretHints || {}
233
+ const shownSpec = Array.isArray(spec)
234
+ ? spec.map((p: any) => (p?.type === 'secret' && hints[p.name] ? { ...p, placeholder: hints[p.name] } : p))
235
+ : spec
236
+
230
237
  return { name,
231
238
  help,
232
- spec,
239
+ spec: shownSpec,
233
240
  context,
234
241
  objectified: true,
235
242
  actionInjector: createEnvVarActionInjector(
@@ -312,6 +319,7 @@ export class Connection extends p13n(localize(i18next)(PageView)) { static sty
312
319
  inheritanceMode
313
320
  state
314
321
  params
322
+ secretHints
315
323
  updater { id
316
324
  name
317
325
  description
@@ -15,6 +15,7 @@ export interface EnvVarResolution {
15
15
  sourceDomainId?: string
16
16
  sourceDomainName?: string
17
17
  value?: string
18
+ valueHint?: string
18
19
  hasValue?: boolean
19
20
  }
20
21
 
@@ -37,6 +38,7 @@ export async function resolveEnvVars(keys: string[]): Promise<Map<string, EnvVar
37
38
  sourceDomainId
38
39
  sourceDomainName
39
40
  value
41
+ valueHint
40
42
  hasValue
41
43
  }
42
44
  }
@@ -109,6 +111,11 @@ function buildStatusChip(
109
111
  bg = 'var(--md-sys-color-error-container)'
110
112
  }
111
113
 
114
+ /* A withheld secret shows the part the server lets out (ADR-0112), so the set value can be told apart. */
115
+ if (status !== 'absent' && resolution?.valueHint) {
116
+ label = `${label} · ${resolution.valueHint}`
117
+ }
118
+
112
119
  chip.style.color = fg
113
120
  chip.style.background = bg
114
121
  chip.style.borderColor = fg
@@ -17,6 +17,7 @@ interface Resolution {
17
17
  envVarId?: string
18
18
  sourceDomainName?: string
19
19
  value?: string
20
+ valueHint?: string
20
21
  hasValue?: boolean
21
22
  }
22
23
 
@@ -172,8 +173,17 @@ export class EnvVarQuickEditor extends localize(i18next)(LitElement) {
172
173
  this.editedValue = this.resolution?.value ?? ''
173
174
  }
174
175
 
176
+ /** The server sends no value for a secret (ADR-0112) - only that one is set. */
177
+ private get valueWithheld(): boolean {
178
+ return Boolean(this.resolution?.hasValue) && (this.resolution?.value === undefined || this.resolution?.value === null)
179
+ }
180
+
175
181
  private get isSecret(): boolean {
176
- return this.propSpec?.type === 'secret' || /password|secret|token|key$/i.test(this.propLabel || '')
182
+ return (
183
+ this.valueWithheld ||
184
+ this.propSpec?.type === 'secret' ||
185
+ /password|secret|token|key$/i.test(this.propLabel || '')
186
+ )
177
187
  }
178
188
 
179
189
  /**
@@ -288,6 +298,7 @@ export class EnvVarQuickEditor extends localize(i18next)(LitElement) {
288
298
  <input
289
299
  part="secret-input"
290
300
  type="password"
301
+ placeholder=${this.valueWithheld ? this.resolution?.valueHint || '••••' : ''}
291
302
  .value=${this.editedValue}
292
303
  @input=${(e: any) => (this.editedValue = e.target.value)}
293
304
  ?disabled=${this.busy}
@@ -221,9 +221,15 @@ let Connection = class Connection extends p13n(localize(i18next)(PageView)) {
221
221
  const domainAttrParams = (Array.isArray(spec) ? spec : []).filter((p) => p?.useDomainAttribute && p?.name);
222
222
  const keys = domainAttrParams.map((p) => `Connection::${record.name}::${p.name}`);
223
223
  const resolutions = await resolveEnvVars(keys);
224
+ /* A secret still stored in params is not sent (ADR-0112): its hint shows as the placeholder, so the
225
+ * field reads as in use, and saving sends nothing back - a placeholder is not a value. */
226
+ const hints = record.secretHints || {};
227
+ const shownSpec = Array.isArray(spec)
228
+ ? spec.map((p) => (p?.type === 'secret' && hints[p.name] ? { ...p, placeholder: hints[p.name] } : p))
229
+ : spec;
224
230
  return { name,
225
231
  help,
226
- spec,
232
+ spec: shownSpec,
227
233
  context,
228
234
  objectified: true,
229
235
  actionInjector: createEnvVarActionInjector((propName) => `Connection::${record.name}::${propName}`, resolutions, () => this.grist.fetch())
@@ -300,6 +306,7 @@ let Connection = class Connection extends p13n(localize(i18next)(PageView)) {
300
306
  inheritanceMode
301
307
  state
302
308
  params
309
+ secretHints
303
310
  updater { id
304
311
  name
305
312
  description
@@ -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, 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
+ {"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 /* A secret still stored in params is not sent (ADR-0112): its hint shows as the placeholder, so the\n * field reads as in use, and saving sends nothing back - a placeholder is not a value. */\n const hints = record.secretHints || {}\n const shownSpec = Array.isArray(spec)\n ? spec.map((p: any) => (p?.type === 'secret' && hints[p.name] ? { ...p, placeholder: hints[p.name] } : p))\n : spec\n\n return { name,\n help,\n spec: shownSpec,\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 secretHints\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"]}