@serve.zone/gitops 2.13.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.
Files changed (258) hide show
  1. package/.smartconfig.json +114 -0
  2. package/binary/gitops.ts +4 -0
  3. package/changelog.md +185 -0
  4. package/cli.child.js +4 -0
  5. package/cli.js +4 -0
  6. package/cli.ts.js +5 -0
  7. package/deno.json +10 -0
  8. package/dist_serve/bundle.js +36362 -0
  9. package/dist_serve/index.html +33 -0
  10. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  11. package/dist_ts/00_commitinfo_data.js +9 -0
  12. package/dist_ts/cache/classes.cache.cleaner.d.ts +23 -0
  13. package/dist_ts/cache/classes.cache.cleaner.js +61 -0
  14. package/dist_ts/cache/classes.cached.document.d.ts +30 -0
  15. package/dist_ts/cache/classes.cached.document.js +101 -0
  16. package/dist_ts/cache/classes.cachedb.d.ts +22 -0
  17. package/dist_ts/cache/classes.cachedb.js +58 -0
  18. package/dist_ts/cache/classes.secrets.scan.service.d.ts +51 -0
  19. package/dist_ts/cache/classes.secrets.scan.service.js +237 -0
  20. package/dist_ts/cache/documents/classes.cached.project.d.ts +13 -0
  21. package/dist_ts/cache/documents/classes.cached.project.js +101 -0
  22. package/dist_ts/cache/documents/classes.cached.secret.d.ts +24 -0
  23. package/dist_ts/cache/documents/classes.cached.secret.js +158 -0
  24. package/dist_ts/cache/documents/index.d.ts +2 -0
  25. package/dist_ts/cache/documents/index.js +3 -0
  26. package/dist_ts/cache/index.d.ts +7 -0
  27. package/dist_ts/cache/index.js +6 -0
  28. package/dist_ts/classes/actionlog.d.ts +19 -0
  29. package/dist_ts/classes/actionlog.js +44 -0
  30. package/dist_ts/classes/connectionmanager.d.ts +57 -0
  31. package/dist_ts/classes/connectionmanager.js +247 -0
  32. package/dist_ts/classes/gitopsapp.d.ts +30 -0
  33. package/dist_ts/classes/gitopsapp.js +101 -0
  34. package/dist_ts/classes/jobmanager.d.ts +47 -0
  35. package/dist_ts/classes/jobmanager.js +301 -0
  36. package/dist_ts/classes/jobrunners/autobookstackdocs.runner.d.ts +29 -0
  37. package/dist_ts/classes/jobrunners/autobookstackdocs.runner.js +361 -0
  38. package/dist_ts/classes/jobrunners/base.jobrunner.d.ts +14 -0
  39. package/dist_ts/classes/jobrunners/base.jobrunner.js +3 -0
  40. package/dist_ts/classes/jobrunners/index.d.ts +5 -0
  41. package/dist_ts/classes/jobrunners/index.js +14 -0
  42. package/dist_ts/classes/managedsecrets.manager.d.ts +47 -0
  43. package/dist_ts/classes/managedsecrets.manager.js +247 -0
  44. package/dist_ts/classes/syncmanager.d.ts +189 -0
  45. package/dist_ts/classes/syncmanager.js +1787 -0
  46. package/dist_ts/index.d.ts +6 -0
  47. package/dist_ts/index.js +32 -0
  48. package/dist_ts/logging.d.ts +49 -0
  49. package/dist_ts/logging.js +134 -0
  50. package/dist_ts/opsserver/classes.opsserver.d.ts +25 -0
  51. package/dist_ts/opsserver/classes.opsserver.js +70 -0
  52. package/dist_ts/opsserver/handlers/actionlog.handler.d.ts +9 -0
  53. package/dist_ts/opsserver/handlers/actionlog.handler.js +24 -0
  54. package/dist_ts/opsserver/handlers/actions.handler.d.ts +9 -0
  55. package/dist_ts/opsserver/handlers/actions.handler.js +38 -0
  56. package/dist_ts/opsserver/handlers/admin.handler.d.ts +19 -0
  57. package/dist_ts/opsserver/handlers/admin.handler.js +96 -0
  58. package/dist_ts/opsserver/handlers/connections.handler.d.ts +10 -0
  59. package/dist_ts/opsserver/handlers/connections.handler.js +109 -0
  60. package/dist_ts/opsserver/handlers/groups.handler.d.ts +9 -0
  61. package/dist_ts/opsserver/handlers/groups.handler.js +24 -0
  62. package/dist_ts/opsserver/handlers/index.d.ts +13 -0
  63. package/dist_ts/opsserver/handlers/index.js +14 -0
  64. package/dist_ts/opsserver/handlers/jobs.handler.d.ts +16 -0
  65. package/dist_ts/opsserver/handlers/jobs.handler.js +146 -0
  66. package/dist_ts/opsserver/handlers/logs.handler.d.ts +9 -0
  67. package/dist_ts/opsserver/handlers/logs.handler.js +21 -0
  68. package/dist_ts/opsserver/handlers/managedsecrets.handler.d.ts +11 -0
  69. package/dist_ts/opsserver/handlers/managedsecrets.handler.js +110 -0
  70. package/dist_ts/opsserver/handlers/pipelines.handler.d.ts +31 -0
  71. package/dist_ts/opsserver/handlers/pipelines.handler.js +204 -0
  72. package/dist_ts/opsserver/handlers/projects.handler.d.ts +9 -0
  73. package/dist_ts/opsserver/handlers/projects.handler.js +24 -0
  74. package/dist_ts/opsserver/handlers/secrets.handler.d.ts +10 -0
  75. package/dist_ts/opsserver/handlers/secrets.handler.js +171 -0
  76. package/dist_ts/opsserver/handlers/sync.handler.d.ts +16 -0
  77. package/dist_ts/opsserver/handlers/sync.handler.js +166 -0
  78. package/dist_ts/opsserver/handlers/webhook.handler.d.ts +7 -0
  79. package/dist_ts/opsserver/handlers/webhook.handler.js +55 -0
  80. package/dist_ts/opsserver/helpers/guards.d.ts +5 -0
  81. package/dist_ts/opsserver/helpers/guards.js +12 -0
  82. package/dist_ts/opsserver/index.d.ts +1 -0
  83. package/dist_ts/opsserver/index.js +2 -0
  84. package/dist_ts/paths.d.ts +9 -0
  85. package/dist_ts/paths.js +13 -0
  86. package/dist_ts/plugins.d.ts +25 -0
  87. package/dist_ts/plugins.js +32 -0
  88. package/dist_ts/providers/classes.baseprovider.d.ts +51 -0
  89. package/dist_ts/providers/classes.baseprovider.js +17 -0
  90. package/dist_ts/providers/classes.giteaprovider.d.ts +40 -0
  91. package/dist_ts/providers/classes.giteaprovider.js +224 -0
  92. package/dist_ts/providers/classes.gitlabprovider.d.ts +39 -0
  93. package/dist_ts/providers/classes.gitlabprovider.js +207 -0
  94. package/dist_ts/providers/index.d.ts +3 -0
  95. package/dist_ts/providers/index.js +4 -0
  96. package/dist_ts/storage/classes.storagemanager.d.ts +33 -0
  97. package/dist_ts/storage/classes.storagemanager.js +135 -0
  98. package/dist_ts/storage/index.d.ts +2 -0
  99. package/dist_ts/storage/index.js +2 -0
  100. package/dist_ts/timers.d.ts +4 -0
  101. package/dist_ts/timers.js +24 -0
  102. package/dist_ts_bundled/bundle.d.ts +4 -0
  103. package/dist_ts_bundled/bundle.js +12 -0
  104. package/dist_ts_interfaces/data/actionlog.d.ts +12 -0
  105. package/dist_ts_interfaces/data/actionlog.js +2 -0
  106. package/dist_ts_interfaces/data/branch.d.ts +8 -0
  107. package/dist_ts_interfaces/data/branch.js +2 -0
  108. package/dist_ts_interfaces/data/connection.d.ts +12 -0
  109. package/dist_ts_interfaces/data/connection.js +2 -0
  110. package/dist_ts_interfaces/data/group.d.ts +10 -0
  111. package/dist_ts_interfaces/data/group.js +2 -0
  112. package/dist_ts_interfaces/data/identity.d.ts +7 -0
  113. package/dist_ts_interfaces/data/identity.js +2 -0
  114. package/dist_ts_interfaces/data/index.d.ts +11 -0
  115. package/dist_ts_interfaces/data/index.js +12 -0
  116. package/dist_ts_interfaces/data/job.d.ts +37 -0
  117. package/dist_ts_interfaces/data/job.js +2 -0
  118. package/dist_ts_interfaces/data/managedsecret.d.ts +37 -0
  119. package/dist_ts_interfaces/data/managedsecret.js +2 -0
  120. package/dist_ts_interfaces/data/pipeline.d.ts +22 -0
  121. package/dist_ts_interfaces/data/pipeline.js +2 -0
  122. package/dist_ts_interfaces/data/project.d.ts +12 -0
  123. package/dist_ts_interfaces/data/project.js +2 -0
  124. package/dist_ts_interfaces/data/secret.d.ts +11 -0
  125. package/dist_ts_interfaces/data/secret.js +2 -0
  126. package/dist_ts_interfaces/data/sync.d.ts +34 -0
  127. package/dist_ts_interfaces/data/sync.js +2 -0
  128. package/dist_ts_interfaces/index.d.ts +5 -0
  129. package/dist_ts_interfaces/index.js +8 -0
  130. package/dist_ts_interfaces/plugins.d.ts +2 -0
  131. package/dist_ts_interfaces/plugins.js +4 -0
  132. package/dist_ts_interfaces/requests/actionlog.d.ts +15 -0
  133. package/dist_ts_interfaces/requests/actionlog.js +3 -0
  134. package/dist_ts_interfaces/requests/actions.d.ts +31 -0
  135. package/dist_ts_interfaces/requests/actions.js +3 -0
  136. package/dist_ts_interfaces/requests/admin.d.ts +31 -0
  137. package/dist_ts_interfaces/requests/admin.js +3 -0
  138. package/dist_ts_interfaces/requests/connections.d.ts +71 -0
  139. package/dist_ts_interfaces/requests/connections.js +3 -0
  140. package/dist_ts_interfaces/requests/groups.d.ts +14 -0
  141. package/dist_ts_interfaces/requests/groups.js +3 -0
  142. package/dist_ts_interfaces/requests/index.d.ts +13 -0
  143. package/dist_ts_interfaces/requests/index.js +14 -0
  144. package/dist_ts_interfaces/requests/jobs.d.ts +86 -0
  145. package/dist_ts_interfaces/requests/jobs.js +3 -0
  146. package/dist_ts_interfaces/requests/logs.d.ts +14 -0
  147. package/dist_ts_interfaces/requests/logs.js +3 -0
  148. package/dist_ts_interfaces/requests/managedsecrets.d.ts +84 -0
  149. package/dist_ts_interfaces/requests/managedsecrets.js +3 -0
  150. package/dist_ts_interfaces/requests/pipelines.d.ts +55 -0
  151. package/dist_ts_interfaces/requests/pipelines.js +3 -0
  152. package/dist_ts_interfaces/requests/projects.d.ts +14 -0
  153. package/dist_ts_interfaces/requests/projects.js +3 -0
  154. package/dist_ts_interfaces/requests/secrets.d.ts +72 -0
  155. package/dist_ts_interfaces/requests/secrets.js +3 -0
  156. package/dist_ts_interfaces/requests/sync.d.ts +120 -0
  157. package/dist_ts_interfaces/requests/sync.js +3 -0
  158. package/dist_ts_interfaces/requests/webhook.d.ts +13 -0
  159. package/dist_ts_interfaces/requests/webhook.js +3 -0
  160. package/license +21 -0
  161. package/package.json +81 -0
  162. package/readme.md +177 -0
  163. package/readme.todo.md +3 -0
  164. package/ts/00_commitinfo_data.ts +8 -0
  165. package/ts/cache/classes.cache.cleaner.ts +69 -0
  166. package/ts/cache/classes.cached.document.ts +57 -0
  167. package/ts/cache/classes.cachedb.ts +72 -0
  168. package/ts/cache/classes.secrets.scan.service.ts +267 -0
  169. package/ts/cache/documents/classes.cached.project.ts +32 -0
  170. package/ts/cache/documents/classes.cached.secret.ts +81 -0
  171. package/ts/cache/documents/index.ts +2 -0
  172. package/ts/cache/index.ts +7 -0
  173. package/ts/classes/actionlog.ts +57 -0
  174. package/ts/classes/connectionmanager.ts +263 -0
  175. package/ts/classes/gitopsapp.ts +128 -0
  176. package/ts/classes/jobmanager.ts +337 -0
  177. package/ts/classes/jobrunners/autobookstackdocs.runner.ts +435 -0
  178. package/ts/classes/jobrunners/base.jobrunner.ts +16 -0
  179. package/ts/classes/jobrunners/index.ts +17 -0
  180. package/ts/classes/managedsecrets.manager.ts +322 -0
  181. package/ts/classes/syncmanager.ts +2117 -0
  182. package/ts/index.ts +37 -0
  183. package/ts/logging.ts +162 -0
  184. package/ts/opsserver/classes.opsserver.ts +86 -0
  185. package/ts/opsserver/handlers/actionlog.handler.ts +30 -0
  186. package/ts/opsserver/handlers/actions.handler.ts +50 -0
  187. package/ts/opsserver/handlers/admin.handler.ts +122 -0
  188. package/ts/opsserver/handlers/connections.handler.ts +162 -0
  189. package/ts/opsserver/handlers/groups.handler.ts +32 -0
  190. package/ts/opsserver/handlers/index.ts +13 -0
  191. package/ts/opsserver/handlers/jobs.handler.ts +189 -0
  192. package/ts/opsserver/handlers/logs.handler.ts +29 -0
  193. package/ts/opsserver/handlers/managedsecrets.handler.ts +158 -0
  194. package/ts/opsserver/handlers/pipelines.handler.ts +281 -0
  195. package/ts/opsserver/handlers/projects.handler.ts +32 -0
  196. package/ts/opsserver/handlers/secrets.handler.ts +224 -0
  197. package/ts/opsserver/handlers/sync.handler.ts +224 -0
  198. package/ts/opsserver/handlers/webhook.handler.ts +62 -0
  199. package/ts/opsserver/helpers/guards.ts +16 -0
  200. package/ts/opsserver/index.ts +1 -0
  201. package/ts/paths.ts +19 -0
  202. package/ts/plugins.ts +38 -0
  203. package/ts/providers/classes.baseprovider.ts +99 -0
  204. package/ts/providers/classes.giteaprovider.ts +279 -0
  205. package/ts/providers/classes.gitlabprovider.ts +265 -0
  206. package/ts/providers/index.ts +3 -0
  207. package/ts/storage/classes.storagemanager.ts +144 -0
  208. package/ts/storage/index.ts +2 -0
  209. package/ts/timers.ts +34 -0
  210. package/ts_interfaces/data/actionlog.ts +13 -0
  211. package/ts_interfaces/data/branch.ts +9 -0
  212. package/ts_interfaces/data/connection.ts +13 -0
  213. package/ts_interfaces/data/group.ts +10 -0
  214. package/ts_interfaces/data/identity.ts +7 -0
  215. package/ts_interfaces/data/index.ts +11 -0
  216. package/ts_interfaces/data/job.ts +42 -0
  217. package/ts_interfaces/data/managedsecret.ts +41 -0
  218. package/ts_interfaces/data/pipeline.ts +32 -0
  219. package/ts_interfaces/data/project.ts +12 -0
  220. package/ts_interfaces/data/secret.ts +11 -0
  221. package/ts_interfaces/data/sync.ts +37 -0
  222. package/ts_interfaces/index.ts +9 -0
  223. package/ts_interfaces/plugins.ts +6 -0
  224. package/ts_interfaces/requests/actionlog.ts +19 -0
  225. package/ts_interfaces/requests/actions.ts +39 -0
  226. package/ts_interfaces/requests/admin.ts +43 -0
  227. package/ts_interfaces/requests/connections.ts +95 -0
  228. package/ts_interfaces/requests/groups.ts +18 -0
  229. package/ts_interfaces/requests/index.ts +13 -0
  230. package/ts_interfaces/requests/jobs.ts +118 -0
  231. package/ts_interfaces/requests/logs.ts +18 -0
  232. package/ts_interfaces/requests/managedsecrets.ts +112 -0
  233. package/ts_interfaces/requests/pipelines.ts +71 -0
  234. package/ts_interfaces/requests/projects.ts +18 -0
  235. package/ts_interfaces/requests/secrets.ts +92 -0
  236. package/ts_interfaces/requests/sync.ts +157 -0
  237. package/ts_interfaces/requests/webhook.ts +18 -0
  238. package/ts_web/00_commitinfo_data.ts +8 -0
  239. package/ts_web/appstate.ts +1251 -0
  240. package/ts_web/elements/gitops-dashboard.ts +350 -0
  241. package/ts_web/elements/index.ts +10 -0
  242. package/ts_web/elements/shared/css.ts +29 -0
  243. package/ts_web/elements/shared/index.ts +1 -0
  244. package/ts_web/elements/views/actionlog/index.ts +101 -0
  245. package/ts_web/elements/views/actions/index.ts +209 -0
  246. package/ts_web/elements/views/buildlog/index.ts +196 -0
  247. package/ts_web/elements/views/connections/index.ts +260 -0
  248. package/ts_web/elements/views/groups/index.ts +134 -0
  249. package/ts_web/elements/views/jobs/index.ts +424 -0
  250. package/ts_web/elements/views/managedsecrets/index.ts +502 -0
  251. package/ts_web/elements/views/overview/index.ts +86 -0
  252. package/ts_web/elements/views/pipelines/index.ts +561 -0
  253. package/ts_web/elements/views/projects/index.ts +149 -0
  254. package/ts_web/elements/views/secrets/index.ts +310 -0
  255. package/ts_web/elements/views/sync/index.ts +512 -0
  256. package/ts_web/index.ts +7 -0
  257. package/ts_web/plugins.ts +15 -0
  258. package/tsconfig.json +15 -0
