@serve.zone/catalog 1.0.1
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.
- package/dist_ts_web/00_commitinfo_data.d.ts +8 -0
- package/dist_ts_web/00_commitinfo_data.js +9 -0
- package/dist_ts_web/elements/index.d.ts +33 -0
- package/dist_ts_web/elements/index.js +45 -0
- package/dist_ts_web/elements/sz-certificates-card.d.ts +14 -0
- package/dist_ts_web/elements/sz-certificates-card.js +210 -0
- package/dist_ts_web/elements/sz-dashboard-view.d.ts +33 -0
- package/dist_ts_web/elements/sz-dashboard-view.js +242 -0
- package/dist_ts_web/elements/sz-demo-view-dashboard.d.ts +18 -0
- package/dist_ts_web/elements/sz-demo-view-dashboard.js +184 -0
- package/dist_ts_web/elements/sz-demo-view-network.d.ts +32 -0
- package/dist_ts_web/elements/sz-demo-view-network.js +384 -0
- package/dist_ts_web/elements/sz-demo-view-registries.d.ts +22 -0
- package/dist_ts_web/elements/sz-demo-view-registries.js +240 -0
- package/dist_ts_web/elements/sz-demo-view-services.d.ts +32 -0
- package/dist_ts_web/elements/sz-demo-view-services.js +468 -0
- package/dist_ts_web/elements/sz-demo-view-settings.d.ts +19 -0
- package/dist_ts_web/elements/sz-demo-view-settings.js +151 -0
- package/dist_ts_web/elements/sz-demo-view-tokens.d.ts +20 -0
- package/dist_ts_web/elements/sz-demo-view-tokens.js +141 -0
- package/dist_ts_web/elements/sz-dns-ssl-card.d.ts +13 -0
- package/dist_ts_web/elements/sz-dns-ssl-card.js +180 -0
- package/dist_ts_web/elements/sz-domain-detail-view.d.ts +48 -0
- package/dist_ts_web/elements/sz-domain-detail-view.js +789 -0
- package/dist_ts_web/elements/sz-login-view.d.ts +18 -0
- package/dist_ts_web/elements/sz-login-view.js +384 -0
- package/dist_ts_web/elements/sz-network-dns-view.d.ts +20 -0
- package/dist_ts_web/elements/sz-network-dns-view.js +244 -0
- package/dist_ts_web/elements/sz-network-domains-view.d.ts +28 -0
- package/dist_ts_web/elements/sz-network-domains-view.js +312 -0
- package/dist_ts_web/elements/sz-network-proxy-view.d.ts +39 -0
- package/dist_ts_web/elements/sz-network-proxy-view.js +510 -0
- package/dist_ts_web/elements/sz-platform-service-detail-view.d.ts +49 -0
- package/dist_ts_web/elements/sz-platform-service-detail-view.js +733 -0
- package/dist_ts_web/elements/sz-platform-services-card.d.ts +19 -0
- package/dist_ts_web/elements/sz-platform-services-card.js +196 -0
- package/dist_ts_web/elements/sz-quick-actions-card.d.ts +19 -0
- package/dist_ts_web/elements/sz-quick-actions-card.js +194 -0
- package/dist_ts_web/elements/sz-registry-external-view.d.ts +22 -0
- package/dist_ts_web/elements/sz-registry-external-view.js +313 -0
- package/dist_ts_web/elements/sz-registry-onebox-view.d.ts +14 -0
- package/dist_ts_web/elements/sz-registry-onebox-view.js +307 -0
- package/dist_ts_web/elements/sz-resource-usage-card.d.ts +25 -0
- package/dist_ts_web/elements/sz-resource-usage-card.js +323 -0
- package/dist_ts_web/elements/sz-reverse-proxy-card.d.ts +16 -0
- package/dist_ts_web/elements/sz-reverse-proxy-card.js +216 -0
- package/dist_ts_web/elements/sz-service-create-view.d.ts +67 -0
- package/dist_ts_web/elements/sz-service-create-view.js +828 -0
- package/dist_ts_web/elements/sz-service-detail-view.d.ts +57 -0
- package/dist_ts_web/elements/sz-service-detail-view.js +728 -0
- package/dist_ts_web/elements/sz-services-backups-view.d.ts +37 -0
- package/dist_ts_web/elements/sz-services-backups-view.js +413 -0
- package/dist_ts_web/elements/sz-services-list-view.d.ts +20 -0
- package/dist_ts_web/elements/sz-services-list-view.js +272 -0
- package/dist_ts_web/elements/sz-settings-view.d.ts +30 -0
- package/dist_ts_web/elements/sz-settings-view.js +448 -0
- package/dist_ts_web/elements/sz-stat-card.d.ts +17 -0
- package/dist_ts_web/elements/sz-stat-card.js +249 -0
- package/dist_ts_web/elements/sz-status-grid-cluster.d.ts +19 -0
- package/dist_ts_web/elements/sz-status-grid-cluster.js +142 -0
- package/dist_ts_web/elements/sz-status-grid-infra.d.ts +17 -0
- package/dist_ts_web/elements/sz-status-grid-infra.js +140 -0
- package/dist_ts_web/elements/sz-status-grid-network.d.ts +30 -0
- package/dist_ts_web/elements/sz-status-grid-network.js +190 -0
- package/dist_ts_web/elements/sz-status-grid-services.d.ts +17 -0
- package/dist_ts_web/elements/sz-status-grid-services.js +145 -0
- package/dist_ts_web/elements/sz-tokens-view.d.ts +26 -0
- package/dist_ts_web/elements/sz-tokens-view.js +344 -0
- package/dist_ts_web/elements/sz-traffic-card.d.ts +24 -0
- package/dist_ts_web/elements/sz-traffic-card.js +255 -0
- package/dist_ts_web/index.d.ts +2 -0
- package/dist_ts_web/index.js +3 -0
- package/dist_ts_web/pages/index.d.ts +3 -0
- package/dist_ts_web/pages/index.js +4 -0
- package/dist_ts_web/pages/mainpage.d.ts +1 -0
- package/dist_ts_web/pages/mainpage.js +46 -0
- package/dist_ts_web/pages/sz-demo-app-shell.d.ts +13 -0
- package/dist_ts_web/pages/sz-demo-app-shell.js +212 -0
- package/dist_ts_web/pages/sz-demo-app.d.ts +2 -0
- package/dist_ts_web/pages/sz-demo-app.js +20 -0
- package/npmextra.json +24 -0
- package/package.json +45 -0
- package/ts_web/00_commitinfo_data.ts +8 -0
- package/ts_web/elements/index.ts +54 -0
- package/ts_web/elements/sz-certificates-card.ts +155 -0
- package/ts_web/elements/sz-dashboard-view.ts +217 -0
- package/ts_web/elements/sz-demo-view-dashboard.ts +150 -0
- package/ts_web/elements/sz-demo-view-network.ts +354 -0
- package/ts_web/elements/sz-demo-view-registries.ts +206 -0
- package/ts_web/elements/sz-demo-view-services.ts +434 -0
- package/ts_web/elements/sz-demo-view-settings.ts +118 -0
- package/ts_web/elements/sz-demo-view-tokens.ts +109 -0
- package/ts_web/elements/sz-dns-ssl-card.ts +130 -0
- package/ts_web/elements/sz-domain-detail-view.ts +766 -0
- package/ts_web/elements/sz-login-view.ts +329 -0
- package/ts_web/elements/sz-network-dns-view.ts +208 -0
- package/ts_web/elements/sz-network-domains-view.ts +273 -0
- package/ts_web/elements/sz-network-proxy-view.ts +456 -0
- package/ts_web/elements/sz-platform-service-detail-view.ts +714 -0
- package/ts_web/elements/sz-platform-services-card.ts +163 -0
- package/ts_web/elements/sz-quick-actions-card.ts +161 -0
- package/ts_web/elements/sz-registry-external-view.ts +279 -0
- package/ts_web/elements/sz-registry-onebox-view.ts +258 -0
- package/ts_web/elements/sz-resource-usage-card.ts +284 -0
- package/ts_web/elements/sz-reverse-proxy-card.ts +151 -0
- package/ts_web/elements/sz-service-create-view.ts +773 -0
- package/ts_web/elements/sz-service-detail-view.ts +710 -0
- package/ts_web/elements/sz-services-backups-view.ts +390 -0
- package/ts_web/elements/sz-services-list-view.ts +237 -0
- package/ts_web/elements/sz-settings-view.ts +417 -0
- package/ts_web/elements/sz-stat-card.ts +187 -0
- package/ts_web/elements/sz-status-grid-cluster.ts +105 -0
- package/ts_web/elements/sz-status-grid-infra.ts +88 -0
- package/ts_web/elements/sz-status-grid-network.ts +152 -0
- package/ts_web/elements/sz-status-grid-services.ts +99 -0
- package/ts_web/elements/sz-tokens-view.ts +308 -0
- package/ts_web/elements/sz-traffic-card.ts +222 -0
- package/ts_web/index.ts +2 -0
- package/ts_web/pages/index.ts +3 -0
- package/ts_web/pages/mainpage.ts +46 -0
- package/ts_web/pages/sz-demo-app-shell.ts +179 -0
- package/ts_web/pages/sz-demo-app.ts +20 -0
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DeesElement,
|
|
3
|
+
customElement,
|
|
4
|
+
html,
|
|
5
|
+
css,
|
|
6
|
+
cssManager,
|
|
7
|
+
property,
|
|
8
|
+
state,
|
|
9
|
+
type TemplateResult,
|
|
10
|
+
} from '@design.estate/dees-element';
|
|
11
|
+
import type { DeesAppui } from '@design.estate/dees-catalog';
|
|
12
|
+
import './index.js';
|
|
13
|
+
|
|
14
|
+
declare global {
|
|
15
|
+
interface HTMLElementTagNameMap {
|
|
16
|
+
'sz-demo-view-services': SzDemoViewServices;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
@customElement('sz-demo-view-services')
|
|
21
|
+
export class SzDemoViewServices extends DeesElement {
|
|
22
|
+
private appui: DeesAppui | null = null;
|
|
23
|
+
|
|
24
|
+
@state()
|
|
25
|
+
private accessor currentView: 'list' | 'create' | 'detail' | 'backups' | 'platform-detail' = 'list';
|
|
26
|
+
|
|
27
|
+
@state()
|
|
28
|
+
private accessor selectedService: any = null;
|
|
29
|
+
|
|
30
|
+
@state()
|
|
31
|
+
private accessor selectedPlatformService: any = null;
|
|
32
|
+
|
|
33
|
+
private demoServices = [
|
|
34
|
+
{
|
|
35
|
+
id: '1',
|
|
36
|
+
name: 'nginx-proxy',
|
|
37
|
+
image: 'nginx:latest',
|
|
38
|
+
status: 'running',
|
|
39
|
+
cpu: '2.5%',
|
|
40
|
+
memory: '256 MB',
|
|
41
|
+
ports: '80, 443',
|
|
42
|
+
uptime: '5d 12h',
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
id: '2',
|
|
46
|
+
name: 'api-gateway',
|
|
47
|
+
image: 'api-gateway:v2.1.0',
|
|
48
|
+
status: 'running',
|
|
49
|
+
cpu: '8.2%',
|
|
50
|
+
memory: '512 MB',
|
|
51
|
+
ports: '3000',
|
|
52
|
+
uptime: '3d 8h',
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
id: '3',
|
|
56
|
+
name: 'worker-service',
|
|
57
|
+
image: 'worker:latest',
|
|
58
|
+
status: 'stopped',
|
|
59
|
+
cpu: '0%',
|
|
60
|
+
memory: '0 MB',
|
|
61
|
+
ports: '-',
|
|
62
|
+
uptime: '-',
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
id: '4',
|
|
66
|
+
name: 'redis-cache',
|
|
67
|
+
image: 'redis:7-alpine',
|
|
68
|
+
status: 'running',
|
|
69
|
+
cpu: '1.2%',
|
|
70
|
+
memory: '128 MB',
|
|
71
|
+
ports: '6379',
|
|
72
|
+
uptime: '10d 4h',
|
|
73
|
+
},
|
|
74
|
+
];
|
|
75
|
+
|
|
76
|
+
private demoPlatformService = {
|
|
77
|
+
id: '1',
|
|
78
|
+
name: 'MongoDB',
|
|
79
|
+
type: 'mongodb' as const,
|
|
80
|
+
status: 'running' as const,
|
|
81
|
+
version: '7.0.4',
|
|
82
|
+
host: 'localhost',
|
|
83
|
+
port: 27017,
|
|
84
|
+
credentials: { username: 'admin', password: '••••••••' },
|
|
85
|
+
config: { replicaSet: 'rs0', authEnabled: true, journaling: true },
|
|
86
|
+
metrics: { cpu: 12, memory: 45, storage: 23, connections: 8 },
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
private demoPlatformLogs = [
|
|
90
|
+
{ timestamp: '2024-01-20 14:30:22', level: 'info' as const, message: 'Connection accepted from 127.0.0.1:54321' },
|
|
91
|
+
{ timestamp: '2024-01-20 14:30:20', level: 'info' as const, message: 'Index build completed on collection users' },
|
|
92
|
+
{ timestamp: '2024-01-20 14:30:15', level: 'warn' as const, message: 'Slow query detected: 1.2s on collection orders' },
|
|
93
|
+
{ timestamp: '2024-01-20 14:30:10', level: 'info' as const, message: 'Checkpoint complete' },
|
|
94
|
+
];
|
|
95
|
+
|
|
96
|
+
private demoBackupSchedules = [
|
|
97
|
+
{ id: '1', scope: 'All Services', retention: 'D:7, W:4, M:12', schedule: '0 2 * * *', lastRun: '1/2/2026, 2:00:03 AM', nextRun: '1/3/2026, 2:00:00 AM', status: 'active' as const },
|
|
98
|
+
];
|
|
99
|
+
|
|
100
|
+
private demoBackups = [
|
|
101
|
+
{ id: '1', service: 'nginx-proxy', createdAt: '1/2/2026, 2:00:03 AM', size: '22.0 MB', includes: ['Image'] },
|
|
102
|
+
{ id: '2', service: 'api-gateway', createdAt: '1/2/2026, 2:00:02 AM', size: '156.5 MB', includes: ['Image', 'Volumes'] },
|
|
103
|
+
{ id: '3', service: 'redis-cache', createdAt: '1/2/2026, 2:00:00 AM', size: '48.0 MB', includes: ['Image', 'Data'] },
|
|
104
|
+
];
|
|
105
|
+
|
|
106
|
+
public static styles = [
|
|
107
|
+
cssManager.defaultStyles,
|
|
108
|
+
css`
|
|
109
|
+
:host {
|
|
110
|
+
display: block;
|
|
111
|
+
padding: 24px;
|
|
112
|
+
height: 100%;
|
|
113
|
+
overflow-y: auto;
|
|
114
|
+
box-sizing: border-box;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.page-header {
|
|
118
|
+
display: flex;
|
|
119
|
+
justify-content: space-between;
|
|
120
|
+
align-items: flex-start;
|
|
121
|
+
margin-bottom: 24px;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.header-info {
|
|
125
|
+
display: flex;
|
|
126
|
+
flex-direction: column;
|
|
127
|
+
gap: 8px;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.page-title {
|
|
131
|
+
font-size: 24px;
|
|
132
|
+
font-weight: 700;
|
|
133
|
+
color: ${cssManager.bdTheme('#18181b', '#fafafa')};
|
|
134
|
+
margin: 0;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.page-subtitle {
|
|
138
|
+
font-size: 14px;
|
|
139
|
+
color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
|
|
140
|
+
margin: 0;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.header-actions {
|
|
144
|
+
display: flex;
|
|
145
|
+
gap: 8px;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.action-button {
|
|
149
|
+
display: inline-flex;
|
|
150
|
+
align-items: center;
|
|
151
|
+
gap: 6px;
|
|
152
|
+
padding: 8px 14px;
|
|
153
|
+
background: ${cssManager.bdTheme('#18181b', '#fafafa')};
|
|
154
|
+
border: none;
|
|
155
|
+
border-radius: 6px;
|
|
156
|
+
font-size: 13px;
|
|
157
|
+
font-weight: 500;
|
|
158
|
+
color: ${cssManager.bdTheme('#fafafa', '#18181b')};
|
|
159
|
+
cursor: pointer;
|
|
160
|
+
transition: all 200ms ease;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
.action-button:hover {
|
|
164
|
+
opacity: 0.9;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
.action-button.secondary {
|
|
168
|
+
background: ${cssManager.bdTheme('#ffffff', '#09090b')};
|
|
169
|
+
border: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
|
|
170
|
+
color: ${cssManager.bdTheme('#18181b', '#fafafa')};
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.action-button.secondary:hover {
|
|
174
|
+
background: ${cssManager.bdTheme('#f4f4f5', '#18181b')};
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.tabs {
|
|
178
|
+
display: flex;
|
|
179
|
+
gap: 4px;
|
|
180
|
+
margin-bottom: 24px;
|
|
181
|
+
border-bottom: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
|
|
182
|
+
padding-bottom: 0;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.tab {
|
|
186
|
+
padding: 10px 16px;
|
|
187
|
+
font-size: 14px;
|
|
188
|
+
font-weight: 500;
|
|
189
|
+
color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
|
|
190
|
+
background: transparent;
|
|
191
|
+
border: none;
|
|
192
|
+
cursor: pointer;
|
|
193
|
+
position: relative;
|
|
194
|
+
transition: color 200ms ease;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
.tab:hover {
|
|
198
|
+
color: ${cssManager.bdTheme('#18181b', '#fafafa')};
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.tab.active {
|
|
202
|
+
color: ${cssManager.bdTheme('#18181b', '#fafafa')};
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.tab.active::after {
|
|
206
|
+
content: '';
|
|
207
|
+
position: absolute;
|
|
208
|
+
bottom: -1px;
|
|
209
|
+
left: 0;
|
|
210
|
+
right: 0;
|
|
211
|
+
height: 2px;
|
|
212
|
+
background: ${cssManager.bdTheme('#18181b', '#fafafa')};
|
|
213
|
+
border-radius: 1px 1px 0 0;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
.back-button {
|
|
217
|
+
display: inline-flex;
|
|
218
|
+
align-items: center;
|
|
219
|
+
gap: 6px;
|
|
220
|
+
padding: 6px 12px;
|
|
221
|
+
background: transparent;
|
|
222
|
+
border: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
|
|
223
|
+
border-radius: 6px;
|
|
224
|
+
font-size: 13px;
|
|
225
|
+
color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
|
|
226
|
+
cursor: pointer;
|
|
227
|
+
margin-bottom: 16px;
|
|
228
|
+
transition: all 200ms ease;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
.back-button:hover {
|
|
232
|
+
background: ${cssManager.bdTheme('#f4f4f5', '#18181b')};
|
|
233
|
+
color: ${cssManager.bdTheme('#18181b', '#fafafa')};
|
|
234
|
+
}
|
|
235
|
+
`,
|
|
236
|
+
];
|
|
237
|
+
|
|
238
|
+
public render(): TemplateResult {
|
|
239
|
+
return html`
|
|
240
|
+
${this.currentView === 'list' ? this.renderListView() : ''}
|
|
241
|
+
${this.currentView === 'create' ? this.renderCreateView() : ''}
|
|
242
|
+
${this.currentView === 'detail' ? this.renderDetailView() : ''}
|
|
243
|
+
${this.currentView === 'backups' ? this.renderBackupsView() : ''}
|
|
244
|
+
${this.currentView === 'platform-detail' ? this.renderPlatformDetailView() : ''}
|
|
245
|
+
`;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
private renderListView(): TemplateResult {
|
|
249
|
+
return html`
|
|
250
|
+
<div class="page-header">
|
|
251
|
+
<div class="header-info">
|
|
252
|
+
<h1 class="page-title">Services</h1>
|
|
253
|
+
<p class="page-subtitle">Manage your Docker containers and platform services</p>
|
|
254
|
+
</div>
|
|
255
|
+
<div class="header-actions">
|
|
256
|
+
<button class="action-button secondary" @click=${() => this.currentView = 'backups'}>
|
|
257
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
258
|
+
<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/>
|
|
259
|
+
<polyline points="17 8 12 3 7 8"/>
|
|
260
|
+
<line x1="12" y1="3" x2="12" y2="15"/>
|
|
261
|
+
</svg>
|
|
262
|
+
Backups
|
|
263
|
+
</button>
|
|
264
|
+
<button class="action-button" @click=${() => this.currentView = 'create'}>
|
|
265
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
266
|
+
<line x1="12" y1="5" x2="12" y2="19"/>
|
|
267
|
+
<line x1="5" y1="12" x2="19" y2="12"/>
|
|
268
|
+
</svg>
|
|
269
|
+
Deploy Service
|
|
270
|
+
</button>
|
|
271
|
+
</div>
|
|
272
|
+
</div>
|
|
273
|
+
|
|
274
|
+
<div class="tabs">
|
|
275
|
+
<button class="tab active">Docker Services</button>
|
|
276
|
+
<button class="tab" @click=${() => { this.selectedPlatformService = this.demoPlatformService; this.currentView = 'platform-detail'; }}>Platform Services</button>
|
|
277
|
+
</div>
|
|
278
|
+
|
|
279
|
+
<sz-services-list-view
|
|
280
|
+
.services=${this.demoServices}
|
|
281
|
+
@view-service=${(e: CustomEvent) => { this.selectedService = e.detail; this.currentView = 'detail'; }}
|
|
282
|
+
@start-service=${(e: CustomEvent) => console.log('Start service:', e.detail)}
|
|
283
|
+
@stop-service=${(e: CustomEvent) => console.log('Stop service:', e.detail)}
|
|
284
|
+
@restart-service=${(e: CustomEvent) => console.log('Restart service:', e.detail)}
|
|
285
|
+
@delete-service=${(e: CustomEvent) => console.log('Delete service:', e.detail)}
|
|
286
|
+
></sz-services-list-view>
|
|
287
|
+
`;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
private renderCreateView(): TemplateResult {
|
|
291
|
+
return html`
|
|
292
|
+
<button class="back-button" @click=${() => this.currentView = 'list'}>
|
|
293
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
294
|
+
<polyline points="15 18 9 12 15 6"/>
|
|
295
|
+
</svg>
|
|
296
|
+
Back to Services
|
|
297
|
+
</button>
|
|
298
|
+
|
|
299
|
+
<sz-service-create-view
|
|
300
|
+
.registries=${[
|
|
301
|
+
{ id: '1', name: 'Onebox Registry', url: 'registry.onebox.local' },
|
|
302
|
+
{ id: '2', name: 'Docker Hub', url: 'docker.io' },
|
|
303
|
+
]}
|
|
304
|
+
@create-service=${(e: CustomEvent) => { console.log('Create service:', e.detail); this.currentView = 'list'; }}
|
|
305
|
+
@cancel=${() => this.currentView = 'list'}
|
|
306
|
+
></sz-service-create-view>
|
|
307
|
+
`;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
private renderDetailView(): TemplateResult {
|
|
311
|
+
return html`
|
|
312
|
+
<button class="back-button" @click=${() => this.currentView = 'list'}>
|
|
313
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
314
|
+
<polyline points="15 18 9 12 15 6"/>
|
|
315
|
+
</svg>
|
|
316
|
+
Back to Services
|
|
317
|
+
</button>
|
|
318
|
+
|
|
319
|
+
<sz-service-detail-view
|
|
320
|
+
.service=${{
|
|
321
|
+
id: this.selectedService?.id || '1',
|
|
322
|
+
name: this.selectedService?.name || 'nginx-proxy',
|
|
323
|
+
image: this.selectedService?.image || 'nginx:latest',
|
|
324
|
+
status: this.selectedService?.status || 'running',
|
|
325
|
+
ports: [{ host: '80', container: '80' }, { host: '443', container: '443' }],
|
|
326
|
+
envVars: [
|
|
327
|
+
{ key: 'NGINX_HOST', value: 'localhost' },
|
|
328
|
+
{ key: 'NGINX_PORT', value: '80' },
|
|
329
|
+
],
|
|
330
|
+
volumes: [
|
|
331
|
+
{ host: '/data/nginx/conf', container: '/etc/nginx/conf.d' },
|
|
332
|
+
],
|
|
333
|
+
createdAt: '2024-01-15 10:30:00',
|
|
334
|
+
restartPolicy: 'always',
|
|
335
|
+
}}
|
|
336
|
+
.logs=${[
|
|
337
|
+
{ timestamp: '2024-01-20 14:30:22', level: 'info', message: '127.0.0.1 - - [20/Jan/2024:14:30:22 +0000] "GET / HTTP/1.1" 200 612' },
|
|
338
|
+
{ timestamp: '2024-01-20 14:30:21', level: 'info', message: '127.0.0.1 - - [20/Jan/2024:14:30:21 +0000] "GET /api/health HTTP/1.1" 200 15' },
|
|
339
|
+
{ timestamp: '2024-01-20 14:30:20', level: 'warn', message: 'upstream timed out (110: Connection timed out)' },
|
|
340
|
+
{ timestamp: '2024-01-20 14:30:19', level: 'info', message: '127.0.0.1 - - [20/Jan/2024:14:30:19 +0000] "POST /api/data HTTP/1.1" 201 89' },
|
|
341
|
+
]}
|
|
342
|
+
@start=${() => console.log('Start')}
|
|
343
|
+
@stop=${() => console.log('Stop')}
|
|
344
|
+
@restart=${() => console.log('Restart')}
|
|
345
|
+
></sz-service-detail-view>
|
|
346
|
+
`;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
private renderBackupsView(): TemplateResult {
|
|
350
|
+
return html`
|
|
351
|
+
<button class="back-button" @click=${() => this.currentView = 'list'}>
|
|
352
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
353
|
+
<polyline points="15 18 9 12 15 6"/>
|
|
354
|
+
</svg>
|
|
355
|
+
Back to Services
|
|
356
|
+
</button>
|
|
357
|
+
|
|
358
|
+
<div class="page-header">
|
|
359
|
+
<div class="header-info">
|
|
360
|
+
<h1 class="page-title">Backups</h1>
|
|
361
|
+
<p class="page-subtitle">Manage backup schedules and restore points</p>
|
|
362
|
+
</div>
|
|
363
|
+
</div>
|
|
364
|
+
|
|
365
|
+
<sz-services-backups-view
|
|
366
|
+
.schedules=${this.demoBackupSchedules}
|
|
367
|
+
.backups=${this.demoBackups}
|
|
368
|
+
@create-schedule=${() => console.log('Create schedule')}
|
|
369
|
+
@run-now=${(e: CustomEvent) => console.log('Run now:', e.detail)}
|
|
370
|
+
@download=${(e: CustomEvent) => console.log('Download:', e.detail)}
|
|
371
|
+
></sz-services-backups-view>
|
|
372
|
+
`;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
private renderPlatformDetailView(): TemplateResult {
|
|
376
|
+
return html`
|
|
377
|
+
<button class="back-button" @click=${() => this.currentView = 'list'}>
|
|
378
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
379
|
+
<polyline points="15 18 9 12 15 6"/>
|
|
380
|
+
</svg>
|
|
381
|
+
Back to Services
|
|
382
|
+
</button>
|
|
383
|
+
|
|
384
|
+
<sz-platform-service-detail-view
|
|
385
|
+
.service=${this.demoPlatformService}
|
|
386
|
+
.logs=${this.demoPlatformLogs}
|
|
387
|
+
@start=${() => console.log('Start')}
|
|
388
|
+
@stop=${() => console.log('Stop')}
|
|
389
|
+
@restart=${() => console.log('Restart')}
|
|
390
|
+
></sz-platform-service-detail-view>
|
|
391
|
+
`;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
async onActivate(context: { appui: DeesAppui; viewId: string }) {
|
|
395
|
+
this.appui = context.appui;
|
|
396
|
+
|
|
397
|
+
// Set up content tabs
|
|
398
|
+
this.appui.setContentTabs([
|
|
399
|
+
{ key: 'Docker Services', action: () => { this.currentView = 'list'; this.updateSecondaryMenu(); } },
|
|
400
|
+
{ key: 'Platform Services', action: () => { this.currentView = 'platform-detail'; this.updateSecondaryMenu(); } },
|
|
401
|
+
{ key: 'Backups', action: () => { this.currentView = 'backups'; this.updateSecondaryMenu(); } },
|
|
402
|
+
]);
|
|
403
|
+
|
|
404
|
+
this.updateSecondaryMenu();
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
private updateSecondaryMenu() {
|
|
408
|
+
if (!this.appui) return;
|
|
409
|
+
|
|
410
|
+
this.appui.setSecondaryMenu({
|
|
411
|
+
heading: 'Services',
|
|
412
|
+
groups: [
|
|
413
|
+
{
|
|
414
|
+
name: 'Actions',
|
|
415
|
+
items: [
|
|
416
|
+
{ type: 'action', key: 'Deploy Service', iconName: 'lucide:Plus', action: () => { this.currentView = 'create'; } },
|
|
417
|
+
{ type: 'action', key: 'Refresh', iconName: 'lucide:RefreshCw', action: () => { console.log('Refresh'); } },
|
|
418
|
+
],
|
|
419
|
+
},
|
|
420
|
+
{
|
|
421
|
+
name: 'Quick Filters',
|
|
422
|
+
items: [
|
|
423
|
+
{ key: 'Running', iconName: 'lucide:Play', badge: '3', badgeVariant: 'success', action: () => { console.log('Filter running'); } },
|
|
424
|
+
{ key: 'Stopped', iconName: 'lucide:Square', badge: '1', action: () => { console.log('Filter stopped'); } },
|
|
425
|
+
],
|
|
426
|
+
},
|
|
427
|
+
],
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
onDeactivate() {
|
|
432
|
+
// Cleanup if needed
|
|
433
|
+
}
|
|
434
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DeesElement,
|
|
3
|
+
customElement,
|
|
4
|
+
html,
|
|
5
|
+
css,
|
|
6
|
+
cssManager,
|
|
7
|
+
type TemplateResult,
|
|
8
|
+
} from '@design.estate/dees-element';
|
|
9
|
+
import type { DeesAppui } from '@design.estate/dees-catalog';
|
|
10
|
+
import './index.js';
|
|
11
|
+
|
|
12
|
+
declare global {
|
|
13
|
+
interface HTMLElementTagNameMap {
|
|
14
|
+
'sz-demo-view-settings': SzDemoViewSettings;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
@customElement('sz-demo-view-settings')
|
|
19
|
+
export class SzDemoViewSettings extends DeesElement {
|
|
20
|
+
private appui: DeesAppui | null = null;
|
|
21
|
+
|
|
22
|
+
async onActivate(context: { appui: DeesAppui; viewId: string }) {
|
|
23
|
+
this.appui = context.appui;
|
|
24
|
+
|
|
25
|
+
// Settings doesn't need content tabs, but we set up the secondary menu
|
|
26
|
+
this.appui.setSecondaryMenu({
|
|
27
|
+
heading: 'Settings',
|
|
28
|
+
groups: [
|
|
29
|
+
{
|
|
30
|
+
name: 'Categories',
|
|
31
|
+
items: [
|
|
32
|
+
{ key: 'General', iconName: 'lucide:Settings', action: () => { console.log('General settings'); } },
|
|
33
|
+
{ key: 'Network', iconName: 'lucide:Network', action: () => { console.log('Network settings'); } },
|
|
34
|
+
{ key: 'Security', iconName: 'lucide:Shield', action: () => { console.log('Security settings'); } },
|
|
35
|
+
{ key: 'Certificates', iconName: 'lucide:FileBadge', action: () => { console.log('Certificate settings'); } },
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Actions',
|
|
40
|
+
items: [
|
|
41
|
+
{ type: 'action', key: 'Export Config', iconName: 'lucide:Download', action: () => { console.log('Export config'); } },
|
|
42
|
+
{ type: 'action', key: 'Import Config', iconName: 'lucide:Upload', action: () => { console.log('Import config'); } },
|
|
43
|
+
{ type: 'action', variant: 'danger', key: 'Reset to Default', iconName: 'lucide:RotateCcw', confirmMessage: 'Are you sure you want to reset all settings to default?', action: () => { console.log('Reset settings'); } },
|
|
44
|
+
],
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
onDeactivate() {
|
|
51
|
+
// Cleanup if needed
|
|
52
|
+
}
|
|
53
|
+
private demoSettings = {
|
|
54
|
+
darkMode: true,
|
|
55
|
+
cloudflareToken: '',
|
|
56
|
+
cloudflareZoneId: '',
|
|
57
|
+
autoRenewCerts: true,
|
|
58
|
+
renewalThreshold: 30,
|
|
59
|
+
acmeEmail: 'admin@serve.zone',
|
|
60
|
+
httpPort: 80,
|
|
61
|
+
httpsPort: 443,
|
|
62
|
+
forceHttps: true,
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
public static styles = [
|
|
66
|
+
cssManager.defaultStyles,
|
|
67
|
+
css`
|
|
68
|
+
:host {
|
|
69
|
+
display: block;
|
|
70
|
+
padding: 24px;
|
|
71
|
+
height: 100%;
|
|
72
|
+
overflow-y: auto;
|
|
73
|
+
box-sizing: border-box;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.page-header {
|
|
77
|
+
margin-bottom: 24px;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.page-title {
|
|
81
|
+
font-size: 24px;
|
|
82
|
+
font-weight: 700;
|
|
83
|
+
color: ${cssManager.bdTheme('#18181b', '#fafafa')};
|
|
84
|
+
margin: 0 0 8px 0;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.page-subtitle {
|
|
88
|
+
font-size: 14px;
|
|
89
|
+
color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
|
|
90
|
+
margin: 0;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.settings-container {
|
|
94
|
+
max-width: 800px;
|
|
95
|
+
}
|
|
96
|
+
`,
|
|
97
|
+
];
|
|
98
|
+
|
|
99
|
+
public render(): TemplateResult {
|
|
100
|
+
return html`
|
|
101
|
+
<div class="page-header">
|
|
102
|
+
<h1 class="page-title">Settings</h1>
|
|
103
|
+
<p class="page-subtitle">Configure your onebox instance</p>
|
|
104
|
+
</div>
|
|
105
|
+
|
|
106
|
+
<div class="settings-container">
|
|
107
|
+
<sz-settings-view
|
|
108
|
+
.settings=${this.demoSettings}
|
|
109
|
+
currentUser="admin"
|
|
110
|
+
@setting-change=${(e: CustomEvent) => console.log('Setting change:', e.detail)}
|
|
111
|
+
@change-password=${(e: CustomEvent) => console.log('Change password:', e.detail)}
|
|
112
|
+
@reset=${() => console.log('Reset settings')}
|
|
113
|
+
@save=${(e: CustomEvent) => console.log('Save settings:', e.detail)}
|
|
114
|
+
></sz-settings-view>
|
|
115
|
+
</div>
|
|
116
|
+
`;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DeesElement,
|
|
3
|
+
customElement,
|
|
4
|
+
html,
|
|
5
|
+
css,
|
|
6
|
+
cssManager,
|
|
7
|
+
type TemplateResult,
|
|
8
|
+
} from '@design.estate/dees-element';
|
|
9
|
+
import type { DeesAppui } from '@design.estate/dees-catalog';
|
|
10
|
+
import './index.js';
|
|
11
|
+
|
|
12
|
+
declare global {
|
|
13
|
+
interface HTMLElementTagNameMap {
|
|
14
|
+
'sz-demo-view-tokens': SzDemoViewTokens;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
@customElement('sz-demo-view-tokens')
|
|
19
|
+
export class SzDemoViewTokens extends DeesElement {
|
|
20
|
+
private appui: DeesAppui | null = null;
|
|
21
|
+
|
|
22
|
+
async onActivate(context: { appui: DeesAppui; viewId: string }) {
|
|
23
|
+
this.appui = context.appui;
|
|
24
|
+
|
|
25
|
+
// Tokens secondary menu
|
|
26
|
+
this.appui.setSecondaryMenu({
|
|
27
|
+
heading: 'Tokens',
|
|
28
|
+
groups: [
|
|
29
|
+
{
|
|
30
|
+
name: 'Actions',
|
|
31
|
+
items: [
|
|
32
|
+
{ type: 'action', key: 'Create Global Token', iconName: 'lucide:Plus', action: () => { console.log('Create global token'); } },
|
|
33
|
+
{ type: 'action', key: 'Create CI Token', iconName: 'lucide:GitBranch', action: () => { console.log('Create CI token'); } },
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: 'Token Types',
|
|
38
|
+
items: [
|
|
39
|
+
{ key: 'Global Tokens', iconName: 'lucide:Key', badge: '3', action: () => { console.log('Filter global'); } },
|
|
40
|
+
{ key: 'CI Tokens', iconName: 'lucide:Cpu', badge: '3', action: () => { console.log('Filter CI'); } },
|
|
41
|
+
],
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
onDeactivate() {
|
|
48
|
+
// Cleanup if needed
|
|
49
|
+
}
|
|
50
|
+
private demoGlobalTokens = [
|
|
51
|
+
{ id: '1', name: 'CI/CD Pipeline', type: 'global' as const, createdAt: '2024-01-15', lastUsed: '2024-01-20' },
|
|
52
|
+
{ id: '2', name: 'Development', type: 'global' as const, createdAt: '2024-01-10' },
|
|
53
|
+
{ id: '3', name: 'Production Deploy', type: 'global' as const, createdAt: '2024-01-05', lastUsed: '2024-01-19' },
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
private demoCiTokens = [
|
|
57
|
+
{ id: '4', name: 'api-gateway-ci', type: 'ci' as const, service: 'api-gateway', createdAt: '2024-01-18', lastUsed: '2024-01-20' },
|
|
58
|
+
{ id: '5', name: 'frontend-ci', type: 'ci' as const, service: 'frontend', createdAt: '2024-01-12', lastUsed: '2024-01-19' },
|
|
59
|
+
{ id: '6', name: 'worker-service-ci', type: 'ci' as const, service: 'worker-service', createdAt: '2024-01-08' },
|
|
60
|
+
];
|
|
61
|
+
|
|
62
|
+
public static styles = [
|
|
63
|
+
cssManager.defaultStyles,
|
|
64
|
+
css`
|
|
65
|
+
:host {
|
|
66
|
+
display: block;
|
|
67
|
+
padding: 24px;
|
|
68
|
+
height: 100%;
|
|
69
|
+
overflow-y: auto;
|
|
70
|
+
box-sizing: border-box;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.page-header {
|
|
74
|
+
margin-bottom: 24px;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.page-title {
|
|
78
|
+
font-size: 24px;
|
|
79
|
+
font-weight: 700;
|
|
80
|
+
color: ${cssManager.bdTheme('#18181b', '#fafafa')};
|
|
81
|
+
margin: 0 0 8px 0;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.page-subtitle {
|
|
85
|
+
font-size: 14px;
|
|
86
|
+
color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
|
|
87
|
+
margin: 0;
|
|
88
|
+
}
|
|
89
|
+
`,
|
|
90
|
+
];
|
|
91
|
+
|
|
92
|
+
public render(): TemplateResult {
|
|
93
|
+
return html`
|
|
94
|
+
<div class="page-header">
|
|
95
|
+
<h1 class="page-title">Tokens</h1>
|
|
96
|
+
<p class="page-subtitle">Manage registry access tokens for CI/CD pipelines</p>
|
|
97
|
+
</div>
|
|
98
|
+
|
|
99
|
+
<sz-tokens-view
|
|
100
|
+
.globalTokens=${this.demoGlobalTokens}
|
|
101
|
+
.ciTokens=${this.demoCiTokens}
|
|
102
|
+
@create=${(e: CustomEvent) => console.log('Create token:', e.detail)}
|
|
103
|
+
@copy=${(e: CustomEvent) => console.log('Copy token:', e.detail)}
|
|
104
|
+
@regenerate=${(e: CustomEvent) => console.log('Regenerate token:', e.detail)}
|
|
105
|
+
@delete=${(e: CustomEvent) => console.log('Delete token:', e.detail)}
|
|
106
|
+
></sz-tokens-view>
|
|
107
|
+
`;
|
|
108
|
+
}
|
|
109
|
+
}
|