@serve.zone/dcrouter 12.2.3 → 12.2.4

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.
@@ -162,8 +162,8 @@ let OpsViewSecurityProfiles = (() => {
162
162
  <dees-form>
163
163
  <dees-input-text .key=${'name'} .label=${'Name'} .required=${true}></dees-input-text>
164
164
  <dees-input-text .key=${'description'} .label=${'Description'}></dees-input-text>
165
- <dees-input-text .key=${'ipAllowList'} .label=${'IP Allow List (comma-separated)'}></dees-input-text>
166
- <dees-input-text .key=${'ipBlockList'} .label=${'IP Block List (comma-separated)'}></dees-input-text>
165
+ <dees-input-list .key=${'ipAllowList'} .label=${'IP Allow List'} .placeholder=${'Add IP or CIDR...'}></dees-input-list>
166
+ <dees-input-list .key=${'ipBlockList'} .label=${'IP Block List'} .placeholder=${'Add IP or CIDR...'}></dees-input-list>
167
167
  <dees-input-text .key=${'maxConnections'} .label=${'Max Connections'}></dees-input-text>
168
168
  </dees-form>
169
169
  `,
@@ -173,19 +173,15 @@ let OpsViewSecurityProfiles = (() => {
173
173
  action: async (modalArg) => {
174
174
  const form = modalArg.shadowRoot.querySelector('dees-form');
175
175
  const data = await form.collectFormData();
176
- const ipAllowList = data.ipAllowList
177
- ? String(data.ipAllowList).split(',').map((s) => s.trim()).filter(Boolean)
178
- : undefined;
179
- const ipBlockList = data.ipBlockList
180
- ? String(data.ipBlockList).split(',').map((s) => s.trim()).filter(Boolean)
181
- : undefined;
176
+ const ipAllowList = Array.isArray(data.ipAllowList) ? data.ipAllowList : [];
177
+ const ipBlockList = Array.isArray(data.ipBlockList) ? data.ipBlockList : [];
182
178
  const maxConnections = data.maxConnections ? parseInt(String(data.maxConnections)) : undefined;
183
179
  await appstate.profilesTargetsStatePart.dispatchAction(appstate.createProfileAction, {
184
180
  name: String(data.name),
185
181
  description: data.description ? String(data.description) : undefined,
186
182
  security: {
187
- ...(ipAllowList ? { ipAllowList } : {}),
188
- ...(ipBlockList ? { ipBlockList } : {}),
183
+ ...(ipAllowList.length > 0 ? { ipAllowList } : {}),
184
+ ...(ipBlockList.length > 0 ? { ipBlockList } : {}),
189
185
  ...(maxConnections ? { maxConnections } : {}),
190
186
  },
191
187
  });
@@ -204,8 +200,8 @@ let OpsViewSecurityProfiles = (() => {
204
200
  <dees-form>
205
201
  <dees-input-text .key=${'name'} .label=${'Name'} .value=${profile.name}></dees-input-text>
206
202
  <dees-input-text .key=${'description'} .label=${'Description'} .value=${profile.description || ''}></dees-input-text>
207
- <dees-input-text .key=${'ipAllowList'} .label=${'IP Allow List (comma-separated)'} .value=${(profile.security?.ipAllowList || []).join(', ')}></dees-input-text>
208
- <dees-input-text .key=${'ipBlockList'} .label=${'IP Block List (comma-separated)'} .value=${(profile.security?.ipBlockList || []).join(', ')}></dees-input-text>
203
+ <dees-input-list .key=${'ipAllowList'} .label=${'IP Allow List'} .placeholder=${'Add IP or CIDR...'} .value=${profile.security?.ipAllowList || []}></dees-input-list>
204
+ <dees-input-list .key=${'ipBlockList'} .label=${'IP Block List'} .placeholder=${'Add IP or CIDR...'} .value=${profile.security?.ipBlockList || []}></dees-input-list>
209
205
  <dees-input-text .key=${'maxConnections'} .label=${'Max Connections'} .value=${String(profile.security?.maxConnections || '')}></dees-input-text>
210
206
  </dees-form>
211
207
  `,
@@ -215,12 +211,8 @@ let OpsViewSecurityProfiles = (() => {
215
211
  action: async (modalArg) => {
216
212
  const form = modalArg.shadowRoot.querySelector('dees-form');
217
213
  const data = await form.collectFormData();
218
- const ipAllowList = data.ipAllowList
219
- ? String(data.ipAllowList).split(',').map((s) => s.trim()).filter(Boolean)
220
- : [];
221
- const ipBlockList = data.ipBlockList
222
- ? String(data.ipBlockList).split(',').map((s) => s.trim()).filter(Boolean)
223
- : [];
214
+ const ipAllowList = Array.isArray(data.ipAllowList) ? data.ipAllowList : [];
215
+ const ipBlockList = Array.isArray(data.ipBlockList) ? data.ipBlockList : [];
224
216
  const maxConnections = data.maxConnections ? parseInt(String(data.maxConnections)) : undefined;
225
217
  await appstate.profilesTargetsStatePart.dispatchAction(appstate.updateProfileAction, {
226
218
  id: profile.id,
@@ -273,4 +265,4 @@ let OpsViewSecurityProfiles = (() => {
273
265
  return OpsViewSecurityProfiles = _classThis;
274
266
  })();
275
267
  export { OpsViewSecurityProfiles };
276
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLXZpZXctc2VjdXJpdHlwcm9maWxlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzX3dlYi9lbGVtZW50cy9vcHMtdmlldy1zZWN1cml0eXByb2ZpbGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQ0wsV0FBVyxFQUNYLElBQUksRUFDSixhQUFhLEVBRWIsR0FBRyxFQUNILEtBQUssRUFDTCxVQUFVLEdBQ1gsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEtBQUssUUFBUSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sS0FBSyxVQUFVLE1BQU0sbUNBQW1DLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBbUIsTUFBTSw2QkFBNkIsQ0FBQztJQVNqRCx1QkFBdUI7NEJBRG5DLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQzs7OztzQkFDRSxXQUFXOzs7O3VDQUFuQixTQUFRLFdBQVc7Ozs7eUNBQ3JELEtBQUssRUFBRTtZQUNSLDRMQUFTLGFBQWEsNkJBQWIsYUFBYSxxR0FBaUY7WUFGekcsNktBNk5DOzs7O1FBM05DLHVGQUF5RCxRQUFRLENBQUMsd0JBQXdCLENBQUMsUUFBUSxFQUFHLEVBQUM7UUFBdkcsSUFBUyxhQUFhLG1EQUFpRjtRQUF2RyxJQUFTLGFBQWEseURBQWlGO1FBRXZHO1lBQ0UsS0FBSyxFQUFFLENBQUM7O1lBQ1IsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUM1RSxJQUFJLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFD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
268
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLXZpZXctc2VjdXJpdHlwcm9maWxlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzX3dlYi9lbGVtZW50cy9vcHMtdmlldy1zZWN1cml0eXByb2ZpbGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQ0wsV0FBVyxFQUNYLElBQUksRUFDSixhQUFhLEVBRWIsR0FBRyxFQUNILEtBQUssRUFDTCxVQUFVLEdBQ1gsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEtBQUssUUFBUSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sS0FBSyxVQUFVLE1BQU0sbUNBQW1DLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBbUIsTUFBTSw2QkFBNkIsQ0FBQztJQVNqRCx1QkFBdUI7NEJBRG5DLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQzs7OztzQkFDRSxXQUFXOzs7O3VDQUFuQixTQUFRLFdBQVc7Ozs7eUNBQ3JELEtBQUssRUFBRTtZQUNSLDRMQUFTLGFBQWEsNkJBQWIsYUFBYSxxR0FBaUY7WUFGekcsNktBcU5DOzs7O1FBbk5DLHVGQUF5RCxRQUFRLENBQUMsd0JBQXdCLENBQUMsUUFBUSxFQUFHLEVBQUM7UUFBdkcsSUFBUyxhQUFhLG1EQUFpRjtRQUF2RyxJQUFTLGFBQWEseURBQWlGO1FBRXZHO1lBQ0UsS0FBSyxFQUFFLENBQUM7O1lBQ1IsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUM1RSxJQUFJLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFD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
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@serve.zone/dcrouter",
3
3
  "private": false,
4
- "version": "12.2.3",
4
+ "version": "12.2.4",
5
5
  "description": "A multifaceted routing service handling mail and SMS delivery functions.",
6
6
  "type": "module",
7
7
  "exports": {
@@ -35,14 +35,14 @@
35
35
  "@api.global/typedserver": "^8.4.6",
36
36
  "@api.global/typedsocket": "^4.1.2",
37
37
  "@apiclient.xyz/cloudflare": "^7.1.0",
38
- "@design.estate/dees-catalog": "^3.49.1",
38
+ "@design.estate/dees-catalog": "^3.49.2",
39
39
  "@design.estate/dees-element": "^2.2.4",
40
40
  "@push.rocks/lik": "^6.4.0",
41
41
  "@push.rocks/projectinfo": "^5.1.0",
42
42
  "@push.rocks/qenv": "^6.1.3",
43
43
  "@push.rocks/smartacme": "^9.3.1",
44
44
  "@push.rocks/smartdata": "^7.1.3",
45
- "@push.rocks/smartdb": "^2.0.0",
45
+ "@push.rocks/smartdb": "^2.1.1",
46
46
  "@push.rocks/smartdns": "^7.9.0",
47
47
  "@push.rocks/smartfs": "^1.5.0",
48
48
  "@push.rocks/smartguard": "^3.1.0",
@@ -61,7 +61,7 @@
61
61
  "@push.rocks/smartunique": "^3.0.9",
62
62
  "@push.rocks/smartvpn": "1.19.1",
63
63
  "@push.rocks/taskbuffer": "^8.0.2",
64
- "@serve.zone/catalog": "^2.9.0",
64
+ "@serve.zone/catalog": "^2.9.1",
65
65
  "@serve.zone/interfaces": "^5.3.0",
66
66
  "@serve.zone/remoteingress": "^4.15.3",
67
67
  "@tsclass/tsclass": "^9.5.0",
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/dcrouter',
6
- version: '12.2.3',
6
+ version: '12.2.4',
7
7
  description: 'A multifaceted routing service handling mail and SMS delivery functions.'
8
8
  }
@@ -2060,6 +2060,13 @@ export class DcRouter {
2060
2060
  const currentRoutes = this.constructorRoutes;
2061
2061
  this.remoteIngressManager.setRoutes(currentRoutes as any[]);
2062
2062
 
2063
+ // Race-condition fix: if ConfigManagers finished before us, re-apply routes
2064
+ // so the callback delivers the full merged set (including DB-stored routes)
2065
+ // to our newly-created remoteIngressManager.
2066
+ if (this.routeConfigManager) {
2067
+ await this.routeConfigManager.applyRoutes();
2068
+ }
2069
+
2063
2070
  // Resolve TLS certs for tunnel: explicit paths > ACME for hubDomain > self-signed (Rust default)
2064
2071
  const riCfg = this.options.remoteIngressConfig;
2065
2072
  let tlsConfig: { certPem: string; keyPem: string } | undefined;
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/dcrouter',
6
- version: '12.2.3',
6
+ version: '12.2.4',
7
7
  description: 'A multifaceted routing service handling mail and SMS delivery functions.'
8
8
  }
@@ -427,6 +427,8 @@ export const setActiveViewAction = uiStatePart.createAction<string>(async (state
427
427
  if (viewName === 'routes' && currentState.activeView !== 'routes') {
428
428
  setTimeout(() => {
429
429
  routeManagementStatePart.dispatchAction(fetchMergedRoutesAction, null);
430
+ // Also fetch profiles/targets for the Create Route dropdowns
431
+ profilesTargetsStatePart.dispatchAction(fetchProfilesAndTargetsAction, null);
430
432
  }, 100);
431
433
  }
432
434
 
@@ -1413,6 +1415,7 @@ export const fetchMergedRoutesAction = routeManagementStatePart.createAction(asy
1413
1415
  export const createRouteAction = routeManagementStatePart.createAction<{
1414
1416
  route: any;
1415
1417
  enabled?: boolean;
1418
+ metadata?: any;
1416
1419
  }>(async (statePartArg, dataArg, actionContext): Promise<IRouteManagementState> => {
1417
1420
  const context = getActionContext();
1418
1421
  const currentState = statePartArg.getState()!;
@@ -1426,6 +1429,7 @@ export const createRouteAction = routeManagementStatePart.createAction<{
1426
1429
  identity: context.identity!,
1427
1430
  route: dataArg.route,
1428
1431
  enabled: dataArg.enabled,
1432
+ metadata: dataArg.metadata,
1429
1433
  });
1430
1434
 
1431
1435
  return await actionContext!.dispatch(fetchMergedRoutesAction, null);
@@ -24,6 +24,14 @@ export class OpsViewRoutes extends DeesElement {
24
24
  lastUpdated: 0,
25
25
  };
26
26
 
27
+ @state() accessor profilesTargetsState: appstate.IProfilesTargetsState = {
28
+ profiles: [],
29
+ targets: [],
30
+ isLoading: false,
31
+ error: null,
32
+ lastUpdated: 0,
33
+ };
34
+
27
35
  constructor() {
28
36
  super();
29
37
  const sub = appstate.routeManagementStatePart
@@ -33,6 +41,13 @@ export class OpsViewRoutes extends DeesElement {
33
41
  });
34
42
  this.rxSubscriptions.push(sub);
35
43
 
44
+ const ptSub = appstate.profilesTargetsStatePart
45
+ .select((s) => s)
46
+ .subscribe((ptState) => {
47
+ this.profilesTargetsState = ptState;
48
+ });
49
+ this.rxSubscriptions.push(ptSub);
50
+
36
51
  // Re-fetch routes when user logs in (fixes race condition where
37
52
  // the view is created before authentication completes)
38
53
  const loginSub = appstate.loginStatePart
@@ -40,6 +55,7 @@ export class OpsViewRoutes extends DeesElement {
40
55
  .subscribe((isLoggedIn) => {
41
56
  if (isLoggedIn) {
42
57
  appstate.routeManagementStatePart.dispatchAction(appstate.fetchMergedRoutesAction, null);
58
+ appstate.profilesTargetsStatePart.dispatchAction(appstate.fetchProfilesAndTargetsAction, null);
43
59
  }
44
60
  });
45
61
  this.rxSubscriptions.push(loginSub);
@@ -145,6 +161,7 @@ export class OpsViewRoutes extends DeesElement {
145
161
  enabled: mr.enabled,
146
162
  tags,
147
163
  id: mr.storedRouteId || mr.route.name || undefined,
164
+ metadata: mr.metadata,
148
165
  };
149
166
  });
150
167
 
@@ -275,6 +292,7 @@ export class OpsViewRoutes extends DeesElement {
275
292
  });
276
293
  } else {
277
294
  // Programmatic route
295
+ const meta = merged.metadata;
278
296
  await DeesModal.createAndShow({
279
297
  heading: `Route: ${merged.route.name}`,
280
298
  content: html`
@@ -282,6 +300,8 @@ export class OpsViewRoutes extends DeesElement {
282
300
  <p>Source: <strong style="color: #0af;">programmatic</strong></p>
283
301
  <p>Status: <strong>${merged.enabled ? 'Enabled' : 'Disabled'}</strong></p>
284
302
  <p>ID: <code style="color: #888;">${merged.storedRouteId}</code></p>
303
+ ${meta?.securityProfileName ? html`<p>Security Profile: <strong style="color: #a78bfa;">${meta.securityProfileName}</strong></p>` : ''}
304
+ ${meta?.networkTargetName ? html`<p>Network Target: <strong style="color: #a78bfa;">${meta.networkTargetName}</strong></p>` : ''}
285
305
  </div>
286
306
  `,
287
307
  menuOptions: [
@@ -319,6 +339,24 @@ export class OpsViewRoutes extends DeesElement {
319
339
 
320
340
  private async showCreateRouteDialog() {
321
341
  const { DeesModal } = await import('@design.estate/dees-catalog');
342
+ const profiles = this.profilesTargetsState.profiles;
343
+ const targets = this.profilesTargetsState.targets;
344
+
345
+ // Build dropdown options for profiles and targets
346
+ const profileOptions = [
347
+ { key: '', option: '(none — inline security)' },
348
+ ...profiles.map((p) => ({
349
+ key: p.id,
350
+ option: `${p.name}${p.description ? ' — ' + p.description : ''}`,
351
+ })),
352
+ ];
353
+ const targetOptions = [
354
+ { key: '', option: '(none — inline target)' },
355
+ ...targets.map((t) => ({
356
+ key: t.id,
357
+ option: `${t.name} (${Array.isArray(t.host) ? t.host.join(',') : t.host}:${t.port})`,
358
+ })),
359
+ ];
322
360
 
323
361
  await DeesModal.createAndShow({
324
362
  heading: 'Add Programmatic Route',
@@ -327,8 +365,10 @@ export class OpsViewRoutes extends DeesElement {
327
365
  <dees-input-text .key=${'name'} .label=${'Route Name'} .required=${true}></dees-input-text>
328
366
  <dees-input-text .key=${'ports'} .label=${'Ports (comma-separated)'} .required=${true}></dees-input-text>
329
367
  <dees-input-text .key=${'domains'} .label=${'Domains (comma-separated, optional)'}></dees-input-text>
330
- <dees-input-text .key=${'targetHost'} .label=${'Target Host'} .value=${'localhost'} .required=${true}></dees-input-text>
331
- <dees-input-text .key=${'targetPort'} .label=${'Target Port'} .required=${true}></dees-input-text>
368
+ <dees-input-dropdown .key=${'securityProfileRef'} .label=${'Security Profile'} .options=${profileOptions} .selectedKey=${''}></dees-input-dropdown>
369
+ <dees-input-dropdown .key=${'networkTargetRef'} .label=${'Network Target'} .options=${targetOptions} .selectedKey=${''}></dees-input-dropdown>
370
+ <dees-input-text .key=${'targetHost'} .label=${'Target Host (if no target selected)'} .value=${'localhost'}></dees-input-text>
371
+ <dees-input-text .key=${'targetPort'} .label=${'Target Port (if no target selected)'}></dees-input-text>
332
372
  </dees-form>
333
373
  `,
334
374
  menuOptions: [
@@ -362,15 +402,27 @@ export class OpsViewRoutes extends DeesElement {
362
402
  targets: [
363
403
  {
364
404
  host: formData.targetHost || 'localhost',
365
- port: parseInt(formData.targetPort, 10),
405
+ port: parseInt(formData.targetPort, 10) || 443,
366
406
  },
367
407
  ],
368
408
  },
369
409
  };
370
410
 
411
+ // Build metadata if profile/target selected
412
+ const metadata: any = {};
413
+ if (formData.securityProfileRef) {
414
+ metadata.securityProfileRef = formData.securityProfileRef;
415
+ }
416
+ if (formData.networkTargetRef) {
417
+ metadata.networkTargetRef = formData.networkTargetRef;
418
+ }
419
+
371
420
  await appstate.routeManagementStatePart.dispatchAction(
372
421
  appstate.createRouteAction,
373
- { route },
422
+ {
423
+ route,
424
+ metadata: Object.keys(metadata).length > 0 ? metadata : undefined,
425
+ },
374
426
  );
375
427
  await modalArg.destroy();
376
428
  },
@@ -131,8 +131,8 @@ export class OpsViewSecurityProfiles extends DeesElement {
131
131
  <dees-form>
132
132
  <dees-input-text .key=${'name'} .label=${'Name'} .required=${true}></dees-input-text>
133
133
  <dees-input-text .key=${'description'} .label=${'Description'}></dees-input-text>
134
- <dees-input-text .key=${'ipAllowList'} .label=${'IP Allow List (comma-separated)'}></dees-input-text>
135
- <dees-input-text .key=${'ipBlockList'} .label=${'IP Block List (comma-separated)'}></dees-input-text>
134
+ <dees-input-list .key=${'ipAllowList'} .label=${'IP Allow List'} .placeholder=${'Add IP or CIDR...'}></dees-input-list>
135
+ <dees-input-list .key=${'ipBlockList'} .label=${'IP Block List'} .placeholder=${'Add IP or CIDR...'}></dees-input-list>
136
136
  <dees-input-text .key=${'maxConnections'} .label=${'Max Connections'}></dees-input-text>
137
137
  </dees-form>
138
138
  `,
@@ -142,20 +142,16 @@ export class OpsViewSecurityProfiles extends DeesElement {
142
142
  action: async (modalArg: any) => {
143
143
  const form = modalArg.shadowRoot!.querySelector('dees-form');
144
144
  const data = await form.collectFormData();
145
- const ipAllowList = data.ipAllowList
146
- ? String(data.ipAllowList).split(',').map((s: string) => s.trim()).filter(Boolean)
147
- : undefined;
148
- const ipBlockList = data.ipBlockList
149
- ? String(data.ipBlockList).split(',').map((s: string) => s.trim()).filter(Boolean)
150
- : undefined;
145
+ const ipAllowList: string[] = Array.isArray(data.ipAllowList) ? data.ipAllowList : [];
146
+ const ipBlockList: string[] = Array.isArray(data.ipBlockList) ? data.ipBlockList : [];
151
147
  const maxConnections = data.maxConnections ? parseInt(String(data.maxConnections)) : undefined;
152
148
 
153
149
  await appstate.profilesTargetsStatePart.dispatchAction(appstate.createProfileAction, {
154
150
  name: String(data.name),
155
151
  description: data.description ? String(data.description) : undefined,
156
152
  security: {
157
- ...(ipAllowList ? { ipAllowList } : {}),
158
- ...(ipBlockList ? { ipBlockList } : {}),
153
+ ...(ipAllowList.length > 0 ? { ipAllowList } : {}),
154
+ ...(ipBlockList.length > 0 ? { ipBlockList } : {}),
159
155
  ...(maxConnections ? { maxConnections } : {}),
160
156
  },
161
157
  });
@@ -175,8 +171,8 @@ export class OpsViewSecurityProfiles extends DeesElement {
175
171
  <dees-form>
176
172
  <dees-input-text .key=${'name'} .label=${'Name'} .value=${profile.name}></dees-input-text>
177
173
  <dees-input-text .key=${'description'} .label=${'Description'} .value=${profile.description || ''}></dees-input-text>
178
- <dees-input-text .key=${'ipAllowList'} .label=${'IP Allow List (comma-separated)'} .value=${(profile.security?.ipAllowList || []).join(', ')}></dees-input-text>
179
- <dees-input-text .key=${'ipBlockList'} .label=${'IP Block List (comma-separated)'} .value=${(profile.security?.ipBlockList || []).join(', ')}></dees-input-text>
174
+ <dees-input-list .key=${'ipAllowList'} .label=${'IP Allow List'} .placeholder=${'Add IP or CIDR...'} .value=${profile.security?.ipAllowList || []}></dees-input-list>
175
+ <dees-input-list .key=${'ipBlockList'} .label=${'IP Block List'} .placeholder=${'Add IP or CIDR...'} .value=${profile.security?.ipBlockList || []}></dees-input-list>
180
176
  <dees-input-text .key=${'maxConnections'} .label=${'Max Connections'} .value=${String(profile.security?.maxConnections || '')}></dees-input-text>
181
177
  </dees-form>
182
178
  `,
@@ -186,12 +182,8 @@ export class OpsViewSecurityProfiles extends DeesElement {
186
182
  action: async (modalArg: any) => {
187
183
  const form = modalArg.shadowRoot!.querySelector('dees-form');
188
184
  const data = await form.collectFormData();
189
- const ipAllowList = data.ipAllowList
190
- ? String(data.ipAllowList).split(',').map((s: string) => s.trim()).filter(Boolean)
191
- : [];
192
- const ipBlockList = data.ipBlockList
193
- ? String(data.ipBlockList).split(',').map((s: string) => s.trim()).filter(Boolean)
194
- : [];
185
+ const ipAllowList: string[] = Array.isArray(data.ipAllowList) ? data.ipAllowList : [];
186
+ const ipBlockList: string[] = Array.isArray(data.ipBlockList) ? data.ipBlockList : [];
195
187
  const maxConnections = data.maxConnections ? parseInt(String(data.maxConnections)) : undefined;
196
188
 
197
189
  await appstate.profilesTargetsStatePart.dispatchAction(appstate.updateProfileAction, {