import * as plugins from '../../../plugins.js'; import * as appstate from '../../../appstate.js'; import { viewHostCss } from '../../shared/index.js'; import { DeesElement, customElement, html, state, css, cssManager, type TemplateResult, } from '@design.estate/dees-element'; @customElement('gitops-view-connections') export class GitopsViewConnections extends DeesElement { @state() accessor connectionsState: appstate.IConnectionsState = { connections: [], activeConnectionId: null, }; private _autoRefreshHandler: () => void; constructor() { super(); const sub = appstate.connectionsStatePart .select((s) => s) .subscribe((s) => { this.connectionsState = s; }); this.rxSubscriptions.push(sub); this._autoRefreshHandler = () => this.handleAutoRefresh(); document.addEventListener('gitops-auto-refresh', this._autoRefreshHandler); } public override disconnectedCallback() { super.disconnectedCallback(); document.removeEventListener('gitops-auto-refresh', this._autoRefreshHandler); } private handleAutoRefresh(): void { this.refresh(); } public static styles = [ cssManager.defaultStyles, viewHostCss, ]; public render(): TemplateResult { return html`
Connections
Manage your Gitea and GitLab provider connections
this.addConnection()}>Add Connection this.refresh()}>Refresh
({ Name: item.name, Type: item.providerType, URL: item.baseUrl, 'Group Filter': item.groupFilter || '-', Status: item.status, Created: new Date(item.createdAt).toLocaleDateString(), })} .dataActions=${[ { name: 'Edit', iconName: 'lucide:edit', type: ['inRow', 'contextmenu'], actionFunc: async ({ item }: any) => { await this.editConnection(item); }, }, { name: 'Test', iconName: 'lucide:plug', type: ['inRow', 'contextmenu'], actionFunc: async ({ item }: any) => { await appstate.connectionsStatePart.dispatchAction( appstate.testConnectionAction, { connectionId: item.id }, ); }, }, { name: 'Pause/Resume', iconName: 'lucide:pauseCircle', type: ['inRow', 'contextmenu'], actionFunc: async ({ item }: any) => { const isPaused = item.status === 'paused'; const actionLabel = isPaused ? 'Resume' : 'Pause'; await plugins.deesCatalog.DeesModal.createAndShow({ heading: `${actionLabel} Connection`, content: html`

Are you sure you want to ${actionLabel.toLowerCase()} connection "${item.name}"?

`, menuOptions: [ { name: 'Cancel', action: async (modal: any) => { modal.destroy(); } }, { name: actionLabel, action: async (modal: any) => { await appstate.connectionsStatePart.dispatchAction( appstate.pauseConnectionAction, { connectionId: item.id, paused: !isPaused }, ); modal.destroy(); }, }, ], }); }, }, { name: 'Delete', iconName: 'lucide:trash2', type: ['inRow', 'contextmenu'], actionFunc: async ({ item }: any) => { await plugins.deesCatalog.DeesModal.createAndShow({ heading: 'Delete Connection', content: html`

Are you sure you want to delete connection "${item.name}"?

`, menuOptions: [ { name: 'Cancel', action: async (modal: any) => { modal.destroy(); } }, { name: 'Delete', action: async (modal: any) => { await appstate.connectionsStatePart.dispatchAction( appstate.deleteConnectionAction, { connectionId: item.id }, ); modal.destroy(); }, }, ], }); }, }, ]} >
`; } async firstUpdated() { await this.refresh(); } private async refresh() { await appstate.connectionsStatePart.dispatchAction(appstate.fetchConnectionsAction, null); } private async editConnection(item: any) { await plugins.deesCatalog.DeesModal.createAndShow({ heading: 'Edit Connection', content: html`
Provider: ${item.providerType}
`, menuOptions: [ { name: 'Cancel', action: async (modal: any) => { modal.destroy(); } }, { name: 'Save', action: async (modal: any) => { const inputs = modal.shadowRoot.querySelectorAll('dees-input-text'); const data: any = {}; for (const input of inputs) { data[input.key] = input.value || ''; } await appstate.connectionsStatePart.dispatchAction( appstate.updateConnectionAction, { connectionId: item.id, name: data.name, baseUrl: data.baseUrl, groupFilter: data.groupFilter, ...(data.token ? { token: data.token } : {}), }, ); modal.destroy(); }, }, ], }); } private async addConnection() { await plugins.deesCatalog.DeesModal.createAndShow({ heading: 'Add Connection', content: html`
`, menuOptions: [ { name: 'Cancel', action: async (modal: any) => { modal.destroy(); } }, { name: 'Add', action: async (modal: any) => { const inputs = modal.shadowRoot.querySelectorAll('dees-input-text, dees-input-dropdown'); const data: any = {}; for (const input of inputs) { if (input.key === 'providerType') { data[input.key] = input.selectedOption?.key || 'gitea'; } else { data[input.key] = input.value || ''; } } await appstate.connectionsStatePart.dispatchAction( appstate.createConnectionAction, { name: data.name, providerType: data.providerType, baseUrl: data.baseUrl, token: data.token, groupFilter: data.groupFilter || undefined, }, ); modal.destroy(); }, }, ], }); } }