@serve.zone/dcrouter 13.3.0 → 13.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist_serve/bundle.js +1491 -1461
  2. package/dist_ts/00_commitinfo_data.js +1 -1
  3. package/dist_ts_web/00_commitinfo_data.js +1 -1
  4. package/dist_ts_web/appstate.js +7 -18
  5. package/dist_ts_web/elements/access/index.d.ts +1 -0
  6. package/dist_ts_web/elements/access/index.js +2 -0
  7. package/dist_ts_web/elements/{ops-view-apitokens.d.ts → access/ops-view-apitokens.d.ts} +1 -1
  8. package/dist_ts_web/elements/{ops-view-apitokens.js → access/ops-view-apitokens.js} +4 -4
  9. package/dist_ts_web/elements/email/index.d.ts +2 -0
  10. package/dist_ts_web/elements/email/index.js +3 -0
  11. package/dist_ts_web/elements/{security/ops-view-security-emailsecurity.d.ts → email/ops-view-email-security.d.ts} +2 -2
  12. package/dist_ts_web/elements/{security/ops-view-security-emailsecurity.js → email/ops-view-email-security.js} +9 -8
  13. package/dist_ts_web/elements/{ops-view-emails.d.ts → email/ops-view-emails.d.ts} +2 -2
  14. package/dist_ts_web/elements/{ops-view-emails.js → email/ops-view-emails.js} +5 -5
  15. package/dist_ts_web/elements/index.d.ts +3 -6
  16. package/dist_ts_web/elements/index.js +4 -7
  17. package/dist_ts_web/elements/network/index.d.ts +2 -1
  18. package/dist_ts_web/elements/network/index.js +3 -2
  19. package/dist_ts_web/elements/network/ops-view-network-activity.js +3 -2
  20. package/dist_ts_web/elements/network/ops-view-networktargets.js +3 -2
  21. package/dist_ts_web/elements/{ops-view-remoteingress.d.ts → network/ops-view-remoteingress.d.ts} +1 -1
  22. package/dist_ts_web/elements/{ops-view-remoteingress.js → network/ops-view-remoteingress.js} +5 -5
  23. package/dist_ts_web/elements/network/ops-view-routes.js +3 -2
  24. package/dist_ts_web/elements/network/ops-view-sourceprofiles.js +3 -2
  25. package/dist_ts_web/elements/network/ops-view-targetprofiles.js +3 -2
  26. package/dist_ts_web/elements/{ops-view-vpn.d.ts → network/ops-view-vpn.d.ts} +2 -2
  27. package/dist_ts_web/elements/{ops-view-vpn.js → network/ops-view-vpn.js} +6 -6
  28. package/dist_ts_web/elements/ops-dashboard.d.ts +8 -2
  29. package/dist_ts_web/elements/ops-dashboard.js +100 -59
  30. package/dist_ts_web/elements/overview/index.d.ts +2 -0
  31. package/dist_ts_web/elements/overview/index.js +3 -0
  32. package/dist_ts_web/elements/{ops-view-config.d.ts → overview/ops-view-config.d.ts} +2 -2
  33. package/dist_ts_web/elements/{ops-view-config.js → overview/ops-view-config.js} +7 -7
  34. package/dist_ts_web/elements/{ops-view-overview.d.ts → overview/ops-view-overview.d.ts} +2 -2
  35. package/dist_ts_web/elements/{ops-view-overview.js → overview/ops-view-overview.js} +4 -4
  36. package/dist_ts_web/elements/security/index.d.ts +0 -2
  37. package/dist_ts_web/elements/security/index.js +1 -3
  38. package/dist_ts_web/elements/security/ops-view-security-authentication.js +3 -2
  39. package/dist_ts_web/elements/security/ops-view-security-blocked.js +3 -2
  40. package/dist_ts_web/elements/security/ops-view-security-overview.js +3 -2
  41. package/dist_ts_web/router.d.ts +1 -1
  42. package/dist_ts_web/router.js +10 -4
  43. package/package.json +2 -2
  44. package/ts/00_commitinfo_data.ts +1 -1
  45. package/ts_web/00_commitinfo_data.ts +1 -1
  46. package/ts_web/appstate.ts +6 -19
  47. package/ts_web/elements/access/index.ts +1 -0
  48. package/ts_web/elements/{ops-view-apitokens.ts → access/ops-view-apitokens.ts} +3 -3
  49. package/ts_web/elements/email/index.ts +2 -0
  50. package/ts_web/elements/{security/ops-view-security-emailsecurity.ts → email/ops-view-email-security.ts} +5 -4
  51. package/ts_web/elements/{ops-view-emails.ts → email/ops-view-emails.ts} +4 -4
  52. package/ts_web/elements/index.ts +4 -7
  53. package/ts_web/elements/network/index.ts +2 -1
  54. package/ts_web/elements/network/ops-view-network-activity.ts +2 -1
  55. package/ts_web/elements/network/ops-view-networktargets.ts +2 -1
  56. package/ts_web/elements/{ops-view-remoteingress.ts → network/ops-view-remoteingress.ts} +4 -4
  57. package/ts_web/elements/network/ops-view-routes.ts +2 -1
  58. package/ts_web/elements/network/ops-view-sourceprofiles.ts +2 -1
  59. package/ts_web/elements/network/ops-view-targetprofiles.ts +2 -1
  60. package/ts_web/elements/{ops-view-vpn.ts → network/ops-view-vpn.ts} +5 -5
  61. package/ts_web/elements/ops-dashboard.ts +124 -66
  62. package/ts_web/elements/overview/index.ts +2 -0
  63. package/ts_web/elements/{ops-view-config.ts → overview/ops-view-config.ts} +6 -6
  64. package/ts_web/elements/{ops-view-overview.ts → overview/ops-view-overview.ts} +3 -3
  65. package/ts_web/elements/security/index.ts +0 -2
  66. package/ts_web/elements/security/ops-view-security-authentication.ts +2 -1
  67. package/ts_web/elements/security/ops-view-security-blocked.ts +2 -1
  68. package/ts_web/elements/security/ops-view-security-overview.ts +2 -1
  69. package/ts_web/router.ts +9 -3
  70. package/dist_ts_web/elements/network/ops-view-network.d.ts +0 -24
  71. package/dist_ts_web/elements/network/ops-view-network.js +0 -151
  72. package/dist_ts_web/elements/security/ops-view-security.d.ts +0 -23
  73. package/dist_ts_web/elements/security/ops-view-security.js +0 -146
  74. package/ts_web/elements/network/ops-view-network.ts +0 -119
  75. package/ts_web/elements/security/ops-view-security.ts +0 -114
