diff --git a/Taskfile.yaml b/Taskfile.yaml index 25d4a964e..560131781 100644 --- a/Taskfile.yaml +++ b/Taskfile.yaml @@ -146,6 +146,11 @@ tasks: URL_SUFFIX="-vision" ;; + "piyush") + BASE_URL=dev.kloudlite.io + URL_SUFFIX="" + ;; + *) URL_SUFFIX="" ;; diff --git a/gql-queries-generator/doc/queries.graphql b/gql-queries-generator/doc/queries.graphql index bbfc47a5a..2571f1a20 100644 --- a/gql-queries-generator/doc/queries.graphql +++ b/gql-queries-generator/doc/queries.graphql @@ -3314,10 +3314,13 @@ mutation consoleUpdateByokCluster($clusterName: String!, $displayName: String!) } } -query consoleGetBYOKClusterInstructions($name: String!) { - infrat_getBYOKClusterSetupInstructions(name: $name) { - title +query consoleGetBYOKClusterInstructions($name: String!, $onlyHelmValues: Boolean) { + infrat_getBYOKClusterSetupInstructions( + name: $name + onlyHelmValues: $onlyHelmValues + ) { command + title } } @@ -3563,7 +3566,6 @@ query consoleGetManagedResource($name: String!, $msvcName: String, $envName: Str name namespace } - spec } } status { @@ -3673,7 +3675,6 @@ query consoleListManagedResources($search: SearchManagedResources, $pq: CursorPa name namespace } - spec } } status { @@ -3734,20 +3735,6 @@ mutation consoleDeleteManagedResource($msvcName: String!, $mresName: String!) { core_deleteManagedResource(msvcName: $msvcName, mresName: $mresName) } -mutation consoleImportManagedResource($envName: String!, $msvcName: String!, $mresName: String!) { - core_importManagedResource( - envName: $envName - msvcName: $msvcName - mresName: $mresName - ) { - id - } -} - -mutation consoleDeleteImportedManagedResource($envName: String!, $mresName: String!) { - core_deleteImportedManagedResource(envName: $envName, mresName: $mresName) -} - query consoleGetHelmChart($clusterName: String!, $name: String!) { infra_getHelmRelease(clusterName: $clusterName, name: $name) { createdBy { @@ -4430,6 +4417,145 @@ query consoleListNotifications($pagination: CursorPaginationIn) { } } +mutation consoleImportManagedResource($envName: String!, $mresName: String!, $msvcName: String!, $importName: String!) { + core_importManagedResource( + envName: $envName + mresName: $mresName + msvcName: $msvcName + importName: $importName + ) { + id + } +} + +mutation consoleDeleteImportedManagedResource($envName: String!, $importName: String!) { + core_deleteImportedManagedResource(envName: $envName, importName: $importName) +} + +query consoleListImportedManagedResources($envName: String!, $search: SearchImportedManagedResources, $pq: CursorPaginationIn) { + core_listImportedManagedResources(envName: $envName, search: $search, pq: $pq) { + edges { + cursor + node { + accountName + createdBy { + userEmail + userId + userName + } + creationTime + displayName + environmentName + id + lastUpdatedBy { + userEmail + userId + userName + } + managedResourceRef { + id + name + namespace + } + markedForDeletion + name + recordVersion + secretRef { + name + namespace + } + syncStatus { + action + error + lastSyncedAt + recordVersion + state + syncScheduledAt + } + updateTime + managedResource { + accountName + apiVersion + clusterName + creationTime + displayName + enabled + environmentName + id + isImported + kind + managedServiceName + markedForDeletion + metadata { + annotations + creationTimestamp + deletionTimestamp + generation + labels + name + namespace + } + mresRef + recordVersion + spec { + resourceNamePrefix + resourceTemplate { + apiVersion + kind + msvcRef { + apiVersion + clusterName + kind + name + namespace + } + spec + } + } + status { + checkList { + debug + description + hide + name + title + } + checks + isReady + lastReadyGeneration + lastReconcileTime + message { + RawMessage + } + resources { + apiVersion + kind + name + namespace + } + } + syncedOutputSecretRef { + apiVersion + data + immutable + kind + stringData + type + } + updateTime + } + } + } + pageInfo { + endCursor + hasNextPage + hasPreviousPage + startCursor + } + totalCount + } +} + query iotconsoleAccountCheckNameAvailability($name: String!) { accounts_checkNameAvailability(name: $name) { result @@ -6175,7 +6301,7 @@ query authCli_infraCheckNameAvailability($resType: ResType!, $name: String!, $cl } } -query authCli_getConfigSecretMap($envName: String!, $configQueries: [ConfigKeyRefIn], $secretQueries: [SecretKeyRefIn!], $mresQueries: [ManagedResourceKeyRefIn]) { +query authCli_getConfigSecretMap($envName: String!, $configQueries: [ConfigKeyRefIn!], $secretQueries: [SecretKeyRefIn!], $mresQueries: [SecretKeyRefIn!]) { configs: core_getConfigValues(envName: $envName, queries: $configQueries) { configName key @@ -6186,12 +6312,9 @@ query authCli_getConfigSecretMap($envName: String!, $configQueries: [ConfigKeyRe secretName value } - mreses: core_getManagedResouceOutputKeyValues( - keyrefs: $mresQueries - envName: $envName - ) { + mreses: core_getSecretValues(envName: $envName, queries: $mresQueries) { key - mresName + secretName value } } @@ -6353,6 +6476,7 @@ query authCli_listSecrets($envName: String!, $pq: CursorPaginationIn) { name namespace } + isReadyOnly stringData } } @@ -6448,6 +6572,150 @@ query authCli_getRemoteLogin($loginId: String!, $secret: String!) { } } +mutation authCli_createClusterReference($cluster: BYOKClusterIn!) { + infra_createBYOKCluster(cluster: $cluster) { + id + metadata { + name + } + } +} + +mutation authCli_deleteClusterReference($name: String!) { + infra_deleteBYOKCluster(name: $name) +} + +query authCli_clusterReferenceInstructions($name: String!) { + infrat_getBYOKClusterSetupInstructions(name: $name, onlyHelmValues: true) { + command + title + } +} + +query authCli_listImportedManagedResources($envName: String!, $search: SearchImportedManagedResources, $pq: CursorPaginationIn) { + core_listImportedManagedResources(envName: $envName, search: $search, pq: $pq) { + edges { + cursor + node { + accountName + createdBy { + userEmail + userId + userName + } + creationTime + displayName + environmentName + id + lastUpdatedBy { + userEmail + userId + userName + } + managedResourceRef { + id + name + namespace + } + markedForDeletion + name + recordVersion + secretRef { + name + namespace + } + syncStatus { + action + error + lastSyncedAt + recordVersion + state + syncScheduledAt + } + updateTime + managedResource { + accountName + apiVersion + clusterName + creationTime + displayName + enabled + environmentName + id + isImported + kind + managedServiceName + markedForDeletion + metadata { + annotations + creationTimestamp + deletionTimestamp + generation + labels + name + namespace + } + mresRef + recordVersion + spec { + resourceNamePrefix + resourceTemplate { + apiVersion + kind + msvcRef { + apiVersion + clusterName + kind + name + namespace + } + spec + } + } + status { + checkList { + debug + description + hide + name + title + } + checks + isReady + lastReadyGeneration + lastReconcileTime + message { + RawMessage + } + resources { + apiVersion + kind + name + namespace + } + } + syncedOutputSecretRef { + apiVersion + data + immutable + kind + stringData + type + } + updateTime + } + } + } + pageInfo { + endCursor + hasNextPage + hasPreviousPage + startCursor + } + totalCount + } +} + mutation authSetRemoteAuthHeader($loginId: String!, $authHeader: String) { auth_setRemoteAuthHeader(loginId: $loginId, authHeader: $authHeader) } diff --git a/lib/server/helpers/execute-query-with-context.ts b/lib/server/helpers/execute-query-with-context.ts index 74cc33020..bb0d4aa68 100644 --- a/lib/server/helpers/execute-query-with-context.ts +++ b/lib/server/helpers/execute-query-with-context.ts @@ -74,6 +74,7 @@ export const ExecuteQueryWithContext = ( method: 'POST', headers: { 'Content-Type': 'application/json; charset=utf-8', + connection: 'keep-alive', ...{ cookie: Object.entries(cookie) .map(([key, value]) => `${key}=${value}`) diff --git a/src/apps/auth/server/gql/cli-queries.ts b/src/apps/auth/server/gql/cli-queries.ts index 6c0041b44..bb419b225 100644 --- a/src/apps/auth/server/gql/cli-queries.ts +++ b/src/apps/auth/server/gql/cli-queries.ts @@ -232,9 +232,9 @@ export const cliQueries = (executor: IExecutor) => ({ gql` query Core_getConfigValues( $envName: String! - $configQueries: [ConfigKeyRefIn] + $configQueries: [ConfigKeyRefIn!] $secretQueries: [SecretKeyRefIn!] - $mresQueries: [ManagedResourceKeyRefIn] + $mresQueries: [SecretKeyRefIn!] ) { configs: core_getConfigValues( envName: $envName @@ -252,12 +252,9 @@ export const cliQueries = (executor: IExecutor) => ({ secretName value } - mreses: core_getManagedResouceOutputKeyValues( - keyrefs: $mresQueries - envName: $envName - ) { + mreses: core_getSecretValues(envName: $envName, queries: $mresQueries) { key - mresName + secretName value } } @@ -515,6 +512,7 @@ export const cliQueries = (executor: IExecutor) => ({ name namespace } + isReadyOnly stringData } } @@ -668,4 +666,192 @@ export const cliQueries = (executor: IExecutor) => ({ vars: (_: any) => {}, } ), + cli_createClusterReference: executor( + gql` + mutation Infra_createBYOKCluster($cluster: BYOKClusterIn!) { + infra_createBYOKCluster(cluster: $cluster) { + id + metadata { + name + } + } + } + `, + { + transformer: (data: any) => data.infra_createBYOKCluster, + vars(_: any) {}, + } + ), + cli_deleteClusterReference: executor( + gql` + mutation Infra_deleteBYOKCluster($name: String!) { + infra_deleteBYOKCluster(name: $name) + } + `, + { + transformer: (data: any) => data.infra_deleteBYOKCluster, + vars(_: any) {}, + } + ), + cli_clusterReferenceInstructions: executor( + gql` + query Infrat_getBYOKClusterSetupInstructions($name: String!) { + infrat_getBYOKClusterSetupInstructions( + name: $name + onlyHelmValues: true + ) { + command + title + } + } + `, + { + transformer: (data: any) => { + const instructions = JSON.parse( + data.infrat_getBYOKClusterSetupInstructions[0].command + ); + return instructions; + }, + vars(_: any) {}, + } + ), + cli_listImportedManagedResources: executor( + gql` + query Core_listImportedManagedResources( + $envName: String! + $search: SearchImportedManagedResources + $pq: CursorPaginationIn + ) { + core_listImportedManagedResources( + envName: $envName + search: $search + pq: $pq + ) { + edges { + cursor + node { + accountName + createdBy { + userEmail + userId + userName + } + creationTime + displayName + environmentName + id + lastUpdatedBy { + userEmail + userId + userName + } + managedResourceRef { + id + name + namespace + } + markedForDeletion + name + recordVersion + secretRef { + name + namespace + } + syncStatus { + action + error + lastSyncedAt + recordVersion + state + syncScheduledAt + } + updateTime + managedResource { + accountName + apiVersion + clusterName + creationTime + displayName + enabled + environmentName + id + isImported + kind + managedServiceName + markedForDeletion + metadata { + annotations + creationTimestamp + deletionTimestamp + generation + labels + name + namespace + } + mresRef + recordVersion + spec { + resourceNamePrefix + resourceTemplate { + apiVersion + kind + msvcRef { + apiVersion + clusterName + kind + name + namespace + } + spec + } + } + status { + checkList { + debug + description + hide + name + title + } + checks + isReady + lastReadyGeneration + lastReconcileTime + message { + RawMessage + } + resources { + apiVersion + kind + name + namespace + } + } + syncedOutputSecretRef { + apiVersion + data + immutable + kind + stringData + type + } + updateTime + } + } + } + pageInfo { + endCursor + hasNextPage + hasPreviousPage + startCursor + } + totalCount + } + } + `, + { + transformer: (data: any) => data.core_listImportedManagedResources, + vars(_: any) {}, + } + ), }); diff --git a/src/apps/console/page-components/secret-resource-v2.tsx b/src/apps/console/page-components/secret-resource-v2.tsx index dd9eaf0d2..6c9679527 100644 --- a/src/apps/console/page-components/secret-resource-v2.tsx +++ b/src/apps/console/page-components/secret-resource-v2.tsx @@ -38,7 +38,7 @@ interface IResource { const parseItem = (item: BaseType) => { return { - name: item.displayName, + name: item.displayName || parseName(item), id: parseName(item), entries: [`${Object.keys(item?.stringData || {}).length || 0} Entries`], updateInfo: { @@ -237,10 +237,10 @@ const SecretResourcesV2 = ({ const reloadPage = useReload(); const { environment, account } = useParams(); - const filteredItems = items.filter((item) => !item.isReadyOnly); + // const filteredItems = items.filter((item) => !item.isReadyOnly); useWatchReload( - filteredItems.map((i) => { + items.map((i) => { return `account:${account}.environment:${environment}.secret:${parseName( i )}`; @@ -248,7 +248,7 @@ const SecretResourcesV2 = ({ ); const props: IResource = { - items: filteredItems, + items, hasActions, onClick, linkComponent, diff --git a/src/apps/console/routes/_main+/$account+/env+/$environment+/_layout.tsx b/src/apps/console/routes/_main+/$account+/env+/$environment+/_layout.tsx index c77fae868..7f1ec3995 100644 --- a/src/apps/console/routes/_main+/$account+/env+/$environment+/_layout.tsx +++ b/src/apps/console/routes/_main+/$account+/env+/$environment+/_layout.tsx @@ -3,7 +3,7 @@ import { CirclesFour, GearSix, File, - TreeStructure, + // TreeStructure, } from '~/console/components/icons'; import { Link, @@ -64,23 +64,13 @@ const tabs = [ { label: ( - - External Apps + + Integrated Resources ), - to: '/external-apps', - value: '/external-apps', + to: '/managed-resources', + value: '/managed-resources', }, - // { - // label: ( - // - // - // Router - // - // ), - // to: '/routers', - // value: '/routers', - // }, { label: ( @@ -91,16 +81,16 @@ const tabs = [ to: '/cs/configs', value: '/cs', }, - { - label: ( - - - Integrated resources - - ), - to: '/managed-resources', - value: '/managed-resources', - }, + // { + // label: ( + // + // + // External Apps + // + // ), + // to: '/external-apps', + // value: '/external-apps', + // }, // { // label: 'Jobs & Crons', // to: '/jc/task', diff --git a/src/apps/console/routes/_main+/$account+/env+/$environment+/cs+/secrets._index/handle-secret.tsx b/src/apps/console/routes/_main+/$account+/env+/$environment+/cs+/secrets._index/handle-secret.tsx index 52a29de5c..1b0386d02 100644 --- a/src/apps/console/routes/_main+/$account+/env+/$environment+/cs+/secrets._index/handle-secret.tsx +++ b/src/apps/console/routes/_main+/$account+/env+/$environment+/cs+/secrets._index/handle-secret.tsx @@ -27,13 +27,13 @@ const HandleSecret = ({ show, setShow }: IDialog) => { name: Yup.string().required(), }), onSubmit: async (val) => { - if ( !environment) { + if (!environment) { throw new Error('Project and Environment is required!.'); } try { const { errors: e } = await api.createSecret({ envName: environment, - + secret: { metadata: { name: val.name, diff --git a/src/apps/console/routes/_main+/$account+/env+/$environment+/cs+/secrets._index/route.tsx b/src/apps/console/routes/_main+/$account+/env+/$environment+/cs+/secrets._index/route.tsx index c5665cf00..ceee781a7 100644 --- a/src/apps/console/routes/_main+/$account+/env+/$environment+/cs+/secrets._index/route.tsx +++ b/src/apps/console/routes/_main+/$account+/env+/$environment+/cs+/secrets._index/route.tsx @@ -55,7 +55,7 @@ const Secrets = () => { }} > {({ secretsData }) => { - const secrets = parseNodes(secretsData); + const secrets = parseNodes(secretsData).filter((s) => !s.isReadyOnly); if (!secrets) { return null; } diff --git a/src/apps/console/routes/_main+/$account+/env+/$environment+/managed-resources/handle-managed-resource-v2.tsx b/src/apps/console/routes/_main+/$account+/env+/$environment+/managed-resources/handle-managed-resource-v2.tsx index 8d99c0223..c1c052425 100644 --- a/src/apps/console/routes/_main+/$account+/env+/$environment+/managed-resources/handle-managed-resource-v2.tsx +++ b/src/apps/console/routes/_main+/$account+/env+/$environment+/managed-resources/handle-managed-resource-v2.tsx @@ -21,13 +21,14 @@ import ListV2 from '~/console/components/listV2'; import { ListItem } from '~/console/components/console-list-components'; import { CopyContentToClipboard } from '~/console/components/common-console-components'; import { useEffect, useState } from 'react'; -import { IManagedResources } from '~/console/server/gql/queries/managed-resources-queries'; import { toast } from '~/components/molecule/toast'; import { ensureAccountClientSide } from '~/console/server/utils/auth-utils'; +import { NameIdView } from '~/console/components/name-id-view'; +import { IImportedManagedResources } from '~/console/server/gql/queries/imported-managed-resource-queries'; import { IEnvironmentContext } from '../_layout'; -type BaseType = ExtractNodeType; -type IDialog = IDialogBase>; +type BaseType = ExtractNodeType; +type IDialog = IDialogBase>; const SelectItem = ({ label, value }: { label: string; value: string }) => { return ( @@ -55,6 +56,8 @@ const Root = (props: IDialog) => { } : { isNameError: false, + name: '', + displayName: '', managedServiceName: '', managedResourceName: '', }, @@ -73,6 +76,7 @@ const Root = (props: IDialog) => { envName: parseName(environment), msvcName: val.managedServiceName || '', mresName: val.managedResourceName || '', + importName: val.name || '', }); if (e) { throw e[0]; @@ -147,6 +151,17 @@ const Root = (props: IDialog) => { >
+ + ({ ), getBYOKClusterInstructions: executor( gql` - query Infrat_getBYOKClusterSetupInstructions($name: String!) { - infrat_getBYOKClusterSetupInstructions(name: $name) { - title + query Infrat_getBYOKClusterSetupInstructions( + $name: String! + $onlyHelmValues: Boolean + ) { + infrat_getBYOKClusterSetupInstructions( + name: $name + onlyHelmValues: $onlyHelmValues + ) { command + title } } `, diff --git a/src/apps/console/server/gql/queries/imported-managed-resource-queries.tsx b/src/apps/console/server/gql/queries/imported-managed-resource-queries.tsx new file mode 100644 index 000000000..e45f31ea6 --- /dev/null +++ b/src/apps/console/server/gql/queries/imported-managed-resource-queries.tsx @@ -0,0 +1,200 @@ +import gql from 'graphql-tag'; +import { IExecutor } from '~/root/lib/server/helpers/execute-query-with-context'; +import { NN } from '~/root/lib/types/common'; +import { + ConsoleImportManagedResourceMutation, + ConsoleImportManagedResourceMutationVariables, + ConsoleDeleteImportedManagedResourceMutation, + ConsoleDeleteImportedManagedResourceMutationVariables, + ConsoleListImportedManagedResourcesQuery, + ConsoleListImportedManagedResourcesQueryVariables, +} from '~/root/src/generated/gql/server'; + +export type IImportedManagedResources = NN< + ConsoleListImportedManagedResourcesQuery['core_listImportedManagedResources'] +>; + +export const importedManagedResourceQueries = (executor: IExecutor) => ({ + importManagedResource: executor( + gql` + mutation Core_importManagedResource( + $envName: String! + $mresName: String! + $msvcName: String! + $importName: String! + ) { + core_importManagedResource( + envName: $envName + mresName: $mresName + msvcName: $msvcName + importName: $importName + ) { + id + } + } + `, + { + transformer: (data: ConsoleImportManagedResourceMutation) => + data.core_importManagedResource, + vars(_: ConsoleImportManagedResourceMutationVariables) {}, + } + ), + deleteImportedManagedResource: executor( + gql` + mutation Core_deleteImportedManagedResource( + $envName: String! + $importName: String! + ) { + core_deleteImportedManagedResource( + envName: $envName + importName: $importName + ) + } + `, + { + transformer: (data: ConsoleDeleteImportedManagedResourceMutation) => + data.core_deleteImportedManagedResource, + vars(_: ConsoleDeleteImportedManagedResourceMutationVariables) {}, + } + ), + listImportedManagedResources: executor( + gql` + query Core_listImportedManagedResources( + $envName: String! + $search: SearchImportedManagedResources + $pq: CursorPaginationIn + ) { + core_listImportedManagedResources( + envName: $envName + search: $search + pq: $pq + ) { + edges { + cursor + node { + accountName + createdBy { + userEmail + userId + userName + } + creationTime + displayName + environmentName + id + lastUpdatedBy { + userEmail + userId + userName + } + managedResourceRef { + id + name + namespace + } + markedForDeletion + name + recordVersion + secretRef { + name + namespace + } + syncStatus { + action + error + lastSyncedAt + recordVersion + state + syncScheduledAt + } + updateTime + managedResource { + accountName + apiVersion + clusterName + creationTime + displayName + enabled + environmentName + id + isImported + kind + managedServiceName + markedForDeletion + metadata { + annotations + creationTimestamp + deletionTimestamp + generation + labels + name + namespace + } + mresRef + recordVersion + spec { + resourceNamePrefix + resourceTemplate { + apiVersion + kind + msvcRef { + apiVersion + clusterName + kind + name + namespace + } + spec + } + } + status { + checkList { + debug + description + hide + name + title + } + checks + isReady + lastReadyGeneration + lastReconcileTime + message { + RawMessage + } + resources { + apiVersion + kind + name + namespace + } + } + syncedOutputSecretRef { + apiVersion + data + immutable + kind + stringData + type + } + updateTime + } + } + } + pageInfo { + endCursor + hasNextPage + hasPreviousPage + startCursor + } + totalCount + } + } + `, + { + transformer: (data: ConsoleListImportedManagedResourcesQuery) => + data.core_listImportedManagedResources, + vars(_: ConsoleListImportedManagedResourcesQueryVariables) {}, + } + ), +}); diff --git a/src/apps/console/server/gql/queries/managed-resources-queries.ts b/src/apps/console/server/gql/queries/managed-resources-queries.ts index edb4ec2b8..03a4fe0df 100644 --- a/src/apps/console/server/gql/queries/managed-resources-queries.ts +++ b/src/apps/console/server/gql/queries/managed-resources-queries.ts @@ -12,10 +12,6 @@ import { ConsoleUpdateManagedResourceMutationVariables, ConsoleDeleteManagedResourceMutation, ConsoleDeleteManagedResourceMutationVariables, - ConsoleImportManagedResourceMutation, - ConsoleImportManagedResourceMutationVariables, - ConsoleDeleteImportedManagedResourceMutation, - ConsoleDeleteImportedManagedResourceMutationVariables, } from '~/root/src/generated/gql/server'; export type IManagedResource = NN< @@ -83,7 +79,6 @@ export const managedResourceQueries = (executor: IExecutor) => ({ name namespace } - spec } } status { @@ -227,7 +222,6 @@ export const managedResourceQueries = (executor: IExecutor) => ({ name namespace } - spec } } status { @@ -305,44 +299,4 @@ export const managedResourceQueries = (executor: IExecutor) => ({ vars(_: ConsoleDeleteManagedResourceMutationVariables) {}, } ), - importManagedResource: executor( - gql` - mutation Core_importManagedResource( - $envName: String! - $msvcName: String! - $mresName: String! - ) { - core_importManagedResource( - envName: $envName - msvcName: $msvcName - mresName: $mresName - ) { - id - } - } - `, - { - transformer: (data: ConsoleImportManagedResourceMutation) => - data.core_importManagedResource, - vars(_: ConsoleImportManagedResourceMutationVariables) {}, - } - ), - deleteImportedManagedResource: executor( - gql` - mutation Core_deleteImportedManagedResource( - $envName: String! - $mresName: String! - ) { - core_deleteImportedManagedResource( - envName: $envName - mresName: $mresName - ) - } - `, - { - transformer: (data: ConsoleDeleteImportedManagedResourceMutation) => - data.core_deleteImportedManagedResource, - vars(_: ConsoleDeleteImportedManagedResourceMutationVariables) {}, - } - ), }); diff --git a/src/apps/console/server/gql/queries/secret-queries.ts b/src/apps/console/server/gql/queries/secret-queries.ts index 8415c6d9d..e02021213 100644 --- a/src/apps/console/server/gql/queries/secret-queries.ts +++ b/src/apps/console/server/gql/queries/secret-queries.ts @@ -25,11 +25,7 @@ export const secretQueries = (executor: IExecutor) => ({ $search: SearchSecrets $pq: CursorPaginationIn ) { - core_listSecrets( - envName: $envName - search: $search - pq: $pq - ) { + core_listSecrets(envName: $envName, search: $search, pq: $pq) { edges { cursor node { @@ -80,14 +76,8 @@ export const secretQueries = (executor: IExecutor) => ({ ), createSecret: executor( gql` - mutation Core_createSecret( - $envName: String! - $secret: SecretIn! - ) { - core_createSecret( - envName: $envName - secret: $secret - ) { + mutation Core_createSecret($envName: String!, $secret: SecretIn!) { + core_createSecret(envName: $envName, secret: $secret) { id } } @@ -101,14 +91,8 @@ export const secretQueries = (executor: IExecutor) => ({ getSecret: executor( gql` - query Core_getSecret( - $envName: String! - $name: String! - ) { - core_getSecret( - envName: $envName - name: $name - ) { + query Core_getSecret($envName: String!, $name: String!) { + core_getSecret(envName: $envName, name: $name) { data displayName environmentName @@ -135,14 +119,8 @@ export const secretQueries = (executor: IExecutor) => ({ ), updateSecret: executor( gql` - mutation Core_updateSecret( - $envName: String! - $secret: SecretIn! - ) { - core_updateSecret( - envName: $envName - secret: $secret - ) { + mutation Core_updateSecret($envName: String!, $secret: SecretIn!) { + core_updateSecret(envName: $envName, secret: $secret) { id } } @@ -154,14 +132,8 @@ export const secretQueries = (executor: IExecutor) => ({ ), deleteSecret: executor( gql` - mutation Core_deleteSecret( - $envName: String! - $secretName: String! - ) { - core_deleteSecret( - envName: $envName - secretName: $secretName - ) + mutation Core_deleteSecret($envName: String!, $secretName: String!) { + core_deleteSecret(envName: $envName, secretName: $secretName) } `, { diff --git a/src/apps/console/server/gql/saved-queries.ts b/src/apps/console/server/gql/saved-queries.ts index cbca2f844..60c0dd939 100644 --- a/src/apps/console/server/gql/saved-queries.ts +++ b/src/apps/console/server/gql/saved-queries.ts @@ -31,6 +31,7 @@ import { consoleVpnQueries } from './queries/console-vpn-queries'; import { imagePullSecretsQueries } from './queries/image-pull-secrets-queries'; import { globalVpnQueries } from './queries/global-vpn-queries'; import { commsNotificationQueries } from './queries/comms-queries'; +import { importedManagedResourceQueries } from './queries/imported-managed-resource-queries'; export const GQLServerHandler = ({ headers, cookies }: IGQLServerProps) => { const executor = ExecuteQueryWithContext(headers, cookies); @@ -66,6 +67,7 @@ export const GQLServerHandler = ({ headers, cookies }: IGQLServerProps) => { ...imagePullSecretsQueries(executor), ...globalVpnQueries(executor), ...commsNotificationQueries(executor), + ...importedManagedResourceQueries(executor), }; }; diff --git a/src/apps/console/utils/commons.tsx b/src/apps/console/utils/commons.tsx index daea47ed1..04d98bf50 100644 --- a/src/apps/console/utils/commons.tsx +++ b/src/apps/console/utils/commons.tsx @@ -27,6 +27,15 @@ export const getManagedTemplate = ({ .find((t) => t.kind === kind && t.apiVersion === apiVersion); }; +export const getManagedTemplateLogo = ( + templates: IMSvTemplates, + msvcApiVersion: string +) => { + return templates + ?.flatMap((t) => t.items.flat()) + .find((t) => t.apiVersion === msvcApiVersion)?.logoUrl; +}; + export const DIALOG_TYPE = Object.freeze({ ADD: 'add', EDIT: 'edit', diff --git a/src/apps/devdoc/app/components/header-secondary.tsx b/src/apps/devdoc/app/components/header-secondary.tsx index 6b960a9af..12514e1b5 100644 --- a/src/apps/devdoc/app/components/header-secondary.tsx +++ b/src/apps/devdoc/app/components/header-secondary.tsx @@ -2,6 +2,8 @@ import { PageItem } from 'nextra/normalize-pages'; import Link from 'next/link'; import { GithubLogoFill } from '@jengaicons/react'; import { Button } from 'kl-design-system/atoms/button'; +import { useEffect } from 'react'; +import { useRouter } from 'next/router'; import useConfig, { IHeaderSecondary } from '../utils/use-config'; import { cn } from '../utils/commons'; import MenuToggle from './menu-button'; @@ -9,8 +11,6 @@ import useMenu from '../utils/use-menu'; import Wrapper from './wrapper'; import NavigationMenuV2 from './nav-menu-v2'; import JoinProvidersDialog from './join-provider-dialog'; -import { useEffect } from 'react'; -import { useRouter } from 'next/router'; import useSearch from '../utils/use-search'; import SearchBox from './search'; @@ -65,6 +65,7 @@ const HeaderSecondary = ({ href={config.gitRepoUrl} aria-label="kloudlite-github" className="wb-hidden lg:wb-block wb-text-icon-default" + target="_blank" > diff --git a/src/apps/devdoc/app/layout/theme.tsx b/src/apps/devdoc/app/layout/theme.tsx index 372aa4532..9fd3ff637 100644 --- a/src/apps/devdoc/app/layout/theme.tsx +++ b/src/apps/devdoc/app/layout/theme.tsx @@ -314,6 +314,10 @@ export const fetchProviders = async () => { method: 'loginPageInitUrls', args: [{}], }, + headers: { + 'Content-Type': 'application/json; charset=utf-8', + connection: 'keep-alive', + }, }); if (res.data?.data) { return res.data.data; @@ -334,6 +338,10 @@ const getUser = async () => { method: 'whoAmI', args: [{}], }, + headers: { + 'Content-Type': 'application/json; charset=utf-8', + connection: 'keep-alive', + }, }); if (res.data?.data) { return res.data.data; diff --git a/src/apps/devdoc/app/utils/config.tsx b/src/apps/devdoc/app/utils/config.tsx index 8d3cf482b..2eeab5698 100644 --- a/src/apps/devdoc/app/utils/config.tsx +++ b/src/apps/devdoc/app/utils/config.tsx @@ -30,13 +30,13 @@ const socialIconSize = 18; const SocialMenu = () => { return ( @@ -52,7 +52,7 @@ const BrandMenu = ({ className }: { className?: string }) => {
diff --git a/src/apps/devdoc/app/utils/const.tsx b/src/apps/devdoc/app/utils/const.tsx index 92717768f..d418d40c8 100644 --- a/src/apps/devdoc/app/utils/const.tsx +++ b/src/apps/devdoc/app/utils/const.tsx @@ -1,6 +1,8 @@ /** eslint-disable prettier/prettier */ import { ArrowLeftLg, TwitterNewLogoFill } from '@jengaicons/react'; +import Link from 'next/link'; +import { Badge } from 'kl-design-system/atoms/badge'; import BlogCover from '~/public/blog/blog-cover.jpeg'; import profileKarthik from '~/images/about-us/karthik-thirumalasetti.png'; @@ -13,6 +15,7 @@ import profilePiyush from '~/images/about-us/piyush.jpg'; import profileAbdhesh from '~/images/about-us/abdhesh.jpeg'; import profileAnshuman from '~/images/about-us/ansuman.jpg'; import profileMohit from '~/images/about-us/mohit.jpg'; +import profileBikash from '~/images/about-us/bikash.jpg'; import collaborate1440 from '~/images/homeNew/collaborate1440.svg'; import connect1440 from '~/images/homeNew/connect1440.svg'; @@ -57,8 +60,6 @@ import { Users, Keyhole, } from '~/app/icons/icons'; -import Link from 'next/link'; -import { Badge } from 'kl-design-system/atoms/badge'; import AnserSvg from '../icons/AnserRobotics'; import BoltzmanSvg from '../icons/Boltzman'; import CrewScaleSvg from '../icons/CrewScale'; @@ -570,7 +571,7 @@ const consts = { { name: 'Bikash Ojha', role: 'Frontend Developer', - image: '', + image: profileBikash.src, linkedin: 'bikash-ojha', x: '', github: 'tulsiojha', diff --git a/src/apps/devdoc/images/about-us/bikash.jpg b/src/apps/devdoc/images/about-us/bikash.jpg new file mode 100644 index 000000000..32b334de8 Binary files /dev/null and b/src/apps/devdoc/images/about-us/bikash.jpg differ diff --git a/src/apps/devdoc/pages/docs/_meta.json b/src/apps/devdoc/pages/docs/_meta.json index 266171589..3b5c7ee65 100644 --- a/src/apps/devdoc/pages/docs/_meta.json +++ b/src/apps/devdoc/pages/docs/_meta.json @@ -53,6 +53,9 @@ "title":"Engage", "type":"separator" }, + "contributing":{ + "title":"Contributing" + }, "github":{ "title":"Community", "href": "https://github.com/kloudlite/kloudlite/discussions" diff --git a/src/apps/devdoc/pages/docs/contributing/_meta.json b/src/apps/devdoc/pages/docs/contributing/_meta.json new file mode 100644 index 000000000..0a4ed3200 --- /dev/null +++ b/src/apps/devdoc/pages/docs/contributing/_meta.json @@ -0,0 +1,17 @@ +{ + "code-of-conduct":{ + "title": "Code of Conduct" + }, + "feature-stages":{ + "title": "Feature Stages" + }, + "documentation":{ + "title": "Documentation" + }, + "security":{ + "title": "Security" + }, + "frontend":{ + "title": "Frontend" + } +} diff --git a/src/apps/devdoc/pages/docs/contributing/code-of-conduct.mdx b/src/apps/devdoc/pages/docs/contributing/code-of-conduct.mdx new file mode 100644 index 000000000..1ff565371 --- /dev/null +++ b/src/apps/devdoc/pages/docs/contributing/code-of-conduct.mdx @@ -0,0 +1,52 @@ +# Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at [info@kloudlite.com](mailto:info@kloudlite.com). All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ + +For answers to common questions about this code of conduct, see [http://contributor-covenant.org/faq][faq] + +[faq]: http://contributor-covenant.org/faq + +
\ No newline at end of file diff --git a/src/apps/devdoc/pages/docs/contributing/documentation.mdx b/src/apps/devdoc/pages/docs/contributing/documentation.mdx new file mode 100644 index 000000000..3bcab6a00 --- /dev/null +++ b/src/apps/devdoc/pages/docs/contributing/documentation.mdx @@ -0,0 +1,123 @@ +# Documentation + +This style guide is primarily for use with authoring documentation. + +## General guidelines + - Use sentence case, even in titles (do not punctuate the title, though) + - Use the second person + - Use the active voice + - Use plural nouns and pronouns (they, their, or them), especially when the specific number is uncertain (i.e., "Set up your environments" even though you don't know if the user will have one or many environments) + - When writing documentation titles, use the noun form, not the gerund form (e.g., "Environment Management" instead of "Managing Environments") + - Context matters when you decide whether to capitalize something or not. For example, "A Job creates one or more Pods..." is correct when writing about Kubernetes. However, in other contexts, neither job nor pods would be capitalized. Please follow the conventions set forth by the relevant companies and open source communities. + +## Third-party references + +If you have questions that aren't explicitly covered by this guide, consult the following third-party references: + +{/* | Column 1 | Column 2 | Column 3 | +|----------|----------|----------| +| Row 1 | Cell 2 | Cell 3 | +| Row 2 | Cell 5 | Cell 6 | +| Row 3 | Cell 8 | Cell 9 | */} + + +## Tools +The following are tools that you can use to edit your writing. However, take the suggestions provided with a grain of salt. + +- alex.js +- Grammarly +- Hemingway Editor + +## How to format text + +Below summarizes the text-formatting conventions you should follow. +## Bold + +Use bold formatting when referring to UI elements. + +## Italics + +Use italics for: + + - Parameter names + - Mathematical and version variables + +## Code font + +Use code font for: + + - User text input + - Command-line utility names + - DNS record types + - Environment variable names (e.g., PATH) + - Filenames, filename extensions, and paths + - Folders and directories + - HTTP verbs, status codes, and content-type values + - Placeholder variables + +Use code blocks for code samples and other blocks of code. Be sure to indicate the language your using to apply the proper syntax highlighting. + +This is a codeblock. + +For code that you want users to enter via a command-line interface, use console, not bash. +## Punctuation + +Do not use the ampersand (&) as a shorthand for and unless you're referring to a UI element or the name of something that uses &. + +You can use the symbol ~ in place of the word approximately. + +## UI elements + +When referring to UI elements, including the names for buttons, menus, dialogs, and anything that has a name visible to the user, use bold font. + +**Example:** On the **Environment Overview** page, click **Configure SSH**. + +Don't use code font for UI elements unless it is rendered based on previously entered text. For example, if you tell the user to provide the environment name as myEnvironment, then use both bold and cold font when referring to the name. + +**Example:** Click myEnvironment. + +When writing out instructions that involve UI elements, both of the following options are acceptable: + + - Go to **Manage > Users**. + - In the **Manage** menu, click **Users**. + +## Product-specific references + +Below summarizes the guidelines regarding how Coder terms should be used. +## Capitalized terms + +The only Coder-specific terms that should be capitalized are the names of products (e.g., Coder). + +The exception is code-server, which is always lowercase. If it appears at the beginning of the sentence, rewrite the sentence to avoid this usage. +## Uncapitalized terms + +In general, we do not capitalize the names of features (unless the situation calls for it, such as the word appearing at the beginning of a sentence): + + - account dormancy + - audit logs + - autostart + - command-line interface + - dev URLs + - environment + - image + - metrics + - organizations + - progressive web app + - registries + - single sign-on + - telemetry + - workspace + - workspace providers + - workspaces as code + +We also do not capitalize the names of user roles: + + - auditor + - member + - site admin + - site manager + +## Standardized spellings + + WiFi + diff --git a/src/apps/devdoc/pages/docs/contributing/feature-stages.mdx b/src/apps/devdoc/pages/docs/contributing/feature-stages.mdx new file mode 100644 index 000000000..7e533c685 --- /dev/null +++ b/src/apps/devdoc/pages/docs/contributing/feature-stages.mdx @@ -0,0 +1,17 @@ +# Feature Stages + +Some Coder features are released as Alpha or Experimental. + +## Alpha Feature + +Alpha features are released to the community for testing and feedback. Alpha features are not supported and may contain bugs or other issues. Alpha features may be removed or changed at any time. + +## Experimental Feature + +Experimental features are released to the community for testing and feedback. Experimental features are not supported and may contain bugs or other issues. Experimental features may be removed or changed at any time. + +## Stable Feature + +Stable features are released to the community for testing and feedback. Stable features are supported and may contain bugs or other issues. Stable features may be removed or changed at any time. + +
\ No newline at end of file diff --git a/src/apps/devdoc/pages/docs/contributing/frontend.mdx b/src/apps/devdoc/pages/docs/contributing/frontend.mdx new file mode 100644 index 000000000..ca2ad2de2 --- /dev/null +++ b/src/apps/devdoc/pages/docs/contributing/frontend.mdx @@ -0,0 +1,69 @@ +# Frontend + +This is a guide to help the Kloudlite community and also Kloudlite members contribute to our UI. It is ongoing work but we hope it provides some useful information to get started. If you have any questions or need help, please send us a message on our [**Discord server**](https://github.com/kloudlite). We'll be happy to help you. + +## Running the UI +You can run the UI and access the dashboard in two ways: + +- Build the UI pointing to an external Coder server: CODER_HOST=https://mycoder.com pnpm dev inside of the site folder. This is helpful when you are building something in the UI and already have the data on your deployed server. +- Build the entire Coder server + UI locally: ./scripts/develop.sh in the root folder. It is useful when you have to contribute with features that are not deployed yet or when you have to work on both, frontend and backend. + +In both cases, you can access the dashboard on http://localhost:8080. If you are running the ./scripts/develop.sh you can log in using the default credentials: admin@coder.com and SomeSecurePassword! + +## Tech Stack +All our dependencies are described in site/package.json but here are the most important ones: + + - [**Remix**](https://remix.run) as framework + - [**TypeScript**](https://www.typescriptlang.org/) to keep our sanity + - [**Radix UI**](https://www.radix-ui.com/) for UI components + - [**Graphql**](https://graphql.org/) as fetching lib + - [**Storybook**](https://storybook.js.org/) for visual testing + - PNPM as package manager + +## Structure + All the code related to the UI is inside the `src` folder and we defined a few conventions to help people to navigate through it. + - **src** - source code + - **@types** - Custom types for dependencies that don't have defined types (largely code that has no server-side equivalent) + - **api** - API code as function calls and types + + queries - react-query queries and mutations + + - **components** - UI components + - **hooks** - Hooks that can be used across the application + - **pages** - Page components + - **testHelpers** - Helper functions to help with integration tests + - **util** - Helper functions that can be used across the application + + - **design system** - Static UI assets like images, fonts, icons, etc + +## Routing +We use [Remix](https://remix.run/docs/en/main/file-conventions/routes) for routing. The routes are defined in the `routes.tsx` file. + +## Pages +Pages are the top-level components of the app. The page component lives under the src/apps folder and each page should have its own folder so we can better group the views, tests, utility functions and so on. We use a structure where the page component is responsible for fetching all the data and passing it down to the view. + +## States +A page usually has at least three states: **loading**, **ready/success**, and **error**, so always remember to handle these scenarios while you are coding a page. We use the `useOutletContext` hook to access the state from the parent component. + +## fetching data +We use the `Graphql` api to fetch data. It provides a simple interface to fetch data from the server.It is used to fetch data from the server and update the state of the page. It also provides a way to handle errors and loading states. + +- **useWatch**: + The `useWatch` hook is used to watch for changes in the data and update the state of the page. It is used to watch for changes in the data and update the state of the page. It also provides a way to handle errors and loading states. + +- **useWatchReload**: +The `useWatchReload` hook is used to watch for changes in the data and reload the page. It is used to watch for changes in the data and reload the page. It also provides a way to handle errors and loading states. + +## API +We use the [**Graphql**](https://graphql.org/) as fetching library. It provides a simple interface to fetch data from the server.It is used to fetch data from the server and update the state of the page. It also provides a way to handle errors and loading states. +Our APi functions are defined in the `server/gql/queries` folder. Each function is a query that returns a GraphQL object. The functions are used to fetch data from the server and update the state of the page. It also provides a way to handle errors and loading states. + +## Components +We use the [**Remix UI**](https://www.radix-ui.com/) as UI components. It provides a set of UI components that can be used to build the UI of the application. The components are defined in the `components` folder. Each component is a UI component that can be used to build the UI of the application. The components are used to build the UI of the application. + +- ### Structure +Each component gets its own folder. Make sure you add a test and Storybook stories for the component as well. By keeping these tidy, the codebase will remain easy to navigate, healthy and maintainable for all contributors. + +- ### Accessibility + +
diff --git a/src/apps/devdoc/pages/docs/contributing/security.mdx b/src/apps/devdoc/pages/docs/contributing/security.mdx new file mode 100644 index 000000000..6f59ad1c3 --- /dev/null +++ b/src/apps/devdoc/pages/docs/contributing/security.mdx @@ -0,0 +1,3 @@ +# Security + +If you find a vulnerability, **DO NOT FILE AN ISSUE.** Instead, send an email to [support@kloudlite.io](mailto:support@kloudlite.io). \ No newline at end of file diff --git a/src/apps/devdoc/pages/pricing.mdx b/src/apps/devdoc/pages/pricing.mdx index 525cdd3fb..46cb9828c 100644 --- a/src/apps/devdoc/pages/pricing.mdx +++ b/src/apps/devdoc/pages/pricing.mdx @@ -1,2 +1,3 @@ import Pricing from '~/app/components/page/pricing'; -export default ()=> + +export default () => ; diff --git a/src/apps/devdoc/pages/terms-of-services.mdx b/src/apps/devdoc/pages/terms-of-services.mdx index 3af6d29ba..64b235e6b 100644 --- a/src/apps/devdoc/pages/terms-of-services.mdx +++ b/src/apps/devdoc/pages/terms-of-services.mdx @@ -1,7 +1,11 @@ -import PrivacyContainer from "../app/components/website/privacy-container" +import PrivacyContainer from '../app/components/website/privacy-container'; export const Headings = ({ children }) => { - return

{children}

; + return ( +

+ {children} +

+ ); }; export const SubList = ({ children }) => { @@ -9,14 +13,27 @@ export const SubList = ({ children }) => { }; export const ListRoman = ({ children }) => { - return
    {children.props.children}
; + return ( +
    + {children.props.children} +
+ ); }; export const ListDecimalBold = ({ children }) => { - return
    {children.props.children}
; + return ( +
    + {children.props.children} +
+ ); }; - { Kloudlite Labs Pvt Ltd. operate this website ("Site"). This Site may provide you with access to a variety of web pages, documents, software, services, images, graphics, audio, video, forums, discussion groups, - blogs, and other content ("Content"). - + blogs, and other content ("Content"). + By accessing or logging into the Site, you agree to these terms. Kloudlite may revise these terms at any time. Your continued use of the Site after any such revisions have been published constitutes your agreement to the revised terms. If you do not - agree to these terms, do not use the Site. - + agree to these terms, do not use the Site. + Personal data collected when you access and use the Site will be processed by Kloudlite in accordance with the Kloudlite Privacy Statement. For more information on the types of personal data collected on the Site, how Kloudlite handles your @@ -49,24 +66,24 @@ export const ListDecimalBold = ({ children }) => { 1. **Kloudlite and Third Party Content** -

When using the Site, you may be able to access or download certain Content provided by Kloudlite ("Content"), or Content provided by third parties ("Third Party Content").  Content is governed by the license that accompanies it.  By using or downloading any Content, you agree to the applicable license.  It is your responsibility to ensure you have proper permission for your use of any Content. If you are unclear as to what license applies to any Content, it is recommended that you ask the author. - +
When using the Site, you may be able to access or download certain Content provided by Kloudlite ("Content"), or Content provided by third parties ("Third Party Content").  Content is governed by the license that accompanies it.  By using or downloading any Content, you agree to the applicable license.  It is your responsibility to ensure you have proper permission for your use of any Content. If you are unclear as to what license applies to any Content, it is recommended that you ask the author. + The Site, including the design, layout, look and feel, and Kloudlite Content, is copyrighted by Kloudlite and its licensors.  To the extent the Site, portions of the Site, or Kloudlite Content does not designate a license, Kloudlite hereby grants you a copyright license to copy such material for your own personal or internal business purposes.   - + 2. **Your Content** -

Where applicable, you may be able upload or otherwise provide certain Content, such as software (source code, binary code, configuration files, etc.), documents, images, videos, or other material to the Site via your Account ("Your Content").  Except if specifically stated otherwise, Your Content is not confidential and may be made publicly available. You are responsible for keeping your own backups of Your Content. You represent that you have the right to provide Your Content to Kloudlite and its users. - +
Where applicable, you may be able upload or otherwise provide certain Content, such as software (source code, binary code, configuration files, etc.), documents, images, videos, or other material to the Site via your Account ("Your Content").  Except if specifically stated otherwise, Your Content is not confidential and may be made publicly available. You are responsible for keeping your own backups of Your Content. You represent that you have the right to provide Your Content to Kloudlite and its users. + It's your responsibility to make clear the license under which you are providing Your Content. You retain ownership of Your Content. By posting Your Content to the Site, you hereby grant to Kloudlite a non-exclusive, irrevocable, worldwide, royalty-free license to use, reproduce, distribute, sublicense, adapt, modify, and publish Your Content, provided this license to Kloudlite does not supersede the terms of any open source license you may explicitly apply to Your Content. - + If you close your Account, Your Content may remain accessible on the Site.  - + 3. **Account** -

Where applicable, you may register for an account on the Site (an "Account").  You must provide current, complete, and accurate information as required by the applicable account registration form.  You must be over 16 years old to create an Account on the Site.  Each Account is personal in nature and may only be used by you.  Any activity completed through your Account will be deemed to have been completed by you. Where applicable, you may choose to create an Account by authenticating via an existing account you have with a third party, in which case the third party terms may apply to such action.  - +
Where applicable, you may register for an account on the Site (an "Account").  You must provide current, complete, and accurate information as required by the applicable account registration form.  You must be over 16 years old to create an Account on the Site.  Each Account is personal in nature and may only be used by you.  Any activity completed through your Account will be deemed to have been completed by you. Where applicable, you may choose to create an Account by authenticating via an existing account you have with a third party, in which case the third party terms may apply to such action.  + You are responsible for the security of your Account, and you agree not to share your password or access to the Site with another person. Kloudlite is not liable for any loss or damage arising from your failure to keep your Account secure. You will notify Kloudlite immediately if your Account information is lost, stolen, or otherwise compromised. Kloudlite may suspend or deactivate your Account if Kloudlite determines that this step is needed (such as if your Account has been compromised or you have violated these terms). 4. **Your Use of the Site** -

You will not use the Site in a way that violates any laws or these terms, infringes anyone's rights (including but not limited to intellectual property rights), is offensive, or interferes with the Site or its features. For example, you will not use the Site in a way or provide Content to the Site that:  +
You will not use the Site in a way that violates any laws or these terms, infringes anyone's rights (including but not limited to intellectual property rights), is offensive, or interferes with the Site or its features. For example, you will not use the Site in a way or provide Content to the Site that:  1. infringes, misappropriates, or violates any third party or Kloudlite intellectual property rights; 2. is defamatory, libelous, threatening, harassing, harmful to minors, or pornographic; @@ -87,59 +104,101 @@ export const ListDecimalBold = ({ children }) => { Kloudlite has the right, but not the obligation, to monitor the use of the Site, any Content, and any activity on the Site. 5. **Feedback** -

You may provide ideas, suggestions, proposals, or other feedback to Kloudlite via the Site ("Feedback").

+
You may provide ideas, suggestions, proposals, or other feedback to Kloudlite via the Site ("Feedback").
Kloudlite may use such Feedback for any purpose, including incorporating the Feedback into or using the Feedback to develop and improve Kloudlite products and other Kloudlite offerings without attribution or compensation to you. You grant Kloudlite a perpetual and irrevocable license to use all Feedback for any purpose. You agree to provide Feedback to Kloudlite only in compliance with applicable laws. You represent that you have the authority to provide the Feedback and that Feedback will not include confidential information.  6. **Links and References to services** -

The Site may provide links to third party websites, products or services, which you may access or use at your own risk subject to any applicable third-party terms. Kloudlite is not responsible for and has not endorsed such third-party websites, products, or services.  

- +
The Site may provide links to third party websites, products or services, which you may access or use at your own risk subject to any applicable third-party terms. Kloudlite is not responsible for and has not endorsed such third-party websites, products, or services.  
+ The Site may refer to Kloudlite products or services that might not be available in your location. Please contact your local Kloudlite representative for more information. 7. **Disclaimer of Warranties** -

EXCEPT AS EXPRESSLY AGREED OTHERWISE IN A SIGNED AGREEMENT BETWEEN YOU AND KLOUDLITE:  - +
EXCEPT AS EXPRESSLY AGREED OTHERWISE IN A SIGNED AGREEMENT BETWEEN YOU AND KLOUDLITE:  + THE SITE, ANY CONTENT ON THE SITE, AND ANY SOFTWARE OR SERVICES PROVIDED ON THE SITE ARE PROVIDED "AS IS" AND KLOUDLITE PROVIDES NO WARRANTIES EXPRESS, IMPLIED OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY, NON-INFRINGEMENT OR FITNESS FOR A PARTICULAR PURPOSE. KLOUDLITE MAKES NO WARRANTIES THAT THE SITE WILL BE SECURE OR THAT ACCESS AND USE OF THE SITE WILL BE  ERROR-FREE WITHOUT INTERRUPTIONS, CRASHES, OR DOWNTIME. - + Kloudlite may change or discontinue part or all of the Site or any Content at any time.  8. **Limitation of Liability & Indemnity** -

EXCEPT AS EXPRESSLY PROVIDED OTHERWISE IN A SIGNED AGREEMENT BETWEEN YOU AND KLOUDLITE: - +
EXCEPT AS EXPRESSLY PROVIDED OTHERWISE IN A SIGNED AGREEMENT BETWEEN YOU AND KLOUDLITE: + IN NO EVENT WILL KLOUDLITE BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES WHETHER SUCH DAMAGES ARE ALLEGED AS A RESULT OF TORTIOUS CONDUCT OR BREACH OF CONTRACT OR OTHERWISE, EVEN IF KLOUDLITE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES UNDER OR IN CONNECTION WITH THESE TERMS, INCLUDING BUT NOT LIMITED TO THE SITE, YOUR ACCESS TO OR USE OF (OR YOUR FAILURE TO GAIN ACCESS TO OR USE OF) THE SITE, ANY CONTENT PROVIDED ON THE SITE, OR ANY SERVICES PROVIDED ON THE SITE. - + THIS STATEMENT DOES NOT AFFECT ANY LIABILITY WHICH CANNOT BE EXCLUDED OR LIMITED UNDER APPLICABLE LAW. - + You will defend and indemnify Kloudlite from and against any and all damages, costs, losses and expenses (including reasonable attorney fees) incurred as a result of any claim, suit or proceeding brought against Kloudlite in relation to Your Content or as a result of any use or misuse of the Site by you. 9. **Trademarks** -

The trademarks, logos, trade dress and service marks displayed on the Site are the property of Kloudlite or other third parties.  Your use of any Kloudlite trademark must be in accordance with the applicable Kloudlite Trademark Guidelines and Policies or other applicable trademark guidelines.  +
The trademarks, logos, trade dress and service marks displayed on the Site are the property of Kloudlite or other third parties.  Your use of any Kloudlite trademark must be in accordance with the applicable Kloudlite Trademark Guidelines and Policies or other applicable trademark guidelines.  10. **Waiver, Severability, and Precedence** -

The failure of Kloudlite to exercise or enforce any right or provision of these terms does not constitute a waiver of such right or provision.  If any provision of these terms is held to be unenforceable, that provision will be modified so as to be enforceable, or if such modification is not possible, will be removed and the remaining provisions will remain in full force.

- +
The failure of Kloudlite to exercise or enforce any right or provision of these terms does not constitute a waiver of such right or provision.  If any provision of these terms is held to be unenforceable, that provision will be modified so as to be enforceable, or if such modification is not possible, will be removed and the remaining provisions will remain in full force.
+ Some services or Kloudlite Content offered via the Site may be subject to additional or separate terms. If there is a conflict between these terms and such additional or separate terms, the latter will have precedence with respect to your access and use of that service or Kloudlite Content. Nothing in these terms is intended to limit your rights under an open source license. 11. **Jurisdiction** -

These terms, and any claim, controversy, or dispute arising out of or related to these terms, are governed by and construed in accordance with the laws of the State of Karnataka without giving effect to any conflicts of laws provision.

- +
These terms, and any claim, controversy, or dispute arising out of or related to these terms, are governed by and construed in accordance with the laws of the State of Karnataka without giving effect to any conflicts of laws provision.
+ If one or more of the provisions contained in these terms are held invalid, illegal, or unenforceable in any respect by any court of competent jurisdiction, such holding will not impair the validity, legality, or enforceability of the remaining provisions. 12. **Copyright Notice and Takedown Process** -

Kloudlite and its affiliates respect the intellectual property of others. If you believe that content on the Site infringes your copyright, please provide the following information to the Kloudlite-designated copyright agent listed below: +
Kloudlite and its affiliates respect the intellectual property of others. If you believe that content on the Site infringes your copyright, please provide the following information to the Kloudlite-designated copyright agent listed below: 1. A description of the copyrighted content that you claim has been infringed and description of the infringing activity, including where the content is located, such as an URL. 2. Your name, address, telephone number, and email address. 3. The following statement: "I have a good faith belief that use of the copyrighted materials described above as allegedly infringing is not authorized by the copyright owner, its agent, or the law." 4. The following statement: "I swear, under penalty of perjury, that the information in the notification is accurate and that I am the copyright owner or am authorized to act on behalf of the owner of an exclusive right that is allegedly infringed." 5. Your electronic or physical signature. - + If you believe that content on the Site was removed in error, please provide a counter notification to the Kloudlite-designated copyright agent listed below: 1. A description of the material that Kloudlite has removed or to which Kloudlite has disabled access. 2. Your name, address, telephone number, email address, and a statement that you consent to the jurisdiction of the Federal District Court for the judicial district in which your address is located (or Wake County, North Carolina if your address is outside of the United States), and that you will accept service of process from the person who provided notification of infringement or an agent of such person. 3. The following statement: "I swear, under penalty of perjury, that I have a good faith belief that the material identified above was removed or disabled as a result of a mistake or misidentification of the material to be removed or disabled." - 4. Your electronic or physical signature. + 4. Your electronic or physical signature.
Please send notifications of infringement and counter notifications to the Kloudlite-designated copyright agent at: launch@kloudlite.io - - Kloudlite Labs Pvt Ltd

- 415, 4th floor, Shaft-1, Tower- B

- VRR Fortuna

- Carmelaram, Janatha Colony, Bangalore

- Karnataka,

- India, 560035

- +
For a PDF version of the Terms of Services, please click here.
+ +

+ Cancellation and Refund Policy +

+
Effective Date: july 01, 2024
+

Welcome to Kloudlite Labs Private Limited ("Kloudlite"). This Cancellation and Refund Policy outlines + the terms and conditions under which refunds and cancellations will be provided for services purchased through our website.

+ + + 1. **General Information** +
Kloudlite Labs Private Limited is committed to ensuring your satisfaction with our services. This policy applies to all purchases made through our website. + + 2. **Cancellation Policy** + + **a. Subscription Services:** You may cancel your subscription at any time by logging into your account and following the cancellation procedures. Your subscription will continue until the end of the current billing cycle, and no further charges will be applied after the cancellation. + **b. One-Time Purchases:** One-Time Purchases: For one-time services or products, cancellations are not allowed once the purchase has been completed. + + + 3. **Refund Policy** + + **a. Subscription Services:** Refunds for subscription services are not provided for partial months. If you cancel your subscription, you will not be eligible for a refund for any unused portion of the subscription period. + **b. One-Time Purchases:** Once a one-time purchase is completed, it is non-refundable. + **c. Promotional Offers:** Refunds are not provided for services purchased under promotional offers or discounts. + + + 4. **Exceptions** + + **a. Service Disruptions:** In the event of a significant service disruption caused by Kloudlite, we may provide a refund at our sole discretion. You must notify us within 30 days of the disruption to be eligible for consideration. + **b. Billing Errors:** If there has been a billing error, please contact us immediately. We will investigate and, if a mistake is found, a refund will be issued accordingly. + + + 5. **Process for Requesting Refunds** +
To request a refund, please contact our support team at support@kloudlite.com with your order details, the reason for the request, and any supporting documentation. We will review your request and notify you of the status within 10 business days. + + 6. **Changes to This Policy** +
Kloudlite Labs Private Limited reserves the right to modify or update this policy at any time. Changes will be posted on this page, and the effective date will be updated accordingly. It is your responsibility to review this policy periodically. + + 7. **Contact Information** +
If you have any questions or concerns about this Cancellation and Refund Policy, please contact us at: +
+ Kloudlite Labs Pvt Ltd
+ 415, 4th Floor, Shaft 1, Tower B, VRR Fortuna,
+ Janatha Colony, Carmelaram, Sarjapur Road,
+ Bengaluru, Karnataka, 560035
+ India, 560035
+ support@kloudlite.com + + Thank you for choosing Kloudlite. We value your business and strive to ensure your satisfaction with our services. +
diff --git a/src/apps/devdoc/pnpm-lock.yaml b/src/apps/devdoc/pnpm-lock.yaml index 30473d833..f8bcbaa3a 100644 --- a/src/apps/devdoc/pnpm-lock.yaml +++ b/src/apps/devdoc/pnpm-lock.yaml @@ -135,7 +135,7 @@ devDependencies: version: 6.21.0(eslint@8.57.0)(typescript@5.2.2) autoprefixer: specifier: ^10.4.16 - version: 10.4.19(postcss@8.4.38) + version: 10.4.19(postcss@8.4.39) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -180,7 +180,7 @@ devDependencies: version: 4.6.2(eslint@8.57.0) postcss: specifier: ^8.4.32 - version: 8.4.38 + version: 8.4.39 prettier: specifier: ^2.8.8 version: 2.8.8 @@ -232,7 +232,7 @@ packages: resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} dev: false - /@codemirror/autocomplete@6.16.3(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.2)(@lezer/common@1.2.1): + /@codemirror/autocomplete@6.16.3(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.3)(@lezer/common@1.2.1): resolution: {integrity: sha512-Vl/tIeRVVUCRDuOG48lttBasNQu8usGgXQawBXI7WJAiUDSFOfzflmEsZFZo48mAvAaa4FZ/4/yLLxFtdJaKYA==} peerDependencies: '@codemirror/language': ^6.0.0 @@ -242,7 +242,7 @@ packages: dependencies: '@codemirror/language': 6.10.2 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.28.2 + '@codemirror/view': 6.28.3 '@lezer/common': 1.2.1 dev: false @@ -251,14 +251,14 @@ packages: dependencies: '@codemirror/language': 6.10.2 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.28.2 + '@codemirror/view': 6.28.3 '@lezer/common': 1.2.1 dev: false - /@codemirror/lang-css@6.2.1(@codemirror/view@6.28.2): + /@codemirror/lang-css@6.2.1(@codemirror/view@6.28.3): resolution: {integrity: sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==} dependencies: - '@codemirror/autocomplete': 6.16.3(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.2)(@lezer/common@1.2.1) + '@codemirror/autocomplete': 6.16.3(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.3)(@lezer/common@1.2.1) '@codemirror/language': 6.10.2 '@codemirror/state': 6.4.1 '@lezer/common': 1.2.1 @@ -270,12 +270,12 @@ packages: /@codemirror/lang-html@6.4.9: resolution: {integrity: sha512-aQv37pIMSlueybId/2PVSP6NPnmurFDVmZwzc7jszd2KAF8qd4VBbvNYPXWQq90WIARjsdVkPbw29pszmHws3Q==} dependencies: - '@codemirror/autocomplete': 6.16.3(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.2)(@lezer/common@1.2.1) - '@codemirror/lang-css': 6.2.1(@codemirror/view@6.28.2) + '@codemirror/autocomplete': 6.16.3(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.3)(@lezer/common@1.2.1) + '@codemirror/lang-css': 6.2.1(@codemirror/view@6.28.3) '@codemirror/lang-javascript': 6.2.2 '@codemirror/language': 6.10.2 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.28.2 + '@codemirror/view': 6.28.3 '@lezer/common': 1.2.1 '@lezer/css': 1.1.8 '@lezer/html': 1.3.10 @@ -284,11 +284,11 @@ packages: /@codemirror/lang-javascript@6.2.2: resolution: {integrity: sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg==} dependencies: - '@codemirror/autocomplete': 6.16.3(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.2)(@lezer/common@1.2.1) + '@codemirror/autocomplete': 6.16.3(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.3)(@lezer/common@1.2.1) '@codemirror/language': 6.10.2 '@codemirror/lint': 6.8.1 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.28.2 + '@codemirror/view': 6.28.3 '@lezer/common': 1.2.1 '@lezer/javascript': 1.4.17 dev: false @@ -296,11 +296,11 @@ packages: /@codemirror/lang-markdown@6.2.5: resolution: {integrity: sha512-Hgke565YcO4fd9pe2uLYxnMufHO5rQwRr+AAhFq8ABuhkrjyX8R5p5s+hZUTdV60O0dMRjxKhBLxz8pu/MkUVA==} dependencies: - '@codemirror/autocomplete': 6.16.3(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.2)(@lezer/common@1.2.1) + '@codemirror/autocomplete': 6.16.3(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.3)(@lezer/common@1.2.1) '@codemirror/lang-html': 6.4.9 '@codemirror/language': 6.10.2 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.28.2 + '@codemirror/view': 6.28.3 '@lezer/common': 1.2.1 '@lezer/markdown': 1.3.0 dev: false @@ -309,7 +309,7 @@ packages: resolution: {integrity: sha512-kgbTYTo0Au6dCSc/TFy7fK3fpJmgHDv1sG1KNQKJXVi+xBTEeBPY/M30YXiU6mMXeH+YIDLsbrT4ZwNRdtF+SA==} dependencies: '@codemirror/state': 6.4.1 - '@codemirror/view': 6.28.2 + '@codemirror/view': 6.28.3 '@lezer/common': 1.2.1 '@lezer/highlight': 1.2.0 '@lezer/lr': 1.4.1 @@ -320,7 +320,7 @@ packages: resolution: {integrity: sha512-IZ0Y7S4/bpaunwggW2jYqwLuHj0QtESf5xcROewY6+lDNwZ/NzvR4t+vpYgg9m7V8UXLPYqG+lu3DF470E5Oxg==} dependencies: '@codemirror/state': 6.4.1 - '@codemirror/view': 6.28.2 + '@codemirror/view': 6.28.3 crelt: 1.0.6 dev: false @@ -329,7 +329,7 @@ packages: dependencies: '@codemirror/language': 6.10.2 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.28.2 + '@codemirror/view': 6.28.3 '@lezer/highlight': 1.2.0 style-mod: 4.1.2 dev: false @@ -338,7 +338,7 @@ packages: resolution: {integrity: sha512-rpMgcsh7o0GuCDUXKPvww+muLA1pDJaFrpq/CCHtpQJYz8xopu4D1hPcKRoDD0YlF8gZaqTNIRa4VRBWyhyy7Q==} dependencies: '@codemirror/state': 6.4.1 - '@codemirror/view': 6.28.2 + '@codemirror/view': 6.28.3 crelt: 1.0.6 dev: false @@ -346,8 +346,8 @@ packages: resolution: {integrity: sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==} dev: false - /@codemirror/view@6.28.2: - resolution: {integrity: sha512-A3DmyVfjgPsGIjiJqM/zvODUAPQdQl3ci0ghehYNnbt5x+o76xq+dL5+mMBuysDXnI3kapgOkoeJ0sbtL/3qPw==} + /@codemirror/view@6.28.3: + resolution: {integrity: sha512-QVqP+ko078/h9yrW+u5grX3rQhC+BkGKADRrlDaJznfPngJOv5zObiVf0+SgAWhL/Yt0nvZ+10rO3L+gU5IbFw==} dependencies: '@codemirror/state': 6.4.1 style-mod: 4.1.2 @@ -377,14 +377,14 @@ packages: react: ^16.8.0 || ^17 || ^18 react-dom: ^16.8.0 || ^17 || ^18 dependencies: - '@codemirror/autocomplete': 6.16.3(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.2)(@lezer/common@1.2.1) + '@codemirror/autocomplete': 6.16.3(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.3)(@lezer/common@1.2.1) '@codemirror/commands': 6.6.0 - '@codemirror/lang-css': 6.2.1(@codemirror/view@6.28.2) + '@codemirror/lang-css': 6.2.1(@codemirror/view@6.28.3) '@codemirror/lang-html': 6.4.9 '@codemirror/lang-javascript': 6.2.2 '@codemirror/language': 6.10.2 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.28.2 + '@codemirror/view': 6.28.3 '@codesandbox/sandpack-client': 2.14.4 '@lezer/highlight': 1.2.0 '@react-hook/intersection-observer': 3.1.1(react@18.3.1) @@ -426,8 +426,8 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/regexpp@4.10.1: - resolution: {integrity: sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==} + /@eslint-community/regexpp@4.11.0: + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true @@ -917,17 +917,17 @@ packages: resolution: {integrity: sha512-zuWxyfXNbsKbm96HhXzainONPFqRcoZblQ++e9cAIGUuHfl2cFSBzW01jtesqWG/lqaUyX3H8O1y9oWboGNQBA==} dev: false - /@floating-ui/core@1.6.3: - resolution: {integrity: sha512-1ZpCvYf788/ZXOhRQGFxnYQOVgeU+pi0i+d0Ow34La7qjIXETi6RNswGVKkA6KcDO8/+Ysu2E/CeUmmeEBDvTg==} + /@floating-ui/core@1.6.4: + resolution: {integrity: sha512-a4IowK4QkXl4SCWTGUR0INAfEOX3wtsYw3rKK5InQEHMGObkR8Xk44qYQD9P4r6HHw0iIfK6GUKECmY8sTkqRA==} dependencies: - '@floating-ui/utils': 0.2.3 + '@floating-ui/utils': 0.2.4 dev: false - /@floating-ui/dom@1.6.6: - resolution: {integrity: sha512-qiTYajAnh3P+38kECeffMSQgbvXty2VB6rS+42iWR4FPIlZjLK84E9qtLnMTLIpPz2znD/TaFqaiavMUrS+Hcw==} + /@floating-ui/dom@1.6.7: + resolution: {integrity: sha512-wmVfPG5o2xnKDU4jx/m4w5qva9FWHcnZ8BvzEe90D/RpwsJaTAVYPEPdQ8sbr/N8zZTAHlZUTQdqg8ZUbzHmng==} dependencies: - '@floating-ui/core': 1.6.3 - '@floating-ui/utils': 0.2.3 + '@floating-ui/core': 1.6.4 + '@floating-ui/utils': 0.2.4 dev: false /@floating-ui/react-dom@2.1.1(react-dom@18.3.1)(react@18.3.1): @@ -936,13 +936,13 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@floating-ui/dom': 1.6.6 + '@floating-ui/dom': 1.6.7 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) dev: false - /@floating-ui/utils@0.2.3: - resolution: {integrity: sha512-XGndio0l5/Gvd6CLIABvsav9HHezgDFFhDfHk1bvLfr9ni8dojqLSvBbotJEjmIwNHL7vK4QzBJTdBRoB+c1ww==} + /@floating-ui/utils@0.2.4: + resolution: {integrity: sha512-dWO2pw8hhi+WrXq1YJy2yCuWoL20PddgGaqTgVe4cOS9Q6qklXCiA1tJEqX6BEwRNSCP84/afac9hd4MS+zEUA==} dev: false /@grpc/grpc-js@1.9.15: @@ -971,7 +971,7 @@ packages: react: ^16 || ^17 || ^18 react-dom: ^16 || ^17 || ^18 dependencies: - '@tanstack/react-virtual': 3.7.0(react-dom@18.3.1)(react@18.3.1) + '@tanstack/react-virtual': 3.8.1(react-dom@18.3.1)(react@18.3.1) client-only: 0.0.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -1335,7 +1335,7 @@ packages: '@codemirror/lang-markdown': 6.2.5 '@codemirror/merge': 6.6.3 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.28.2 + '@codemirror/view': 6.28.3 '@codesandbox/sandpack-react': 2.14.4(@lezer/common@1.2.1)(react-dom@18.3.1)(react@18.3.1) '@lexical/clipboard': 0.14.5 '@lexical/link': 0.14.5 @@ -1354,9 +1354,9 @@ packages: '@radix-ui/react-select': 2.1.1(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-toggle-group': 1.1.0(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-toolbar': 1.1.0(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-tooltip': 1.1.1(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-tooltip': 1.1.2(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) classnames: 2.5.1 - cm6-theme-basic-light: 0.2.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.2)(@lezer/highlight@1.2.0) + cm6-theme-basic-light: 0.2.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.3)(@lezer/highlight@1.2.0) codemirror: 6.0.1(@lezer/common@1.2.1) downshift: 7.6.2(react@18.3.1) js-yaml: 4.1.0 @@ -1649,7 +1649,7 @@ packages: dependencies: '@npmcli/name-from-folder': 2.0.0 glob: 10.4.2 - minimatch: 9.0.4 + minimatch: 9.0.5 read-package-json-fast: 3.0.2 dev: true @@ -2299,8 +2299,8 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-tooltip@1.1.1(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-LLE8nzNE4MzPMw3O2zlVlkLFid3y9hMUs7uCbSHyKSo+tCN4yMCf+ZCCcfrYgsOC0TiHBPQ1mtpJ2liY3ZT3SQ==} + /@radix-ui/react-tooltip@1.1.2(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-9XRsLwe6Yb9B/tlnYCPVUd/TFS4J7HuOZW345DCeC6vKIxQGMZdx21RK4VoZauPD5frgkXTYVS5y90L+3YBn4w==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -2498,19 +2498,19 @@ packages: tslib: 2.6.3 dev: false - /@tanstack/react-virtual@3.7.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-3RtOwEU1HKS4iFBoTcCrV3Szqt4KoERMhZr8v57dvnh5o70sR9GAdF+0aE/qhiOmePrKujGwAayFNJSr/8Dbqw==} + /@tanstack/react-virtual@3.8.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-dP5a7giEM4BQWLJ7K07ToZv8rF51mzbrBMkf0scg1QNYuFx3utnPUBPUHdzaowZhIez1K2XS78amuzD+YGRA5Q==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@tanstack/virtual-core': 3.7.0 + '@tanstack/virtual-core': 3.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) dev: false - /@tanstack/virtual-core@3.7.0: - resolution: {integrity: sha512-p0CWuqn+n8iZmsL7/l0Xg7kbyIKnHNqkEJkMDOkg4x3Ni3LohszmnJY8FPhTgG7Ad9ZFGcdKmn1R1mKUGEh9Xg==} + /@tanstack/virtual-core@3.8.1: + resolution: {integrity: sha512-uNtAwenT276M9QYCjTBoHZ8X3MUeCRoGK59zPi92hMIxdfS9AyHjkDWJ94WroDxnv48UE+hIeo21BU84jKc8aQ==} dev: false /@theguild/remark-mermaid@0.0.5(react@18.3.1): @@ -2675,7 +2675,7 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.10.1 + '@eslint-community/regexpp': 4.11.0 '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.2.2) @@ -3021,7 +3021,7 @@ packages: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: false - /autoprefixer@10.4.19(postcss@8.4.38): + /autoprefixer@10.4.19(postcss@8.4.39): resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} engines: {node: ^10 || ^12 || >=14} hasBin: true @@ -3029,11 +3029,11 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.23.1 - caniuse-lite: 1.0.30001636 + caniuse-lite: 1.0.30001639 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.1 - postcss: 8.4.38 + postcss: 8.4.39 postcss-value-parser: 4.2.0 dev: true @@ -3106,8 +3106,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001636 - electron-to-chromium: 1.4.811 + caniuse-lite: 1.0.30001639 + electron-to-chromium: 1.4.815 node-releases: 2.0.14 update-browserslist-db: 1.0.16(browserslist@4.23.1) dev: true @@ -3151,8 +3151,8 @@ packages: engines: {node: '>= 6'} dev: true - /caniuse-lite@1.0.30001636: - resolution: {integrity: sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==} + /caniuse-lite@1.0.30001639: + resolution: {integrity: sha512-eFHflNTBIlFwP2AIKaYuBQN/apnUoKNhBdza8ZnW/h2di4LCZ4xFqYlxUxo+LQ76KFI1PGcC1QDxMbxTZpSCAg==} /ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -3261,7 +3261,7 @@ packages: engines: {node: '>=6'} dev: false - /cm6-theme-basic-light@0.2.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.2)(@lezer/highlight@1.2.0): + /cm6-theme-basic-light@0.2.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.3)(@lezer/highlight@1.2.0): resolution: {integrity: sha512-1prg2gv44sYfpHscP26uLT/ePrh0mlmVwMSoSd3zYKQ92Ab3jPRLzyCnpyOCQLJbK+YdNs4HvMRqMNYdy4pMhA==} peerDependencies: '@codemirror/language': ^6.0.0 @@ -3271,20 +3271,20 @@ packages: dependencies: '@codemirror/language': 6.10.2 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.28.2 + '@codemirror/view': 6.28.3 '@lezer/highlight': 1.2.0 dev: false /codemirror@6.0.1(@lezer/common@1.2.1): resolution: {integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==} dependencies: - '@codemirror/autocomplete': 6.16.3(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.2)(@lezer/common@1.2.1) + '@codemirror/autocomplete': 6.16.3(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.3)(@lezer/common@1.2.1) '@codemirror/commands': 6.6.0 '@codemirror/language': 6.10.2 '@codemirror/lint': 6.8.1 '@codemirror/search': 6.5.6 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.28.2 + '@codemirror/view': 6.28.3 transitivePeerDependencies: - '@lezer/common' dev: false @@ -3410,17 +3410,17 @@ packages: /csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - /cytoscape-cose-bilkent@4.1.0(cytoscape@3.29.2): + /cytoscape-cose-bilkent@4.1.0(cytoscape@3.30.0): resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} peerDependencies: cytoscape: ^3.2.0 dependencies: cose-base: 1.0.3 - cytoscape: 3.29.2 + cytoscape: 3.30.0 dev: false - /cytoscape@3.29.2: - resolution: {integrity: sha512-2G1ycU28Nh7OHT9rkXRLpCDP30MKH1dXJORZuBhtEhEW7pKwgPi77ImqlCWinouyE1PNepIOGZBOrE84DG7LyQ==} + /cytoscape@3.30.0: + resolution: {integrity: sha512-l590mjTHT6/Cbxp13dGPC2Y7VXdgc+rUeF8AnF/JPzhjNevbDJfObnJgaSjlldOgBQZbue+X6IUZ7r5GAgvauQ==} engines: {node: '>=0.10'} dev: false @@ -3901,8 +3901,8 @@ packages: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /electron-to-chromium@1.4.811: - resolution: {integrity: sha512-CDyzcJ5XW78SHzsIOdn27z8J4ist8eaFLhdto2hSMSJQgsiwvbv2fbizcKUICryw1Wii1TI/FEkvzvJsR3awrA==} + /electron-to-chromium@1.4.815: + resolution: {integrity: sha512-OvpTT2ItpOXJL7IGcYakRjHCt8L5GrrN/wHCQsRB4PQa1X9fe+X9oen245mIId7s14xvArCGSTIq644yPUKKLg==} dev: true /elkjs@0.9.3: @@ -4457,7 +4457,7 @@ packages: hasBin: true dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.10.1 + '@eslint-community/regexpp': 4.11.0 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.0 '@humanwhocodes/config-array': 0.11.14 @@ -4940,7 +4940,7 @@ packages: dependencies: foreground-child: 3.2.1 jackspeak: 2.3.6 - minimatch: 9.0.4 + minimatch: 9.0.5 minipass: 7.1.2 path-scurry: 1.11.1 dev: true @@ -4952,7 +4952,7 @@ packages: dependencies: foreground-child: 3.2.1 jackspeak: 3.4.0 - minimatch: 9.0.4 + minimatch: 9.0.5 minipass: 7.1.2 package-json-from-dist: 1.0.0 path-scurry: 1.11.1 @@ -5814,8 +5814,8 @@ packages: dependencies: js-tokens: 4.0.0 - /lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} + /lru-cache@10.3.0: + resolution: {integrity: sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==} engines: {node: 14 || >=16.14} dev: true @@ -6228,8 +6228,8 @@ packages: '@braintree/sanitize-url': 6.0.4 '@types/d3-scale': 4.0.8 '@types/d3-scale-chromatic': 3.0.3 - cytoscape: 3.29.2 - cytoscape-cose-bilkent: 4.1.0(cytoscape@3.29.2) + cytoscape: 3.30.0 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.30.0) d3: 7.9.0 d3-sankey: 0.12.3 dagre-d3-es: 7.0.10 @@ -6912,8 +6912,8 @@ packages: brace-expansion: 2.0.1 dev: true - /minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + /minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 @@ -7022,7 +7022,7 @@ packages: '@next/env': 14.2.4 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001636 + caniuse-lite: 1.0.30001639 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 @@ -7372,7 +7372,7 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} dependencies: - lru-cache: 10.2.2 + lru-cache: 10.3.0 minipass: 7.1.2 dev: true @@ -7412,29 +7412,29 @@ packages: engines: {node: '>= 0.4'} dev: true - /postcss-import@15.1.0(postcss@8.4.38): + /postcss-import@15.1.0(postcss@8.4.39): resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.38 + postcss: 8.4.39 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 dev: true - /postcss-js@4.0.1(postcss@8.4.38): + /postcss-js@4.0.1(postcss@8.4.39): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} peerDependencies: postcss: ^8.4.21 dependencies: camelcase-css: 2.0.1 - postcss: 8.4.38 + postcss: 8.4.39 dev: true - /postcss-load-config@4.0.2(postcss@8.4.38): + /postcss-load-config@4.0.2(postcss@8.4.39): resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} engines: {node: '>= 14'} peerDependencies: @@ -7447,17 +7447,17 @@ packages: optional: true dependencies: lilconfig: 3.1.2 - postcss: 8.4.38 + postcss: 8.4.39 yaml: 2.4.5 dev: true - /postcss-nested@6.0.1(postcss@8.4.38): + /postcss-nested@6.0.1(postcss@8.4.39): resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 dependencies: - postcss: 8.4.38 + postcss: 8.4.39 postcss-selector-parser: 6.1.0 dev: true @@ -7482,8 +7482,8 @@ packages: source-map-js: 1.2.0 dev: false - /postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + /postcss@8.4.39: + resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 @@ -8391,11 +8391,11 @@ packages: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.0.1 - postcss: 8.4.38 - postcss-import: 15.1.0(postcss@8.4.38) - postcss-js: 4.0.1(postcss@8.4.38) - postcss-load-config: 4.0.2(postcss@8.4.38) - postcss-nested: 6.0.1(postcss@8.4.38) + postcss: 8.4.39 + postcss-import: 15.1.0(postcss@8.4.39) + postcss-js: 4.0.1(postcss@8.4.39) + postcss-load-config: 4.0.2(postcss@8.4.39) + postcss-nested: 6.0.1(postcss@8.4.39) postcss-selector-parser: 6.1.0 resolve: 1.22.8 sucrase: 3.35.0 @@ -9093,7 +9093,7 @@ packages: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} file:../../design-system/out/kl-design-system-1.0.1.tgz(framer-motion@10.18.0)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-NZYWT6vLTjYEBb/GR87yM8f5GX7cIc/NPsG8OXqHNZQynLqfxSvTlP1TyEYZP3NMzjhgJ80+u3PwSLUm8sSbNw==, tarball: file:../../design-system/out/kl-design-system-1.0.1.tgz} + resolution: {integrity: sha512-zo9jFLEi0i/8+X/HluCS4DMOVZ9Xl8ESI0/EnWMQjIa2x0ijT3F8kv7QOluGXdcVffIby7ffxeXMn1G8hg1kLg==, tarball: file:../../design-system/out/kl-design-system-1.0.1.tgz} id: file:../../design-system/out/kl-design-system-1.0.1.tgz name: kl-design-system version: 1.0.1 diff --git a/src/apps/devdoc/public/attach-cluster-1.png b/src/apps/devdoc/public/attach-cluster-1.png index 93e1282d2..4f78bbe90 100644 Binary files a/src/apps/devdoc/public/attach-cluster-1.png and b/src/apps/devdoc/public/attach-cluster-1.png differ diff --git a/src/apps/devdoc/public/attach-cluster-2.png b/src/apps/devdoc/public/attach-cluster-2.png index 4b5bf8727..74a651f41 100644 Binary files a/src/apps/devdoc/public/attach-cluster-2.png and b/src/apps/devdoc/public/attach-cluster-2.png differ diff --git a/src/apps/devdoc/public/create-environment.png b/src/apps/devdoc/public/create-environment.png index 6b86e7370..3ebae4cc2 100644 Binary files a/src/apps/devdoc/public/create-environment.png and b/src/apps/devdoc/public/create-environment.png differ diff --git a/src/apps/iot-console/routes/_main+/$account+/$project+/deviceblueprint+/$deviceblueprint+/new-app/app-dialogs.tsx b/src/apps/iot-console/routes/_main+/$account+/$project+/deviceblueprint+/$deviceblueprint+/new-app/app-dialogs.tsx index 624ddd6d5..6348b5bc4 100644 --- a/src/apps/iot-console/routes/_main+/$account+/$project+/deviceblueprint+/$deviceblueprint+/new-app/app-dialogs.tsx +++ b/src/apps/iot-console/routes/_main+/$account+/$project+/deviceblueprint+/$deviceblueprint+/new-app/app-dialogs.tsx @@ -79,7 +79,6 @@ const AppDialog = ({ if (show?.type === 'config') { const { data, errors } = await api.listConfigs({ - envName: environment, }); if (errors) { @@ -88,7 +87,6 @@ const AppDialog = ({ setConfigs(parseNodes(data)); } else { const { data, errors } = await api.listSecrets({ - envName: environment, }); if (errors) { diff --git a/src/generated/gql/sdl.graphql b/src/generated/gql/sdl.graphql index b5fcd3711..26535719c 100644 --- a/src/generated/gql/sdl.graphql +++ b/src/generated/gql/sdl.graphql @@ -744,11 +744,43 @@ type Github__com___kloudlite___api___apps___comms___types__NotifyContent { title: String! } +type Github__com___kloudlite___api___apps___console___internal___entities__ManagedResourceRef { + id: String! + name: String! + namespace: String! +} + +input Github__com___kloudlite___api___apps___console___internal___entities__ManagedResourceRefIn { + id: String! + name: String! + namespace: String! +} + enum Github__com___kloudlite___api___apps___console___internal___entities__PullSecretFormat { dockerConfigJson params } +enum Github__com___kloudlite___api___apps___console___internal___entities__ResourceType { + app + config + environment + external_app + image_pull_secret + imported_managed_resource + managed_resource + router + secret + vpn_device +} + +type Github__com___kloudlite___api___apps___console___internal___entities__SecretCreatedFor { + name: String! + namespace: String! + refId: String! + resourceType: Github__com___kloudlite___api___apps___console___internal___entities__ResourceType! +} + enum Github__com___kloudlite___api___apps___container____registry___internal___domain___entities__BuildStatus { error failed @@ -1010,6 +1042,15 @@ type Github__com___kloudlite___api___pkg___types__SyncStatus { syncScheduledAt: Date } +input Github__com___kloudlite___api___pkg___types__SyncStatusIn { + action: Github__com___kloudlite___api___pkg___types__SyncAction! + error: String + lastSyncedAt: Date + recordVersion: Int! + state: Github__com___kloudlite___api___pkg___types__SyncState! + syncScheduledAt: Date +} + enum Github__com___kloudlite___operator___apis___clusters___v1__AwsAuthMechanism { assume_role secret_keys @@ -1699,14 +1740,14 @@ type Github__com___kloudlite___operator___apis___crds___v1__MresResourceTemplate apiVersion: String! kind: String! msvcRef: Github__com___kloudlite___operator___apis___common____types__MsvcRef! - spec: Map! + spec: Map } input Github__com___kloudlite___operator___apis___crds___v1__MresResourceTemplateIn { apiVersion: String! kind: String! msvcRef: Github__com___kloudlite___operator___apis___common____types__MsvcRefIn! - spec: Map! + spec: Map } type Github__com___kloudlite___operator___apis___crds___v1__Probe { @@ -2240,6 +2281,44 @@ type ImagePullSecretPaginatedRecords { totalCount: Int! } +type ImportedManagedResource { + accountName: String! + createdBy: Github__com___kloudlite___api___common__CreatedOrUpdatedBy! + creationTime: Date! + displayName: String! + environmentName: String! + id: ID! + lastUpdatedBy: Github__com___kloudlite___api___common__CreatedOrUpdatedBy! + managedResource: ManagedResource + managedResourceRef: Github__com___kloudlite___api___apps___console___internal___entities__ManagedResourceRef! + markedForDeletion: Boolean + name: String! + recordVersion: Int! + secretRef: Github__com___kloudlite___operator___apis___common____types__SecretRef! + syncStatus: Github__com___kloudlite___api___pkg___types__SyncStatus! + updateTime: Date! +} + +type ImportedManagedResourceEdge { + cursor: String! + node: ImportedManagedResource! +} + +input ImportedManagedResourceIn { + displayName: String! + environmentName: String! + managedResourceRef: Github__com___kloudlite___api___apps___console___internal___entities__ManagedResourceRefIn! + name: String! + secretRef: Github__com___kloudlite___operator___apis___common____types__SecretRefIn! + syncStatus: Github__com___kloudlite___api___pkg___types__SyncStatusIn! +} + +type ImportedManagedResourcePaginatedRecords { + edges: [ImportedManagedResourceEdge!]! + pageInfo: PageInfo! + totalCount: Int! +} + type Invitation { accepted: Boolean accountName: String! @@ -3579,12 +3658,12 @@ type Mutation { core_deleteEnvironment(envName: String!): Boolean! core_deleteExternalApp(envName: String!, externalAppName: String!): Boolean! core_deleteImagePullSecret(name: String!): Boolean! - core_deleteImportedManagedResource(envName: String!, mresName: String!): Boolean! + core_deleteImportedManagedResource(envName: String!, importName: String!): Boolean! core_deleteManagedResource(mresName: String!, msvcName: String!): Boolean! core_deleteRouter(envName: String!, routerName: String!): Boolean! core_deleteSecret(envName: String!, secretName: String!): Boolean! core_deleteVPNDevice(deviceName: String!): Boolean! - core_importManagedResource(envName: String!, mresName: String!, msvcName: String!): ManagedResource + core_importManagedResource(envName: String!, importName: String!, mresName: String!, msvcName: String!): ImportedManagedResource core_interceptApp(appname: String!, deviceName: String!, envName: String!, intercept: Boolean!, portMappings: [Github__com___kloudlite___operator___apis___crds___v1__AppInterceptPortMappingsIn!]): Boolean! core_interceptExternalApp(deviceName: String!, envName: String!, externalAppName: String!, intercept: Boolean!, portMappings: [Github__com___kloudlite___operator___apis___crds___v1__AppInterceptPortMappingsIn!]): Boolean! core_updateApp(app: AppIn!, envName: String!): App @@ -3955,6 +4034,7 @@ type Query { core_listEnvironments(pq: CursorPaginationIn, search: SearchEnvironments): EnvironmentPaginatedRecords core_listExternalApps(envName: String!, pq: CursorPaginationIn, search: SearchExternalApps): ExternalAppPaginatedRecords core_listImagePullSecrets(pq: CursorPaginationIn, search: SearchImagePullSecrets): ImagePullSecretPaginatedRecords + core_listImportedManagedResources(envName: String!, pq: CursorPaginationIn, search: SearchImportedManagedResources): ImportedManagedResourcePaginatedRecords core_listManagedResources(pq: CursorPaginationIn, search: SearchManagedResources): ManagedResourcePaginatedRecords core_listRouters(envName: String!, pq: CursorPaginationIn, search: SearchRouters): RouterPaginatedRecords core_listSecrets(envName: String!, pq: CursorPaginationIn, search: SearchSecrets): SecretPaginatedRecords @@ -4015,7 +4095,7 @@ type Query { infra_listPVCs(clusterName: String!, pq: CursorPaginationIn, search: SearchPersistentVolumeClaims): PersistentVolumeClaimPaginatedRecords infra_listPVs(clusterName: String!, pq: CursorPaginationIn, search: SearchPersistentVolumes): PersistentVolumePaginatedRecords infra_listVolumeAttachments(clusterName: String!, pq: CursorPaginationIn, search: SearchVolumeAttachments): VolumeAttachmentPaginatedRecords - infrat_getBYOKClusterSetupInstructions(name: String!): [BYOKSetupInstruction!] + infrat_getBYOKClusterSetupInstructions(name: String!, onlyHelmValues: Boolean): [BYOKSetupInstruction!] iot_getApp(deviceBlueprintName: String!, name: String!, projectName: String!): IOTApp iot_getDeployment(name: String!, projectName: String!): IOTDeployment iot_getDevice(deploymentName: String!, name: String!, projectName: String!): IOTDevice @@ -4185,6 +4265,12 @@ input SearchImagePullSecrets { text: MatchFilterIn } +input SearchImportedManagedResources { + isReady: MatchFilterIn + markedForDeletion: MatchFilterIn + text: MatchFilterIn +} + input SearchIOTApps { isReady: MatchFilterIn markedForDeletion: MatchFilterIn @@ -4285,6 +4371,7 @@ type Secret { data: Map displayName: String! environmentName: String! + for: Github__com___kloudlite___api___apps___console___internal___entities__SecretCreatedFor id: ID! immutable: Boolean isReadyOnly: Boolean! diff --git a/src/generated/gql/server.ts b/src/generated/gql/server.ts index 055aae616..772a6fc0d 100644 --- a/src/generated/gql/server.ts +++ b/src/generated/gql/server.ts @@ -130,6 +130,19 @@ export type K8s__Io___Api___Core___V1__SecretType = | 'kubernetes__io___tls' | 'Opaque'; +export type Github__Com___Kloudlite___Api___Apps___Console___Internal___Entities__ResourceType = + + | 'app' + | 'config' + | 'environment' + | 'external_app' + | 'image_pull_secret' + | 'imported_managed_resource' + | 'managed_resource' + | 'router' + | 'secret' + | 'vpn_device'; + export type SecretKeyRefIn = { key: Scalars['String']['input']; secretName: Scalars['String']['input']; @@ -179,6 +192,12 @@ export type SearchImagePullSecrets = { text?: InputMaybe; }; +export type SearchImportedManagedResources = { + isReady?: InputMaybe; + markedForDeletion?: InputMaybe; + text?: InputMaybe; +}; + export type SearchManagedResources = { envName?: InputMaybe; isReady?: InputMaybe; @@ -791,7 +810,7 @@ export type Github__Com___Kloudlite___Operator___Apis___Crds___V1__MresResourceT apiVersion: Scalars['String']['input']; kind: Scalars['String']['input']; msvcRef: Github__Com___Kloudlite___Operator___Apis___Common____Types__MsvcRefIn; - spec: Scalars['Map']['input']; + spec?: InputMaybe; }; export type Github__Com___Kloudlite___Operator___Apis___Common____Types__MsvcRefIn = @@ -1331,6 +1350,13 @@ export type ConfigKeyValueRefIn = { value: Scalars['String']['input']; }; +export type Github__Com___Kloudlite___Api___Apps___Console___Internal___Entities__ManagedResourceRefIn = + { + id: Scalars['String']['input']; + name: Scalars['String']['input']; + namespace: Scalars['String']['input']; + }; + export type Github__Com___Kloudlite___Api___Apps___Container____Registry___Internal___Domain___Entities__GithubUserAccountIn = { avatarUrl?: InputMaybe; @@ -1340,6 +1366,15 @@ export type Github__Com___Kloudlite___Api___Apps___Container____Registry___Inter type?: InputMaybe; }; +export type Github__Com___Kloudlite___Api___Pkg___Types__SyncStatusIn = { + action: Github__Com___Kloudlite___Api___Pkg___Types__SyncAction; + error?: InputMaybe; + lastSyncedAt?: InputMaybe; + recordVersion: Scalars['Int']['input']; + state: Github__Com___Kloudlite___Api___Pkg___Types__SyncState; + syncScheduledAt?: InputMaybe; +}; + export type Github__Com___Kloudlite___Operator___Apis___Clusters___V1__NodePropsIn = { lastRecreatedAt?: InputMaybe; @@ -1367,6 +1402,15 @@ export type Github__Com___Kloudlite___Operator___Pkg___Operator__CheckIn = { status: Scalars['Boolean']['input']; }; +export type ImportedManagedResourceIn = { + displayName: Scalars['String']['input']; + environmentName: Scalars['String']['input']; + managedResourceRef: Github__Com___Kloudlite___Api___Apps___Console___Internal___Entities__ManagedResourceRefIn; + name: Scalars['String']['input']; + secretRef: Github__Com___Kloudlite___Operator___Apis___Common____Types__SecretRefIn; + syncStatus: Github__Com___Kloudlite___Api___Pkg___Types__SyncStatusIn; +}; + export type IotEnvironmentIn = { displayName: Scalars['String']['input']; name: Scalars['String']['input']; @@ -4942,12 +4986,13 @@ export type ConsoleUpdateByokClusterMutation = { export type ConsoleGetByokClusterInstructionsQueryVariables = Exact<{ name: Scalars['String']['input']; + onlyHelmValues?: InputMaybe; }>; export type ConsoleGetByokClusterInstructionsQuery = { infrat_getBYOKClusterSetupInstructions?: Array<{ - title: string; command: string; + title: string; }>; }; @@ -5179,7 +5224,6 @@ export type ConsoleGetManagedResourceQuery = { resourceTemplate: { apiVersion: string; kind: string; - spec: any; msvcRef: { apiVersion?: string; clusterName?: string; @@ -5289,7 +5333,6 @@ export type ConsoleListManagedResourcesQuery = { resourceTemplate: { apiVersion: string; kind: string; - spec: any; msvcRef: { apiVersion?: string; clusterName?: string; @@ -5356,25 +5399,6 @@ export type ConsoleDeleteManagedResourceMutation = { core_deleteManagedResource: boolean; }; -export type ConsoleImportManagedResourceMutationVariables = Exact<{ - envName: Scalars['String']['input']; - msvcName: Scalars['String']['input']; - mresName: Scalars['String']['input']; -}>; - -export type ConsoleImportManagedResourceMutation = { - core_importManagedResource?: { id: string }; -}; - -export type ConsoleDeleteImportedManagedResourceMutationVariables = Exact<{ - envName: Scalars['String']['input']; - mresName: Scalars['String']['input']; -}>; - -export type ConsoleDeleteImportedManagedResourceMutation = { - core_deleteImportedManagedResource: boolean; -}; - export type ConsoleGetHelmChartQueryVariables = Exact<{ clusterName: Scalars['String']['input']; name: Scalars['String']['input']; @@ -6006,6 +6030,139 @@ export type ConsoleListNotificationsQuery = { }; }; +export type ConsoleImportManagedResourceMutationVariables = Exact<{ + envName: Scalars['String']['input']; + mresName: Scalars['String']['input']; + msvcName: Scalars['String']['input']; + importName: Scalars['String']['input']; +}>; + +export type ConsoleImportManagedResourceMutation = { + core_importManagedResource?: { id: string }; +}; + +export type ConsoleDeleteImportedManagedResourceMutationVariables = Exact<{ + envName: Scalars['String']['input']; + importName: Scalars['String']['input']; +}>; + +export type ConsoleDeleteImportedManagedResourceMutation = { + core_deleteImportedManagedResource: boolean; +}; + +export type ConsoleListImportedManagedResourcesQueryVariables = Exact<{ + envName: Scalars['String']['input']; + search?: InputMaybe; + pq?: InputMaybe; +}>; + +export type ConsoleListImportedManagedResourcesQuery = { + core_listImportedManagedResources?: { + totalCount: number; + edges: Array<{ + cursor: string; + node: { + accountName: string; + creationTime: any; + displayName: string; + environmentName: string; + id: string; + markedForDeletion?: boolean; + name: string; + recordVersion: number; + updateTime: any; + createdBy: { userEmail: string; userId: string; userName: string }; + lastUpdatedBy: { userEmail: string; userId: string; userName: string }; + managedResourceRef: { id: string; name: string; namespace: string }; + secretRef: { name: string; namespace?: string }; + syncStatus: { + action: Github__Com___Kloudlite___Api___Pkg___Types__SyncAction; + error?: string; + lastSyncedAt?: any; + recordVersion: number; + state: Github__Com___Kloudlite___Api___Pkg___Types__SyncState; + syncScheduledAt?: any; + }; + managedResource?: { + accountName: string; + apiVersion?: string; + clusterName: string; + creationTime: any; + displayName: string; + enabled?: boolean; + environmentName: string; + id: string; + isImported: boolean; + kind?: string; + managedServiceName: string; + markedForDeletion?: boolean; + mresRef: string; + recordVersion: number; + updateTime: any; + metadata?: { + annotations?: any; + creationTimestamp: any; + deletionTimestamp?: any; + generation: number; + labels?: any; + name: string; + namespace?: string; + }; + spec: { + resourceNamePrefix?: string; + resourceTemplate: { + apiVersion: string; + kind: string; + spec?: any; + msvcRef: { + apiVersion?: string; + clusterName?: string; + kind?: string; + name: string; + namespace: string; + }; + }; + }; + status?: { + checks?: any; + isReady: boolean; + lastReadyGeneration?: number; + lastReconcileTime?: any; + checkList?: Array<{ + debug?: boolean; + description?: string; + hide?: boolean; + name: string; + title: string; + }>; + message?: { RawMessage?: any }; + resources?: Array<{ + apiVersion: string; + kind: string; + name: string; + namespace: string; + }>; + }; + syncedOutputSecretRef?: { + apiVersion?: string; + data?: any; + immutable?: boolean; + kind?: string; + stringData?: any; + type?: K8s__Io___Api___Core___V1__SecretType; + }; + }; + }; + }>; + pageInfo: { + endCursor?: string; + hasNextPage?: boolean; + hasPreviousPage?: boolean; + startCursor?: string; + }; + }; +}; + export type IotconsoleAccountCheckNameAvailabilityQueryVariables = Exact<{ name: Scalars['String']['input']; }>; @@ -7782,20 +7939,15 @@ export type AuthCli_InfraCheckNameAvailabilityQuery = { export type AuthCli_GetConfigSecretMapQueryVariables = Exact<{ envName: Scalars['String']['input']; - configQueries?: InputMaybe< - Array> | InputMaybe - >; + configQueries?: InputMaybe | ConfigKeyRefIn>; secretQueries?: InputMaybe | SecretKeyRefIn>; - mresQueries?: InputMaybe< - | Array> - | InputMaybe - >; + mresQueries?: InputMaybe | SecretKeyRefIn>; }>; export type AuthCli_GetConfigSecretMapQuery = { configs?: Array<{ configName: string; key: string; value: string }>; secrets?: Array<{ key: string; secretName: string; value: string }>; - mreses: Array<{ key: string; mresName: string; value: string }>; + mreses?: Array<{ key: string; secretName: string; value: string }>; }; export type AuthCli_IntercepExternalAppMutationVariables = Exact<{ @@ -7948,6 +8100,7 @@ export type AuthCli_ListSecretsQuery = { node: { displayName: string; markedForDeletion?: boolean; + isReadyOnly: boolean; stringData?: any; metadata?: { name: string; namespace?: string }; }; @@ -8045,6 +8198,146 @@ export type AuthCli_GetRemoteLoginQuery = { auth_getRemoteLogin?: { authHeader?: string; status: string }; }; +export type AuthCli_CreateClusterReferenceMutationVariables = Exact<{ + cluster: ByokClusterIn; +}>; + +export type AuthCli_CreateClusterReferenceMutation = { + infra_createBYOKCluster?: { id: string; metadata: { name: string } }; +}; + +export type AuthCli_DeleteClusterReferenceMutationVariables = Exact<{ + name: Scalars['String']['input']; +}>; + +export type AuthCli_DeleteClusterReferenceMutation = { + infra_deleteBYOKCluster: boolean; +}; + +export type AuthCli_ClusterReferenceInstructionsQueryVariables = Exact<{ + name: Scalars['String']['input']; +}>; + +export type AuthCli_ClusterReferenceInstructionsQuery = { + infrat_getBYOKClusterSetupInstructions?: Array<{ + command: string; + title: string; + }>; +}; + +export type AuthCli_ListImportedManagedResourcesQueryVariables = Exact<{ + envName: Scalars['String']['input']; + search?: InputMaybe; + pq?: InputMaybe; +}>; + +export type AuthCli_ListImportedManagedResourcesQuery = { + core_listImportedManagedResources?: { + totalCount: number; + edges: Array<{ + cursor: string; + node: { + accountName: string; + creationTime: any; + displayName: string; + environmentName: string; + id: string; + markedForDeletion?: boolean; + name: string; + recordVersion: number; + updateTime: any; + createdBy: { userEmail: string; userId: string; userName: string }; + lastUpdatedBy: { userEmail: string; userId: string; userName: string }; + managedResourceRef: { id: string; name: string; namespace: string }; + secretRef: { name: string; namespace?: string }; + syncStatus: { + action: Github__Com___Kloudlite___Api___Pkg___Types__SyncAction; + error?: string; + lastSyncedAt?: any; + recordVersion: number; + state: Github__Com___Kloudlite___Api___Pkg___Types__SyncState; + syncScheduledAt?: any; + }; + managedResource?: { + accountName: string; + apiVersion?: string; + clusterName: string; + creationTime: any; + displayName: string; + enabled?: boolean; + environmentName: string; + id: string; + isImported: boolean; + kind?: string; + managedServiceName: string; + markedForDeletion?: boolean; + mresRef: string; + recordVersion: number; + updateTime: any; + metadata?: { + annotations?: any; + creationTimestamp: any; + deletionTimestamp?: any; + generation: number; + labels?: any; + name: string; + namespace?: string; + }; + spec: { + resourceNamePrefix?: string; + resourceTemplate: { + apiVersion: string; + kind: string; + spec?: any; + msvcRef: { + apiVersion?: string; + clusterName?: string; + kind?: string; + name: string; + namespace: string; + }; + }; + }; + status?: { + checks?: any; + isReady: boolean; + lastReadyGeneration?: number; + lastReconcileTime?: any; + checkList?: Array<{ + debug?: boolean; + description?: string; + hide?: boolean; + name: string; + title: string; + }>; + message?: { RawMessage?: any }; + resources?: Array<{ + apiVersion: string; + kind: string; + name: string; + namespace: string; + }>; + }; + syncedOutputSecretRef?: { + apiVersion?: string; + data?: any; + immutable?: boolean; + kind?: string; + stringData?: any; + type?: K8s__Io___Api___Core___V1__SecretType; + }; + }; + }; + }>; + pageInfo: { + endCursor?: string; + hasNextPage?: boolean; + hasPreviousPage?: boolean; + startCursor?: string; + }; + }; +}; + export type AuthSetRemoteAuthHeaderMutationVariables = Exact<{ loginId: Scalars['String']['input']; authHeader?: InputMaybe;