chore: update cloudly dependency stack

Align Cloudly with the current typedserver, smartconfig, smartstate, and Docker tooling releases so builds and Docker output stay compatible with the upgraded stack.
This commit is contained in:
2026-05-08 13:56:20 +00:00
parent 80226c8a1c
commit f40ef6b7c0
75 changed files with 4003 additions and 6406 deletions
+121 -117
View File
@@ -3,7 +3,7 @@ import * as domtools from '@design.estate/dees-domtools';
const appstate = new plugins.deesDomtools.plugins.smartstate.Smartstate();
export interface ILoginState {
identity: plugins.interfaces.data.IIdentity;
identity: plugins.interfaces.data.IIdentity | null;
}
export const loginStatePart: plugins.smartstate.StatePart<unknown, ILoginState> = await appstate.getStatePart<ILoginState>(
'login',
@@ -13,8 +13,8 @@ export const loginStatePart: plugins.smartstate.StatePart<unknown, ILoginState>
export const loginAction = loginStatePart.createAction<{ username: string; password: string }>(
async (statePartArg, payloadArg) => {
const currentState = statePartArg.getState();
let identity: plugins.interfaces.data.IIdentity = null;
const currentState = statePartArg.getState() || { identity: null };
let identity: plugins.interfaces.data.IIdentity | null = null;
try {
identity = await apiClient.loginWithUsernameAndPassword(payloadArg.username, payloadArg.password);
} catch (err) {
@@ -31,7 +31,7 @@ export const loginAction = loginStatePart.createAction<{ username: string; passw
if (!apiClient['typedsocketClient']) {
await apiClient.start();
}
try { apiClient.typedsocketClient.addTag('identity', apiClient.identity); } catch {}
try { await apiClient.typedsocketClient.setTag('identity', apiClient.identity); } catch {}
}
} catch {}
return newState;
@@ -39,7 +39,7 @@ export const loginAction = loginStatePart.createAction<{ username: string; passw
);
export const logoutAction = loginStatePart.createAction(async (statePartArg) => {
const currentState = statePartArg.getState();
const currentState = statePartArg.getState() || { identity: null };
return {
...currentState,
identity: null,
@@ -88,17 +88,21 @@ export const dataState = await appstate.getStatePart<IDataState>(
);
// Shared API client instance (used by UI actions)
type TCloudlyApiClientWithNullableIdentity = Omit<plugins.servezoneApi.CloudlyApiClient, 'identity'> & {
identity: plugins.interfaces.data.IIdentity | null;
};
export const apiClient = new plugins.servezoneApi.CloudlyApiClient({
registerAs: 'api',
cloudlyUrl: (typeof window !== 'undefined' && window.location?.origin) ? window.location.origin : undefined,
});
}) as TCloudlyApiClientWithNullableIdentity;
// Getting data
export const getAllDataAction = dataState.createAction(async (statePartArg) => {
let currentState = statePartArg.getState();
let currentState = statePartArg.getState() || {};
// SecretsGroups
try {
apiClient.identity = loginStatePart.getState().identity;
apiClient.identity = loginStatePart.getState()?.identity ?? null;
const secretGroups = await apiClient.secretgroup.getSecretGroups();
currentState = {
...currentState,
@@ -114,7 +118,7 @@ export const getAllDataAction = dataState.createAction(async (statePartArg) => {
// SecretBundles
try {
apiClient.identity = loginStatePart.getState().identity;
apiClient.identity = loginStatePart.getState()?.identity ?? null;
const responseSecretBundles = await apiClient.secretbundle.getSecretBundles();
currentState = {
...currentState,
@@ -130,7 +134,7 @@ export const getAllDataAction = dataState.createAction(async (statePartArg) => {
// images
try {
apiClient.identity = loginStatePart.getState().identity;
apiClient.identity = loginStatePart.getState()?.identity ?? null;
const images = await apiClient.image.getImages();
currentState = {
...currentState,
@@ -146,7 +150,7 @@ export const getAllDataAction = dataState.createAction(async (statePartArg) => {
// Clusters
try {
apiClient.identity = loginStatePart.getState().identity;
apiClient.identity = loginStatePart.getState()?.identity ?? null;
const clusters = await apiClient.cluster.getClusters();
currentState = {
...currentState,
@@ -162,7 +166,7 @@ export const getAllDataAction = dataState.createAction(async (statePartArg) => {
// External Registries via shared API client
try {
apiClient.identity = loginStatePart.getState().identity;
apiClient.identity = loginStatePart.getState()?.identity ?? null;
const registries = await apiClient.externalRegistry.getRegistries();
currentState = {
...currentState,
@@ -178,7 +182,7 @@ export const getAllDataAction = dataState.createAction(async (statePartArg) => {
// Services
try {
apiClient.identity = loginStatePart.getState().identity;
apiClient.identity = loginStatePart.getState()?.identity ?? null;
const services = await apiClient.services.getServices();
currentState = {
...currentState,
@@ -194,7 +198,7 @@ export const getAllDataAction = dataState.createAction(async (statePartArg) => {
// Deployments
try {
apiClient.identity = loginStatePart.getState().identity;
apiClient.identity = loginStatePart.getState()?.identity ?? null;
const responseDeployments = await apiClient.deployments.getDeployments();
currentState = {
...currentState,
@@ -210,7 +214,7 @@ export const getAllDataAction = dataState.createAction(async (statePartArg) => {
// Domains via API client
try {
apiClient.identity = loginStatePart.getState().identity;
apiClient.identity = loginStatePart.getState()?.identity ?? null;
const responseDomains = await apiClient.domains.getDomains();
currentState = {
...currentState,
@@ -226,7 +230,7 @@ export const getAllDataAction = dataState.createAction(async (statePartArg) => {
// DNS Entries via API client
try {
apiClient.identity = loginStatePart.getState().identity;
apiClient.identity = loginStatePart.getState()?.identity ?? null;
const responseDnsEntries = await apiClient.dns.getDnsEntries();
currentState = {
...currentState,
@@ -245,58 +249,57 @@ export const getAllDataAction = dataState.createAction(async (statePartArg) => {
// Service Actions
export const createServiceAction = dataState.createAction(
async (statePartArg, payloadArg: { serviceData: plugins.interfaces.data.IService['data'] }) => {
let currentState = statePartArg.getState();
apiClient.identity = loginStatePart.getState().identity;
async (statePartArg, payloadArg: { serviceData: plugins.interfaces.data.IService['data'] }, context) => {
let currentState = statePartArg.getState() || {};
apiClient.identity = loginStatePart.getState()?.identity ?? null;
await apiClient.services.createService(payloadArg.serviceData);
currentState = await dataState.dispatchAction(getAllDataAction, null);
currentState = await context.dispatch(getAllDataAction, null);
return currentState;
}
);
export const updateServiceAction = dataState.createAction(
async (statePartArg, payloadArg: { serviceId: string; serviceData: plugins.interfaces.data.IService['data'] }) => {
let currentState = statePartArg.getState();
apiClient.identity = loginStatePart.getState().identity;
async (statePartArg, payloadArg: { serviceId: string; serviceData: plugins.interfaces.data.IService['data'] }, context) => {
let currentState = statePartArg.getState() || {};
apiClient.identity = loginStatePart.getState()?.identity ?? null;
await apiClient.services.updateService(payloadArg.serviceId, payloadArg.serviceData);
currentState = await dataState.dispatchAction(getAllDataAction, null);
currentState = await context.dispatch(getAllDataAction, null);
return currentState;
}
);
export const deleteServiceAction = dataState.createAction(
async (statePartArg, payloadArg: { serviceId: string }) => {
let currentState = statePartArg.getState();
apiClient.identity = loginStatePart.getState().identity;
async (statePartArg, payloadArg: { serviceId: string }, context) => {
let currentState = statePartArg.getState() || {};
apiClient.identity = loginStatePart.getState()?.identity ?? null;
await apiClient.services.deleteService(payloadArg.serviceId);
currentState = await dataState.dispatchAction(getAllDataAction, null);
currentState = await context.dispatch(getAllDataAction, null);
return currentState;
}
);
// SecretGroup Actions
export const createSecretGroupAction = dataState.createAction(
async (statePartArg, payloadArg: plugins.interfaces.data.ISecretGroup) => {
let currentState = statePartArg.getState();
async (statePartArg, payloadArg: { data: plugins.interfaces.data.ISecretGroup['data'] }, context) => {
let currentState = statePartArg.getState() || {};
try {
apiClient.identity = loginStatePart.getState().identity;
apiClient.identity = loginStatePart.getState()?.identity ?? null;
await apiClient.secretgroup.createSecretGroup(payloadArg.data);
currentState = await dataState.dispatchAction(getAllDataAction, null);
currentState = await context.dispatch(getAllDataAction, null);
} catch (err) {
console.error('Failed to create secret group:', err);
}
return currentState;
return currentState;
}
);
export const deleteSecretGroupAction = dataState.createAction(
async (statePartArg, payloadArg: { secretGroupId: string }) => {
let currentState = statePartArg.getState();
async (statePartArg, payloadArg: { secretGroupId: string }, context) => {
let currentState = statePartArg.getState() || {};
try {
apiClient.identity = loginStatePart.getState().identity;
apiClient.identity = loginStatePart.getState()?.identity ?? null;
await apiClient.secretgroup.deleteSecretGroupById(payloadArg.secretGroupId);
currentState = await dataState.dispatchAction(getAllDataAction, null);
currentState = await context.dispatch(getAllDataAction, null);
} catch (err) {
console.error('Failed to delete secret group:', err);
}
@@ -306,12 +309,12 @@ export const deleteSecretGroupAction = dataState.createAction(
// SecretBundle Actions
export const deleteSecretBundleAction = dataState.createAction(
async (statePartArg, payloadArg: { configBundleId: string }) => {
let currentState = statePartArg.getState();
async (statePartArg, payloadArg: { configBundleId: string }, context) => {
let currentState = statePartArg.getState() || {};
try {
apiClient.identity = loginStatePart.getState().identity;
apiClient.identity = loginStatePart.getState()?.identity ?? null;
await apiClient.secretbundle.deleteSecretBundleById(payloadArg.configBundleId);
currentState = await dataState.dispatchAction(getAllDataAction, null);
currentState = await context.dispatch(getAllDataAction, null);
} catch (err) {
console.error('Failed to delete secret bundle:', err);
}
@@ -321,146 +324,146 @@ export const deleteSecretBundleAction = dataState.createAction(
// image actions
export const createImageAction = dataState.createAction(
async (statePartArg, payloadArg: { imageName: string, description: string }) => {
let currentState = statePartArg.getState();
apiClient.identity = loginStatePart.getState().identity;
async (statePartArg, payloadArg: { imageName: string, description: string }, context) => {
let currentState = statePartArg.getState() || {};
apiClient.identity = loginStatePart.getState()?.identity ?? null;
await apiClient.image.createImage({ name: payloadArg.imageName, description: payloadArg.description });
currentState = await dataState.dispatchAction(getAllDataAction, null);
currentState = await context.dispatch(getAllDataAction, null);
return currentState;
}
);
export const deleteImageAction = dataState.createAction(
async (statePartArg, payloadArg: { imageId: string }) => {
let currentState = statePartArg.getState();
apiClient.identity = loginStatePart.getState().identity;
async (statePartArg, payloadArg: { imageId: string }, context) => {
let currentState = statePartArg.getState() || {};
apiClient.identity = loginStatePart.getState()?.identity ?? null;
await apiClient.image.deleteImage(payloadArg.imageId);
currentState = await dataState.dispatchAction(getAllDataAction, null);
currentState = await context.dispatch(getAllDataAction, null);
return currentState;
}
);
// Deployment Actions
export const createDeploymentAction = dataState.createAction(
async (statePartArg, payloadArg: { deploymentData: Partial<plugins.interfaces.data.IDeployment> }) => {
let currentState = statePartArg.getState();
apiClient.identity = loginStatePart.getState().identity;
async (statePartArg, payloadArg: { deploymentData: Partial<plugins.interfaces.data.IDeployment> }, context) => {
let currentState = statePartArg.getState() || {};
apiClient.identity = loginStatePart.getState()?.identity ?? null;
await apiClient.deployments.createDeployment(payloadArg.deploymentData);
currentState = await dataState.dispatchAction(getAllDataAction, null);
currentState = await context.dispatch(getAllDataAction, null);
return currentState;
}
);
export const updateDeploymentAction = dataState.createAction(
async (statePartArg, payloadArg: { deploymentId: string; deploymentData: Partial<plugins.interfaces.data.IDeployment> }) => {
let currentState = statePartArg.getState();
apiClient.identity = loginStatePart.getState().identity;
async (statePartArg, payloadArg: { deploymentId: string; deploymentData: Partial<plugins.interfaces.data.IDeployment> }, context) => {
let currentState = statePartArg.getState() || {};
apiClient.identity = loginStatePart.getState()?.identity ?? null;
await apiClient.deployments.updateDeployment(payloadArg.deploymentId, payloadArg.deploymentData);
currentState = await dataState.dispatchAction(getAllDataAction, null);
currentState = await context.dispatch(getAllDataAction, null);
return currentState;
}
);
export const deleteDeploymentAction = dataState.createAction(
async (statePartArg, payloadArg: { deploymentId: string }) => {
let currentState = statePartArg.getState();
apiClient.identity = loginStatePart.getState().identity;
async (statePartArg, payloadArg: { deploymentId: string }, context) => {
let currentState = statePartArg.getState() || {};
apiClient.identity = loginStatePart.getState()?.identity ?? null;
await apiClient.deployments.deleteDeployment(payloadArg.deploymentId);
currentState = await dataState.dispatchAction(getAllDataAction, null);
currentState = await context.dispatch(getAllDataAction, null);
return currentState;
}
);
// DNS Actions
export const createDnsEntryAction = dataState.createAction(
async (statePartArg, payloadArg: { dnsEntryData: plugins.interfaces.data.IDnsEntry['data'] }) => {
let currentState = statePartArg.getState();
apiClient.identity = loginStatePart.getState().identity;
async (statePartArg, payloadArg: { dnsEntryData: plugins.interfaces.data.IDnsEntry['data'] }, context) => {
let currentState = statePartArg.getState() || {};
apiClient.identity = loginStatePart.getState()?.identity ?? null;
await apiClient.dns.createDnsEntry(payloadArg.dnsEntryData);
currentState = await dataState.dispatchAction(getAllDataAction, null);
currentState = await context.dispatch(getAllDataAction, null);
return currentState;
}
);
export const updateDnsEntryAction = dataState.createAction(
async (statePartArg, payloadArg: { dnsEntryId: string; dnsEntryData: plugins.interfaces.data.IDnsEntry['data'] }) => {
let currentState = statePartArg.getState();
apiClient.identity = loginStatePart.getState().identity;
async (statePartArg, payloadArg: { dnsEntryId: string; dnsEntryData: plugins.interfaces.data.IDnsEntry['data'] }, context) => {
let currentState = statePartArg.getState() || {};
apiClient.identity = loginStatePart.getState()?.identity ?? null;
await apiClient.dns.updateDnsEntry(payloadArg.dnsEntryId, payloadArg.dnsEntryData);
currentState = await dataState.dispatchAction(getAllDataAction, null);
currentState = await context.dispatch(getAllDataAction, null);
return currentState;
}
);
export const deleteDnsEntryAction = dataState.createAction(
async (statePartArg, payloadArg: { dnsEntryId: string }) => {
let currentState = statePartArg.getState();
apiClient.identity = loginStatePart.getState().identity;
async (statePartArg, payloadArg: { dnsEntryId: string }, context) => {
let currentState = statePartArg.getState() || {};
apiClient.identity = loginStatePart.getState()?.identity ?? null;
await apiClient.dns.deleteDnsEntry(payloadArg.dnsEntryId);
currentState = await dataState.dispatchAction(getAllDataAction, null);
currentState = await context.dispatch(getAllDataAction, null);
return currentState;
}
);
// Domain Actions
export const createDomainAction = dataState.createAction(
async (statePartArg, payloadArg: { domainData: plugins.interfaces.data.IDomain['data'] }) => {
let currentState = statePartArg.getState();
apiClient.identity = loginStatePart.getState().identity;
async (statePartArg, payloadArg: { domainData: plugins.interfaces.data.IDomain['data'] }, context) => {
let currentState = statePartArg.getState() || {};
apiClient.identity = loginStatePart.getState()?.identity ?? null;
await apiClient.domains.createDomain(payloadArg.domainData);
currentState = await dataState.dispatchAction(getAllDataAction, null);
currentState = await context.dispatch(getAllDataAction, null);
return currentState;
}
);
export const updateDomainAction = dataState.createAction(
async (statePartArg, payloadArg: { domainId: string; domainData: plugins.interfaces.data.IDomain['data'] }) => {
let currentState = statePartArg.getState();
apiClient.identity = loginStatePart.getState().identity;
async (statePartArg, payloadArg: { domainId: string; domainData: plugins.interfaces.data.IDomain['data'] }, context) => {
let currentState = statePartArg.getState() || {};
apiClient.identity = loginStatePart.getState()?.identity ?? null;
await apiClient.domains.updateDomain(payloadArg.domainId, payloadArg.domainData);
currentState = await dataState.dispatchAction(getAllDataAction, null);
currentState = await context.dispatch(getAllDataAction, null);
return currentState;
}
);
export const deleteDomainAction = dataState.createAction(
async (statePartArg, payloadArg: { domainId: string }) => {
let currentState = statePartArg.getState();
apiClient.identity = loginStatePart.getState().identity;
async (statePartArg, payloadArg: { domainId: string }, context) => {
let currentState = statePartArg.getState() || {};
apiClient.identity = loginStatePart.getState()?.identity ?? null;
await apiClient.domains.deleteDomain(payloadArg.domainId);
currentState = await dataState.dispatchAction(getAllDataAction, null);
currentState = await context.dispatch(getAllDataAction, null);
return currentState;
}
);
export const verifyDomainAction = dataState.createAction(
async (statePartArg, payloadArg: { domainId: string; verificationMethod?: 'dns' | 'http' | 'email' | 'manual' }) => {
let currentState = statePartArg.getState();
apiClient.identity = loginStatePart.getState().identity;
async (statePartArg, payloadArg: { domainId: string; verificationMethod?: 'dns' | 'http' | 'email' | 'manual' }, context) => {
let currentState = statePartArg.getState() || {};
apiClient.identity = loginStatePart.getState()?.identity ?? null;
await apiClient.domains.verifyDomain(payloadArg.domainId, payloadArg.verificationMethod);
currentState = await dataState.dispatchAction(getAllDataAction, null);
currentState = await context.dispatch(getAllDataAction, null);
return currentState;
}
);
// External Registry Actions
export const createExternalRegistryAction = dataState.createAction(
async (statePartArg, payloadArg: { registryData: plugins.interfaces.data.IExternalRegistry['data'] }) => {
let currentState = statePartArg.getState();
apiClient.identity = loginStatePart.getState().identity;
async (statePartArg, payloadArg: { registryData: plugins.interfaces.data.IExternalRegistry['data'] }, context) => {
let currentState = statePartArg.getState() || {};
apiClient.identity = loginStatePart.getState()?.identity ?? null;
await apiClient.externalRegistry.createRegistry(payloadArg.registryData);
currentState = await dataState.dispatchAction(getAllDataAction, null);
currentState = await context.dispatch(getAllDataAction, null);
return currentState;
}
);
export const updateExternalRegistryAction = dataState.createAction(
async (statePartArg, payloadArg: { registryId: string; registryData: plugins.interfaces.data.IExternalRegistry['data'] }) => {
let currentState = statePartArg.getState();
async (statePartArg, payloadArg: { registryId: string; registryData: plugins.interfaces.data.IExternalRegistry['data'] }, context) => {
let currentState = statePartArg.getState() || {};
try {
apiClient.identity = loginStatePart.getState().identity;
apiClient.identity = loginStatePart.getState()?.identity ?? null;
await apiClient.externalRegistry.updateRegistry(payloadArg.registryId, payloadArg.registryData);
currentState = await dataState.dispatchAction(getAllDataAction, null);
currentState = await context.dispatch(getAllDataAction, null);
} catch (err) {
console.error('Failed to update external registry:', err);
}
@@ -469,12 +472,12 @@ export const updateExternalRegistryAction = dataState.createAction(
);
export const deleteExternalRegistryAction = dataState.createAction(
async (statePartArg, payloadArg: { registryId: string }) => {
let currentState = statePartArg.getState();
async (statePartArg, payloadArg: { registryId: string }, context) => {
let currentState = statePartArg.getState() || {};
try {
apiClient.identity = loginStatePart.getState().identity;
apiClient.identity = loginStatePart.getState()?.identity ?? null;
await apiClient.externalRegistry.deleteRegistry(payloadArg.registryId);
currentState = await dataState.dispatchAction(getAllDataAction, null);
currentState = await context.dispatch(getAllDataAction, null);
} catch (err) {
console.error('Failed to delete external registry:', err);
}
@@ -484,9 +487,9 @@ export const deleteExternalRegistryAction = dataState.createAction(
export const verifyExternalRegistryAction = dataState.createAction(
async (statePartArg, payloadArg: { registryId: string }) => {
let currentState = statePartArg.getState();
let currentState = statePartArg.getState() || {};
try {
apiClient.identity = loginStatePart.getState().identity;
apiClient.identity = loginStatePart.getState()?.identity ?? null;
const result = await apiClient.externalRegistry.verifyRegistry(payloadArg.registryId);
if (result.success && result.registry) {
const regs = (currentState.externalRegistries || []).slice();
@@ -514,8 +517,8 @@ export const verifyExternalRegistryAction = dataState.createAction(
export const taskActions = {
getTasks: dataState.createAction(
async (statePartArg, payloadArg: {}) => {
const currentState = statePartArg.getState();
apiClient.identity = loginStatePart.getState().identity;
const currentState = statePartArg.getState() || {};
apiClient.identity = loginStatePart.getState()?.identity ?? null;
const response = await apiClient.tasks.getTasks();
return {
...currentState,
@@ -526,8 +529,8 @@ export const taskActions = {
getTaskExecutions: dataState.createAction(
async (statePartArg, payloadArg: { filter?: any }) => {
const currentState = statePartArg.getState();
apiClient.identity = loginStatePart.getState().identity;
const currentState = statePartArg.getState() || {};
apiClient.identity = loginStatePart.getState()?.identity ?? null;
const response = await apiClient.tasks.getTaskExecutions(payloadArg.filter);
return {
...currentState,
@@ -538,8 +541,8 @@ export const taskActions = {
getTaskExecutionById: dataState.createAction(
async (statePartArg, payloadArg: { executionId: string }) => {
const currentState = statePartArg.getState();
apiClient.identity = loginStatePart.getState().identity;
const currentState = statePartArg.getState() || {};
apiClient.identity = loginStatePart.getState()?.identity ?? null;
await apiClient.tasks.getTaskExecutionById(payloadArg.executionId);
return currentState;
}
@@ -547,8 +550,8 @@ export const taskActions = {
triggerTask: dataState.createAction(
async (statePartArg, payloadArg: { taskName: string; userId?: string }) => {
const currentState = statePartArg.getState();
apiClient.identity = loginStatePart.getState().identity;
const currentState = statePartArg.getState() || {};
apiClient.identity = loginStatePart.getState()?.identity ?? null;
await apiClient.tasks.triggerTask(payloadArg.taskName, payloadArg.userId);
return currentState;
}
@@ -556,8 +559,8 @@ export const taskActions = {
cancelTask: dataState.createAction(
async (statePartArg, payloadArg: { executionId: string }) => {
const currentState = statePartArg.getState();
apiClient.identity = loginStatePart.getState().identity;
const currentState = statePartArg.getState() || {};
apiClient.identity = loginStatePart.getState()?.identity ?? null;
await apiClient.tasks.cancelTask(payloadArg.executionId);
return currentState;
}
@@ -571,11 +574,12 @@ export const addClusterAction = dataState.createAction(
payloadArg: {
clusterName: string;
setupMode?: 'manual' | 'hetzner' | 'aws' | 'digitalocean';
}
},
context
) => {
let currentState = statePartArg.getState();
apiClient.identity = loginStatePart.getState().identity;
let currentState = statePartArg.getState() || {};
apiClient.identity = loginStatePart.getState()?.identity ?? null;
await apiClient.cluster.createClusterAdvanced(payloadArg.clusterName, payloadArg.setupMode);
return await dataState.dispatchAction(getAllDataAction, null);
return await context.dispatch(getAllDataAction, null);
}
);
+14 -13
View File
@@ -38,8 +38,8 @@ declare global {
@customElement('cloudly-dashboard')
export class CloudlyDashboard extends DeesElement {
@state() private identity: plugins.interfaces.data.IIdentity;
@state() private data: appstate.IDataState = {
@state() private accessor identity: plugins.interfaces.data.IIdentity | null = null;
@state() private accessor data: appstate.IDataState = {
secretGroups: [],
secretBundles: [],
clusters: [],
@@ -188,10 +188,11 @@ export class CloudlyDashboard extends DeesElement {
`;
}
public async firstUpdated() {
const simpleLogin = this.shadowRoot.querySelector('dees-simple-login');
simpleLogin.addEventListener('login', (e: CustomEvent) => {
console.log(e.detail);
this.login(e.detail.data.username, e.detail.data.password);
const simpleLogin = this.shadowRoot!.querySelector('dees-simple-login') as any;
simpleLogin.addEventListener('login', (eventArg: Event) => {
const loginEvent = eventArg as CustomEvent;
console.log(loginEvent.detail);
this.login(loginEvent.detail.data.username, loginEvent.detail.data.password);
});
this.addEventListener('contextmenu', (eventArg) => {
plugins.deesCatalog.DeesContextmenu.openContextMenuWithOptions(eventArg, [
@@ -205,8 +206,8 @@ export class CloudlyDashboard extends DeesElement {
menuOptions: [
{
name: 'close',
iconName: null,
action: async (modalArg) => {
iconName: undefined,
action: async (modalArg: any) => {
await modalArg.destroy();
},
},
@@ -221,14 +222,14 @@ export class CloudlyDashboard extends DeesElement {
const domtools = await this.domtoolsPromise;
const loginState = appstate.loginStatePart.getState();
console.log(loginState);
if (loginState.identity) {
if (loginState?.identity) {
this.identity = loginState.identity;
try {
appstate.apiClient.identity = loginState.identity;
if (!appstate.apiClient['typedsocketClient']) {
await appstate.apiClient.start();
}
try { appstate.apiClient.typedsocketClient.addTag('identity', appstate.apiClient.identity); } catch {}
try { await appstate.apiClient.typedsocketClient.setTag('identity', appstate.apiClient.identity); } catch {}
} catch (e) { console.warn('Failed to initialize API client WS', e); }
await simpleLogin.switchToSlottedContent();
await appstate.dataState.dispatchAction(appstate.getAllDataAction, null);
@@ -238,14 +239,14 @@ export class CloudlyDashboard extends DeesElement {
private async login(username: string, password: string) {
const domtools = await this.domtoolsPromise;
console.log(`attempting to login...`);
const simpleLogin = this.shadowRoot.querySelector('dees-simple-login');
const form = simpleLogin.shadowRoot.querySelector('dees-form');
const simpleLogin = this.shadowRoot!.querySelector('dees-simple-login') as any;
const form = simpleLogin.shadowRoot.querySelector('dees-form') as any;
form.setStatus('pending', 'Logging in...');
const state = await appstate.loginStatePart.dispatchAction(appstate.loginAction, {
username,
password,
});
if (state.identity) {
if (state?.identity) {
console.log('got jwt');
this.identity = state.identity;
form.setStatus('success', 'Logged in!');
+1 -1
View File
@@ -8,7 +8,7 @@ import * as appstate from '../../../appstate.js';
@customElement('cloudly-view-backups')
export class CloudlyViewBackups extends DeesElement {
@state()
private data: appstate.IDataState = { secretGroups: [], secretBundles: [] } as any;
private accessor data: appstate.IDataState = { secretGroups: [], secretBundles: [] } as any;
constructor() {
super();
+2 -2
View File
@@ -25,8 +25,8 @@ const sourcePresetArchitectures: Record<TBaseOsImageSourcePreset, string> = {
@customElement('cloudly-view-baseos')
export class CloudlyViewBaseOs extends DeesElement {
@state() private builds: TBaseOsImageBuild[] = [];
@state() private isLoading = false;
@state() private accessor builds: TBaseOsImageBuild[] = [];
@state() private accessor isLoading = false;
private refreshTimer?: number;
+1 -1
View File
@@ -15,7 +15,7 @@ import * as appstate from '../../../appstate.js';
@customElement('cloudly-view-clusters')
export class CloudlyViewClusters extends DeesElement {
@state()
private data: appstate.IDataState = {} as any;
private accessor data: appstate.IDataState = {} as any;
constructor() {
super();
+1 -1
View File
@@ -8,7 +8,7 @@ import * as appstate from '../../../appstate.js';
@customElement('cloudly-view-dbs')
export class CloudlyViewDbs extends DeesElement {
@state()
private data: appstate.IDataState = { secretGroups: [], secretBundles: [] } as any;
private accessor data: appstate.IDataState = { secretGroups: [], secretBundles: [] } as any;
constructor() {
super();
+1 -2
View File
@@ -15,7 +15,7 @@ import * as appstate from '../../../appstate.js';
@customElement('cloudly-view-deployments')
export class CloudlyViewDeployments extends DeesElement {
@state()
private data: appstate.IDataState = {} as any;
private accessor data: appstate.IDataState = {} as any;
constructor() {
super();
@@ -219,4 +219,3 @@ declare global {
'cloudly-view-deployments': CloudlyViewDeployments;
}
}
+1 -1
View File
@@ -15,7 +15,7 @@ import * as appstate from '../../../appstate.js';
@customElement('cloudly-view-dns')
export class CloudlyViewDns extends DeesElement {
@state()
private data: appstate.IDataState = { secretGroups: [], secretBundles: [], dnsEntries: [], domains: [] } as any;
private accessor data: appstate.IDataState = { secretGroups: [], secretBundles: [], dnsEntries: [], domains: [] } as any;
constructor() {
super();
+1 -1
View File
@@ -8,7 +8,7 @@ import * as appstate from '../../../appstate.js';
@customElement('cloudly-view-domains')
export class CloudlyViewDomains extends DeesElement {
@state()
private data: appstate.IDataState = { secretGroups: [], secretBundles: [], domains: [], dnsEntries: [] } as any;
private accessor data: appstate.IDataState = { secretGroups: [], secretBundles: [], domains: [], dnsEntries: [] } as any;
constructor() {
super();
@@ -15,7 +15,7 @@ import * as appstate from '../../../appstate.js';
@customElement('cloudly-view-externalregistries')
export class CloudlyViewExternalRegistries extends DeesElement {
@state()
private data: appstate.IDataState = { secretGroups: [], secretBundles: [], externalRegistries: [] } as any;
private accessor data: appstate.IDataState = { secretGroups: [], secretBundles: [], externalRegistries: [] } as any;
constructor() {
super();
@@ -115,4 +115,3 @@ export class CloudlyViewExternalRegistries extends DeesElement {
}
declare global { interface HTMLElementTagNameMap { 'cloudly-view-externalregistries': CloudlyViewExternalRegistries; } }
+3 -4
View File
@@ -8,7 +8,7 @@ import * as appstate from '../../../appstate.js';
@customElement('cloudly-view-images')
export class CloudlyViewImages extends DeesElement {
@state()
private data: appstate.IDataState = {} as any;
private accessor data: appstate.IDataState = {} as any;
constructor() {
super();
@@ -86,8 +86,8 @@ export class CloudlyViewImages extends DeesElement {
</dees-form>
`,
menuOptions: [
{ name: 'Cancel', iconName: null, action: async (modalArg: any) => { await modalArg.destroy(); } },
{ name: 'Save', iconName: null, action: async (modalArg: any) => { const data = await modalArg.shadowRoot.querySelector('dees-form').collectFormData(); console.log(data); } },
{ name: 'Cancel', iconName: undefined, action: async (modalArg: any) => { await modalArg.destroy(); } },
{ name: 'Save', iconName: undefined, action: async (modalArg: any) => { const data = await modalArg.shadowRoot.querySelector('dees-form').collectFormData(); console.log(data); } },
],
});
},
@@ -139,4 +139,3 @@ declare global {
'cloudly-view-images': CloudlyViewImages;
}
}
+1 -1
View File
@@ -15,7 +15,7 @@ import * as appstate from '../../../appstate.js';
@customElement('cloudly-view-logs')
export class CloudlyViewLogs extends DeesElement {
@state()
private data: appstate.IDataState = { secretGroups: [], secretBundles: [] } as any;
private accessor data: appstate.IDataState = { secretGroups: [], secretBundles: [] } as any;
constructor() {
super();
+1 -1
View File
@@ -15,7 +15,7 @@ import * as appstate from '../../../appstate.js';
@customElement('cloudly-view-mails')
export class CloudlyViewMails extends DeesElement {
@state()
private data: appstate.IDataState = { secretGroups: [], secretBundles: [] } as any;
private accessor data: appstate.IDataState = { secretGroups: [], secretBundles: [] } as any;
constructor() {
super();
+1 -2
View File
@@ -14,7 +14,7 @@ import * as appstate from '../../../appstate.js';
@customElement('cloudly-view-overview')
export class CloudlyViewOverview extends DeesElement {
@state()
private data: appstate.IDataState = {
private accessor data: appstate.IDataState = {
secretGroups: [],
secretBundles: [],
};
@@ -68,4 +68,3 @@ declare global {
'cloudly-view-overview': CloudlyViewOverview;
}
}
+1 -1
View File
@@ -8,7 +8,7 @@ import * as appstate from '../../../appstate.js';
@customElement('cloudly-view-s3')
export class CloudlyViewS3 extends DeesElement {
@state()
private data: appstate.IDataState = { secretGroups: [], secretBundles: [] } as any;
private accessor data: appstate.IDataState = { secretGroups: [], secretBundles: [] } as any;
constructor() {
super();
+2 -3
View File
@@ -15,7 +15,7 @@ import * as appstate from '../../../appstate.js';
@customElement('cloudly-view-secretbundles')
export class CloudlyViewSecretBundles extends DeesElement {
@state()
private data: appstate.IDataState = {} as any;
private accessor data: appstate.IDataState = {} as any;
constructor() {
super();
@@ -39,7 +39,7 @@ export class CloudlyViewSecretBundles extends DeesElement {
const secretGroupIds = itemArg.data.includedSecretGroupIds;
let secretGroupNames: string[] = [];
for (const secretGroupId of secretGroupIds) {
const secretGroup = this.data.secretGroups.find((secretGroupArg: any) => secretGroupArg.id === secretGroupId);
const secretGroup = this.data.secretGroups?.find((secretGroupArg: any) => secretGroupArg.id === secretGroupId);
if (secretGroup) { secretGroupNames.push(secretGroup.data.name); }
}
return secretGroupNames.join(', ');
@@ -73,4 +73,3 @@ export class CloudlyViewSecretBundles extends DeesElement {
}
declare global { interface HTMLElementTagNameMap { 'cloudly-view-secretbundles': CloudlyViewSecretBundles; } }
+4 -5
View File
@@ -8,7 +8,7 @@ import * as appstate from '../../../appstate.js';
@customElement('cloudly-view-secretsgroups')
export class CloudlyViewSecretGroups extends DeesElement {
@state()
private data: appstate.IDataState = {} as any;
private accessor data: appstate.IDataState = {} as any;
constructor() {
super();
@@ -31,7 +31,7 @@ export class CloudlyViewSecretGroups extends DeesElement {
priority: secretGroup.data.priority,
tags: html`<dees-chips .selectionMode=${'none'} .selectableChips=${secretGroup.data.tags}></dees-chips>`,
key: secretGroup.data.key,
history: (() => { const allHistory = []; for (const environment in secretGroup.data.environments) { allHistory.push(...secretGroup.data.environments[environment].history); } return allHistory.length; })(),
history: (() => { const allHistory: Array<{ timestamp: string; value: string }> = []; for (const environment in secretGroup.data.environments) { allHistory.push(...secretGroup.data.environments[environment].history); } return allHistory.length; })(),
};
}}
.dataActions=${[
@@ -44,7 +44,7 @@ export class CloudlyViewSecretGroups extends DeesElement {
<dees-table heading1=${'Environments'} heading2=${'keys need to be unique'} key="environments" .data=${[{ environment: 'production', value: '' }, { environment: 'staging', value: '' }]} .dataActions=${[{ name: 'add environment', iconName: 'plus', type: ['footer'], actionFunc: async (dataArg: any) => { dataArg.table.data.push({ environment: 'new environment', value: '' }); dataArg.table.requestUpdate('data'); } }, { name: 'delete environment', iconName: 'trash', type: ['inRow'], actionFunc: async (dataArg: any) => { dataArg.table.data.splice(dataArg.table.data.indexOf(dataArg.item), 1); dataArg.table.requestUpdate('data'); } }] as plugins.deesCatalog.ITableAction[]} .editableFields=${['environment', 'value']}>
</dees-table>
</dees-form>
`, menuOptions: [ { name: 'cancel', action: async (modalArg: any) => { await modalArg.destroy(); } }, { name: 'save', action: async (modalArg: any) => { const deesForm = modalArg.shadowRoot.querySelector('dees-form'); const formData = await deesForm.collectFormData(); const environments: plugins.interfaces.data.ISecretGroup['data']['environments'] = {}; for (const itemArg of formData['environments'] as any[]) { environments[itemArg.environment] = { value: itemArg.value, history: [], lastUpdated: Date.now(), }; } await appstate.dataState.dispatchAction(appstate.createSecretGroupAction, { id: null, data: { name: formData['data.name'] as string, description: formData['data.description'] as string, key: formData['data.key'] as string, environments, tags: [], }, }); await modalArg.destroy(); } } ] });
`, menuOptions: [ { name: 'cancel', action: async (modalArg: any) => { await modalArg.destroy(); } }, { name: 'save', action: async (modalArg: any) => { const deesForm = modalArg.shadowRoot.querySelector('dees-form'); const formData = await deesForm.collectFormData(); const environments: plugins.interfaces.data.ISecretGroup['data']['environments'] = {}; for (const itemArg of formData['environments'] as any[]) { environments[itemArg.environment] = { value: itemArg.value, history: [], lastUpdated: Date.now(), }; } await appstate.dataState.dispatchAction(appstate.createSecretGroupAction, { data: { name: formData['data.name'] as string, description: formData['data.description'] as string, key: formData['data.key'] as string, environments, tags: [], }, }); await modalArg.destroy(); } } ] });
} },
{ name: 'edit', type: ['contextmenu', 'inRow', 'doubleClick'], iconName: 'penToSquare', actionFunc: async (dataArg: plugins.deesCatalog.ITableActionDataArg<plugins.interfaces.data.ISecretGroup>) => {
const environmentsArray: Array<plugins.interfaces.data.ISecretGroup['data']['environments'][any] & { environment: string; }> = [];
@@ -58,7 +58,7 @@ export class CloudlyViewSecretGroups extends DeesElement {
<dees-table .key=${'environments'} .heading1=${'Environments'} .heading2=${'double-click to edit values'} .data=${environmentsArray.map((itemArg) => ({ environment: itemArg.environment, value: itemArg.value, }))} .editableFields=${['environment', 'value']} .dataActions=${[{ name: 'delete', iconName: 'trash', type: ['inRow'], actionFunc: async (actionDataArg: any) => { actionDataArg.table.data.splice(actionDataArg.table.data.indexOf(actionDataArg.item), 1); } }] as plugins.deesCatalog.ITableAction[]}>
</dees-table>
</dees-form>
`, menuOptions: [ { name: 'Cancel', iconName: null, action: async (modalArg: any) => { await modalArg.destroy(); } }, { name: 'Save', iconName: null, action: async (modalArg: any) => { const data = await modalArg.shadowRoot.querySelector('dees-form').collectFormData(); console.log(data); } } ] });
`, menuOptions: [ { name: 'Cancel', iconName: undefined, action: async (modalArg: any) => { await modalArg.destroy(); } }, { name: 'Save', iconName: undefined, action: async (modalArg: any) => { const data = await modalArg.shadowRoot.querySelector('dees-form').collectFormData(); console.log(data); } } ] });
} },
{ name: 'history', iconName: 'clockRotateLeft', type: ['contextmenu', 'inRow'], actionFunc: async (dataArg: plugins.deesCatalog.ITableActionDataArg<plugins.interfaces.data.ISecretGroup>) => {
const historyArray: Array<{ environment: string; value: string; }> = []; for (const environment of Object.keys(dataArg.item.data.environments)) { for (const historyItem of dataArg.item.data.environments[environment].history) { historyArray.push({ environment, value: historyItem.value, }); } }
@@ -74,4 +74,3 @@ export class CloudlyViewSecretGroups extends DeesElement {
}
declare global { interface HTMLElementTagNameMap { 'cloudly-view-secretsgroups': CloudlyViewSecretGroups; } }
+1 -1
View File
@@ -15,7 +15,7 @@ import * as appstate from '../../../appstate.js';
@customElement('cloudly-view-services')
export class CloudlyViewServices extends DeesElement {
@state()
private data: appstate.IDataState = {} as any;
private accessor data: appstate.IDataState = {} as any;
constructor() {
super();
+3 -3
View File
@@ -15,13 +15,13 @@ import * as appstate from '../../../appstate.js';
@customElement('cloudly-view-settings')
export class CloudlyViewSettings extends DeesElement {
@state()
private settings: plugins.interfaces.data.ICloudlySettingsMasked = {} as any;
private accessor settings: plugins.interfaces.data.ICloudlySettingsMasked = {} as any;
@state()
private isLoading = false;
private accessor isLoading = false;
@state()
private testResults: {[key: string]: {success: boolean; message: string}} = {};
private accessor testResults: {[key: string]: {success: boolean; message: string}} = {};
constructor() {
super();
+10 -10
View File
@@ -18,29 +18,29 @@ import { formatCronFriendly, formatDate, formatDuration } from './utils.js';
@customElement('cloudly-view-tasks')
export class CloudlyViewTasks extends DeesElement {
@state()
private data: appstate.IDataState = {} as any;
private accessor data: appstate.IDataState = {} as any;
@state()
private selectedExecution: plugins.interfaces.data.ITaskExecution | null = null;
private accessor selectedExecution: plugins.interfaces.data.ITaskExecution | null = null;
@state()
private loading = false;
private accessor loading = false;
@state()
private filterStatus: string = 'all';
private accessor filterStatus: string = 'all';
@state()
private searchQuery: string = '';
private accessor searchQuery: string = '';
@state()
private categoryFilter: string = 'all';
private accessor categoryFilter: string = 'all';
@state()
private autoRefresh: boolean = true;
private accessor autoRefresh: boolean = true;
private _refreshHandle: any = null;
@state()
private canceling: Record<string, boolean> = {};
private accessor canceling: Record<string, boolean> = {};
constructor() {
super();
@@ -143,7 +143,7 @@ export class CloudlyViewTasks extends DeesElement {
});
} catch (error) {
console.error('Failed to trigger task:', error);
plugins.deesCatalog.DeesToast.createAndShow({ message: `Failed to trigger: ${error.message}`, type: 'error' });
plugins.deesCatalog.DeesToast.createAndShow({ message: `Failed to trigger: ${error instanceof Error ? error.message : String(error)}`, type: 'error' });
}
}
@@ -165,7 +165,7 @@ export class CloudlyViewTasks extends DeesElement {
}
} catch (err) {
console.error('Failed to cancel task:', err);
plugins.deesCatalog.DeesToast.createAndShow({ message: `Cancel failed: ${err.message}`, type: 'error' });
plugins.deesCatalog.DeesToast.createAndShow({ message: `Cancel failed: ${err instanceof Error ? err.message : String(err)}`, type: 'error' });
}
}
@@ -3,7 +3,7 @@ import { formatDate, formatDuration } from '../utils.js';
@customElement('cloudly-execution-details')
export class CloudlyExecutionDetails extends DeesElement {
@property({ type: Object }) execution: any;
@property({ type: Object }) accessor execution: any = undefined;
public static styles = [
cssManager.defaultStyles,
@@ -90,4 +90,3 @@ declare global {
'cloudly-execution-details': CloudlyExecutionDetails;
}
}
@@ -3,15 +3,15 @@ import { formatCronFriendly, formatDuration, formatRelativeTime, getCategoryHue,
@customElement('cloudly-task-panel')
export class CloudlyTaskPanel extends DeesElement {
@property({ type: Object }) task: any;
@property({ type: Array }) executions: any[] = [];
@property({ type: Object }) canceling: Record<string, boolean> = {};
@property({ type: Object }) accessor task: any = undefined;
@property({ type: Array }) accessor executions: any[] = [];
@property({ type: Object }) accessor canceling: Record<string, boolean> = {};
// Callbacks provided by parent view
@property({ attribute: false }) onRun?: (taskName: string) => void;
@property({ attribute: false }) onCancel?: (taskName: string) => void;
@property({ attribute: false }) onOpenDetails?: (execution: any) => void;
@property({ attribute: false }) onOpenLogs?: (execution: any) => void;
@property({ attribute: false }) accessor onRun: ((taskName: string) => void) | undefined = undefined;
@property({ attribute: false }) accessor onCancel: ((taskName: string) => void) | undefined = undefined;
@property({ attribute: false }) accessor onOpenDetails: ((execution: any) => void) | undefined = undefined;
@property({ attribute: false }) accessor onOpenLogs: ((execution: any) => void) | undefined = undefined;
public static styles = [
cssManager.defaultStyles,
@@ -203,4 +203,3 @@ declare global {
'cloudly-task-panel': CloudlyTaskPanel;
}
}