@@ -0,0 +1,196 @@
1
+ import * as plugins from '../../../plugins.js';
2
+ import * as appstate from '../../../appstate.js';
3
+ import { viewHostCss } from '../../shared/index.js';
4
+ import {
5
+ DeesElement,
6
+ customElement,
7
+ html,
8
+ state,
9
+ css,
10
+ cssManager,
11
+ type TemplateResult,
12
+ } from '@design.estate/dees-element';
13
+
14
+ @customElement('gitops-view-buildlog')
15
+ export class GitopsViewBuildlog extends DeesElement {
16
+ @state()
17
+ accessor connectionsState: appstate.IConnectionsState = {
18
+ connections: [],
19
+ activeConnectionId: null,
20
+ };
21
+
22
+ @state()
23
+ accessor dataState: appstate.IDataState = {
24
+ projects: [],
25
+ groups: [],
26
+ secrets: [],
27
+ pipelines: [],
28
+ pipelineJobs: [],
29
+ currentJobLog: '',
30
+ };
31
+
32
+ @state()
33
+ accessor selectedConnectionId: string = '';
34
+
35
+ @state()
36
+ accessor selectedProjectId: string = '';
37
+
38
+ @state()
39
+ accessor selectedJobId: string = '';
40
+
41
+ private _autoRefreshHandler: () => void;
42
+
43
+ constructor() {
44
+ super();
45
+ const connSub = appstate.connectionsStatePart
46
+ .select((s) => s)
47
+ .subscribe((s) => { this.connectionsState = s; });
48
+ this.rxSubscriptions.push(connSub);
49
+
50
+ const dataSub = appstate.dataStatePart
51
+ .select((s) => s)
52
+ .subscribe((s) => { this.dataState = s; });
53
+ this.rxSubscriptions.push(dataSub);
54
+
55
+ this._autoRefreshHandler = () => this.handleAutoRefresh();
56
+ document.addEventListener('gitops-auto-refresh', this._autoRefreshHandler);
57
+ }
58
+
59
+ public override disconnectedCallback() {
60
+ super.disconnectedCallback();
61
+ document.removeEventListener('gitops-auto-refresh', this._autoRefreshHandler);
62
+ }
63
+
64
+ private handleAutoRefresh(): void {
65
+ this.fetchLog();
66
+ }
67
+
68
+ public static styles = [
69
+ cssManager.defaultStyles,
70
+ viewHostCss,
71
+ css`
72
+ .log-container {
73
+ background: #0d0d0d;
74
+ border: 1px solid #333;
75
+ border-radius: 8px;
76
+ padding: 16px;
77
+ font-family: 'Fira Code', 'Courier New', monospace;
78
+ font-size: 13px;
79
+ line-height: 1.6;
80
+ color: #ccc;
81
+ max-height: 600px;
82
+ overflow-y: auto;
83
+ white-space: pre-wrap;
84
+ word-break: break-all;
85
+ }
86
+ .log-empty {
87
+ color: #666;
88
+ text-align: center;
89
+ padding: 40px;
90
+ }
91
+ .job-meta {
92
+ display: flex;
93
+ gap: 16px;
94
+ margin-bottom: 16px;
95
+ padding: 12px;
96
+ background: #1a1a2e;
97
+ border-radius: 8px;
98
+ font-size: 14px;
99
+ }
100
+ .job-meta-item {
101
+ color: #999;
102
+ }
103
+ .job-meta-item strong {
104
+ color: #fff;
105
+ }
106
+ `,
107
+ ];
108
+
109
+ public render(): TemplateResult {
110
+ const connectionOptions = this.connectionsState.connections.map((c) => ({
111
+ option: `${c.name} (${c.providerType})`,
112
+ key: c.id,
113
+ }));
114
+
115
+ const projectOptions = this.dataState.projects.map((p) => ({
116
+ option: p.fullPath || p.name,
117
+ key: p.id,
118
+ }));
119
+
120
+ const jobOptions = this.dataState.pipelineJobs.map((j) => ({
121
+ option: `${j.name} (${j.status})`,
122
+ key: j.id,
123
+ }));
124
+
125
+ return html`
126
+ <div class="view-title">Build Log</div>
127
+ <div class="view-description">View raw build logs for CI/CD jobs</div>
128
+ <div class="toolbar">
129
+ <dees-input-dropdown
130
+ .label=${'Connection'}
131
+ .options=${connectionOptions}
132
+ .selectedOption=${connectionOptions.find((o) => o.key === this.selectedConnectionId) || connectionOptions[0]}
133
+ @selectedOption=${(e: CustomEvent) => {
134
+ this.selectedConnectionId = e.detail.key;
135
+ this.loadProjects();
136
+ }}
137
+ ></dees-input-dropdown>
138
+ <dees-input-dropdown
139
+ .label=${'Project'}
140
+ .options=${projectOptions}
141
+ .selectedOption=${projectOptions.find((o) => o.key === this.selectedProjectId) || projectOptions[0]}
142
+ @selectedOption=${(e: CustomEvent) => {
143
+ this.selectedProjectId = e.detail.key;
144
+ }}
145
+ ></dees-input-dropdown>
146
+ <dees-input-dropdown
147
+ .label=${'Job'}
148
+ .options=${jobOptions}
149
+ .selectedOption=${jobOptions.find((o) => o.key === this.selectedJobId) || jobOptions[0]}
150
+ @selectedOption=${(e: CustomEvent) => {
151
+ this.selectedJobId = e.detail.key;
152
+ }}
153
+ ></dees-input-dropdown>
154
+ <dees-button @click=${() => this.fetchLog()}>Fetch Log</dees-button>
155
+ <dees-button @click=${() => this.fetchLog()}>Refresh</dees-button>
156
+ </div>
157
+ ${this.selectedJobId ? html`
158
+ <div class="job-meta">
159
+ <span class="job-meta-item">Job: <strong>${this.selectedJobId}</strong></span>
160
+ <span class="job-meta-item">Project: <strong>${this.selectedProjectId}</strong></span>
161
+ </div>
162
+ ` : ''}
163
+ <div class="log-container">
164
+ ${this.dataState.currentJobLog
165
+ ? this.dataState.currentJobLog
166
+ : html`<div class="log-empty">Select a connection, project, and job, then click "Fetch Log" to view build output.</div>`
167
+ }
168
+ </div>
169
+ `;
170
+ }
171
+
172
+ async firstUpdated() {
173
+ await appstate.connectionsStatePart.dispatchAction(appstate.fetchConnectionsAction, null);
174
+ const conns = appstate.connectionsStatePart.getState().connections;
175
+ if (conns.length > 0 && !this.selectedConnectionId) {
176
+ this.selectedConnectionId = conns[0].id;
177
+ await this.loadProjects();
178
+ }
179
+ }
180
+
181
+ private async loadProjects() {
182
+ if (!this.selectedConnectionId) return;
183
+ await appstate.dataStatePart.dispatchAction(appstate.fetchProjectsAction, {
184
+ connectionId: this.selectedConnectionId,
185
+ });
186
+ }
187
+
188
+ private async fetchLog() {
189
+ if (!this.selectedConnectionId || !this.selectedProjectId || !this.selectedJobId) return;
190
+ await appstate.dataStatePart.dispatchAction(appstate.fetchJobLogAction, {
191
+ connectionId: this.selectedConnectionId,
192
+ projectId: this.selectedProjectId,
193
+ jobId: this.selectedJobId,
194
+ });
195
+ }
196
+ }
@@ -0,0 +1,260 @@
1
+ import * as plugins from '../../../plugins.js';
2
+ import * as appstate from '../../../appstate.js';
3
+ import { viewHostCss } from '../../shared/index.js';
4
+ import {
5
+ DeesElement,
6
+ customElement,
7
+ html,
8
+ state,
9
+ css,
10
+ cssManager,
11
+ type TemplateResult,
12
+ } from '@design.estate/dees-element';
13
+
14
+ @customElement('gitops-view-connections')
15
+ export class GitopsViewConnections extends DeesElement {
16
+ @state()
17
+ accessor connectionsState: appstate.IConnectionsState = {
18
+ connections: [],
19
+ activeConnectionId: null,
20
+ };
21
+
22
+ private _autoRefreshHandler: () => void;
23
+
24
+ constructor() {
25
+ super();
26
+ const sub = appstate.connectionsStatePart
27
+ .select((s) => s)
28
+ .subscribe((s) => { this.connectionsState = s; });
29
+ this.rxSubscriptions.push(sub);
30
+
31
+ this._autoRefreshHandler = () => this.handleAutoRefresh();
32
+ document.addEventListener('gitops-auto-refresh', this._autoRefreshHandler);
33
+ }
34
+
35
+ public override disconnectedCallback() {
36
+ super.disconnectedCallback();
37
+ document.removeEventListener('gitops-auto-refresh', this._autoRefreshHandler);
38
+ }
39
+
40
+ private handleAutoRefresh(): void {
41
+ this.refresh();
42
+ }
43
+
44
+ public static styles = [
45
+ cssManager.defaultStyles,
46
+ viewHostCss,
47
+ ];
48
+
49
+ public render(): TemplateResult {
50
+ return html`
51
+ <div class="view-title">Connections</div>
52
+ <div class="view-description">Manage your Gitea and GitLab provider connections</div>
53
+ <div class="toolbar">
54
+ <dees-button @click=${() => this.addConnection()}>Add Connection</dees-button>
55
+ <dees-button @click=${() => this.refresh()}>Refresh</dees-button>
56
+ </div>
57
+ <dees-table
58
+ .heading1=${'Provider Connections'}
59
+ .heading2=${'Configure connections to Gitea and GitLab instances'}
60
+ .data=${this.connectionsState.connections}
61
+ .displayFunction=${(item: any) => ({
62
+ Name: item.name,
63
+ Type: item.providerType,
64
+ URL: item.baseUrl,
65
+ 'Group Filter': item.groupFilter || '-',
66
+ Status: item.status,
67
+ Created: new Date(item.createdAt).toLocaleDateString(),
68
+ })}
69
+ .dataActions=${[
70
+ {
71
+ name: 'Edit',
72
+ iconName: 'lucide:edit',
73
+ type: ['inRow', 'contextmenu'],
74
+ actionFunc: async ({ item }: any) => { await this.editConnection(item); },
75
+ },
76
+ {
77
+ name: 'Test',
78
+ iconName: 'lucide:plug',
79
+ type: ['inRow', 'contextmenu'],
80
+ actionFunc: async ({ item }: any) => {
81
+ await appstate.connectionsStatePart.dispatchAction(
82
+ appstate.testConnectionAction,
83
+ { connectionId: item.id },
84
+ );
85
+ },
86
+ },
87
+ {
88
+ name: 'Pause/Resume',
89
+ iconName: 'lucide:pauseCircle',
90
+ type: ['inRow', 'contextmenu'],
91
+ actionFunc: async ({ item }: any) => {
92
+ const isPaused = item.status === 'paused';
93
+ const actionLabel = isPaused ? 'Resume' : 'Pause';
94
+ await plugins.deesCatalog.DeesModal.createAndShow({
95
+ heading: `${actionLabel} Connection`,
96
+ content: html`<p style="color: #fff;">Are you sure you want to ${actionLabel.toLowerCase()} connection "${item.name}"?</p>`,
97
+ menuOptions: [
98
+ { name: 'Cancel', action: async (modal: any) => { modal.destroy(); } },
99
+ {
100
+ name: actionLabel,
101
+ action: async (modal: any) => {
102
+ await appstate.connectionsStatePart.dispatchAction(
103
+ appstate.pauseConnectionAction,
104
+ { connectionId: item.id, paused: !isPaused },
105
+ );
106
+ modal.destroy();
107
+ },
108
+ },
109
+ ],
110
+ });
111
+ },
112
+ },
113
+ {
114
+ name: 'Delete',
115
+ iconName: 'lucide:trash2',
116
+ type: ['inRow', 'contextmenu'],
117
+ actionFunc: async ({ item }: any) => {
118
+ await plugins.deesCatalog.DeesModal.createAndShow({
119
+ heading: 'Delete Connection',
120
+ content: html`<p style="color: #fff;">Are you sure you want to delete connection "${item.name}"?</p>`,
121
+ menuOptions: [
122
+ { name: 'Cancel', action: async (modal: any) => { modal.destroy(); } },
123
+ {
124
+ name: 'Delete',
125
+ action: async (modal: any) => {
126
+ await appstate.connectionsStatePart.dispatchAction(
127
+ appstate.deleteConnectionAction,
128
+ { connectionId: item.id },
129
+ );
130
+ modal.destroy();
131
+ },
132
+ },
133
+ ],
134
+ });
135
+ },
136
+ },
137
+ ]}
138
+ ></dees-table>
139
+ `;
140
+ }
141
+
142
+ async firstUpdated() {
143
+ await this.refresh();
144
+ }
145
+
146
+ private async refresh() {
147
+ await appstate.connectionsStatePart.dispatchAction(appstate.fetchConnectionsAction, null);
148
+ }
149
+
150
+ private async editConnection(item: any) {
151
+ await plugins.deesCatalog.DeesModal.createAndShow({
152
+ heading: 'Edit Connection',
153
+ content: html`
154
+ <style>
155
+ .form-row { margin-bottom: 16px; }
156
+ .form-info { font-size: 13px; color: #888; margin-bottom: 16px; }
157
+ </style>
158
+ <div class="form-info">Provider: ${item.providerType}</div>
159
+ <div class="form-row">
160
+ <dees-input-text .label=${'Name'} .key=${'name'} .value=${item.name}></dees-input-text>
161
+ </div>
162
+ <div class="form-row">
163
+ <dees-input-text .label=${'Base URL'} .key=${'baseUrl'} .value=${item.baseUrl}></dees-input-text>
164
+ </div>
165
+ <div class="form-row">
166
+ <dees-input-text .label=${'API Token (leave empty to keep current)'} .key=${'token'} type="password"></dees-input-text>
167
+ </div>
168
+ <div class="form-row">
169
+ <dees-input-text .label=${'Group Filter (optional)'} .key=${'groupFilter'} .value=${item.groupFilter || ''} .description=${'Restricts which repos this connection can see (e.g. an org name or GitLab group path). Does not affect where synced repos are placed.'}></dees-input-text>
170
+ </div>
171
+ `,
172
+ menuOptions: [
173
+ { name: 'Cancel', action: async (modal: any) => { modal.destroy(); } },
174
+ {
175
+ name: 'Save',
176
+ action: async (modal: any) => {
177
+ const inputs = modal.shadowRoot.querySelectorAll('dees-input-text');
178
+ const data: any = {};
179
+ for (const input of inputs) {
180
+ data[input.key] = input.value || '';
181
+ }
182
+ await appstate.connectionsStatePart.dispatchAction(
183
+ appstate.updateConnectionAction,
184
+ {
185
+ connectionId: item.id,
186
+ name: data.name,
187
+ baseUrl: data.baseUrl,
188
+ groupFilter: data.groupFilter,
189
+ ...(data.token ? { token: data.token } : {}),
190
+ },
191
+ );
192
+ modal.destroy();
193
+ },
194
+ },
195
+ ],
196
+ });
197
+ }
198
+
199
+ private async addConnection() {
200
+ await plugins.deesCatalog.DeesModal.createAndShow({
201
+ heading: 'Add Connection',
202
+ content: html`
203
+ <style>
204
+ .form-row { margin-bottom: 16px; }
205
+ </style>
206
+ <div class="form-row">
207
+ <dees-input-text .label=${'Name'} .key=${'name'}></dees-input-text>
208
+ </div>
209
+ <div class="form-row">
210
+ <dees-input-dropdown
211
+ .label=${'Provider Type'}
212
+ .key=${'providerType'}
213
+ .options=${[
214
+ { option: 'gitea', key: 'gitea' },
215
+ { option: 'gitlab', key: 'gitlab' },
216
+ ]}
217
+ .selectedOption=${{ option: 'gitea', key: 'gitea' }}
218
+ ></dees-input-dropdown>
219
+ </div>
220
+ <div class="form-row">
221
+ <dees-input-text .label=${'Base URL'} .key=${'baseUrl'}></dees-input-text>
222
+ </div>
223
+ <div class="form-row">
224
+ <dees-input-text .label=${'API Token'} .key=${'token'} type="password"></dees-input-text>
225
+ </div>
226
+ <div class="form-row">
227
+ <dees-input-text .label=${'Group Filter (optional)'} .key=${'groupFilter'} .description=${'Restricts which repos this connection can see (e.g. an org name or GitLab group path). Does not affect where synced repos are placed.'}></dees-input-text>
228
+ </div>
229
+ `,
230
+ menuOptions: [
231
+ { name: 'Cancel', action: async (modal: any) => { modal.destroy(); } },
232
+ {
233
+ name: 'Add',
234
+ action: async (modal: any) => {
235
+ const inputs = modal.shadowRoot.querySelectorAll('dees-input-text, dees-input-dropdown');
236
+ const data: any = {};
237
+ for (const input of inputs) {
238
+ if (input.key === 'providerType') {
239
+ data[input.key] = input.selectedOption?.key || 'gitea';
240
+ } else {
241
+ data[input.key] = input.value || '';
242
+ }
243
+ }
244
+ await appstate.connectionsStatePart.dispatchAction(
245
+ appstate.createConnectionAction,
246
+ {
247
+ name: data.name,
248
+ providerType: data.providerType,
249
+ baseUrl: data.baseUrl,
250
+ token: data.token,
251
+ groupFilter: data.groupFilter || undefined,
252
+ },
253
+ );
254
+ modal.destroy();
255
+ },
256
+ },
257
+ ],
258
+ });
259
+ }
260
+ }
@@ -0,0 +1,134 @@
1
+ import * as plugins from '../../../plugins.js';
2
+ import * as appstate from '../../../appstate.js';
3
+ import { viewHostCss } from '../../shared/index.js';
4
+ import {
5
+ DeesElement,
6
+ customElement,
7
+ html,
8
+ state,
9
+ css,
10
+ cssManager,
11
+ type TemplateResult,
12
+ } from '@design.estate/dees-element';
13
+
14
+ @customElement('gitops-view-groups')
15
+ export class GitopsViewGroups extends DeesElement {
16
+ @state()
17
+ accessor connectionsState: appstate.IConnectionsState = {
18
+ connections: [],
19
+ activeConnectionId: null,
20
+ };
21
+
22
+ @state()
23
+ accessor dataState: appstate.IDataState = {
24
+ projects: [],
25
+ groups: [],
26
+ secrets: [],
27
+ pipelines: [],
28
+ pipelineJobs: [],
29
+ currentJobLog: '',
30
+ };
31
+
32
+ @state()
33
+ accessor selectedConnectionId: string = '';
34
+
35
+ private _autoRefreshHandler: () => void;
36
+
37
+ constructor() {
38
+ super();
39
+ const connSub = appstate.connectionsStatePart
40
+ .select((s) => s)
41
+ .subscribe((s) => { this.connectionsState = s; });
42
+ this.rxSubscriptions.push(connSub);
43
+
44
+ const dataSub = appstate.dataStatePart
45
+ .select((s) => s)
46
+ .subscribe((s) => { this.dataState = s; });
47
+ this.rxSubscriptions.push(dataSub);
48
+
49
+ this._autoRefreshHandler = () => this.handleAutoRefresh();
50
+ document.addEventListener('gitops-auto-refresh', this._autoRefreshHandler);
51
+ }
52
+
53
+ public override disconnectedCallback() {
54
+ super.disconnectedCallback();
55
+ document.removeEventListener('gitops-auto-refresh', this._autoRefreshHandler);
56
+ }
57
+
58
+ private handleAutoRefresh(): void {
59
+ this.loadGroups();
60
+ }
61
+
62
+ public static styles = [
63
+ cssManager.defaultStyles,
64
+ viewHostCss,
65
+ ];
66
+
67
+ public render(): TemplateResult {
68
+ const connectionOptions = this.connectionsState.connections.map((c) => ({
69
+ option: `${c.name} (${c.providerType})`,
70
+ key: c.id,
71
+ }));
72
+
73
+ return html`
74
+ <div class="view-title">Groups</div>
75
+ <div class="view-description">Browse organizations and groups from your connected providers</div>
76
+ <div class="toolbar">
77
+ <dees-input-dropdown
78
+ .label=${'Connection'}
79
+ .options=${connectionOptions}
80
+ .selectedOption=${connectionOptions.find((o) => o.key === this.selectedConnectionId) || connectionOptions[0]}
81
+ @selectedOption=${(e: CustomEvent) => {
82
+ this.selectedConnectionId = e.detail.key;
83
+ this.loadGroups();
84
+ }}
85
+ ></dees-input-dropdown>
86
+ <dees-button @click=${() => this.loadGroups()}>Refresh</dees-button>
87
+ </div>
88
+ <dees-table
89
+ .heading1=${'Groups / Organizations'}
90
+ .heading2=${'Groups from the selected connection'}
91
+ .data=${this.dataState.groups}
92
+ .displayFunction=${(item: any) => ({
93
+ Name: item.name,
94
+ Path: item.fullPath,
95
+ Visibility: item.visibility,
96
+ Projects: String(item.projectCount),
97
+ })}
98
+ .dataActions=${[
99
+ {
100
+ name: 'View Secrets',
101
+ iconName: 'lucide:key',
102
+ type: ['inRow', 'contextmenu'],
103
+ actionFunc: async ({ item }: any) => {
104
+ appstate.uiStatePart.dispatchAction(appstate.setActiveViewAction, {
105
+ view: 'secrets',
106
+ navigationContext: {
107
+ connectionId: this.selectedConnectionId,
108
+ scope: 'group',
109
+ scopeId: item.id,
110
+ },
111
+ });
112
+ },
113
+ },
114
+ ]}
115
+ ></dees-table>
116
+ `;
117
+ }
118
+
119
+ async firstUpdated() {
120
+ await appstate.connectionsStatePart.dispatchAction(appstate.fetchConnectionsAction, null);
121
+ const conns = appstate.connectionsStatePart.getState().connections;
122
+ if (conns.length > 0 && !this.selectedConnectionId) {
123
+ this.selectedConnectionId = conns[0].id;
124
+ await this.loadGroups();
125
+ }
126
+ }
127
+
128
+ private async loadGroups() {
129
+ if (!this.selectedConnectionId) return;
130
+ await appstate.dataStatePart.dispatchAction(appstate.fetchGroupsAction, {
131
+ connectionId: this.selectedConnectionId,
132
+ });
133
+ }
134
+ }