@things-factory/auth-ui 10.0.0-beta.9 → 10.0.0-beta.95

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.
@@ -0,0 +1,259 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import '@material/web/icon/icon.js';
3
+ import '@material/web/button/elevated-button.js';
4
+ import '@operato/data-grist/ox-grist.js';
5
+ import '@operato/context/ox-context-page-toolbar.js';
6
+ import '../../components/add-domain-owner-popup.js';
7
+ import gql from 'graphql-tag';
8
+ import { css, html } from 'lit';
9
+ import { customElement, property, query, state } from 'lit/decorators.js';
10
+ import { DataGrist } from '@operato/data-grist/ox-grist.js';
11
+ import { client, gqlContext } from '@operato/graphql';
12
+ import { i18next, localize } from '@operato/i18n';
13
+ import { openPopup } from '@operato/layout';
14
+ import { PageView, store } from '@operato/shell';
15
+ import { OxPrompt } from '@operato/popup/ox-prompt.js';
16
+ import { CommonHeaderStyles, CommonGristStyles, ScrollbarStyles } from '@operato/styles';
17
+ import { isMobileDevice } from '@operato/utils';
18
+ import { p13n } from '@operato/p13n';
19
+ /**
20
+ * Domain Owners Management Page
21
+ *
22
+ * 현재 도메인의 owner 목록을 표시하고, 추가/제거를 관리한다.
23
+ * 멀티 오너 지원 — 모든 owner는 동등한 권한을 가짐 (primary 없음).
24
+ * Domain.owner legacy cache 필드는 대표 owner 표시용으로 유지됨.
25
+ */
26
+ let DomainOwnerManagement = class DomainOwnerManagement extends p13n(localize(i18next)(PageView)) {
27
+ constructor() {
28
+ super(...arguments);
29
+ this.active = false;
30
+ this.mode = isMobileDevice() ? 'CARD' : 'GRID';
31
+ this.isDomainOwner = false;
32
+ }
33
+ static { this.styles = [
34
+ CommonGristStyles,
35
+ CommonHeaderStyles,
36
+ ScrollbarStyles,
37
+ css `
38
+ :host {
39
+ display: flex;
40
+ flex-direction: column;
41
+ overflow: hidden;
42
+ }
43
+ ox-grist {
44
+ overflow-y: auto;
45
+ flex: 1;
46
+ }
47
+ `
48
+ ]; }
49
+ get context() {
50
+ return {
51
+ title: i18next.t('text.domain owners'),
52
+ help: 'auth/domain-owners',
53
+ // 서버의 @privilege 가 최종 게이트. 버튼 표시/숨김은 isDomainOwner
54
+ // 클라이언트 플래그에 의존하지 않음 — auth profile 이 해당 플래그를
55
+ // 제대로 세팅 안 했을 때 버튼이 사라져 조작 불가 상태가 되는 것을 방지.
56
+ actions: [
57
+ {
58
+ title: i18next.t('button.add'),
59
+ action: this._onAddOwner.bind(this),
60
+ icon: 'person_add'
61
+ }
62
+ ],
63
+ toolbar: false
64
+ };
65
+ }
66
+ render() {
67
+ return html `
68
+ <ox-grist
69
+ .mode=${this.mode}
70
+ .config=${this.config}
71
+ .fetchHandler=${this._fetchHandler.bind(this)}
72
+ .personalConfigProvider=${this.getPagePreferenceProvider('ox-grist')}
73
+ >
74
+ <div slot="headroom" class="header">
75
+ <ox-context-page-toolbar class="actions" .context=${this.context}></ox-context-page-toolbar>
76
+ </div>
77
+ </ox-grist>
78
+ `;
79
+ }
80
+ async pageInitialized() {
81
+ this.config = {
82
+ rows: { appendable: false, selectable: { multiple: false } },
83
+ columns: [
84
+ { type: 'gutter', gutterName: 'sequence' },
85
+ {
86
+ type: 'gutter',
87
+ gutterName: 'button',
88
+ icon: 'person_remove',
89
+ title: i18next.t('button.remove owner'),
90
+ handlers: {
91
+ click: (_columns, _data, _column, record, _rowIndex) => {
92
+ // 클라이언트 게이트 없음 — 서버의 @privilege(domainOwnerGranted:true)
93
+ // 가 최종 authoritative. 오너 아니면 서버 에러를 프롬프트로 표시.
94
+ if (record?.user) {
95
+ this._onRemoveOwner(record);
96
+ }
97
+ }
98
+ }
99
+ },
100
+ {
101
+ type: 'string',
102
+ name: 'userName',
103
+ header: i18next.t('field.name'),
104
+ record: { editable: false },
105
+ width: 180
106
+ },
107
+ {
108
+ type: 'string',
109
+ name: 'userEmail',
110
+ header: i18next.t('field.email'),
111
+ record: { editable: false },
112
+ width: 220
113
+ },
114
+ {
115
+ type: 'string',
116
+ name: 'reason',
117
+ header: i18next.t('field.reason'),
118
+ record: { editable: false },
119
+ width: 220
120
+ },
121
+ {
122
+ type: 'string',
123
+ name: 'grantedByName',
124
+ header: i18next.t('field.granted by'),
125
+ record: { editable: false },
126
+ width: 160
127
+ },
128
+ {
129
+ type: 'datetime',
130
+ name: 'grantedAt',
131
+ header: i18next.t('field.granted at'),
132
+ width: 180
133
+ }
134
+ ]
135
+ };
136
+ }
137
+ async pageUpdated(_changes, _lifecycle) {
138
+ if (this.active) {
139
+ this._refreshPermissions();
140
+ await this.updateComplete;
141
+ this.grist.fetch();
142
+ }
143
+ }
144
+ _refreshPermissions() {
145
+ const __state__ = store.getState();
146
+ const me = __state__.auth?.user || {};
147
+ this.isDomainOwner = !!me.domainOwner || !!me.super;
148
+ }
149
+ async _fetchHandler() {
150
+ const response = await client.query({
151
+ query: gql `
152
+ query {
153
+ domainOwners {
154
+ id
155
+ user {
156
+ id
157
+ name
158
+ email
159
+ username
160
+ }
161
+ grantedBy {
162
+ id
163
+ name
164
+ email
165
+ }
166
+ grantedAt
167
+ reason
168
+ }
169
+ }
170
+ `,
171
+ context: gqlContext(),
172
+ fetchPolicy: 'network-only'
173
+ });
174
+ const items = (response.data?.domainOwners || []).map((ow) => ({
175
+ ...ow,
176
+ userName: ow.user?.name,
177
+ userEmail: ow.user?.email,
178
+ grantedByName: ow.grantedBy?.name || ''
179
+ }));
180
+ return { total: items.length, records: items };
181
+ }
182
+ _onAddOwner() {
183
+ openPopup(html `
184
+ <add-domain-owner-popup
185
+ @domain-owner-added=${() => {
186
+ this.grist.fetch();
187
+ this._notify(i18next.t('text.domain owner added successfully'));
188
+ }}
189
+ ></add-domain-owner-popup>
190
+ `, {
191
+ size: 'small',
192
+ title: i18next.t('title.add domain owner')
193
+ });
194
+ }
195
+ async _onRemoveOwner(record) {
196
+ const username = record.user?.username || record.user?.email;
197
+ const displayName = record.user?.name || username;
198
+ const confirmed = await OxPrompt.open({
199
+ type: 'warning',
200
+ title: i18next.t('text.are_you_sure'),
201
+ text: i18next.t('text.are_you_sure_to_remove_domain_owner', { x: displayName }),
202
+ confirmButton: { text: i18next.t('button.remove owner') },
203
+ cancelButton: { text: i18next.t('button.cancel') }
204
+ });
205
+ if (!confirmed)
206
+ return;
207
+ try {
208
+ const response = await client.mutate({
209
+ mutation: gql `
210
+ mutation removeDomainOwner($username: String!) {
211
+ removeDomainOwner(username: $username)
212
+ }
213
+ `,
214
+ variables: { username },
215
+ context: gqlContext()
216
+ });
217
+ if (!response.errors?.length) {
218
+ this._notify(i18next.t('text.domain owner removed successfully'));
219
+ this.grist.fetch();
220
+ }
221
+ }
222
+ catch (err) {
223
+ await OxPrompt.open({
224
+ type: 'error',
225
+ title: i18next.t('text.failed'),
226
+ text: err?.message || String(err),
227
+ confirmButton: { text: i18next.t('button.confirm') }
228
+ });
229
+ }
230
+ }
231
+ _notify(message) {
232
+ document.dispatchEvent(new CustomEvent('notify', { detail: { message, option: { timer: 1500 } } }));
233
+ }
234
+ };
235
+ __decorate([
236
+ property({ type: Boolean }),
237
+ __metadata("design:type", Boolean)
238
+ ], DomainOwnerManagement.prototype, "active", void 0);
239
+ __decorate([
240
+ property({ type: Object }),
241
+ __metadata("design:type", Object)
242
+ ], DomainOwnerManagement.prototype, "config", void 0);
243
+ __decorate([
244
+ property({ type: String }),
245
+ __metadata("design:type", String)
246
+ ], DomainOwnerManagement.prototype, "mode", void 0);
247
+ __decorate([
248
+ state(),
249
+ __metadata("design:type", Boolean)
250
+ ], DomainOwnerManagement.prototype, "isDomainOwner", void 0);
251
+ __decorate([
252
+ query('ox-grist'),
253
+ __metadata("design:type", DataGrist)
254
+ ], DomainOwnerManagement.prototype, "grist", void 0);
255
+ DomainOwnerManagement = __decorate([
256
+ customElement('domain-owner-management')
257
+ ], DomainOwnerManagement);
258
+ export { DomainOwnerManagement };
259
+ //# sourceMappingURL=domain-owner-management.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-owner-management.js","sourceRoot":"","sources":["../../../client/pages/domain-owner/domain-owner-management.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@material/web/button/elevated-button.js'\n\nimport '@operato/data-grist/ox-grist.js'\nimport '@operato/context/ox-context-page-toolbar.js'\n\nimport '../../components/add-domain-owner-popup.js'\n\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\n\nimport { DataGrist } from '@operato/data-grist/ox-grist.js'\nimport { client, gqlContext } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { openPopup } from '@operato/layout'\nimport { PageView, store } from '@operato/shell'\nimport { OxPrompt } from '@operato/popup/ox-prompt.js'\nimport { CommonHeaderStyles, CommonGristStyles, ScrollbarStyles } from '@operato/styles'\nimport { isMobileDevice } from '@operato/utils'\nimport { p13n } from '@operato/p13n'\n\n/**\n * Domain Owners Management Page\n *\n * 현재 도메인의 owner 목록을 표시하고, 추가/제거를 관리한다.\n * 멀티 오너 지원 — 모든 owner는 동등한 권한을 가짐 (primary 없음).\n * Domain.owner legacy cache 필드는 대표 owner 표시용으로 유지됨.\n */\n@customElement('domain-owner-management')\nexport class DomainOwnerManagement extends p13n(localize(i18next)(PageView)) {\n static styles = [\n CommonGristStyles,\n CommonHeaderStyles,\n ScrollbarStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n ox-grist {\n overflow-y: auto;\n flex: 1;\n }\n `\n ]\n\n @property({ type: Boolean }) active: boolean = false\n @property({ type: Object }) config: any\n @property({ type: String }) mode: 'CARD' | 'LIST' | 'GRID' = isMobileDevice() ? 'CARD' : 'GRID'\n\n @state() private isDomainOwner: boolean = false\n\n @query('ox-grist') private grist!: DataGrist\n\n get context() {\n return {\n title: i18next.t('text.domain owners'),\n help: 'auth/domain-owners',\n // 서버의 @privilege 가 최종 게이트. 버튼 표시/숨김은 isDomainOwner\n // 클라이언트 플래그에 의존하지 않음 — auth profile 이 해당 플래그를\n // 제대로 세팅 안 했을 때 버튼이 사라져 조작 불가 상태가 되는 것을 방지.\n actions: [\n {\n title: i18next.t('button.add'),\n action: this._onAddOwner.bind(this),\n icon: 'person_add'\n }\n ],\n toolbar: false\n }\n }\n\n render() {\n return html`\n <ox-grist\n .mode=${this.mode}\n .config=${this.config}\n .fetchHandler=${this._fetchHandler.bind(this)}\n .personalConfigProvider=${this.getPagePreferenceProvider('ox-grist')!}\n >\n <div slot=\"headroom\" class=\"header\">\n <ox-context-page-toolbar class=\"actions\" .context=${this.context}></ox-context-page-toolbar>\n </div>\n </ox-grist>\n `\n }\n\n async pageInitialized() {\n this.config = {\n rows: { appendable: false, selectable: { multiple: false } },\n columns: [\n { type: 'gutter', gutterName: 'sequence' },\n {\n type: 'gutter',\n gutterName: 'button',\n icon: 'person_remove',\n title: i18next.t('button.remove owner'),\n handlers: {\n click: (_columns, _data, _column, record, _rowIndex) => {\n // 클라이언트 게이트 없음 — 서버의 @privilege(domainOwnerGranted:true)\n // 가 최종 authoritative. 오너 아니면 서버 에러를 프롬프트로 표시.\n if (record?.user) {\n this._onRemoveOwner(record)\n }\n }\n }\n },\n {\n type: 'string',\n name: 'userName',\n header: i18next.t('field.name'),\n record: { editable: false },\n width: 180\n },\n {\n type: 'string',\n name: 'userEmail',\n header: i18next.t('field.email'),\n record: { editable: false },\n width: 220\n },\n {\n type: 'string',\n name: 'reason',\n header: i18next.t('field.reason'),\n record: { editable: false },\n width: 220\n },\n {\n type: 'string',\n name: 'grantedByName',\n header: i18next.t('field.granted by'),\n record: { editable: false },\n width: 160\n },\n {\n type: 'datetime',\n name: 'grantedAt',\n header: i18next.t('field.granted at'),\n width: 180\n }\n ]\n }\n }\n\n async pageUpdated(_changes: any, _lifecycle: any) {\n if (this.active) {\n this._refreshPermissions()\n await this.updateComplete\n this.grist.fetch()\n }\n }\n\n private _refreshPermissions() {\n const __state__ = store.getState() as any\n const me = __state__.auth?.user || {}\n this.isDomainOwner = !!me.domainOwner || !!me.super\n }\n\n private async _fetchHandler() {\n const response = await client.query({\n query: gql`\n query {\n domainOwners {\n id\n user {\n id\n name\n email\n username\n }\n grantedBy {\n id\n name\n email\n }\n grantedAt\n reason\n }\n }\n `,\n context: gqlContext(),\n fetchPolicy: 'network-only'\n })\n\n const items = (response.data?.domainOwners || []).map((ow: any) => ({\n ...ow,\n userName: ow.user?.name,\n userEmail: ow.user?.email,\n grantedByName: ow.grantedBy?.name || ''\n }))\n\n return { total: items.length, records: items }\n }\n\n private _onAddOwner() {\n openPopup(\n html`\n <add-domain-owner-popup\n @domain-owner-added=${() => {\n this.grist.fetch()\n this._notify(i18next.t('text.domain owner added successfully'))\n }}\n ></add-domain-owner-popup>\n `,\n {\n size: 'small',\n title: i18next.t('title.add domain owner')\n }\n )\n }\n\n private async _onRemoveOwner(record: any) {\n const username = record.user?.username || record.user?.email\n const displayName = record.user?.name || username\n\n const confirmed = await OxPrompt.open({\n type: 'warning',\n title: i18next.t('text.are_you_sure'),\n text: i18next.t('text.are_you_sure_to_remove_domain_owner', { x: displayName }),\n confirmButton: { text: i18next.t('button.remove owner') },\n cancelButton: { text: i18next.t('button.cancel') }\n })\n if (!confirmed) return\n\n try {\n const response = await client.mutate({\n mutation: gql`\n mutation removeDomainOwner($username: String!) {\n removeDomainOwner(username: $username)\n }\n `,\n variables: { username },\n context: gqlContext()\n })\n\n if (!response.errors?.length) {\n this._notify(i18next.t('text.domain owner removed successfully'))\n this.grist.fetch()\n }\n } catch (err: any) {\n await OxPrompt.open({\n type: 'error',\n title: i18next.t('text.failed'),\n text: err?.message || String(err),\n confirmButton: { text: i18next.t('button.confirm') }\n })\n }\n }\n\n private _notify(message: string) {\n document.dispatchEvent(new CustomEvent('notify', { detail: { message, option: { timer: 1500 } } }))\n }\n}\n"]}
@@ -16,6 +16,15 @@ export declare class EnvVarListPage extends EnvVarListPage_base {
16
16
  config: any;
17
17
  mode: 'CARD' | 'LIST' | 'GRID';
18
18
  private grist;
19
+ /**
20
+ * EnvVar 사용처 매핑: name → 표시 라벨.
21
+ * 활성 Connection 의 useDomainAttribute params 및 활성 Scenario step 의 useDomainAttribute
22
+ * params 를 스캔해 "이 EnvVar 키가 어디서 참조되는지" 미리 계산해둔다.
23
+ * 비어있으면 orphan 판정에 사용.
24
+ */
25
+ private expectedUsage;
26
+ /** Orphan 만 보기 토글 — 헤더 액션으로 1-click 전환 */
27
+ showOrphansOnly: boolean;
19
28
  get context(): {
20
29
  title: string;
21
30
  search: {
@@ -27,18 +36,34 @@ export declare class EnvVarListPage extends EnvVarListPage_base {
27
36
  };
28
37
  actions: {
29
38
  title: string;
30
- action: () => Promise<void>;
39
+ action: () => void;
31
40
  icon: string;
32
41
  }[];
33
42
  toolbar: boolean;
34
43
  };
35
44
  render(): import("lit-html").TemplateResult<1>;
36
45
  pageInitialized(): Promise<void>;
46
+ /**
47
+ * 활성 Connection 의 useDomainAttribute params 와 활성 Scenario step 의 useDomainAttribute
48
+ * step params 를 기준으로 "EnvVar 가 어디서 참조되는지" 매핑을 산출한다.
49
+ * - Connection::<connName>::<paramName>
50
+ * - Step::<scenarioName>::<stepName>::<paramName>
51
+ * 매핑에 없으면서 이름이 `Connection::` 또는 `Step::` prefix 를 가지면 orphan 후보.
52
+ */
53
+ private _loadExpectedUsage;
54
+ /**
55
+ * EnvVar.name 을 사용처 매핑과 비교해 표시용 사용처 정보 산출.
56
+ * - 매핑 hit → '✓ <사용처>'
57
+ * - prefix(Connection:: / Step::) 인데 매핑 miss → '⚠ orphan (참조 없음)'
58
+ * - 그 외 사용자 정의 키 → '— (custom)'
59
+ */
60
+ private _classifyUsage;
37
61
  pageUpdated(changes: any, lifecycle: any): Promise<void>;
38
62
  fetchHandler({ page, limit, sortings, filters }: FetchOption): Promise<{
39
63
  total: any;
40
64
  records: any;
41
65
  }>;
66
+ private _toggleOrphansOnly;
42
67
  onUpdateEnvVars(): Promise<void>;
43
68
  onDeleteEnvVars(): Promise<void>;
44
69
  showToast(message: any): void;
@@ -5,7 +5,7 @@ import '@operato/data-grist/ox-filters-form.js';
5
5
  import '@operato/context/ox-context-page-toolbar.js';
6
6
  import gql from 'graphql-tag';
7
7
  import { css, html } from 'lit';
8
- import { customElement, property, query } from 'lit/decorators.js';
8
+ import { customElement, property, query, state } from 'lit/decorators.js';
9
9
  import { DataGrist } from '@operato/data-grist/ox-grist.js';
10
10
  import { client } from '@operato/graphql';
11
11
  import { i18next, localize } from '@operato/i18n';
@@ -20,6 +20,15 @@ let EnvVarListPage = class EnvVarListPage extends p13n(localize(i18next)(PageVie
20
20
  super(...arguments);
21
21
  this.active = false;
22
22
  this.mode = isMobileDevice() ? 'CARD' : 'GRID';
23
+ /**
24
+ * EnvVar 사용처 매핑: name → 표시 라벨.
25
+ * 활성 Connection 의 useDomainAttribute params 및 활성 Scenario step 의 useDomainAttribute
26
+ * params 를 스캔해 "이 EnvVar 키가 어디서 참조되는지" 미리 계산해둔다.
27
+ * 비어있으면 orphan 판정에 사용.
28
+ */
29
+ this.expectedUsage = new Map();
30
+ /** Orphan 만 보기 토글 — 헤더 액션으로 1-click 전환 */
31
+ this.showOrphansOnly = false;
23
32
  }
24
33
  static { this.styles = [
25
34
  CommonGristStyles,
@@ -48,6 +57,12 @@ let EnvVarListPage = class EnvVarListPage extends p13n(localize(i18next)(PageVie
48
57
  }
49
58
  },
50
59
  actions: [
60
+ { title: this.showOrphansOnly
61
+ ? i18next.t('button.show-all') || '전체 보기'
62
+ : i18next.t('button.show-orphans-only') || 'Orphan 만 보기',
63
+ action: this._toggleOrphansOnly.bind(this),
64
+ icon: this.showOrphansOnly ? 'visibility' : 'filter_alt'
65
+ },
51
66
  { title: i18next.t('button.save'),
52
67
  action: this.onUpdateEnvVars.bind(this),
53
68
  icon: 'save'
@@ -113,6 +128,17 @@ let EnvVarListPage = class EnvVarListPage extends p13n(localize(i18next)(PageVie
113
128
  },
114
129
  width: 640
115
130
  },
131
+ {
132
+ type: 'string',
133
+ name: '_usage',
134
+ header: i18next.t('field.usage') || '사용처',
135
+ record: {
136
+ editable: false,
137
+ renderer: (_v, _c, r) => r?._usage?.label || ''
138
+ },
139
+ filter: 'search',
140
+ width: 320
141
+ },
116
142
  { type: 'datetime',
117
143
  name: 'updatedAt',
118
144
  header: i18next.t('field.updated_at'),
@@ -126,8 +152,83 @@ let EnvVarListPage = class EnvVarListPage extends p13n(localize(i18next)(PageVie
126
152
  sorters: [
127
153
  { name: 'name'
128
154
  }
129
- ]
130
- };
155
+ ] };
156
+ // 사용처/orphan 식별을 위한 매핑 로드 (실패해도 페이지는 정상 동작)
157
+ this._loadExpectedUsage().catch(err => {
158
+ console.warn('env-var usage map load failed; orphan detection disabled', err);
159
+ });
160
+ }
161
+ /**
162
+ * 활성 Connection 의 useDomainAttribute params 와 활성 Scenario step 의 useDomainAttribute
163
+ * step params 를 기준으로 "EnvVar 가 어디서 참조되는지" 매핑을 산출한다.
164
+ * - Connection::<connName>::<paramName>
165
+ * - Step::<scenarioName>::<stepName>::<paramName>
166
+ * 매핑에 없으면서 이름이 `Connection::` 또는 `Step::` prefix 를 가지면 orphan 후보.
167
+ */
168
+ async _loadExpectedUsage() {
169
+ const res = await client.query({ query: gql `
170
+ query { connections(pagination: { limit: 1000 }) { items { name type }
171
+ }
172
+ connectors { items { name
173
+ parameterSpec { name useDomainAttribute }
174
+ }
175
+ }
176
+ scenarios(pagination: { limit: 1000 }) { items { name steps { name task }
177
+ }
178
+ }
179
+ taskTypes { items { name
180
+ parameterSpec { name useDomainAttribute }
181
+ }
182
+ }
183
+ }
184
+ `,
185
+ fetchPolicy: 'network-only'
186
+ });
187
+ const usage = new Map();
188
+ const connectors = (res.data?.connectors?.items || []);
189
+ const tasks = (res.data?.taskTypes?.items || []);
190
+ const specByConnectorName = new Map(connectors.map(c => [c.name, Array.isArray(c.parameterSpec) ? c.parameterSpec : []]));
191
+ const specByTaskName = new Map(tasks.map(t => [t.name, Array.isArray(t.parameterSpec) ? t.parameterSpec : []]));
192
+ // Connection 파라미터 참조
193
+ for (const conn of (res.data?.connections?.items || [])) {
194
+ const spec = specByConnectorName.get(conn.type) || [];
195
+ for (const p of spec) {
196
+ if (p?.useDomainAttribute && p.name) {
197
+ usage.set(`Connection::${conn.name}::${p.name}`, `Connection · ${conn.name} / ${p.name}`);
198
+ }
199
+ }
200
+ }
201
+ // Scenario step 파라미터 참조
202
+ for (const sc of (res.data?.scenarios?.items || [])) {
203
+ for (const step of sc.steps || []) {
204
+ const spec = specByTaskName.get(step.task) || [];
205
+ for (const p of spec) {
206
+ if (p?.useDomainAttribute && p.name) {
207
+ usage.set(`Step::${sc.name}::${step.name}::${p.name}`, `Step · ${sc.name} / ${step.name} / ${p.name}`);
208
+ }
209
+ }
210
+ }
211
+ }
212
+ this.expectedUsage = usage;
213
+ // 매핑이 늦게 로드되어도 즉시 반영되도록 다시 fetch
214
+ this.grist?.fetch?.();
215
+ }
216
+ /**
217
+ * EnvVar.name 을 사용처 매핑과 비교해 표시용 사용처 정보 산출.
218
+ * - 매핑 hit → '✓ <사용처>'
219
+ * - prefix(Connection:: / Step::) 인데 매핑 miss → '⚠ orphan (참조 없음)'
220
+ * - 그 외 사용자 정의 키 → '— (custom)'
221
+ */
222
+ _classifyUsage(name) {
223
+ if (!name)
224
+ return { label: '', isOrphan: false };
225
+ const hit = this.expectedUsage.get(name);
226
+ if (hit)
227
+ return { label: '✓ ' + hit, isOrphan: false };
228
+ if (/^Connection::.+::.+$/.test(name) || /^Step::.+::.+::.+$/.test(name)) {
229
+ return { label: '⚠ orphan (참조 없음)', isOrphan: true };
230
+ }
231
+ return { label: '— (custom)', isOrphan: false };
131
232
  }
132
233
  async pageUpdated(changes, lifecycle) {
133
234
  if (this.active) {
@@ -153,10 +254,20 @@ let EnvVarListPage = class EnvVarListPage extends p13n(localize(i18next)(PageVie
153
254
  sortings
154
255
  }
155
256
  });
156
- return { total: response.data.envVars.total || 0,
157
- records: response.data.envVars.items || []
257
+ const items = response.data.envVars.items || [];
258
+ const annotated = items.map((item) => ({ ...item,
259
+ _usage: this._classifyUsage(item.name)
260
+ }));
261
+ // showOrphansOnly 모드: 클라이언트단 필터링 (orphan 후보만 노출)
262
+ const records = this.showOrphansOnly ? annotated.filter((r) => r._usage?.isOrphan) : annotated;
263
+ return { total: this.showOrphansOnly ? records.length : response.data.envVars.total || 0,
264
+ records
158
265
  };
159
266
  }
267
+ _toggleOrphansOnly() {
268
+ this.showOrphansOnly = !this.showOrphansOnly;
269
+ this.grist?.fetch?.();
270
+ }
160
271
  async onUpdateEnvVars() {
161
272
  let patches = this.grist.dirtyRecords;
162
273
  if (patches && patches.length) {
@@ -224,8 +335,19 @@ __decorate([
224
335
  ], EnvVarListPage.prototype, "mode", void 0);
225
336
  __decorate([
226
337
  query('ox-grist'),
227
- __metadata("design:type", DataGrist)
338
+ __metadata("design:type", DataGrist
339
+ /**
340
+ * EnvVar 사용처 매핑: name → 표시 라벨.
341
+ * 활성 Connection 의 useDomainAttribute params 및 활성 Scenario step 의 useDomainAttribute
342
+ * params 를 스캔해 "이 EnvVar 키가 어디서 참조되는지" 미리 계산해둔다.
343
+ * 비어있으면 orphan 판정에 사용.
344
+ */
345
+ )
228
346
  ], EnvVarListPage.prototype, "grist", void 0);
347
+ __decorate([
348
+ state(),
349
+ __metadata("design:type", Boolean)
350
+ ], EnvVarListPage.prototype, "showOrphansOnly", void 0);
229
351
  EnvVarListPage = __decorate([
230
352
  customElement('env-var-list-page')
231
353
  ], EnvVarListPage);
@@ -1 +1 @@
1
- {"version":3,"file":"env-var-list-page.js","sourceRoot":"","sources":["../../../client/pages/env-var/env-var-list-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\n\nimport '@operato/data-grist/ox-grist.js'\nimport '@operato/data-grist/ox-filters-form.js'\nimport '@operato/context/ox-context-page-toolbar.js'\n\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\nimport { DataGrist } from '@operato/data-grist/ox-grist.js'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify } from '@operato/layout'\nimport { PageView } from '@operato/shell'\nimport { CommonHeaderStyles, CommonGristStyles, ScrollbarStyles } from '@operato/styles'\nimport { isMobileDevice } from '@operato/utils'\nimport { p13n } from '@operato/p13n'\nimport { FetchOption } from '@operato/data-grist'\nimport { OxPrompt } from '@operato/popup'\n\n@customElement('env-var-list-page')\nexport class EnvVarListPage extends p13n(localize(i18next)(PageView)) { static styles = [\n CommonGristStyles,\n CommonHeaderStyles,\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 }) config: any\n @property({ type: String }) mode: 'CARD' | 'LIST' | 'GRID' = isMobileDevice() ? 'CARD' : 'GRID'\n\n @query('ox-grist') private grist!: DataGrist\n\n get context() { return { title: i18next.t('text.env-var-list-page'),\n search: { handler: (search: string) => { this.grist.searchText = search\n },\n value: this.grist?.searchText || ''\n },\n filter: { handler: () => { this.grist.toggleHeadroom()\n }\n },\n actions: [\n { title: i18next.t('button.save'),\n action: this.onUpdateEnvVars.bind(this),\n icon: 'save'\n },\n { title: i18next.t('button.delete'),\n action: this.onDeleteEnvVars.bind(this),\n icon: 'delete'\n }\n ],\n toolbar: false\n }\n }\n\n render() { return html`\n <ox-grist\n .mode=${this.mode}\n .config=${this.config}\n .fetchHandler=${this.fetchHandler.bind(this)}\n .personalConfigProvider=${this.getPagePreferenceProvider('ox-grist')!}\n >\n <div slot=\"headroom\" class=\"header\">\n <ox-context-page-toolbar class=\"actions\" .context=${this.context}></ox-context-page-toolbar>\n </div>\n\n <ox-grist-personalizer slot=\"setting\"></ox-grist-personalizer>\n </ox-grist>\n `\n }\n\n async pageInitialized() { this.config = { columns: [\n { type: 'gutter', gutterName: 'sequence' },\n { type: 'gutter', gutterName: 'row-selector', multiple: true },\n { type: 'string',\n name: 'name',\n header: i18next.t('field.name'),\n record: { editable: true\n },\n filter: 'search',\n sortable: true,\n width: 320\n },\n { type: 'string',\n name: 'description',\n header: i18next.t('field.description'),\n record: { editable: true\n },\n filter: 'search',\n width: 460\n },\n { type: 'checkbox',\n name: 'active',\n label: true,\n header: i18next.t('field.active'),\n record: { editable: true\n },\n filter: true,\n sortable: true,\n width: 60\n },\n { type: 'secret',\n name: 'value',\n header: i18next.t('field.value'),\n record: { editable: true\n },\n width: 640\n },\n { type: 'datetime',\n name: 'updatedAt',\n header: i18next.t('field.updated_at'),\n width: 180\n }\n ],\n rows: { appendable: true,\n selectable: { multiple: true\n }\n },\n sorters: [\n { name: 'name'\n }\n ]\n }\n }\n\n async pageUpdated(changes, lifecycle) { if (this.active) { await this.updateComplete\n\n this.grist.fetch()\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!]) { envVars(filters: $filters, pagination: $pagination, sortings: $sortings) { items { id\n name\n description\n value\n active\n updatedAt\n }\n total\n }\n }\n `,\n variables: { filters,\n pagination: { page, limit },\n sortings\n }\n })\n\n return { total: response.data.envVars.total || 0,\n records: response.data.envVars.items || []\n }\n }\n\n async onUpdateEnvVars() { let patches = this.grist.dirtyRecords\n if (patches && patches.length) { patches = patches.map(patch => { let patchField: any = patch.id ? { id: patch.id } : {}\n const dirtyFields = patch.__dirtyfields__\n for (let key in dirtyFields) { patchField[key] = dirtyFields[key].after\n }\n patchField.cuFlag = patch.__dirty__\n\n return { ...patchField\n }\n })\n\n const response = await client.mutate({ mutation: gql`\n mutation updateMultipleEnvVars($patches: [EnvVarPatch!]!) { updateMultipleEnvVars(patches: $patches) { name\n }\n }\n `,\n variables: { patches }\n })\n\n if (!response.errors) { this.grist.fetch()\n return this.showToast(i18next.t('text.updated_successfully'))\n }\n }\n }\n\n async onDeleteEnvVars() { if (\n await OxPrompt.open({ title: i18next.t('text.are_you_sure'),\n text: i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }),\n confirmButton: { text: i18next.t('button.confirm') },\n cancelButton: { text: i18next.t('button.cancel') }\n })\n ) { const ids = this.grist.selected.map(record => record.id)\n if (ids && ids.length > 0) { const response = await client.mutate({ mutation: gql`\n mutation ($ids: [String!]!) { deleteEnvVars(ids: $ids)\n }\n `,\n variables: { ids\n }\n })\n\n if (!response.errors) { this.grist.fetch()\n notify({ message: i18next.t('text.info_x_successfully', { x: i18next.t('text.delete') })\n })\n }\n }\n }\n }\n\n showToast(message) { document.dispatchEvent(new CustomEvent('notify', { detail: { message } }))\n }\n}\n"]}
1
+ {"version":3,"file":"env-var-list-page.js","sourceRoot":"","sources":["../../../client/pages/env-var/env-var-list-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\n\nimport '@operato/data-grist/ox-grist.js'\nimport '@operato/data-grist/ox-filters-form.js'\nimport '@operato/context/ox-context-page-toolbar.js'\n\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { DataGrist } from '@operato/data-grist/ox-grist.js'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify } from '@operato/layout'\nimport { PageView } from '@operato/shell'\nimport { CommonHeaderStyles, CommonGristStyles, ScrollbarStyles } from '@operato/styles'\nimport { isMobileDevice } from '@operato/utils'\nimport { p13n } from '@operato/p13n'\nimport { FetchOption } from '@operato/data-grist'\nimport { OxPrompt } from '@operato/popup'\n\n@customElement('env-var-list-page')\nexport class EnvVarListPage extends p13n(localize(i18next)(PageView)) { static styles = [\n CommonGristStyles,\n CommonHeaderStyles,\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 }) config: any\n @property({ type: String }) mode: 'CARD' | 'LIST' | 'GRID' = isMobileDevice() ? 'CARD' : 'GRID'\n\n @query('ox-grist') private grist!: DataGrist\n\n /**\n * EnvVar 사용처 매핑: name → 표시 라벨.\n * 활성 Connection 의 useDomainAttribute params 및 활성 Scenario step 의 useDomainAttribute\n * params 를 스캔해 \"이 EnvVar 키가 어디서 참조되는지\" 미리 계산해둔다.\n * 비어있으면 orphan 판정에 사용.\n */\n private expectedUsage: Map<string, string> = new Map()\n\n /** Orphan 만 보기 토글 — 헤더 액션으로 1-click 전환 */\n @state() showOrphansOnly: boolean = false\n\n get context() { return { title: i18next.t('text.env-var-list-page'),\n search: { handler: (search: string) => { this.grist.searchText = search\n },\n value: this.grist?.searchText || ''\n },\n filter: { handler: () => { this.grist.toggleHeadroom()\n }\n },\n actions: [\n { title: this.showOrphansOnly\n ? i18next.t('button.show-all') || '전체 보기'\n : i18next.t('button.show-orphans-only') || 'Orphan 만 보기',\n action: this._toggleOrphansOnly.bind(this),\n icon: this.showOrphansOnly ? 'visibility' : 'filter_alt'\n },\n { title: i18next.t('button.save'),\n action: this.onUpdateEnvVars.bind(this),\n icon: 'save'\n },\n { title: i18next.t('button.delete'),\n action: this.onDeleteEnvVars.bind(this),\n icon: 'delete'\n }\n ],\n toolbar: false\n }\n }\n\n render() { return html`\n <ox-grist\n .mode=${this.mode}\n .config=${this.config}\n .fetchHandler=${this.fetchHandler.bind(this)}\n .personalConfigProvider=${this.getPagePreferenceProvider('ox-grist')!}\n >\n <div slot=\"headroom\" class=\"header\">\n <ox-context-page-toolbar class=\"actions\" .context=${this.context}></ox-context-page-toolbar>\n </div>\n\n <ox-grist-personalizer slot=\"setting\"></ox-grist-personalizer>\n </ox-grist>\n `\n }\n\n async pageInitialized() { this.config = { columns: [\n { type: 'gutter', gutterName: 'sequence' },\n { type: 'gutter', gutterName: 'row-selector', multiple: true },\n { type: 'string',\n name: 'name',\n header: i18next.t('field.name'),\n record: { editable: true\n },\n filter: 'search',\n sortable: true,\n width: 320\n },\n { type: 'string',\n name: 'description',\n header: i18next.t('field.description'),\n record: { editable: true\n },\n filter: 'search',\n width: 460\n },\n { type: 'checkbox',\n name: 'active',\n label: true,\n header: i18next.t('field.active'),\n record: { editable: true\n },\n filter: true,\n sortable: true,\n width: 60\n },\n { type: 'secret',\n name: 'value',\n header: i18next.t('field.value'),\n record: { editable: true\n },\n width: 640\n },\n {\n type: 'string',\n name: '_usage',\n header: i18next.t('field.usage') || '사용처',\n record: {\n editable: false,\n renderer: (_v: any, _c: any, r: any) => r?._usage?.label || ''\n },\n filter: 'search',\n width: 320\n },\n { type: 'datetime',\n name: 'updatedAt',\n header: i18next.t('field.updated_at'),\n width: 180\n }\n ],\n rows: { appendable: true,\n selectable: { multiple: true\n }\n },\n sorters: [\n { name: 'name'\n }\n ]\n }\n\n // 사용처/orphan 식별을 위한 매핑 로드 (실패해도 페이지는 정상 동작)\n this._loadExpectedUsage().catch(err => {\n console.warn('env-var usage map load failed; orphan detection disabled', err)\n })\n }\n\n /**\n * 활성 Connection 의 useDomainAttribute params 와 활성 Scenario step 의 useDomainAttribute\n * step params 를 기준으로 \"EnvVar 가 어디서 참조되는지\" 매핑을 산출한다.\n * - Connection::<connName>::<paramName>\n * - Step::<scenarioName>::<stepName>::<paramName>\n * 매핑에 없으면서 이름이 `Connection::` 또는 `Step::` prefix 를 가지면 orphan 후보.\n */\n private async _loadExpectedUsage() { const res = await client.query({ query: gql`\n query { connections(pagination: { limit: 1000 }) { items { name type }\n }\n connectors { items { name\n parameterSpec { name useDomainAttribute }\n }\n }\n scenarios(pagination: { limit: 1000 }) { items { name steps { name task }\n }\n }\n taskTypes { items { name\n parameterSpec { name useDomainAttribute }\n }\n }\n }\n `,\n fetchPolicy: 'network-only'\n })\n\n const usage = new Map<string, string>()\n\n const connectors = (res.data?.connectors?.items || []) as Array<{ name: string; parameterSpec: any }>\n const tasks = (res.data?.taskTypes?.items || []) as Array<{ name: string; parameterSpec: any }>\n const specByConnectorName = new Map<string, any[]>(\n connectors.map(c => [c.name, Array.isArray(c.parameterSpec) ? c.parameterSpec : []])\n )\n const specByTaskName = new Map<string, any[]>(\n tasks.map(t => [t.name, Array.isArray(t.parameterSpec) ? t.parameterSpec : []])\n )\n\n // Connection 파라미터 참조\n for (const conn of (res.data?.connections?.items || []) as any[]) { const spec = specByConnectorName.get(conn.type) || []\n for (const p of spec) { if (p?.useDomainAttribute && p.name) { usage.set(`Connection::${conn.name}::${p.name}`, `Connection · ${conn.name} / ${p.name}`)\n }\n }\n }\n\n // Scenario step 파라미터 참조\n for (const sc of (res.data?.scenarios?.items || []) as any[]) { for (const step of sc.steps || []) { const spec = specByTaskName.get(step.task) || []\n for (const p of spec) { if (p?.useDomainAttribute && p.name) { usage.set(\n `Step::${sc.name}::${step.name}::${p.name}`,\n `Step · ${sc.name} / ${step.name} / ${p.name}`\n )\n }\n }\n }\n }\n\n this.expectedUsage = usage\n\n // 매핑이 늦게 로드되어도 즉시 반영되도록 다시 fetch\n this.grist?.fetch?.()\n }\n\n /**\n * EnvVar.name 을 사용처 매핑과 비교해 표시용 사용처 정보 산출.\n * - 매핑 hit → '✓ <사용처>'\n * - prefix(Connection:: / Step::) 인데 매핑 miss → '⚠ orphan (참조 없음)'\n * - 그 외 사용자 정의 키 → '— (custom)'\n */\n private _classifyUsage(name: string): { label: string; isOrphan: boolean }\n { if (!name) return { label: '', isOrphan: false }\n const hit = this.expectedUsage.get(name)\n if (hit) return { label: '✓ ' + hit, isOrphan: false }\n if (/^Connection::.+::.+$/.test(name) || /^Step::.+::.+::.+$/.test(name)) { return { label: '⚠ orphan (참조 없음)', isOrphan: true }\n }\n return { label: '— (custom)', isOrphan: false }\n }\n\n async pageUpdated(changes, lifecycle) { if (this.active) { await this.updateComplete\n\n this.grist.fetch()\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!]) { envVars(filters: $filters, pagination: $pagination, sortings: $sortings) { items { id\n name\n description\n value\n active\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.envVars.items || []\n const annotated = items.map((item: any) => ({ ...item,\n _usage: this._classifyUsage(item.name)\n }))\n\n // showOrphansOnly 모드: 클라이언트단 필터링 (orphan 후보만 노출)\n const records = this.showOrphansOnly ? annotated.filter((r: any) => r._usage?.isOrphan) : annotated\n\n return { total: this.showOrphansOnly ? records.length : response.data.envVars.total || 0,\n records\n }\n }\n\n private _toggleOrphansOnly() { this.showOrphansOnly = !this.showOrphansOnly\n this.grist?.fetch?.()\n }\n\n async onUpdateEnvVars() { let patches = this.grist.dirtyRecords\n if (patches && patches.length) { patches = patches.map(patch => { let patchField: any = patch.id ? { id: patch.id } : {}\n const dirtyFields = patch.__dirtyfields__\n for (let key in dirtyFields) { patchField[key] = dirtyFields[key].after\n }\n patchField.cuFlag = patch.__dirty__\n\n return { ...patchField\n }\n })\n\n const response = await client.mutate({ mutation: gql`\n mutation updateMultipleEnvVars($patches: [EnvVarPatch!]!) { updateMultipleEnvVars(patches: $patches) { name\n }\n }\n `,\n variables: { patches }\n })\n\n if (!response.errors) { this.grist.fetch()\n return this.showToast(i18next.t('text.updated_successfully'))\n }\n }\n }\n\n async onDeleteEnvVars() { if (\n await OxPrompt.open({ title: i18next.t('text.are_you_sure'),\n text: i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }),\n confirmButton: { text: i18next.t('button.confirm') },\n cancelButton: { text: i18next.t('button.cancel') }\n })\n ) { const ids = this.grist.selected.map(record => record.id)\n if (ids && ids.length > 0) { const response = await client.mutate({ mutation: gql`\n mutation ($ids: [String!]!) { deleteEnvVars(ids: $ids)\n }\n `,\n variables: { ids\n }\n })\n\n if (!response.errors) { this.grist.fetch()\n notify({ message: i18next.t('text.info_x_successfully', { x: i18next.t('text.delete') })\n })\n }\n }\n }\n }\n\n showToast(message) { document.dispatchEvent(new CustomEvent('notify', { detail: { message } }))\n }\n}\n"]}
@@ -42,6 +42,9 @@ export default function route(page) {
42
42
  case 'domains':
43
43
  import('./pages/domain/domain-management');
44
44
  return page;
45
+ case 'domain-owners':
46
+ import('./pages/domain-owner/domain-owner-management');
47
+ return page;
45
48
  case 'env-vars':
46
49
  import('./pages/env-var/env-var-list-page');
47
50
  return page;
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../client/route.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,IAAI;IAChC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,SAAS;YACZ,MAAM;YACJ,2BAA2B;YAC3B,iCAAiC;YACjC,oBAAoB,CACrB,CAAA;YACD,OAAO,IAAI,CAAA;QAEb,KAAK,oBAAoB;YACvB,MAAM,CAAC,4BAA4B,CAAC,CAAA;YACpC,OAAO,IAAI,CAAA;QAEb,KAAK,aAAa;YAChB,MAAM,CAAC,iCAAiC,CAAC,CAAA;YACzC,OAAO,IAAI,CAAA;QAEb,KAAK,cAAc;YACjB,MAAM,CAAC,kCAAkC,CAAC,CAAA;YAC1C,OAAO,IAAI,CAAA;QAEb,KAAK,sBAAsB;YACzB,MAAM,CAAC,8BAA8B,CAAC,CAAA;YACtC,OAAO,IAAI,CAAA;QAEb,KAAK,cAAc;YACjB,MAAM,CAAC,kCAAkC,CAAC,CAAA;YAC1C,OAAO,IAAI,CAAA;QAEb,KAAK,aAAa;YAChB,MAAM,CAAC,iCAAiC,CAAC,CAAA;YACzC,OAAO,IAAI,CAAA;QAEb,KAAK,gBAAgB;YACnB,MAAM,CAAC,wBAAwB,CAAC,CAAA;YAChC,OAAO,IAAI,CAAA;QAEb,KAAK,WAAW;YACd,MAAM,CAAC,6BAA6B,CAAC,CAAA;YACrC,OAAO,IAAI,CAAA;QAEb,KAAK,OAAO;YACV,MAAM,CAAC,8BAA8B,CAAC,CAAA;YACtC,OAAO,IAAI,CAAA;QAEb,KAAK,OAAO;YACV,MAAM,CAAC,8BAA8B,CAAC,CAAA;YACtC,OAAO,IAAI,CAAA;QAEb,KAAK,UAAU;YACb,MAAM,CAAC,oCAAoC,CAAC,CAAA;YAC5C,OAAO,IAAI,CAAA;QAEb,KAAK,SAAS;YACZ,MAAM,CAAC,kCAAkC,CAAC,CAAA;YAC1C,OAAO,IAAI,CAAA;QAEb,KAAK,UAAU;YACb,MAAM,CAAC,mCAAmC,CAAC,CAAA;YAC3C,OAAO,IAAI,CAAA;QAEb,KAAK,YAAY;YACf,MAAM,CAAC,+CAA+C,CAAC,CAAA;YACvD,OAAO,IAAI,CAAA;QAEb,KAAK,gBAAgB;YACnB,MAAM,CAAC,mDAAmD,CAAC,CAAA;YAC3D,OAAO,IAAI,CAAA;QAEb,KAAK,cAAc;YACjB,MAAM,CAAC,+CAA+C,CAAC,CAAA;YACvD,OAAO,IAAI,CAAA;IACf,CAAC;AACH,CAAC","sourcesContent":["export default function route(page) {\n switch (page) {\n case 'profile':\n import(\n /* webpackPrefetch: true */\n /* webpackChunkName: \"profile\" */\n './pages/profile.js'\n )\n return page\n\n case 'appliance-register':\n import('./pages/appliance/register')\n return page\n\n case 'application':\n import('./pages/application/application')\n return page\n\n case 'applications':\n import('./pages/application/applications')\n return page\n\n case 'application-register':\n import('./pages/application/register')\n return page\n\n case 'app-bindings':\n import('./pages/app-binding/app-bindings')\n return page\n\n case 'app-binding':\n import('./pages/app-binding/app-binding')\n return page\n\n case 'appliance-home':\n import('./pages/appliance/home')\n return page\n\n case 'appliance':\n import('./pages/appliance/appliance')\n return page\n\n case 'roles':\n import('./pages/role/role-management')\n return page\n\n case 'users':\n import('./pages/user/user-management')\n return page\n\n case 'partners':\n import('./pages/partner/partner-management')\n return page\n\n case 'domains':\n import('./pages/domain/domain-management')\n return page\n\n case 'env-vars':\n import('./pages/env-var/env-var-list-page')\n return page\n\n case 'attributes':\n import('./pages/attribute/attribute-set-management.js')\n return page\n\n case 'auth-providers':\n import('./pages/auth-provider/auth-provider-management.js')\n return page\n\n case 'domain-links':\n import('./pages/domain-link/domain-link-management.js')\n return page\n }\n}\n"]}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../client/route.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,IAAI;IAChC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,SAAS;YACZ,MAAM;YACJ,2BAA2B;YAC3B,iCAAiC;YACjC,oBAAoB,CACrB,CAAA;YACD,OAAO,IAAI,CAAA;QAEb,KAAK,oBAAoB;YACvB,MAAM,CAAC,4BAA4B,CAAC,CAAA;YACpC,OAAO,IAAI,CAAA;QAEb,KAAK,aAAa;YAChB,MAAM,CAAC,iCAAiC,CAAC,CAAA;YACzC,OAAO,IAAI,CAAA;QAEb,KAAK,cAAc;YACjB,MAAM,CAAC,kCAAkC,CAAC,CAAA;YAC1C,OAAO,IAAI,CAAA;QAEb,KAAK,sBAAsB;YACzB,MAAM,CAAC,8BAA8B,CAAC,CAAA;YACtC,OAAO,IAAI,CAAA;QAEb,KAAK,cAAc;YACjB,MAAM,CAAC,kCAAkC,CAAC,CAAA;YAC1C,OAAO,IAAI,CAAA;QAEb,KAAK,aAAa;YAChB,MAAM,CAAC,iCAAiC,CAAC,CAAA;YACzC,OAAO,IAAI,CAAA;QAEb,KAAK,gBAAgB;YACnB,MAAM,CAAC,wBAAwB,CAAC,CAAA;YAChC,OAAO,IAAI,CAAA;QAEb,KAAK,WAAW;YACd,MAAM,CAAC,6BAA6B,CAAC,CAAA;YACrC,OAAO,IAAI,CAAA;QAEb,KAAK,OAAO;YACV,MAAM,CAAC,8BAA8B,CAAC,CAAA;YACtC,OAAO,IAAI,CAAA;QAEb,KAAK,OAAO;YACV,MAAM,CAAC,8BAA8B,CAAC,CAAA;YACtC,OAAO,IAAI,CAAA;QAEb,KAAK,UAAU;YACb,MAAM,CAAC,oCAAoC,CAAC,CAAA;YAC5C,OAAO,IAAI,CAAA;QAEb,KAAK,SAAS;YACZ,MAAM,CAAC,kCAAkC,CAAC,CAAA;YAC1C,OAAO,IAAI,CAAA;QAEb,KAAK,eAAe;YAClB,MAAM,CAAC,8CAA8C,CAAC,CAAA;YACtD,OAAO,IAAI,CAAA;QAEb,KAAK,UAAU;YACb,MAAM,CAAC,mCAAmC,CAAC,CAAA;YAC3C,OAAO,IAAI,CAAA;QAEb,KAAK,YAAY;YACf,MAAM,CAAC,+CAA+C,CAAC,CAAA;YACvD,OAAO,IAAI,CAAA;QAEb,KAAK,gBAAgB;YACnB,MAAM,CAAC,mDAAmD,CAAC,CAAA;YAC3D,OAAO,IAAI,CAAA;QAEb,KAAK,cAAc;YACjB,MAAM,CAAC,+CAA+C,CAAC,CAAA;YACvD,OAAO,IAAI,CAAA;IACf,CAAC;AACH,CAAC","sourcesContent":["export default function route(page) {\n switch (page) {\n case 'profile':\n import(\n /* webpackPrefetch: true */\n /* webpackChunkName: \"profile\" */\n './pages/profile.js'\n )\n return page\n\n case 'appliance-register':\n import('./pages/appliance/register')\n return page\n\n case 'application':\n import('./pages/application/application')\n return page\n\n case 'applications':\n import('./pages/application/applications')\n return page\n\n case 'application-register':\n import('./pages/application/register')\n return page\n\n case 'app-bindings':\n import('./pages/app-binding/app-bindings')\n return page\n\n case 'app-binding':\n import('./pages/app-binding/app-binding')\n return page\n\n case 'appliance-home':\n import('./pages/appliance/home')\n return page\n\n case 'appliance':\n import('./pages/appliance/appliance')\n return page\n\n case 'roles':\n import('./pages/role/role-management')\n return page\n\n case 'users':\n import('./pages/user/user-management')\n return page\n\n case 'partners':\n import('./pages/partner/partner-management')\n return page\n\n case 'domains':\n import('./pages/domain/domain-management')\n return page\n\n case 'domain-owners':\n import('./pages/domain-owner/domain-owner-management')\n return page\n\n case 'env-vars':\n import('./pages/env-var/env-var-list-page')\n return page\n\n case 'attributes':\n import('./pages/attribute/attribute-set-management.js')\n return page\n\n case 'auth-providers':\n import('./pages/auth-provider/auth-provider-management.js')\n return page\n\n case 'domain-links':\n import('./pages/domain-link/domain-link-management.js')\n return page\n }\n}\n"]}