@@ -1,146 +0,0 @@
1
- var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
- function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
- var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
- var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
- var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
- var _, done = false;
7
- for (var i = decorators.length - 1; i >= 0; i--) {
8
- var context = {};
9
- for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
- for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
- context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
- var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
- if (kind === "accessor") {
14
- if (result === void 0) continue;
15
- if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
- if (_ = accept(result.get)) descriptor.get = _;
17
- if (_ = accept(result.set)) descriptor.set = _;
18
- if (_ = accept(result.init)) initializers.unshift(_);
19
- }
20
- else if (_ = accept(result)) {
21
- if (kind === "field") initializers.unshift(_);
22
- else descriptor[key] = _;
23
- }
24
- }
25
- if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
- done = true;
27
- };
28
- var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
- var useValue = arguments.length > 2;
30
- for (var i = 0; i < initializers.length; i++) {
31
- value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
- }
33
- return useValue ? value : void 0;
34
- };
35
- import * as appstate from '../../appstate.js';
36
- import { appRouter } from '../../router.js';
37
- import { viewHostCss } from '../shared/css.js';
38
- import { DeesElement, customElement, html, state, css, cssManager, } from '@design.estate/dees-element';
39
- // Side-effect imports register the subview custom elements
40
- import './ops-view-security-overview.js';
41
- import './ops-view-security-blocked.js';
42
- import './ops-view-security-authentication.js';
43
- import './ops-view-security-emailsecurity.js';
44
- let OpsViewSecurity = (() => {
45
- let _classDecorators = [customElement('ops-view-security')];
46
- let _classDescriptor;
47
- let _classExtraInitializers = [];
48
- let _classThis;
49
- let _classSuper = DeesElement;
50
- let _selectedTab_decorators;
51
- let _selectedTab_initializers = [];
52
- let _selectedTab_extraInitializers = [];
53
- var OpsViewSecurity = class extends _classSuper {
54
- static { _classThis = this; }
55
- static {
56
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
57
- _selectedTab_decorators = [state()];
58
- __esDecorate(this, null, _selectedTab_decorators, { kind: "accessor", name: "selectedTab", static: false, private: false, access: { has: obj => "selectedTab" in obj, get: obj => obj.selectedTab, set: (obj, value) => { obj.selectedTab = value; } }, metadata: _metadata }, _selectedTab_initializers, _selectedTab_extraInitializers);
59
- __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
60
- OpsViewSecurity = _classThis = _classDescriptor.value;
61
- if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
62
- }
63
- #selectedTab_accessor_storage = __runInitializers(this, _selectedTab_initializers, 'overview');
64
- get selectedTab() { return this.#selectedTab_accessor_storage; }
65
- set selectedTab(value) { this.#selectedTab_accessor_storage = value; }
66
- tabLabelMap = (__runInitializers(this, _selectedTab_extraInitializers), {
67
- 'overview': 'Overview',
68
- 'blocked': 'Blocked IPs',
69
- 'authentication': 'Authentication',
70
- 'emailsecurity': 'Email Security',
71
- });
72
- labelToTab = {
73
- 'Overview': 'overview',
74
- 'Blocked IPs': 'blocked',
75
- 'Authentication': 'authentication',
76
- 'Email Security': 'emailsecurity',
77
- };
78
- static isSecurityTab(s) {
79
- return s === 'overview' || s === 'blocked' || s === 'authentication' || s === 'emailsecurity';
80
- }
81
- constructor() {
82
- super();
83
- // Read initial subview from state (URL-driven)
84
- const initialState = appstate.uiStatePart.getState();
85
- if (OpsViewSecurity.isSecurityTab(initialState.activeSubview)) {
86
- this.selectedTab = initialState.activeSubview;
87
- }
88
- // Subscribe to future changes (back/forward navigation, direct URL entry)
89
- const sub = appstate.uiStatePart.select((s) => s.activeSubview).subscribe((sub) => {
90
- if (OpsViewSecurity.isSecurityTab(sub) && sub !== this.selectedTab) {
91
- this.selectedTab = sub;
92
- }
93
- });
94
- this.rxSubscriptions.push(sub);
95
- }
96
- async firstUpdated() {
97
- const toggle = this.shadowRoot.querySelector('dees-input-multitoggle');
98
- if (toggle) {
99
- const sub = toggle.changeSubject.subscribe(() => {
100
- const tab = this.labelToTab[toggle.selectedOption];
101
- if (tab && tab !== this.selectedTab) {
102
- // Push URL → router updates state → subscription updates selectedTab
103
- appRouter.navigateToView('security', tab);
104
- }
105
- });
106
- this.rxSubscriptions.push(sub);
107
- }
108
- }
109
- static styles = [
110
- cssManager.defaultStyles,
111
- viewHostCss,
112
- css `
113
- dees-input-multitoggle {
114
- margin-bottom: 24px;
115
- }
116
- `,
117
- ];
118
- render() {
119
- return html `
120
- <dees-heading level="2">Security</dees-heading>
121
-
122
- <dees-input-multitoggle
123
- .type=${'single'}
124
- .options=${['Overview', 'Blocked IPs', 'Authentication', 'Email Security']}
125
- .selectedOption=${this.tabLabelMap[this.selectedTab]}
126
- ></dees-input-multitoggle>
127
-
128
- ${this.renderTabContent()}
129
- `;
130
- }
131
- renderTabContent() {
132
- switch (this.selectedTab) {
133
- case 'overview': return html `<ops-view-security-overview></ops-view-security-overview>`;
134
- case 'blocked': return html `<ops-view-security-blocked></ops-view-security-blocked>`;
135
- case 'authentication': return html `<ops-view-security-authentication></ops-view-security-authentication>`;
136
- case 'emailsecurity': return html `<ops-view-security-emailsecurity></ops-view-security-emailsecurity>`;
137
- }
138
- }
139
- static {
140
- __runInitializers(_classThis, _classExtraInitializers);
141
- }
142
- };
143
- return OpsViewSecurity = _classThis;
144
- })();
145
- export { OpsViewSecurity };
146
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLXZpZXctc2VjdXJpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90c193ZWIvZWxlbWVudHMvc2VjdXJpdHkvb3BzLXZpZXctc2VjdXJpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUvQyxPQUFPLEVBQ0wsV0FBVyxFQUNYLGFBQWEsRUFDYixJQUFJLEVBQ0osS0FBSyxFQUNMLEdBQUcsRUFDSCxVQUFVLEdBRVgsTUFBTSw2QkFBNkIsQ0FBQztBQUVyQywyREFBMkQ7QUFDM0QsT0FBTyxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sdUNBQXVDLENBQUM7QUFDL0MsT0FBTyxzQ0FBc0MsQ0FBQztJQVdqQyxlQUFlOzRCQUQzQixhQUFhLENBQUMsbUJBQW1CLENBQUM7Ozs7c0JBQ0UsV0FBVzs7OzsrQkFBbkIsU0FBUSxXQUFXOzs7O3VDQUM3QyxLQUFLLEVBQUU7WUFDUixzTEFBUyxXQUFXLDZCQUFYLFdBQVcsaUdBQTRCO1lBRmxELDZLQW9GQzs7OztRQWxGQyxtRkFBcUMsVUFBVSxFQUFDO1FBQWhELElBQVMsV0FBVyxpREFBNEI7UUFBaEQsSUFBUyxXQUFXLHVEQUE0QjtRQUV4QyxXQUFXLDZEQUFpQztZQUNsRCxVQUFVLEVBQVEsVUFBVTtZQUM1QixTQUFTLEVBQVMsYUFBYTtZQUMvQixnQkFBZ0IsRUFBRSxnQkFBZ0I7WUFDbEMsZUFBZSxFQUFHLGdCQUFnQjtTQUNuQyxFQUFDO1FBRU0sVUFBVSxHQUFpQztZQUNqRCxVQUFVLEVBQVEsVUFBVTtZQUM1QixhQUFhLEVBQUssU0FBUztZ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
@@ -1,119 +0,0 @@
1
- import * as appstate from '../../appstate.js';
2
- import { appRouter } from '../../router.js';
3
- import { viewHostCss } from '../shared/css.js';
4
-
5
- import {
6
- DeesElement,
7
- customElement,
8
- html,
9
- state,
10
- css,
11
- cssManager,
12
- type TemplateResult,
13
- } from '@design.estate/dees-element';
14
-
15
- // Side-effect imports register the subview custom elements
16
- import './ops-view-network-activity.js';
17
- import './ops-view-routes.js';
18
- import './ops-view-sourceprofiles.js';
19
- import './ops-view-networktargets.js';
20
- import './ops-view-targetprofiles.js';
21
-
22
- declare global {
23
- interface HTMLElementTagNameMap {
24
- 'ops-view-network': OpsViewNetwork;
25
- }
26
- }
27
-
28
- type TNetworkTab = 'activity' | 'routes' | 'sourceprofiles' | 'networktargets' | 'targetprofiles';
29
-
30
- @customElement('ops-view-network')
31
- export class OpsViewNetwork extends DeesElement {
32
- @state()
33
- accessor selectedTab: TNetworkTab = 'activity';
34
-
35
- private tabLabelMap: Record<TNetworkTab, string> = {
36
- 'activity': 'Network Activity',
37
- 'routes': 'Routes',
38
- 'sourceprofiles': 'Source Profiles',
39
- 'networktargets': 'Network Targets',
40
- 'targetprofiles': 'Target Profiles',
41
- };
42
-
43
- private labelToTab: Record<string, TNetworkTab> = {
44
- 'Network Activity': 'activity',
45
- 'Routes': 'routes',
46
- 'Source Profiles': 'sourceprofiles',
47
- 'Network Targets': 'networktargets',
48
- 'Target Profiles': 'targetprofiles',
49
- };
50
-
51
- private static isNetworkTab(s: string | null): s is TNetworkTab {
52
- return s === 'activity' || s === 'routes' || s === 'sourceprofiles'
53
- || s === 'networktargets' || s === 'targetprofiles';
54
- }
55
-
56
- constructor() {
57
- super();
58
- // Read initial subview from state (URL-driven)
59
- const initialState = appstate.uiStatePart.getState()!;
60
- if (OpsViewNetwork.isNetworkTab(initialState.activeSubview)) {
61
- this.selectedTab = initialState.activeSubview;
62
- }
63
- // Subscribe to future changes (back/forward navigation, direct URL entry)
64
- const sub = appstate.uiStatePart.select((s) => s.activeSubview).subscribe((sub) => {
65
- if (OpsViewNetwork.isNetworkTab(sub) && sub !== this.selectedTab) {
66
- this.selectedTab = sub;
67
- }
68
- });
69
- this.rxSubscriptions.push(sub);
70
- }
71
-
72
- async firstUpdated() {
73
- const toggle = this.shadowRoot!.querySelector('dees-input-multitoggle') as any;
74
- if (toggle) {
75
- const sub = toggle.changeSubject.subscribe(() => {
76
- const tab = this.labelToTab[toggle.selectedOption];
77
- if (tab && tab !== this.selectedTab) {
78
- // Push URL → router updates state → subscription updates selectedTab
79
- appRouter.navigateToView('network', tab);
80
- }
81
- });
82
- this.rxSubscriptions.push(sub);
83
- }
84
- }
85
-
86
- public static styles = [
87
- cssManager.defaultStyles,
88
- viewHostCss,
89
- css`
90
- dees-input-multitoggle {
91
- margin-bottom: 24px;
92
- }
93
- `,
94
- ];
95
-
96
- public render(): TemplateResult {
97
- return html`
98
- <dees-heading level="2">Network</dees-heading>
99
-
100
- <dees-input-multitoggle
101
- .type=${'single'}
102
- .options=${['Network Activity', 'Routes', 'Source Profiles', 'Network Targets', 'Target Profiles']}
103
- .selectedOption=${this.tabLabelMap[this.selectedTab]}
104
- ></dees-input-multitoggle>
105
-
106
- ${this.renderTabContent()}
107
- `;
108
- }
109
-
110
- private renderTabContent(): TemplateResult {
111
- switch (this.selectedTab) {
112
- case 'activity': return html`<ops-view-network-activity></ops-view-network-activity>`;
113
- case 'routes': return html`<ops-view-routes></ops-view-routes>`;
114
- case 'sourceprofiles': return html`<ops-view-sourceprofiles></ops-view-sourceprofiles>`;
115
- case 'networktargets': return html`<ops-view-networktargets></ops-view-networktargets>`;
116
- case 'targetprofiles': return html`<ops-view-targetprofiles></ops-view-targetprofiles>`;
117
- }
118
- }
119
- }
@@ -1,114 +0,0 @@
1
- import * as appstate from '../../appstate.js';
2
- import { appRouter } from '../../router.js';
3
- import { viewHostCss } from '../shared/css.js';
4
-
5
- import {
6
- DeesElement,
7
- customElement,
8
- html,
9
- state,
10
- css,
11
- cssManager,
12
- type TemplateResult,
13
- } from '@design.estate/dees-element';
14
-
15
- // Side-effect imports register the subview custom elements
16
- import './ops-view-security-overview.js';
17
- import './ops-view-security-blocked.js';
18
- import './ops-view-security-authentication.js';
19
- import './ops-view-security-emailsecurity.js';
20
-
21
- declare global {
22
- interface HTMLElementTagNameMap {
23
- 'ops-view-security': OpsViewSecurity;
24
- }
25
- }
26
-
27
- type TSecurityTab = 'overview' | 'blocked' | 'authentication' | 'emailsecurity';
28
-
29
- @customElement('ops-view-security')
30
- export class OpsViewSecurity extends DeesElement {
31
- @state()
32
- accessor selectedTab: TSecurityTab = 'overview';
33
-
34
- private tabLabelMap: Record<TSecurityTab, string> = {
35
- 'overview': 'Overview',
36
- 'blocked': 'Blocked IPs',
37
- 'authentication': 'Authentication',
38
- 'emailsecurity': 'Email Security',
39
- };
40
-
41
- private labelToTab: Record<string, TSecurityTab> = {
42
- 'Overview': 'overview',
43
- 'Blocked IPs': 'blocked',
44
- 'Authentication': 'authentication',
45
- 'Email Security': 'emailsecurity',
46
- };
47
-
48
- private static isSecurityTab(s: string | null): s is TSecurityTab {
49
- return s === 'overview' || s === 'blocked' || s === 'authentication' || s === 'emailsecurity';
50
- }
51
-
52
- constructor() {
53
- super();
54
- // Read initial subview from state (URL-driven)
55
- const initialState = appstate.uiStatePart.getState()!;
56
- if (OpsViewSecurity.isSecurityTab(initialState.activeSubview)) {
57
- this.selectedTab = initialState.activeSubview;
58
- }
59
- // Subscribe to future changes (back/forward navigation, direct URL entry)
60
- const sub = appstate.uiStatePart.select((s) => s.activeSubview).subscribe((sub) => {
61
- if (OpsViewSecurity.isSecurityTab(sub) && sub !== this.selectedTab) {
62
- this.selectedTab = sub;
63
- }
64
- });
65
- this.rxSubscriptions.push(sub);
66
- }
67
-
68
- async firstUpdated() {
69
- const toggle = this.shadowRoot!.querySelector('dees-input-multitoggle') as any;
70
- if (toggle) {
71
- const sub = toggle.changeSubject.subscribe(() => {
72
- const tab = this.labelToTab[toggle.selectedOption];
73
- if (tab && tab !== this.selectedTab) {
74
- // Push URL → router updates state → subscription updates selectedTab
75
- appRouter.navigateToView('security', tab);
76
- }
77
- });
78
- this.rxSubscriptions.push(sub);
79
- }
80
- }
81
-
82
- public static styles = [
83
- cssManager.defaultStyles,
84
- viewHostCss,
85
- css`
86
- dees-input-multitoggle {
87
- margin-bottom: 24px;
88
- }
89
- `,
90
- ];
91
-
92
- public render(): TemplateResult {
93
- return html`
94
- <dees-heading level="2">Security</dees-heading>
95
-
96
- <dees-input-multitoggle
97
- .type=${'single'}
98
- .options=${['Overview', 'Blocked IPs', 'Authentication', 'Email Security']}
99
- .selectedOption=${this.tabLabelMap[this.selectedTab]}
100
- ></dees-input-multitoggle>
101
-
102
- ${this.renderTabContent()}
103
- `;
104
- }
105
-
106
- private renderTabContent(): TemplateResult {
107
- switch (this.selectedTab) {
108
- case 'overview': return html`<ops-view-security-overview></ops-view-security-overview>`;
109
- case 'blocked': return html`<ops-view-security-blocked></ops-view-security-blocked>`;
110
- case 'authentication': return html`<ops-view-security-authentication></ops-view-security-authentication>`;
111
- case 'emailsecurity': return html`<ops-view-security-emailsecurity></ops-view-security-emailsecurity>`;
112
- }
113
- }
114
- }