From bac4f1bac2ca4cba196e8e9595fc3940b60e0630 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 19 Dec 2025 16:54:44 +0100 Subject: [PATCH 001/173] feat: implement DatatypeService extending DFlowDataTypeReactiveService with GraphqlClient integration --- src/packages/ce/src/datatype/Datatype.service.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/packages/ce/src/datatype/Datatype.service.ts b/src/packages/ce/src/datatype/Datatype.service.ts index e69de29b..d936cd04 100644 --- a/src/packages/ce/src/datatype/Datatype.service.ts +++ b/src/packages/ce/src/datatype/Datatype.service.ts @@ -0,0 +1,13 @@ +import {DataTypeView, DFlowDataTypeReactiveService, ReactiveArrayStore} from "@code0-tech/pictor"; +import {GraphqlClient} from "@core/util/graphql-client"; + +export class DatatypeService extends DFlowDataTypeReactiveService { + + private readonly client: GraphqlClient + + constructor(client: GraphqlClient, store: ReactiveArrayStore) { + super(store) + this.client = client + } + +} \ No newline at end of file From 92879118eb4ac55271945a968a3c814295cc4785 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 19 Dec 2025 16:54:48 +0100 Subject: [PATCH 002/173] feat: add user menu component with session handling and navigation --- src/app/(flow)/@bar/default.tsx | 89 +++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 src/app/(flow)/@bar/default.tsx diff --git a/src/app/(flow)/@bar/default.tsx b/src/app/(flow)/@bar/default.tsx new file mode 100644 index 00000000..0b73fc36 --- /dev/null +++ b/src/app/(flow)/@bar/default.tsx @@ -0,0 +1,89 @@ +"use client"; + +import { + Badge, + Breadcrumb, + Button, + Flex, + MenuItem, + MenuSeparator, + Text, + TextInput, + useService, + useUserSession +} from "@code0-tech/pictor"; +import DUserMenu from "@code0-tech/pictor/dist/components/d-user/DUserMenu"; +import {IconBuilding, IconFolders, IconInbox, IconLogout, IconSearch} from "@tabler/icons-react"; +import React from "react"; +import Image from "next/image"; +import {UserService} from "@edition/user/User.service"; +import {useRouter} from "next/navigation"; +import Link from "next/link"; + +const Page = () => { + + const currentSession = useUserSession() + const userService = useService(UserService) + const router = useRouter() + const [loading, startTransition] = React.useTransition() + + + const userMenu = React.useMemo(() => { + + if (!currentSession?.token) { + return null + } + + const userLogout = () => { + startTransition(async () => { + await userService.usersLogout({ + userSessionId: currentSession.id!! + }).then(payload => { + window.localStorage.removeItem("ide_code-zero_session") + router.push("/login") + }) + }) + } + + const namespaceIndex = currentSession.user?.namespace?.id?.match(/Namespace\/(\d+)$/)?.[1] + + return + + + Organizations + + + + + Personal Workspace + + + + + Logout + + + }, [currentSession]) + + return + + + {"CodeZero + + Application + + + + } right={⌘K} rightType={"icon"} + placeholder={"Search..."}/> + + {userMenu} + + + +} + +export default Page \ No newline at end of file From 9e9f452b2afdf80ec72185f817f1d7eed893e78a Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 19 Dec 2025 16:54:53 +0100 Subject: [PATCH 003/173] feat: create initial Page component with client-side rendering --- src/app/(flow)/@tab/default.tsx | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 src/app/(flow)/@tab/default.tsx diff --git a/src/app/(flow)/@tab/default.tsx b/src/app/(flow)/@tab/default.tsx new file mode 100644 index 00000000..ac3dd7f7 --- /dev/null +++ b/src/app/(flow)/@tab/default.tsx @@ -0,0 +1,5 @@ +"use client" + +export default function Page() { + return null +} \ No newline at end of file From cd2bbdce293cb4b8bfad7ee8a978fa0675d2bf2a Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 19 Dec 2025 16:54:58 +0100 Subject: [PATCH 004/173] feat: add Flow fragment definition for GraphQL queries --- src/packages/ce/src/flow/fragments/Flow.fragment.graphql | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/packages/ce/src/flow/fragments/Flow.fragment.graphql diff --git a/src/packages/ce/src/flow/fragments/Flow.fragment.graphql b/src/packages/ce/src/flow/fragments/Flow.fragment.graphql new file mode 100644 index 00000000..7137e570 --- /dev/null +++ b/src/packages/ce/src/flow/fragments/Flow.fragment.graphql @@ -0,0 +1,6 @@ +fragment Flow on Flow { + id + createdAt + updatedAt + name +} \ No newline at end of file From 6c019aab735a0aaec49ee9dded644db8abf19803 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 19 Dec 2025 16:55:03 +0100 Subject: [PATCH 005/173] feat: implement FlowService with GraphQL client integration for flow management --- src/packages/ce/src/flow/Flow.service.ts | 71 ++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/src/packages/ce/src/flow/Flow.service.ts b/src/packages/ce/src/flow/Flow.service.ts index e69de29b..9950ebe6 100644 --- a/src/packages/ce/src/flow/Flow.service.ts +++ b/src/packages/ce/src/flow/Flow.service.ts @@ -0,0 +1,71 @@ +import {DFlowDependencies, DFlowReactiveService, DNamespaceMemberView, ReactiveArrayStore} from "@code0-tech/pictor"; +import { + Flow, NamespaceMember, + NamespacesProjectsFlowsCreateInput, + NamespacesProjectsFlowsCreatePayload, + NamespacesProjectsFlowsDeleteInput, + NamespacesProjectsFlowsDeletePayload, + NamespacesProjectsFlowsUpdateInput, + NamespacesProjectsFlowsUpdatePayload, Query +} from "@code0-tech/sagittarius-graphql-types"; +import {GraphqlClient} from "@core/util/graphql-client"; +import flowsQuery from "@edition/flow/queries/Flows.query.graphql"; + +export class FlowService extends DFlowReactiveService { + + private readonly client: GraphqlClient + private i = 0 + + constructor(client: GraphqlClient, store: ReactiveArrayStore) { + super(store) + this.client = client + } + + values(dependencies?: DFlowDependencies): Flow[] { + const flows = super.values() + if (!dependencies?.namespaceId || !dependencies.projectId) return flows + + const namespaceId = dependencies.namespaceId + const projectId = dependencies.projectId + const filtered = flows.filter(flow => flow) + + if (filtered.length <= 0) { + this.client.query({ + query: flowsQuery, + variables: { + namespaceId: namespaceId, + projectId: projectId, + firstFlow: 50, + afterFlow: null, + } + }).then(res => { + const nodes = res.data?.namespace?.project?.flows?.nodes ?? [] + nodes.forEach(flow => { + if (flow && !this.hasById(flow.id)) { + this.set(this.i++, flow) + } + }) + }) + } + + return filtered + } + + hasById(id: Flow["id"]): boolean { + const flow = super.values().find(f => f.id === id) + return flow !== undefined + } + + flowCreate(payload: NamespacesProjectsFlowsCreateInput): Promise { + return Promise.resolve(undefined); + } + + flowDelete(payload: NamespacesProjectsFlowsDeleteInput): Promise { + return Promise.resolve(undefined); + } + + flowUpdate(payload: NamespacesProjectsFlowsUpdateInput): Promise { + return Promise.resolve(undefined); + } + +} \ No newline at end of file From 0cb29b54a421c138bf2ca709c7b0c63b91fb6f77 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 19 Dec 2025 16:55:22 +0100 Subject: [PATCH 006/173] feat: add Flows query for fetching flow data with pagination support --- .../ce/src/flow/queries/Flows.query.graphql | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/packages/ce/src/flow/queries/Flows.query.graphql diff --git a/src/packages/ce/src/flow/queries/Flows.query.graphql b/src/packages/ce/src/flow/queries/Flows.query.graphql new file mode 100644 index 00000000..652e2ebd --- /dev/null +++ b/src/packages/ce/src/flow/queries/Flows.query.graphql @@ -0,0 +1,23 @@ +#import "../fragments/Flow.fragment.graphql" + +query Flows ( + $namespaceId: NamespaceID! + $projectId: NamespaceProjectID! + $firstFlow: Int! + $afterFlow: String +) { + namespace(id: $namespaceId) { + project(id: $projectId) { + flows (first: $firstFlow, after: $afterFlow) { + count + nodes { + ...Flow + } + pageInfo { + endCursor + hasNextPage + } + } + } + } +} \ No newline at end of file From 197d1b2e0f6a0370028ef3c680c4ed08042b8b35 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 19 Dec 2025 16:55:28 +0100 Subject: [PATCH 007/173] feat: implement FlowtypeService extending DFlowTypeReactiveService with GraphQL client integration --- src/packages/ce/src/flowtype/Flowtype.service.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/packages/ce/src/flowtype/Flowtype.service.ts b/src/packages/ce/src/flowtype/Flowtype.service.ts index e69de29b..f9e5d4fd 100644 --- a/src/packages/ce/src/flowtype/Flowtype.service.ts +++ b/src/packages/ce/src/flowtype/Flowtype.service.ts @@ -0,0 +1,13 @@ +import {DFlowTypeReactiveService, FlowTypeView, ReactiveArrayStore} from "@code0-tech/pictor"; +import {GraphqlClient} from "@core/util/graphql-client"; + +export class FlowtypeService extends DFlowTypeReactiveService { + + private readonly client: GraphqlClient + + constructor(client: GraphqlClient, store: ReactiveArrayStore) { + super(store) + this.client = client + } + +} \ No newline at end of file From 5a7273cc5b9ca7f5a20854dd1eb3b0c6667e4383 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 19 Dec 2025 16:55:33 +0100 Subject: [PATCH 008/173] feat: add GraphQL fragments for DataTypeIdentifier and FunctionDefinition --- .../fragments/Function.fragment.graphql | 180 ++++++++++++++++++ 1 file changed, 180 insertions(+) create mode 100644 src/packages/ce/src/function/fragments/Function.fragment.graphql diff --git a/src/packages/ce/src/function/fragments/Function.fragment.graphql b/src/packages/ce/src/function/fragments/Function.fragment.graphql new file mode 100644 index 00000000..248d9bdf --- /dev/null +++ b/src/packages/ce/src/function/fragments/Function.fragment.graphql @@ -0,0 +1,180 @@ +fragment DataTypeIdentifier on DataTypeIdentifier { + id + createdAt + updatedAt + genericKey + genericType { + id + updatedAt + createdAt + genericMappers { + id + target + sourceDataTypeIdentifiers { + id + } + updatedAt + createdAt + genericCombinationStrategies { + id + type + createdAt + updatedAt + __typename + } + __typename + } + dataType { + identifier + id + __typename + } + } + dataType { + id + identifier + } + __typename +} + +fragment Function on FunctionDefinition { + id + createdAt + updatedAt + aliases (first: $first1, after: $after1) { + count + nodes { + code + content + __typename + } + pageInfo { + endCursor + hasNextPage + } + } + deprecationMessages (first: $first2, after: $after2) { + count + nodes { + code + content + __typename + } + pageInfo { + endCursor + hasNextPage + } + } + descriptions (first: $first3, after: $after3) { + count + nodes { + code + content + __typename + } + pageInfo { + endCursor + hasNextPage + } + } + documentations (first: $first4, after: $after4) { + count + nodes { + code + content + __typename + } + pageInfo { + endCursor + hasNextPage + } + } + genericKeys + displayMessages (first: $first5, after: $after5) { + count + nodes { + code + content + __typename + } + pageInfo { + endCursor + hasNextPage + } + } + identifier + names (first: $first6, after: $after6) { + count + nodes { + code + content + __typename + } + pageInfo { + endCursor + hasNextPage + } + } + returnType { + ...DataTypeIdentifier + } + parameterDefinitions (first: $first7, after: $after7) { + nodes { + id + identifier + updatedAt + createdAt + identifier + names (first: $first8, after: $after8) { + count + nodes { + code + content + __typename + } + pageInfo { + endCursor + hasNextPage + } + } + descriptions (first: $first9, after: $after9) { + count + nodes { + code + content + __typename + } + pageInfo { + endCursor + hasNextPage + } + } + documentations (first: $first10, after: $after10) { + count + nodes { + code + content + __typename + } + pageInfo { + endCursor + hasNextPage + } + } + dataTypeIdentifier { + ...DataTypeIdentifier + } + __typename + } + } + throwsError + runtimeFunctionDefinition { + id + identifier + runtime { + id + } + __typename + } + __typename +} \ No newline at end of file From 46cfabcf8fc37145f1970c260e2b448f3f549a8d Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 19 Dec 2025 16:55:38 +0100 Subject: [PATCH 009/173] feat: implement FunctionService with GraphQL client integration for function management --- .../ce/src/function/Function.service.ts | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/src/packages/ce/src/function/Function.service.ts b/src/packages/ce/src/function/Function.service.ts index e69de29b..c9916b71 100644 --- a/src/packages/ce/src/function/Function.service.ts +++ b/src/packages/ce/src/function/Function.service.ts @@ -0,0 +1,79 @@ +import { + DFlowFunctionDependencies, + DFlowFunctionReactiveService, + FunctionDefinitionView, + ReactiveArrayStore +} from "@code0-tech/pictor"; +import {GraphqlClient} from "@core/util/graphql-client"; +import {Flow, FunctionDefinition, Query} from "@code0-tech/sagittarius-graphql-types"; +import functionsQuery from "@edition/function/queries/Functions.query.graphql"; + +export class FunctionService extends DFlowFunctionReactiveService { + + private readonly client: GraphqlClient + private i = 0 + + constructor(client: GraphqlClient, store: ReactiveArrayStore) { + super(store) + this.client = client + } + + values(dependencies?: DFlowFunctionDependencies): FunctionDefinitionView[] { + const functions = super.values() + if (!dependencies?.namespaceId || !dependencies.projectId || !dependencies.runtimeId) return functions + + const namespaceId = dependencies.namespaceId + const projectId = dependencies.projectId + const runtimeId = dependencies.runtimeId + const filtered = functions.filter(functionD => functionD.runtimeFunctionDefinition?.runtime?.id === runtimeId) + + if (filtered.length <= 0) { + this.client.query({ + query: functionsQuery, + variables: { + namespaceId: namespaceId, + projectId: projectId, + + firstFunction: 50, + afterFunction: null, + + first1: 50, + after1: null, + first2: 50, + after2: null, + first3: 50, + after3: null, + first4: 50, + after4: null, + first5: 50, + after5: null, + first6: 50, + after6: null, + first7: 50, + after7: null, + first8: 50, + after8: null, + first9: 50, + after9: null, + first10: 50, + after10: null, + } + }).then(res => { + const nodes = res.data?.namespace?.project?.primaryRuntime?.functionDefinitions?.nodes ?? [] + nodes.forEach(functionD => { + if (functionD && !this.hasById(functionD.id)) { + this.set(this.i++, new FunctionDefinitionView(functionD)) + } + }) + }) + } + + return filtered + } + + hasById(id: FunctionDefinition["id"]): boolean { + const functionD = super.values().find(f => f.id === id) + return functionD !== undefined + } + +} \ No newline at end of file From a605464f4aaafe90a164ce812aefd494832a46d7 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 19 Dec 2025 16:55:42 +0100 Subject: [PATCH 010/173] feat: add Functions query for fetching function definitions with pagination support --- .../function/queries/Functions.query.graphql | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/packages/ce/src/function/queries/Functions.query.graphql diff --git a/src/packages/ce/src/function/queries/Functions.query.graphql b/src/packages/ce/src/function/queries/Functions.query.graphql new file mode 100644 index 00000000..8cad8d76 --- /dev/null +++ b/src/packages/ce/src/function/queries/Functions.query.graphql @@ -0,0 +1,41 @@ +#import "../fragments/Function.fragment.graphql" + +query Functions ( + $namespaceId: NamespaceID! + $projectId: NamespaceProjectID! + $firstFunction: Int! + $afterFunction: String + $first1: Int! + $after1: String + $first2: Int! + $after2: String + $first3: Int! + $after3: String + $first4: Int! + $after4: String + $first5: Int! + $after5: String + $first6: Int! + $after6: String + $first7: Int! + $after7: String + $first8: Int! + $after8: String + $first9: Int! + $after9: String + $first10: Int! + $after10: String +) { + namespace(id: $namespaceId) { + project(id: $projectId) { + primaryRuntime { + functionDefinitions (first: $firstFunction, after: $afterFunction) { + count + nodes { + ...Function + } + } + } + } + } +} \ No newline at end of file From a8df0ef7e3a58e065c3044f406bf8704ff283b0c Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 19 Dec 2025 16:55:47 +0100 Subject: [PATCH 011/173] feat: update GraphQL endpoint URL to point to the correct port --- graphql.config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphql.config.yml b/graphql.config.yml index dab28289..befbfcbd 100644 --- a/graphql.config.yml +++ b/graphql.config.yml @@ -3,4 +3,4 @@ documents: '**/*.graphql' extensions: endpoints: Default GraphQL Endpoint: - url: http://localhost:3001/graphql + url: http://localhost:3000/graphql From acc410de1d04bef992d233d97ad9775ba57d25c1 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 19 Dec 2025 16:55:51 +0100 Subject: [PATCH 012/173] feat: add ApplicationLayout component with context store and reactive services integration --- src/app/(flow)/layout.tsx | 168 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 src/app/(flow)/layout.tsx diff --git a/src/app/(flow)/layout.tsx b/src/app/(flow)/layout.tsx new file mode 100644 index 00000000..0cfc5fd8 --- /dev/null +++ b/src/app/(flow)/layout.tsx @@ -0,0 +1,168 @@ +"use client" + +import React from "react"; +import {useApolloClient} from "@apollo/client/react"; +import { + Button, + ContextStoreProvider, + DataTypeView, DFlowFolder, DFlowFolderHandle, + DLayout, + DNamespaceMemberView, + DNamespaceProjectView, + DNamespaceRoleView, + DNamespaceView, + DOrganizationView, DResizableHandle, DResizablePanel, DResizablePanelGroup, + DRuntimeView, + DUserView, Flex, + FlowTypeView, + FunctionDefinitionView, + ReactiveArrayStore, Text, Tooltip, TooltipArrow, TooltipContent, TooltipPortal, TooltipTrigger, + useUserSession +} from "@code0-tech/pictor"; +import {UserService} from "@edition/user/User.service"; +import {GraphqlClient} from "@core/util/graphql-client"; +import {useParams, useRouter} from "next/navigation"; +import {OrganizationService} from "@edition/organization/Organization.service"; +import {MemberService} from "@edition/member/Member.service"; +import {NamespaceService} from "@edition/namespace/Namespace.service"; +import {usePersistentReactiveArrayService} from "@/hooks/usePersistentReactiveArrayService"; +import {RuntimeService} from "@edition/runtime/Runtime.service"; +import {ProjectService} from "@edition/project/Project.service"; +import {RoleService} from "@edition/role/Role.service"; +import {Flow, Namespace, NamespaceProject} from "@code0-tech/sagittarius-graphql-types"; +import {FlowService} from "@edition/flow/Flow.service"; +import {FunctionService} from "@edition/function/Function.service"; +import {DatatypeService} from "@edition/datatype/Datatype.service"; +import {FlowtypeService} from "@edition/flowtype/Flowtype.service"; +import {FileTabsView} from "@code0-tech/pictor/dist/components/file-tabs/FileTabs.view"; +import {FileTabsService} from "@code0-tech/pictor/dist/components/file-tabs/FileTabs.service"; +import {IconArrowsMaximize, IconArrowsMinimize, IconCircleDot} from "@tabler/icons-react"; + +interface ApplicationLayoutProps { + children: React.ReactNode + bar: React.ReactNode + tab: React.ReactNode +} + +const ApplicationLayout: React.FC = ({children, bar, tab}) => { + + const client = useApolloClient() + const router = useRouter() + const params = useParams() + const currentSession = useUserSession() + + const graphqlClient = React.useMemo(() => new GraphqlClient(client), [client]) + + const namespaceIndex = params.namespaceId as any as number + const projectIndex = params.projectId as any as number + const namespaceId: Namespace['id'] = `gid://sagittarius/Namespace/${namespaceIndex}` + const projectId: NamespaceProject['id'] = `gid://sagittarius/NamespaceProject/${projectIndex}` + + const user = usePersistentReactiveArrayService(`dashboard::users::${currentSession?.id}`, (store: ReactiveArrayStore) => new UserService(graphqlClient, store)) + const organization = usePersistentReactiveArrayService(`dashboard::organizations::${currentSession?.id}`, (store: ReactiveArrayStore) => new OrganizationService(graphqlClient, store)) + const member = usePersistentReactiveArrayService(`dashboard::members::${currentSession?.id}`, (store: ReactiveArrayStore) => new MemberService(graphqlClient, store)) + const namespace = usePersistentReactiveArrayService(`dashboard::namespaces::${currentSession?.id}`, (store: ReactiveArrayStore) => new NamespaceService(graphqlClient, store)) + const runtime = usePersistentReactiveArrayService(`dashboard::global_runtimes::${currentSession?.id}`, (store: ReactiveArrayStore) => new RuntimeService(graphqlClient, store)) + const project = usePersistentReactiveArrayService(`dashboard::projects::${currentSession?.id}`, (store: ReactiveArrayStore) => new ProjectService(graphqlClient, store)) + const role = usePersistentReactiveArrayService(`dashboard::roles::${currentSession?.id}`, (store: ReactiveArrayStore) => new RoleService(graphqlClient, store)) + const flow = usePersistentReactiveArrayService(`dashboard::flows::${currentSession?.id}`, (store: ReactiveArrayStore) => new FlowService(graphqlClient, store)) + const functions = usePersistentReactiveArrayService(`dashboard::functions::${currentSession?.id}`, (store: ReactiveArrayStore) => new FunctionService(graphqlClient, store)) + const datatype = usePersistentReactiveArrayService(`dashboard::datatypes::${currentSession?.id}`, (store: ReactiveArrayStore) => new DatatypeService(graphqlClient, store)) + const flowtype = usePersistentReactiveArrayService(`dashboard::flowtypes::${currentSession?.id}`, (store: ReactiveArrayStore) => new FlowtypeService(graphqlClient, store)) + const file = usePersistentReactiveArrayService(`dashboard::files::${currentSession?.id}`, FileTabsService, []) + + + if (currentSession === null) router.push("/login") + + const runtimeId = React.useMemo(() => project[1].getById(projectId, {namespaceId})?.primaryRuntime?.id, [projectId, project[0], namespaceId]) + + React.useMemo(() => { + flow[1].values({namespaceId, projectId}) + functions[1].values({namespaceId, projectId, runtimeId}) + datatype[1].values({namespaceId, projectId, runtimeId}) + flowtype[1].values({namespaceId, projectId, runtimeId}) + }, [runtimeId, namespaceId, projectId]) + + const ref = React.useRef(null) + + return + +
+ {bar} + {tab} +
+ + }> + + + + + + + + + + + + + Open active flow + + + + + + + + + + + Close all + + + + + + + + + + + Open all + + + + + + + }> +
+ +
+
+
+ + {children} +
+
+
+
+} + +export default ApplicationLayout From c41bd95f492bf82733949e91f57e8c2924805aee Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 19 Dec 2025 16:56:00 +0100 Subject: [PATCH 013/173] feat: create new page component with flow selection and background image --- .../[projectId]/flow/[flowId]/page.tsx | 58 ++++++++++++++++ .../project/[projectId]/page.tsx | 66 +++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/[flowId]/page.tsx create mode 100644 src/app/(flow)/namespace/[namespaceId]/project/[projectId]/page.tsx diff --git a/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/[flowId]/page.tsx b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/[flowId]/page.tsx new file mode 100644 index 00000000..8756492b --- /dev/null +++ b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/[flowId]/page.tsx @@ -0,0 +1,58 @@ +"use client" + +import { + Button, + DFlow, + DFlowTabs, + DLayout, + DResizableHandle, + DResizablePanel, + DResizablePanelGroup, + Flex, + Text +} from "@code0-tech/pictor"; +import React from "react"; +import {IconDatabase, IconFile, IconMessageChatbot} from "@tabler/icons-react"; + +export default function Page() { + const [show, setShow] = React.useState(false); + + return + + + + + + } bottomContent={ + + + + + }> + + + + + {show && ( + <> + + + + + + )} + + + +} \ No newline at end of file diff --git a/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/page.tsx b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/page.tsx new file mode 100644 index 00000000..775838a8 --- /dev/null +++ b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/page.tsx @@ -0,0 +1,66 @@ +"use client" + +import { + Button, + Col, + DResizablePanel, + Flex, + ScrollArea, + ScrollAreaScrollbar, ScrollAreaThumb, + ScrollAreaViewport, + Spacing, + Text +} from "@code0-tech/pictor"; +import React from "react"; +import Link from "next/link"; + +export default function Page() { + + const [show, setShow] = React.useState(false); + + return + + + + + Create or select a flow + + + Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor + invidunt ut + labore et dolore magna aliquyam erat, sed diam voluptua. + + + + + + + + + + Or start from a template + + + + + + + +
+ +} \ No newline at end of file From 7f57f720b6f8cfbfd344e46deb9024903a5c8f50 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sun, 11 Jan 2026 22:43:04 +0100 Subject: [PATCH 014/173] feat: update dependencies for @code0-tech/pictor and react packages --- package-lock.json | 855 ++++++++++++++++++++++------------------------ package.json | 6 +- 2 files changed, 403 insertions(+), 458 deletions(-) diff --git a/package-lock.json b/package-lock.json index 051afa88..8f2eeb25 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,12 +9,12 @@ "version": "0.1.0", "dependencies": { "@apollo/client": "^4.0.9", - "@code0-tech/pictor": "^0.0.0-mvp.31", + "@code0-tech/pictor": "^0.0.0-mvp.32", "graphql": "^16.12.0", "graphql-tag": "^2.12.6", "next": "16.0.7", - "react": "19.2.0", - "react-dom": "19.2.0", + "react": "19.2.3", + "react-dom": "19.2.3", "rxjs": "^7.8.2", "sass": "^1.93.3" }, @@ -28,104 +28,10 @@ "typescript": "^5" } }, - "../pictor": { - "name": "@code0-tech/pictor", - "version": "0.0.0", - "extraneous": true, - "dependencies": { - "@code0-tech/definition-reader": "^0.0.16" - }, - "devDependencies": { - "@ariakit/react": "^0.4.17", - "@babel/plugin-proposal-decorators": "^7.28.0", - "@babel/plugin-transform-class-properties": "^7.27.1", - "@code0-tech/sagittarius-graphql-types": "^0.0.0-65144a9920c6a8de3bcf24acdcb8eec4158cef73", - "@dagrejs/dagre": "^1.1.5", - "@mdx-js/react": "^3.1.1", - "@radix-ui/react-checkbox": "^1.3.3", - "@radix-ui/react-dialog": "^1.1.15", - "@radix-ui/react-dropdown-menu": "^2.1.16", - "@radix-ui/react-one-time-password-field": "^0.1.8", - "@radix-ui/react-radio-group": "^1.3.8", - "@radix-ui/react-scroll-area": "^1.2.10", - "@radix-ui/react-tabs": "^1.1.13", - "@radix-ui/react-toggle-group": "^1.1.11", - "@radix-ui/react-tooltip": "^1.2.8", - "@rollup/plugin-commonjs": "^28.0.9", - "@rollup/plugin-node-resolve": "^16.0.3", - "@rollup/plugin-terser": "^0.4.4", - "@rollup/plugin-typescript": "^12.3.0", - "@storybook/addon-a11y": "^10.0.4", - "@storybook/addon-links": "^10.0.4", - "@storybook/addon-onboarding": "^10.0.4", - "@storybook/builder-vite": "^10.0.4", - "@storybook/cli": "^10.0.4", - "@storybook/react": "^10.0.4", - "@storybook/react-vite": "^10.0.4", - "@storybook/test-runner": "^0.24.1", - "@storybook/testing-library": "^0.2.2", - "@tabler/icons-react": "3.35.0", - "@types/jest-image-snapshot": "^6.4.0", - "@types/react": "^19.2.2", - "@vitejs/plugin-react": "^5.1.0", - "@xyflow/react": "^12.9.2", - "axe-playwright": "^2.2.2", - "babel-loader": "^10.0.0", - "babel-plugin-react-compiler": "^19.1.0-rc.3", - "cmdk": "^1.1.1", - "concurrently": "^9.2.1", - "css-loader": "^7.1.2", - "html-webpack-plugin": "^5.6.4", - "identity-obj-proxy": "^3.0.0", - "jest-image-snapshot": "^6.5.1", - "js-md5": "^0.8.3", - "merge-props": "^6.0.0", - "overlap-area": "^1.1.0", - "playwright": "1.55.1", - "react": "^19.2.0", - "react-dom": "^19.2.0", - "react-resizable-panels": "^3.0.6", - "react-zoom-pan-pinch": "^3.7.0", - "rimraf": "^6.1.0", - "sass": "^1.93.3", - "sass-loader": "^16.0.6", - "storybook": "^10.0.4", - "style-loader": "^4.0.0", - "ts-jest": "^29.4.5", - "ts-node": "^10.9.2", - "typescript": "^5.9.3", - "vite": "^7.2.1", - "vite-plugin-dts": "^4.5.4", - "vite-plugin-lib-inject-css": "^2.2.2" - }, - "peerDependencies": { - "@ariakit/react": "^0.4.5", - "@code0-tech/sagittarius-graphql-types": "^0.0.0-65144a9920c6a8de3bcf24acdcb8eec4158cef73", - "@radix-ui/react-checkbox": "^1.3.2", - "@radix-ui/react-dialog": "^1.1.14", - "@radix-ui/react-dropdown-menu": "^2.1.15", - "@radix-ui/react-one-time-password-field": "^0.1.7", - "@radix-ui/react-radio-group": "^1.3.7", - "@radix-ui/react-scroll-area": "^1.2.10", - "@radix-ui/react-tabs": "^1.1.12", - "@radix-ui/react-toggle-group": "^1.1.10", - "@radix-ui/react-tooltip": "^1.2.8", - "@tabler/icons-react": "^3.5.0", - "@xyflow/react": "^12.8.2", - "cmdk": "^1.1.1", - "js-md5": "^0.8.3", - "merge-props": "^6.0.0", - "overlap-area": "^1.1.0", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0", - "react-resizable-panels": "^3.0.3", - "react-zoom-pan-pinch": "^3.6.1" - } - }, "node_modules/@apollo/client": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@apollo/client/-/client-4.0.9.tgz", - "integrity": "sha512-Lh2drMzFE9x5jVS8RKmlGL5SORkvpyUJIT+wTErxDUR2HpWePiBfhhcHHRSlZFiCR866ewCv4euTc4IDF0GWxw==", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/@apollo/client/-/client-4.0.11.tgz", + "integrity": "sha512-jyW5j3DEYnFlYA1Lk9Szd7O/od1DptnbZnj03DQXxuQb+Gnop0w/uQxVRKaU7bPhvVuBnlAtZYPOykArX+xWdg==", "license": "MIT", "workspaces": [ "dist", @@ -446,35 +352,33 @@ } }, "node_modules/@code0-tech/pictor": { - "version": "0.0.0-mvp.31", - "resolved": "https://registry.npmjs.org/@code0-tech/pictor/-/pictor-0.0.0-mvp.31.tgz", - "integrity": "sha512-UIc+6I1coRxm7bDHLMTYRJk9iMOFieGz4ULmve8s0GcJZHXV+njunzbDWhvTzf7UTA3wSj9i038xKqczc6c4ow==", - "dependencies": { - "@radix-ui/react-context-menu": "^2.2.16", - "react-contenteditable": "^3.3.7" - }, + "version": "0.0.0-mvp.32", + "resolved": "https://registry.npmjs.org/@code0-tech/pictor/-/pictor-0.0.0-mvp.32.tgz", + "integrity": "sha512-tQz1IwyRiLBJGfLcV+la5Ar0MQMRdgKlYE0t8yeJWgxaPo2eTgnhfzIBJJJRKseJV7kRS8oHS+lL2hicPuPiJg==", "peerDependencies": { - "@ariakit/react": "^0.4.5", + "@ariakit/react": "^0.4.17", "@code0-tech/sagittarius-graphql-types": "0.0.0-a2b1f5e9adf8f52b5a0f235ca9906ac5a699b4fc", - "@radix-ui/react-checkbox": "^1.3.2", - "@radix-ui/react-dialog": "^1.1.14", - "@radix-ui/react-dropdown-menu": "^2.1.15", - "@radix-ui/react-one-time-password-field": "^0.1.7", - "@radix-ui/react-radio-group": "^1.3.7", + "@radix-ui/react-checkbox": "^1.3.3", + "@radix-ui/react-context-menu": "^2.2.16", + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-dropdown-menu": "^2.1.16", + "@radix-ui/react-one-time-password-field": "^0.1.8", + "@radix-ui/react-radio-group": "^1.3.8", "@radix-ui/react-scroll-area": "^1.2.10", - "@radix-ui/react-tabs": "^1.1.12", - "@radix-ui/react-toggle-group": "^1.1.10", + "@radix-ui/react-tabs": "^1.1.13", + "@radix-ui/react-toggle-group": "^1.1.11", "@radix-ui/react-tooltip": "^1.2.8", - "@tabler/icons-react": "^3.5.0", - "@xyflow/react": "^12.8.2", + "@tabler/icons-react": "3.35.0", + "@xyflow/react": "^12.10.0", "cmdk": "^1.1.1", "js-md5": "^0.8.3", "merge-props": "^6.0.0", "overlap-area": "^1.1.0", "react": "^18.0.0 || ^19.0.0", + "react-contenteditable": "^3.3.7", "react-dom": "^18.0.0 || ^19.0.0", - "react-resizable-panels": "^3.0.3 || ^4.0.0", - "react-zoom-pan-pinch": "^3.6.1", + "react-resizable-panels": "^4.3.1", + "react-zoom-pan-pinch": "^3.7.0", "sonner": "^2.0.7" } }, @@ -492,9 +396,9 @@ "peer": true }, "node_modules/@emnapi/core": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.0.tgz", - "integrity": "sha512-pJdKGq/1iquWYtv1RRSljZklxHCOCAJFJrImO5ZLKPJVJlVUcs8yFwNQlqS0Lo8xT1VAXXTCZocF9n26FWEKsw==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", + "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", "dev": true, "license": "MIT", "optional": true, @@ -504,9 +408,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.0.tgz", - "integrity": "sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", "license": "MIT", "optional": true, "dependencies": { @@ -525,9 +429,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -608,9 +512,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", "dev": true, "license": "MIT", "dependencies": { @@ -620,7 +524,7 @@ "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", + "js-yaml": "^4.1.1", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, @@ -632,9 +536,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", - "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", "dev": true, "license": "MIT", "engines": { @@ -673,6 +577,7 @@ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", "license": "MIT", + "peer": true, "dependencies": { "@floating-ui/utils": "^0.2.10" } @@ -682,6 +587,7 @@ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", "license": "MIT", + "peer": true, "dependencies": { "@floating-ui/core": "^1.7.3", "@floating-ui/utils": "^0.2.10" @@ -692,6 +598,7 @@ "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", "license": "MIT", + "peer": true, "dependencies": { "@floating-ui/dom": "^1.7.4" }, @@ -704,7 +611,8 @@ "version": "0.2.10", "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@graphql-typed-document-node/core": { "version": "3.2.0", @@ -778,9 +686,9 @@ } }, "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.4.tgz", - "integrity": "sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", "cpu": [ "arm64" ], @@ -796,13 +704,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.3" + "@img/sharp-libvips-darwin-arm64": "1.2.4" } }, "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.4.tgz", - "integrity": "sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", "cpu": [ "x64" ], @@ -818,13 +726,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.3" + "@img/sharp-libvips-darwin-x64": "1.2.4" } }, "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.3.tgz", - "integrity": "sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", "cpu": [ "arm64" ], @@ -838,9 +746,9 @@ } }, "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.3.tgz", - "integrity": "sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", "cpu": [ "x64" ], @@ -854,9 +762,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.3.tgz", - "integrity": "sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", "cpu": [ "arm" ], @@ -870,9 +778,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.3.tgz", - "integrity": "sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", "cpu": [ "arm64" ], @@ -886,9 +794,9 @@ } }, "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.3.tgz", - "integrity": "sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", "cpu": [ "ppc64" ], @@ -901,10 +809,26 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.3.tgz", - "integrity": "sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", "cpu": [ "s390x" ], @@ -918,9 +842,9 @@ } }, "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.3.tgz", - "integrity": "sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", "cpu": [ "x64" ], @@ -934,9 +858,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.3.tgz", - "integrity": "sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", "cpu": [ "arm64" ], @@ -950,9 +874,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.3.tgz", - "integrity": "sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", "cpu": [ "x64" ], @@ -966,9 +890,9 @@ } }, "node_modules/@img/sharp-linux-arm": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.4.tgz", - "integrity": "sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", "cpu": [ "arm" ], @@ -984,13 +908,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.3" + "@img/sharp-libvips-linux-arm": "1.2.4" } }, "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.4.tgz", - "integrity": "sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", "cpu": [ "arm64" ], @@ -1006,13 +930,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.3" + "@img/sharp-libvips-linux-arm64": "1.2.4" } }, "node_modules/@img/sharp-linux-ppc64": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.4.tgz", - "integrity": "sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", "cpu": [ "ppc64" ], @@ -1028,13 +952,35 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.3" + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" } }, "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.4.tgz", - "integrity": "sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", "cpu": [ "s390x" ], @@ -1050,13 +996,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.3" + "@img/sharp-libvips-linux-s390x": "1.2.4" } }, "node_modules/@img/sharp-linux-x64": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.4.tgz", - "integrity": "sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", "cpu": [ "x64" ], @@ -1072,13 +1018,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.3" + "@img/sharp-libvips-linux-x64": "1.2.4" } }, "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.4.tgz", - "integrity": "sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", "cpu": [ "arm64" ], @@ -1094,13 +1040,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.3" + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" } }, "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.4.tgz", - "integrity": "sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", "cpu": [ "x64" ], @@ -1116,20 +1062,20 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.3" + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" } }, "node_modules/@img/sharp-wasm32": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.4.tgz", - "integrity": "sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", "cpu": [ "wasm32" ], "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, "dependencies": { - "@emnapi/runtime": "^1.5.0" + "@emnapi/runtime": "^1.7.0" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -1139,9 +1085,9 @@ } }, "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.4.tgz", - "integrity": "sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", "cpu": [ "arm64" ], @@ -1158,9 +1104,9 @@ } }, "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.4.tgz", - "integrity": "sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", "cpu": [ "ia32" ], @@ -1177,9 +1123,9 @@ } }, "node_modules/@img/sharp-win32-x64": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.4.tgz", - "integrity": "sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", "cpu": [ "x64" ], @@ -1746,19 +1692,6 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/watcher/node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "license": "Apache-2.0", - "optional": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/@radix-ui/number": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", @@ -1770,13 +1703,15 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@radix-ui/react-arrow": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", "license": "MIT", + "peer": true, "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, @@ -1831,6 +1766,7 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", "license": "MIT", + "peer": true, "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", @@ -1857,6 +1793,7 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", "license": "MIT", + "peer": true, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -1872,6 +1809,7 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", "license": "MIT", + "peer": true, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -1887,6 +1825,7 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.16.tgz", "integrity": "sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==", "license": "MIT", + "peer": true, "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-context": "1.1.2", @@ -1952,6 +1891,7 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", "license": "MIT", + "peer": true, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -1967,6 +1907,7 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", "license": "MIT", + "peer": true, "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", @@ -2024,6 +1965,7 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", "license": "MIT", + "peer": true, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -2039,6 +1981,7 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", "license": "MIT", + "peer": true, "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", @@ -2064,6 +2007,7 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", "license": "MIT", + "peer": true, "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, @@ -2082,6 +2026,7 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz", "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==", "license": "MIT", + "peer": true, "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", @@ -2157,6 +2102,7 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", "license": "MIT", + "peer": true, "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.7", @@ -2189,6 +2135,7 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", "license": "MIT", + "peer": true, "dependencies": { "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-layout-effect": "1.1.1" @@ -2213,6 +2160,7 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", "license": "MIT", + "peer": true, "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.1" @@ -2237,6 +2185,7 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", "license": "MIT", + "peer": true, "dependencies": { "@radix-ui/react-slot": "1.2.3" }, @@ -2293,6 +2242,7 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", "license": "MIT", + "peer": true, "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", @@ -2356,6 +2306,7 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", "license": "MIT", + "peer": true, "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, @@ -2496,6 +2447,7 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", "license": "MIT", + "peer": true, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -2511,6 +2463,7 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", "license": "MIT", + "peer": true, "dependencies": { "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-layout-effect": "1.1.1" @@ -2530,6 +2483,7 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", "license": "MIT", + "peer": true, "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, @@ -2548,6 +2502,7 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", "license": "MIT", + "peer": true, "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.1" }, @@ -2585,6 +2540,7 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", "license": "MIT", + "peer": true, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -2616,6 +2572,7 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", "license": "MIT", + "peer": true, "dependencies": { "@radix-ui/rect": "1.1.1" }, @@ -2634,6 +2591,7 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", "license": "MIT", + "peer": true, "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, @@ -2675,7 +2633,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@rtsao/scc": { "version": "1.1.0", @@ -2694,9 +2653,9 @@ } }, "node_modules/@tabler/icons": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-3.36.1.tgz", - "integrity": "sha512-f4Jg3Fof/Vru5ioix/UO4GX+sdDsF9wQo47FbtvG+utIYYVQ/QVAC0QYgcBbAjQGfbdOh2CCf0BgiFOF9Ixtjw==", + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-3.35.0.tgz", + "integrity": "sha512-yYXe+gJ56xlZFiXwV9zVoe3FWCGuZ/D7/G4ZIlDtGxSx5CGQK110wrnT29gUj52kEZoxqF7oURTk97GQxELOFQ==", "license": "MIT", "peer": true, "funding": { @@ -2705,13 +2664,13 @@ } }, "node_modules/@tabler/icons-react": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-3.36.1.tgz", - "integrity": "sha512-/8nOXeNeMoze9xY/QyEKG65wuvRhkT3q9aytaur6Gj8bYU2A98YVJyLc9MRmc5nVvpy+bRlrrwK/Ykr8WGyUWg==", + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-3.35.0.tgz", + "integrity": "sha512-XG7t2DYf3DyHT5jxFNp5xyLVbL4hMJYJhiSdHADzAjLRYfL7AnjlRfiHDHeXxkb2N103rEIvTsBRazxXtAUz2g==", "license": "MIT", "peer": true, "dependencies": { - "@tabler/icons": "" + "@tabler/icons": "3.35.0" }, "funding": { "type": "github", @@ -2809,9 +2768,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.19.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", - "integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==", + "version": "20.19.28", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.28.tgz", + "integrity": "sha512-VyKBr25BuFDzBFCK5sUM6ZXiWfqgCTwTAOK8qzGV/m9FCirXYDlmczJ+d5dXBAQALGCdRRdbteKYfJ84NGEusw==", "dev": true, "license": "MIT", "dependencies": { @@ -2819,19 +2778,19 @@ } }, "node_modules/@types/react": { - "version": "19.2.2", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz", - "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.8.tgz", + "integrity": "sha512-3MbSL37jEchWZz2p2mjntRZtPt837ij10ApxKfgmXCTuHWagYg7iA5bqPw6C8BMPfwidlvfPI/fxOc42HLhcyg==", "devOptional": true, "license": "MIT", "dependencies": { - "csstype": "^3.0.2" + "csstype": "^3.2.2" } }, "node_modules/@types/react-dom": { - "version": "19.2.2", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.2.tgz", - "integrity": "sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==", + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "devOptional": true, "license": "MIT", "peerDependencies": { @@ -2839,21 +2798,20 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.3.tgz", - "integrity": "sha512-sbaQ27XBUopBkRiuY/P9sWGOWUW4rl8fDoHIUmLpZd8uldsTyB4/Zg6bWTegPoTLnKj9Hqgn3QD6cjPNB32Odw==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.52.0.tgz", + "integrity": "sha512-okqtOgqu2qmZJ5iN4TWlgfF171dZmx2FzdOv2K/ixL2LZWDStL8+JgQerI2sa8eAEfoydG9+0V96m7V+P8yE1Q==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.46.3", - "@typescript-eslint/type-utils": "8.46.3", - "@typescript-eslint/utils": "8.46.3", - "@typescript-eslint/visitor-keys": "8.46.3", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.52.0", + "@typescript-eslint/type-utils": "8.52.0", + "@typescript-eslint/utils": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0", + "ignore": "^7.0.5", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2863,7 +2821,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.46.3", + "@typescript-eslint/parser": "^8.52.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -2879,17 +2837,17 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.3.tgz", - "integrity": "sha512-6m1I5RmHBGTnUGS113G04DMu3CpSdxCAU/UvtjNWL4Nuf3MW9tQhiJqRlHzChIkhy6kZSAQmc+I1bcGjE3yNKg==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.52.0.tgz", + "integrity": "sha512-iIACsx8pxRnguSYhHiMn2PvhvfpopO9FXHyn1mG5txZIsAaB6F0KwbFnUQN3KCiG3Jcuad/Cao2FAs1Wp7vAyg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.46.3", - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/typescript-estree": "8.46.3", - "@typescript-eslint/visitor-keys": "8.46.3", - "debug": "^4.3.4" + "@typescript-eslint/scope-manager": "8.52.0", + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/typescript-estree": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2904,15 +2862,15 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.3.tgz", - "integrity": "sha512-Fz8yFXsp2wDFeUElO88S9n4w1I4CWDTXDqDr9gYvZgUpwXQqmZBr9+NTTql5R3J7+hrJZPdpiWaB9VNhAKYLuQ==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.52.0.tgz", + "integrity": "sha512-xD0MfdSdEmeFa3OmVqonHi+Cciab96ls1UhIF/qX/O/gPu5KXD0bY9lu33jj04fjzrXHcuvjBcBC+D3SNSadaw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.46.3", - "@typescript-eslint/types": "^8.46.3", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.52.0", + "@typescript-eslint/types": "^8.52.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2926,14 +2884,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.3.tgz", - "integrity": "sha512-FCi7Y1zgrmxp3DfWfr+3m9ansUUFoy8dkEdeQSgA9gbm8DaHYvZCdkFRQrtKiedFf3Ha6VmoqoAaP68+i+22kg==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.52.0.tgz", + "integrity": "sha512-ixxqmmCcc1Nf8S0mS0TkJ/3LKcC8mruYJPOU6Ia2F/zUUR4pApW7LzrpU3JmtePbRUTes9bEqRc1Gg4iyRnDzA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/visitor-keys": "8.46.3" + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2944,9 +2902,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.3.tgz", - "integrity": "sha512-GLupljMniHNIROP0zE7nCcybptolcH8QZfXOpCfhQDAdwJ/ZTlcaBOYebSOZotpti/3HrHSw7D3PZm75gYFsOA==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.52.0.tgz", + "integrity": "sha512-jl+8fzr/SdzdxWJznq5nvoI7qn2tNYV/ZBAEcaFMVXf+K6jmXvAFrgo/+5rxgnL152f//pDEAYAhhBAZGrVfwg==", "dev": true, "license": "MIT", "engines": { @@ -2961,17 +2919,17 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.3.tgz", - "integrity": "sha512-ZPCADbr+qfz3aiTTYNNkCbUt+cjNwI/5McyANNrFBpVxPt7GqpEYz5ZfdwuFyGUnJ9FdDXbGODUu6iRCI6XRXw==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.52.0.tgz", + "integrity": "sha512-JD3wKBRWglYRQkAtsyGz1AewDu3mTc7NtRjR/ceTyGoPqmdS5oCdx/oZMWD5Zuqmo6/MpsYs0wp6axNt88/2EQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/typescript-estree": "8.46.3", - "@typescript-eslint/utils": "8.46.3", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/typescript-estree": "8.52.0", + "@typescript-eslint/utils": "8.52.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2986,9 +2944,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.3.tgz", - "integrity": "sha512-G7Ok9WN/ggW7e/tOf8TQYMaxgID3Iujn231hfi0Pc7ZheztIJVpO44ekY00b7akqc6nZcvregk0Jpah3kep6hA==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.52.0.tgz", + "integrity": "sha512-LWQV1V4q9V4cT4H5JCIx3481iIFxH1UkVk+ZkGGAV1ZGcjGI9IoFOfg3O6ywz8QqCDEp7Inlg6kovMofsNRaGg==", "dev": true, "license": "MIT", "engines": { @@ -3000,22 +2958,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.3.tgz", - "integrity": "sha512-f/NvtRjOm80BtNM5OQtlaBdM5BRFUv7gf381j9wygDNL+qOYSNOgtQ/DCndiYi80iIOv76QqaTmp4fa9hwI0OA==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.52.0.tgz", + "integrity": "sha512-XP3LClsCc0FsTK5/frGjolyADTh3QmsLp6nKd476xNI9CsSsLnmn4f0jrzNoAulmxlmNIpeXuHYeEQv61Q6qeQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.46.3", - "@typescript-eslint/tsconfig-utils": "8.46.3", - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/visitor-keys": "8.46.3", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" + "@typescript-eslint/project-service": "8.52.0", + "@typescript-eslint/tsconfig-utils": "8.52.0", + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3038,36 +2995,6 @@ "balanced-match": "^1.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -3098,16 +3025,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.3.tgz", - "integrity": "sha512-VXw7qmdkucEx9WkmR3ld/u6VhRyKeiF1uxWwCy/iuNfokjJ7VhsgLSOTjsol8BunSw190zABzpwdNsze2Kpo4g==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.52.0.tgz", + "integrity": "sha512-wYndVMWkweqHpEpwPhwqE2lnD2DxC6WVLupU/DOt/0/v+/+iQbbzO3jOHjmBMnhu0DgLULvOaU4h4pwHYi2oRQ==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.46.3", - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/typescript-estree": "8.46.3" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.52.0", + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/typescript-estree": "8.52.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3122,13 +3049,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.3.tgz", - "integrity": "sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.52.0.tgz", + "integrity": "sha512-ink3/Zofus34nmBsPjow63FP5M7IGff0RKAgqR6+CFpdk22M7aLwC9gOcLGYqr7MczLPzZVERW9hRog3O4n1sQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/types": "8.52.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -3558,6 +3485,7 @@ "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.0.0" }, @@ -3769,9 +3697,9 @@ } }, "node_modules/axe-core": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.0.tgz", - "integrity": "sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.1.tgz", + "integrity": "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==", "dev": true, "license": "MPL-2.0", "engines": { @@ -3806,9 +3734,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.8.25", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.25.tgz", - "integrity": "sha512-2NovHVesVF5TXefsGX1yzx1xgr7+m9JQenvz6FQY3qd+YXkKkYiv+vTCc7OriP9mcDZpTC5mAOYN4ocd29+erA==", + "version": "2.9.14", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.14.tgz", + "integrity": "sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==", "dev": true, "license": "Apache-2.0", "bin": { @@ -3840,9 +3768,9 @@ } }, "node_modules/browserslist": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", - "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, "funding": [ { @@ -3860,11 +3788,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.8.19", - "caniuse-lite": "^1.0.30001751", - "electron-to-chromium": "^1.5.238", - "node-releases": "^2.0.26", - "update-browserslist-db": "^1.1.4" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -3934,9 +3862,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001753", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001753.tgz", - "integrity": "sha512-Bj5H35MD/ebaOV4iDLqPEtiliTN29qkGtEHCwawWn4cYm+bPJM2NsaP30vtZcnERClMzp52J4+aw2UNbK4o+zw==", + "version": "1.0.30001764", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001764.tgz", + "integrity": "sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==", "funding": [ { "type": "opencollective", @@ -4065,9 +3993,9 @@ } }, "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "devOptional": true, "license": "MIT" }, @@ -4308,20 +4236,24 @@ } }, "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", "license": "Apache-2.0", "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, "engines": { - "node": ">=8" + "node": ">=0.10" } }, "node_modules/detect-node-es": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/doctrine": { "version": "2.1.0", @@ -4352,9 +4284,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.245", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.245.tgz", - "integrity": "sha512-rdmGfW47ZhL/oWEJAY4qxRtdly2B98ooTJ0pdEI4jhVLZ6tNf8fPtov2wS1IRKwFJT92le3x4Knxiwzl7cPPpQ==", + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", "dev": true, "license": "ISC" }, @@ -4366,9 +4298,9 @@ "license": "MIT" }, "node_modules/es-abstract": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", - "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", "dev": true, "license": "MIT", "dependencies": { @@ -4455,27 +4387,27 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", - "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz", + "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", - "call-bound": "^1.0.3", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", + "es-abstract": "^1.24.1", "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", + "es-set-tostringtag": "^2.1.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.6", + "get-intrinsic": "^1.3.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.4", + "iterator.prototype": "^1.1.5", "safe-array-concat": "^1.1.3" }, "engines": { @@ -4566,9 +4498,9 @@ } }, "node_modules/eslint": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", - "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", "dependencies": { @@ -4578,7 +4510,7 @@ "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.1", + "@eslint/js": "9.39.2", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -4944,9 +4876,9 @@ } }, "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -5040,9 +4972,9 @@ "license": "MIT" }, "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "dev": true, "license": "ISC", "dependencies": { @@ -5220,6 +5152,7 @@ "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -5325,13 +5258,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, "node_modules/graphql": { "version": "16.12.0", "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.12.0.tgz", @@ -5986,9 +5912,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { @@ -6266,6 +6192,7 @@ "version": "16.0.7", "resolved": "https://registry.npmjs.org/next/-/next-16.0.7.tgz", "integrity": "sha512-3mBRJyPxT4LOxAJI6IsXeFtKfiJUbjCLgvXO02fV8Wy/lIhPvP94Fe7dGhUgHXcQy4sSuYwQNcOLhIfOm0rL0A==", + "deprecated": "This version has a security vulnerability. Please upgrade to a patched version. See https://nextjs.org/blog/security-update-2025-12-11 for more details.", "license": "MIT", "dependencies": { "@next/env": "16.0.7", @@ -6690,9 +6617,9 @@ "license": "MIT" }, "node_modules/react": { - "version": "19.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", - "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", + "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -6703,6 +6630,7 @@ "resolved": "https://registry.npmjs.org/react-contenteditable/-/react-contenteditable-3.3.7.tgz", "integrity": "sha512-GA9NbC0DkDdpN3iGvib/OMHWTJzDX2cfkgy5Tt98JJAbA3kLnyrNbBIpsSpPpq7T8d3scD39DHP+j8mAM7BIfQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "prop-types": "^15.7.1" @@ -6712,15 +6640,15 @@ } }, "node_modules/react-dom": { - "version": "19.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", - "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", "license": "MIT", "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.2.0" + "react": "^19.2.3" } }, "node_modules/react-is": { @@ -6734,6 +6662,7 @@ "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", "license": "MIT", + "peer": true, "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", @@ -6759,6 +6688,7 @@ "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", "license": "MIT", + "peer": true, "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" @@ -6792,6 +6722,7 @@ "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", "license": "MIT", + "peer": true, "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" @@ -7022,9 +6953,9 @@ } }, "node_modules/sass": { - "version": "1.94.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.94.2.tgz", - "integrity": "sha512-N+7WK20/wOr7CzA2snJcUSSNTCzeCGUTFY3OgeQP3mZ1aj9NMQ0mSTXwlrnd89j33zzQJGqIN52GIOmYrfq46A==", + "version": "1.97.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.97.2.tgz", + "integrity": "sha512-y5LWb0IlbO4e97Zr7c3mlpabcbBtS+ieiZ9iwDooShpFKWXf62zz5pEPdwrLYm+Bxn1fnbwFGzHuCLSA9tBmrw==", "license": "MIT", "dependencies": { "chokidar": "^4.0.0", @@ -7107,16 +7038,16 @@ } }, "node_modules/sharp": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.4.tgz", - "integrity": "sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", "hasInstallScript": true, "license": "Apache-2.0", "optional": true, "dependencies": { "@img/colour": "^1.0.0", - "detect-libc": "^2.1.0", - "semver": "^7.7.2" + "detect-libc": "^2.1.2", + "semver": "^7.7.3" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -7125,28 +7056,40 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.4", - "@img/sharp-darwin-x64": "0.34.4", - "@img/sharp-libvips-darwin-arm64": "1.2.3", - "@img/sharp-libvips-darwin-x64": "1.2.3", - "@img/sharp-libvips-linux-arm": "1.2.3", - "@img/sharp-libvips-linux-arm64": "1.2.3", - "@img/sharp-libvips-linux-ppc64": "1.2.3", - "@img/sharp-libvips-linux-s390x": "1.2.3", - "@img/sharp-libvips-linux-x64": "1.2.3", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.3", - "@img/sharp-libvips-linuxmusl-x64": "1.2.3", - "@img/sharp-linux-arm": "0.34.4", - "@img/sharp-linux-arm64": "0.34.4", - "@img/sharp-linux-ppc64": "0.34.4", - "@img/sharp-linux-s390x": "0.34.4", - "@img/sharp-linux-x64": "0.34.4", - "@img/sharp-linuxmusl-arm64": "0.34.4", - "@img/sharp-linuxmusl-x64": "0.34.4", - "@img/sharp-wasm32": "0.34.4", - "@img/sharp-win32-arm64": "0.34.4", - "@img/sharp-win32-ia32": "0.34.4", - "@img/sharp-win32-x64": "0.34.4" + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/sharp/node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" } }, "node_modules/sharp/node_modules/semver": { @@ -7549,9 +7492,9 @@ } }, "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", "dev": true, "license": "MIT", "engines": { @@ -7699,16 +7642,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.3.tgz", - "integrity": "sha512-bAfgMavTuGo+8n6/QQDVQz4tZ4f7Soqg53RbrlZQEoAltYop/XR4RAts/I0BrO3TTClTSTFJ0wYbla+P8cEWJA==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.52.0.tgz", + "integrity": "sha512-atlQQJ2YkO4pfTVQmQ+wvYQwexPDOIgo+RaVcD7gHgzy/IQA+XTyuxNM9M9TVXvttkF7koBHmcwisKdOAf2EcA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.46.3", - "@typescript-eslint/parser": "8.46.3", - "@typescript-eslint/typescript-estree": "8.46.3", - "@typescript-eslint/utils": "8.46.3" + "@typescript-eslint/eslint-plugin": "8.52.0", + "@typescript-eslint/parser": "8.52.0", + "@typescript-eslint/typescript-estree": "8.52.0", + "@typescript-eslint/utils": "8.52.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7784,9 +7727,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", - "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "funding": [ { @@ -7829,6 +7772,7 @@ "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.0.0" }, @@ -7850,6 +7794,7 @@ "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", "license": "MIT", + "peer": true, "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" @@ -8013,9 +7958,9 @@ } }, "node_modules/zod": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz", - "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.5.tgz", + "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==", "dev": true, "license": "MIT", "funding": { diff --git a/package.json b/package.json index cfc9727d..7e730228 100644 --- a/package.json +++ b/package.json @@ -15,12 +15,12 @@ }, "dependencies": { "@apollo/client": "^4.0.9", - "@code0-tech/pictor": "^0.0.0-mvp.31", + "@code0-tech/pictor": "^0.0.0-mvp.32", "graphql": "^16.12.0", "graphql-tag": "^2.12.6", "next": "16.0.7", - "react": "19.2.0", - "react-dom": "19.2.0", + "react": "19.2.3", + "react-dom": "19.2.3", "rxjs": "^7.8.2", "sass": "^1.93.3" }, From 7b2c130faaff06161a94fce342e0b19c48384391 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sun, 11 Jan 2026 22:46:31 +0100 Subject: [PATCH 015/173] feat: update DResizablePanelGroup to use 'orientation' prop for consistency --- src/app/(flow)/layout.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/(flow)/layout.tsx b/src/app/(flow)/layout.tsx index 0cfc5fd8..2038e759 100644 --- a/src/app/(flow)/layout.tsx +++ b/src/app/(flow)/layout.tsx @@ -100,8 +100,8 @@ const ApplicationLayout: React.FC = ({children, bar, tab }> - - + + }> - - - + + + {show && ( <> - - + + )} From fad96f5f94261506e37b7b1ba6f258d4176188d8 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sun, 11 Jan 2026 22:46:40 +0100 Subject: [PATCH 017/173] feat: remove unnecessary 'order' prop from DResizablePanel component --- .../(flow)/namespace/[namespaceId]/project/[projectId]/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/page.tsx b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/page.tsx index 775838a8..c2dae0ff 100644 --- a/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/page.tsx +++ b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/page.tsx @@ -18,7 +18,7 @@ export default function Page() { const [show, setShow] = React.useState(false); - return + return Date: Sun, 11 Jan 2026 22:57:39 +0100 Subject: [PATCH 018/173] feat: update DResizablePanel defaultSize to use percentage values for consistency --- src/app/(flow)/layout.tsx | 2 +- .../[namespaceId]/project/[projectId]/flow/[flowId]/page.tsx | 2 +- src/app/layout.tsx | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/app/(flow)/layout.tsx b/src/app/(flow)/layout.tsx index 2038e759..8acc260c 100644 --- a/src/app/(flow)/layout.tsx +++ b/src/app/(flow)/layout.tsx @@ -101,7 +101,7 @@ const ApplicationLayout: React.FC = ({children, bar, tab }> - + From 84b325b3126b552fa339705fad3dca0d08a875cd Mon Sep 17 00:00:00 2001 From: nicosammito Date: Mon, 12 Jan 2026 20:25:41 +0100 Subject: [PATCH 032/173] feat: enhance PersonalProjectsView to navigate to project details on selection --- .../dashboard/personal-project/PersonalProjectsView.tsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/packages/ce/src/dashboard/personal-project/PersonalProjectsView.tsx b/src/packages/ce/src/dashboard/personal-project/PersonalProjectsView.tsx index 9eeb08cd..c2ccb3b7 100644 --- a/src/packages/ce/src/dashboard/personal-project/PersonalProjectsView.tsx +++ b/src/packages/ce/src/dashboard/personal-project/PersonalProjectsView.tsx @@ -5,17 +5,17 @@ import { Flex, Spacing, Text, - TextInput, useService, useStore, useUserSession } from "@code0-tech/pictor"; import {UserService} from "@edition/user/User.service"; -import {IconSearch} from "@tabler/icons-react"; import Link from "next/link"; +import {useRouter} from "next/navigation"; export const PersonalProjectsView: React.FC = () => { + const router = useRouter() const userSession = useUserSession() const userStore = useStore(UserService) const userService = useService(UserService) @@ -26,7 +26,10 @@ export const PersonalProjectsView: React.FC = () => { const projectsList = React.useMemo(() => { if (!currentUser || !currentUser.namespace) return null - return + return { + const number = project.id?.match(/NamespaceProject\/(\d+)$/)?.[1] + router.push(`/namespace/${namespaceIndex}/project/${number}`) + }} namespaceId={currentUser.namespace.id}/> }, [currentUser]) From e7dc35492e6df7ba9cefd4e271d310ea393faea9 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Mon, 12 Jan 2026 22:54:04 +0100 Subject: [PATCH 033/173] feat: add aria-selected attribute to button for improved accessibility --- .../[namespaceId]/project/[projectId]/flow/[flowId]/page.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/[flowId]/page.tsx b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/[flowId]/page.tsx index 2be38184..4426a63e 100644 --- a/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/[flowId]/page.tsx +++ b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/[flowId]/page.tsx @@ -15,12 +15,13 @@ import React from "react"; import {IconDatabase, IconFile, IconMessageChatbot} from "@tabler/icons-react"; export default function Page() { + const [show, setShow] = React.useState(false); return - @@ -123,7 +138,8 @@ const ApplicationLayout: React.FC = ({children, bar, tab - @@ -136,7 +152,8 @@ const ApplicationLayout: React.FC = ({children, bar, tab - @@ -151,7 +168,11 @@ const ApplicationLayout: React.FC = ({children, bar, tab }>
- { + const number = flow.id?.match(/Flow\/(\d+)$/)?.[1] + router.push(`/namespace/${namespaceIndex}/project/${projectIndex}/flow/${number}`) + }} namespaceId={`gid://sagittarius/Namespace/${namespaceIndex}`} projectId={`gid://sagittarius/NamespaceProject/${projectIndex}`}/>
From 847475f2695b4afca0b44788260bca99b8e21eeb Mon Sep 17 00:00:00 2001 From: nicosammito Date: Mon, 12 Jan 2026 22:59:03 +0100 Subject: [PATCH 035/173] feat: refactor useMemo to use useEffect for flow and function value updates --- src/app/(flow)/layout.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/(flow)/layout.tsx b/src/app/(flow)/layout.tsx index 1627ec95..fee35ccf 100644 --- a/src/app/(flow)/layout.tsx +++ b/src/app/(flow)/layout.tsx @@ -90,7 +90,7 @@ const ApplicationLayout: React.FC = ({children, bar, tab const runtimeId = React.useMemo(() => project[1].getById(projectId, {namespaceId})?.primaryRuntime?.id, [projectId, project[0], namespaceId]) - React.useMemo(() => { + React.useEffect(() => { flow[1].values({namespaceId, projectId}) functions[1].values({namespaceId, projectId, runtimeId}) datatype[1].values({namespaceId, projectId, runtimeId}) From 92e3eb09c8cf31e9b9999e92a1686d29dd24fbc8 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Mon, 12 Jan 2026 23:33:03 +0100 Subject: [PATCH 036/173] feat: add FlowType GraphQL fragment for flow data representation --- .../fragments/FlowType.fragment.graphql | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/packages/ce/src/flowtype/fragments/FlowType.fragment.graphql diff --git a/src/packages/ce/src/flowtype/fragments/FlowType.fragment.graphql b/src/packages/ce/src/flowtype/fragments/FlowType.fragment.graphql new file mode 100644 index 00000000..4029eb03 --- /dev/null +++ b/src/packages/ce/src/flowtype/fragments/FlowType.fragment.graphql @@ -0,0 +1,32 @@ +fragment FlowType on FlowType { + __typename + id + updatedAt + createdAt + identifier + names { + code + content + __typename + } + aliases { + code + content + __typename + } + displayMessages { + code + content + __typename + } + descriptions { + code + content + __typename + } + runtime { + id + } + editable + +} \ No newline at end of file From 3884e642af964e72cef8ba5c43e3f573774e48f7 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Mon, 12 Jan 2026 23:33:09 +0100 Subject: [PATCH 037/173] feat: implement flow type filtering and querying in FlowtypeService --- .../ce/src/flowtype/Flowtype.service.ts | 47 ++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/src/packages/ce/src/flowtype/Flowtype.service.ts b/src/packages/ce/src/flowtype/Flowtype.service.ts index f9e5d4fd..bab09aef 100644 --- a/src/packages/ce/src/flowtype/Flowtype.service.ts +++ b/src/packages/ce/src/flowtype/Flowtype.service.ts @@ -1,13 +1,58 @@ -import {DFlowTypeReactiveService, FlowTypeView, ReactiveArrayStore} from "@code0-tech/pictor"; +import { + DFlowTypeDependencies, + DFlowTypeReactiveService, + FlowTypeView, FunctionDefinitionView, + ReactiveArrayStore +} from "@code0-tech/pictor"; import {GraphqlClient} from "@core/util/graphql-client"; +import {FlowType, FunctionDefinition, Query} from "@code0-tech/sagittarius-graphql-types"; +import flowTypesQuery from "@edition/flowtype/queries/FlowTypes.query.graphql" export class FlowtypeService extends DFlowTypeReactiveService { private readonly client: GraphqlClient + private i = 0 constructor(client: GraphqlClient, store: ReactiveArrayStore) { super(store) this.client = client } + values(dependencies?: DFlowTypeDependencies): FlowTypeView[] { + const functions = super.values() + if (!dependencies?.namespaceId || !dependencies.projectId || !dependencies.runtimeId) return functions + + const namespaceId = dependencies.namespaceId + const projectId = dependencies.projectId + const runtimeId = dependencies.runtimeId + const filtered = functions.filter(flowType => flowType) //TODO: add runtime filter when available + + if (filtered.length <= 0) { + this.client.query({ + query: flowTypesQuery, + variables: { + namespaceId: namespaceId, + projectId: projectId, + + firstFlowType: 50, + afterFlowType: null, + } + }).then(res => { + const nodes = res.data?.namespace?.project?.primaryRuntime?.flowTypes?.nodes ?? [] + nodes.forEach(flowType => { + if (flowType && !this.hasById(flowType.id)) { + this.set(this.i++, new FlowTypeView(flowType)) + } + }) + }) + } + + return filtered + } + + hasById(id: FlowType["id"]): boolean { + const flowType = super.values().find(f => f.id === id) + return flowType !== undefined + } + } \ No newline at end of file From 76b880d1b196ce6325e4588367aa65090c2176aa Mon Sep 17 00:00:00 2001 From: nicosammito Date: Mon, 12 Jan 2026 23:33:14 +0100 Subject: [PATCH 038/173] feat: add FlowTypes GraphQL query for fetching flow types with pagination --- .../flowtype/queries/FlowTypes.query.graphql | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/packages/ce/src/flowtype/queries/FlowTypes.query.graphql diff --git a/src/packages/ce/src/flowtype/queries/FlowTypes.query.graphql b/src/packages/ce/src/flowtype/queries/FlowTypes.query.graphql new file mode 100644 index 00000000..5a94bc26 --- /dev/null +++ b/src/packages/ce/src/flowtype/queries/FlowTypes.query.graphql @@ -0,0 +1,25 @@ +#import "../fragments/FlowType.fragment.graphql" + +query FlowTypes ( + $namespaceId: NamespaceID! + $projectId: NamespaceProjectID! + $firstFlowType: Int! + $afterFlowType: String +) { + namespace(id: $namespaceId) { + project(id: $projectId) { + primaryRuntime { + flowTypes (first: $firstFlowType, after: $afterFlowType) { + count + nodes { + ...FlowType + } + pageInfo { + endCursor + hasNextPage + } + } + } + } + } +} \ No newline at end of file From 046499de4443d1023803bc1aa59f4e4ddf7e613b Mon Sep 17 00:00:00 2001 From: nicosammito Date: Mon, 12 Jan 2026 23:33:18 +0100 Subject: [PATCH 039/173] feat: add pagination support to Functions GraphQL query with pageInfo --- src/packages/ce/src/function/queries/Functions.query.graphql | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/packages/ce/src/function/queries/Functions.query.graphql b/src/packages/ce/src/function/queries/Functions.query.graphql index cf381cc6..55301aeb 100644 --- a/src/packages/ce/src/function/queries/Functions.query.graphql +++ b/src/packages/ce/src/function/queries/Functions.query.graphql @@ -18,6 +18,10 @@ query Functions ( nodes { ...Function } + pageInfo { + endCursor + hasNextPage + } } } } From 6081a294600e19170de20d35f1f8fa5a22989a4b Mon Sep 17 00:00:00 2001 From: nicosammito Date: Tue, 13 Jan 2026 10:26:03 +0100 Subject: [PATCH 040/173] feat: add pagination support to Functions GraphQL query with pageInfo --- src/app/(flow)/layout.tsx | 4 ++-- .../{Flowtype.service.ts => FlowTypeService.ts} | 11 +++-------- 2 files changed, 5 insertions(+), 10 deletions(-) rename src/packages/ce/src/flowtype/{Flowtype.service.ts => FlowTypeService.ts} (84%) diff --git a/src/app/(flow)/layout.tsx b/src/app/(flow)/layout.tsx index fee35ccf..152dee6b 100644 --- a/src/app/(flow)/layout.tsx +++ b/src/app/(flow)/layout.tsx @@ -45,7 +45,7 @@ import {Flow, Namespace, NamespaceProject} from "@code0-tech/sagittarius-graphql import {FlowService} from "@edition/flow/Flow.service"; import {FunctionService} from "@edition/function/Function.service"; import {DatatypeService} from "@edition/datatype/Datatype.service"; -import {FlowtypeService} from "@edition/flowtype/Flowtype.service"; +import {FlowTypeService} from "@edition/flowtype/FlowTypeService"; import {FileTabsView} from "@code0-tech/pictor/dist/components/file-tabs/FileTabs.view"; import {FileTabsService} from "@code0-tech/pictor/dist/components/file-tabs/FileTabs.service"; import {IconArrowsMaximize, IconArrowsMinimize, IconCircleDot} from "@tabler/icons-react"; @@ -82,7 +82,7 @@ const ApplicationLayout: React.FC = ({children, bar, tab const flow = usePersistentReactiveArrayService(`dashboard::flows::${currentSession?.id}`, (store: ReactiveArrayStore) => new FlowService(graphqlClient, store)) const functions = usePersistentReactiveArrayService(`dashboard::functions::${currentSession?.id}`, (store: ReactiveArrayStore) => new FunctionService(graphqlClient, store)) const datatype = usePersistentReactiveArrayService(`dashboard::datatypes::${currentSession?.id}`, (store: ReactiveArrayStore) => new DatatypeService(graphqlClient, store)) - const flowtype = usePersistentReactiveArrayService(`dashboard::flowtypes::${currentSession?.id}`, (store: ReactiveArrayStore) => new FlowtypeService(graphqlClient, store)) + const flowtype = usePersistentReactiveArrayService(`dashboard::flowtypes::${currentSession?.id}`, (store: ReactiveArrayStore) => new FlowTypeService(graphqlClient, store)) const file = usePersistentReactiveArrayService(`dashboard::files::${currentSession?.id}`, FileTabsService, []) diff --git a/src/packages/ce/src/flowtype/Flowtype.service.ts b/src/packages/ce/src/flowtype/FlowTypeService.ts similarity index 84% rename from src/packages/ce/src/flowtype/Flowtype.service.ts rename to src/packages/ce/src/flowtype/FlowTypeService.ts index bab09aef..7e0ce4c8 100644 --- a/src/packages/ce/src/flowtype/Flowtype.service.ts +++ b/src/packages/ce/src/flowtype/FlowTypeService.ts @@ -1,14 +1,9 @@ -import { - DFlowTypeDependencies, - DFlowTypeReactiveService, - FlowTypeView, FunctionDefinitionView, - ReactiveArrayStore -} from "@code0-tech/pictor"; +import {DFlowTypeDependencies, DFlowTypeReactiveService, FlowTypeView, ReactiveArrayStore} from "@code0-tech/pictor"; import {GraphqlClient} from "@core/util/graphql-client"; -import {FlowType, FunctionDefinition, Query} from "@code0-tech/sagittarius-graphql-types"; +import {FlowType, Query} from "@code0-tech/sagittarius-graphql-types"; import flowTypesQuery from "@edition/flowtype/queries/FlowTypes.query.graphql" -export class FlowtypeService extends DFlowTypeReactiveService { +export class FlowTypeService extends DFlowTypeReactiveService { private readonly client: GraphqlClient private i = 0 From b7d133fa76466d1e4f0e3b4f10aa54197f51c95e Mon Sep 17 00:00:00 2001 From: nicosammito Date: Tue, 13 Jan 2026 13:45:11 +0100 Subject: [PATCH 041/173] feat: update user service usage to utilize useStore in ApplicationBarView --- .../ce/src/dashboard/application/ApplicationBarView.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/packages/ce/src/dashboard/application/ApplicationBarView.tsx b/src/packages/ce/src/dashboard/application/ApplicationBarView.tsx index 47b74795..38381411 100644 --- a/src/packages/ce/src/dashboard/application/ApplicationBarView.tsx +++ b/src/packages/ce/src/dashboard/application/ApplicationBarView.tsx @@ -8,7 +8,7 @@ import { MenuItem, MenuSeparator, TextInput, - useService, + useService, useStore, useUserSession } from "@code0-tech/pictor"; import {UserService} from "@edition/user/User.service"; @@ -24,7 +24,7 @@ export const ApplicationBarView: React.FC = () => { const currentSession = useUserSession() const userService = useService(UserService) - const userStore = useService(UserService) + const userStore = useStore(UserService) const router = useRouter() const [loading, startTransition] = React.useTransition() From bef021e88618b05a2085c974bddc766f6633ee76 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Wed, 14 Jan 2026 17:51:54 +0100 Subject: [PATCH 042/173] feat: update DLayout components to include layoutGap for improved spacing --- src/app/(flow)/layout.tsx | 4 ++-- .../[namespaceId]/project/[projectId]/flow/[flowId]/page.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/(flow)/layout.tsx b/src/app/(flow)/layout.tsx index 152dee6b..11ca5877 100644 --- a/src/app/(flow)/layout.tsx +++ b/src/app/(flow)/layout.tsx @@ -101,7 +101,7 @@ const ApplicationLayout: React.FC = ({children, bar, tab return -
= ({children, bar, tab - - - - - - - - - Open active flow - - - - - - - - - - - Close all - - - - - - - - - - - Open all - - - - - - - }> -
- { - const number = flow.id?.match(/Flow\/(\d+)$/)?.[1] - router.push(`/namespace/${namespaceIndex}/project/${projectIndex}/flow/${number}`) - }} - namespaceId={`gid://sagittarius/Namespace/${namespaceIndex}`} - projectId={`gid://sagittarius/NamespaceProject/${projectIndex}`}/> -
-
+
{children} diff --git a/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/[flowId]/page.tsx b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/[flowId]/page.tsx index 3bc62bc4..75093dff 100644 --- a/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/[flowId]/page.tsx +++ b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/[flowId]/page.tsx @@ -13,15 +13,23 @@ import { } from "@code0-tech/pictor"; import React from "react"; import {IconDatabase, IconFile, IconMessageChatbot} from "@tabler/icons-react"; +import {useParams} from "next/navigation"; +import {Flow} from "@code0-tech/sagittarius-graphql-types"; export default function Page() { + const params = useParams() + + const flowIndex = params.flowId as any as number + const flowId: Flow['id'] = `gid://sagittarius/Flow/${flowIndex}` + const [show, setShow] = React.useState(false); return - }> - + - + {show && ( <> - + )} diff --git a/src/packages/ce/src/auth/UserEmailVerificationPage.tsx b/src/packages/ce/src/ui-auth/UserEmailVerificationPage.tsx similarity index 100% rename from src/packages/ce/src/auth/UserEmailVerificationPage.tsx rename to src/packages/ce/src/ui-auth/UserEmailVerificationPage.tsx diff --git a/src/packages/ce/src/auth/UserForgotPasswordPage.tsx b/src/packages/ce/src/ui-auth/UserForgotPasswordPage.tsx similarity index 100% rename from src/packages/ce/src/auth/UserForgotPasswordPage.tsx rename to src/packages/ce/src/ui-auth/UserForgotPasswordPage.tsx diff --git a/src/packages/ce/src/auth/UserLoginPage.tsx b/src/packages/ce/src/ui-auth/UserLoginPage.tsx similarity index 100% rename from src/packages/ce/src/auth/UserLoginPage.tsx rename to src/packages/ce/src/ui-auth/UserLoginPage.tsx diff --git a/src/packages/ce/src/auth/UserRegistrationPage.tsx b/src/packages/ce/src/ui-auth/UserRegistrationPage.tsx similarity index 100% rename from src/packages/ce/src/auth/UserRegistrationPage.tsx rename to src/packages/ce/src/ui-auth/UserRegistrationPage.tsx diff --git a/src/packages/ce/src/auth/UserResetPasswordPage.tsx b/src/packages/ce/src/ui-auth/UserResetPasswordPage.tsx similarity index 100% rename from src/packages/ce/src/auth/UserResetPasswordPage.tsx rename to src/packages/ce/src/ui-auth/UserResetPasswordPage.tsx diff --git a/src/packages/ce/src/dashboard/application/ApplicationBarView.tsx b/src/packages/ce/src/ui-dashboard/application/ApplicationBarView.tsx similarity index 96% rename from src/packages/ce/src/dashboard/application/ApplicationBarView.tsx rename to src/packages/ce/src/ui-dashboard/application/ApplicationBarView.tsx index 38381411..35a0224b 100644 --- a/src/packages/ce/src/dashboard/application/ApplicationBarView.tsx +++ b/src/packages/ce/src/ui-dashboard/application/ApplicationBarView.tsx @@ -18,7 +18,7 @@ import DUserMenu from "@code0-tech/pictor/dist/components/d-user/DUserMenu"; import Link from "next/link"; import {IconBuilding, IconFolders, IconInbox, IconLogout, IconSearch} from "@tabler/icons-react"; import Image from "next/image"; -import {ApplicationBreadcrumbView} from "@edition/dashboard/application/ApplicationBreadcrumbView"; +import {ApplicationBreadcrumbView} from "@edition/ui-dashboard/application/ApplicationBreadcrumbView"; export const ApplicationBarView: React.FC = () => { diff --git a/src/packages/ce/src/dashboard/application/ApplicationBreadcrumbView.tsx b/src/packages/ce/src/ui-dashboard/application/ApplicationBreadcrumbView.tsx similarity index 100% rename from src/packages/ce/src/dashboard/application/ApplicationBreadcrumbView.tsx rename to src/packages/ce/src/ui-dashboard/application/ApplicationBreadcrumbView.tsx diff --git a/src/packages/ce/src/dashboard/application/ApplicationPage.tsx b/src/packages/ce/src/ui-dashboard/application/ApplicationPage.tsx similarity index 52% rename from src/packages/ce/src/dashboard/application/ApplicationPage.tsx rename to src/packages/ce/src/ui-dashboard/application/ApplicationPage.tsx index 304d6e78..0f9da314 100644 --- a/src/packages/ce/src/dashboard/application/ApplicationPage.tsx +++ b/src/packages/ce/src/ui-dashboard/application/ApplicationPage.tsx @@ -1,5 +1,5 @@ -import {PersonalProjectsView} from "@edition/dashboard/personal-project/PersonalProjectsView"; -import {OrganizationsView} from "@edition/dashboard/organization/OrganizationsView"; +import {PersonalProjectsView} from "@edition/ui-dashboard/personal-project/PersonalProjectsView"; +import {OrganizationsView} from "@edition/ui-dashboard/organization/OrganizationsView"; import {Spacing} from "@code0-tech/pictor"; export const ApplicationPage = () => { diff --git a/src/packages/ce/src/dashboard/application/ApplicationSettingsPage.tsx b/src/packages/ce/src/ui-dashboard/application/ApplicationSettingsPage.tsx similarity index 100% rename from src/packages/ce/src/dashboard/application/ApplicationSettingsPage.tsx rename to src/packages/ce/src/ui-dashboard/application/ApplicationSettingsPage.tsx diff --git a/src/packages/ce/src/dashboard/application/ApplicationTabView.tsx b/src/packages/ce/src/ui-dashboard/application/ApplicationTabView.tsx similarity index 100% rename from src/packages/ce/src/dashboard/application/ApplicationTabView.tsx rename to src/packages/ce/src/ui-dashboard/application/ApplicationTabView.tsx diff --git a/src/packages/ce/src/dashboard/member/MemberAddPage.tsx b/src/packages/ce/src/ui-dashboard/member/MemberAddPage.tsx similarity index 100% rename from src/packages/ce/src/dashboard/member/MemberAddPage.tsx rename to src/packages/ce/src/ui-dashboard/member/MemberAddPage.tsx diff --git a/src/packages/ce/src/dashboard/member/MembersPage.tsx b/src/packages/ce/src/ui-dashboard/member/MembersPage.tsx similarity index 61% rename from src/packages/ce/src/dashboard/member/MembersPage.tsx rename to src/packages/ce/src/ui-dashboard/member/MembersPage.tsx index a201120d..17f7a9e0 100644 --- a/src/packages/ce/src/dashboard/member/MembersPage.tsx +++ b/src/packages/ce/src/ui-dashboard/member/MembersPage.tsx @@ -1,6 +1,6 @@ "use client" -import {MembersView} from "@edition/dashboard/member/MembersView"; +import {MembersView} from "@edition/ui-dashboard/member/MembersView"; import React from "react"; export const MembersPage: React.FC = () => { diff --git a/src/packages/ce/src/dashboard/member/MembersView.tsx b/src/packages/ce/src/ui-dashboard/member/MembersView.tsx similarity index 100% rename from src/packages/ce/src/dashboard/member/MembersView.tsx rename to src/packages/ce/src/ui-dashboard/member/MembersView.tsx diff --git a/src/packages/ce/src/dashboard/namespace/NamespaceOverviewLeftView.tsx b/src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewLeftView.tsx similarity index 100% rename from src/packages/ce/src/dashboard/namespace/NamespaceOverviewLeftView.tsx rename to src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewLeftView.tsx diff --git a/src/packages/ce/src/dashboard/namespace/NamespaceOverviewPage.tsx b/src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewPage.tsx similarity index 76% rename from src/packages/ce/src/dashboard/namespace/NamespaceOverviewPage.tsx rename to src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewPage.tsx index d09fceea..acee8915 100644 --- a/src/packages/ce/src/dashboard/namespace/NamespaceOverviewPage.tsx +++ b/src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewPage.tsx @@ -1,10 +1,10 @@ "use client" import React from "react"; -import {NamespaceProjectsView} from "@edition/dashboard/namespace/NamespaceProjectsView"; +import {NamespaceProjectsView} from "@edition/ui-dashboard/namespace/NamespaceProjectsView"; import {DLayout, useService, useStore, useUserSession} from "@code0-tech/pictor"; -import {NamespaceOverviewRightView} from "@edition/dashboard/namespace/NamespaceOverviewRightView"; -import {NamespaceOverviewLeftView} from "@edition/dashboard/namespace/NamespaceOverviewLeftView"; +import {NamespaceOverviewRightView} from "@edition/ui-dashboard/namespace/NamespaceOverviewRightView"; +import {NamespaceOverviewLeftView} from "@edition/ui-dashboard/namespace/NamespaceOverviewLeftView"; import {useParams} from "next/navigation"; import {UserService} from "@edition/user/User.service"; diff --git a/src/packages/ce/src/dashboard/namespace/NamespaceOverviewRightView.tsx b/src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewRightView.tsx similarity index 100% rename from src/packages/ce/src/dashboard/namespace/NamespaceOverviewRightView.tsx rename to src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewRightView.tsx diff --git a/src/packages/ce/src/dashboard/namespace/NamespaceProjectsCreatePage.tsx b/src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsCreatePage.tsx similarity index 100% rename from src/packages/ce/src/dashboard/namespace/NamespaceProjectsCreatePage.tsx rename to src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsCreatePage.tsx diff --git a/src/packages/ce/src/dashboard/namespace/NamespaceProjectsPage.tsx b/src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsPage.tsx similarity index 59% rename from src/packages/ce/src/dashboard/namespace/NamespaceProjectsPage.tsx rename to src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsPage.tsx index c66e04c2..496054f6 100644 --- a/src/packages/ce/src/dashboard/namespace/NamespaceProjectsPage.tsx +++ b/src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsPage.tsx @@ -1,6 +1,6 @@ "use client" -import {NamespaceProjectsView} from "@edition/dashboard/namespace/NamespaceProjectsView"; +import {NamespaceProjectsView} from "@edition/ui-dashboard/namespace/NamespaceProjectsView"; import React from "react"; export const NamespaceProjectsPage: React.FC = () => { diff --git a/src/packages/ce/src/dashboard/namespace/NamespaceProjectsView.tsx b/src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsView.tsx similarity index 100% rename from src/packages/ce/src/dashboard/namespace/NamespaceProjectsView.tsx rename to src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsView.tsx diff --git a/src/packages/ce/src/dashboard/namespace/NamespaceTabView.tsx b/src/packages/ce/src/ui-dashboard/namespace/NamespaceTabView.tsx similarity index 100% rename from src/packages/ce/src/dashboard/namespace/NamespaceTabView.tsx rename to src/packages/ce/src/ui-dashboard/namespace/NamespaceTabView.tsx diff --git a/src/packages/ce/src/dashboard/organization/OrganizationCreatePage.tsx b/src/packages/ce/src/ui-dashboard/organization/OrganizationCreatePage.tsx similarity index 100% rename from src/packages/ce/src/dashboard/organization/OrganizationCreatePage.tsx rename to src/packages/ce/src/ui-dashboard/organization/OrganizationCreatePage.tsx diff --git a/src/packages/ce/src/dashboard/organization/OrganizationDeleteView.tsx b/src/packages/ce/src/ui-dashboard/organization/OrganizationDeleteView.tsx similarity index 100% rename from src/packages/ce/src/dashboard/organization/OrganizationDeleteView.tsx rename to src/packages/ce/src/ui-dashboard/organization/OrganizationDeleteView.tsx diff --git a/src/packages/ce/src/dashboard/organization/OrganizationGeneralSettingsView.tsx b/src/packages/ce/src/ui-dashboard/organization/OrganizationGeneralSettingsView.tsx similarity index 100% rename from src/packages/ce/src/dashboard/organization/OrganizationGeneralSettingsView.tsx rename to src/packages/ce/src/ui-dashboard/organization/OrganizationGeneralSettingsView.tsx diff --git a/src/packages/ce/src/dashboard/organization/OrganizationSettingsPage.tsx b/src/packages/ce/src/ui-dashboard/organization/OrganizationSettingsPage.tsx similarity index 93% rename from src/packages/ce/src/dashboard/organization/OrganizationSettingsPage.tsx rename to src/packages/ce/src/ui-dashboard/organization/OrganizationSettingsPage.tsx index 48ccaff8..daed5fa7 100644 --- a/src/packages/ce/src/dashboard/organization/OrganizationSettingsPage.tsx +++ b/src/packages/ce/src/ui-dashboard/organization/OrganizationSettingsPage.tsx @@ -19,10 +19,10 @@ import {NamespaceService} from "@edition/namespace/Namespace.service"; import {OrganizationService} from "@edition/organization/Organization.service"; import {IconFolders, IconServer, IconUserCog, IconUsers} from "@tabler/icons-react"; import {Tab, TabContent, TabList, TabTrigger} from "@code0-tech/pictor/dist/components/tab/Tab"; -import {UsageView} from "@edition/dashboard/usage/UsageView"; -import {OrganizationUpgradeView} from "@edition/dashboard/organization/OrganizationUpgradeView"; -import {OrganizationDeleteView} from "@edition/dashboard/organization/OrganizationDeleteView"; -import {OrganizationGeneralSettingsView} from "@edition/dashboard/organization/OrganizationGeneralSettingsView"; +import {UsageView} from "@edition/ui-dashboard/usage/UsageView"; +import {OrganizationUpgradeView} from "@edition/ui-dashboard/organization/OrganizationUpgradeView"; +import {OrganizationDeleteView} from "@edition/ui-dashboard/organization/OrganizationDeleteView"; +import {OrganizationGeneralSettingsView} from "@edition/ui-dashboard/organization/OrganizationGeneralSettingsView"; export const OrganizationSettingsPage: React.FC = () => { diff --git a/src/packages/ce/src/dashboard/organization/OrganizationUpgradeView.tsx b/src/packages/ce/src/ui-dashboard/organization/OrganizationUpgradeView.tsx similarity index 100% rename from src/packages/ce/src/dashboard/organization/OrganizationUpgradeView.tsx rename to src/packages/ce/src/ui-dashboard/organization/OrganizationUpgradeView.tsx diff --git a/src/packages/ce/src/dashboard/organization/OrganizationsPage.tsx b/src/packages/ce/src/ui-dashboard/organization/OrganizationsPage.tsx similarity index 56% rename from src/packages/ce/src/dashboard/organization/OrganizationsPage.tsx rename to src/packages/ce/src/ui-dashboard/organization/OrganizationsPage.tsx index cf663f27..3be1ad1c 100644 --- a/src/packages/ce/src/dashboard/organization/OrganizationsPage.tsx +++ b/src/packages/ce/src/ui-dashboard/organization/OrganizationsPage.tsx @@ -1,7 +1,7 @@ "use client" import React from "react"; -import {OrganizationsView} from "@edition/dashboard/organization/OrganizationsView"; +import {OrganizationsView} from "@edition/ui-dashboard/organization/OrganizationsView"; export const OrganizationsPage = () => { return diff --git a/src/packages/ce/src/dashboard/organization/OrganizationsView.tsx b/src/packages/ce/src/ui-dashboard/organization/OrganizationsView.tsx similarity index 100% rename from src/packages/ce/src/dashboard/organization/OrganizationsView.tsx rename to src/packages/ce/src/ui-dashboard/organization/OrganizationsView.tsx diff --git a/src/packages/ce/src/dashboard/personal-project/PersonalProjectsView.tsx b/src/packages/ce/src/ui-dashboard/personal-project/PersonalProjectsView.tsx similarity index 100% rename from src/packages/ce/src/dashboard/personal-project/PersonalProjectsView.tsx rename to src/packages/ce/src/ui-dashboard/personal-project/PersonalProjectsView.tsx diff --git a/src/packages/ce/src/dashboard/role/RoleCreatePage.tsx b/src/packages/ce/src/ui-dashboard/role/RoleCreatePage.tsx similarity index 100% rename from src/packages/ce/src/dashboard/role/RoleCreatePage.tsx rename to src/packages/ce/src/ui-dashboard/role/RoleCreatePage.tsx diff --git a/src/packages/ce/src/dashboard/role/RoleDeleteView.tsx b/src/packages/ce/src/ui-dashboard/role/RoleDeleteView.tsx similarity index 100% rename from src/packages/ce/src/dashboard/role/RoleDeleteView.tsx rename to src/packages/ce/src/ui-dashboard/role/RoleDeleteView.tsx diff --git a/src/packages/ce/src/dashboard/role/RoleGeneralAdjustmentView.tsx b/src/packages/ce/src/ui-dashboard/role/RoleGeneralAdjustmentView.tsx similarity index 100% rename from src/packages/ce/src/dashboard/role/RoleGeneralAdjustmentView.tsx rename to src/packages/ce/src/ui-dashboard/role/RoleGeneralAdjustmentView.tsx diff --git a/src/packages/ce/src/dashboard/role/RolePermissionView.tsx b/src/packages/ce/src/ui-dashboard/role/RolePermissionView.tsx similarity index 100% rename from src/packages/ce/src/dashboard/role/RolePermissionView.tsx rename to src/packages/ce/src/ui-dashboard/role/RolePermissionView.tsx diff --git a/src/packages/ce/src/dashboard/role/RoleProjectView.tsx b/src/packages/ce/src/ui-dashboard/role/RoleProjectView.tsx similarity index 100% rename from src/packages/ce/src/dashboard/role/RoleProjectView.tsx rename to src/packages/ce/src/ui-dashboard/role/RoleProjectView.tsx diff --git a/src/packages/ce/src/dashboard/role/RoleSettingsPage.tsx b/src/packages/ce/src/ui-dashboard/role/RoleSettingsPage.tsx similarity index 90% rename from src/packages/ce/src/dashboard/role/RoleSettingsPage.tsx rename to src/packages/ce/src/ui-dashboard/role/RoleSettingsPage.tsx index aefbe339..87f32eb0 100644 --- a/src/packages/ce/src/dashboard/role/RoleSettingsPage.tsx +++ b/src/packages/ce/src/ui-dashboard/role/RoleSettingsPage.tsx @@ -6,10 +6,10 @@ import {useParams} from "next/navigation"; import {Button, DLayout, Flex, Spacing, Text, useService, useStore} from "@code0-tech/pictor"; import {RoleService} from "@edition/role/Role.service"; import {Tab, TabList, TabTrigger} from "@code0-tech/pictor/dist/components/tab/Tab"; -import {RoleProjectView} from "@edition/dashboard/role/RoleProjectView"; -import {RolePermissionView} from "@edition/dashboard/role/RolePermissionView"; -import {RoleGeneralAdjustmentView} from "@edition/dashboard/role/RoleGeneralAdjustmentView"; -import {RoleDeleteView} from "@edition/dashboard/role/RoleDeleteView"; +import {RoleProjectView} from "@edition/ui-dashboard/role/RoleProjectView"; +import {RolePermissionView} from "@edition/ui-dashboard/role/RolePermissionView"; +import {RoleGeneralAdjustmentView} from "@edition/ui-dashboard/role/RoleGeneralAdjustmentView"; +import {RoleDeleteView} from "@edition/ui-dashboard/role/RoleDeleteView"; export const RoleSettingsPage: React.FC = () => { diff --git a/src/packages/ce/src/dashboard/role/RolesPage.tsx b/src/packages/ce/src/ui-dashboard/role/RolesPage.tsx similarity index 63% rename from src/packages/ce/src/dashboard/role/RolesPage.tsx rename to src/packages/ce/src/ui-dashboard/role/RolesPage.tsx index 0d93b4b7..635c82b5 100644 --- a/src/packages/ce/src/dashboard/role/RolesPage.tsx +++ b/src/packages/ce/src/ui-dashboard/role/RolesPage.tsx @@ -1,7 +1,7 @@ "use client" import React from "react"; -import {RolesView} from "@edition/dashboard/role/RolesView"; +import {RolesView} from "@edition/ui-dashboard/role/RolesView"; export const RolesPage: React.FC = () => { return diff --git a/src/packages/ce/src/dashboard/role/RolesView.tsx b/src/packages/ce/src/ui-dashboard/role/RolesView.tsx similarity index 100% rename from src/packages/ce/src/dashboard/role/RolesView.tsx rename to src/packages/ce/src/ui-dashboard/role/RolesView.tsx diff --git a/src/packages/ce/src/dashboard/runtime/RuntimeCreatePage.tsx b/src/packages/ce/src/ui-dashboard/runtime/RuntimeCreatePage.tsx similarity index 100% rename from src/packages/ce/src/dashboard/runtime/RuntimeCreatePage.tsx rename to src/packages/ce/src/ui-dashboard/runtime/RuntimeCreatePage.tsx diff --git a/src/packages/ce/src/dashboard/runtime/RuntimeSettingsPage.tsx b/src/packages/ce/src/ui-dashboard/runtime/RuntimeSettingsPage.tsx similarity index 100% rename from src/packages/ce/src/dashboard/runtime/RuntimeSettingsPage.tsx rename to src/packages/ce/src/ui-dashboard/runtime/RuntimeSettingsPage.tsx diff --git a/src/packages/ce/src/dashboard/runtime/RuntimesPage.tsx b/src/packages/ce/src/ui-dashboard/runtime/RuntimesPage.tsx similarity index 100% rename from src/packages/ce/src/dashboard/runtime/RuntimesPage.tsx rename to src/packages/ce/src/ui-dashboard/runtime/RuntimesPage.tsx diff --git a/src/packages/ce/src/dashboard/usage/UsageView.tsx b/src/packages/ce/src/ui-dashboard/usage/UsageView.tsx similarity index 100% rename from src/packages/ce/src/dashboard/usage/UsageView.tsx rename to src/packages/ce/src/ui-dashboard/usage/UsageView.tsx diff --git a/src/packages/ce/src/dashboard/user/UsersPage.tsx b/src/packages/ce/src/ui-dashboard/user/UsersPage.tsx similarity index 100% rename from src/packages/ce/src/dashboard/user/UsersPage.tsx rename to src/packages/ce/src/ui-dashboard/user/UsersPage.tsx From c8f19cb8191669e86a718e12868d25ebe8d4da51 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 15 Jan 2026 17:00:17 +0100 Subject: [PATCH 049/173] feat: add BasicFlow fragment for GraphQL queries --- .../fragments/Flow.basic.fragment.graphql | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/packages/ce/src/flow/fragments/Flow.basic.fragment.graphql diff --git a/src/packages/ce/src/flow/fragments/Flow.basic.fragment.graphql b/src/packages/ce/src/flow/fragments/Flow.basic.fragment.graphql new file mode 100644 index 00000000..3825a5a7 --- /dev/null +++ b/src/packages/ce/src/flow/fragments/Flow.basic.fragment.graphql @@ -0,0 +1,28 @@ +fragment BasicFlow on Flow { + __typename + id + createdAt + inputType { + id + } + name + project { + __typename + id + } + returnType { + __typename + id + } + settings { + __typename + } + startingNodeId + type { + id + } + updatedAt + userAbilities { + deleteFlow + } +} \ No newline at end of file From 26ab6f157058b22064ae0cf92b4bc48644c27cd5 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 15 Jan 2026 17:00:22 +0100 Subject: [PATCH 050/173] feat: add flowCreate mutation for creating flows with project association --- .../mutations/Flow.create.mutation.graphql | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/packages/ce/src/flow/mutations/Flow.create.mutation.graphql diff --git a/src/packages/ce/src/flow/mutations/Flow.create.mutation.graphql b/src/packages/ce/src/flow/mutations/Flow.create.mutation.graphql new file mode 100644 index 00000000..80230877 --- /dev/null +++ b/src/packages/ce/src/flow/mutations/Flow.create.mutation.graphql @@ -0,0 +1,20 @@ +#import "../fragments/Flow.basic.fragment.graphql" + +mutation flowCreate($flow: FlowInput!, $projectId: NamespaceProjectID!) { + namespacesProjectsFlowsCreate(input: { + flow: $flow, + projectId: $projectId + }) { + errors { + ...on Error { + errorCode, + details { + __typename + } + } + } + flow { + ...BasicFlow + } + } +} \ No newline at end of file From 8f2c0d38533fe763ff04cb83e300541e6b611342 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 15 Jan 2026 17:00:28 +0100 Subject: [PATCH 051/173] feat: implement flowCreate mutation for creating flows with project association --- src/packages/ce/src/flow/Flow.service.ts | 28 +++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/packages/ce/src/flow/Flow.service.ts b/src/packages/ce/src/flow/Flow.service.ts index 25c925c5..a9a83b0e 100644 --- a/src/packages/ce/src/flow/Flow.service.ts +++ b/src/packages/ce/src/flow/Flow.service.ts @@ -1,15 +1,18 @@ -import {DFlowDependencies, DFlowReactiveService, DNamespaceMemberView, ReactiveArrayStore} from "@code0-tech/pictor"; +import {DFlowDependencies, DFlowReactiveService, DNamespaceProjectView, ReactiveArrayStore} from "@code0-tech/pictor"; import { - Flow, NamespaceMember, + Flow, + Mutation, NamespacesProjectsFlowsCreateInput, NamespacesProjectsFlowsCreatePayload, NamespacesProjectsFlowsDeleteInput, NamespacesProjectsFlowsDeletePayload, NamespacesProjectsFlowsUpdateInput, - NamespacesProjectsFlowsUpdatePayload, Query + NamespacesProjectsFlowsUpdatePayload, + Query } from "@code0-tech/sagittarius-graphql-types"; import {GraphqlClient} from "@core/util/graphql-client"; import flowsQuery from "@edition/flow/queries/Flows.query.graphql"; +import flowCreateMutation from "@edition/flow/mutations/Flow.create.mutation.graphql"; export class FlowService extends DFlowReactiveService { @@ -63,8 +66,23 @@ export class FlowService extends DFlowReactiveService { return flow !== undefined } - flowCreate(payload: NamespacesProjectsFlowsCreateInput): Promise { - return Promise.resolve(undefined); + async flowCreate(payload: NamespacesProjectsFlowsCreateInput): Promise { + const result = await this.client.mutate({ + mutation: flowCreateMutation, + variables: { + ...payload + } + }) + + if (result.data && result.data.namespacesProjectsFlowsCreate && result.data.namespacesProjectsFlowsCreate.flow) { + const flow = result.data.namespacesProjectsFlowsCreate.flow + if (!this.hasById(flow.id)) { + flow.nodes = {nodes: []} //TODO: to avoid issues, when fixed in pictor + this.add(flow) + } + } + + return result.data?.namespacesProjectsFlowsCreate ?? undefined } flowDelete(payload: NamespacesProjectsFlowsDeleteInput): Promise { From 02086552f86dba88a258d75a4858a635d505d17c Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 15 Jan 2026 17:00:35 +0100 Subject: [PATCH 052/173] feat: add FolderView component for managing flow folders and creating new flows --- .../ce/src/ui-flow/folder/FolderView.tsx | 138 ++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 src/packages/ce/src/ui-flow/folder/FolderView.tsx diff --git a/src/packages/ce/src/ui-flow/folder/FolderView.tsx b/src/packages/ce/src/ui-flow/folder/FolderView.tsx new file mode 100644 index 00000000..7dba4bac --- /dev/null +++ b/src/packages/ce/src/ui-flow/folder/FolderView.tsx @@ -0,0 +1,138 @@ +"use client" + +import React from "react"; +import { + Button, + DFlowFolder, + DFlowFolderCreateDialog, + DFlowFolderHandle, + DLayout, + Flex, + Text, toast, + Tooltip, + TooltipArrow, + TooltipContent, + TooltipPortal, + TooltipTrigger, useService, useStore +} from "@code0-tech/pictor"; +import {IconArrowsMaximize, IconArrowsMinimize, IconCircleDot} from "@tabler/icons-react"; +import {useParams, useRouter} from "next/navigation"; +import {Flow, FlowType, NamespaceProject} from "@code0-tech/sagittarius-graphql-types"; +import {FlowService} from "@edition/flow/Flow.service"; + +export const FolderView: React.FC = () => { + + const flowService = useService(FlowService) + const flowStore = useStore(FlowService) + const router = useRouter() + const params = useParams() + + const [, startTransition] = React.useTransition() + const ref = React.useRef(null) + const [createDialogOpen, setCreateDialogOpen] = React.useState(false) + const [flowTypeId, setFlowTypeId] = React.useState(undefined) + + const namespaceIndex = params.namespaceId as any as number + const projectIndex = params.projectId as any as number + const flowIndex = params.flowId as any as number + const flowId: Flow['id'] = `gid://sagittarius/Flow/${flowIndex}` + const projectId: NamespaceProject['id'] = `gid://sagittarius/NamespaceProject/${projectIndex}` + + const createFlow = React.useCallback((name: string, type: FlowType['id']) => { + if (!type) return + startTransition(() => { + flowService.flowCreate({ + // @ts-ignore + flow: { + settings: [], + name: name, + type: type, + nodes: [], + }, + projectId: projectId + }).then(payload => { + if ((payload?.errors?.length ?? 0) <= 0) { + toast({ + title: "The flow was successfully created.", + color: "success", + dismissible: true, + }) + } + }) + }) + }, [flowService]) + + return <> + + setCreateDialogOpen(open)} + onCreate={createFlow} + flowTypeId={flowTypeId}/> + + + + + + + + + + + Open active flow + + + + + + + + + + + Close all + + + + + + + + + + + Open all + + + + + + + }> +
+ { + const number = flow.id?.match(/Flow\/(\d+)$/)?.[1] + router.push(`/namespace/${namespaceIndex}/project/${projectIndex}/flow/${number}`) + }} + onCreate={flowTypeId => { + setCreateDialogOpen(true) + setFlowTypeId(flowTypeId) + }} + namespaceId={`gid://sagittarius/Namespace/${namespaceIndex}`} + projectId={`gid://sagittarius/NamespaceProject/${projectIndex}`}/> +
+
+ +} \ No newline at end of file From dab133b2fdd8258159025807f370517bea01c2f2 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 15 Jan 2026 17:34:52 +0100 Subject: [PATCH 053/173] feat: add flowDelete mutation for deleting flows by ID --- .../mutations/Flow.delete.mutation.graphql | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/packages/ce/src/flow/mutations/Flow.delete.mutation.graphql diff --git a/src/packages/ce/src/flow/mutations/Flow.delete.mutation.graphql b/src/packages/ce/src/flow/mutations/Flow.delete.mutation.graphql new file mode 100644 index 00000000..4e35e339 --- /dev/null +++ b/src/packages/ce/src/flow/mutations/Flow.delete.mutation.graphql @@ -0,0 +1,19 @@ +#import "../fragments/Flow.basic.fragment.graphql" + +mutation flowDelete($flowId: FlowID!) { + namespacesProjectsFlowsDelete(input: { + flowId: $flowId + }) { + errors { + ...on Error { + errorCode, + details { + __typename + } + } + } + flow { + ...BasicFlow + } + } +} \ No newline at end of file From 25aec8f5a409a114d35c99c59dd77d8ef5d2b3de Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 15 Jan 2026 17:34:56 +0100 Subject: [PATCH 054/173] feat: implement flowDelete and flowUpdate mutations for managing flows --- src/packages/ce/src/flow/Flow.service.ts | 49 +++++++++++++++++++++--- 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/src/packages/ce/src/flow/Flow.service.ts b/src/packages/ce/src/flow/Flow.service.ts index a9a83b0e..1849cf2d 100644 --- a/src/packages/ce/src/flow/Flow.service.ts +++ b/src/packages/ce/src/flow/Flow.service.ts @@ -1,4 +1,10 @@ -import {DFlowDependencies, DFlowReactiveService, DNamespaceProjectView, ReactiveArrayStore} from "@code0-tech/pictor"; +import { + DFlowDependencies, + DFlowReactiveService, + DNamespaceProjectView, + DOrganizationView, + ReactiveArrayStore +} from "@code0-tech/pictor"; import { Flow, Mutation, @@ -7,12 +13,15 @@ import { NamespacesProjectsFlowsDeleteInput, NamespacesProjectsFlowsDeletePayload, NamespacesProjectsFlowsUpdateInput, - NamespacesProjectsFlowsUpdatePayload, + NamespacesProjectsFlowsUpdatePayload, OrganizationsUpdateInput, Query } from "@code0-tech/sagittarius-graphql-types"; import {GraphqlClient} from "@core/util/graphql-client"; import flowsQuery from "@edition/flow/queries/Flows.query.graphql"; import flowCreateMutation from "@edition/flow/mutations/Flow.create.mutation.graphql"; +import flowDeleteMutation from "@edition/flow/mutations/Flow.delete.mutation.graphql"; +import flowUpdateMutation from "@edition/flow/mutations/Flow.update.mutation.graphql"; + export class FlowService extends DFlowReactiveService { @@ -85,12 +94,40 @@ export class FlowService extends DFlowReactiveService { return result.data?.namespacesProjectsFlowsCreate ?? undefined } - flowDelete(payload: NamespacesProjectsFlowsDeleteInput): Promise { - return Promise.resolve(undefined); + async flowDelete(payload: NamespacesProjectsFlowsDeleteInput): Promise { + const result = await this.client.mutate({ + mutation: flowDeleteMutation, + variables: { + ...payload + } + }) + + if (result.data && result.data.namespacesProjectsFlowsDelete && result.data.namespacesProjectsFlowsDelete.flow) { + const flow = result.data.namespacesProjectsFlowsDelete.flow + const index = this.values().findIndex(f => f.id === flow.id) + this.delete(index) + + } + + return result.data?.namespacesProjectsFlowsDelete ?? undefined } - flowUpdate(payload: NamespacesProjectsFlowsUpdateInput): Promise { - return Promise.resolve(undefined); + async flowUpdate(payload: NamespacesProjectsFlowsUpdateInput): Promise { + const result = await this.client.mutate({ + mutation: flowUpdateMutation, + variables: { + ...payload + } + }) + + if (result.data && result.data.namespacesProjectsFlowsUpdate && result.data.namespacesProjectsFlowsUpdate.flow) { + const flow = result.data.namespacesProjectsFlowsUpdate.flow + const index = this.values().findIndex(f => f.id === flow.id) + this.set(index, {...this.get(index), ...flow}) + + } + + return result.data?.namespacesProjectsFlowsUpdate ?? undefined } } \ No newline at end of file From 475adfdcb8b69d9a4fdedd0c404d34b309861576 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 15 Jan 2026 17:35:03 +0100 Subject: [PATCH 055/173] feat: add flowUpdate mutation for updating flows with new input data --- .../mutations/Flow.update.mutation.graphql | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/packages/ce/src/flow/mutations/Flow.update.mutation.graphql diff --git a/src/packages/ce/src/flow/mutations/Flow.update.mutation.graphql b/src/packages/ce/src/flow/mutations/Flow.update.mutation.graphql new file mode 100644 index 00000000..ca96f086 --- /dev/null +++ b/src/packages/ce/src/flow/mutations/Flow.update.mutation.graphql @@ -0,0 +1,20 @@ +#import "../fragments/Flow.basic.fragment.graphql" + +mutation flowUpdate($flowId: FlowID!, $flowInput: FlowInput!) { + namespacesProjectsFlowsUpdate(input: { + flowId: $flowId + flowInput: $flowInput + }) { + errors { + ...on Error { + errorCode, + details { + __typename + } + } + } + flow { + ...BasicFlow + } + } +} \ No newline at end of file From 479be3a45f0693cf0bd6eb0318944465130c2b3f Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 15 Jan 2026 17:35:13 +0100 Subject: [PATCH 056/173] feat: add DFlowFolderDeleteDialog and deleteFlow function for flow deletion --- .../ce/src/ui-flow/folder/FolderView.tsx | 51 +++++++++++++++++-- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/src/packages/ce/src/ui-flow/folder/FolderView.tsx b/src/packages/ce/src/ui-flow/folder/FolderView.tsx index 7dba4bac..8e7420f4 100644 --- a/src/packages/ce/src/ui-flow/folder/FolderView.tsx +++ b/src/packages/ce/src/ui-flow/folder/FolderView.tsx @@ -5,33 +5,48 @@ import { Button, DFlowFolder, DFlowFolderCreateDialog, + DFlowFolderDeleteDialog, DFlowFolderHandle, DLayout, Flex, - Text, toast, + Text, + toast, Tooltip, TooltipArrow, TooltipContent, TooltipPortal, - TooltipTrigger, useService, useStore + TooltipTrigger, + useService, + useStore } from "@code0-tech/pictor"; import {IconArrowsMaximize, IconArrowsMinimize, IconCircleDot} from "@tabler/icons-react"; import {useParams, useRouter} from "next/navigation"; import {Flow, FlowType, NamespaceProject} from "@code0-tech/sagittarius-graphql-types"; import {FlowService} from "@edition/flow/Flow.service"; +import { + DFlowFolderContextMenuGroupData, + DFlowFolderContextMenuItemData +} from "@code0-tech/pictor/dist/components/d-flow-folder/DFlowFolderContextMenu"; export const FolderView: React.FC = () => { - const flowService = useService(FlowService) - const flowStore = useStore(FlowService) const router = useRouter() const params = useParams() + const flowService = useService(FlowService) const [, startTransition] = React.useTransition() const ref = React.useRef(null) + const [createDialogOpen, setCreateDialogOpen] = React.useState(false) const [flowTypeId, setFlowTypeId] = React.useState(undefined) + const [deleteDialogOpen, setDeleteDialogOpen] = React.useState(false) + const [contextData, setContextData] = React.useState({ + flow: [], + name: "", + type: "folder" + }) + const namespaceIndex = params.namespaceId as any as number const projectIndex = params.projectId as any as number const flowIndex = params.flowId as any as number @@ -57,6 +72,25 @@ export const FolderView: React.FC = () => { color: "success", dismissible: true, }) + + } + }) + }) + }, [flowService]) + + const deleteFlow = React.useCallback((flow: Flow) => { + if (!flow?.id) return + startTransition(() => { + flowService.flowDelete({ + flowId: flow.id! + }).then(payload => { + if ((payload?.errors?.length ?? 0) <= 0) { + toast({ + title: "The flow was successfully deleted.", + color: "success", + dismissible: true, + }) + router.push(`/namespace/${namespaceIndex}/project/${projectIndex}/`) } }) }) @@ -69,6 +103,11 @@ export const FolderView: React.FC = () => { onCreate={createFlow} flowTypeId={flowTypeId}/> + setDeleteDialogOpen(open)} + contextData={contextData} + onDelete={deleteFlow}/> +
From 8b211f2b40ada8026ccdd2ad91e9bbf3096831f1 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 16 Jan 2026 16:00:02 +0100 Subject: [PATCH 057/173] feat: add addNextNodeById method to Flow service for managing node connections --- src/packages/ce/src/flow/Flow.service.ts | 27 +++++++++++++++++------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/packages/ce/src/flow/Flow.service.ts b/src/packages/ce/src/flow/Flow.service.ts index 1849cf2d..97b1e222 100644 --- a/src/packages/ce/src/flow/Flow.service.ts +++ b/src/packages/ce/src/flow/Flow.service.ts @@ -1,10 +1,4 @@ -import { - DFlowDependencies, - DFlowReactiveService, - DNamespaceProjectView, - DOrganizationView, - ReactiveArrayStore -} from "@code0-tech/pictor"; +import {DFlowDependencies, DFlowReactiveService, ReactiveArrayStore} from "@code0-tech/pictor"; import { Flow, Mutation, @@ -13,7 +7,8 @@ import { NamespacesProjectsFlowsDeleteInput, NamespacesProjectsFlowsDeletePayload, NamespacesProjectsFlowsUpdateInput, - NamespacesProjectsFlowsUpdatePayload, OrganizationsUpdateInput, + NamespacesProjectsFlowsUpdatePayload, + NodeFunction, Query } from "@code0-tech/sagittarius-graphql-types"; import {GraphqlClient} from "@core/util/graphql-client"; @@ -75,6 +70,22 @@ export class FlowService extends DFlowReactiveService { return flow !== undefined } + + async addNextNodeById(flowId: Flow["id"], parentNodeId: NodeFunction["id"] | null, nextNode: NodeFunction): Promise { + + await super.addNextNodeById(flowId, parentNodeId, nextNode) + + const flow = this.values().find(f => f.id === flowId) + const flowInput = this.getPayloadById(flowId) + + if (!flow || !flowInput || !flowId) return Promise.reject() + + await this.flowUpdate({ + flowId: flowId, + flowInput: flowInput + }) + } + async flowCreate(payload: NamespacesProjectsFlowsCreateInput): Promise { const result = await this.client.mutate({ mutation: flowCreateMutation, From 9a6120cf0608e6d8809f08ae8af1b33decd939b6 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 16 Jan 2026 16:16:11 +0100 Subject: [PATCH 058/173] feat: add DataType fragment for GraphQL schema to manage data types and their rules --- .../fragments/DataType.fragment.graphql | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 src/packages/ce/src/datatype/fragments/DataType.fragment.graphql diff --git a/src/packages/ce/src/datatype/fragments/DataType.fragment.graphql b/src/packages/ce/src/datatype/fragments/DataType.fragment.graphql new file mode 100644 index 00000000..b202f7a3 --- /dev/null +++ b/src/packages/ce/src/datatype/fragments/DataType.fragment.graphql @@ -0,0 +1,102 @@ +#import "../../function/fragments/DataTypeIdentifier.fragment.graphql" + +fragment DataType on DataType { + __typename + id + createdAt + updatedAt + identifier + genericKeys + variant + + + name { + __typename + code + content + } + aliases { + __typename + code + content + } + displayMessages { + __typename + code + content + } + + runtime { + id + } + + dataTypeIdentifiers (first: $firstDataTypeIdentifier, after: $afterDataTypeIdentifier) { + __typename + count + nodes { + ...DataTypeIdentifier + } + pageInfo { + endCursor + hasNextPage + } + } + + rules (first: $firstRule, after: $afterRule) { + __typename + count + nodes { + __typename + id + variant + updatedAt + createdAt + config { + ... on DataTypeRulesContainsKeyConfig { + __typename + dataTypeIdentifierId + key + } + ... on DataTypeRulesContainsTypeConfig { + __typename + dataTypeIdentifierId + } + ... on DataTypeRulesParentTypeConfig { + __typename + dataTypeIdentifierId + } + ... on DataTypeRulesReturnTypeConfig { + __typename + dataTypeIdentifierId + } + ... on DataTypeRulesInputTypesConfig { + __typename + inputTypes { + __typename + inputIdentifier + dataTypeIdentifierId + } + } + ... on DataTypeRulesItemOfCollectionConfig { + __typename + items + } + ... on DataTypeRulesNumberRangeConfig { + __typename + from + steps + to + } + ... on DataTypeRulesRegexConfig { + __typename + pattern + } + } + } + pageInfo { + endCursor + hasNextPage + } + } + +} \ No newline at end of file From 7cc27778e3e168745e6d6c53718efee4af4cdd2a Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 16 Jan 2026 16:16:16 +0100 Subject: [PATCH 059/173] feat: enhance DatatypeService with dependency-based data type filtering and querying --- .../ce/src/datatype/Datatype.service.ts | 52 ++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/src/packages/ce/src/datatype/Datatype.service.ts b/src/packages/ce/src/datatype/Datatype.service.ts index d936cd04..e904c72c 100644 --- a/src/packages/ce/src/datatype/Datatype.service.ts +++ b/src/packages/ce/src/datatype/Datatype.service.ts @@ -1,13 +1,63 @@ -import {DataTypeView, DFlowDataTypeReactiveService, ReactiveArrayStore} from "@code0-tech/pictor"; +import { + DataTypeView, DFlowDataTypeDependencies, + DFlowDataTypeReactiveService, + ReactiveArrayStore +} from "@code0-tech/pictor"; import {GraphqlClient} from "@core/util/graphql-client"; +import {DataType, Query} from "@code0-tech/sagittarius-graphql-types"; +import dataTypeQuery from "@edition/datatype/queries/DataTypes.query.graphql" export class DatatypeService extends DFlowDataTypeReactiveService { private readonly client: GraphqlClient + private i = 0 constructor(client: GraphqlClient, store: ReactiveArrayStore) { super(store) this.client = client } + values(dependencies?: DFlowDataTypeDependencies): DataTypeView[] { + const dataTypes = super.values() + if (!dependencies?.namespaceId || !dependencies.projectId || !dependencies.runtimeId) return dataTypes + + const namespaceId = dependencies.namespaceId + const projectId = dependencies.projectId + const runtimeId = dependencies.runtimeId + const filtered = dataTypes.filter(dataType => dataType.runtime?.id === runtimeId) + + if (filtered.length <= 0) { + this.client.query({ + query: dataTypeQuery, + variables: { + namespaceId: namespaceId, + projectId: projectId, + + firstDataType: 50, + afterDataType: null, + + firstDataTypeIdentifier: 50, + afterDataTypeIdentifier: null, + + firstRule: 50, + afterRule: null, + } + }).then(res => { + const nodes = res.data?.namespace?.project?.primaryRuntime?.dataTypes?.nodes ?? [] + nodes.forEach(dataType => { + if (dataType && !this.hasById(dataType.id)) { + this.set(this.i++, new DataTypeView(dataType)) + } + }) + }) + } + + return filtered + } + + hasById(id: DataType["id"]): boolean { + const dataType = super.values().find(d => d.id === id) + return dataType !== undefined + } + } \ No newline at end of file From 15987a83b323623e8d84dbbeee24e4c712c2b498 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 16 Jan 2026 16:16:21 +0100 Subject: [PATCH 060/173] feat: add DataTypes query for fetching data types and rules with pagination --- .../datatype/queries/DataTypes.query.graphql | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/packages/ce/src/datatype/queries/DataTypes.query.graphql diff --git a/src/packages/ce/src/datatype/queries/DataTypes.query.graphql b/src/packages/ce/src/datatype/queries/DataTypes.query.graphql new file mode 100644 index 00000000..003e1255 --- /dev/null +++ b/src/packages/ce/src/datatype/queries/DataTypes.query.graphql @@ -0,0 +1,30 @@ +#import "../fragments/DataType.fragment.graphql" + +query DataTypes ( + $namespaceId: NamespaceID! + $projectId: NamespaceProjectID! + $firstDataType: Int! + $afterDataType: String + $firstDataTypeIdentifier: Int! + $afterDataTypeIdentifier: String + $firstRule: Int! + $afterRule: String +) { + namespace(id: $namespaceId) { + project(id: $projectId) { + primaryRuntime { + dataTypes (first: $firstDataType, after: $afterDataType) { + __typename + count + nodes { + ...DataType + } + pageInfo { + endCursor + hasNextPage + } + } + } + } + } +} \ No newline at end of file From 6f9e2c1cca60cf7cf4318093572da4ca943a0a5a Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sat, 17 Jan 2026 10:59:05 +0100 Subject: [PATCH 061/173] feat: add basic datatype without any connection used --- .../fragments/DataType.basic.fragment.graphql | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/packages/ce/src/datatype/fragments/DataType.basic.fragment.graphql diff --git a/src/packages/ce/src/datatype/fragments/DataType.basic.fragment.graphql b/src/packages/ce/src/datatype/fragments/DataType.basic.fragment.graphql new file mode 100644 index 00000000..161c9b35 --- /dev/null +++ b/src/packages/ce/src/datatype/fragments/DataType.basic.fragment.graphql @@ -0,0 +1,30 @@ +fragment BasicDataType on DataType { + __typename + id + createdAt + updatedAt + identifier + genericKeys + variant + + + name { + __typename + code + content + } + aliases { + __typename + code + content + } + displayMessages { + __typename + code + content + } + + runtime { + id + } +} \ No newline at end of file From 2041a58422023a04e5e4eaeb058ed57241318413 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sat, 17 Jan 2026 10:59:33 +0100 Subject: [PATCH 062/173] feat: outsource DataTypeRule into separate fragment --- .../fragments/DataType.fragment.graphql | 48 +------------------ .../fragments/DataTypeRule.fragment.graphql | 48 +++++++++++++++++++ 2 files changed, 50 insertions(+), 46 deletions(-) create mode 100644 src/packages/ce/src/datatype/fragments/DataTypeRule.fragment.graphql diff --git a/src/packages/ce/src/datatype/fragments/DataType.fragment.graphql b/src/packages/ce/src/datatype/fragments/DataType.fragment.graphql index b202f7a3..2cc0a7a8 100644 --- a/src/packages/ce/src/datatype/fragments/DataType.fragment.graphql +++ b/src/packages/ce/src/datatype/fragments/DataType.fragment.graphql @@ -1,4 +1,5 @@ #import "../../function/fragments/DataTypeIdentifier.fragment.graphql" +#import "./DataTypeRule.fragment.graphql" fragment DataType on DataType { __typename @@ -46,52 +47,7 @@ fragment DataType on DataType { __typename count nodes { - __typename - id - variant - updatedAt - createdAt - config { - ... on DataTypeRulesContainsKeyConfig { - __typename - dataTypeIdentifierId - key - } - ... on DataTypeRulesContainsTypeConfig { - __typename - dataTypeIdentifierId - } - ... on DataTypeRulesParentTypeConfig { - __typename - dataTypeIdentifierId - } - ... on DataTypeRulesReturnTypeConfig { - __typename - dataTypeIdentifierId - } - ... on DataTypeRulesInputTypesConfig { - __typename - inputTypes { - __typename - inputIdentifier - dataTypeIdentifierId - } - } - ... on DataTypeRulesItemOfCollectionConfig { - __typename - items - } - ... on DataTypeRulesNumberRangeConfig { - __typename - from - steps - to - } - ... on DataTypeRulesRegexConfig { - __typename - pattern - } - } + ...DataTypeRule } pageInfo { endCursor diff --git a/src/packages/ce/src/datatype/fragments/DataTypeRule.fragment.graphql b/src/packages/ce/src/datatype/fragments/DataTypeRule.fragment.graphql new file mode 100644 index 00000000..ccfd5ba6 --- /dev/null +++ b/src/packages/ce/src/datatype/fragments/DataTypeRule.fragment.graphql @@ -0,0 +1,48 @@ +fragment DataTypeRule on DataTypeRule { + __typename + id + variant + updatedAt + createdAt + config { + ... on DataTypeRulesContainsKeyConfig { + __typename + dataTypeIdentifierId + key + } + ... on DataTypeRulesContainsTypeConfig { + __typename + dataTypeIdentifierId + } + ... on DataTypeRulesParentTypeConfig { + __typename + dataTypeIdentifierId + } + ... on DataTypeRulesReturnTypeConfig { + __typename + dataTypeIdentifierId + } + ... on DataTypeRulesInputTypesConfig { + __typename + inputTypes { + __typename + inputIdentifier + dataTypeIdentifierId + } + } + ... on DataTypeRulesItemOfCollectionConfig { + __typename + items + } + ... on DataTypeRulesNumberRangeConfig { + __typename + from + steps + to + } + ... on DataTypeRulesRegexConfig { + __typename + pattern + } + } +} \ No newline at end of file From c3a77932e2203a6938f807cd40e4942c91aaa6f4 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sat, 17 Jan 2026 11:02:13 +0100 Subject: [PATCH 063/173] feat: remove input and return type for now, because those types are not resolved as they should --- .../src/flow/fragments/Flow.fragment.graphql | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/packages/ce/src/flow/fragments/Flow.fragment.graphql b/src/packages/ce/src/flow/fragments/Flow.fragment.graphql index 37805e8c..bd4da313 100644 --- a/src/packages/ce/src/flow/fragments/Flow.fragment.graphql +++ b/src/packages/ce/src/flow/fragments/Flow.fragment.graphql @@ -4,9 +4,7 @@ fragment Flow on Flow { __typename id createdAt - inputType { - id - } + name nodes (first: $firstNode, after: $afterNode) { __typename @@ -82,12 +80,21 @@ fragment Flow on Flow { __typename id } - returnType { - __typename - id - } - settings { + settings (first: $firstSetting, after: $afterSetting) { __typename + count + nodes { + __typename + id + createdAt + updatedAt + flowSettingIdentifier + value + } + pageInfo { + endCursor + hasNextPage + } } startingNodeId type { From 5fb54ef6da864fefb2eb97216e43585be6671594 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sat, 17 Jan 2026 11:02:41 +0100 Subject: [PATCH 064/173] feat: outcomment input and return type variables --- src/packages/ce/src/flow/Flow.service.ts | 13 +++++++++++++ .../ce/src/flow/queries/Flows.query.graphql | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/packages/ce/src/flow/Flow.service.ts b/src/packages/ce/src/flow/Flow.service.ts index 97b1e222..49ff5e51 100644 --- a/src/packages/ce/src/flow/Flow.service.ts +++ b/src/packages/ce/src/flow/Flow.service.ts @@ -51,6 +51,19 @@ export class FlowService extends DFlowReactiveService { firstNodeParameter: 50, afterNodeParameter: null, + + firstSetting: 50, + afterSetting: null, + + // firstInputDataTypeIdentifier: 50, + // afterInputDataTypeIdentifier: null, + // firstInputRule: 50, + // afterInputRule: null, + // + // firstReturnDataTypeIdentifier: 50, + // afterReturnDataTypeIdentifier: null, + // firstReturnRule: 50, + // afterReturnRule: null } }).then(res => { const nodes = res.data?.namespace?.project?.flows?.nodes ?? [] diff --git a/src/packages/ce/src/flow/queries/Flows.query.graphql b/src/packages/ce/src/flow/queries/Flows.query.graphql index 151bbbd7..a86754f9 100644 --- a/src/packages/ce/src/flow/queries/Flows.query.graphql +++ b/src/packages/ce/src/flow/queries/Flows.query.graphql @@ -9,6 +9,19 @@ query Flows ( $afterNode: String, $firstNodeParameter: Int!, $afterNodeParameter: String, + + $firstSetting: Int!, + $afterSetting: String, + + #$firstInputDataTypeIdentifier: Int! + #$afterInputDataTypeIdentifier: String + #$firstInputRule: Int! + #$afterInputRule: String + + #$firstReturnDataTypeIdentifier: Int! + #$afterReturnDataTypeIdentifier: String + #$firstReturnRule: Int! + #$afterReturnRule: String ) { namespace(id: $namespaceId) { project(id: $projectId) { From 2f9aa0501a401eb30163ead0f2ecad62cae97aff Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sat, 17 Jan 2026 11:03:20 +0100 Subject: [PATCH 065/173] feat: adding settings and input + return types to fragment and query --- .../ce/src/flowtype/FlowTypeService.ts | 10 +++ .../fragments/FlowType.fragment.graphql | 80 +++++++++++++++++++ .../flowtype/queries/FlowTypes.query.graphql | 10 +++ 3 files changed, 100 insertions(+) diff --git a/src/packages/ce/src/flowtype/FlowTypeService.ts b/src/packages/ce/src/flowtype/FlowTypeService.ts index 7e0ce4c8..aae13eda 100644 --- a/src/packages/ce/src/flowtype/FlowTypeService.ts +++ b/src/packages/ce/src/flowtype/FlowTypeService.ts @@ -31,6 +31,16 @@ export class FlowTypeService extends DFlowTypeReactiveService { firstFlowType: 50, afterFlowType: null, + + firstInputDataTypeIdentifier: 50, + afterInputDataTypeIdentifier: null, + firstInputRule: 50, + afterInputRule: null, + + firstReturnDataTypeIdentifier: 50, + afterReturnDataTypeIdentifier: null, + firstReturnRule: 50, + afterReturnRule: null } }).then(res => { const nodes = res.data?.namespace?.project?.primaryRuntime?.flowTypes?.nodes ?? [] diff --git a/src/packages/ce/src/flowtype/fragments/FlowType.fragment.graphql b/src/packages/ce/src/flowtype/fragments/FlowType.fragment.graphql index 4029eb03..5561cef1 100644 --- a/src/packages/ce/src/flowtype/fragments/FlowType.fragment.graphql +++ b/src/packages/ce/src/flowtype/fragments/FlowType.fragment.graphql @@ -1,3 +1,7 @@ +#import "../../function/fragments/DataTypeIdentifier.fragment.graphql" +#import "../../datatype/fragments/DataType.basic.fragment.graphql" +#import "../../datatype/fragments/DataTypeRule.fragment.graphql" + fragment FlowType on FlowType { __typename id @@ -27,6 +31,82 @@ fragment FlowType on FlowType { runtime { id } + inputType { + ...BasicDataType + dataTypeIdentifiers (first: $firstInputDataTypeIdentifier, after: $afterInputDataTypeIdentifier) { + __typename + count + nodes { + ...DataTypeIdentifier + } + pageInfo { + endCursor + hasNextPage + } + } + rules (first: $firstInputRule, after: $afterInputRule) { + __typename + count + nodes { + ...DataTypeRule + } + pageInfo { + endCursor + hasNextPage + } + } + + } + returnType { + ...BasicDataType + dataTypeIdentifiers (first: $firstReturnDataTypeIdentifier, after: $afterReturnDataTypeIdentifier) { + __typename + count + nodes { + ...DataTypeIdentifier + } + pageInfo { + endCursor + hasNextPage + } + } + rules (first: $firstReturnRule, after: $afterReturnRule) { + __typename + count + nodes { + ...DataTypeRule + } + pageInfo { + endCursor + hasNextPage + } + } + } + flowTypeSettings { + __typename + id + createdAt + updatedAt + identifier + unique + + + dataType { + id + } + + names { + __typename + code + content + } + descriptions { + __typename + code + content + } + + } editable } \ No newline at end of file diff --git a/src/packages/ce/src/flowtype/queries/FlowTypes.query.graphql b/src/packages/ce/src/flowtype/queries/FlowTypes.query.graphql index 5a94bc26..ef27cea5 100644 --- a/src/packages/ce/src/flowtype/queries/FlowTypes.query.graphql +++ b/src/packages/ce/src/flowtype/queries/FlowTypes.query.graphql @@ -5,6 +5,16 @@ query FlowTypes ( $projectId: NamespaceProjectID! $firstFlowType: Int! $afterFlowType: String + + $firstInputDataTypeIdentifier: Int! + $afterInputDataTypeIdentifier: String + $firstInputRule: Int! + $afterInputRule: String + + $firstReturnDataTypeIdentifier: Int! + $afterReturnDataTypeIdentifier: String + $firstReturnRule: Int! + $afterReturnRule: String ) { namespace(id: $namespaceId) { project(id: $projectId) { From 6b128c449e50e88c9490e96824aa494156c7fe94 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Wed, 21 Jan 2026 10:33:09 +0000 Subject: [PATCH 066/173] feat: rename runtimeParameter to parameterDefinition in Flow fragment --- src/packages/ce/src/flow/fragments/Flow.fragment.graphql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/packages/ce/src/flow/fragments/Flow.fragment.graphql b/src/packages/ce/src/flow/fragments/Flow.fragment.graphql index bd4da313..6db875e4 100644 --- a/src/packages/ce/src/flow/fragments/Flow.fragment.graphql +++ b/src/packages/ce/src/flow/fragments/Flow.fragment.graphql @@ -22,7 +22,7 @@ fragment Flow on Flow { id updatedAt createdAt - runtimeParameter { + parameterDefinition { __typename id identifier From 7ce1eba190b40fd0b5e50cd8130405405e025a97 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Wed, 21 Jan 2026 10:33:18 +0000 Subject: [PATCH 067/173] feat: add ActiveModelError attribute type to Error details in Flow update mutation --- src/packages/ce/src/flow/mutations/Flow.update.mutation.graphql | 1 + 1 file changed, 1 insertion(+) diff --git a/src/packages/ce/src/flow/mutations/Flow.update.mutation.graphql b/src/packages/ce/src/flow/mutations/Flow.update.mutation.graphql index ca96f086..c5a86084 100644 --- a/src/packages/ce/src/flow/mutations/Flow.update.mutation.graphql +++ b/src/packages/ce/src/flow/mutations/Flow.update.mutation.graphql @@ -9,6 +9,7 @@ mutation flowUpdate($flowId: FlowID!, $flowInput: FlowInput!) { ...on Error { errorCode, details { + ...on ActiveModelError { attribute type } __typename } } From f5264c33721769e49545f54134e87f1e3ddca2cf Mon Sep 17 00:00:00 2001 From: nicosammito Date: Wed, 21 Jan 2026 18:26:06 +0000 Subject: [PATCH 068/173] feat: remove createdAt and updatedAt fields from LiteralValue in Flow fragment --- src/packages/ce/src/flow/fragments/Flow.fragment.graphql | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/packages/ce/src/flow/fragments/Flow.fragment.graphql b/src/packages/ce/src/flow/fragments/Flow.fragment.graphql index 6db875e4..e7c3afaf 100644 --- a/src/packages/ce/src/flow/fragments/Flow.fragment.graphql +++ b/src/packages/ce/src/flow/fragments/Flow.fragment.graphql @@ -34,8 +34,6 @@ fragment Flow on Flow { ... on LiteralValue { __typename value - createdAt - updatedAt } ... on NodeFunctionIdWrapper { __typename From 43003a5966e5a0152c5c7fc79fdfcf2a6eb8f733 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Wed, 21 Jan 2026 18:26:17 +0000 Subject: [PATCH 069/173] feat: add syncFlow method and update node handling in FlowService --- src/packages/ce/src/flow/Flow.service.ts | 28 +++++++++++++++++------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/packages/ce/src/flow/Flow.service.ts b/src/packages/ce/src/flow/Flow.service.ts index 49ff5e51..c95ca34a 100644 --- a/src/packages/ce/src/flow/Flow.service.ts +++ b/src/packages/ce/src/flow/Flow.service.ts @@ -1,6 +1,6 @@ import {DFlowDependencies, DFlowReactiveService, ReactiveArrayStore} from "@code0-tech/pictor"; import { - Flow, + Flow, LiteralValue, Mutation, NamespacesProjectsFlowsCreateInput, NamespacesProjectsFlowsCreatePayload, @@ -8,14 +8,15 @@ import { NamespacesProjectsFlowsDeletePayload, NamespacesProjectsFlowsUpdateInput, NamespacesProjectsFlowsUpdatePayload, - NodeFunction, - Query + NodeFunction, NodeParameter, + Query, ReferenceValue } from "@code0-tech/sagittarius-graphql-types"; import {GraphqlClient} from "@core/util/graphql-client"; import flowsQuery from "@edition/flow/queries/Flows.query.graphql"; import flowCreateMutation from "@edition/flow/mutations/Flow.create.mutation.graphql"; import flowDeleteMutation from "@edition/flow/mutations/Flow.delete.mutation.graphql"; import flowUpdateMutation from "@edition/flow/mutations/Flow.update.mutation.graphql"; +import {store} from "next/dist/build/output/store"; export class FlowService extends DFlowReactiveService { @@ -85,9 +86,23 @@ export class FlowService extends DFlowReactiveService { async addNextNodeById(flowId: Flow["id"], parentNodeId: NodeFunction["id"] | null, nextNode: NodeFunction): Promise { - await super.addNextNodeById(flowId, parentNodeId, nextNode) + return this.syncFlow(flowId) + } + + + async deleteNodeById(flowId: Flow["id"], nodeId: NodeFunction["id"]): Promise { + await super.deleteNodeById(flowId, nodeId) + return this.syncFlow(flowId) + } + + async setParameterValue(flowId: Flow["id"], nodeId: NodeFunction["id"], parameterId: NodeParameter["id"], value?: LiteralValue | ReferenceValue | NodeFunction): Promise { + await super.setParameterValue(flowId, nodeId, parameterId, value) + return this.syncFlow(flowId) + } + + private async syncFlow(flowId: Flow["id"]) { const flow = this.values().find(f => f.id === flowId) const flowInput = this.getPayloadById(flowId) @@ -145,10 +160,7 @@ export class FlowService extends DFlowReactiveService { }) if (result.data && result.data.namespacesProjectsFlowsUpdate && result.data.namespacesProjectsFlowsUpdate.flow) { - const flow = result.data.namespacesProjectsFlowsUpdate.flow - const index = this.values().findIndex(f => f.id === flow.id) - this.set(index, {...this.get(index), ...flow}) - + //TODO: update store if needed } return result.data?.namespacesProjectsFlowsUpdate ?? undefined From c00deb06fab24f34ac2b89b3d7c245c18c95838a Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 22 Jan 2026 21:22:36 +0000 Subject: [PATCH 070/173] feat: implement flow update queue to optimize syncFlow calls --- src/packages/ce/src/flow/Flow.service.ts | 36 ++++++++++++++++-------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/src/packages/ce/src/flow/Flow.service.ts b/src/packages/ce/src/flow/Flow.service.ts index c95ca34a..da4cff17 100644 --- a/src/packages/ce/src/flow/Flow.service.ts +++ b/src/packages/ce/src/flow/Flow.service.ts @@ -16,17 +16,19 @@ import flowsQuery from "@edition/flow/queries/Flows.query.graphql"; import flowCreateMutation from "@edition/flow/mutations/Flow.create.mutation.graphql"; import flowDeleteMutation from "@edition/flow/mutations/Flow.delete.mutation.graphql"; import flowUpdateMutation from "@edition/flow/mutations/Flow.update.mutation.graphql"; -import {store} from "next/dist/build/output/store"; export class FlowService extends DFlowReactiveService { private readonly client: GraphqlClient - private i = 0 + private flowUpdateQueue: Array + private i constructor(client: GraphqlClient, store: ReactiveArrayStore) { super(store) this.client = client + this.flowUpdateQueue = [] + this.i = 0 } values(dependencies?: DFlowDependencies): Flow[] { @@ -87,31 +89,41 @@ export class FlowService extends DFlowReactiveService { async addNextNodeById(flowId: Flow["id"], parentNodeId: NodeFunction["id"] | null, nextNode: NodeFunction): Promise { await super.addNextNodeById(flowId, parentNodeId, nextNode) - return this.syncFlow(flowId) + await this.syncFlow(flowId) } async deleteNodeById(flowId: Flow["id"], nodeId: NodeFunction["id"]): Promise { await super.deleteNodeById(flowId, nodeId) - return this.syncFlow(flowId) + await this.syncFlow(flowId) } async setParameterValue(flowId: Flow["id"], nodeId: NodeFunction["id"], parameterId: NodeParameter["id"], value?: LiteralValue | ReferenceValue | NodeFunction): Promise { await super.setParameterValue(flowId, nodeId, parameterId, value) - return this.syncFlow(flowId) + await this.syncFlow(flowId) } private async syncFlow(flowId: Flow["id"]) { - const flow = this.values().find(f => f.id === flowId) - const flowInput = this.getPayloadById(flowId) - if (!flow || !flowInput || !flowId) return Promise.reject() + const alreadyQueued = this.flowUpdateQueue.includes(flowId) + if (alreadyQueued) return Promise.resolve() - await this.flowUpdate({ - flowId: flowId, - flowInput: flowInput - }) + this.flowUpdateQueue.push(flowId) + + setTimeout(async () => { + const flow = this.values().find(f => f.id === flowId) + const flowInput = this.getPayloadById(flowId) + + if (!flow || !flowInput || !flowId) return Promise.reject() + + await this.flowUpdate({ + flowId: flowId, + flowInput: flowInput + }) + + this.flowUpdateQueue.splice(this.flowUpdateQueue.indexOf(flowId), 1) + }, 1000*60) // 1 min } async flowCreate(payload: NamespacesProjectsFlowsCreateInput): Promise { From 0c56fccf9ebb6d79c60d4ecf88d121f0b74f5482 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Mon, 26 Jan 2026 19:16:45 +0100 Subject: [PATCH 071/173] feat: update service constructors to use View wrapper for data types --- src/app/(auth)/layout.tsx | 1 + src/app/(dashboard)/layout.tsx | 15 ++++---- src/app/(flow)/layout.tsx | 38 +++++++------------ .../usePersistentReactiveArrayService.ts | 37 +++++++++--------- .../ce/src/datatype/Datatype.service.ts | 5 ++- src/packages/ce/src/flow/Flow.service.ts | 17 +++++++-- .../ce/src/flowtype/FlowTypeService.ts | 5 ++- .../ce/src/function/Function.service.ts | 5 ++- src/packages/ce/src/member/Member.service.ts | 9 +++-- .../ce/src/namespace/Namespace.service.ts | 5 ++- .../src/organization/Organization.service.ts | 9 +++-- .../ce/src/project/Project.service.ts | 7 ++-- src/packages/ce/src/role/Role.service.ts | 11 +++--- .../ce/src/runtime/Runtime.service.ts | 13 ++++--- src/packages/ce/src/user/User.service.ts | 15 ++++---- 15 files changed, 101 insertions(+), 91 deletions(-) diff --git a/src/app/(auth)/layout.tsx b/src/app/(auth)/layout.tsx index 7e64ff5b..23f092a4 100644 --- a/src/app/(auth)/layout.tsx +++ b/src/app/(auth)/layout.tsx @@ -7,6 +7,7 @@ import {GraphqlClient} from "@core/util/graphql-client"; import Image from "next/image"; import React from "react"; import {usePersistentReactiveArrayService} from "@/hooks/usePersistentReactiveArrayService"; +import {View} from "@code0-tech/pictor/dist/utils/view"; export default function AuthLayout({children}: Readonly<{ children: React.ReactNode }>) { diff --git a/src/app/(dashboard)/layout.tsx b/src/app/(dashboard)/layout.tsx index 6941257f..31526e66 100644 --- a/src/app/(dashboard)/layout.tsx +++ b/src/app/(dashboard)/layout.tsx @@ -25,6 +25,7 @@ import {RuntimeService} from "@edition/runtime/Runtime.service"; import {ProjectService} from "@edition/project/Project.service"; import {RoleService} from "@edition/role/Role.service"; import {Spacing} from "@code0-tech/pictor/dist/components/spacing/Spacing"; +import {View} from "@code0-tech/pictor/dist/utils/view"; interface ApplicationLayoutProps { children: React.ReactNode @@ -40,13 +41,13 @@ const ApplicationLayout: React.FC = ({children, bar, tab const graphqlClient = React.useMemo(() => new GraphqlClient(client), [client]) - const user = usePersistentReactiveArrayService(`dashboard::users::${currentSession?.id}`, (store: ReactiveArrayStore) => new UserService(graphqlClient, store)) - const organization = usePersistentReactiveArrayService(`dashboard::organizations::${currentSession?.id}`, (store: ReactiveArrayStore) => new OrganizationService(graphqlClient, store)) - const member = usePersistentReactiveArrayService(`dashboard::members::${currentSession?.id}`, (store: ReactiveArrayStore) => new MemberService(graphqlClient, store)) - const namespace = usePersistentReactiveArrayService(`dashboard::namespaces::${currentSession?.id}`, (store: ReactiveArrayStore) => new NamespaceService(graphqlClient, store)) - const runtime = usePersistentReactiveArrayService(`dashboard::global_runtimes::${currentSession?.id}`, (store: ReactiveArrayStore) => new RuntimeService(graphqlClient, store)) - const project = usePersistentReactiveArrayService(`dashboard::projects::${currentSession?.id}`, (store: ReactiveArrayStore) => new ProjectService(graphqlClient, store)) - const role = usePersistentReactiveArrayService(`dashboard::roles::${currentSession?.id}`, (store: ReactiveArrayStore) => new RoleService(graphqlClient, store)) + const user = usePersistentReactiveArrayService(`dashboard::users::${currentSession?.id}`, (store) => new UserService(graphqlClient, store)) + const organization = usePersistentReactiveArrayService(`dashboard::organizations::${currentSession?.id}`, (store) => new OrganizationService(graphqlClient, store)) + const member = usePersistentReactiveArrayService(`dashboard::members::${currentSession?.id}`, (store) => new MemberService(graphqlClient, store)) + const namespace = usePersistentReactiveArrayService(`dashboard::namespaces::${currentSession?.id}`, (store) => new NamespaceService(graphqlClient, store)) + const runtime = usePersistentReactiveArrayService(`dashboard::global_runtimes::${currentSession?.id}`, (store) => new RuntimeService(graphqlClient, store)) + const project = usePersistentReactiveArrayService(`dashboard::projects::${currentSession?.id}`, (store) => new ProjectService(graphqlClient, store)) + const role = usePersistentReactiveArrayService(`dashboard::roles::${currentSession?.id}`, (store) => new RoleService(graphqlClient, store)) if (currentSession === null) router.push("/login") diff --git a/src/app/(flow)/layout.tsx b/src/app/(flow)/layout.tsx index a4fca46a..1107a56e 100644 --- a/src/app/(flow)/layout.tsx +++ b/src/app/(flow)/layout.tsx @@ -3,11 +3,8 @@ import React from "react"; import {useApolloClient} from "@apollo/client/react"; import { - Button, ContextStoreProvider, DataTypeView, - DFlowFolder, - DFlowFolderHandle, DLayout, DNamespaceMemberView, DNamespaceProjectView, @@ -19,16 +16,9 @@ import { DResizablePanelGroup, DRuntimeView, DUserView, - Flex, FlowTypeView, FunctionDefinitionView, ReactiveArrayStore, - Text, - Tooltip, - TooltipArrow, - TooltipContent, - TooltipPortal, - TooltipTrigger, useUserSession } from "@code0-tech/pictor"; import {UserService} from "@edition/user/User.service"; @@ -48,8 +38,8 @@ import {DatatypeService} from "@edition/datatype/Datatype.service"; import {FlowTypeService} from "@edition/flowtype/FlowTypeService"; import {FileTabsView} from "@code0-tech/pictor/dist/components/file-tabs/FileTabs.view"; import {FileTabsService} from "@code0-tech/pictor/dist/components/file-tabs/FileTabs.service"; -import {IconArrowsMaximize, IconArrowsMinimize, IconCircleDot} from "@tabler/icons-react"; import {FolderView} from "@edition/ui-flow/folder/FolderView"; +import {View} from "@code0-tech/pictor/dist/utils/view"; interface ApplicationLayoutProps { children: React.ReactNode @@ -73,18 +63,18 @@ const ApplicationLayout: React.FC = ({children, bar, tab const projectId: NamespaceProject['id'] = `gid://sagittarius/NamespaceProject/${projectIndex}` const flowId: Flow['id'] = `gid://sagittarius/Flow/${flowIndex}` - const user = usePersistentReactiveArrayService(`dashboard::users::${currentSession?.id}`, (store: ReactiveArrayStore) => new UserService(graphqlClient, store)) - const organization = usePersistentReactiveArrayService(`dashboard::organizations::${currentSession?.id}`, (store: ReactiveArrayStore) => new OrganizationService(graphqlClient, store)) - const member = usePersistentReactiveArrayService(`dashboard::members::${currentSession?.id}`, (store: ReactiveArrayStore) => new MemberService(graphqlClient, store)) - const namespace = usePersistentReactiveArrayService(`dashboard::namespaces::${currentSession?.id}`, (store: ReactiveArrayStore) => new NamespaceService(graphqlClient, store)) - const runtime = usePersistentReactiveArrayService(`dashboard::global_runtimes::${currentSession?.id}`, (store: ReactiveArrayStore) => new RuntimeService(graphqlClient, store)) - const project = usePersistentReactiveArrayService(`dashboard::projects::${currentSession?.id}`, (store: ReactiveArrayStore) => new ProjectService(graphqlClient, store)) - const role = usePersistentReactiveArrayService(`dashboard::roles::${currentSession?.id}`, (store: ReactiveArrayStore) => new RoleService(graphqlClient, store)) - const flow = usePersistentReactiveArrayService(`dashboard::flows::${currentSession?.id}`, (store: ReactiveArrayStore) => new FlowService(graphqlClient, store)) - const functions = usePersistentReactiveArrayService(`dashboard::functions::${currentSession?.id}`, (store: ReactiveArrayStore) => new FunctionService(graphqlClient, store)) - const datatype = usePersistentReactiveArrayService(`dashboard::datatypes::${currentSession?.id}`, (store: ReactiveArrayStore) => new DatatypeService(graphqlClient, store)) - const flowtype = usePersistentReactiveArrayService(`dashboard::flowtypes::${currentSession?.id}`, (store: ReactiveArrayStore) => new FlowTypeService(graphqlClient, store)) - const file = usePersistentReactiveArrayService(`dashboard::files::${currentSession?.id}`, FileTabsService, []) + const user = usePersistentReactiveArrayService(`dashboard::users::${currentSession?.id}`, (store) => new UserService(graphqlClient, store)) + const organization = usePersistentReactiveArrayService(`dashboard::organizations::${currentSession?.id}`, (store) => new OrganizationService(graphqlClient, store)) + const member = usePersistentReactiveArrayService(`dashboard::members::${currentSession?.id}`, (store) => new MemberService(graphqlClient, store)) + const namespace = usePersistentReactiveArrayService(`dashboard::namespaces::${currentSession?.id}`, (store) => new NamespaceService(graphqlClient, store)) + const runtime = usePersistentReactiveArrayService(`dashboard::global_runtimes::${currentSession?.id}`, (store) => new RuntimeService(graphqlClient, store)) + const project = usePersistentReactiveArrayService(`dashboard::projects::${currentSession?.id}`, (store) => new ProjectService(graphqlClient, store)) + const role = usePersistentReactiveArrayService(`dashboard::roles::${currentSession?.id}`, (store) => new RoleService(graphqlClient, store)) + const flow = usePersistentReactiveArrayService(`dashboard::flows::${currentSession?.id}`, (store) => new FlowService(graphqlClient, store)) + const functions = usePersistentReactiveArrayService(`dashboard::functions::${currentSession?.id}`, (store) => new FunctionService(graphqlClient, store)) + const datatype = usePersistentReactiveArrayService(`dashboard::datatypes::${currentSession?.id}`, (store) => new DatatypeService(graphqlClient, store)) + const flowtype = usePersistentReactiveArrayService(`dashboard::flowtypes::${currentSession?.id}`, (store) => new FlowTypeService(graphqlClient, store)) + const file = usePersistentReactiveArrayService(`dashboard::files::${flowId}`, FileTabsService, []) if (currentSession === null) router.push("/login") @@ -98,8 +88,6 @@ const ApplicationLayout: React.FC = ({children, bar, tab flowtype[1].values({namespaceId, projectId, runtimeId}) }, [runtimeId, namespaceId, projectId]) - const ref = React.useRef(null) - return > = new (store: ReactiveArrayStore) => S; -export type ServiceFactory> = ArrayServiceCtor | ((store: ReactiveArrayStore) => S); -type InitialArg> = K[] | ((svc: S) => K[]); +export type ArrayServiceCtor, R>> = new (store: ReactiveArrayStore>) => S; +export type ServiceFactory, R>> = ArrayServiceCtor | ((store: ReactiveArrayStore>) => S); +type InitialArg, R>> = View[] | ((svc: S) => View[]); type Listener = () => void; -type PersistentEntry> = { +type PersistentEntry, R>> = { service: S; - store: ReactiveArrayStore; - getSnapshot: () => K[]; + store: ReactiveArrayStore>; + getSnapshot: () => View[]; listeners: Set; }; @@ -31,30 +32,30 @@ const registry = (): Registry => { return globalThis.__sculptorPersistentReactiveServices; }; -function isConstructor>(value: ServiceFactory): value is ArrayServiceCtor { +function isConstructor, R>>(value: ServiceFactory): value is ArrayServiceCtor { return typeof value === "function" && !!value.prototype && value.prototype.constructor === value; } -function instantiateService>(factory: ServiceFactory, store: ReactiveArrayStore): S { +function instantiateService, R>>(factory: ServiceFactory, store: ReactiveArrayStore>): S { return isConstructor(factory) ? new factory(store) : factory(store); } -function ensureEntry>(key: string, factory: ServiceFactory, initial: InitialArg): PersistentEntry { +function ensureEntry, R>>(key: string, factory: ServiceFactory, initial: InitialArg): PersistentEntry { const map = registry(); const existing = map.get(key); if (existing) { - return existing as PersistentEntry; + return existing as PersistentEntry; } const listeners = new Set(); - let snapshot: K[] = Array.isArray(initial) ? [...initial] : []; + let snapshot: View[] = Array.isArray(initial) ? [...initial] : []; - const store: ReactiveArrayStore = { + const store: ReactiveArrayStore> = { getState: () => snapshot, setState: (update) => { - snapshot = typeof update === "function" ? (update as (prev: K[]) => K[])(snapshot) : update; + snapshot = typeof update === "function" ? (update as (prev: View[]) => View[])(snapshot) : update; listeners.forEach((listener) => listener()); }, }; @@ -65,7 +66,7 @@ function ensureEntry>(key: string, factory: Service snapshot = initial(service); } - const entry: PersistentEntry = { + const entry: PersistentEntry = { service, store, getSnapshot: () => snapshot, @@ -76,11 +77,11 @@ function ensureEntry>(key: string, factory: Service return entry; } -export function usePersistentReactiveArrayService>( +export function usePersistentReactiveArrayService, R>>( key: string, - factory: ServiceFactory, - initial: InitialArg = [] -): [K[], S] { + factory: ServiceFactory, + initial: InitialArg = [] +): [View[], S] { const entry = React.useMemo(() => ensureEntry(key, factory, initial), [key, factory, initial]); const subscribe = React.useCallback((listener: Listener) => { diff --git a/src/packages/ce/src/datatype/Datatype.service.ts b/src/packages/ce/src/datatype/Datatype.service.ts index e904c72c..16f4f523 100644 --- a/src/packages/ce/src/datatype/Datatype.service.ts +++ b/src/packages/ce/src/datatype/Datatype.service.ts @@ -6,13 +6,14 @@ import { import {GraphqlClient} from "@core/util/graphql-client"; import {DataType, Query} from "@code0-tech/sagittarius-graphql-types"; import dataTypeQuery from "@edition/datatype/queries/DataTypes.query.graphql" +import {View} from "@code0-tech/pictor/dist/utils/view"; export class DatatypeService extends DFlowDataTypeReactiveService { private readonly client: GraphqlClient private i = 0 - constructor(client: GraphqlClient, store: ReactiveArrayStore) { + constructor(client: GraphqlClient, store: ReactiveArrayStore>) { super(store) this.client = client } @@ -46,7 +47,7 @@ export class DatatypeService extends DFlowDataTypeReactiveService { const nodes = res.data?.namespace?.project?.primaryRuntime?.dataTypes?.nodes ?? [] nodes.forEach(dataType => { if (dataType && !this.hasById(dataType.id)) { - this.set(this.i++, new DataTypeView(dataType)) + this.set(this.i++, new View(new DataTypeView(dataType))) } }) }) diff --git a/src/packages/ce/src/flow/Flow.service.ts b/src/packages/ce/src/flow/Flow.service.ts index da4cff17..15d02433 100644 --- a/src/packages/ce/src/flow/Flow.service.ts +++ b/src/packages/ce/src/flow/Flow.service.ts @@ -16,6 +16,7 @@ import flowsQuery from "@edition/flow/queries/Flows.query.graphql"; import flowCreateMutation from "@edition/flow/mutations/Flow.create.mutation.graphql"; import flowDeleteMutation from "@edition/flow/mutations/Flow.delete.mutation.graphql"; import flowUpdateMutation from "@edition/flow/mutations/Flow.update.mutation.graphql"; +import {View} from "@code0-tech/pictor/dist/utils/view"; export class FlowService extends DFlowReactiveService { @@ -24,7 +25,7 @@ export class FlowService extends DFlowReactiveService { private flowUpdateQueue: Array private i - constructor(client: GraphqlClient, store: ReactiveArrayStore) { + constructor(client: GraphqlClient, store: ReactiveArrayStore>) { super(store) this.client = client this.flowUpdateQueue = [] @@ -72,7 +73,7 @@ export class FlowService extends DFlowReactiveService { const nodes = res.data?.namespace?.project?.flows?.nodes ?? [] nodes.forEach(flow => { if (flow && !this.hasById(flow.id)) { - this.set(this.i++, flow) + this.set(this.i++, new View(flow)) } }) }) @@ -138,7 +139,7 @@ export class FlowService extends DFlowReactiveService { const flow = result.data.namespacesProjectsFlowsCreate.flow if (!this.hasById(flow.id)) { flow.nodes = {nodes: []} //TODO: to avoid issues, when fixed in pictor - this.add(flow) + this.add(new View(flow)) } } @@ -164,6 +165,11 @@ export class FlowService extends DFlowReactiveService { } async flowUpdate(payload: NamespacesProjectsFlowsUpdateInput): Promise { + + const flow = this.getById(payload.flowId) + + if (!flow) return Promise.reject() + const result = await this.client.mutate({ mutation: flowUpdateMutation, variables: { @@ -172,7 +178,10 @@ export class FlowService extends DFlowReactiveService { }) if (result.data && result.data.namespacesProjectsFlowsUpdate && result.data.namespacesProjectsFlowsUpdate.flow) { - //TODO: update store if needed + const flowIndex = this.values().findIndex(f => f.id === payload.flowId) + flow.updatedAt = result.data.namespacesProjectsFlowsUpdate.flow.updatedAt + flow.editedAt = undefined + this.set(flowIndex, new View(flow)) } return result.data?.namespacesProjectsFlowsUpdate ?? undefined diff --git a/src/packages/ce/src/flowtype/FlowTypeService.ts b/src/packages/ce/src/flowtype/FlowTypeService.ts index aae13eda..c7f4f4fd 100644 --- a/src/packages/ce/src/flowtype/FlowTypeService.ts +++ b/src/packages/ce/src/flowtype/FlowTypeService.ts @@ -2,13 +2,14 @@ import {DFlowTypeDependencies, DFlowTypeReactiveService, FlowTypeView, ReactiveA import {GraphqlClient} from "@core/util/graphql-client"; import {FlowType, Query} from "@code0-tech/sagittarius-graphql-types"; import flowTypesQuery from "@edition/flowtype/queries/FlowTypes.query.graphql" +import {View} from "@code0-tech/pictor/dist/utils/view"; export class FlowTypeService extends DFlowTypeReactiveService { private readonly client: GraphqlClient private i = 0 - constructor(client: GraphqlClient, store: ReactiveArrayStore) { + constructor(client: GraphqlClient, store: ReactiveArrayStore>) { super(store) this.client = client } @@ -46,7 +47,7 @@ export class FlowTypeService extends DFlowTypeReactiveService { const nodes = res.data?.namespace?.project?.primaryRuntime?.flowTypes?.nodes ?? [] nodes.forEach(flowType => { if (flowType && !this.hasById(flowType.id)) { - this.set(this.i++, new FlowTypeView(flowType)) + this.set(this.i++, new View(new FlowTypeView(flowType))) } }) }) diff --git a/src/packages/ce/src/function/Function.service.ts b/src/packages/ce/src/function/Function.service.ts index 4353b38f..d4630fd3 100644 --- a/src/packages/ce/src/function/Function.service.ts +++ b/src/packages/ce/src/function/Function.service.ts @@ -7,13 +7,14 @@ import { import {GraphqlClient} from "@core/util/graphql-client"; import {FunctionDefinition, Query} from "@code0-tech/sagittarius-graphql-types"; import functionsQuery from "@edition/function/queries/Functions.query.graphql"; +import {View} from "@code0-tech/pictor/dist/utils/view"; export class FunctionService extends DFlowFunctionReactiveService { private readonly client: GraphqlClient private i = 0 - constructor(client: GraphqlClient, store: ReactiveArrayStore) { + constructor(client: GraphqlClient, store: ReactiveArrayStore>) { super(store) this.client = client } @@ -47,7 +48,7 @@ export class FunctionService extends DFlowFunctionReactiveService { const nodes = res.data?.namespace?.project?.primaryRuntime?.functionDefinitions?.nodes ?? [] nodes.forEach(functionD => { if (functionD && !this.hasById(functionD.id)) { - this.set(this.i++, new FunctionDefinitionView(functionD)) + this.set(this.i++, new View(new FunctionDefinitionView(functionD))) } }) }) diff --git a/src/packages/ce/src/member/Member.service.ts b/src/packages/ce/src/member/Member.service.ts index 08f6c42e..4838c579 100644 --- a/src/packages/ce/src/member/Member.service.ts +++ b/src/packages/ce/src/member/Member.service.ts @@ -20,13 +20,14 @@ import membersQuery from "./queries/Members.query.graphql" import memberAssignRoleMutation from "./mutations/Member.assignRoles.mutation.graphql" import memberDeleteMutation from "./mutations/Member.delete.mutation.graphql" import memberInviteMutation from "./mutations/Member.invite.mutation.graphql" +import {View} from "@code0-tech/pictor/dist/utils/view"; export class MemberService extends DNamespaceMemberReactiveService { private readonly client: GraphqlClient private i = 0 - constructor(client: GraphqlClient, store: ReactiveArrayStore) { + constructor(client: GraphqlClient, store: ReactiveArrayStore>) { super(store) this.client = client } @@ -52,7 +53,7 @@ export class MemberService extends DNamespaceMemberReactiveService { const nodes = res.data?.namespace?.members?.nodes ?? [] nodes.forEach(member => { if (member && !this.hasById(member.id)) { - this.set(this.i++, new DNamespaceMemberView(member)) + this.set(this.i++, new View(new DNamespaceMemberView(member))) } }) }) @@ -87,7 +88,7 @@ export class MemberService extends DNamespaceMemberReactiveService { } }) - this.set(index, newMember) + this.set(index, new View(newMember)) } return result.data?.namespacesMembersAssignRoles ?? undefined @@ -120,7 +121,7 @@ export class MemberService extends DNamespaceMemberReactiveService { if (result.data && result.data.namespacesMembersInvite && result.data.namespacesMembersInvite.namespaceMember) { const member = result.data.namespacesMembersInvite.namespaceMember - this.set(this.i++, new DNamespaceMemberView(member)) + this.set(this.i++, new View(new DNamespaceMemberView(member))) } return result.data?.namespacesMembersInvite ?? undefined diff --git a/src/packages/ce/src/namespace/Namespace.service.ts b/src/packages/ce/src/namespace/Namespace.service.ts index 5a7a1f5f..532587df 100644 --- a/src/packages/ce/src/namespace/Namespace.service.ts +++ b/src/packages/ce/src/namespace/Namespace.service.ts @@ -2,12 +2,13 @@ import {DNamespaceReactiveService, DNamespaceView, ReactiveArrayStore} from "@co import {GraphqlClient} from "@core/util/graphql-client"; import {Namespace, Query} from "@code0-tech/sagittarius-graphql-types"; import namespaceQuery from "./queries/Namespace.query.graphql"; +import {View} from "@code0-tech/pictor/dist/utils/view"; export class NamespaceService extends DNamespaceReactiveService { private readonly client: GraphqlClient - constructor(client: GraphqlClient, store: ReactiveArrayStore) { + constructor(client: GraphqlClient, store: ReactiveArrayStore>) { super(store); this.client = client } @@ -24,7 +25,7 @@ export class NamespaceService extends DNamespaceReactiveService { if (!data) return if (data.namespace) { - this.add(new DNamespaceView(data.namespace)) + this.add(new View(new DNamespaceView(data.namespace))) } }) diff --git a/src/packages/ce/src/organization/Organization.service.ts b/src/packages/ce/src/organization/Organization.service.ts index 50063f9e..3247504d 100644 --- a/src/packages/ce/src/organization/Organization.service.ts +++ b/src/packages/ce/src/organization/Organization.service.ts @@ -15,13 +15,14 @@ import createOrganizationMutation from "./mutations/Organization.create.mutation import updateOrganizationMutation from "./mutations/Organization.update.mutation.graphql"; import deleteOrganizationMutation from "./mutations/Organization.delete.mutation.graphql"; import organizationQuery from "./queries/Organization.query.graphql"; +import {View} from "@code0-tech/pictor/dist/utils/view"; export class OrganizationService extends DOrganizationReactiveService { private readonly client: GraphqlClient private i = 0; - constructor(client: GraphqlClient, store: ReactiveArrayStore) { + constructor(client: GraphqlClient, store: ReactiveArrayStore>) { super(store); this.client = client } @@ -36,7 +37,7 @@ export class OrganizationService extends DOrganizationReactiveService { if (data.organizations && data.organizations.nodes) { data.organizations.nodes.forEach((organization) => { - if (organization && !this.hasById(organization.id)) this.set(this.i++, new DOrganizationView(organization)) + if (organization && !this.hasById(organization.id)) this.set(this.i++, new View(new DOrganizationView(organization))) }) } }) @@ -59,7 +60,7 @@ export class OrganizationService extends DOrganizationReactiveService { if (result.data && result.data.organizationsCreate && result.data.organizationsCreate.organization) { const organization = result.data.organizationsCreate.organization if (!this.hasById(organization.id)) { - this.add(new DOrganizationView(organization)) + this.add(new View(new DOrganizationView(organization))) } } @@ -95,7 +96,7 @@ export class OrganizationService extends DOrganizationReactiveService { if (result.data && result.data.organizationsUpdate && result.data.organizationsUpdate.organization) { const organization = result.data.organizationsUpdate.organization const index = this.values().findIndex(o => o.id === organization.id) - this.set(index, new DOrganizationView(organization)) + this.set(index, new View(new DOrganizationView(organization))) } diff --git a/src/packages/ce/src/project/Project.service.ts b/src/packages/ce/src/project/Project.service.ts index ab94b329..33c0e21b 100644 --- a/src/packages/ce/src/project/Project.service.ts +++ b/src/packages/ce/src/project/Project.service.ts @@ -18,13 +18,14 @@ import { import {GraphqlClient} from "@core/util/graphql-client"; import projectsQuery from "./queries/Projects.query.graphql" import projectCreateMutation from "./mutations/Project.create.mutation.graphql" +import {View} from "@code0-tech/pictor/dist/utils/view"; export class ProjectService extends DNamespaceProjectReactiveService { private readonly client: GraphqlClient private i = 0; - constructor(client: GraphqlClient, store: ReactiveArrayStore) { + constructor(client: GraphqlClient, store: ReactiveArrayStore>) { super(store); this.client = client } @@ -52,7 +53,7 @@ export class ProjectService extends DNamespaceProjectReactiveService { project.namespace?.id === namespaceId && !this.hasById(project.id) ) { - this.set(this.i++, new DNamespaceProjectView(project)) + this.set(this.i++, new View(new DNamespaceProjectView(project))) } }) }) @@ -81,7 +82,7 @@ export class ProjectService extends DNamespaceProjectReactiveService { if (result.data && result.data.namespacesProjectsCreate && result.data.namespacesProjectsCreate.namespaceProject) { const project = result.data.namespacesProjectsCreate.namespaceProject if (!this.hasById(project.id)) { - this.add(new DNamespaceProjectView(project)) + this.add(new View(new DNamespaceProjectView(project))) } } diff --git a/src/packages/ce/src/role/Role.service.ts b/src/packages/ce/src/role/Role.service.ts index db23bca7..e52fc04d 100644 --- a/src/packages/ce/src/role/Role.service.ts +++ b/src/packages/ce/src/role/Role.service.ts @@ -25,13 +25,14 @@ import roleUpdateMutation from "@edition/role/mutations/Role.update.mutation.gra import roleDeleteMutation from "@edition/role/mutations/Role.delete.mutation.graphql"; import roleAssignAbilitiesMutation from "@edition/role/mutations/Role.assignAbilities.mutation.graphql"; import roleAssignProjectsMutation from "@edition/role/mutations/Role.assignProjects.mutation.graphql"; +import {View} from "@code0-tech/pictor/dist/utils/view"; export class RoleService extends DNamespaceRoleReactiveService { private readonly client: GraphqlClient private i = 0; - constructor(client: GraphqlClient, store: ReactiveArrayStore) { + constructor(client: GraphqlClient, store: ReactiveArrayStore>) { super(store); this.client = client } @@ -61,7 +62,7 @@ export class RoleService extends DNamespaceRoleReactiveService { role.namespace?.id === namespaceId && !this.hasById(role.id) ) { - this.set(this.i++, new DNamespaceRoleView(role)) + this.set(this.i++, new View(new DNamespaceRoleView(role))) } }) }) @@ -93,7 +94,7 @@ export class RoleService extends DNamespaceRoleReactiveService { abilities: payload.abilities }) - this.set(index, newRole) + this.set(index, new View(newRole)) } return result.data?.namespacesRolesAssignAbilities ?? undefined @@ -122,7 +123,7 @@ export class RoleService extends DNamespaceRoleReactiveService { } }) - this.set(index, newRole) + this.set(index, new View(newRole)) } return result.data?.namespacesRolesAssignProjects ?? undefined @@ -146,7 +147,7 @@ export class RoleService extends DNamespaceRoleReactiveService { name: payload.name }) - this.set(index, newRole) + this.set(index, new View(newRole)) } return result.data?.namespacesRolesUpdate ?? undefined diff --git a/src/packages/ce/src/runtime/Runtime.service.ts b/src/packages/ce/src/runtime/Runtime.service.ts index 959e17f4..ac090117 100644 --- a/src/packages/ce/src/runtime/Runtime.service.ts +++ b/src/packages/ce/src/runtime/Runtime.service.ts @@ -19,13 +19,14 @@ import createRuntimeMutation from "./mutations/Runtime.create.mutation.graphql" import updateRuntimeMutation from "./mutations/Runtime.update.mutation.graphql" import deleteRuntimeMutation from "./mutations/Runtime.delete.mutation.graphql" import rotateTokenRuntimeMutation from "./mutations/Runtime.rotateToken.mutation.graphql" +import {View} from "@code0-tech/pictor/dist/utils/view"; export class RuntimeService extends DRuntimeReactiveService { private readonly client: GraphqlClient private i = 0 - constructor(client: GraphqlClient, store: ReactiveArrayStore) { + constructor(client: GraphqlClient, store: ReactiveArrayStore>) { super(store); this.client = client } @@ -50,7 +51,7 @@ export class RuntimeService extends DRuntimeReactiveService { const nodes = res.data?.globalRuntimes?.nodes ?? [] nodes.forEach(runtime => { if (runtime && !this.hasById(runtime.id)) { - this.set(this.i++, new DRuntimeView(runtime)) + this.set(this.i++, new View(new DRuntimeView(runtime))) } }) }) @@ -78,7 +79,7 @@ export class RuntimeService extends DRuntimeReactiveService { runtime.namespace?.id === namespaceId && !this.hasById(runtime.id) ) { - this.set(this.i++, new DRuntimeView(runtime)) + this.set(this.i++, new View(new DRuntimeView(runtime))) } }) }) @@ -98,7 +99,7 @@ export class RuntimeService extends DRuntimeReactiveService { if (result.data && result.data.runtimesCreate && result.data.runtimesCreate.runtime) { const runtime = result.data.runtimesCreate.runtime if (!this.hasById(runtime.id)) { - this.add(new DRuntimeView(runtime)) + this.add(new View(new DRuntimeView(runtime))) } } @@ -116,7 +117,7 @@ export class RuntimeService extends DRuntimeReactiveService { if (result.data && result.data.runtimesUpdate && result.data.runtimesUpdate.runtime) { const runtime = result.data.runtimesUpdate.runtime const index = this.values().findIndex(r => r.id === runtime.id) - this.set(index, new DRuntimeView(runtime)) + this.set(index, new View(new DRuntimeView(runtime))) } @@ -152,7 +153,7 @@ export class RuntimeService extends DRuntimeReactiveService { if (result.data && result.data.runtimesRotateToken && result.data.runtimesRotateToken.runtime) { const runtime = result.data.runtimesRotateToken.runtime const index = this.values().findIndex(r => r.id === runtime.id) - this.set(index, new DRuntimeView(runtime)) + this.set(index, new View(new DRuntimeView(runtime))) } diff --git a/src/packages/ce/src/user/User.service.ts b/src/packages/ce/src/user/User.service.ts index 51daf1d6..89c3d4d5 100644 --- a/src/packages/ce/src/user/User.service.ts +++ b/src/packages/ce/src/user/User.service.ts @@ -40,13 +40,14 @@ import passwordResetRequestMutation from "./mutations/User.passwordResetRequest. import usersQuery from "./queries/Users.query.graphql"; import userByUsernameQuery from "./queries/User.byUsername.query.graphql"; import userByIdQuery from "./queries/User.byId.query.graphql"; +import {View} from "@code0-tech/pictor/dist/utils/view"; export class UserService extends DUserReactiveService { private readonly client: GraphqlClient private i = 0; - constructor(client: GraphqlClient, store: ReactiveArrayStore) { + constructor(client: GraphqlClient, store: ReactiveArrayStore>) { super(store); this.client = client } @@ -59,10 +60,10 @@ export class UserService extends DUserReactiveService { const data = result.data if (!data) return - if (data && data.currentUser && !this.hasById(data.currentUser.id)) this.set(this.i++, new DUserView(data.currentUser)) + if (data && data.currentUser && !this.hasById(data.currentUser.id)) this.set(this.i++, new View(new DUserView(data.currentUser))) if (data.users && data.users.nodes) { data.users.nodes.forEach((user) => { - if (user && !(user.id === data.currentUser?.id) && !this.hasById(user.id)) this.set(this.i++, new DUserView(user)) + if (user && !(user.id === data.currentUser?.id) && !this.hasById(user.id)) this.set(this.i++, new View(new DUserView(user))) }) } }) @@ -83,7 +84,7 @@ export class UserService extends DUserReactiveService { const data = result.data if (!data) return - if (data && data.user && !this.hasById(data.user.id)) this.set(this.i++, new DUserView(data.user)) + if (data && data.user && !this.hasById(data.user.id)) this.set(this.i++, new View(new DUserView(data.user))) }) } @@ -102,7 +103,7 @@ export class UserService extends DUserReactiveService { const data = result.data if (!data) return - if (data && data.user && !this.hasById(data.user.id)) this.set(this.i++, new DUserView(data.user)) + if (data && data.user && !this.hasById(data.user.id)) this.set(this.i++, new View(new DUserView(data.user))) }) return super.getByUsername(username) @@ -163,7 +164,7 @@ export class UserService extends DUserReactiveService { }) if (result.data && result.data.usersLogin && result.data.usersLogin.userSession?.user && !this.hasById(result.data.usersLogin.userSession?.user.id)) { - this.add(new DUserView(result.data.usersLogin.userSession.user)) + this.add(new View(new DUserView(result.data.usersLogin.userSession.user))) } return result.data?.usersLogin ?? undefined @@ -231,7 +232,7 @@ export class UserService extends DUserReactiveService { }) if (result.data && result.data.usersRegister && result.data.usersRegister.userSession?.user && !this.hasById(result.data.usersRegister.userSession?.user.id)) { - this.add(new DUserView(result.data.usersRegister.userSession.user)) + this.add(new View(new DUserView(result.data.usersRegister.userSession.user))) } return result.data?.usersRegister ?? undefined From 135abcf13ccf8fd263850055120dfde1a53da268 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Mon, 26 Jan 2026 19:39:00 +0100 Subject: [PATCH 072/173] feat: update @code0-tech/pictor and @code0-tech/sagittarius-graphql-types dependencies to latest versions --- package-lock.json | 16 ++++++++-------- package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9c04f5bc..1fe9df40 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0", "dependencies": { "@apollo/client": "^4.0.9", - "@code0-tech/pictor": "^0.0.0-mvp.33", + "@code0-tech/pictor": "^0.0.0-mvp.34", "graphql": "^16.12.0", "graphql-tag": "^2.12.6", "next": "16.0.7", @@ -352,12 +352,12 @@ } }, "node_modules/@code0-tech/pictor": { - "version": "0.0.0-mvp.33", - "resolved": "https://registry.npmjs.org/@code0-tech/pictor/-/pictor-0.0.0-mvp.33.tgz", - "integrity": "sha512-teraeq03XkaFaR9ZwGqJja7iR03sLAqZlQ3KpoICgmdiFFcmks3ezIlZfJGWZ0dlGjjTjDPLvt43brkUe1s0wg==", + "version": "0.0.0-mvp.34", + "resolved": "https://registry.npmjs.org/@code0-tech/pictor/-/pictor-0.0.0-mvp.34.tgz", + "integrity": "sha512-CNM48XT0OtefRvKyRAIg4aCs6f257YPfphICzdf7xfXSQc29L7byYvwjk7r8NIt2oJY8vnuDHMYq5n8ErL4LhA==", "peerDependencies": { "@ariakit/react": "^0.4.17", - "@code0-tech/sagittarius-graphql-types": "0.0.0-a2b1f5e9adf8f52b5a0f235ca9906ac5a699b4fc", + "@code0-tech/sagittarius-graphql-types": "0.0.0-e610ffe24a7dc3cf7b4c285994830412410f229e", "@radix-ui/react-checkbox": "^1.3.3", "@radix-ui/react-context-menu": "^2.2.16", "@radix-ui/react-dialog": "^1.1.15", @@ -383,9 +383,9 @@ } }, "node_modules/@code0-tech/sagittarius-graphql-types": { - "version": "0.0.0-a2b1f5e9adf8f52b5a0f235ca9906ac5a699b4fc", - "resolved": "https://registry.npmjs.org/@code0-tech/sagittarius-graphql-types/-/sagittarius-graphql-types-0.0.0-a2b1f5e9adf8f52b5a0f235ca9906ac5a699b4fc.tgz", - "integrity": "sha512-LmdOiCHFRiUDXh0Ol89AA3BvN95t9El2GZhhbgXgNmyVYIXJENaZCMCVzAG/W3bhNsGQQARhFNcAGp3kxnxx+Q==", + "version": "0.0.0-e610ffe24a7dc3cf7b4c285994830412410f229e", + "resolved": "https://registry.npmjs.org/@code0-tech/sagittarius-graphql-types/-/sagittarius-graphql-types-0.0.0-e610ffe24a7dc3cf7b4c285994830412410f229e.tgz", + "integrity": "sha512-q6yNjjUSqP2F/MlkaDkZITU8dP/Yv1yAVRgrduFRT01I5v7rovAVwiDT1W5SoVSEsuhiUOXs3oAlz+Ri6nVY8g==", "peer": true }, "node_modules/@daybrush/utils": { diff --git a/package.json b/package.json index 99b834fd..9ed46ed2 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ }, "dependencies": { "@apollo/client": "^4.0.9", - "@code0-tech/pictor": "^0.0.0-mvp.33", + "@code0-tech/pictor": "^0.0.0-mvp.34", "graphql": "^16.12.0", "graphql-tag": "^2.12.6", "next": "16.0.7", From c7cf5acd8d7f82758301253c3313d4c8f37a2969 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Mon, 26 Jan 2026 21:55:02 +0100 Subject: [PATCH 073/173] feat: redirect to login if current session is null and update dependencies in useEffect --- src/app/(flow)/layout.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/app/(flow)/layout.tsx b/src/app/(flow)/layout.tsx index 1107a56e..7ea24e1c 100644 --- a/src/app/(flow)/layout.tsx +++ b/src/app/(flow)/layout.tsx @@ -63,6 +63,8 @@ const ApplicationLayout: React.FC = ({children, bar, tab const projectId: NamespaceProject['id'] = `gid://sagittarius/NamespaceProject/${projectIndex}` const flowId: Flow['id'] = `gid://sagittarius/Flow/${flowIndex}` + if (currentSession === null) router.push("/login") + const user = usePersistentReactiveArrayService(`dashboard::users::${currentSession?.id}`, (store) => new UserService(graphqlClient, store)) const organization = usePersistentReactiveArrayService(`dashboard::organizations::${currentSession?.id}`, (store) => new OrganizationService(graphqlClient, store)) const member = usePersistentReactiveArrayService(`dashboard::members::${currentSession?.id}`, (store) => new MemberService(graphqlClient, store)) @@ -77,16 +79,17 @@ const ApplicationLayout: React.FC = ({children, bar, tab const file = usePersistentReactiveArrayService(`dashboard::files::${flowId}`, FileTabsService, []) - if (currentSession === null) router.push("/login") const runtimeId = React.useMemo(() => project[1].getById(projectId, {namespaceId})?.primaryRuntime?.id, [projectId, project[0], namespaceId]) React.useEffect(() => { + if (!currentSession) return + flow[1].values({namespaceId, projectId}) functions[1].values({namespaceId, projectId, runtimeId}) datatype[1].values({namespaceId, projectId, runtimeId}) flowtype[1].values({namespaceId, projectId, runtimeId}) - }, [runtimeId, namespaceId, projectId]) + }, [runtimeId, namespaceId, projectId, currentSession, flow, functions, datatype, flowtype]) return From c3ed9a6bcfe446eb9d27f7a483781974202d48d0 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Tue, 27 Jan 2026 13:29:53 +0100 Subject: [PATCH 074/173] feat: update FolderView to manage flow creation dialog state and button interaction --- src/packages/ce/src/ui-flow/folder/FolderView.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/packages/ce/src/ui-flow/folder/FolderView.tsx b/src/packages/ce/src/ui-flow/folder/FolderView.tsx index 8e7420f4..c4ce4c5a 100644 --- a/src/packages/ce/src/ui-flow/folder/FolderView.tsx +++ b/src/packages/ce/src/ui-flow/folder/FolderView.tsx @@ -99,6 +99,7 @@ export const FolderView: React.FC = () => { return <> setCreateDialogOpen(open)} onCreate={createFlow} flowTypeId={flowTypeId}/> @@ -110,7 +111,10 @@ export const FolderView: React.FC = () => { - From 8b4b4b8847f606f429c5637383fe6fb4aa2bf02d Mon Sep 17 00:00:00 2001 From: nicosammito Date: Tue, 27 Jan 2026 13:32:32 +0100 Subject: [PATCH 075/173] feat: update @code0-tech/pictor to 0.0.0-mvp.35 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1fe9df40..a2d9b4ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0", "dependencies": { "@apollo/client": "^4.0.9", - "@code0-tech/pictor": "^0.0.0-mvp.34", + "@code0-tech/pictor": "^0.0.0-mvp.35", "graphql": "^16.12.0", "graphql-tag": "^2.12.6", "next": "16.0.7", @@ -352,9 +352,9 @@ } }, "node_modules/@code0-tech/pictor": { - "version": "0.0.0-mvp.34", - "resolved": "https://registry.npmjs.org/@code0-tech/pictor/-/pictor-0.0.0-mvp.34.tgz", - "integrity": "sha512-CNM48XT0OtefRvKyRAIg4aCs6f257YPfphICzdf7xfXSQc29L7byYvwjk7r8NIt2oJY8vnuDHMYq5n8ErL4LhA==", + "version": "0.0.0-mvp.35", + "resolved": "https://registry.npmjs.org/@code0-tech/pictor/-/pictor-0.0.0-mvp.35.tgz", + "integrity": "sha512-c0JIZgVw4J8wdPBB0aCn1p0NeyWZyhEMks+Outl1BnL9zjTOZ+hbYVmt+qHmmx+A/aI2oaye8+WYNd5xe7+4Rw==", "peerDependencies": { "@ariakit/react": "^0.4.17", "@code0-tech/sagittarius-graphql-types": "0.0.0-e610ffe24a7dc3cf7b4c285994830412410f229e", diff --git a/package.json b/package.json index 9ed46ed2..dedada3a 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ }, "dependencies": { "@apollo/client": "^4.0.9", - "@code0-tech/pictor": "^0.0.0-mvp.34", + "@code0-tech/pictor": "^0.0.0-mvp.35", "graphql": "^16.12.0", "graphql-tag": "^2.12.6", "next": "16.0.7", From 137e5e8c1d3906c5e4e49557bcf577abd198ae63 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Tue, 27 Jan 2026 13:39:46 +0100 Subject: [PATCH 076/173] feat: optimize ApplicationBarView by memoizing namespaceIndex for improved performance --- .../ce/src/ui-dashboard/application/ApplicationBarView.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/packages/ce/src/ui-dashboard/application/ApplicationBarView.tsx b/src/packages/ce/src/ui-dashboard/application/ApplicationBarView.tsx index 35a0224b..f079bb7a 100644 --- a/src/packages/ce/src/ui-dashboard/application/ApplicationBarView.tsx +++ b/src/packages/ce/src/ui-dashboard/application/ApplicationBarView.tsx @@ -29,6 +29,7 @@ export const ApplicationBarView: React.FC = () => { const [loading, startTransition] = React.useTransition() const currentUser = React.useMemo(() => userService.getById(currentSession?.user?.id), [userStore, currentSession]) + const namespaceIndex = React.useMemo(() => currentUser?.namespace?.id?.match(/Namespace\/(\d+)$/)?.[1], [currentUser]) const userMenu = React.useMemo(() => { @@ -47,8 +48,6 @@ export const ApplicationBarView: React.FC = () => { }) } - const namespaceIndex = currentUser?.namespace?.id?.match(/Namespace\/(\d+)$/)?.[1] - return @@ -65,7 +64,7 @@ export const ApplicationBarView: React.FC = () => { Logout - }, [currentUser, currentSession]) + }, [currentUser, currentSession, namespaceIndex]) return From 2eb31e19ee57883252c76041fac2c4b7e74d1b40 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Tue, 27 Jan 2026 13:41:26 +0100 Subject: [PATCH 077/173] feat: update layout to remove layout splitter and streamline container properties --- src/app/(dashboard)/layout.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/(dashboard)/layout.tsx b/src/app/(dashboard)/layout.tsx index 31526e66..7d6dc8f7 100644 --- a/src/app/(dashboard)/layout.tsx +++ b/src/app/(dashboard)/layout.tsx @@ -52,7 +52,7 @@ const ApplicationLayout: React.FC = ({children, bar, tab if (currentSession === null) router.push("/login") return -
{bar} @@ -60,7 +60,7 @@ const ApplicationLayout: React.FC = ({children, bar, tab
}> - + {children}
From e0b1029e85a68a3ad32ee611a7e053c4159ce88a Mon Sep 17 00:00:00 2001 From: nicosammito Date: Wed, 28 Jan 2026 11:47:32 +0100 Subject: [PATCH 078/173] feat: enhance FolderView with new flow creation button and tooltip integration --- .../ce/src/ui-flow/folder/FolderView.tsx | 70 +++++++++++-------- 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src/packages/ce/src/ui-flow/folder/FolderView.tsx b/src/packages/ce/src/ui-flow/folder/FolderView.tsx index c4ce4c5a..8e96bf2e 100644 --- a/src/packages/ce/src/ui-flow/folder/FolderView.tsx +++ b/src/packages/ce/src/ui-flow/folder/FolderView.tsx @@ -16,10 +16,9 @@ import { TooltipContent, TooltipPortal, TooltipTrigger, - useService, - useStore + useService } from "@code0-tech/pictor"; -import {IconArrowsMaximize, IconArrowsMinimize, IconCircleDot} from "@tabler/icons-react"; +import {IconArrowsMaximize, IconArrowsMinimize, IconCircleDot, IconPlus} from "@tabler/icons-react"; import {useParams, useRouter} from "next/navigation"; import {Flow, FlowType, NamespaceProject} from "@code0-tech/sagittarius-graphql-types"; import {FlowService} from "@edition/flow/Flow.service"; @@ -27,6 +26,7 @@ import { DFlowFolderContextMenuGroupData, DFlowFolderContextMenuItemData } from "@code0-tech/pictor/dist/components/d-flow-folder/DFlowFolderContextMenu"; +import {ButtonGroup} from "@code0-tech/pictor/dist/components/button-group/ButtonGroup"; export const FolderView: React.FC = () => { @@ -111,18 +111,28 @@ export const FolderView: React.FC = () => { - - + + + + + + + Add new flow + + + + + @@ -136,7 +146,7 @@ export const FolderView: React.FC = () => { @@ -150,7 +160,7 @@ export const FolderView: React.FC = () => { @@ -160,26 +170,24 @@ export const FolderView: React.FC = () => { - +
}> -
- { - const number = flow.id?.match(/Flow\/(\d+)$/)?.[1] - router.push(`/namespace/${namespaceIndex}/project/${projectIndex}/flow/${number}`) - }} - onCreate={flowTypeId => { - setCreateDialogOpen(true) - setFlowTypeId(flowTypeId) - }} - onDelete={contextData => { - setDeleteDialogOpen(true) - setContextData(contextData) - }} - namespaceId={`gid://sagittarius/Namespace/${namespaceIndex}`} - projectId={`gid://sagittarius/NamespaceProject/${projectIndex}`}/> -
+ { + const number = flow.id?.match(/Flow\/(\d+)$/)?.[1] + router.push(`/namespace/${namespaceIndex}/project/${projectIndex}/flow/${number}`) + }} + onCreate={flowTypeId => { + setCreateDialogOpen(true) + setFlowTypeId(flowTypeId) + }} + onDelete={contextData => { + setDeleteDialogOpen(true) + setContextData(contextData) + }} + namespaceId={`gid://sagittarius/Namespace/${namespaceIndex}`} + projectId={`gid://sagittarius/NamespaceProject/${projectIndex}`}/>
} \ No newline at end of file From 076cf8b461af2732ca803732b1d5a13ecfff48b9 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Wed, 28 Jan 2026 11:48:03 +0100 Subject: [PATCH 079/173] feat: update @code0-tech/pictor and @tabler/icons-react to latest versions --- package-lock.json | 57 +++++++++++++++++++++++++++++++++++++---------- package.json | 2 +- 2 files changed, 46 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index a2d9b4ed..becd72db 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0", "dependencies": { "@apollo/client": "^4.0.9", - "@code0-tech/pictor": "^0.0.0-mvp.35", + "@code0-tech/pictor": "^0.0.0-mvp.36", "graphql": "^16.12.0", "graphql-tag": "^2.12.6", "next": "16.0.7", @@ -352,9 +352,9 @@ } }, "node_modules/@code0-tech/pictor": { - "version": "0.0.0-mvp.35", - "resolved": "https://registry.npmjs.org/@code0-tech/pictor/-/pictor-0.0.0-mvp.35.tgz", - "integrity": "sha512-c0JIZgVw4J8wdPBB0aCn1p0NeyWZyhEMks+Outl1BnL9zjTOZ+hbYVmt+qHmmx+A/aI2oaye8+WYNd5xe7+4Rw==", + "version": "0.0.0-mvp.36", + "resolved": "https://registry.npmjs.org/@code0-tech/pictor/-/pictor-0.0.0-mvp.36.tgz", + "integrity": "sha512-WXhCr1msENsOD6JHyAevP4L/5BMnybpV1OxQVsD0LrO6jl8Wow78kdL53NEP7C4py4/EDrKcO5OWr+hGsmEhCQ==", "peerDependencies": { "@ariakit/react": "^0.4.17", "@code0-tech/sagittarius-graphql-types": "0.0.0-e610ffe24a7dc3cf7b4c285994830412410f229e", @@ -362,13 +362,14 @@ "@radix-ui/react-context-menu": "^2.2.16", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-dropdown-menu": "^2.1.16", + "@radix-ui/react-hover-card": "^1.1.15", "@radix-ui/react-one-time-password-field": "^0.1.8", "@radix-ui/react-radio-group": "^1.3.8", "@radix-ui/react-scroll-area": "^1.2.10", "@radix-ui/react-tabs": "^1.1.13", "@radix-ui/react-toggle-group": "^1.1.11", "@radix-ui/react-tooltip": "^1.2.8", - "@tabler/icons-react": "3.35.0", + "@tabler/icons-react": "3.36.1", "@xyflow/react": "^12.10.0", "cmdk": "^1.1.1", "js-md5": "^0.8.3", @@ -2002,6 +2003,38 @@ } } }, + "node_modules/@radix-ui/react-hover-card": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.15.tgz", + "integrity": "sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-id": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", @@ -2653,9 +2686,9 @@ } }, "node_modules/@tabler/icons": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-3.35.0.tgz", - "integrity": "sha512-yYXe+gJ56xlZFiXwV9zVoe3FWCGuZ/D7/G4ZIlDtGxSx5CGQK110wrnT29gUj52kEZoxqF7oURTk97GQxELOFQ==", + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-3.36.1.tgz", + "integrity": "sha512-f4Jg3Fof/Vru5ioix/UO4GX+sdDsF9wQo47FbtvG+utIYYVQ/QVAC0QYgcBbAjQGfbdOh2CCf0BgiFOF9Ixtjw==", "license": "MIT", "peer": true, "funding": { @@ -2664,13 +2697,13 @@ } }, "node_modules/@tabler/icons-react": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-3.35.0.tgz", - "integrity": "sha512-XG7t2DYf3DyHT5jxFNp5xyLVbL4hMJYJhiSdHADzAjLRYfL7AnjlRfiHDHeXxkb2N103rEIvTsBRazxXtAUz2g==", + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-3.36.1.tgz", + "integrity": "sha512-/8nOXeNeMoze9xY/QyEKG65wuvRhkT3q9aytaur6Gj8bYU2A98YVJyLc9MRmc5nVvpy+bRlrrwK/Ykr8WGyUWg==", "license": "MIT", "peer": true, "dependencies": { - "@tabler/icons": "3.35.0" + "@tabler/icons": "" }, "funding": { "type": "github", diff --git a/package.json b/package.json index dedada3a..81a45973 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ }, "dependencies": { "@apollo/client": "^4.0.9", - "@code0-tech/pictor": "^0.0.0-mvp.35", + "@code0-tech/pictor": "^0.0.0-mvp.36", "graphql": "^16.12.0", "graphql-tag": "^2.12.6", "next": "16.0.7", From 47c386f5047dbb69b906dacdffce348441fce7fe Mon Sep 17 00:00:00 2001 From: nicosammito Date: Wed, 28 Jan 2026 14:46:52 +0100 Subject: [PATCH 080/173] feat: update @code0-tech/pictor to version 0.0.0-mvp.37 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index becd72db..94a592fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0", "dependencies": { "@apollo/client": "^4.0.9", - "@code0-tech/pictor": "^0.0.0-mvp.36", + "@code0-tech/pictor": "^0.0.0-mvp.37", "graphql": "^16.12.0", "graphql-tag": "^2.12.6", "next": "16.0.7", @@ -352,9 +352,9 @@ } }, "node_modules/@code0-tech/pictor": { - "version": "0.0.0-mvp.36", - "resolved": "https://registry.npmjs.org/@code0-tech/pictor/-/pictor-0.0.0-mvp.36.tgz", - "integrity": "sha512-WXhCr1msENsOD6JHyAevP4L/5BMnybpV1OxQVsD0LrO6jl8Wow78kdL53NEP7C4py4/EDrKcO5OWr+hGsmEhCQ==", + "version": "0.0.0-mvp.37", + "resolved": "https://registry.npmjs.org/@code0-tech/pictor/-/pictor-0.0.0-mvp.37.tgz", + "integrity": "sha512-FwZPEzKpxkeUa0IJo/CUfQMe/Ssu+c6rlWECfEv5/UzyLF1Q4jORXaJHDamzEcbJHur/Qh/d2xaq9sEn6fIeNA==", "peerDependencies": { "@ariakit/react": "^0.4.17", "@code0-tech/sagittarius-graphql-types": "0.0.0-e610ffe24a7dc3cf7b4c285994830412410f229e", diff --git a/package.json b/package.json index 81a45973..02c42789 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ }, "dependencies": { "@apollo/client": "^4.0.9", - "@code0-tech/pictor": "^0.0.0-mvp.36", + "@code0-tech/pictor": "^0.0.0-mvp.37", "graphql": "^16.12.0", "graphql-tag": "^2.12.6", "next": "16.0.7", From db5454ddfeaed367962b1cc46e7b8d9b21cd704b Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 29 Jan 2026 12:52:40 +0100 Subject: [PATCH 081/173] feat: update @code0-tech/pictor to version 0.0.0-mvp.38 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 94a592fb..c2166059 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0", "dependencies": { "@apollo/client": "^4.0.9", - "@code0-tech/pictor": "^0.0.0-mvp.37", + "@code0-tech/pictor": "^0.0.0-mvp.38", "graphql": "^16.12.0", "graphql-tag": "^2.12.6", "next": "16.0.7", @@ -352,9 +352,9 @@ } }, "node_modules/@code0-tech/pictor": { - "version": "0.0.0-mvp.37", - "resolved": "https://registry.npmjs.org/@code0-tech/pictor/-/pictor-0.0.0-mvp.37.tgz", - "integrity": "sha512-FwZPEzKpxkeUa0IJo/CUfQMe/Ssu+c6rlWECfEv5/UzyLF1Q4jORXaJHDamzEcbJHur/Qh/d2xaq9sEn6fIeNA==", + "version": "0.0.0-mvp.38", + "resolved": "https://registry.npmjs.org/@code0-tech/pictor/-/pictor-0.0.0-mvp.38.tgz", + "integrity": "sha512-rf0l6877MLd5p9Vfv1BDeSTnvpJ13CZ4pHKgBDqRLv0O1PJgc5qoDh9oa7IUm5+keWmrxkWbIpvWSXUj04qvBA==", "peerDependencies": { "@ariakit/react": "^0.4.17", "@code0-tech/sagittarius-graphql-types": "0.0.0-e610ffe24a7dc3cf7b4c285994830412410f229e", diff --git a/package.json b/package.json index 02c42789..e67f7916 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ }, "dependencies": { "@apollo/client": "^4.0.9", - "@code0-tech/pictor": "^0.0.0-mvp.37", + "@code0-tech/pictor": "^0.0.0-mvp.38", "graphql": "^16.12.0", "graphql-tag": "^2.12.6", "next": "16.0.7", From 06f4b953a5fec93de1d03626833eb29fe9a10c0d Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 30 Jan 2026 00:11:11 +0100 Subject: [PATCH 082/173] feat: update @code0-tech/pictor to version 0.0.0-mvp.39 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index c2166059..61b3f6ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0", "dependencies": { "@apollo/client": "^4.0.9", - "@code0-tech/pictor": "^0.0.0-mvp.38", + "@code0-tech/pictor": "^0.0.0-mvp.39", "graphql": "^16.12.0", "graphql-tag": "^2.12.6", "next": "16.0.7", @@ -352,9 +352,9 @@ } }, "node_modules/@code0-tech/pictor": { - "version": "0.0.0-mvp.38", - "resolved": "https://registry.npmjs.org/@code0-tech/pictor/-/pictor-0.0.0-mvp.38.tgz", - "integrity": "sha512-rf0l6877MLd5p9Vfv1BDeSTnvpJ13CZ4pHKgBDqRLv0O1PJgc5qoDh9oa7IUm5+keWmrxkWbIpvWSXUj04qvBA==", + "version": "0.0.0-mvp.39", + "resolved": "https://registry.npmjs.org/@code0-tech/pictor/-/pictor-0.0.0-mvp.39.tgz", + "integrity": "sha512-Bkbrn1J+2IRvk0lOGSPg5TOpOJ0D/Wc0XQEhpiYZ5tdIeClNu6kKTjIk6WSu8auBBtbD129lOIZgLCZfEfrqWQ==", "peerDependencies": { "@ariakit/react": "^0.4.17", "@code0-tech/sagittarius-graphql-types": "0.0.0-e610ffe24a7dc3cf7b4c285994830412410f229e", diff --git a/package.json b/package.json index e67f7916..ec75bcdc 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ }, "dependencies": { "@apollo/client": "^4.0.9", - "@code0-tech/pictor": "^0.0.0-mvp.38", + "@code0-tech/pictor": "^0.0.0-mvp.39", "graphql": "^16.12.0", "graphql-tag": "^2.12.6", "next": "16.0.7", From dcd0a00b8d2532789a380c6cf6000efac2583e96 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sat, 7 Feb 2026 17:51:03 +0100 Subject: [PATCH 083/173] feat: update styles across multiple pages for improved UI consistency --- src/app/(dashboard)/layout.tsx | 57 +++++--- .../namespace/[namespaceId]/roles/page.tsx | 10 +- src/app/(flow)/@bar/default.tsx | 83 +---------- .../project/[projectId]/page.tsx | 23 +++ src/app/(flow)/layout.tsx | 56 +++++--- .../[projectId]/flow/[flowId]/page.tsx | 17 +-- .../project/[projectId]/page.tsx | 2 +- src/app/global.scss | 2 +- .../application/ApplicationBarView.tsx | 35 ++--- .../application/ApplicationBreadcrumbView.tsx | 11 +- .../application/ApplicationPage.tsx | 10 +- .../application/ApplicationSettingsPage.tsx | 88 ++++++------ .../application/ApplicationTabView.tsx | 27 ++-- .../src/ui-dashboard/member/MemberAddPage.tsx | 70 +++++----- .../src/ui-dashboard/member/MembersPage.tsx | 10 +- .../src/ui-dashboard/member/MembersView.tsx | 2 +- .../namespace/NamespaceOverviewLeftView.tsx | 4 +- .../namespace/NamespaceOverviewPage.tsx | 13 +- .../namespace/NamespaceOverviewRightView.tsx | 2 +- .../namespace/NamespaceProjectsCreatePage.tsx | 74 +++++----- .../namespace/NamespaceProjectsPage.tsx | 10 +- .../namespace/NamespaceProjectsView.tsx | 6 +- .../namespace/NamespaceTabView.tsx | 81 +++++------ .../organization/OrganizationCreatePage.tsx | 56 ++++---- .../organization/OrganizationDeleteView.tsx | 7 +- .../OrganizationGeneralSettingsView.tsx | 21 +-- .../organization/OrganizationSettingsPage.tsx | 131 ++++++++---------- .../organization/OrganizationUpgradeView.tsx | 79 +++++------ .../organization/OrganizationsPage.tsx | 11 +- .../organization/OrganizationsView.tsx | 15 +- .../personal-project/PersonalProjectsView.tsx | 15 +- .../src/ui-dashboard/role/RoleCreatePage.tsx | 60 ++++---- .../src/ui-dashboard/role/RoleDeleteView.tsx | 9 +- .../role/RoleGeneralAdjustmentView.tsx | 8 +- .../ui-dashboard/role/RolePermissionView.tsx | 29 ++-- .../src/ui-dashboard/role/RoleProjectView.tsx | 7 +- .../ui-dashboard/role/RoleSettingsPage.tsx | 124 +++++++++-------- .../ce/src/ui-dashboard/role/RolesView.tsx | 2 +- .../runtime/RuntimeCreatePage.tsx | 96 ++++++------- .../runtime/RuntimeSettingsPage.tsx | 109 ++++++++------- .../src/ui-dashboard/runtime/RuntimesPage.tsx | 23 ++- .../ce/src/ui-dashboard/user/UsersPage.tsx | 30 ++-- .../ce/src/ui-flow/folder/FolderView.tsx | 112 ++++++++------- 43 files changed, 841 insertions(+), 796 deletions(-) create mode 100644 src/app/(flow)/@tab/namespace/[namespaceId]/project/[projectId]/page.tsx diff --git a/src/app/(dashboard)/layout.tsx b/src/app/(dashboard)/layout.tsx index 7d6dc8f7..6eb12c97 100644 --- a/src/app/(dashboard)/layout.tsx +++ b/src/app/(dashboard)/layout.tsx @@ -3,16 +3,18 @@ import React from "react"; import {useApolloClient} from "@apollo/client/react"; import { - Container, + AuroraBackground, ContextStoreProvider, DLayout, - DNamespaceMemberView, DNamespaceProjectView, + DNamespaceMemberView, + DNamespaceProjectView, + DNamespaceRoleView, DNamespaceView, - DOrganizationView, DRuntimeView, + DOrganizationView, + DRuntimeView, DUserView, - ReactiveArrayStore, - useUserSession, - DNamespaceRoleView + Flex, + useUserSession } from "@code0-tech/pictor"; import {UserService} from "@edition/user/User.service"; import {GraphqlClient} from "@core/util/graphql-client"; @@ -24,8 +26,7 @@ import {usePersistentReactiveArrayService} from "@/hooks/usePersistentReactiveAr import {RuntimeService} from "@edition/runtime/Runtime.service"; import {ProjectService} from "@edition/project/Project.service"; import {RoleService} from "@edition/role/Role.service"; -import {Spacing} from "@code0-tech/pictor/dist/components/spacing/Spacing"; -import {View} from "@code0-tech/pictor/dist/utils/view"; +import Image from "next/image"; interface ApplicationLayoutProps { children: React.ReactNode @@ -52,17 +53,39 @@ const ApplicationLayout: React.FC = ({children, bar, tab if (currentSession === null) router.push("/login") return - -
- {bar} - {tab} + +
+
+ +
- + {"CodeZero + {tab} + }> - - {children} - + {bar}}> + + <>{children} + + } diff --git a/src/app/(dashboard)/namespace/[namespaceId]/roles/page.tsx b/src/app/(dashboard)/namespace/[namespaceId]/roles/page.tsx index 638c3b18..a6dc5db1 100644 --- a/src/app/(dashboard)/namespace/[namespaceId]/roles/page.tsx +++ b/src/app/(dashboard)/namespace/[namespaceId]/roles/page.tsx @@ -1,5 +1,13 @@ import {RolesPage} from "@edition/ui-dashboard/role/RolesPage"; export default function Page() { - return + return
+ +
} \ No newline at end of file diff --git a/src/app/(flow)/@bar/default.tsx b/src/app/(flow)/@bar/default.tsx index 0b73fc36..21601620 100644 --- a/src/app/(flow)/@bar/default.tsx +++ b/src/app/(flow)/@bar/default.tsx @@ -1,89 +1,10 @@ "use client"; -import { - Badge, - Breadcrumb, - Button, - Flex, - MenuItem, - MenuSeparator, - Text, - TextInput, - useService, - useUserSession -} from "@code0-tech/pictor"; -import DUserMenu from "@code0-tech/pictor/dist/components/d-user/DUserMenu"; -import {IconBuilding, IconFolders, IconInbox, IconLogout, IconSearch} from "@tabler/icons-react"; import React from "react"; -import Image from "next/image"; -import {UserService} from "@edition/user/User.service"; -import {useRouter} from "next/navigation"; -import Link from "next/link"; +import {ApplicationBarView} from "@edition/ui-dashboard/application/ApplicationBarView"; const Page = () => { - - const currentSession = useUserSession() - const userService = useService(UserService) - const router = useRouter() - const [loading, startTransition] = React.useTransition() - - - const userMenu = React.useMemo(() => { - - if (!currentSession?.token) { - return null - } - - const userLogout = () => { - startTransition(async () => { - await userService.usersLogout({ - userSessionId: currentSession.id!! - }).then(payload => { - window.localStorage.removeItem("ide_code-zero_session") - router.push("/login") - }) - }) - } - - const namespaceIndex = currentSession.user?.namespace?.id?.match(/Namespace\/(\d+)$/)?.[1] - - return - - - Organizations - - - - - Personal Workspace - - - - - Logout - - - }, [currentSession]) - - return - - - {"CodeZero - - Application - - - - } right={⌘K} rightType={"icon"} - placeholder={"Search..."}/> - - {userMenu} - - - + return } export default Page \ No newline at end of file diff --git a/src/app/(flow)/@tab/namespace/[namespaceId]/project/[projectId]/page.tsx b/src/app/(flow)/@tab/namespace/[namespaceId]/project/[projectId]/page.tsx new file mode 100644 index 00000000..215b2d38 --- /dev/null +++ b/src/app/(flow)/@tab/namespace/[namespaceId]/project/[projectId]/page.tsx @@ -0,0 +1,23 @@ +"use client" + +import {Tab, TabList, TabTrigger} from "@code0-tech/pictor/dist/components/tab/Tab"; +import {Button} from "@code0-tech/pictor"; +import {IconBuilding, IconHome} from "@tabler/icons-react"; +import React from "react"; + +export default function Page() { + return + + + + + + + + + +} \ No newline at end of file diff --git a/src/app/(flow)/layout.tsx b/src/app/(flow)/layout.tsx index 7ea24e1c..8082c53b 100644 --- a/src/app/(flow)/layout.tsx +++ b/src/app/(flow)/layout.tsx @@ -3,6 +3,7 @@ import React from "react"; import {useApolloClient} from "@apollo/client/react"; import { + AuroraBackground, ContextStoreProvider, DataTypeView, DLayout, @@ -16,9 +17,9 @@ import { DResizablePanelGroup, DRuntimeView, DUserView, + Flex, FlowTypeView, FunctionDefinitionView, - ReactiveArrayStore, useUserSession } from "@code0-tech/pictor"; import {UserService} from "@edition/user/User.service"; @@ -39,7 +40,7 @@ import {FlowTypeService} from "@edition/flowtype/FlowTypeService"; import {FileTabsView} from "@code0-tech/pictor/dist/components/file-tabs/FileTabs.view"; import {FileTabsService} from "@code0-tech/pictor/dist/components/file-tabs/FileTabs.service"; import {FolderView} from "@edition/ui-flow/folder/FolderView"; -import {View} from "@code0-tech/pictor/dist/utils/view"; +import Image from "next/image"; interface ApplicationLayoutProps { children: React.ReactNode @@ -79,7 +80,6 @@ const ApplicationLayout: React.FC = ({children, bar, tab const file = usePersistentReactiveArrayService(`dashboard::files::${flowId}`, FileTabsService, []) - const runtimeId = React.useMemo(() => project[1].getById(projectId, {namespaceId})?.primaryRuntime?.id, [projectId, project[0], namespaceId]) React.useEffect(() => { @@ -93,26 +93,44 @@ const ApplicationLayout: React.FC = ({children, bar, tab return - +
- {bar} - {tab} +
+ +
- + {"CodeZero + {tab} + }> - - - - - - - {children} - + {bar}}> + + + + + + + {children} + + diff --git a/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/[flowId]/page.tsx b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/[flowId]/page.tsx index 75093dff..3ac5b622 100644 --- a/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/[flowId]/page.tsx +++ b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/[flowId]/page.tsx @@ -26,8 +26,8 @@ export default function Page() { const [show, setShow] = React.useState(false); return - + - } bottomContent={ - - - - }> - + {show && ( <> - + diff --git a/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/page.tsx b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/page.tsx index 4a3c3f53..a077880d 100644 --- a/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/page.tsx +++ b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/page.tsx @@ -22,7 +22,7 @@ export default function Page() { const namespaceIndex = params?.namespaceId as any as number - return + return { @@ -66,23 +66,16 @@ export const ApplicationBarView: React.FC = () => { }, [currentUser, currentSession, namespaceIndex]) - return - - - - {"CodeZero - - - - } right={⌘K} rightType={"icon"} - placeholder={"Search..."}/> - - {userMenu} - - + return + + + + + {userMenu} - + } \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/application/ApplicationBreadcrumbView.tsx b/src/packages/ce/src/ui-dashboard/application/ApplicationBreadcrumbView.tsx index 19d1357c..af17a3ff 100644 --- a/src/packages/ce/src/ui-dashboard/application/ApplicationBreadcrumbView.tsx +++ b/src/packages/ce/src/ui-dashboard/application/ApplicationBreadcrumbView.tsx @@ -195,12 +195,13 @@ export const ApplicationBreadcrumbView: React.FC = () => { }, [pathSegments, collectionSegments, getSegmentLabel, resolveDestination]) return + router.push("/")}> + Home + {breadcrumbs.map((crumb, index) => { - return crumb.isBadge ? router.push(crumb.destination)}> - - {crumb.label} - - : router.push(crumb.destination)}> + return crumb.isBadge ? router.push(crumb.destination)}> + {crumb.label} + : router.push(crumb.destination)}> {crumb.label} })} diff --git a/src/packages/ce/src/ui-dashboard/application/ApplicationPage.tsx b/src/packages/ce/src/ui-dashboard/application/ApplicationPage.tsx index 0f9da314..4995b04a 100644 --- a/src/packages/ce/src/ui-dashboard/application/ApplicationPage.tsx +++ b/src/packages/ce/src/ui-dashboard/application/ApplicationPage.tsx @@ -4,12 +4,18 @@ import {Spacing} from "@code0-tech/pictor"; export const ApplicationPage = () => { - return <> + return
- +
} \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/application/ApplicationSettingsPage.tsx b/src/packages/ce/src/ui-dashboard/application/ApplicationSettingsPage.tsx index 27583f65..901f77ce 100644 --- a/src/packages/ce/src/ui-dashboard/application/ApplicationSettingsPage.tsx +++ b/src/packages/ce/src/ui-dashboard/application/ApplicationSettingsPage.tsx @@ -5,9 +5,10 @@ import { Badge, Button, Card, - DLayout, + DResizableHandle, + DResizablePanel, + DResizablePanelGroup, Flex, - InputLabel, Spacing, SwitchInput, Text, @@ -18,7 +19,7 @@ import { import {UserService} from "@edition/user/User.service"; import {notFound} from "next/navigation"; import {Tab, TabContent, TabList, TabTrigger} from "@code0-tech/pictor/dist/components/tab/Tab"; -import {IconGavel, IconSettings} from "@tabler/icons-react"; +import {IconLayoutSidebar} from "@tabler/icons-react"; import CardSection from "@code0-tech/pictor/dist/components/card/CardSection"; import process from "node:process"; @@ -32,33 +33,43 @@ export const ApplicationSettingsPage: React.FC = () => { notFound() } - return <> - - - - Application - - - - - - - - }> + + + General settings and restrictions for your Sculptor application. These settings affect all users + and organizations within the application. + + + + + + + + + + +
+ + <> - + General -
- - + @@ -91,13 +102,11 @@ export const ApplicationSettingsPage: React.FC = () => { - + Restrictions -
- - - + + Organization creation @@ -108,11 +117,8 @@ export const ApplicationSettingsPage: React.FC = () => { - - - Danger Zone -
- + + User registration @@ -121,12 +127,12 @@ export const ApplicationSettingsPage: React.FC = () => { - - + + - - - + + + } \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/application/ApplicationTabView.tsx b/src/packages/ce/src/ui-dashboard/application/ApplicationTabView.tsx index 5e1115d0..7f9c395b 100644 --- a/src/packages/ce/src/ui-dashboard/application/ApplicationTabView.tsx +++ b/src/packages/ce/src/ui-dashboard/application/ApplicationTabView.tsx @@ -8,6 +8,7 @@ import {usePathname, useRouter} from "next/navigation"; import {UserService} from "@edition/user/User.service"; import {RuntimeService} from "@edition/runtime/Runtime.service"; import {OrganizationService} from "@edition/organization/Organization.service"; +import {hashToColor} from "@code0-tech/pictor/dist/components/d-flow/DFlow.util"; export const ApplicationTabView: React.FC = () => { @@ -32,23 +33,18 @@ export const ApplicationTabView: React.FC = () => { return currentUser && currentUser.admin ? ( <> - - - @@ -56,24 +52,19 @@ export const ApplicationTabView: React.FC = () => { ) : null }, [currentUser, runtimeStore, organizationStore]) - return - + return - - {adminLinks} - } \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/member/MemberAddPage.tsx b/src/packages/ce/src/ui-dashboard/member/MemberAddPage.tsx index 1babdbb0..0411b343 100644 --- a/src/packages/ce/src/ui-dashboard/member/MemberAddPage.tsx +++ b/src/packages/ce/src/ui-dashboard/member/MemberAddPage.tsx @@ -7,11 +7,11 @@ import { DUserInput, DUserView, Flex, - InputSuggestion, Spacing, Text, useForm, - useService, useStore + useService, + useStore } from "@code0-tech/pictor"; import {MemberService} from "@edition/member/Member.service"; import {useParams, useRouter} from "next/navigation"; @@ -34,7 +34,7 @@ export const MemberAddPage: React.FC = () => { const namespaceId: Namespace['id'] = `gid://sagittarius/Namespace/${namespaceIndex as unknown as number}` const members = React.useMemo(() => memberService.values({namespaceId: namespaceId}), [memberStore, userStore]) - const formInitialValues = React.useMemo(() => ({ users: null }), []) + const formInitialValues = React.useMemo(() => ({users: null}), []) const filteredUsers = React.useMemo(() => { return (user: DUserView) => { return !members.find(m => m.user?.id === user.id) @@ -65,33 +65,41 @@ export const MemberAddPage: React.FC = () => { //TODO: user abilities for add user as member within namespace - return - - - Add new members - - - - Global runtimes are shared runtimes that can be used across multiple organizations. - - - {/*@ts-ignore*/} - - - - - + + - - - - - + + + +
} \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/member/MembersPage.tsx b/src/packages/ce/src/ui-dashboard/member/MembersPage.tsx index 17f7a9e0..c7b9e37b 100644 --- a/src/packages/ce/src/ui-dashboard/member/MembersPage.tsx +++ b/src/packages/ce/src/ui-dashboard/member/MembersPage.tsx @@ -4,5 +4,13 @@ import {MembersView} from "@edition/ui-dashboard/member/MembersView"; import React from "react"; export const MembersPage: React.FC = () => { - return + return
+ +
} \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/member/MembersView.tsx b/src/packages/ce/src/ui-dashboard/member/MembersView.tsx index 807a386e..c9740c2f 100644 --- a/src/packages/ce/src/ui-dashboard/member/MembersView.tsx +++ b/src/packages/ce/src/ui-dashboard/member/MembersView.tsx @@ -15,7 +15,7 @@ export const MembersView: React.FC = () => { const [, startTransition] = React.useTransition() const membersList = React.useMemo(() => { - return { + return { startTransition(() => { memberService.memberAssignRoles({ memberId: member.id!, diff --git a/src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewLeftView.tsx b/src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewLeftView.tsx index 5857cb1d..f8443930 100644 --- a/src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewLeftView.tsx +++ b/src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewLeftView.tsx @@ -15,7 +15,7 @@ export const NamespaceOverviewLeftView: React.FC = () => { const currentUser = React.useMemo(() => userService.getById(currentSession?.user?.id), [userStore, currentSession]) const organizations = React.useMemo(() => organizationService.values(), [organizationStore]) - return + return @@ -45,7 +45,7 @@ export const NamespaceOverviewLeftView: React.FC = () => { - +
diff --git a/src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewPage.tsx b/src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewPage.tsx index acee8915..76e20c8a 100644 --- a/src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewPage.tsx +++ b/src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewPage.tsx @@ -19,8 +19,17 @@ export const NamespaceOverviewPage: React.FC = () => { const namespaceIndexCurrentUser = currentUser?.namespace?.id?.match(/Namespace\/(\d+)$/)?.[1] const namespaceId = params.namespaceId as any as string - return : undefined} + return : undefined} rightContent={}> - +
+ +
} \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewRightView.tsx b/src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewRightView.tsx index af455975..36ef7b7f 100644 --- a/src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewRightView.tsx +++ b/src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewRightView.tsx @@ -38,7 +38,7 @@ export const NamespaceOverviewRightView: React.FC = () => { const namespace = React.useMemo(() => namespaceService.getById(`gid://sagittarius/Namespace/${namespaceId}`), [namespaceStore, namespaceId]) const members = React.useMemo(() => memberService.values({namespaceId: `gid://sagittarius/Namespace/${namespaceId}`}), [memberStore, userStore]) - return + return + + - - - - - +
+ +
+
} \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsPage.tsx b/src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsPage.tsx index 496054f6..1fd119ef 100644 --- a/src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsPage.tsx +++ b/src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsPage.tsx @@ -4,5 +4,13 @@ import {NamespaceProjectsView} from "@edition/ui-dashboard/namespace/NamespacePr import React from "react"; export const NamespaceProjectsPage: React.FC = () => { - return + return
+ +
} \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsView.tsx b/src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsView.tsx index be1dc45a..c4db0e48 100644 --- a/src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsView.tsx +++ b/src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsView.tsx @@ -13,7 +13,7 @@ export const NamespaceProjectsView: React.FC = () => { const namespaceId = params.namespaceId as any as number const projectsList = React.useMemo(() => { - return { + return { const number = project.id?.match(/NamespaceProject\/(\d+)$/)?.[1] router.push(`/namespace/${namespaceId}/project/${number}`) }} namespaceId={`gid://sagittarius/Namespace/${namespaceId}`}/> @@ -21,7 +21,7 @@ export const NamespaceProjectsView: React.FC = () => { //TODO: user abilities for project creation within namespace - return
+ return <> @@ -36,5 +36,5 @@ export const NamespaceProjectsView: React.FC = () => { {projectsList} -
+ } \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/namespace/NamespaceTabView.tsx b/src/packages/ce/src/ui-dashboard/namespace/NamespaceTabView.tsx index 8c21c806..6695537e 100644 --- a/src/packages/ce/src/ui-dashboard/namespace/NamespaceTabView.tsx +++ b/src/packages/ce/src/ui-dashboard/namespace/NamespaceTabView.tsx @@ -1,7 +1,7 @@ "use client" import React from "react"; -import {Badge, Button, Container, useService, useStore} from "@code0-tech/pictor"; +import {Badge, Button, useService, useStore} from "@code0-tech/pictor"; import {Tab, TabList, TabTrigger} from "@code0-tech/pictor/dist/components/tab/Tab"; import {IconFolders, IconHome, IconServer, IconSettings, IconUserCog, IconUsers} from "@tabler/icons-react"; import {useParams, usePathname, useRouter} from "next/navigation"; @@ -11,6 +11,7 @@ import {ProjectService} from "@edition/project/Project.service"; import {RoleService} from "@edition/role/Role.service"; import {MemberService} from "@edition/member/Member.service"; import {RuntimeService} from "@edition/runtime/Runtime.service"; +import {hashToColor} from "@code0-tech/pictor/dist/components/d-flow/DFlow.util"; export const NamespaceTabView: React.FC = () => { @@ -49,55 +50,41 @@ export const NamespaceTabView: React.FC = () => { //TODO add license check for enterprise features ) ? ( - ) : null }, [namespace, parentOrganization]) - return - - - - - - - - - - - - - - - - - - {settings} - - - + return + + + + + + + + + + + + + + + + + {settings} + + } \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/organization/OrganizationCreatePage.tsx b/src/packages/ce/src/ui-dashboard/organization/OrganizationCreatePage.tsx index 9970b594..2703bf56 100644 --- a/src/packages/ce/src/ui-dashboard/organization/OrganizationCreatePage.tsx +++ b/src/packages/ce/src/ui-dashboard/organization/OrganizationCreatePage.tsx @@ -35,32 +35,34 @@ export const OrganizationCreatePage = () => { } }) - return - - - Create new organization - - - - Organizations are helpfully if managing a group of users and plenty of projects. - - - - - - - + + - - - - - + + + +
} \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/organization/OrganizationDeleteView.tsx b/src/packages/ce/src/ui-dashboard/organization/OrganizationDeleteView.tsx index b261e1d6..36dc877b 100644 --- a/src/packages/ce/src/ui-dashboard/organization/OrganizationDeleteView.tsx +++ b/src/packages/ce/src/ui-dashboard/organization/OrganizationDeleteView.tsx @@ -44,18 +44,17 @@ export const OrganizationDeleteView: React.FC = () => { return <> - Delete organization forever + Delete organization - Delete organization - + This will delete the organization and cannot be undone. - diff --git a/src/packages/ce/src/ui-dashboard/organization/OrganizationGeneralSettingsView.tsx b/src/packages/ce/src/ui-dashboard/organization/OrganizationGeneralSettingsView.tsx index b7d7d5c6..8cd1957b 100644 --- a/src/packages/ce/src/ui-dashboard/organization/OrganizationGeneralSettingsView.tsx +++ b/src/packages/ce/src/ui-dashboard/organization/OrganizationGeneralSettingsView.tsx @@ -55,23 +55,24 @@ export const OrganizationGeneralSettingsView: React.FC = () => { }) return <> - - General adjustments + + + General + + - + - Name + + Name + - - - - } \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/organization/OrganizationSettingsPage.tsx b/src/packages/ce/src/ui-dashboard/organization/OrganizationSettingsPage.tsx index daed5fa7..2a3fabb9 100644 --- a/src/packages/ce/src/ui-dashboard/organization/OrganizationSettingsPage.tsx +++ b/src/packages/ce/src/ui-dashboard/organization/OrganizationSettingsPage.tsx @@ -5,19 +5,19 @@ import {useParams} from "next/navigation"; import {Namespace} from "@code0-tech/sagittarius-graphql-types"; import { AuroraBackground, - Avatar, Badge, Button, - DLayout, + DResizableHandle, + DResizablePanel, + DResizablePanelGroup, Flex, - Spacing, Text, useService, useStore } from "@code0-tech/pictor"; import {NamespaceService} from "@edition/namespace/Namespace.service"; import {OrganizationService} from "@edition/organization/Organization.service"; -import {IconFolders, IconServer, IconUserCog, IconUsers} from "@tabler/icons-react"; +import {IconLayoutSidebar} from "@tabler/icons-react"; import {Tab, TabContent, TabList, TabTrigger} from "@code0-tech/pictor/dist/components/tab/Tab"; import {UsageView} from "@edition/ui-dashboard/usage/UsageView"; import {OrganizationUpgradeView} from "@edition/ui-dashboard/organization/OrganizationUpgradeView"; @@ -28,90 +28,67 @@ export const OrganizationSettingsPage: React.FC = () => { //TODO: add ability check for organization settings access for every settings tab - const params = useParams() - const namespaceService = useService(NamespaceService) - const namespaceStore = useStore(NamespaceService) - const organizationService = useService(OrganizationService) - const organizationStore = useStore(OrganizationService) + return + + + + + Organization settings - const namespaceIndex = params.namespaceId as any as number - const namespaceId: Namespace['id'] = `gid://sagittarius/Namespace/${namespaceIndex}` - const namespace = React.useMemo(() => namespaceService.getById(namespaceId), [namespaceStore, namespaceId]) - const parentOrganization = React.useMemo(() => namespace?.parent?.__typename === "Organization" ? organizationService.getById(namespace?.parent?.id) : null, [organizationStore, namespace]) - - return <> - - {React.useMemo(() => { - return - - - - {parentOrganization?.name} - - - - - {namespace?.members?.count} - - - - {namespace?.projects?.count} - - - - {namespace?.roles?.count} - - - - {namespace?.runtimes?.count} - + + + General settings and restrictions for your Sculptor application. These settings affect all users + and organizations within the application. + + + + + + + + + + + + + + + - - }, [parentOrganization])} - - - - - - - - - - - - - - - - - }> + + + <> - + - + - + - + -
- - +
+ + } \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/organization/OrganizationUpgradeView.tsx b/src/packages/ce/src/ui-dashboard/organization/OrganizationUpgradeView.tsx index 8f4f84f8..80121499 100644 --- a/src/packages/ce/src/ui-dashboard/organization/OrganizationUpgradeView.tsx +++ b/src/packages/ce/src/ui-dashboard/organization/OrganizationUpgradeView.tsx @@ -21,8 +21,8 @@ export const OrganizationUpgradeView: React.FC = () => { const [value, setValue] = React.useState("annually") return <> - Upgrade to team - + Upgrade to Team + Upgrade your organization to the Team plan to unlock advanced features, enhanced collaboration tools, and priority support. Elevate your team's productivity and take advantage of exclusive benefits designed to help @@ -46,21 +46,18 @@ export const OrganizationUpgradeView: React.FC = () => { - - - Team self-hosted - - - 7,95€ - per member / month billed monthly - - - - + Team self-hosted + + + 7,95€ + per member / month billed monthly + + + @@ -88,26 +85,24 @@ export const OrganizationUpgradeView: React.FC = () => { - - - Team cloud - - - -
- 3,95€ - - -27% - -
- per member / month - billed annually -
- - -
+ + Team cloud + + + +
+ 3,95€ + + -27% + +
+ per member / month + billed annually +
+ + @@ -136,16 +131,14 @@ export const OrganizationUpgradeView: React.FC = () => { - - Team cloud (pay as you go) - - - 3,95€ - per member / month billed monthly - - - - + Team cloud (pay as you go) + + + 3,95€ + per member / month billed monthly + + + diff --git a/src/packages/ce/src/ui-dashboard/organization/OrganizationsPage.tsx b/src/packages/ce/src/ui-dashboard/organization/OrganizationsPage.tsx index 3be1ad1c..a87a0573 100644 --- a/src/packages/ce/src/ui-dashboard/organization/OrganizationsPage.tsx +++ b/src/packages/ce/src/ui-dashboard/organization/OrganizationsPage.tsx @@ -4,5 +4,14 @@ import React from "react"; import {OrganizationsView} from "@edition/ui-dashboard/organization/OrganizationsView"; export const OrganizationsPage = () => { - return + return
+ +
+ } \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/organization/OrganizationsView.tsx b/src/packages/ce/src/ui-dashboard/organization/OrganizationsView.tsx index c43533f5..98b7f292 100644 --- a/src/packages/ce/src/ui-dashboard/organization/OrganizationsView.tsx +++ b/src/packages/ce/src/ui-dashboard/organization/OrganizationsView.tsx @@ -12,18 +12,23 @@ export const OrganizationsView = () => { return <> - - Organizations - + + + Organizations + + + Manage organizations that you belong to. You can create new organizations and switch between them. + + - + {/**TODO: use namespaceId*/} - { + { const number = organization.namespace?.id?.match(/Namespace\/(\d+)$/)?.[1] router.push(`/namespace/${number}`) }}/> diff --git a/src/packages/ce/src/ui-dashboard/personal-project/PersonalProjectsView.tsx b/src/packages/ce/src/ui-dashboard/personal-project/PersonalProjectsView.tsx index c2ccb3b7..d31af3b6 100644 --- a/src/packages/ce/src/ui-dashboard/personal-project/PersonalProjectsView.tsx +++ b/src/packages/ce/src/ui-dashboard/personal-project/PersonalProjectsView.tsx @@ -26,7 +26,7 @@ export const PersonalProjectsView: React.FC = () => { const projectsList = React.useMemo(() => { if (!currentUser || !currentUser.namespace) return null - return { + return { const number = project.id?.match(/NamespaceProject\/(\d+)$/)?.[1] router.push(`/namespace/${namespaceIndex}/project/${number}`) }} namespaceId={currentUser.namespace.id}/> @@ -36,12 +36,17 @@ export const PersonalProjectsView: React.FC = () => { return <> - - Personal projects - + + + Personal projects + + + Projects created in your personal namespace. You can also create organization projects if you are a member of any organization. + + - + diff --git a/src/packages/ce/src/ui-dashboard/role/RoleCreatePage.tsx b/src/packages/ce/src/ui-dashboard/role/RoleCreatePage.tsx index 0fa649b0..7b162325 100644 --- a/src/packages/ce/src/ui-dashboard/role/RoleCreatePage.tsx +++ b/src/packages/ce/src/ui-dashboard/role/RoleCreatePage.tsx @@ -8,31 +8,39 @@ export const RoleCreatePage: React.FC = () => { //TODO: user abilities for add role within namespace - return - - - Create new role - - - - Global runtimes are shared runtimes that can be used across multiple organizations. - - - - - - - + + - - - - - +
+ +
+
} \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/role/RoleDeleteView.tsx b/src/packages/ce/src/ui-dashboard/role/RoleDeleteView.tsx index 987c8d35..4a712d29 100644 --- a/src/packages/ce/src/ui-dashboard/role/RoleDeleteView.tsx +++ b/src/packages/ce/src/ui-dashboard/role/RoleDeleteView.tsx @@ -36,20 +36,19 @@ export const RoleDeleteView: React.FC = () => { }, []) return - + Delete role - Delete role - + This will delete the role and cannot be undone. - diff --git a/src/packages/ce/src/ui-dashboard/role/RoleGeneralAdjustmentView.tsx b/src/packages/ce/src/ui-dashboard/role/RoleGeneralAdjustmentView.tsx index 409fe687..c3a112fe 100644 --- a/src/packages/ce/src/ui-dashboard/role/RoleGeneralAdjustmentView.tsx +++ b/src/packages/ce/src/ui-dashboard/role/RoleGeneralAdjustmentView.tsx @@ -58,15 +58,15 @@ export const RoleGeneralAdjustmentView: React.FC = () => { return - - General adjustments + + General - + Name diff --git a/src/packages/ce/src/ui-dashboard/role/RolePermissionView.tsx b/src/packages/ce/src/ui-dashboard/role/RolePermissionView.tsx index a0e21c0a..c8cb4958 100644 --- a/src/packages/ce/src/ui-dashboard/role/RolePermissionView.tsx +++ b/src/packages/ce/src/ui-dashboard/role/RolePermissionView.tsx @@ -226,9 +226,14 @@ export const RolePermissionView: React.FC = () => { }) return - - Select from role templates - + + + Select from role templates + + + {React.useMemo(() => { return @@ -268,19 +273,13 @@ export const RolePermissionView: React.FC = () => { }, [initialValues, role])} - -
- Current stored - permissions - - -
- -
+ + Current stored permissions + + + - + {permissions.map(permissionGroup => { return diff --git a/src/packages/ce/src/ui-dashboard/role/RoleProjectView.tsx b/src/packages/ce/src/ui-dashboard/role/RoleProjectView.tsx index df1c4db6..d33c3281 100644 --- a/src/packages/ce/src/ui-dashboard/role/RoleProjectView.tsx +++ b/src/packages/ce/src/ui-dashboard/role/RoleProjectView.tsx @@ -77,10 +77,11 @@ export const RoleProjectView: React.FC = () => { return - Projects that members can - access + + Projects that members can access + - + { //TODO: limit tabs based on user abilities for roles - const params = useParams() - const roleService = useService(RoleService) - const roleStore = useStore(RoleService) - - const namespaceIndex = params.namespaceId as any as number - const roleIndex = params.roleId as any as number - const namespaceId: Namespace['id'] = `gid://sagittarius/Namespace/${namespaceIndex}` - const roleId: NamespaceRole['id'] = `gid://sagittarius/NamespaceRole/${roleIndex}` - - const role = React.useMemo(() => roleService.getById(roleId, {namespaceId: namespaceId}), [roleStore, roleId, namespaceId]) - return <> - - - - {role?.name} - - - - - - - - - - - - - - - - - - - }> - <> - - - - - - + + + + + + Role settings + + + + + General settings and restrictions for your Sculptor application. These settings affect all + users + and organizations within the application. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + } \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/role/RolesView.tsx b/src/packages/ce/src/ui-dashboard/role/RolesView.tsx index d157f5f8..7e8e881d 100644 --- a/src/packages/ce/src/ui-dashboard/role/RolesView.tsx +++ b/src/packages/ce/src/ui-dashboard/role/RolesView.tsx @@ -13,7 +13,7 @@ export const RolesView: React.FC = () => { const namespaceId = params.namespaceId as any as number const rolesList = React.useMemo(() => { - return { + return { const roleIndex = role.id?.match(/NamespaceRole\/(\d+)$/)?.[1] router.push(`/namespace/${namespaceId}/roles/${roleIndex}/settings`) }} namespaceId={`gid://sagittarius/Namespace/${namespaceId}`}/> diff --git a/src/packages/ce/src/ui-dashboard/runtime/RuntimeCreatePage.tsx b/src/packages/ce/src/ui-dashboard/runtime/RuntimeCreatePage.tsx index bed0d10c..c70ea5d1 100644 --- a/src/packages/ce/src/ui-dashboard/runtime/RuntimeCreatePage.tsx +++ b/src/packages/ce/src/ui-dashboard/runtime/RuntimeCreatePage.tsx @@ -84,52 +84,54 @@ export const RuntimeCreatePage: React.FC = () => { } }) - return - - - {!token ? "Create new runtime" : "Runtime created successfully"} - - - - Runtimes are shared runtimes that can be used across multiple organizations. - - - {!token ? ( - <> - - - - - - ) : ( - <> - - - - )} - - - - + return
+ + + + {!token ? "Create new runtime" : "Runtime created successfully"} + + + + Runtimes are shared runtimes that can be used across multiple organizations. + + {!token ? ( - - ) : null} - - - + <> + + + + + + ) : ( + <> + + + + )} + + + + + {!token ? ( + + ) : null} + + + +
} \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/runtime/RuntimeSettingsPage.tsx b/src/packages/ce/src/ui-dashboard/runtime/RuntimeSettingsPage.tsx index 8d2d307d..2c029e18 100644 --- a/src/packages/ce/src/ui-dashboard/runtime/RuntimeSettingsPage.tsx +++ b/src/packages/ce/src/ui-dashboard/runtime/RuntimeSettingsPage.tsx @@ -4,7 +4,9 @@ import React from "react"; import { Button, Card, - DLayout, + DResizableHandle, + DResizablePanel, + DResizablePanelGroup, Flex, Spacing, Text, @@ -18,6 +20,7 @@ import {RuntimeService} from "@edition/runtime/Runtime.service"; import {notFound, useParams, useRouter} from "next/navigation"; import {Tab, TabContent, TabList, TabTrigger} from "@code0-tech/pictor/dist/components/tab/Tab"; import CardSection from "@code0-tech/pictor/dist/components/card/CardSection"; +import {IconLayoutSidebar} from "@tabler/icons-react"; export const RuntimeSettingsPage: React.FC = () => { @@ -112,49 +115,54 @@ export const RuntimeSettingsPage: React.FC = () => { }, [runtime]) - return <> - - - - {runtime?.name} - - - {runtime?.description} - - - - - - - - - - - - - - - - }> +
+ + General settings and restrictions for your Sculptor application. These settings affect all users + and organizations within the application. + + + + + + + + + + + + +
+ + + <> - + - General adjustments + General -
- - + Name @@ -171,12 +179,10 @@ export const RuntimeSettingsPage: React.FC = () => { - + How to connect -
- - + @@ -187,7 +193,7 @@ export const RuntimeSettingsPage: React.FC = () => { {token ? ( ) : ( - )} @@ -196,29 +202,26 @@ export const RuntimeSettingsPage: React.FC = () => { - + - Delete runtime forever + Delete runtime -
- - Delete runtime - + This will delete the runtime and cannot be undone. - - - - + + + } \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/runtime/RuntimesPage.tsx b/src/packages/ce/src/ui-dashboard/runtime/RuntimesPage.tsx index ce7dd952..f7da44d6 100644 --- a/src/packages/ce/src/ui-dashboard/runtime/RuntimesPage.tsx +++ b/src/packages/ce/src/ui-dashboard/runtime/RuntimesPage.tsx @@ -21,11 +21,22 @@ export const RuntimesPage: React.FC = () => { } const router = useRouter() - return <> + return
- - Runtimes - + + + Runtimes + + + Manage runtimes that you have access to. Runtimes are the environments where your applications run. + + @@ -33,10 +44,10 @@ export const RuntimesPage: React.FC = () => { - namespaceIndex ? true : !runtime?.namespace?.id} onSetting={(runtime) => { const number = runtime.id?.match(/Runtime\/(\d+)$/)?.[1] router.push(namespaceIndex ? `/namespace/${namespaceIndex}/runtimes/${number}/settings` : `/runtimes/${number}/settings`) }}/> - +
} \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/user/UsersPage.tsx b/src/packages/ce/src/ui-dashboard/user/UsersPage.tsx index d015ff55..49107ef8 100644 --- a/src/packages/ce/src/ui-dashboard/user/UsersPage.tsx +++ b/src/packages/ce/src/ui-dashboard/user/UsersPage.tsx @@ -1,17 +1,10 @@ "use client" import React from "react"; -import { - Button, - DUserList, - Flex, - Spacing, - Text, - TextInput, useService, useStore, useUserSession, -} from "@code0-tech/pictor"; -import {IconSearch} from "@tabler/icons-react"; +import {Button, DUserList, Flex, Spacing, Text, useService, useStore, useUserSession,} from "@code0-tech/pictor"; import {UserService} from "@edition/user/User.service"; import {notFound} from "next/navigation"; + export const UsersPage: React.FC = () => { const currentSession = useUserSession() @@ -23,16 +16,21 @@ export const UsersPage: React.FC = () => { notFound() } - return <> + return
- - Users - + + + Users + + + Manage users who have access to your instance. You can invite new users and remove existing ones. + + - + - - + +
} \ No newline at end of file diff --git a/src/packages/ce/src/ui-flow/folder/FolderView.tsx b/src/packages/ce/src/ui-flow/folder/FolderView.tsx index 8e96bf2e..8541c958 100644 --- a/src/packages/ce/src/ui-flow/folder/FolderView.tsx +++ b/src/packages/ce/src/ui-flow/folder/FolderView.tsx @@ -18,7 +18,7 @@ import { TooltipTrigger, useService } from "@code0-tech/pictor"; -import {IconArrowsMaximize, IconArrowsMinimize, IconCircleDot, IconPlus} from "@tabler/icons-react"; +import {IconArrowsMaximize, IconArrowsMinimize, IconCircleDot, IconLayoutSidebar, IconPlus} from "@tabler/icons-react"; import {useParams, useRouter} from "next/navigation"; import {Flow, FlowType, NamespaceProject} from "@code0-tech/sagittarius-graphql-types"; import {FlowService} from "@edition/flow/Flow.service"; @@ -110,67 +110,75 @@ export const FolderView: React.FC = () => { onDelete={deleteFlow}/> - - - - - - - Add new flow - - - - - + + + Explorer + + + - - Open active flow + Add new flow - - - - - - - Close all - - - - - - - - - - - Open all - - - - - + + + + + + + + Open active flow + + + + + + + + + + + Close all + + + + + + + + + + + Open all + + + + + + }> Date: Sat, 7 Feb 2026 19:21:31 +0100 Subject: [PATCH 084/173] feat: update @code0-tech/pictor to version 0.0.0-mvp.40 and add new dependencies --- package-lock.json | 674 +++++++++++++++++++++++++++++++++++++++++++++- package.json | 2 +- 2 files changed, 671 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 61b3f6ca..899b34b2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0", "dependencies": { "@apollo/client": "^4.0.9", - "@code0-tech/pictor": "^0.0.0-mvp.39", + "@code0-tech/pictor": "^0.0.0-mvp.40", "graphql": "^16.12.0", "graphql-tag": "^2.12.6", "next": "16.0.7", @@ -303,6 +303,16 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.27.2", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", @@ -352,12 +362,15 @@ } }, "node_modules/@code0-tech/pictor": { - "version": "0.0.0-mvp.39", - "resolved": "https://registry.npmjs.org/@code0-tech/pictor/-/pictor-0.0.0-mvp.39.tgz", - "integrity": "sha512-Bkbrn1J+2IRvk0lOGSPg5TOpOJ0D/Wc0XQEhpiYZ5tdIeClNu6kKTjIk6WSu8auBBtbD129lOIZgLCZfEfrqWQ==", + "version": "0.0.0-mvp.40", + "resolved": "https://registry.npmjs.org/@code0-tech/pictor/-/pictor-0.0.0-mvp.40.tgz", + "integrity": "sha512-OzkmuwscKCR3uOpMTWSftRGALVBHVdXiIaAC8FmvdwQ0eiOVe6xDpmD5LbqypyPkXBZkIb317WZR2dH3JZWjgw==", "peerDependencies": { "@ariakit/react": "^0.4.17", "@code0-tech/sagittarius-graphql-types": "0.0.0-e610ffe24a7dc3cf7b4c285994830412410f229e", + "@codemirror/autocomplete": "^6.20.0", + "@codemirror/lang-json": "^6.0.2", + "@monaco-editor/react": "^4.7.0", "@radix-ui/react-checkbox": "^1.3.3", "@radix-ui/react-context-menu": "^2.2.16", "@radix-ui/react-dialog": "^1.1.15", @@ -370,6 +383,8 @@ "@radix-ui/react-toggle-group": "^1.1.11", "@radix-ui/react-tooltip": "^1.2.8", "@tabler/icons-react": "3.36.1", + "@uiw/codemirror-themes": "^4.25.4", + "@uiw/react-codemirror": "^4.25.4", "@xyflow/react": "^12.10.0", "cmdk": "^1.1.1", "js-md5": "^0.8.3", @@ -379,6 +394,7 @@ "react-contenteditable": "^3.3.7", "react-dom": "^18.0.0 || ^19.0.0", "react-resizable-panels": "^4.3.1", + "react-syntax-highlighter": "^16.1.0", "react-zoom-pan-pinch": "^3.7.0", "sonner": "^2.0.7" } @@ -389,6 +405,118 @@ "integrity": "sha512-q6yNjjUSqP2F/MlkaDkZITU8dP/Yv1yAVRgrduFRT01I5v7rovAVwiDT1W5SoVSEsuhiUOXs3oAlz+Ri6nVY8g==", "peer": true }, + "node_modules/@codemirror/autocomplete": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.0.tgz", + "integrity": "sha512-bOwvTOIJcG5FVo5gUUupiwYh8MioPLQ4UcqbcRf7UQ98X90tCa9E1kZ3Z7tqwpZxYyOvh1YTYbmZE9RTfTp5hg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@codemirror/commands": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.2.tgz", + "integrity": "sha512-vvX1fsih9HledO1c9zdotZYUZnE4xV0m6i3m25s5DIfXofuprk6cRcLUZvSk3CASUbwjQX21tOGbkY2BH8TpnQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.4.0", + "@codemirror/view": "^6.27.0", + "@lezer/common": "^1.1.0" + } + }, + "node_modules/@codemirror/lang-json": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-json/-/lang-json-6.0.2.tgz", + "integrity": "sha512-x2OtO+AvwEHrEwR0FyyPtfDUiloG3rnVTSZV1W8UteaLL8/MajQd8DpvUb2YVzC+/T18aSDv0H9mu+xw0EStoQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@codemirror/language": "^6.0.0", + "@lezer/json": "^1.0.0" + } + }, + "node_modules/@codemirror/language": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.1.tgz", + "integrity": "sha512-Fa6xkSiuGKc8XC8Cn96T+TQHYj4ZZ7RdFmXA3i9xe/3hLHfwPZdM+dqfX0Cp0zQklBKhVD8Yzc8LS45rkqcwpQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.23.0", + "@lezer/common": "^1.5.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, + "node_modules/@codemirror/lint": { + "version": "6.9.3", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.3.tgz", + "integrity": "sha512-y3YkYhdnhjDBAe0VIA0c4wVoFOvnp8CnAvfLqi0TqotIv92wIlAAP7HELOpLBsKwjAX6W92rSflA6an/2zBvXw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.35.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/search": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.6.0.tgz", + "integrity": "sha512-koFuNXcDvyyotWcgOnZGmY7LZqEOXZaaxD/j6n18TCLx2/9HieZJ5H6hs1g8FiRxBD0DNfs0nXn17g872RmYdw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.37.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/state": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.4.tgz", + "integrity": "sha512-8y7xqG/hpB53l25CIoit9/ngxdfoG+fx+V3SHBrinnhOtLvKHRyAJJuHzkWrR4YXXLX8eXBsejgAAxHUOdW1yw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@marijn/find-cluster-break": "^1.0.0" + } + }, + "node_modules/@codemirror/theme-one-dark": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.1.3.tgz", + "integrity": "sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/highlight": "^1.0.0" + } + }, + "node_modules/@codemirror/view": { + "version": "6.39.12", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.39.12.tgz", + "integrity": "sha512-f+/VsHVn/kOA9lltk/GFzuYwVVAKmOnNjxbrhkk3tPHntFqjWeI2TbIXx006YkBkqC10wZ4NsnWXCQiFPeAISQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@codemirror/state": "^6.5.0", + "crelt": "^1.0.6", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, "node_modules/@daybrush/utils": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/@daybrush/utils/-/utils-1.13.0.tgz", @@ -1192,6 +1320,77 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@lezer/common": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.1.tgz", + "integrity": "sha512-6YRVG9vBkaY7p1IVxL4s44n5nUnaNnGM2/AckNgYOnxTG2kWh1vR8BMxPseWPjRNpb5VtXnMpeYAEAADoRV1Iw==", + "license": "MIT", + "peer": true + }, + "node_modules/@lezer/highlight": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.3.tgz", + "integrity": "sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==", + "license": "MIT", + "peer": true, + "dependencies": { + "@lezer/common": "^1.3.0" + } + }, + "node_modules/@lezer/json": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@lezer/json/-/json-1.0.3.tgz", + "integrity": "sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/lr": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.8.tgz", + "integrity": "sha512-bPWa0Pgx69ylNlMlPvBPryqeLYQjyJjqPx+Aupm5zydLIF3NE+6MMLT8Yi23Bd9cif9VS00aUebn+6fDIGBcDA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@marijn/find-cluster-break": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", + "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", + "license": "MIT", + "peer": true + }, + "node_modules/@monaco-editor/loader": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.7.0.tgz", + "integrity": "sha512-gIwR1HrJrrx+vfyOhYmCZ0/JcWqG5kbfG7+d3f/C1LXk2EvzAbHSg3MQ5lO2sMlo9izoAZ04shohfKLVT6crVA==", + "license": "MIT", + "peer": true, + "dependencies": { + "state-local": "^1.0.6" + } + }, + "node_modules/@monaco-editor/react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.7.0.tgz", + "integrity": "sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@monaco-editor/loader": "^1.5.0" + }, + "peerDependencies": { + "monaco-editor": ">= 0.25.0 < 1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/@napi-rs/wasm-runtime": { "version": "0.2.12", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", @@ -2786,6 +2985,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -2810,6 +3019,13 @@ "undici-types": "~6.21.0" } }, + "node_modules/@types/prismjs": { + "version": "1.26.5", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", + "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", + "license": "MIT", + "peer": true + }, "node_modules/@types/react": { "version": "19.2.8", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.8.tgz", @@ -2830,6 +3046,13 @@ "@types/react": "^19.2.0" } }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT", + "peer": true + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.52.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.52.0.tgz", @@ -3099,6 +3322,81 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@uiw/codemirror-extensions-basic-setup": { + "version": "4.25.4", + "resolved": "https://registry.npmjs.org/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.25.4.tgz", + "integrity": "sha512-YzNwkm0AbPv1EXhCHYR5v0nqfemG2jEB0Z3Att4rBYqKrlG7AA9Rhjc3IyBaOzsBu18wtrp9/+uhTyu7TXSRng==", + "license": "MIT", + "peer": true, + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/commands": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/search": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + }, + "peerDependencies": { + "@codemirror/autocomplete": ">=6.0.0", + "@codemirror/commands": ">=6.0.0", + "@codemirror/language": ">=6.0.0", + "@codemirror/lint": ">=6.0.0", + "@codemirror/search": ">=6.0.0", + "@codemirror/state": ">=6.0.0", + "@codemirror/view": ">=6.0.0" + } + }, + "node_modules/@uiw/codemirror-themes": { + "version": "4.25.4", + "resolved": "https://registry.npmjs.org/@uiw/codemirror-themes/-/codemirror-themes-4.25.4.tgz", + "integrity": "sha512-2SLktItgcZC4p0+PfFusEbAHwbuAWe3bOOntCevVgHtrWGtGZX3IPv2k8IKZMgOXtAHyGKpJvT9/nspPn/uCQg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + }, + "peerDependencies": { + "@codemirror/language": ">=6.0.0", + "@codemirror/state": ">=6.0.0", + "@codemirror/view": ">=6.0.0" + } + }, + "node_modules/@uiw/react-codemirror": { + "version": "4.25.4", + "resolved": "https://registry.npmjs.org/@uiw/react-codemirror/-/react-codemirror-4.25.4.tgz", + "integrity": "sha512-ipO067oyfUw+DVaXhQCxkB0ZD9b7RnY+ByrprSYSKCHaULvJ3sqWYC/Zen6zVQ8/XC4o5EPBfatGiX20kC7XGA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.18.6", + "@codemirror/commands": "^6.1.0", + "@codemirror/state": "^6.1.1", + "@codemirror/theme-one-dark": "^6.0.0", + "@uiw/codemirror-extensions-basic-setup": "4.25.4", + "codemirror": "^6.0.0" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + }, + "peerDependencies": { + "@babel/runtime": ">=7.11.0", + "@codemirror/state": ">=6.0.0", + "@codemirror/theme-one-dark": ">=6.0.0", + "@codemirror/view": ">=6.0.0", + "codemirror": ">=6.0.0", + "react": ">=17.0.0", + "react-dom": ">=17.0.0" + } + }, "node_modules/@unrs/resolver-binding-android-arm-eabi": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", @@ -3931,6 +4229,39 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -3976,6 +4307,22 @@ "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, + "node_modules/codemirror": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.2.tgz", + "integrity": "sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/commands": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/search": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -3996,6 +4343,17 @@ "dev": true, "license": "MIT" }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -4010,6 +4368,13 @@ "dev": true, "license": "MIT" }, + "node_modules/crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", + "license": "MIT", + "peer": true + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -4225,6 +4590,20 @@ } } }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -4301,6 +4680,16 @@ "node": ">=0.10.0" } }, + "node_modules/dompurify": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.7.tgz", + "integrity": "sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==", + "license": "(MPL-2.0 OR Apache-2.0)", + "peer": true, + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -5014,6 +5403,20 @@ "reusify": "^1.0.4" } }, + "node_modules/fault": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", + "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "license": "MIT", + "peer": true, + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -5094,6 +5497,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "peer": true, + "engines": { + "node": ">=0.4.x" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -5409,6 +5821,38 @@ "node": ">= 0.4" } }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hermes-estree": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", @@ -5426,6 +5870,23 @@ "hermes-estree": "0.25.1" } }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/highlightjs-vue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz", + "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==", + "license": "CC0-1.0", + "peer": true + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -5484,6 +5945,32 @@ "node": ">= 0.4" } }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "peer": true, + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -5642,6 +6129,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -5701,6 +6199,17 @@ "node": ">=0.10.0" } }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", @@ -6099,6 +6608,21 @@ "loose-envify": "cli.js" } }, + "node_modules/lowlight": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", + "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", + "license": "MIT", + "peer": true, + "dependencies": { + "fault": "^1.0.0", + "highlight.js": "~10.7.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -6109,6 +6633,19 @@ "yallist": "^3.0.2" } }, + "node_modules/marked": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-14.0.0.tgz", + "integrity": "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==", + "license": "MIT", + "peer": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -6173,6 +6710,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/monaco-editor": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.55.1.tgz", + "integrity": "sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==", + "license": "MIT", + "peer": true, + "dependencies": { + "dompurify": "3.2.7", + "marked": "14.0.0" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -6513,6 +7061,33 @@ "node": ">=6" } }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT", + "peer": true + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -6607,6 +7182,16 @@ "node": ">= 0.8.0" } }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -6618,6 +7203,17 @@ "react-is": "^16.13.1" } }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -6773,6 +7369,27 @@ } } }, + "node_modules/react-syntax-highlighter": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-16.1.0.tgz", + "integrity": "sha512-E40/hBiP5rCNwkeBN1vRP+xow1X0pndinO+z3h7HLsHyjztbyjfzNWNKuAsJj+7DLam9iT4AaaOZnueCU+Nplg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.28.4", + "highlight.js": "^10.4.1", + "highlightjs-vue": "^1.0.0", + "lowlight": "^1.17.0", + "prismjs": "^1.30.0", + "refractor": "^5.0.0" + }, + "engines": { + "node": ">= 16.20.2" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, "node_modules/react-zoom-pan-pinch": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/react-zoom-pan-pinch/-/react-zoom-pan-pinch-3.7.0.tgz", @@ -6824,6 +7441,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/refractor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-5.0.0.tgz", + "integrity": "sha512-QXOrHQF5jOpjjLfiNk5GFnWhRXvxjUVnlFxkeDmewR5sXkr3iM46Zo+CnRR8B+MDVqkULW4EcLVcRBNOPXHosw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/hast": "^3.0.0", + "@types/prismjs": "^1.0.0", + "hastscript": "^9.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", @@ -7257,6 +7891,17 @@ "node": ">=0.10.0" } }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/stable-hash": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", @@ -7264,6 +7909,13 @@ "dev": true, "license": "MIT" }, + "node_modules/state-local": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", + "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==", + "license": "MIT", + "peer": true + }, "node_modules/stop-iteration-iterator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", @@ -7414,6 +8066,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/style-mod": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", + "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==", + "license": "MIT", + "peer": true + }, "node_modules/styled-jsx": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", @@ -7855,6 +8514,13 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "license": "MIT", + "peer": true + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index ec75bcdc..35e263b7 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ }, "dependencies": { "@apollo/client": "^4.0.9", - "@code0-tech/pictor": "^0.0.0-mvp.39", + "@code0-tech/pictor": "^0.0.0-mvp.40", "graphql": "^16.12.0", "graphql-tag": "^2.12.6", "next": "16.0.7", From 941f2d56a3ea0fe8ccd7b3c96a5b866610fd9090 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sat, 7 Feb 2026 19:27:24 +0100 Subject: [PATCH 085/173] feat: rename page.tsx to default.tsx for improved clarity --- .../[namespaceId]/project/[projectId]/{page.tsx => default.tsx} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/app/(flow)/@tab/namespace/[namespaceId]/project/[projectId]/{page.tsx => default.tsx} (100%) diff --git a/src/app/(flow)/@tab/namespace/[namespaceId]/project/[projectId]/page.tsx b/src/app/(flow)/@tab/namespace/[namespaceId]/project/[projectId]/default.tsx similarity index 100% rename from src/app/(flow)/@tab/namespace/[namespaceId]/project/[projectId]/page.tsx rename to src/app/(flow)/@tab/namespace/[namespaceId]/project/[projectId]/default.tsx From 22733a2b7f6754e3f2fa04edc56d5ef0d39dc6f2 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sat, 7 Feb 2026 19:27:29 +0100 Subject: [PATCH 086/173] feat: adjust layout gap in FolderView for improved spacing --- .../ce/src/ui-flow/folder/FolderView.tsx | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/packages/ce/src/ui-flow/folder/FolderView.tsx b/src/packages/ce/src/ui-flow/folder/FolderView.tsx index 8541c958..2731c081 100644 --- a/src/packages/ce/src/ui-flow/folder/FolderView.tsx +++ b/src/packages/ce/src/ui-flow/folder/FolderView.tsx @@ -9,6 +9,7 @@ import { DFlowFolderHandle, DLayout, Flex, + Spacing, Text, toast, Tooltip, @@ -109,7 +110,7 @@ export const FolderView: React.FC = () => { contextData={contextData} onDelete={deleteFlow}/> - Explorer @@ -181,21 +182,21 @@ export const FolderView: React.FC = () => { }> - { - const number = flow.id?.match(/Flow\/(\d+)$/)?.[1] - router.push(`/namespace/${namespaceIndex}/project/${projectIndex}/flow/${number}`) - }} - onCreate={flowTypeId => { - setCreateDialogOpen(true) - setFlowTypeId(flowTypeId) - }} - onDelete={contextData => { - setDeleteDialogOpen(true) - setContextData(contextData) - }} - namespaceId={`gid://sagittarius/Namespace/${namespaceIndex}`} - projectId={`gid://sagittarius/NamespaceProject/${projectIndex}`}/> + { + const number = flow.id?.match(/Flow\/(\d+)$/)?.[1] + router.push(`/namespace/${namespaceIndex}/project/${projectIndex}/flow/${number}`) + }} + onCreate={flowTypeId => { + setCreateDialogOpen(true) + setFlowTypeId(flowTypeId) + }} + onDelete={contextData => { + setDeleteDialogOpen(true) + setContextData(contextData) + }} + namespaceId={`gid://sagittarius/Namespace/${namespaceIndex}`} + projectId={`gid://sagittarius/NamespaceProject/${projectIndex}`}/> } \ No newline at end of file From 7482b378526ce0a8c3de4e7e66fbd180c4fd647c Mon Sep 17 00:00:00 2001 From: nicosammito Date: Tue, 10 Feb 2026 13:49:31 +0100 Subject: [PATCH 087/173] feat: remove unused DataTypeIdentifier fragment and related fields from Flow fragment --- src/packages/ce/src/flow/fragments/Flow.fragment.graphql | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/packages/ce/src/flow/fragments/Flow.fragment.graphql b/src/packages/ce/src/flow/fragments/Flow.fragment.graphql index e7c3afaf..b097e92d 100644 --- a/src/packages/ce/src/flow/fragments/Flow.fragment.graphql +++ b/src/packages/ce/src/flow/fragments/Flow.fragment.graphql @@ -1,5 +1,3 @@ -#import "../../function/fragments/DataTypeIdentifier.fragment.graphql" - fragment Flow on Flow { __typename id @@ -44,12 +42,6 @@ fragment Flow on Flow { id updatedAt createdAt - dataTypeIdentifier { - ...DataTypeIdentifier - } - node - depth - scope nodeFunctionId referencePath { __typename From c6d4776bc0ed80648ee05798d446656e972ef4d6 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Tue, 10 Feb 2026 13:50:41 +0100 Subject: [PATCH 088/173] feat: update @code0-tech/pictor to version 0.0.0-mvp.41 and add ldrs dependency --- package-lock.json | 24 ++++++++++++++++-------- package.json | 2 +- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 899b34b2..7d22a91c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0", "dependencies": { "@apollo/client": "^4.0.9", - "@code0-tech/pictor": "^0.0.0-mvp.40", + "@code0-tech/pictor": "^0.0.0-mvp.41", "graphql": "^16.12.0", "graphql-tag": "^2.12.6", "next": "16.0.7", @@ -362,12 +362,12 @@ } }, "node_modules/@code0-tech/pictor": { - "version": "0.0.0-mvp.40", - "resolved": "https://registry.npmjs.org/@code0-tech/pictor/-/pictor-0.0.0-mvp.40.tgz", - "integrity": "sha512-OzkmuwscKCR3uOpMTWSftRGALVBHVdXiIaAC8FmvdwQ0eiOVe6xDpmD5LbqypyPkXBZkIb317WZR2dH3JZWjgw==", + "version": "0.0.0-mvp.41", + "resolved": "https://registry.npmjs.org/@code0-tech/pictor/-/pictor-0.0.0-mvp.41.tgz", + "integrity": "sha512-L0f8DhI+JTKSQ9DZihydCmHnvDZUW/dBDv5APz/eZDyd1GlL2wi8XjMwG+t4i2H8fimqFBWc0q0kyBUowsx11w==", "peerDependencies": { "@ariakit/react": "^0.4.17", - "@code0-tech/sagittarius-graphql-types": "0.0.0-e610ffe24a7dc3cf7b4c285994830412410f229e", + "@code0-tech/sagittarius-graphql-types": "0.0.0-703d578a55a3f0f20be3cb6892418f9e04d25716", "@codemirror/autocomplete": "^6.20.0", "@codemirror/lang-json": "^6.0.2", "@monaco-editor/react": "^4.7.0", @@ -388,6 +388,7 @@ "@xyflow/react": "^12.10.0", "cmdk": "^1.1.1", "js-md5": "^0.8.3", + "ldrs": "^1.1.9", "merge-props": "^6.0.0", "overlap-area": "^1.1.0", "react": "^18.0.0 || ^19.0.0", @@ -400,9 +401,9 @@ } }, "node_modules/@code0-tech/sagittarius-graphql-types": { - "version": "0.0.0-e610ffe24a7dc3cf7b4c285994830412410f229e", - "resolved": "https://registry.npmjs.org/@code0-tech/sagittarius-graphql-types/-/sagittarius-graphql-types-0.0.0-e610ffe24a7dc3cf7b4c285994830412410f229e.tgz", - "integrity": "sha512-q6yNjjUSqP2F/MlkaDkZITU8dP/Yv1yAVRgrduFRT01I5v7rovAVwiDT1W5SoVSEsuhiUOXs3oAlz+Ri6nVY8g==", + "version": "0.0.0-703d578a55a3f0f20be3cb6892418f9e04d25716", + "resolved": "https://registry.npmjs.org/@code0-tech/sagittarius-graphql-types/-/sagittarius-graphql-types-0.0.0-703d578a55a3f0f20be3cb6892418f9e04d25716.tgz", + "integrity": "sha512-rPxL8U2Otuo4DYR2ExVhp2wnz7r+jlU70o45WXS6PI89xZ03+T7wGuPcPNJUoB/SGVNl/+5WaqWlCh+HSfhmjA==", "peer": true }, "node_modules/@codemirror/autocomplete": { @@ -6559,6 +6560,13 @@ "node": ">=0.10" } }, + "node_modules/ldrs": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/ldrs/-/ldrs-1.1.9.tgz", + "integrity": "sha512-JKVdzboxeZrKecA8ovi5iIDgs59wUrtJ+LDrHCgZecNrR0AJi2cJ3ZANJ+UCNS/sHRol73/jlypNCAMCXS+Ung==", + "license": "MIT", + "peer": true + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", diff --git a/package.json b/package.json index 35e263b7..5b1a34f2 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ }, "dependencies": { "@apollo/client": "^4.0.9", - "@code0-tech/pictor": "^0.0.0-mvp.40", + "@code0-tech/pictor": "^0.0.0-mvp.41", "graphql": "^16.12.0", "graphql-tag": "^2.12.6", "next": "16.0.7", From e1745062013b05d92b81f61809886aa5ff0add5d Mon Sep 17 00:00:00 2001 From: nicosammito Date: Wed, 11 Feb 2026 15:47:10 +0100 Subject: [PATCH 089/173] feat: add placeholder Page component with client directive --- .../[namespaceId]/project/[projectId]/settings/page.tsx | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 src/app/(flow)/namespace/[namespaceId]/project/[projectId]/settings/page.tsx diff --git a/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/settings/page.tsx b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/settings/page.tsx new file mode 100644 index 00000000..01fbe232 --- /dev/null +++ b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/settings/page.tsx @@ -0,0 +1,5 @@ +"use client" + +export function Page() { + return null +} \ No newline at end of file From 550c4a021ed76e903868cea26c225c66ef60196c Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 12 Feb 2026 12:54:21 +0100 Subject: [PATCH 090/173] feat: enhance Page with dynamic tab navigation, tooltips, and routing based on URL params --- .../project/[projectId]/default.tsx | 64 +++++++++++++++---- 1 file changed, 51 insertions(+), 13 deletions(-) diff --git a/src/app/(flow)/@tab/namespace/[namespaceId]/project/[projectId]/default.tsx b/src/app/(flow)/@tab/namespace/[namespaceId]/project/[projectId]/default.tsx index 215b2d38..7343f054 100644 --- a/src/app/(flow)/@tab/namespace/[namespaceId]/project/[projectId]/default.tsx +++ b/src/app/(flow)/@tab/namespace/[namespaceId]/project/[projectId]/default.tsx @@ -1,23 +1,61 @@ "use client" import {Tab, TabList, TabTrigger} from "@code0-tech/pictor/dist/components/tab/Tab"; -import {Button} from "@code0-tech/pictor"; -import {IconBuilding, IconHome} from "@tabler/icons-react"; +import {Button, Text, Tooltip, TooltipContent, TooltipPortal, TooltipTrigger} from "@code0-tech/pictor"; +import {IconBuilding, IconHome, IconSettings} from "@tabler/icons-react"; import React from "react"; +import {useParams, usePathname, useRouter} from "next/navigation"; +import {hashToColor} from "@code0-tech/pictor/dist/components/d-flow/DFlow.util"; export default function Page() { - return + + + const pathname = usePathname() + const router = useRouter() + const params = useParams() + const defaultValue = pathname.includes("flow") ? "flow" + : "settings" + + const namespaceId = params.namespaceId as any + const projectId = params.projectId as any + const flowId = params.flowId as any + + return - - - - - - + + + + + + + + + Flow builder + + + + + + + + + + + + Settings + + + } \ No newline at end of file From 56bc353c365afe6b7d243c29e8f3a24c0d0c9a5e Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 12 Feb 2026 12:54:32 +0100 Subject: [PATCH 091/173] feat: add ApplicationLayout with resizable panel and FolderView integration --- .../project/[projectId]/flow/layout.tsx | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/layout.tsx diff --git a/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/layout.tsx b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/layout.tsx new file mode 100644 index 00000000..88c1fec4 --- /dev/null +++ b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/layout.tsx @@ -0,0 +1,24 @@ +"use client" + +import React from "react"; +import {DResizableHandle, DResizablePanel, DResizablePanelGroup} from "@code0-tech/pictor"; +import {FolderView} from "@edition/ui-flow/folder/FolderView"; + +interface ApplicationLayoutProps { + children: React.ReactNode + bar: React.ReactNode + tab: React.ReactNode +} + +const ApplicationLayout: React.FC = ({children, bar, tab}) => { + + return + + + + + {children} + +} + +export default ApplicationLayout From 6ff764d6e84853608a54ff515be2d233bdb92165 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 12 Feb 2026 12:54:45 +0100 Subject: [PATCH 092/173] refactor: simplify Layout by removing resizable panel and FolderView integration --- src/app/(flow)/layout.tsx | 37 ++++++++++++------------------------- 1 file changed, 12 insertions(+), 25 deletions(-) diff --git a/src/app/(flow)/layout.tsx b/src/app/(flow)/layout.tsx index 8082c53b..dd843b09 100644 --- a/src/app/(flow)/layout.tsx +++ b/src/app/(flow)/layout.tsx @@ -1,7 +1,7 @@ "use client" -import React from "react"; import {useApolloClient} from "@apollo/client/react"; +import {useParams, useRouter} from "next/navigation"; import { AuroraBackground, ContextStoreProvider, @@ -12,9 +12,6 @@ import { DNamespaceRoleView, DNamespaceView, DOrganizationView, - DResizableHandle, - DResizablePanel, - DResizablePanelGroup, DRuntimeView, DUserView, Flex, @@ -22,34 +19,30 @@ import { FunctionDefinitionView, useUserSession } from "@code0-tech/pictor"; -import {UserService} from "@edition/user/User.service"; +import React from "react"; import {GraphqlClient} from "@core/util/graphql-client"; -import {useParams, useRouter} from "next/navigation"; +import {Flow, Namespace, NamespaceProject} from "@code0-tech/sagittarius-graphql-types"; +import {usePersistentReactiveArrayService} from "@/hooks/usePersistentReactiveArrayService"; +import {UserService} from "@edition/user/User.service"; import {OrganizationService} from "@edition/organization/Organization.service"; import {MemberService} from "@edition/member/Member.service"; import {NamespaceService} from "@edition/namespace/Namespace.service"; -import {usePersistentReactiveArrayService} from "@/hooks/usePersistentReactiveArrayService"; import {RuntimeService} from "@edition/runtime/Runtime.service"; import {ProjectService} from "@edition/project/Project.service"; import {RoleService} from "@edition/role/Role.service"; -import {Flow, Namespace, NamespaceProject} from "@code0-tech/sagittarius-graphql-types"; import {FlowService} from "@edition/flow/Flow.service"; import {FunctionService} from "@edition/function/Function.service"; import {DatatypeService} from "@edition/datatype/Datatype.service"; import {FlowTypeService} from "@edition/flowtype/FlowTypeService"; import {FileTabsView} from "@code0-tech/pictor/dist/components/file-tabs/FileTabs.view"; import {FileTabsService} from "@code0-tech/pictor/dist/components/file-tabs/FileTabs.service"; -import {FolderView} from "@edition/ui-flow/folder/FolderView"; import Image from "next/image"; -interface ApplicationLayoutProps { +export default function Layout({bar, tab, children}: { + bar: React.ReactNode, + tab: React.ReactNode, children: React.ReactNode - bar: React.ReactNode - tab: React.ReactNode -} - -const ApplicationLayout: React.FC = ({children, bar, tab}) => { - +}) { const client = useApolloClient() const router = useRouter() const params = useParams() @@ -123,17 +116,11 @@ const ApplicationLayout: React.FC = ({children, bar, tab }> {bar}}> - - - - - + <> {children} - + -} - -export default ApplicationLayout +} \ No newline at end of file From 3e8714faff296006c8d62baeacea8cff6bcf8c7d Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 12 Feb 2026 12:54:56 +0100 Subject: [PATCH 093/173] fix: update project selection to navigate to flow tab by default --- .../ce/src/ui-dashboard/namespace/NamespaceProjectsView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsView.tsx b/src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsView.tsx index c4db0e48..83f20d49 100644 --- a/src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsView.tsx +++ b/src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsView.tsx @@ -15,7 +15,7 @@ export const NamespaceProjectsView: React.FC = () => { const projectsList = React.useMemo(() => { return { const number = project.id?.match(/NamespaceProject\/(\d+)$/)?.[1] - router.push(`/namespace/${namespaceId}/project/${number}`) + router.push(`/namespace/${namespaceId}/project/${number}/flow`) }} namespaceId={`gid://sagittarius/Namespace/${namespaceId}`}/> }, [namespaceId]) From 30499301a1e95aa91551a5cdf03a02c1f01a8e69 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 12 Feb 2026 12:55:09 +0100 Subject: [PATCH 094/173] chore: move page.tsx to root directory --- .../[namespaceId]/project/[projectId]/{ => flow}/page.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) rename src/app/(flow)/namespace/[namespaceId]/project/[projectId]/{ => flow}/page.tsx (94%) diff --git a/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/page.tsx b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/page.tsx similarity index 94% rename from src/app/(flow)/namespace/[namespaceId]/project/[projectId]/page.tsx rename to src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/page.tsx index a077880d..2022222c 100644 --- a/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/page.tsx +++ b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/page.tsx @@ -22,7 +22,8 @@ export default function Page() { const namespaceIndex = params?.namespaceId as any as number - return + return Date: Thu, 12 Feb 2026 12:55:19 +0100 Subject: [PATCH 095/173] feat: implement project settings page with vertical tabs and resizable sidebar --- .../project/[projectId]/settings/page.tsx | 121 +++++++++++++++++- 1 file changed, 118 insertions(+), 3 deletions(-) diff --git a/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/settings/page.tsx b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/settings/page.tsx index 01fbe232..59dfb24e 100644 --- a/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/settings/page.tsx +++ b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/settings/page.tsx @@ -1,5 +1,120 @@ "use client" -export function Page() { - return null -} \ No newline at end of file +import { + Button, + Card, + DResizableHandle, + DResizablePanel, + DResizablePanelGroup, + Flex, + Spacing, + Text +} from "@code0-tech/pictor"; +import {IconLayoutSidebar} from "@tabler/icons-react"; +import {Tab, TabContent, TabList, TabTrigger} from "@code0-tech/pictor/dist/components/tab/Tab"; +import CardSection from "@code0-tech/pictor/dist/components/card/CardSection"; +import React from "react"; + +export default function Page() { + return + + + + + Project settings + + + + + General settings and restrictions for your Sculptor application. These settings affect all users + and organizations within the application. + + + + + + + + + + + + + + + + + <> + + + General + + + + + + + Name + + + + + Description + + + + + + How to connect + + + + + + Access token + Is used to connect the runtime to our + service + + + + + + + + + + Delete runtime + + + + + + + This will delete the runtime and cannot be undone. + + + + + + + + + + +} From df85e3eb0006b42626d033ae89e8507482dfb0c2 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 12 Feb 2026 12:55:34 +0100 Subject: [PATCH 096/173] fix: update personal project selection to navigate to flow tab by default --- .../ui-dashboard/personal-project/PersonalProjectsView.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/packages/ce/src/ui-dashboard/personal-project/PersonalProjectsView.tsx b/src/packages/ce/src/ui-dashboard/personal-project/PersonalProjectsView.tsx index d31af3b6..ed2cd32d 100644 --- a/src/packages/ce/src/ui-dashboard/personal-project/PersonalProjectsView.tsx +++ b/src/packages/ce/src/ui-dashboard/personal-project/PersonalProjectsView.tsx @@ -28,7 +28,7 @@ export const PersonalProjectsView: React.FC = () => { if (!currentUser || !currentUser.namespace) return null return { const number = project.id?.match(/NamespaceProject\/(\d+)$/)?.[1] - router.push(`/namespace/${namespaceIndex}/project/${number}`) + router.push(`/namespace/${namespaceIndex}/project/${number}/flow`) }} namespaceId={currentUser.namespace.id}/> }, [currentUser]) @@ -41,7 +41,8 @@ export const PersonalProjectsView: React.FC = () => { Personal projects - Projects created in your personal namespace. You can also create organization projects if you are a member of any organization. + Projects created in your personal namespace. You can also create organization projects if you are a + member of any organization. From 1fcf1ddbf0202bbacf225674f9d1e6ee48fe2009 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 12 Feb 2026 15:03:51 +0100 Subject: [PATCH 097/173] fix: filter flows by project ID in Flow.service --- src/packages/ce/src/flow/Flow.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/packages/ce/src/flow/Flow.service.ts b/src/packages/ce/src/flow/Flow.service.ts index 15d02433..9a752b4d 100644 --- a/src/packages/ce/src/flow/Flow.service.ts +++ b/src/packages/ce/src/flow/Flow.service.ts @@ -38,7 +38,7 @@ export class FlowService extends DFlowReactiveService { const namespaceId = dependencies.namespaceId const projectId = dependencies.projectId - const filtered = flows.filter(flow => flow) + const filtered = flows.filter(flow => flow.project?.id === projectId) if (filtered.length <= 0) { this.client.query({ From 3a57e15968f16fdf6728d45860557a7135166f3c Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 12 Feb 2026 15:03:58 +0100 Subject: [PATCH 098/173] chore: remove unnecessary newline in Flow.fragment.graphql --- src/packages/ce/src/flow/fragments/Flow.fragment.graphql | 1 - 1 file changed, 1 deletion(-) diff --git a/src/packages/ce/src/flow/fragments/Flow.fragment.graphql b/src/packages/ce/src/flow/fragments/Flow.fragment.graphql index b097e92d..4ee62d16 100644 --- a/src/packages/ce/src/flow/fragments/Flow.fragment.graphql +++ b/src/packages/ce/src/flow/fragments/Flow.fragment.graphql @@ -2,7 +2,6 @@ fragment Flow on Flow { __typename id createdAt - name nodes (first: $firstNode, after: $afterNode) { __typename From e70d5e65b920c18a74df9b7e3af0d5b34a6efe74 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 12 Feb 2026 15:04:11 +0100 Subject: [PATCH 099/173] refactor: update project GraphQL fragments for expanded fields and consistent imports --- .../fragments/Project.fragment.graphql | 40 ++++++++++++++++++- .../mutations/Project.create.mutation.graphql | 5 ++- .../project/queries/Projects.query.graphql | 3 ++ 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/packages/ce/src/project/fragments/Project.fragment.graphql b/src/packages/ce/src/project/fragments/Project.fragment.graphql index 64fbbfc5..5dc1e057 100644 --- a/src/packages/ce/src/project/fragments/Project.fragment.graphql +++ b/src/packages/ce/src/project/fragments/Project.fragment.graphql @@ -1,4 +1,4 @@ -#import "../../runtime/fragments/Runtime.fragment.graphql" +#import "../../runtime/fragments/Runtime.id.fragment.graphql" fragment Project on NamespaceProject { __typename id @@ -6,17 +6,53 @@ fragment Project on NamespaceProject { description createdAt updatedAt + slug namespace { + __typename id } flows { + __typename count + nodes { + __typename + id + } + pageInfo { + __typename + endCursor + hasNextPage + } } runtimes { + __typename count + nodes { + __typename + id + } + pageInfo { + __typename + endCursor + hasNextPage + } + } + roles { + __typename + count + nodes { + __typename + id + } + pageInfo { + __typename + endCursor + hasNextPage + } } primaryRuntime { - ...Runtime + __typename + ...RuntimeId } userAbilities { assignProjectRuntimes diff --git a/src/packages/ce/src/project/mutations/Project.create.mutation.graphql b/src/packages/ce/src/project/mutations/Project.create.mutation.graphql index 51a9bbb7..42f16f9f 100644 --- a/src/packages/ce/src/project/mutations/Project.create.mutation.graphql +++ b/src/packages/ce/src/project/mutations/Project.create.mutation.graphql @@ -1,4 +1,4 @@ -#import "../fragments/Project.fragment.graphql" +#import "../fragments/Project.basic.fragment.graphql" mutation projectCreate ($name: String!, $description: String, $namespaceId: NamespaceID!) { namespacesProjectsCreate(input: { name: $name, @@ -9,12 +9,13 @@ mutation projectCreate ($name: String!, $description: String, $namespaceId: Name ...on Error { errorCode, details { + ...on ActiveModelError { attribute type } __typename } } } namespaceProject { - ...Project + ...BasicProject } } } \ No newline at end of file diff --git a/src/packages/ce/src/project/queries/Projects.query.graphql b/src/packages/ce/src/project/queries/Projects.query.graphql index f938e1b2..e728f530 100644 --- a/src/packages/ce/src/project/queries/Projects.query.graphql +++ b/src/packages/ce/src/project/queries/Projects.query.graphql @@ -8,11 +8,14 @@ query Projects ( ) { namespace(id: $namespaceId) { projects (first: $firstProject, after: $afterProject) { + __typename count nodes { + __typename ...Project } pageInfo { + __typename endCursor hasNextPage } From c0849f92ba27e6c8f5b80c3c2bfe76c25008054e Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 12 Feb 2026 15:04:20 +0100 Subject: [PATCH 100/173] feat: add GraphQL fragments and mutation for assigning runtimes to projects --- .../fragments/Project.basic.fragment.graphql | 32 +++++++++++++++++++ .../Project.assignRuntimes.mutation.graphql | 20 ++++++++++++ .../mutations/Project.delete.mutation.graphql | 0 .../mutations/Project.update.mutation.graphql | 0 4 files changed, 52 insertions(+) create mode 100644 src/packages/ce/src/project/fragments/Project.basic.fragment.graphql create mode 100644 src/packages/ce/src/project/mutations/Project.assignRuntimes.mutation.graphql create mode 100644 src/packages/ce/src/project/mutations/Project.delete.mutation.graphql create mode 100644 src/packages/ce/src/project/mutations/Project.update.mutation.graphql diff --git a/src/packages/ce/src/project/fragments/Project.basic.fragment.graphql b/src/packages/ce/src/project/fragments/Project.basic.fragment.graphql new file mode 100644 index 00000000..efee302a --- /dev/null +++ b/src/packages/ce/src/project/fragments/Project.basic.fragment.graphql @@ -0,0 +1,32 @@ +#import "../../runtime/fragments/Runtime.id.fragment.graphql" +fragment BasicProject on NamespaceProject { + __typename + id + name + description + createdAt + updatedAt + namespace { + id + } + flows { + count + } + runtimes { + count + } + primaryRuntime { + ...RuntimeId + } + roles { + count + } + slug + userAbilities { + assignProjectRuntimes + createFlow + deleteNamespaceProject + updateNamespaceProject + __typename + } +} \ No newline at end of file diff --git a/src/packages/ce/src/project/mutations/Project.assignRuntimes.mutation.graphql b/src/packages/ce/src/project/mutations/Project.assignRuntimes.mutation.graphql new file mode 100644 index 00000000..2df58ad8 --- /dev/null +++ b/src/packages/ce/src/project/mutations/Project.assignRuntimes.mutation.graphql @@ -0,0 +1,20 @@ +#import "../fragments/Project.basic.fragment.graphql" +mutation projectAssignRuntimes ($namespaceProjectId: NamespaceProjectID!, $runtimeIds: [RuntimeID!]!) { + namespacesProjectsAssignRuntimes(input: { + namespaceProjectId: $namespaceProjectId, + runtimeIds: $runtimeIds + }) { + errors { + ...on Error { + errorCode, + details { + ...on ActiveModelError { attribute type } + __typename + } + } + } + namespaceProject { + ...BasicProject + } + } +} \ No newline at end of file diff --git a/src/packages/ce/src/project/mutations/Project.delete.mutation.graphql b/src/packages/ce/src/project/mutations/Project.delete.mutation.graphql new file mode 100644 index 00000000..e69de29b diff --git a/src/packages/ce/src/project/mutations/Project.update.mutation.graphql b/src/packages/ce/src/project/mutations/Project.update.mutation.graphql new file mode 100644 index 00000000..e69de29b From 8dc6c8197210e9d87eb1c923ecb21fc8ac8e21ea Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 12 Feb 2026 16:42:17 +0100 Subject: [PATCH 101/173] feat: refactor project settings page into modular views for general, runtimes, and delete actions --- .../project/[projectId]/settings/page.tsx | 116 +----------------- .../project/ProjectSettingsDeleteView.tsx | 26 ++++ .../project/ProjectSettingsGeneralView.tsx | 70 +++++++++++ .../project/ProjectSettingsPage.tsx | 59 +++++++++ .../project/ProjectSettingsRuntimesView.tsx | 44 +++++++ 5 files changed, 201 insertions(+), 114 deletions(-) create mode 100644 src/packages/ce/src/ui-dashboard/project/ProjectSettingsDeleteView.tsx create mode 100644 src/packages/ce/src/ui-dashboard/project/ProjectSettingsGeneralView.tsx create mode 100644 src/packages/ce/src/ui-dashboard/project/ProjectSettingsPage.tsx create mode 100644 src/packages/ce/src/ui-dashboard/project/ProjectSettingsRuntimesView.tsx diff --git a/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/settings/page.tsx b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/settings/page.tsx index 59dfb24e..970e58dd 100644 --- a/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/settings/page.tsx +++ b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/settings/page.tsx @@ -1,120 +1,8 @@ "use client" -import { - Button, - Card, - DResizableHandle, - DResizablePanel, - DResizablePanelGroup, - Flex, - Spacing, - Text -} from "@code0-tech/pictor"; -import {IconLayoutSidebar} from "@tabler/icons-react"; -import {Tab, TabContent, TabList, TabTrigger} from "@code0-tech/pictor/dist/components/tab/Tab"; -import CardSection from "@code0-tech/pictor/dist/components/card/CardSection"; import React from "react"; +import {ProjectSettingsPage} from "@edition/ui-dashboard/project/ProjectSettingsPage"; export default function Page() { - return - - - - - Project settings - - - - - General settings and restrictions for your Sculptor application. These settings affect all users - and organizations within the application. - - - - - - - - - - - - - - - - - <> - - - General - - - - - - - Name - - - - - Description - - - - - - How to connect - - - - - - Access token - Is used to connect the runtime to our - service - - - - - - - - - - Delete runtime - - - - - - - This will delete the runtime and cannot be undone. - - - - - - - - - - + return } diff --git a/src/packages/ce/src/ui-dashboard/project/ProjectSettingsDeleteView.tsx b/src/packages/ce/src/ui-dashboard/project/ProjectSettingsDeleteView.tsx new file mode 100644 index 00000000..3a3304b1 --- /dev/null +++ b/src/packages/ce/src/ui-dashboard/project/ProjectSettingsDeleteView.tsx @@ -0,0 +1,26 @@ +"use client" + +import React from "react"; +import {Button, Card, Flex, Spacing, Text} from "@code0-tech/pictor"; +import {TabContent} from "@code0-tech/pictor/dist/components/tab/Tab"; + +export const ProjectSettingsDeleteView: React.FC = () => { + return + + Delete + + + + + + + This will delete the project and cannot be undone. + + + + + + +} \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/project/ProjectSettingsGeneralView.tsx b/src/packages/ce/src/ui-dashboard/project/ProjectSettingsGeneralView.tsx new file mode 100644 index 00000000..459d73b6 --- /dev/null +++ b/src/packages/ce/src/ui-dashboard/project/ProjectSettingsGeneralView.tsx @@ -0,0 +1,70 @@ +"use client" + +import React, {startTransition} from "react"; +import {Button, Card, Flex, Spacing, Text, TextInput, useForm, useService, useStore} from "@code0-tech/pictor"; +import CardSection from "@code0-tech/pictor/dist/components/card/CardSection"; +import {TabContent} from "@code0-tech/pictor/dist/components/tab/Tab"; +import {useParams} from "next/navigation"; +import {ProjectService} from "@edition/project/Project.service"; + +export const ProjectSettingsGeneralView: React.FC = () => { + + const params = useParams() + const projectService = useService(ProjectService) + const projectStore = useStore(ProjectService) + + const projectId = params.projectId as any as number + + const project = React.useMemo( + () => projectService.getById(`gid://sagittarius/NamespaceProject/${projectId}`), + [projectStore, projectId] + ) + + const initialValues = React.useMemo( + () => ({ + name: project?.name, + description: project?.description, + }), + [project] + ) + + const [inputs, validate] = useForm({ + initialValues: initialValues, + validate: { + name: (value) => { + if (!value) return "Name is required" + return null + }, + }, + onSubmit: (values) => { + startTransition(() => { + + }) + } + }) + + return + + General + + + + + + + Name + + + + + + Description + + + + + + +} \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/project/ProjectSettingsPage.tsx b/src/packages/ce/src/ui-dashboard/project/ProjectSettingsPage.tsx new file mode 100644 index 00000000..f85e40f0 --- /dev/null +++ b/src/packages/ce/src/ui-dashboard/project/ProjectSettingsPage.tsx @@ -0,0 +1,59 @@ +import {Tab, TabList, TabTrigger} from "@code0-tech/pictor/dist/components/tab/Tab"; + +"use clients" + +import React from "react"; +import {Button, DResizableHandle, DResizablePanel, DResizablePanelGroup, Flex, Text} from "@code0-tech/pictor"; +import {IconLayoutSidebar} from "@tabler/icons-react"; +import {ProjectSettingsGeneralView} from "@edition/ui-dashboard/project/ProjectSettingsGeneralView"; +import {ProjectSettingsRuntimesView} from "@edition/ui-dashboard/project/ProjectSettingsRuntimesView"; +import {ProjectSettingsDeleteView} from "@edition/ui-dashboard/project/ProjectSettingsDeleteView"; + +export const ProjectSettingsPage: React.FC = () => { + return + + + + + Project settings + + + + + General settings and restrictions for your Sculptor application. These settings affect all users + and organizations within the application. + + + + + + + + + + + + + + + + + <> + + + + + + + +} \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/project/ProjectSettingsRuntimesView.tsx b/src/packages/ce/src/ui-dashboard/project/ProjectSettingsRuntimesView.tsx new file mode 100644 index 00000000..87fc17bc --- /dev/null +++ b/src/packages/ce/src/ui-dashboard/project/ProjectSettingsRuntimesView.tsx @@ -0,0 +1,44 @@ +"use client" + +import React from "react" +import {Button, DRuntimeCard, DRuntimeList, Flex, Spacing, Text, useService, useStore} from "@code0-tech/pictor"; +import {TabContent} from "@code0-tech/pictor/dist/components/tab/Tab"; +import {useParams} from "next/navigation"; +import {ProjectService} from "@edition/project/Project.service"; +import {RuntimeService} from "@edition/runtime/Runtime.service"; + +export const ProjectSettingsRuntimesView: React.FC = () => { + + const params = useParams() + const projectService = useService(ProjectService) + const projectStore = useStore(ProjectService) + const runtimeService = useService(RuntimeService) + const runtimeStore = useStore(RuntimeService) + + const projectId = params.projectId as any as number + + const project = React.useMemo( + () => projectService.getById(`gid://sagittarius/NamespaceProject/${projectId}`), + [projectStore, projectId] + ) + + return + + Runtimes + + + + Primary Runtime + + + + All Runtimes + + { + return project?.runtimes?.nodes?.map(runtime => runtime?.id).includes(runtime?.id) ?? false + }}/> + + +} \ No newline at end of file From c2056040a6a916e85987572367a2587a67c8fc55 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 12 Feb 2026 19:19:55 +0100 Subject: [PATCH 102/173] feat: enhance NamespaceProjectsView with sortable and filterable project data table --- .../namespace/NamespaceProjectsView.tsx | 132 ++++++++++++++++-- 1 file changed, 119 insertions(+), 13 deletions(-) diff --git a/src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsView.tsx b/src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsView.tsx index 83f20d49..a6b80f94 100644 --- a/src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsView.tsx +++ b/src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsView.tsx @@ -2,38 +2,144 @@ import React from "react"; -import {Button, DNamespaceProjectList, Flex, Spacing, Text} from "@code0-tech/pictor"; +import { + Button, + DataTableFilterInput, + DataTableFilterSuggestionMenu, + Flex, + Menu, + MenuCheckboxItem, + MenuContent, + MenuItem, + MenuPortal, + MenuTrigger, + Spacing, + Text, + useService, + useStore +} from "@code0-tech/pictor"; import Link from "next/link"; import {useParams, useRouter} from "next/navigation"; +import {ProjectDataTableComponent} from "@edition/ui-dashboard/project/ProjectDataTableComponent"; +import {DataTableFilterProps, DataTableSortProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; +import {ButtonGroup} from "@code0-tech/pictor/dist/components/button-group/ButtonGroup"; +import {IconCheck, IconMinus, IconSortAscending, IconSortDescending} from "@tabler/icons-react"; +import {ProjectService} from "@edition/project/Project.service"; +import {ProjectDataTableFilterInputComponent} from "@edition/ui-dashboard/project/ProjectDataTableFilterInputComponent"; +//TODO: user abilities for project creation within namespace export const NamespaceProjectsView: React.FC = () => { const params = useParams() const router = useRouter() const namespaceId = params.namespaceId as any as number - const projectsList = React.useMemo(() => { - return { - const number = project.id?.match(/NamespaceProject\/(\d+)$/)?.[1] - router.push(`/namespace/${namespaceId}/project/${number}/flow`) - }} namespaceId={`gid://sagittarius/Namespace/${namespaceId}`}/> - }, [namespaceId]) + const projectService = useService(ProjectService) + const projectStore = useStore(ProjectService) + + const projects = React.useMemo( + () => projectService.values({namespaceId: `gid://sagittarius/Namespace/${namespaceId}`}), + [projectStore, namespaceId] + ) - //TODO: user abilities for project creation within namespace + const [filter, setFilter] = React.useState({}) + const [sort, setSort] = React.useState({}) + + const projectsList = React.useMemo(() => { + return { + const number = project?.id?.match(/NamespaceProject\/(\d+)$/)?.[1] + router.push(`/namespace/${namespaceId}/project/${number}/flow`) + }}/> + }, [namespaceId, filter, sort]) return <> - - Projects - - + + + Projects + + + Manage projects that you belong to. You can create new projects and switch between them. + + + - + + + + + + + { + if (sort["name"] === undefined) + setSort(prev => ({...prev, name: "asc"})) + else if (sort["name"] === "asc") + setSort(prev => ({...prev, name: "desc"})) + else + setSort(prev => ({...prev, name: undefined})) + + event.preventDefault() + event.stopPropagation() + }}> + {sort["name"] === undefined ? : sort["name"] === "asc" ? + : } + Name + + { + if (sort["createdAt"] === undefined) + setSort(prev => ({...prev, createdAt: "asc"})) + else if (sort["createdAt"] === "asc") + setSort(prev => ({...prev, createdAt: "desc"})) + else + setSort(prev => ({...prev, createdAt: undefined})) + + event.preventDefault() + event.stopPropagation() + }}> + {sort["createdAt"] === undefined ? + : sort["createdAt"] === "asc" ? + : } + Created At + + { + if (sort["updatedAt"] === undefined) + setSort(prev => ({...prev, updatedAt: "asc"})) + else if (sort["updatedAt"] === "asc") + setSort(prev => ({...prev, updatedAt: "desc"})) + else + setSort(prev => ({...prev, updatedAt: undefined})) + + event.preventDefault() + event.stopPropagation() + }}> + {sort["updatedAt"] === undefined ? + : sort["updatedAt"] === "asc" ? + : } + Updated At + + + + + +
+ setFilter(filter)}/> +
+ {projectsList} From 1e222393564642af4261e497dc7b92d09296859c Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 12 Feb 2026 19:20:00 +0100 Subject: [PATCH 103/173] feat: add ProjectDataTableComponent for displaying and managing project lists --- .../project/ProjectDataTableComponent.tsx | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/packages/ce/src/ui-dashboard/project/ProjectDataTableComponent.tsx diff --git a/src/packages/ce/src/ui-dashboard/project/ProjectDataTableComponent.tsx b/src/packages/ce/src/ui-dashboard/project/ProjectDataTableComponent.tsx new file mode 100644 index 00000000..c865f861 --- /dev/null +++ b/src/packages/ce/src/ui-dashboard/project/ProjectDataTableComponent.tsx @@ -0,0 +1,34 @@ +import React from "react"; +import {Avatar, DataTable, DataTableColumn, Flex, Text, useService, useStore} from "@code0-tech/pictor"; +import {DataTableFilterProps, DataTableSortProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; +import {Namespace, NamespaceProject} from "@code0-tech/sagittarius-graphql-types"; +import {ProjectService} from "@edition/project/Project.service"; +import {FlowService} from "@edition/flow/Flow.service"; +import {ProjectDataTableRowComponent} from "@edition/ui-dashboard/project/ProjectDataTableRowComponent"; + +export interface ProjectDataTableComponentProps { + namespaceId: Namespace["id"] + sort?: DataTableSortProps + filter?: DataTableFilterProps + preFilter?: (project: NamespaceProject, index: number) => boolean + onSelect?: (item: NamespaceProject | undefined) => void +} + +export const ProjectDataTableComponent: React.FC = (props) => { + + const {namespaceId, sort, filter, preFilter = () => true, onSelect} = props + + const projectService = useService(ProjectService) + const projectStore = useStore(ProjectService) + const projects = React.useMemo(() => projectService.values({namespaceId: namespaceId}), [projectStore, namespaceId]) + + return p.json()).filter(preFilter)}> + {(project, index) => { + return + }} + + +} \ No newline at end of file From a1c77d56ab1e221a6c403ab457719ecf354a0890 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 12 Feb 2026 19:20:05 +0100 Subject: [PATCH 104/173] feat: add ProjectDataTableFilterInputComponent for project name filtering in data tables --- .../ProjectDataTableFilterInputComponent.tsx | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/packages/ce/src/ui-dashboard/project/ProjectDataTableFilterInputComponent.tsx diff --git a/src/packages/ce/src/ui-dashboard/project/ProjectDataTableFilterInputComponent.tsx b/src/packages/ce/src/ui-dashboard/project/ProjectDataTableFilterInputComponent.tsx new file mode 100644 index 00000000..f536d405 --- /dev/null +++ b/src/packages/ce/src/ui-dashboard/project/ProjectDataTableFilterInputComponent.tsx @@ -0,0 +1,61 @@ +import React from "react"; +import { + DataTableFilterInput, + DataTableFilterSuggestionMenu, + MenuCheckboxItem, + useService, + useStore +} from "@code0-tech/pictor"; +import {IconCheck} from "@tabler/icons-react"; +import {Namespace} from "@code0-tech/sagittarius-graphql-types"; +import {DataTableFilterProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; +import {ProjectService} from "@edition/project/Project.service"; + +export interface ProjectDataTableFilterInputComponentProps { + namespaceId: Namespace['id'] + onChange: (filter: DataTableFilterProps) => void +} + +export const ProjectDataTableFilterInputComponent: React.FC = (props) => { + + const {namespaceId, onChange} = props + + const projectService = useService(ProjectService) + const projectStore = useStore(ProjectService) + + const projects = React.useMemo( + () => projectService.values({namespaceId: namespaceId}), + [projectStore, namespaceId] + ) + + return { + + const split = currentValue.split(",").map(s => s.trim()).filter(Boolean) + + return + {projects.map(project => { + + const isChecked = split.includes(project?.name!) + + return { + e.preventDefault(); + e.stopPropagation(); + const updated = isChecked + ? split.filter(name => name !== project?.name) + : [...split, project?.name]; + applySuggestion(updated.join(","), true); + }}> + {isChecked ? : } + {project?.name} + + })} + + } + } + ]}/> +} \ No newline at end of file From 99f1f1daa394c7a2f79ed6686e5d1c186e21192b Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 12 Feb 2026 19:20:09 +0100 Subject: [PATCH 105/173] feat: add ProjectDataTableRowComponent for displaying project details in data table rows --- .../project/ProjectDataTableRowComponent.tsx | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 src/packages/ce/src/ui-dashboard/project/ProjectDataTableRowComponent.tsx diff --git a/src/packages/ce/src/ui-dashboard/project/ProjectDataTableRowComponent.tsx b/src/packages/ce/src/ui-dashboard/project/ProjectDataTableRowComponent.tsx new file mode 100644 index 00000000..e3105bdd --- /dev/null +++ b/src/packages/ce/src/ui-dashboard/project/ProjectDataTableRowComponent.tsx @@ -0,0 +1,83 @@ +import React from "react"; +import {NamespaceProject} from "@code0-tech/sagittarius-graphql-types"; +import {Avatar, Badge, Button, DataTableColumn, Flex, Text, useService, useStore} from "@code0-tech/pictor"; +import {ProjectService} from "@edition/project/Project.service"; +import {RuntimeService} from "@edition/runtime/Runtime.service"; +import {IconBinaryTree, IconDotsVertical, IconServer} from "@tabler/icons-react"; + +export interface ProjectDataTableRowComponentProps { + projectId: NamespaceProject['id'] +} + +export const ProjectDataTableRowComponent: React.FC = (props) => { + + const {projectId} = props + + const projectService = useService(ProjectService) + const projectStore = useStore(ProjectService) + const runtimeService = useService(RuntimeService) + const runtimeStore = useStore(RuntimeService) + + const project = React.useMemo( + () => projectService.getById(projectId), + [projectStore, projectId] + ) + + const runtimes = React.useMemo( + () => project?.runtimes?.nodes?.map( + runtime => runtimeService.getById(runtime?.id) + ), + [runtimeStore, project] + ) + + const primaryRuntime = React.useMemo( + () => runtimes?.find( + runtime => runtime?.id === project?.primaryRuntime?.id + ), + [runtimes, project] + ) + + return <> + + + + + + {project?.name} + + + + {project?.description} + + + { + primaryRuntime && ( + + + + {primaryRuntime?.name} + + + ) + } + + + + {project?.runtimes?.count ?? 0} + + + + + + {project?.flows?.count ?? 0} + + + + Updated at {project?.updatedAt} + + + + + +} \ No newline at end of file From 6618456bd81e4fffdbfc326a36a5d4decff084bb Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 12 Feb 2026 19:34:01 +0100 Subject: [PATCH 106/173] feat: include primary runtime name in Project fragment --- src/packages/ce/src/project/fragments/Project.fragment.graphql | 1 + 1 file changed, 1 insertion(+) diff --git a/src/packages/ce/src/project/fragments/Project.fragment.graphql b/src/packages/ce/src/project/fragments/Project.fragment.graphql index 5dc1e057..c8351c0f 100644 --- a/src/packages/ce/src/project/fragments/Project.fragment.graphql +++ b/src/packages/ce/src/project/fragments/Project.fragment.graphql @@ -53,6 +53,7 @@ fragment Project on NamespaceProject { primaryRuntime { __typename ...RuntimeId + name } userAbilities { assignProjectRuntimes From 6b5146827dbe793a5b53b650b7687e9a3c93116a Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 12 Feb 2026 19:34:05 +0100 Subject: [PATCH 107/173] feat: add primary runtime filter to ProjectDataTableFilterInputComponent --- .../ProjectDataTableFilterInputComponent.tsx | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/packages/ce/src/ui-dashboard/project/ProjectDataTableFilterInputComponent.tsx b/src/packages/ce/src/ui-dashboard/project/ProjectDataTableFilterInputComponent.tsx index f536d405..2dc36c91 100644 --- a/src/packages/ce/src/ui-dashboard/project/ProjectDataTableFilterInputComponent.tsx +++ b/src/packages/ce/src/ui-dashboard/project/ProjectDataTableFilterInputComponent.tsx @@ -10,6 +10,7 @@ import {IconCheck} from "@tabler/icons-react"; import {Namespace} from "@code0-tech/sagittarius-graphql-types"; import {DataTableFilterProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; import {ProjectService} from "@edition/project/Project.service"; +import {RuntimeService} from "@edition/runtime/Runtime.service"; export interface ProjectDataTableFilterInputComponentProps { namespaceId: Namespace['id'] @@ -22,15 +23,25 @@ export const ProjectDataTableFilterInputComponent: React.FC projectService.values({namespaceId: namespaceId}), [projectStore, namespaceId] ) + const allPrimaryRuntimes = React.useMemo( + () => { + const runtimeIds = projects.map(p => p.primaryRuntime?.id) + return runtimeIds.map(id => runtimeService.getById(id)).filter(Boolean) + }, + [projects] + ) + return { @@ -56,6 +67,33 @@ export const ProjectDataTableFilterInputComponent: React.FC } + }, { + token: "Primary Runtime", + key: "primaryRuntime.name", + operators: ["isOneOf"], + suggestion: (context, operator, currentValue, applySuggestion) => { + + const split = currentValue.split(",").map(s => s.trim()).filter(Boolean) + + return + {allPrimaryRuntimes.map(runtime => { + + const isChecked = split.includes(runtime?.name!) + + return { + e.preventDefault(); + e.stopPropagation(); + const updated = isChecked + ? split.filter(name => name !== runtime?.name) + : [...split, runtime?.name]; + applySuggestion(updated.join(","), true); + }}> + {isChecked ? : } + {runtime?.name} + + })} + + } } ]}/> } \ No newline at end of file From bcdebd9abca921bf7f751f8a49f5a6f38121e020 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 12 Feb 2026 22:35:43 +0100 Subject: [PATCH 108/173] refactor: update project data table components and page to use new ProjectsView and improve empty state handling --- .../ui-dashboard/namespace/NamespaceProjectsPage.tsx | 4 ++-- .../ui-dashboard/project/ProjectDataTableComponent.tsx | 10 +++++++--- .../project/ProjectDataTableRowComponent.tsx | 4 ++-- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsPage.tsx b/src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsPage.tsx index 1fd119ef..32ae387b 100644 --- a/src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsPage.tsx +++ b/src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsPage.tsx @@ -1,6 +1,6 @@ "use client" -import {NamespaceProjectsView} from "@edition/ui-dashboard/namespace/NamespaceProjectsView"; +import {ProjectsView} from "@edition/ui-dashboard/project/ProjectsView"; import React from "react"; export const NamespaceProjectsPage: React.FC = () => { @@ -11,6 +11,6 @@ export const NamespaceProjectsPage: React.FC = () => { borderTopLeftRadius: "1rem", borderTopRightRadius: "1rem" }}> - +
} \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/project/ProjectDataTableComponent.tsx b/src/packages/ce/src/ui-dashboard/project/ProjectDataTableComponent.tsx index c865f861..233786fe 100644 --- a/src/packages/ce/src/ui-dashboard/project/ProjectDataTableComponent.tsx +++ b/src/packages/ce/src/ui-dashboard/project/ProjectDataTableComponent.tsx @@ -1,9 +1,8 @@ import React from "react"; -import {Avatar, DataTable, DataTableColumn, Flex, Text, useService, useStore} from "@code0-tech/pictor"; +import {DataTable, DataTableColumn, Text, useService, useStore} from "@code0-tech/pictor"; import {DataTableFilterProps, DataTableSortProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; import {Namespace, NamespaceProject} from "@code0-tech/sagittarius-graphql-types"; import {ProjectService} from "@edition/project/Project.service"; -import {FlowService} from "@edition/flow/Flow.service"; import {ProjectDataTableRowComponent} from "@edition/ui-dashboard/project/ProjectDataTableRowComponent"; export interface ProjectDataTableComponentProps { @@ -24,7 +23,12 @@ export const ProjectDataTableComponent: React.FC return + + No projects found. Create one to get started. + + } + onSelect={(item) => item && onSelect?.(item)} data={projects.map(p => p.json()).filter(preFilter)}> {(project, index) => { return diff --git a/src/packages/ce/src/ui-dashboard/project/ProjectDataTableRowComponent.tsx b/src/packages/ce/src/ui-dashboard/project/ProjectDataTableRowComponent.tsx index e3105bdd..f3219438 100644 --- a/src/packages/ce/src/ui-dashboard/project/ProjectDataTableRowComponent.tsx +++ b/src/packages/ce/src/ui-dashboard/project/ProjectDataTableRowComponent.tsx @@ -1,9 +1,9 @@ import React from "react"; import {NamespaceProject} from "@code0-tech/sagittarius-graphql-types"; -import {Avatar, Badge, Button, DataTableColumn, Flex, Text, useService, useStore} from "@code0-tech/pictor"; +import {Avatar, Badge, DataTableColumn, Flex, Text, useService, useStore} from "@code0-tech/pictor"; import {ProjectService} from "@edition/project/Project.service"; import {RuntimeService} from "@edition/runtime/Runtime.service"; -import {IconBinaryTree, IconDotsVertical, IconServer} from "@tabler/icons-react"; +import {IconBinaryTree, IconServer} from "@tabler/icons-react"; export interface ProjectDataTableRowComponentProps { projectId: NamespaceProject['id'] From 728fdf52ff13add60ac06759c880b37b0d7db105 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 12 Feb 2026 22:35:50 +0100 Subject: [PATCH 109/173] refactor: rename NamespaceProjectsView to ProjectsView and update references in NamespaceOverviewPage --- .../ce/src/ui-dashboard/namespace/NamespaceOverviewPage.tsx | 4 ++-- .../NamespaceProjectsView.tsx => project/ProjectsView.tsx} | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) rename src/packages/ce/src/ui-dashboard/{namespace/NamespaceProjectsView.tsx => project/ProjectsView.tsx} (98%) diff --git a/src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewPage.tsx b/src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewPage.tsx index 76e20c8a..ce1590ab 100644 --- a/src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewPage.tsx +++ b/src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewPage.tsx @@ -1,7 +1,7 @@ "use client" import React from "react"; -import {NamespaceProjectsView} from "@edition/ui-dashboard/namespace/NamespaceProjectsView"; +import {ProjectsView} from "@edition/ui-dashboard/project/ProjectsView"; import {DLayout, useService, useStore, useUserSession} from "@code0-tech/pictor"; import {NamespaceOverviewRightView} from "@edition/ui-dashboard/namespace/NamespaceOverviewRightView"; import {NamespaceOverviewLeftView} from "@edition/ui-dashboard/namespace/NamespaceOverviewLeftView"; @@ -29,7 +29,7 @@ export const NamespaceOverviewPage: React.FC = () => { borderTopLeftRadius: "1rem", borderTopRightRadius: "1rem" }}> - +
} \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsView.tsx b/src/packages/ce/src/ui-dashboard/project/ProjectsView.tsx similarity index 98% rename from src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsView.tsx rename to src/packages/ce/src/ui-dashboard/project/ProjectsView.tsx index a6b80f94..0d2610e4 100644 --- a/src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsView.tsx +++ b/src/packages/ce/src/ui-dashboard/project/ProjectsView.tsx @@ -28,7 +28,7 @@ import {ProjectService} from "@edition/project/Project.service"; import {ProjectDataTableFilterInputComponent} from "@edition/ui-dashboard/project/ProjectDataTableFilterInputComponent"; //TODO: user abilities for project creation within namespace -export const NamespaceProjectsView: React.FC = () => { +export const ProjectsView: React.FC = () => { const params = useParams() const router = useRouter() @@ -68,7 +68,7 @@ export const NamespaceProjectsView: React.FC = () => { - + From 2fbcde5722cc8fd3af3abaed4c25b037f5340810 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 12 Feb 2026 22:38:40 +0100 Subject: [PATCH 110/173] feat: add primary color to navigation buttons in ApplicationTabView --- .../ui-dashboard/application/ApplicationTabView.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/packages/ce/src/ui-dashboard/application/ApplicationTabView.tsx b/src/packages/ce/src/ui-dashboard/application/ApplicationTabView.tsx index 7f9c395b..7e92c73a 100644 --- a/src/packages/ce/src/ui-dashboard/application/ApplicationTabView.tsx +++ b/src/packages/ce/src/ui-dashboard/application/ApplicationTabView.tsx @@ -33,17 +33,17 @@ export const ApplicationTabView: React.FC = () => { return currentUser && currentUser.admin ? ( <> - - - @@ -55,12 +55,12 @@ export const ApplicationTabView: React.FC = () => { return - - From 0ce41e07324462c3f49160d0475979cf563e785f Mon Sep 17 00:00:00 2001 From: nicosammito Date: Thu, 12 Feb 2026 22:47:22 +0100 Subject: [PATCH 111/173] refactor: move PersonalProjectsView to project directory and update imports; enhance with data table, filtering, and sorting --- .../application/ApplicationPage.tsx | 2 +- .../personal-project/PersonalProjectsView.tsx | 59 -------- .../project/PersonalProjectsView.tsx | 134 ++++++++++++++++++ .../src/ui-dashboard/project/ProjectsView.tsx | 18 +-- 4 files changed, 137 insertions(+), 76 deletions(-) delete mode 100644 src/packages/ce/src/ui-dashboard/personal-project/PersonalProjectsView.tsx create mode 100644 src/packages/ce/src/ui-dashboard/project/PersonalProjectsView.tsx diff --git a/src/packages/ce/src/ui-dashboard/application/ApplicationPage.tsx b/src/packages/ce/src/ui-dashboard/application/ApplicationPage.tsx index 4995b04a..5a758080 100644 --- a/src/packages/ce/src/ui-dashboard/application/ApplicationPage.tsx +++ b/src/packages/ce/src/ui-dashboard/application/ApplicationPage.tsx @@ -1,4 +1,4 @@ -import {PersonalProjectsView} from "@edition/ui-dashboard/personal-project/PersonalProjectsView"; +import {PersonalProjectsView} from "@edition/ui-dashboard/project/PersonalProjectsView"; import {OrganizationsView} from "@edition/ui-dashboard/organization/OrganizationsView"; import {Spacing} from "@code0-tech/pictor"; diff --git a/src/packages/ce/src/ui-dashboard/personal-project/PersonalProjectsView.tsx b/src/packages/ce/src/ui-dashboard/personal-project/PersonalProjectsView.tsx deleted file mode 100644 index ed2cd32d..00000000 --- a/src/packages/ce/src/ui-dashboard/personal-project/PersonalProjectsView.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import React from "react"; -import { - Button, - DNamespaceProjectList, - Flex, - Spacing, - Text, - useService, - useStore, - useUserSession -} from "@code0-tech/pictor"; -import {UserService} from "@edition/user/User.service"; -import Link from "next/link"; -import {useRouter} from "next/navigation"; - -export const PersonalProjectsView: React.FC = () => { - - const router = useRouter() - const userSession = useUserSession() - const userStore = useStore(UserService) - const userService = useService(UserService) - - const currentUser = React.useMemo(() => userService.getById(userSession?.user?.id), [userStore, userSession]) - const namespaceId = currentUser?.namespace?.id - const namespaceIndex = namespaceId?.match(/Namespace\/(\d+)$/)?.[1] - - const projectsList = React.useMemo(() => { - if (!currentUser || !currentUser.namespace) return null - return { - const number = project.id?.match(/NamespaceProject\/(\d+)$/)?.[1] - router.push(`/namespace/${namespaceIndex}/project/${number}/flow`) - }} namespaceId={currentUser.namespace.id}/> - - }, [currentUser]) - - return <> - - - - - Personal projects - - - Projects created in your personal namespace. You can also create organization projects if you are a - member of any organization. - - - - - - - - - - {projectsList} - - - -} \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/project/PersonalProjectsView.tsx b/src/packages/ce/src/ui-dashboard/project/PersonalProjectsView.tsx new file mode 100644 index 00000000..7def2444 --- /dev/null +++ b/src/packages/ce/src/ui-dashboard/project/PersonalProjectsView.tsx @@ -0,0 +1,134 @@ +import React from "react"; +import { + Button, + DNamespaceProjectList, + Flex, Menu, MenuCheckboxItem, MenuContent, MenuPortal, MenuTrigger, + Spacing, + Text, + useService, + useStore, + useUserSession +} from "@code0-tech/pictor"; +import {UserService} from "@edition/user/User.service"; +import Link from "next/link"; +import {useRouter} from "next/navigation"; +import {ProjectDataTableComponent} from "@edition/ui-dashboard/project/ProjectDataTableComponent"; +import {DataTableFilterProps, DataTableSortProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; +import {ProjectDataTableFilterInputComponent} from "@edition/ui-dashboard/project/ProjectDataTableFilterInputComponent"; +import {ButtonGroup} from "@code0-tech/pictor/dist/components/button-group/ButtonGroup"; +import {IconMinus, IconSortAscending, IconSortDescending} from "@tabler/icons-react"; + +export const PersonalProjectsView: React.FC = () => { + + const router = useRouter() + const userSession = useUserSession() + const userStore = useStore(UserService) + const userService = useService(UserService) + + const currentUser = React.useMemo(() => userService.getById(userSession?.user?.id), [userStore, userSession]) + const namespaceId = currentUser?.namespace?.id + const namespaceIndex = namespaceId?.match(/Namespace\/(\d+)$/)?.[1] + + const [filter, setFilter] = React.useState({}) + const [sort, setSort] = React.useState({}) + + const projectsList = React.useMemo(() => { + if (!currentUser || !currentUser.namespace) return null + return { + const number = project?.id?.match(/NamespaceProject\/(\d+)$/)?.[1] + router.push(`/namespace/${namespaceId}/project/${number}/flow`) + }} namespaceId={currentUser.namespace.id}/> + + }, [currentUser]) + + return <> + + + + + Personal projects + + + Projects created in your personal namespace. You can also create organization projects if you are a + member of any organization. + + + + + + + + + + + + + { + if (sort["name"] === undefined) + setSort(prev => ({...prev, name: "asc"})) + else if (sort["name"] === "asc") + setSort(prev => ({...prev, name: "desc"})) + else + setSort(prev => ({...prev, name: undefined})) + + event.preventDefault() + event.stopPropagation() + }}> + {sort["name"] === undefined ? : sort["name"] === "asc" ? + : } + Name + + { + if (sort["createdAt"] === undefined) + setSort(prev => ({...prev, createdAt: "asc"})) + else if (sort["createdAt"] === "asc") + setSort(prev => ({...prev, createdAt: "desc"})) + else + setSort(prev => ({...prev, createdAt: undefined})) + + event.preventDefault() + event.stopPropagation() + }}> + {sort["createdAt"] === undefined ? + : sort["createdAt"] === "asc" ? + : } + Created At + + { + if (sort["updatedAt"] === undefined) + setSort(prev => ({...prev, updatedAt: "asc"})) + else if (sort["updatedAt"] === "asc") + setSort(prev => ({...prev, updatedAt: "desc"})) + else + setSort(prev => ({...prev, updatedAt: undefined})) + + event.preventDefault() + event.stopPropagation() + }}> + {sort["updatedAt"] === undefined ? + : sort["updatedAt"] === "asc" ? + : } + Updated At + + + + + + + +
+ setFilter(filter)}/> +
+ + {projectsList} + + + +} \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/project/ProjectsView.tsx b/src/packages/ce/src/ui-dashboard/project/ProjectsView.tsx index 0d2610e4..5dce0389 100644 --- a/src/packages/ce/src/ui-dashboard/project/ProjectsView.tsx +++ b/src/packages/ce/src/ui-dashboard/project/ProjectsView.tsx @@ -4,27 +4,21 @@ import React from "react"; import { Button, - DataTableFilterInput, - DataTableFilterSuggestionMenu, Flex, Menu, MenuCheckboxItem, MenuContent, - MenuItem, MenuPortal, MenuTrigger, Spacing, - Text, - useService, - useStore + Text } from "@code0-tech/pictor"; import Link from "next/link"; import {useParams, useRouter} from "next/navigation"; import {ProjectDataTableComponent} from "@edition/ui-dashboard/project/ProjectDataTableComponent"; import {DataTableFilterProps, DataTableSortProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; import {ButtonGroup} from "@code0-tech/pictor/dist/components/button-group/ButtonGroup"; -import {IconCheck, IconMinus, IconSortAscending, IconSortDescending} from "@tabler/icons-react"; -import {ProjectService} from "@edition/project/Project.service"; +import {IconMinus, IconSortAscending, IconSortDescending} from "@tabler/icons-react"; import {ProjectDataTableFilterInputComponent} from "@edition/ui-dashboard/project/ProjectDataTableFilterInputComponent"; //TODO: user abilities for project creation within namespace @@ -34,14 +28,6 @@ export const ProjectsView: React.FC = () => { const router = useRouter() const namespaceId = params.namespaceId as any as number - const projectService = useService(ProjectService) - const projectStore = useStore(ProjectService) - - const projects = React.useMemo( - () => projectService.values({namespaceId: `gid://sagittarius/Namespace/${namespaceId}`}), - [projectStore, namespaceId] - ) - const [filter, setFilter] = React.useState({}) const [sort, setSort] = React.useState({}) From b61b2e05a9fba40363e131a991329bb0f2a7cae0 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 13 Feb 2026 13:17:08 +0100 Subject: [PATCH 112/173] feat: add OrganizationDataTableComponent for displaying and filtering organizations --- .../OrganizationDataTableComponent.tsx | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableComponent.tsx diff --git a/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableComponent.tsx b/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableComponent.tsx new file mode 100644 index 00000000..3248a499 --- /dev/null +++ b/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableComponent.tsx @@ -0,0 +1,41 @@ +import React from "react"; +import {DataTable, DataTableColumn, Text, useService, useStore} from "@code0-tech/pictor"; +import {DataTableFilterProps, DataTableSortProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; +import {Organization} from "@code0-tech/sagittarius-graphql-types"; +import {OrganizationDataTableRowComponent} from "@edition/ui-dashboard/organization/OrganizationDataTableRowComponent"; +import {OrganizationService} from "@edition/organization/Organization.service"; + +export interface OrganizationDataTableComponentProps { + sort?: DataTableSortProps + filter?: DataTableFilterProps + preFilter?: (project: Organization, index: number) => boolean + onSelect?: (item: Organization | undefined) => void +} + +export const OrganizationDataTableComponent: React.FC = (props) => { + + const {sort, filter, preFilter = () => true, onSelect} = props + + const organizationService = useService(OrganizationService) + const organizationStore = useStore(OrganizationService) + + const organizations = React.useMemo( + () => organizationService.values(), + [organizationStore] + ) + + return + + No organization found. Create one to get started. + + } + onSelect={(item) => item && onSelect?.(item)} + data={organizations.map(p => p.json()).filter(preFilter)}> + {(organization, index) => { + return + }} + + +} \ No newline at end of file From aa9af19aaee3f6bfdc4e58100436c97843e9217e Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 13 Feb 2026 13:17:13 +0100 Subject: [PATCH 113/173] feat: add OrganizationDataTableFilterInputComponent for filtering organizations by name --- ...anizationDataTableFilterInputComponent.tsx | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableFilterInputComponent.tsx diff --git a/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableFilterInputComponent.tsx b/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableFilterInputComponent.tsx new file mode 100644 index 00000000..dca9b0bf --- /dev/null +++ b/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableFilterInputComponent.tsx @@ -0,0 +1,59 @@ +import React from "react"; +import { + DataTableFilterInput, + DataTableFilterSuggestionMenu, + MenuCheckboxItem, + useService, + useStore +} from "@code0-tech/pictor"; +import {IconCheck} from "@tabler/icons-react"; +import {DataTableFilterProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; +import {OrganizationService} from "@edition/organization/Organization.service"; + +export interface OrganizationDataTableFilterInputComponentProps { + onChange: (filter: DataTableFilterProps) => void +} + +export const OrganizationDataTableFilterInputComponent: React.FC = (props) => { + + const {onChange} = props + + const organizationService = useService(OrganizationService) + const organizationStore = useStore(OrganizationService) + + const organizations = React.useMemo( + () => organizationService.values(), + [organizationStore] + ) + + return { + + const split = currentValue.split(",").map(s => s.trim()).filter(Boolean) + + return + {organizations.map(organization => { + + const isChecked = split.includes(organization?.name!) + + return { + e.preventDefault(); + e.stopPropagation(); + const updated = isChecked + ? split.filter(name => name !== organization?.name) + : [...split, organization?.name]; + applySuggestion(updated.join(","), true); + }}> + {isChecked ? : } + {organization?.name} + + })} + + } + } + ]}/> +} \ No newline at end of file From 2b84c9ca2e2d0116d5b933c4a96b0681ccdcba90 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 13 Feb 2026 13:17:19 +0100 Subject: [PATCH 114/173] feat: add OrganizationDataTableRowComponent for displaying organization details and leave action --- .../OrganizationDataTableRowComponent.tsx | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableRowComponent.tsx diff --git a/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableRowComponent.tsx b/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableRowComponent.tsx new file mode 100644 index 00000000..c47ee02e --- /dev/null +++ b/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableRowComponent.tsx @@ -0,0 +1,109 @@ +import React from "react"; +import {Organization} from "@code0-tech/sagittarius-graphql-types"; +import { + Avatar, + Badge, + Button, + DataTableColumn, + DOrganizationView, + Flex, + Text, + useService, + useStore, + useUserSession +} from "@code0-tech/pictor"; +import {IconFolders, IconLogout, IconServer, IconUsers} from "@tabler/icons-react"; +import {OrganizationService} from "@edition/organization/Organization.service"; +import {NamespaceService} from "@edition/namespace/Namespace.service"; +import {MemberService} from "@edition/member/Member.service"; +import {UserService} from "@edition/user/User.service"; +import {hashToColor} from "@code0-tech/pictor/dist/components/d-flow/DFlow.util"; + +export interface OrganizationDataTableRowComponentProps { + organizationId: Organization['id'] + onLeave?: (organization: DOrganizationView) => void +} + +export const OrganizationDataTableRowComponent: React.FC = (props) => { + + const {organizationId, onLeave} = props + + const organizationService = useService(OrganizationService) + const organizationStore = useStore(OrganizationService) + const namespaceStore = useStore(NamespaceService) + const namespaceService = useService(NamespaceService) + const memberStore = useStore(MemberService) + const memberService = useService(MemberService) + const userService = useService(UserService) + const userStore = useStore(UserService) + + const currentSession = useUserSession() + + const currentUser = React.useMemo( + () => userService.getById(currentSession?.user?.id), + [userStore, currentSession] + ) + + const organization = React.useMemo( + () => organizationService.getById(organizationId), + [organizationStore, organizationId] + ) + + const namespace = React.useMemo( + () => organization ? namespaceService.getById(organization.namespace?.id) : null, + [namespaceStore, organization] + ) + + const namespaceMember = React.useMemo( + () => namespace && currentUser ? memberService.getByNamespaceIdAndUserId(namespace.id, currentUser.id) : null, + [memberStore, namespace, currentUser] + ) + + return <> + + + + + + {organization?.name} + + + + + + + {namespace?.projects?.count ?? 0} + + + + + + {namespace?.members?.count ?? 0} + + + + + + {namespace?.runtimes?.count ?? 0} + + + + Updated at {organization?.updatedAt} + + + + + + {onLeave && namespaceMember && namespaceMember.userAbilities?.deleteMember ? ( + + ) : null} + + +} \ No newline at end of file From 5baa8f951ada0bfb7424cad56130c79589552754 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 13 Feb 2026 13:17:25 +0100 Subject: [PATCH 115/173] feat: integrate OrganizationDataTableComponent and filter input into OrganizationsView; add filtering and sorting support --- .../organization/OrganizationsView.tsx | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/packages/ce/src/ui-dashboard/organization/OrganizationsView.tsx b/src/packages/ce/src/ui-dashboard/organization/OrganizationsView.tsx index 98b7f292..7194f971 100644 --- a/src/packages/ce/src/ui-dashboard/organization/OrganizationsView.tsx +++ b/src/packages/ce/src/ui-dashboard/organization/OrganizationsView.tsx @@ -1,15 +1,22 @@ "use client" -import {Button, DOrganizationList, Flex, Spacing, Text, TextInput} from "@code0-tech/pictor"; -import {IconSearch} from "@tabler/icons-react"; +import {Button, Flex, Spacing, Text} from "@code0-tech/pictor"; import Link from "next/link"; import React from "react"; import {useRouter} from "next/navigation"; +import {OrganizationDataTableComponent} from "@edition/ui-dashboard/organization/OrganizationDataTableComponent"; +import { + OrganizationDataTableFilterInputComponent +} from "@edition/ui-dashboard/organization/OrganizationDataTableFilterInputComponent"; +import {DataTableFilterProps, DataTableSortProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; export const OrganizationsView = () => { const router = useRouter() + const [filter, setFilter] = React.useState({}) + const [sort, setSort] = React.useState({}) + return <> @@ -27,9 +34,13 @@ export const OrganizationsView = () => { +
+ setFilter(filter)}/> +
+ {/**TODO: use namespaceId*/} - { - const number = organization.namespace?.id?.match(/Namespace\/(\d+)$/)?.[1] + { + const number = organization?.namespace?.id?.match(/Namespace\/(\d+)$/)?.[1] router.push(`/namespace/${number}`) }}/> From 2a6c2380e6c247ae08617fb1a7cbae22c5129de1 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 13 Feb 2026 13:17:29 +0100 Subject: [PATCH 116/173] feat: add filtering and sorting support to PersonalProjectsView data table; fix project navigation route --- .../ce/src/ui-dashboard/project/PersonalProjectsView.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/packages/ce/src/ui-dashboard/project/PersonalProjectsView.tsx b/src/packages/ce/src/ui-dashboard/project/PersonalProjectsView.tsx index 7def2444..f9181b23 100644 --- a/src/packages/ce/src/ui-dashboard/project/PersonalProjectsView.tsx +++ b/src/packages/ce/src/ui-dashboard/project/PersonalProjectsView.tsx @@ -34,12 +34,12 @@ export const PersonalProjectsView: React.FC = () => { const projectsList = React.useMemo(() => { if (!currentUser || !currentUser.namespace) return null - return { + return { const number = project?.id?.match(/NamespaceProject\/(\d+)$/)?.[1] - router.push(`/namespace/${namespaceId}/project/${number}/flow`) + router.push(`/namespace/${namespaceIndex}/project/${number}/flow`) }} namespaceId={currentUser.namespace.id}/> - }, [currentUser]) + }, [currentUser, filter, sort]) return <> From 213fea52f624b3b46c1bd3faef09c63870bb01a0 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 13 Feb 2026 13:17:35 +0100 Subject: [PATCH 117/173] fix: update ProjectDataTableFilterInputComponent to include runtimeStore in useMemo dependencies --- .../project/ProjectDataTableFilterInputComponent.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/packages/ce/src/ui-dashboard/project/ProjectDataTableFilterInputComponent.tsx b/src/packages/ce/src/ui-dashboard/project/ProjectDataTableFilterInputComponent.tsx index 2dc36c91..1af1e930 100644 --- a/src/packages/ce/src/ui-dashboard/project/ProjectDataTableFilterInputComponent.tsx +++ b/src/packages/ce/src/ui-dashboard/project/ProjectDataTableFilterInputComponent.tsx @@ -36,7 +36,7 @@ export const ProjectDataTableFilterInputComponent: React.FC p.primaryRuntime?.id) return runtimeIds.map(id => runtimeService.getById(id)).filter(Boolean) }, - [projects] + [projects, runtimeStore] ) return Date: Fri, 13 Feb 2026 13:17:40 +0100 Subject: [PATCH 118/173] feat: update ProjectDataTableRowComponent layout; add color to Avatar using hashToColor --- .../project/ProjectDataTableRowComponent.tsx | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/packages/ce/src/ui-dashboard/project/ProjectDataTableRowComponent.tsx b/src/packages/ce/src/ui-dashboard/project/ProjectDataTableRowComponent.tsx index f3219438..b6a0d742 100644 --- a/src/packages/ce/src/ui-dashboard/project/ProjectDataTableRowComponent.tsx +++ b/src/packages/ce/src/ui-dashboard/project/ProjectDataTableRowComponent.tsx @@ -4,6 +4,7 @@ import {Avatar, Badge, DataTableColumn, Flex, Text, useService, useStore} from " import {ProjectService} from "@edition/project/Project.service"; import {RuntimeService} from "@edition/runtime/Runtime.service"; import {IconBinaryTree, IconServer} from "@tabler/icons-react"; +import {hashToColor} from "@code0-tech/pictor/dist/components/d-flow/DFlow.util"; export interface ProjectDataTableRowComponentProps { projectId: NamespaceProject['id'] @@ -39,17 +40,20 @@ export const ProjectDataTableRowComponent: React.FC - - - - - {project?.name} + + + + + + {project?.name} + + + + {project?.description} - - {project?.description} - { primaryRuntime && ( From 2cbcabcfcda44011a69d50ff55b4ff69322139a3 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 13 Feb 2026 15:28:14 +0100 Subject: [PATCH 119/173] feat: include username field in Member fragments for user data --- .../ce/src/member/fragments/Member.basic.fragment.graphql | 1 + src/packages/ce/src/member/fragments/Member.fragment.graphql | 1 + 2 files changed, 2 insertions(+) diff --git a/src/packages/ce/src/member/fragments/Member.basic.fragment.graphql b/src/packages/ce/src/member/fragments/Member.basic.fragment.graphql index e5643d88..9aac08c0 100644 --- a/src/packages/ce/src/member/fragments/Member.basic.fragment.graphql +++ b/src/packages/ce/src/member/fragments/Member.basic.fragment.graphql @@ -7,6 +7,7 @@ fragment BasicMember on NamespaceMember { } user { ...UserId + username } namespace { ...NamespaceId diff --git a/src/packages/ce/src/member/fragments/Member.fragment.graphql b/src/packages/ce/src/member/fragments/Member.fragment.graphql index 2ff63a7d..bb28706e 100644 --- a/src/packages/ce/src/member/fragments/Member.fragment.graphql +++ b/src/packages/ce/src/member/fragments/Member.fragment.graphql @@ -16,6 +16,7 @@ fragment Member on NamespaceMember { } user { ...UserId + username } namespace { ...NamespaceId From dc8257c6ec7010c1ea931fdffa65337d7c55a0c2 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 13 Feb 2026 15:28:22 +0100 Subject: [PATCH 120/173] feat: add date-fns dependency for date utilities --- package-lock.json | 11 +++++++++++ package.json | 1 + 2 files changed, 12 insertions(+) diff --git a/package-lock.json b/package-lock.json index 7d22a91c..84155abd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "@apollo/client": "^4.0.9", "@code0-tech/pictor": "^0.0.0-mvp.41", + "date-fns": "^4.1.0", "graphql": "^16.12.0", "graphql-tag": "^2.12.6", "next": "16.0.7", @@ -4573,6 +4574,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", diff --git a/package.json b/package.json index 5b1a34f2..22b93344 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "dependencies": { "@apollo/client": "^4.0.9", "@code0-tech/pictor": "^0.0.0-mvp.41", + "date-fns": "^4.1.0", "graphql": "^16.12.0", "graphql-tag": "^2.12.6", "next": "16.0.7", From fffdaa9a2a21afe7f45b2f77483ac7194b6f18f9 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 13 Feb 2026 15:28:34 +0100 Subject: [PATCH 121/173] feat: enrich OrganizationDataTableComponent with organization members data via MemberService --- .../OrganizationDataTableComponent.tsx | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableComponent.tsx b/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableComponent.tsx index 3248a499..8927cf98 100644 --- a/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableComponent.tsx +++ b/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableComponent.tsx @@ -4,6 +4,7 @@ import {DataTableFilterProps, DataTableSortProps} from "@code0-tech/pictor/dist/ import {Organization} from "@code0-tech/sagittarius-graphql-types"; import {OrganizationDataTableRowComponent} from "@edition/ui-dashboard/organization/OrganizationDataTableRowComponent"; import {OrganizationService} from "@edition/organization/Organization.service"; +import {MemberService} from "@edition/member/Member.service"; export interface OrganizationDataTableComponentProps { sort?: DataTableSortProps @@ -18,12 +19,33 @@ export const OrganizationDataTableComponent: React.FC organizationService.values(), [organizationStore] ) + const data = React.useMemo( + () => organizations.map( + o => o.json() + ).filter(preFilter).map(o => { + const members = memberService.values({namespaceId: o.namespace?.id}) + const organization: Organization = { + ...o, + namespace: { + ...o.namespace, + members: { + nodes: members.map(m => m.json()), + } + } + } + return organization + }), + [organizations, memberStore, preFilter] + ) + return @@ -32,7 +54,7 @@ export const OrganizationDataTableComponent: React.FC } onSelect={(item) => item && onSelect?.(item)} - data={organizations.map(p => p.json()).filter(preFilter)}> + data={data}> {(organization, index) => { return }} From a7626d23f1c6a4f847b06b981f4fd313c71b1d70 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 13 Feb 2026 15:28:44 +0100 Subject: [PATCH 122/173] feat: add member filter to OrganizationDataTableFilterInputComponent using MemberService --- ...anizationDataTableFilterInputComponent.tsx | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableFilterInputComponent.tsx b/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableFilterInputComponent.tsx index dca9b0bf..1241d26f 100644 --- a/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableFilterInputComponent.tsx +++ b/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableFilterInputComponent.tsx @@ -9,6 +9,8 @@ import { import {IconCheck} from "@tabler/icons-react"; import {DataTableFilterProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; import {OrganizationService} from "@edition/organization/Organization.service"; +import {NamespaceService} from "@edition/namespace/Namespace.service"; +import {MemberService} from "@edition/member/Member.service"; export interface OrganizationDataTableFilterInputComponentProps { onChange: (filter: DataTableFilterProps) => void @@ -20,12 +22,30 @@ export const OrganizationDataTableFilterInputComponent: React.FC organizationService.values(), [organizationStore] ) + const namespaces = React.useMemo( + () => organizations.map( + organization => namespaceService.getById(organization?.namespace?.id) + ), + [namespaceStore, organizations] + ) + + const members = React.useMemo( + () => namespaces.map( + namespace => memberService.values({namespaceId: namespace?.id}) + ).flat(), + [namespaces, memberStore, organizations] + ) + return } + }, { + token: "Member", + key: "namespace.members.nodes.user.username", + operators: ["isOneOf"], + suggestion: (context, operator, currentValue, applySuggestion) => { + + const split = currentValue.split(",").map(s => s.trim()).filter(Boolean) + + return + {members.map(member => { + + const isChecked = split.includes(member?.user?.username!) + + return { + e.preventDefault(); + e.stopPropagation(); + const updated = isChecked + ? split.filter(name => name !== member?.user?.username) + : [...split, member?.user?.username]; + applySuggestion(updated.join(","), true); + }}> + {isChecked ? : } + {member?.user?.username} + + })} + + } } ]}/> } \ No newline at end of file From 2800e42553b335602bf872fa7a2b6a4cc2120730 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 13 Feb 2026 15:28:50 +0100 Subject: [PATCH 123/173] feat: display organization members and relative update time in OrganizationDataTableRowComponent --- .../OrganizationDataTableRowComponent.tsx | 82 +++++++++++-------- 1 file changed, 49 insertions(+), 33 deletions(-) diff --git a/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableRowComponent.tsx b/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableRowComponent.tsx index c47ee02e..592ef63b 100644 --- a/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableRowComponent.tsx +++ b/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableRowComponent.tsx @@ -12,12 +12,13 @@ import { useStore, useUserSession } from "@code0-tech/pictor"; -import {IconFolders, IconLogout, IconServer, IconUsers} from "@tabler/icons-react"; +import {IconLogout} from "@tabler/icons-react"; import {OrganizationService} from "@edition/organization/Organization.service"; import {NamespaceService} from "@edition/namespace/Namespace.service"; import {MemberService} from "@edition/member/Member.service"; import {UserService} from "@edition/user/User.service"; import {hashToColor} from "@code0-tech/pictor/dist/components/d-flow/DFlow.util"; +import {formatDistanceToNow} from "date-fns"; export interface OrganizationDataTableRowComponentProps { organizationId: Organization['id'] @@ -32,8 +33,8 @@ export const OrganizationDataTableRowComponent: React.FC memberService.values({namespaceId: namespace?.id}), + [memberStore, userStore, namespace] + ) + return <> + + + + + + + {organization?.name} + + + + {namespaceMembers.map(member => { + return + + + @{member.user?.username} + + + })} + + + + Updated {formatDistanceToNow(organization?.updatedAt!)} ago + + + - - - {organization?.name} + + {namespace?.projects?.count ?? 0} {" "} + projects - - - - - - {namespace?.projects?.count ?? 0} - - - - - - {namespace?.members?.count ?? 0} - - - - - - {namespace?.runtimes?.count ?? 0} - - - - Updated at {organization?.updatedAt} + + {namespace?.members?.count ?? 0}{" "} + members + + + {namespace?.runtimes?.count ?? 0}{" "} + connected runtimes - - {onLeave && namespaceMember && namespaceMember.userAbilities?.deleteMember ? ( + {onLeave && namespaceMember && namespaceMember.userAbilities?.deleteMember ? ( + - ) : null} - + + ) : null} } \ No newline at end of file From c0b9b8ae0021a2b0e7c1d14dfa01797134dacf35 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 13 Feb 2026 15:28:56 +0100 Subject: [PATCH 124/173] feat: add sortable menu for organizations by name, createdAt, and updatedAt in OrganizationsView --- .../organization/OrganizationsView.tsx | 80 ++++++++++++++++++- 1 file changed, 77 insertions(+), 3 deletions(-) diff --git a/src/packages/ce/src/ui-dashboard/organization/OrganizationsView.tsx b/src/packages/ce/src/ui-dashboard/organization/OrganizationsView.tsx index 7194f971..881ecede 100644 --- a/src/packages/ce/src/ui-dashboard/organization/OrganizationsView.tsx +++ b/src/packages/ce/src/ui-dashboard/organization/OrganizationsView.tsx @@ -1,6 +1,16 @@ "use client" -import {Button, Flex, Spacing, Text} from "@code0-tech/pictor"; +import { + Button, + Flex, + Menu, + MenuCheckboxItem, + MenuContent, + MenuPortal, + MenuTrigger, + Spacing, + Text +} from "@code0-tech/pictor"; import Link from "next/link"; import React from "react"; import {useRouter} from "next/navigation"; @@ -9,6 +19,8 @@ import { OrganizationDataTableFilterInputComponent } from "@edition/ui-dashboard/organization/OrganizationDataTableFilterInputComponent"; import {DataTableFilterProps, DataTableSortProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; +import {ButtonGroup} from "@code0-tech/pictor/dist/components/button-group/ButtonGroup"; +import {IconMinus, IconSortAscending, IconSortDescending} from "@tabler/icons-react"; export const OrganizationsView = () => { @@ -27,11 +39,73 @@ export const OrganizationsView = () => { Manage organizations that you belong to. You can create new organizations and switch between them. - + - + + + + + + + { + if (sort["name"] === undefined) + setSort(prev => ({...prev, name: "asc"})) + else if (sort["name"] === "asc") + setSort(prev => ({...prev, name: "desc"})) + else + setSort(prev => ({...prev, name: undefined})) + + event.preventDefault() + event.stopPropagation() + }}> + {sort["name"] === undefined ? : sort["name"] === "asc" ? + : } + Name + + { + if (sort["createdAt"] === undefined) + setSort(prev => ({...prev, createdAt: "asc"})) + else if (sort["createdAt"] === "asc") + setSort(prev => ({...prev, createdAt: "desc"})) + else + setSort(prev => ({...prev, createdAt: undefined})) + + event.preventDefault() + event.stopPropagation() + }}> + {sort["createdAt"] === undefined ? + : sort["createdAt"] === "asc" ? + : } + Created At + + { + if (sort["updatedAt"] === undefined) + setSort(prev => ({...prev, updatedAt: "asc"})) + else if (sort["updatedAt"] === "asc") + setSort(prev => ({...prev, updatedAt: "desc"})) + else + setSort(prev => ({...prev, updatedAt: undefined})) + + event.preventDefault() + event.stopPropagation() + }}> + {sort["updatedAt"] === undefined ? + : sort["updatedAt"] === "asc" ? + : } + Updated At + + + + +
From 27f58e60ae40eb2341ec7ea91abb1aa2e0761025 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 13 Feb 2026 15:29:02 +0100 Subject: [PATCH 125/173] feat: display relative update time and summarize flows and runtimes in ProjectDataTableRowComponent --- .../project/ProjectDataTableRowComponent.tsx | 47 +++++++------------ 1 file changed, 18 insertions(+), 29 deletions(-) diff --git a/src/packages/ce/src/ui-dashboard/project/ProjectDataTableRowComponent.tsx b/src/packages/ce/src/ui-dashboard/project/ProjectDataTableRowComponent.tsx index b6a0d742..30eead08 100644 --- a/src/packages/ce/src/ui-dashboard/project/ProjectDataTableRowComponent.tsx +++ b/src/packages/ce/src/ui-dashboard/project/ProjectDataTableRowComponent.tsx @@ -5,6 +5,7 @@ import {ProjectService} from "@edition/project/Project.service"; import {RuntimeService} from "@edition/runtime/Runtime.service"; import {IconBinaryTree, IconServer} from "@tabler/icons-react"; import {hashToColor} from "@code0-tech/pictor/dist/components/d-flow/DFlow.util"; +import {formatDistanceToNow} from "date-fns"; export interface ProjectDataTableRowComponentProps { projectId: NamespaceProject['id'] @@ -46,41 +47,29 @@ export const ProjectDataTableRowComponent: React.FC - + {project?.name} - + {project?.description} - - { - primaryRuntime && ( - - - - {primaryRuntime?.name} - - - ) - } - - - - {project?.runtimes?.count ?? 0} - - - - - - {project?.flows?.count ?? 0} - - - - Updated at {project?.updatedAt} - - + + Updated {formatDistanceToNow(project?.updatedAt!)} ago + + + + + + + {project?.flows?.count ?? 0}{" "} + flows + + + {project?.runtimes?.count ?? 0}{" "} + assigned runtimes + From 60c1a7c14ed9b83f584db7239b31e05f521e8cfc Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 13 Feb 2026 18:47:50 +0100 Subject: [PATCH 126/173] feat: enhance ApplicationPage with user greeting, avatar, and improved layout using Card and ScrollArea components --- .../application/ApplicationPage.tsx | 62 +++++++++++++++++-- 1 file changed, 58 insertions(+), 4 deletions(-) diff --git a/src/packages/ce/src/ui-dashboard/application/ApplicationPage.tsx b/src/packages/ce/src/ui-dashboard/application/ApplicationPage.tsx index 5a758080..a31f94f0 100644 --- a/src/packages/ce/src/ui-dashboard/application/ApplicationPage.tsx +++ b/src/packages/ce/src/ui-dashboard/application/ApplicationPage.tsx @@ -1,9 +1,29 @@ import {PersonalProjectsView} from "@edition/ui-dashboard/project/PersonalProjectsView"; import {OrganizationsView} from "@edition/ui-dashboard/organization/OrganizationsView"; -import {Spacing} from "@code0-tech/pictor"; +import { + Avatar, + Badge, + Card, + Flex, + ScrollArea, ScrollAreaScrollbar, ScrollAreaThumb, ScrollAreaViewport, + Spacing, + Text, + useService, + useStore, + useUserSession +} from "@code0-tech/pictor"; +import {UserService} from "@edition/user/User.service"; +import React from "react"; +import {hashToColor} from "@code0-tech/pictor/dist/components/d-flow/DFlow.util"; export const ApplicationPage = () => { + const userStore = useStore(UserService) + const userService = useService(UserService) + + const userSession = useUserSession() + const currentUser = React.useMemo(() => userService.getById(userSession?.user?.id), [userStore, userSession]) + return
{ borderTopLeftRadius: "1rem", borderTopRightRadius: "1rem" }}> + + + + +
+ + + 👋 + +
+
+ Welcome back! + + Hi, @{currentUser?.username ?? "user"} + +
+ +
+ + + + + + + + + + +
+ + + +
- - -
From 13f4236bf24e4a28c2c6259ef1612634c90ab110 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 13 Feb 2026 18:48:01 +0100 Subject: [PATCH 127/173] feat: simplify organization row layout and remove member badges in OrganizationDataTableRowComponent --- .../OrganizationDataTableRowComponent.tsx | 23 +++++-------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableRowComponent.tsx b/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableRowComponent.tsx index 592ef63b..8d943d98 100644 --- a/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableRowComponent.tsx +++ b/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableRowComponent.tsx @@ -2,7 +2,6 @@ import React from "react"; import {Organization} from "@code0-tech/sagittarius-graphql-types"; import { Avatar, - Badge, Button, DataTableColumn, DOrganizationView, @@ -67,26 +66,16 @@ export const OrganizationDataTableRowComponent: React.FC - - - - + + + + {organization?.name} - - {namespaceMembers.map(member => { - return - - - @{member.user?.username} - - - })} - Updated {formatDistanceToNow(organization?.updatedAt!)} ago From 7d90414a93fe41fa46587e308ae18d1f07aca07e Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 13 Feb 2026 18:48:07 +0100 Subject: [PATCH 128/173] feat: adjust OrganizationsView layout with consistent gap spacing in Flex components --- .../ce/src/ui-dashboard/organization/OrganizationsView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/packages/ce/src/ui-dashboard/organization/OrganizationsView.tsx b/src/packages/ce/src/ui-dashboard/organization/OrganizationsView.tsx index 881ecede..931eb107 100644 --- a/src/packages/ce/src/ui-dashboard/organization/OrganizationsView.tsx +++ b/src/packages/ce/src/ui-dashboard/organization/OrganizationsView.tsx @@ -30,7 +30,7 @@ export const OrganizationsView = () => { const [sort, setSort] = React.useState({}) return <> - + Organizations From 9d09cb000c31715ba42567f56398ff58a89ac129 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 13 Feb 2026 18:48:11 +0100 Subject: [PATCH 129/173] feat: update PersonalProjectsView layout with consistent gap spacing in Flex components --- .../src/ui-dashboard/project/PersonalProjectsView.tsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/packages/ce/src/ui-dashboard/project/PersonalProjectsView.tsx b/src/packages/ce/src/ui-dashboard/project/PersonalProjectsView.tsx index f9181b23..f0efad64 100644 --- a/src/packages/ce/src/ui-dashboard/project/PersonalProjectsView.tsx +++ b/src/packages/ce/src/ui-dashboard/project/PersonalProjectsView.tsx @@ -1,8 +1,12 @@ import React from "react"; import { Button, - DNamespaceProjectList, - Flex, Menu, MenuCheckboxItem, MenuContent, MenuPortal, MenuTrigger, + Flex, + Menu, + MenuCheckboxItem, + MenuContent, + MenuPortal, + MenuTrigger, Spacing, Text, useService, @@ -43,7 +47,7 @@ export const PersonalProjectsView: React.FC = () => { return <> - + Personal projects From 0cd52eff69e28fb0e6fe21bd374ad348c6b8b2c5 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 13 Feb 2026 18:48:15 +0100 Subject: [PATCH 130/173] feat: refine project row layout with improved spacing and avatar sizing in ProjectDataTableRowComponent --- .../project/ProjectDataTableRowComponent.tsx | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/packages/ce/src/ui-dashboard/project/ProjectDataTableRowComponent.tsx b/src/packages/ce/src/ui-dashboard/project/ProjectDataTableRowComponent.tsx index 30eead08..42426e4e 100644 --- a/src/packages/ce/src/ui-dashboard/project/ProjectDataTableRowComponent.tsx +++ b/src/packages/ce/src/ui-dashboard/project/ProjectDataTableRowComponent.tsx @@ -1,9 +1,8 @@ import React from "react"; import {NamespaceProject} from "@code0-tech/sagittarius-graphql-types"; -import {Avatar, Badge, DataTableColumn, Flex, Text, useService, useStore} from "@code0-tech/pictor"; +import {Avatar, DataTableColumn, Flex, Text, useService, useStore} from "@code0-tech/pictor"; import {ProjectService} from "@edition/project/Project.service"; import {RuntimeService} from "@edition/runtime/Runtime.service"; -import {IconBinaryTree, IconServer} from "@tabler/icons-react"; import {hashToColor} from "@code0-tech/pictor/dist/components/d-flow/DFlow.util"; import {formatDistanceToNow} from "date-fns"; @@ -41,19 +40,19 @@ export const ProjectDataTableRowComponent: React.FC - - - - + + + + {project?.name} + + {project?.description} + - - {project?.description} - Updated {formatDistanceToNow(project?.updatedAt!)} ago From abf4c9aacf6a5342f9dd2ed0c79803a884b781f8 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 13 Feb 2026 18:48:20 +0100 Subject: [PATCH 131/173] feat: update ProjectsView layout with consistent gap spacing in Flex components --- src/packages/ce/src/ui-dashboard/project/ProjectsView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/packages/ce/src/ui-dashboard/project/ProjectsView.tsx b/src/packages/ce/src/ui-dashboard/project/ProjectsView.tsx index 5dce0389..02be7da7 100644 --- a/src/packages/ce/src/ui-dashboard/project/ProjectsView.tsx +++ b/src/packages/ce/src/ui-dashboard/project/ProjectsView.tsx @@ -43,7 +43,7 @@ export const ProjectsView: React.FC = () => { return <> - + Projects From da3c7bb382844f37feb710bc8c02db12ed91ff58 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 13 Feb 2026 19:33:08 +0100 Subject: [PATCH 132/173] feat: update empty state message in ProjectDataTableComponent to reference roles instead of projects --- .../ce/src/ui-dashboard/project/ProjectDataTableComponent.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/packages/ce/src/ui-dashboard/project/ProjectDataTableComponent.tsx b/src/packages/ce/src/ui-dashboard/project/ProjectDataTableComponent.tsx index 233786fe..5a578613 100644 --- a/src/packages/ce/src/ui-dashboard/project/ProjectDataTableComponent.tsx +++ b/src/packages/ce/src/ui-dashboard/project/ProjectDataTableComponent.tsx @@ -25,7 +25,7 @@ export const ProjectDataTableComponent: React.FC sort={sort} emptyComponent={ - No projects found. Create one to get started. + No role found. Create one to get started. } onSelect={(item) => item && onSelect?.(item)} From b39adb97f0bf2d2b5ff407d5501da6b64b97e663 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 13 Feb 2026 19:33:12 +0100 Subject: [PATCH 133/173] feat: enhance RolesView with sorting, filtering, and improved layout for role management --- .../ce/src/ui-dashboard/role/RolesView.tsx | 116 +++++++++++++++--- 1 file changed, 102 insertions(+), 14 deletions(-) diff --git a/src/packages/ce/src/ui-dashboard/role/RolesView.tsx b/src/packages/ce/src/ui-dashboard/role/RolesView.tsx index 7e8e881d..d6a0e4b5 100644 --- a/src/packages/ce/src/ui-dashboard/role/RolesView.tsx +++ b/src/packages/ce/src/ui-dashboard/role/RolesView.tsx @@ -2,38 +2,126 @@ import React from "react"; import {useParams, useRouter} from "next/navigation"; -import {Button, DNamespaceMemberList, DNamespaceRoleList, Flex, Spacing, Text, TextInput} from "@code0-tech/pictor"; -import {IconSearch} from "@tabler/icons-react"; +import { + Button, + Flex, + Menu, + MenuCheckboxItem, + MenuContent, + MenuPortal, + MenuTrigger, + Spacing, + Text +} from "@code0-tech/pictor"; +import {IconMinus, IconSortAscending, IconSortDescending} from "@tabler/icons-react"; import Link from "next/link"; +import {RoleDataTableComponent} from "@edition/ui-dashboard/role/RoleDataTableComponent"; +import {ButtonGroup} from "@code0-tech/pictor/dist/components/button-group/ButtonGroup"; +import {DataTableFilterProps, DataTableSortProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; +import {RoleDataTableFilterInputComponent} from "@edition/ui-dashboard/role/RoleDataTableFilterInputComponent"; +//TODO: user abilities for add role within namespace export const RolesView: React.FC = () => { const params = useParams() const router = useRouter() const namespaceId = params.namespaceId as any as number + const [filter, setFilter] = React.useState({}) + const [sort, setSort] = React.useState({}) + const rolesList = React.useMemo(() => { - return { - const roleIndex = role.id?.match(/NamespaceRole\/(\d+)$/)?.[1] + return { + const roleIndex = role?.id?.match(/NamespaceRole\/(\d+)$/)?.[1] router.push(`/namespace/${namespaceId}/roles/${roleIndex}/settings`) }} namespaceId={`gid://sagittarius/Namespace/${namespaceId}`}/> - }, [namespaceId]) - - //TODO: user abilities for add role within namespace + }, [namespaceId, filter, sort]) return <> - - - Roles - - + + + + Roles + + + Manage roles that you belong to. You can create new roles and switch between them. + + + - + - + + + + + + + { + if (sort["name"] === undefined) + setSort(prev => ({...prev, name: "asc"})) + else if (sort["name"] === "asc") + setSort(prev => ({...prev, name: "desc"})) + else + setSort(prev => ({...prev, name: undefined})) + + event.preventDefault() + event.stopPropagation() + }}> + {sort["name"] === undefined ? : sort["name"] === "asc" ? + : } + Name + + { + if (sort["createdAt"] === undefined) + setSort(prev => ({...prev, createdAt: "asc"})) + else if (sort["createdAt"] === "asc") + setSort(prev => ({...prev, createdAt: "desc"})) + else + setSort(prev => ({...prev, createdAt: undefined})) + + event.preventDefault() + event.stopPropagation() + }}> + {sort["createdAt"] === undefined ? + : sort["createdAt"] === "asc" ? + : } + Created At + + { + if (sort["updatedAt"] === undefined) + setSort(prev => ({...prev, updatedAt: "asc"})) + else if (sort["updatedAt"] === "asc") + setSort(prev => ({...prev, updatedAt: "desc"})) + else + setSort(prev => ({...prev, updatedAt: undefined})) + + event.preventDefault() + event.stopPropagation() + }}> + {sort["updatedAt"] === undefined ? + : sort["updatedAt"] === "asc" ? + : } + Updated At + + + + + +
+ setFilter(filter)}/> +
+ {rolesList} From 7ee62e8ef72dcca9c0d7c4ebba32ec22aeceeb5d Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 13 Feb 2026 19:33:16 +0100 Subject: [PATCH 134/173] feat: add RoleDataTable components for displaying, filtering, and rendering roles in dashboard --- .../role/RoleDataTableComponent.tsx | 44 +++++++++ .../RoleDataTableFilterInputComponent.tsx | 94 +++++++++++++++++++ .../role/RoleDataTableRowComponent.tsx | 50 ++++++++++ 3 files changed, 188 insertions(+) create mode 100644 src/packages/ce/src/ui-dashboard/role/RoleDataTableComponent.tsx create mode 100644 src/packages/ce/src/ui-dashboard/role/RoleDataTableFilterInputComponent.tsx create mode 100644 src/packages/ce/src/ui-dashboard/role/RoleDataTableRowComponent.tsx diff --git a/src/packages/ce/src/ui-dashboard/role/RoleDataTableComponent.tsx b/src/packages/ce/src/ui-dashboard/role/RoleDataTableComponent.tsx new file mode 100644 index 00000000..ef6466c3 --- /dev/null +++ b/src/packages/ce/src/ui-dashboard/role/RoleDataTableComponent.tsx @@ -0,0 +1,44 @@ +import React from "react"; +import {DataTable, DataTableColumn, Text, useService, useStore} from "@code0-tech/pictor"; +import {DataTableFilterProps, DataTableSortProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; +import {Namespace, NamespaceProject, NamespaceRole} from "@code0-tech/sagittarius-graphql-types"; +import {ProjectService} from "@edition/project/Project.service"; +import {ProjectDataTableRowComponent} from "@edition/ui-dashboard/project/ProjectDataTableRowComponent"; +import {RoleService} from "@edition/role/Role.service"; +import {RoleDataTableRowComponent} from "@edition/ui-dashboard/role/RoleDataTableRowComponent"; + +export interface ProjectDataTableComponentProps { + namespaceId: Namespace["id"] + sort?: DataTableSortProps + filter?: DataTableFilterProps + preFilter?: (project: NamespaceRole, index: number) => boolean + onSelect?: (item: NamespaceRole | undefined) => void +} + +export const RoleDataTableComponent: React.FC = (props) => { + + const {namespaceId, sort, filter, preFilter = () => true, onSelect} = props + + const roleService = useService(RoleService) + const roleStore = useStore(RoleService) + + const roles = React.useMemo( + () => roleService.values({namespaceId: namespaceId}), + [roleStore, namespaceId] + ) + + return + + No role found. Create one to get started. + +
} + onSelect={(item) => item && onSelect?.(item)} + data={roles.map(r => r.json()).filter(preFilter)}> + {(role, index) => { + return + }} + + +} \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/role/RoleDataTableFilterInputComponent.tsx b/src/packages/ce/src/ui-dashboard/role/RoleDataTableFilterInputComponent.tsx new file mode 100644 index 00000000..56a747bf --- /dev/null +++ b/src/packages/ce/src/ui-dashboard/role/RoleDataTableFilterInputComponent.tsx @@ -0,0 +1,94 @@ +import React from "react"; +import { + DataTableFilterInput, + DataTableFilterSuggestionMenu, + MenuCheckboxItem, + useService, + useStore +} from "@code0-tech/pictor"; +import {IconCheck} from "@tabler/icons-react"; +import {Namespace} from "@code0-tech/sagittarius-graphql-types"; +import {DataTableFilterProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; +import {RoleService} from "@edition/role/Role.service"; + +export interface RoleDataTableFilterInputComponentProps { + namespaceId: Namespace['id'] + onChange: (filter: DataTableFilterProps) => void +} + +export const RoleDataTableFilterInputComponent: React.FC = (props) => { + + const {namespaceId, onChange} = props + + const roleService = useService(RoleService) + const roleStore = useStore(RoleService) + + const roles = React.useMemo( + () => roleService.values({namespaceId: namespaceId}), + [roleStore, namespaceId] + ) + + const abilities = React.useMemo(() => { + const all = new Set() + roles.forEach(role => role.abilities?.forEach(ability => all.add(ability))) + return Array.from(all) + }, [roles]) + + return { + + const split = currentValue.split(",").map(s => s.trim()).filter(Boolean) + + return + {roles.map(role => { + + const isChecked = split.includes(role?.name!) + + return { + e.preventDefault(); + e.stopPropagation(); + const updated = isChecked + ? split.filter(name => name !== role?.name) + : [...split, role?.name]; + applySuggestion(updated.join(","), true); + }}> + {isChecked ? : } + {role?.name} + + })} + + } + }, { + token: "Permissions", + key: "abilities", + operators: ["isOneOf"], + suggestion: (context, operator, currentValue, applySuggestion) => { + + const split = currentValue.split(",").map(s => s.trim()).filter(Boolean) + + return + {abilities.map(ability => { + + const isChecked = split.includes(ability) + + return { + e.preventDefault(); + e.stopPropagation(); + const updated = isChecked + ? split.filter(name => name !== ability) + : [...split, ability]; + applySuggestion(updated.join(","), true); + }}> + {isChecked ? : } + {ability} + + })} + + } + } + ]}/> +} \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/role/RoleDataTableRowComponent.tsx b/src/packages/ce/src/ui-dashboard/role/RoleDataTableRowComponent.tsx new file mode 100644 index 00000000..6f486a84 --- /dev/null +++ b/src/packages/ce/src/ui-dashboard/role/RoleDataTableRowComponent.tsx @@ -0,0 +1,50 @@ +import React from "react"; +import {NamespaceProject, NamespaceRole} from "@code0-tech/sagittarius-graphql-types"; +import {Avatar, DataTableColumn, Flex, Text, useService, useStore} from "@code0-tech/pictor"; +import {ProjectService} from "@edition/project/Project.service"; +import {RuntimeService} from "@edition/runtime/Runtime.service"; +import {hashToColor} from "@code0-tech/pictor/dist/components/d-flow/DFlow.util"; +import {formatDistanceToNow} from "date-fns"; +import {RoleService} from "@edition/role/Role.service"; +import {DNamespaceRolePermissions} from "@code0-tech/pictor/dist/components/d-role/DNamespaceRolePermissions"; + +export interface ProjectDataTableRowComponentProps { + roleId: NamespaceRole['id'] +} + +export const RoleDataTableRowComponent: React.FC = (props) => { + + const {roleId} = props + + const roleService = useService(RoleService) + const roleStore = useStore(RoleService) + + const role = React.useMemo( + () => roleService.getById(roleId), + [roleStore, roleId] + ) + + return <> + + + + + {role?.name} + + + + + Updated {formatDistanceToNow(role?.updatedAt!)} ago + + + + + + + {role?.assignedProjects?.count ?? 0}{" "} + assigned projects + + + + +} \ No newline at end of file From 0561d34e68125d0e6205596b93f71bddb9f81bcb Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 13 Feb 2026 23:09:11 +0100 Subject: [PATCH 135/173] feat: add runtime data table components with filtering and row rendering for runtimes dashboard --- .../runtime/RuntimeDataTableComponent.tsx | 46 +++++++++ .../RuntimeDataTableFilterInputComponent.tsx | 94 +++++++++++++++++++ .../runtime/RuntimeDataTableRowComponent.tsx | 45 +++++++++ .../runtime/RuntimeSettingsPage.tsx | 6 +- .../src/ui-dashboard/runtime/RuntimesPage.tsx | 9 +- 5 files changed, 193 insertions(+), 7 deletions(-) create mode 100644 src/packages/ce/src/ui-dashboard/runtime/RuntimeDataTableComponent.tsx create mode 100644 src/packages/ce/src/ui-dashboard/runtime/RuntimeDataTableFilterInputComponent.tsx create mode 100644 src/packages/ce/src/ui-dashboard/runtime/RuntimeDataTableRowComponent.tsx diff --git a/src/packages/ce/src/ui-dashboard/runtime/RuntimeDataTableComponent.tsx b/src/packages/ce/src/ui-dashboard/runtime/RuntimeDataTableComponent.tsx new file mode 100644 index 00000000..29650602 --- /dev/null +++ b/src/packages/ce/src/ui-dashboard/runtime/RuntimeDataTableComponent.tsx @@ -0,0 +1,46 @@ +import React from "react"; +import {DataTable, DataTableColumn, Text, useService, useStore} from "@code0-tech/pictor"; +import {DataTableFilterProps, DataTableSortProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; +import {Namespace, NamespaceProject, NamespaceRole, Runtime} from "@code0-tech/sagittarius-graphql-types"; +import {ProjectService} from "@edition/project/Project.service"; +import {ProjectDataTableRowComponent} from "@edition/ui-dashboard/project/ProjectDataTableRowComponent"; +import {RoleService} from "@edition/role/Role.service"; +import {RoleDataTableRowComponent} from "@edition/ui-dashboard/role/RoleDataTableRowComponent"; +import {RuntimeService} from "@edition/runtime/Runtime.service"; +import {RuntimeDataTableRowComponent} from "@edition/ui-dashboard/runtime/RuntimeDataTableRowComponent"; + +export interface ProjectDataTableComponentProps { + namespaceId?: Namespace["id"] + sort?: DataTableSortProps + filter?: DataTableFilterProps + preFilter?: (project: Runtime, index: number) => boolean + onSelect?: (item: Runtime | undefined) => void +} + +export const RuntimeDataTableComponent: React.FC = (props) => { + + const {namespaceId, sort, filter, preFilter = () => true, onSelect} = props + + const runtimeService = useService(RuntimeService) + const runtimeStore = useStore(RuntimeService) + + const runtimes = React.useMemo( + () => runtimeService.values({namespaceId: namespaceId}), + [runtimeStore, namespaceId] + ) + + return + + No runtime found. Create one to get started. + +
} + onSelect={(item) => item && onSelect?.(item)} + data={runtimes.map(r => r.json()).filter(preFilter)}> + {(runtime, index) => { + return + }} + + +} \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/runtime/RuntimeDataTableFilterInputComponent.tsx b/src/packages/ce/src/ui-dashboard/runtime/RuntimeDataTableFilterInputComponent.tsx new file mode 100644 index 00000000..e6f62f9c --- /dev/null +++ b/src/packages/ce/src/ui-dashboard/runtime/RuntimeDataTableFilterInputComponent.tsx @@ -0,0 +1,94 @@ +import React from "react"; +import { + DataTableFilterInput, + DataTableFilterSuggestionMenu, + MenuCheckboxItem, + useService, + useStore +} from "@code0-tech/pictor"; +import {IconCheck} from "@tabler/icons-react"; +import {Namespace} from "@code0-tech/sagittarius-graphql-types"; +import {DataTableFilterProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; +import {RoleService} from "@edition/role/Role.service"; + +export interface RoleDataTableFilterInputComponentProps { + namespaceId?: Namespace['id'] + onChange: (filter: DataTableFilterProps) => void +} + +export const RuntimeDataTableFilterInputComponent: React.FC = (props) => { + + const {namespaceId, onChange} = props + + const roleService = useService(RoleService) + const roleStore = useStore(RoleService) + + const roles = React.useMemo( + () => roleService.values({namespaceId: namespaceId}), + [roleStore, namespaceId] + ) + + const abilities = React.useMemo(() => { + const all = new Set() + roles.forEach(role => role.abilities?.forEach(ability => all.add(ability))) + return Array.from(all) + }, [roles]) + + return { + + const split = currentValue.split(",").map(s => s.trim()).filter(Boolean) + + return + {roles.map(role => { + + const isChecked = split.includes(role?.name!) + + return { + e.preventDefault(); + e.stopPropagation(); + const updated = isChecked + ? split.filter(name => name !== role?.name) + : [...split, role?.name]; + applySuggestion(updated.join(","), true); + }}> + {isChecked ? : } + {role?.name} + + })} + + } + }, { + token: "Permissions", + key: "abilities", + operators: ["isOneOf"], + suggestion: (context, operator, currentValue, applySuggestion) => { + + const split = currentValue.split(",").map(s => s.trim()).filter(Boolean) + + return + {abilities.map(ability => { + + const isChecked = split.includes(ability) + + return { + e.preventDefault(); + e.stopPropagation(); + const updated = isChecked + ? split.filter(name => name !== ability) + : [...split, ability]; + applySuggestion(updated.join(","), true); + }}> + {isChecked ? : } + {ability} + + })} + + } + } + ]}/> +} \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/runtime/RuntimeDataTableRowComponent.tsx b/src/packages/ce/src/ui-dashboard/runtime/RuntimeDataTableRowComponent.tsx new file mode 100644 index 00000000..576ff09d --- /dev/null +++ b/src/packages/ce/src/ui-dashboard/runtime/RuntimeDataTableRowComponent.tsx @@ -0,0 +1,45 @@ +import React from "react"; +import {Runtime} from "@code0-tech/sagittarius-graphql-types"; +import {DataTableColumn, Flex, Text, useService, useStore, Badge} from "@code0-tech/pictor"; +import {RuntimeService} from "@edition/runtime/Runtime.service"; +import {formatDistanceToNow} from "date-fns"; + +export interface ProjectDataTableRowComponentProps { + runtimeId: Runtime['id'] +} + +export const RuntimeDataTableRowComponent: React.FC = (props) => { + + const {runtimeId} = props + + const runtimeService = useService(RuntimeService) + const runtimeStore = useStore(RuntimeService) + + const runtime = React.useMemo( + () => runtimeService.getById(runtimeId), + [runtimeStore, runtimeId] + ) + + return <> + + + + + {runtime?.name} + + + {runtime?.description} + + + + Updated {formatDistanceToNow(runtime?.updatedAt!)} ago + + + + + + {runtime?.status} + + + +} \ No newline at end of file diff --git a/src/packages/ce/src/ui-dashboard/runtime/RuntimeSettingsPage.tsx b/src/packages/ce/src/ui-dashboard/runtime/RuntimeSettingsPage.tsx index 2c029e18..66518366 100644 --- a/src/packages/ce/src/ui-dashboard/runtime/RuntimeSettingsPage.tsx +++ b/src/packages/ce/src/ui-dashboard/runtime/RuntimeSettingsPage.tsx @@ -134,7 +134,7 @@ export const RuntimeSettingsPage: React.FC = () => { @@ -144,7 +144,7 @@ export const RuntimeSettingsPage: React.FC = () => { @@ -204,7 +204,7 @@ export const RuntimeSettingsPage: React.FC = () => { - Delete runtime + Delete diff --git a/src/packages/ce/src/ui-dashboard/runtime/RuntimesPage.tsx b/src/packages/ce/src/ui-dashboard/runtime/RuntimesPage.tsx index f7da44d6..6d9d9001 100644 --- a/src/packages/ce/src/ui-dashboard/runtime/RuntimesPage.tsx +++ b/src/packages/ce/src/ui-dashboard/runtime/RuntimesPage.tsx @@ -5,6 +5,7 @@ import {Button, DRuntimeList, Flex, Spacing, Text, useService, useStore, useUser import Link from "next/link"; import {notFound, useParams, useRouter} from "next/navigation"; import {UserService} from "@edition/user/User.service"; +import {RuntimeDataTableComponent} from "@edition/ui-dashboard/runtime/RuntimeDataTableComponent"; export const RuntimesPage: React.FC = () => { @@ -39,14 +40,14 @@ export const RuntimesPage: React.FC = () => { - + - namespaceIndex ? true : !runtime?.namespace?.id} onSetting={(runtime) => { - const number = runtime.id?.match(/Runtime\/(\d+)$/)?.[1] + namespaceIndex ? true : !runtime?.namespace?.id} onSelect={(runtime) => { + const number = runtime?.id?.match(/Runtime\/(\d+)$/)?.[1] router.push(namespaceIndex ? `/namespace/${namespaceIndex}/runtimes/${number}/settings` : `/runtimes/${number}/settings`) }}/>
From afda8078d4a8fbdbf46ccde8225a18e8fc19d5e5 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Fri, 13 Feb 2026 23:15:50 +0100 Subject: [PATCH 136/173] feat: upgrade @code0-tech/pictor and related codemirror dependencies to latest versions --- package-lock.json | 24 ++++++++++++++---------- package.json | 2 +- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 84155abd..10765116 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0", "dependencies": { "@apollo/client": "^4.0.9", - "@code0-tech/pictor": "^0.0.0-mvp.41", + "@code0-tech/pictor": "^0.0.0-mvp.43", "date-fns": "^4.1.0", "graphql": "^16.12.0", "graphql-tag": "^2.12.6", @@ -363,14 +363,18 @@ } }, "node_modules/@code0-tech/pictor": { - "version": "0.0.0-mvp.41", - "resolved": "https://registry.npmjs.org/@code0-tech/pictor/-/pictor-0.0.0-mvp.41.tgz", - "integrity": "sha512-L0f8DhI+JTKSQ9DZihydCmHnvDZUW/dBDv5APz/eZDyd1GlL2wi8XjMwG+t4i2H8fimqFBWc0q0kyBUowsx11w==", + "version": "0.0.0-mvp.43", + "resolved": "https://registry.npmjs.org/@code0-tech/pictor/-/pictor-0.0.0-mvp.43.tgz", + "integrity": "sha512-l1ZdmiFW6EeTWzXKNewjnteW+8ttIzG+yjOruWBOgxWgDkJ0mSQYdTR766KuICSI89ubwkOfNuou5pSPfuw1XQ==", "peerDependencies": { "@ariakit/react": "^0.4.17", "@code0-tech/sagittarius-graphql-types": "0.0.0-703d578a55a3f0f20be3cb6892418f9e04d25716", "@codemirror/autocomplete": "^6.20.0", "@codemirror/lang-json": "^6.0.2", + "@codemirror/language": "^6.12.1", + "@codemirror/lint": "^6.9.4", + "@codemirror/state": "^6.5.4", + "@codemirror/view": "^6.39.13", "@monaco-editor/react": "^4.7.0", "@radix-ui/react-checkbox": "^1.3.3", "@radix-ui/react-context-menu": "^2.2.16", @@ -460,9 +464,9 @@ } }, "node_modules/@codemirror/lint": { - "version": "6.9.3", - "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.3.tgz", - "integrity": "sha512-y3YkYhdnhjDBAe0VIA0c4wVoFOvnp8CnAvfLqi0TqotIv92wIlAAP7HELOpLBsKwjAX6W92rSflA6an/2zBvXw==", + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.4.tgz", + "integrity": "sha512-ABc9vJ8DEmvOWuH26P3i8FpMWPQkduD9Rvba5iwb6O3hxASgclm3T3krGo8NASXkHCidz6b++LWlzWIUfEPSWw==", "license": "MIT", "peer": true, "dependencies": { @@ -507,9 +511,9 @@ } }, "node_modules/@codemirror/view": { - "version": "6.39.12", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.39.12.tgz", - "integrity": "sha512-f+/VsHVn/kOA9lltk/GFzuYwVVAKmOnNjxbrhkk3tPHntFqjWeI2TbIXx006YkBkqC10wZ4NsnWXCQiFPeAISQ==", + "version": "6.39.14", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.39.14.tgz", + "integrity": "sha512-WJcvgHm/6Q7dvGT0YFv/6PSkoc36QlR0VCESS6x9tGsnF1lWLmmYxOgX3HH6v8fo6AvSLgpcs+H0Olre6MKXlg==", "license": "MIT", "peer": true, "dependencies": { diff --git a/package.json b/package.json index 22b93344..e3008d19 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ }, "dependencies": { "@apollo/client": "^4.0.9", - "@code0-tech/pictor": "^0.0.0-mvp.41", + "@code0-tech/pictor": "^0.0.0-mvp.43", "date-fns": "^4.1.0", "graphql": "^16.12.0", "graphql-tag": "^2.12.6", From d9f5649b3dab5e43a09c7d557fdbe37e41e8d23e Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sat, 14 Feb 2026 00:27:46 +0100 Subject: [PATCH 137/173] refactor: restructure imports and file organization for services, fragments, and components - Move service files into dedicated 'services' directories across modules - Update import paths in components and pages to reflect new structure - Relocate fragments and GraphQL queries to 'services' subfolders and adjust import references - Rename and move UI components and views to align with new module organization - Update internal references in GraphQL fragment files to use new absolute import paths --- src/app/(auth)/email/page.tsx | 2 +- src/app/(auth)/layout.tsx | 2 +- src/app/(auth)/login/page.tsx | 2 +- src/app/(auth)/password/page.tsx | 2 +- src/app/(auth)/password/reset/page.tsx | 2 +- src/app/(auth)/register/page.tsx | 2 +- src/app/(dashboard)/@bar/default.tsx | 2 +- .../[namespaceId]/members/default.tsx | 2 +- .../@tab/namespace/[namespaceId]/page.tsx | 2 +- .../[namespaceId]/projects/default.tsx | 2 +- .../namespace/[namespaceId]/roles/default.tsx | 2 +- .../[namespaceId]/runtimes/default.tsx | 2 +- .../[namespaceId]/settings/default.tsx | 2 +- .../@tab/organizations/default.tsx | 2 +- src/app/(dashboard)/@tab/page.tsx | 2 +- src/app/(dashboard)/@tab/runtimes/default.tsx | 2 +- src/app/(dashboard)/@tab/settings/page.tsx | 2 +- src/app/(dashboard)/@tab/users/page.tsx | 2 +- src/app/(dashboard)/layout.tsx | 14 ++++++------ .../[namespaceId]/members/add/page.tsx | 2 +- .../namespace/[namespaceId]/members/page.tsx | 2 +- .../namespace/[namespaceId]/page.tsx | 2 +- .../[namespaceId]/projects/create/page.tsx | 2 +- .../namespace/[namespaceId]/projects/page.tsx | 2 +- .../roles/[roleId]/settings/page.tsx | 2 +- .../[namespaceId]/roles/create/page.tsx | 2 +- .../namespace/[namespaceId]/roles/page.tsx | 2 +- .../runtimes/[runtimeId]/settings/page.tsx | 2 +- .../[namespaceId]/runtimes/create/page.tsx | 2 +- .../namespace/[namespaceId]/runtimes/page.tsx | 2 +- .../namespace/[namespaceId]/settings/page.tsx | 2 +- .../(dashboard)/organizations/create/page.tsx | 2 +- src/app/(dashboard)/organizations/page.tsx | 2 +- src/app/(dashboard)/page.tsx | 2 +- .../runtimes/[runtimeId]/settings/page.tsx | 2 +- src/app/(dashboard)/runtimes/create/page.tsx | 2 +- src/app/(dashboard)/runtimes/page.tsx | 2 +- src/app/(dashboard)/settings/page.tsx | 2 +- src/app/(dashboard)/users/page.tsx | 2 +- src/app/(flow)/@bar/default.tsx | 2 +- src/app/(flow)/layout.tsx | 22 +++++++++---------- .../project/[projectId]/flow/layout.tsx | 2 +- .../project/[projectId]/settings/page.tsx | 2 +- .../application/ApplicationBarView.tsx | 4 ++-- .../application/ApplicationBreadcrumbView.tsx | 12 +++++----- .../application/ApplicationPage.tsx | 6 ++--- .../application/ApplicationSettingsPage.tsx | 2 +- .../application/ApplicationTabView.tsx | 6 ++--- .../{ => services}/Datatype.service.ts | 2 +- .../fragments/DataType.basic.fragment.graphql | 0 .../fragments/DataType.fragment.graphql | 2 +- .../fragments/DataTypeRule.fragment.graphql | 0 .../queries/DataTypes.query.graphql | 0 .../src/flow/{ => services}/Flow.service.ts | 8 +++---- .../fragments/Flow.basic.fragment.graphql | 0 .../fragments/Flow.fragment.graphql | 0 .../mutations/Flow.create.mutation.graphql | 0 .../mutations/Flow.delete.mutation.graphql | 0 .../mutations/Flow.update.mutation.graphql | 0 .../queries/Flows.query.graphql | 0 .../folder => flow/views}/FolderView.tsx | 2 +- .../{ => services}/FlowTypeService.ts | 2 +- .../fragments/FlowType.fragment.graphql | 6 ++--- .../queries/FlowTypes.query.graphql | 0 .../{ => services}/Function.service.ts | 2 +- .../DataTypeIdentifier.fragment.graphql | 0 .../fragments/Function.fragment.graphql | 0 .../queries/Functions.query.graphql | 0 .../member => member/pages}/MemberAddPage.tsx | 6 ++--- .../member => member/pages}/MembersPage.tsx | 2 +- .../member/{ => services}/Member.service.ts | 0 .../fragments/Member.basic.fragment.graphql | 4 ++-- .../fragments/Member.fragment.graphql | 4 ++-- .../Member.assignRoles.mutation.graphql | 0 .../mutations/Member.delete.mutation.graphql | 0 .../mutations/Member.invite.mutation.graphql | 0 .../queries/Members.query.graphql | 0 .../member => member/views}/MembersView.tsx | 2 +- .../pages}/NamespaceOverviewPage.tsx | 8 +++---- .../pages}/NamespaceProjectsCreatePage.tsx | 4 ++-- .../pages}/NamespaceProjectsPage.tsx | 2 +- .../{ => services}/Namespace.service.ts | 0 .../fragments/Namespace.fragment.graphql | 4 ++-- .../fragments/Namespace.id.fragment.graphql | 0 .../queries/Namespace.query.graphql | 0 .../views}/NamespaceOverviewLeftView.tsx | 4 ++-- .../views}/NamespaceOverviewRightView.tsx | 6 ++--- .../views}/NamespaceTabView.tsx | 12 +++++----- .../OrganizationDataTableComponent.tsx | 6 ++--- ...anizationDataTableFilterInputComponent.tsx | 6 ++--- .../OrganizationDataTableRowComponent.tsx | 8 +++---- .../pages}/OrganizationCreatePage.tsx | 2 +- .../pages}/OrganizationSettingsPage.tsx | 12 +++++----- .../pages}/OrganizationsPage.tsx | 2 +- .../{ => services}/Organization.service.ts | 0 .../fragments/Organization.fragment.graphql | 0 .../Organization.id.fragment.graphql | 0 .../Organization.create.mutation.graphql | 0 .../Organization.delete.mutation.graphql | 0 .../Organization.update.mutation.graphql | 0 .../queries/Organization.query.graphql | 0 .../views}/OrganizationDeleteView.tsx | 4 ++-- .../OrganizationGeneralSettingsView.tsx | 4 ++-- .../views}/OrganizationUpgradeView.tsx | 0 .../views}/OrganizationsView.tsx | 4 ++-- .../components}/ProjectDataTableComponent.tsx | 4 ++-- .../ProjectDataTableFilterInputComponent.tsx | 4 ++-- .../ProjectDataTableRowComponent.tsx | 4 ++-- .../pages}/ProjectSettingsPage.tsx | 6 ++--- .../project/{ => services}/Project.service.ts | 0 .../fragments/Project.basic.fragment.graphql | 2 +- .../fragments/Project.fragment.graphql | 2 +- .../fragments/Project.id.fragment.graphql | 0 .../Project.assignRuntimes.mutation.graphql | 0 .../mutations/Project.create.mutation.graphql | 0 .../mutations/Project.delete.mutation.graphql | 0 .../mutations/Project.update.mutation.graphql | 0 .../queries/Projects.query.graphql | 0 .../views}/PersonalProjectsView.tsx | 6 ++--- .../views}/ProjectSettingsDeleteView.tsx | 0 .../views}/ProjectSettingsGeneralView.tsx | 2 +- .../views}/ProjectSettingsRuntimesView.tsx | 4 ++-- .../views}/ProjectsView.tsx | 4 ++-- .../components}/RoleDataTableComponent.tsx | 8 +++---- .../RoleDataTableFilterInputComponent.tsx | 2 +- .../components}/RoleDataTableRowComponent.tsx | 6 ++--- .../role => role/pages}/RoleCreatePage.tsx | 2 +- .../role => role/pages}/RoleSettingsPage.tsx | 8 +++---- .../role => role/pages}/RolesPage.tsx | 2 +- .../src/role/{ => services}/Role.service.ts | 10 ++++----- .../fragments/Role.basic.fragment.graphql | 2 +- .../fragments/Role.fragment.graphql | 4 ++-- .../fragments/Role.id.fragment.graphql | 0 .../Role.assignAbilities.mutation.graphql | 0 .../Role.assignProjects.mutation.graphql | 0 .../mutations/Role.create.mutation.graphql | 0 .../mutations/Role.delete.mutation.graphql | 0 .../mutations/Role.update.mutation.graphql | 0 .../queries/Roles.query.graphql | 0 .../role => role/views}/RoleDeleteView.tsx | 2 +- .../views}/RoleGeneralAdjustmentView.tsx | 2 +- .../views}/RolePermissionView.tsx | 2 +- .../role => role/views}/RoleProjectView.tsx | 2 +- .../role => role/views}/RolesView.tsx | 4 ++-- .../components}/RuntimeDataTableComponent.tsx | 12 +++++----- .../RuntimeDataTableFilterInputComponent.tsx | 2 +- .../RuntimeDataTableRowComponent.tsx | 2 +- .../pages}/RuntimeCreatePage.tsx | 6 ++--- .../pages}/RuntimeSettingsPage.tsx | 2 +- .../pages}/RuntimesPage.tsx | 4 ++-- .../runtime/{ => services}/Runtime.service.ts | 0 .../fragments/Runtime.fragment.graphql | 0 .../fragments/Runtime.id.fragment.graphql | 0 .../mutations/Runtime.create.mutation.graphql | 0 .../mutations/Runtime.delete.mutation.graphql | 0 .../Runtime.rotateToken.mutation.graphql | 0 .../mutations/Runtime.update.mutation.graphql | 0 .../queries/Runtime.global.query.graphql | 0 .../queries/Runtime.namespace.query.graphql | 0 .../usage => runtime/views}/UsageView.tsx | 0 .../pages}/UserEmailVerificationPage.tsx | 2 +- .../pages}/UserForgotPasswordPage.tsx | 2 +- .../{ui-auth => user/pages}/UserLoginPage.tsx | 2 +- .../pages}/UserRegistrationPage.tsx | 2 +- .../pages}/UserResetPasswordPage.tsx | 2 +- .../user => user/pages}/UsersPage.tsx | 2 +- .../src/user/{ => services}/User.service.ts | 0 .../fragments/User.basic.fragment.graphql | 0 .../fragments/User.fragment.graphql | 4 ++-- .../fragments/User.id.fragment.graphql | 0 .../fragments/Identity.fragment.graphql | 0 .../User.emailVerification.mutation.graphql | 0 .../mutations/User.login.mutation.graphql | 0 .../mutations/User.logout.mutation.graphql | 0 .../User.passwordReset.mutation.graphql | 0 ...User.passwordResetRequest.mutation.graphql | 0 .../mutations/User.register.mutation.graphql | 0 .../queries/User.byId.query.graphql | 0 .../queries/User.byUsername.query.graphql | 0 .../queries/Users.query.graphql | 0 .../fragments/Session.fragment.graphql | 0 181 files changed, 208 insertions(+), 208 deletions(-) rename src/packages/ce/src/{ui-dashboard => }/application/ApplicationBarView.tsx (94%) rename src/packages/ce/src/{ui-dashboard => }/application/ApplicationBreadcrumbView.tsx (95%) rename src/packages/ce/src/{ui-dashboard => }/application/ApplicationPage.tsx (91%) rename src/packages/ce/src/{ui-dashboard => }/application/ApplicationSettingsPage.tsx (99%) rename src/packages/ce/src/{ui-dashboard => }/application/ApplicationTabView.tsx (93%) rename src/packages/ce/src/datatype/{ => services}/Datatype.service.ts (96%) rename src/packages/ce/src/datatype/{ => services}/fragments/DataType.basic.fragment.graphql (100%) rename src/packages/ce/src/datatype/{ => services}/fragments/DataType.fragment.graphql (91%) rename src/packages/ce/src/datatype/{ => services}/fragments/DataTypeRule.fragment.graphql (100%) rename src/packages/ce/src/datatype/{ => services}/queries/DataTypes.query.graphql (100%) rename src/packages/ce/src/flow/{ => services}/Flow.service.ts (94%) rename src/packages/ce/src/flow/{ => services}/fragments/Flow.basic.fragment.graphql (100%) rename src/packages/ce/src/flow/{ => services}/fragments/Flow.fragment.graphql (100%) rename src/packages/ce/src/flow/{ => services}/mutations/Flow.create.mutation.graphql (100%) rename src/packages/ce/src/flow/{ => services}/mutations/Flow.delete.mutation.graphql (100%) rename src/packages/ce/src/flow/{ => services}/mutations/Flow.update.mutation.graphql (100%) rename src/packages/ce/src/flow/{ => services}/queries/Flows.query.graphql (100%) rename src/packages/ce/src/{ui-flow/folder => flow/views}/FolderView.tsx (99%) rename src/packages/ce/src/flowtype/{ => services}/FlowTypeService.ts (96%) rename src/packages/ce/src/flowtype/{ => services}/fragments/FlowType.fragment.graphql (89%) rename src/packages/ce/src/flowtype/{ => services}/queries/FlowTypes.query.graphql (100%) rename src/packages/ce/src/function/{ => services}/Function.service.ts (96%) rename src/packages/ce/src/function/{ => services}/fragments/DataTypeIdentifier.fragment.graphql (100%) rename src/packages/ce/src/function/{ => services}/fragments/Function.fragment.graphql (100%) rename src/packages/ce/src/function/{ => services}/queries/Functions.query.graphql (100%) rename src/packages/ce/src/{ui-dashboard/member => member/pages}/MemberAddPage.tsx (95%) rename src/packages/ce/src/{ui-dashboard/member => member/pages}/MembersPage.tsx (81%) rename src/packages/ce/src/member/{ => services}/Member.service.ts (100%) rename src/packages/ce/src/member/{ => services}/fragments/Member.basic.fragment.graphql (65%) rename src/packages/ce/src/member/{ => services}/fragments/Member.fragment.graphql (75%) rename src/packages/ce/src/member/{ => services}/mutations/Member.assignRoles.mutation.graphql (100%) rename src/packages/ce/src/member/{ => services}/mutations/Member.delete.mutation.graphql (100%) rename src/packages/ce/src/member/{ => services}/mutations/Member.invite.mutation.graphql (100%) rename src/packages/ce/src/member/{ => services}/queries/Members.query.graphql (100%) rename src/packages/ce/src/{ui-dashboard/member => member/views}/MembersView.tsx (96%) rename src/packages/ce/src/{ui-dashboard/namespace => namespace/pages}/NamespaceOverviewPage.tsx (78%) rename src/packages/ce/src/{ui-dashboard/namespace => namespace/pages}/NamespaceProjectsCreatePage.tsx (97%) rename src/packages/ce/src/{ui-dashboard/namespace => namespace/pages}/NamespaceProjectsPage.tsx (81%) rename src/packages/ce/src/namespace/{ => services}/Namespace.service.ts (100%) rename src/packages/ce/src/namespace/{ => services}/fragments/Namespace.fragment.graphql (81%) rename src/packages/ce/src/namespace/{ => services}/fragments/Namespace.id.fragment.graphql (100%) rename src/packages/ce/src/namespace/{ => services}/queries/Namespace.query.graphql (100%) rename src/packages/ce/src/{ui-dashboard/namespace => namespace/views}/NamespaceOverviewLeftView.tsx (95%) rename src/packages/ce/src/{ui-dashboard/namespace => namespace/views}/NamespaceOverviewRightView.tsx (93%) rename src/packages/ce/src/{ui-dashboard/namespace => namespace/views}/NamespaceTabView.tsx (90%) rename src/packages/ce/src/{ui-dashboard/organization => organization/components}/OrganizationDataTableComponent.tsx (88%) rename src/packages/ce/src/{ui-dashboard/organization => organization/components}/OrganizationDataTableFilterInputComponent.tsx (94%) rename src/packages/ce/src/{ui-dashboard/organization => organization/components}/OrganizationDataTableRowComponent.tsx (93%) rename src/packages/ce/src/{ui-dashboard/organization => organization/pages}/OrganizationCreatePage.tsx (96%) rename src/packages/ce/src/{ui-dashboard/organization => organization/pages}/OrganizationSettingsPage.tsx (88%) rename src/packages/ce/src/{ui-dashboard/organization => organization/pages}/OrganizationsPage.tsx (78%) rename src/packages/ce/src/organization/{ => services}/Organization.service.ts (100%) rename src/packages/ce/src/organization/{ => services}/fragments/Organization.fragment.graphql (100%) rename src/packages/ce/src/organization/{ => services}/fragments/Organization.id.fragment.graphql (100%) rename src/packages/ce/src/organization/{ => services}/mutations/Organization.create.mutation.graphql (100%) rename src/packages/ce/src/organization/{ => services}/mutations/Organization.delete.mutation.graphql (100%) rename src/packages/ce/src/organization/{ => services}/mutations/Organization.update.mutation.graphql (100%) rename src/packages/ce/src/organization/{ => services}/queries/Organization.query.graphql (100%) rename src/packages/ce/src/{ui-dashboard/organization => organization/views}/OrganizationDeleteView.tsx (93%) rename src/packages/ce/src/{ui-dashboard/organization => organization/views}/OrganizationGeneralSettingsView.tsx (94%) rename src/packages/ce/src/{ui-dashboard/organization => organization/views}/OrganizationUpgradeView.tsx (100%) rename src/packages/ce/src/{ui-dashboard/organization => organization/views}/OrganizationsView.tsx (96%) rename src/packages/ce/src/{ui-dashboard/project => project/components}/ProjectDataTableComponent.tsx (89%) rename src/packages/ce/src/{ui-dashboard/project => project/components}/ProjectDataTableFilterInputComponent.tsx (96%) rename src/packages/ce/src/{ui-dashboard/project => project/components}/ProjectDataTableRowComponent.tsx (94%) rename src/packages/ce/src/{ui-dashboard/project => project/pages}/ProjectSettingsPage.tsx (90%) rename src/packages/ce/src/project/{ => services}/Project.service.ts (100%) rename src/packages/ce/src/project/{ => services}/fragments/Project.basic.fragment.graphql (86%) rename src/packages/ce/src/project/{ => services}/fragments/Project.fragment.graphql (93%) rename src/packages/ce/src/project/{ => services}/fragments/Project.id.fragment.graphql (100%) rename src/packages/ce/src/project/{ => services}/mutations/Project.assignRuntimes.mutation.graphql (100%) rename src/packages/ce/src/project/{ => services}/mutations/Project.create.mutation.graphql (100%) rename src/packages/ce/src/project/{ => services}/mutations/Project.delete.mutation.graphql (100%) rename src/packages/ce/src/project/{ => services}/mutations/Project.update.mutation.graphql (100%) rename src/packages/ce/src/project/{ => services}/queries/Projects.query.graphql (100%) rename src/packages/ce/src/{ui-dashboard/project => project/views}/PersonalProjectsView.tsx (95%) rename src/packages/ce/src/{ui-dashboard/project => project/views}/ProjectSettingsDeleteView.tsx (100%) rename src/packages/ce/src/{ui-dashboard/project => project/views}/ProjectSettingsGeneralView.tsx (96%) rename src/packages/ce/src/{ui-dashboard/project => project/views}/ProjectSettingsRuntimesView.tsx (91%) rename src/packages/ce/src/{ui-dashboard/project => project/views}/ProjectsView.tsx (96%) rename src/packages/ce/src/{ui-dashboard/role => role/components}/RoleDataTableComponent.tsx (82%) rename src/packages/ce/src/{ui-dashboard/role => role/components}/RoleDataTableFilterInputComponent.tsx (98%) rename src/packages/ce/src/{ui-dashboard/role => role/components}/RoleDataTableRowComponent.tsx (89%) rename src/packages/ce/src/{ui-dashboard/role => role/pages}/RoleCreatePage.tsx (97%) rename src/packages/ce/src/{ui-dashboard/role => role/pages}/RoleSettingsPage.tsx (92%) rename src/packages/ce/src/{ui-dashboard/role => role/pages}/RolesPage.tsx (63%) rename src/packages/ce/src/role/{ => services}/Role.service.ts (92%) rename src/packages/ce/src/role/{ => services}/fragments/Role.basic.fragment.graphql (82%) rename src/packages/ce/src/role/{ => services}/fragments/Role.fragment.graphql (77%) rename src/packages/ce/src/role/{ => services}/fragments/Role.id.fragment.graphql (100%) rename src/packages/ce/src/role/{ => services}/mutations/Role.assignAbilities.mutation.graphql (100%) rename src/packages/ce/src/role/{ => services}/mutations/Role.assignProjects.mutation.graphql (100%) rename src/packages/ce/src/role/{ => services}/mutations/Role.create.mutation.graphql (100%) rename src/packages/ce/src/role/{ => services}/mutations/Role.delete.mutation.graphql (100%) rename src/packages/ce/src/role/{ => services}/mutations/Role.update.mutation.graphql (100%) rename src/packages/ce/src/role/{ => services}/queries/Roles.query.graphql (100%) rename src/packages/ce/src/{ui-dashboard/role => role/views}/RoleDeleteView.tsx (96%) rename src/packages/ce/src/{ui-dashboard/role => role/views}/RoleGeneralAdjustmentView.tsx (97%) rename src/packages/ce/src/{ui-dashboard/role => role/views}/RolePermissionView.tsx (99%) rename src/packages/ce/src/{ui-dashboard/role => role/views}/RoleProjectView.tsx (98%) rename src/packages/ce/src/{ui-dashboard/role => role/views}/RolesView.tsx (96%) rename src/packages/ce/src/{ui-dashboard/runtime => runtime/components}/RuntimeDataTableComponent.tsx (76%) rename src/packages/ce/src/{ui-dashboard/runtime => runtime/components}/RuntimeDataTableFilterInputComponent.tsx (98%) rename src/packages/ce/src/{ui-dashboard/runtime => runtime/components}/RuntimeDataTableRowComponent.tsx (95%) rename src/packages/ce/src/{ui-dashboard/runtime => runtime/pages}/RuntimeCreatePage.tsx (96%) rename src/packages/ce/src/{ui-dashboard/runtime => runtime/pages}/RuntimeSettingsPage.tsx (99%) rename src/packages/ce/src/{ui-dashboard/runtime => runtime/pages}/RuntimesPage.tsx (93%) rename src/packages/ce/src/runtime/{ => services}/Runtime.service.ts (100%) rename src/packages/ce/src/runtime/{ => services}/fragments/Runtime.fragment.graphql (100%) rename src/packages/ce/src/runtime/{ => services}/fragments/Runtime.id.fragment.graphql (100%) rename src/packages/ce/src/runtime/{ => services}/mutations/Runtime.create.mutation.graphql (100%) rename src/packages/ce/src/runtime/{ => services}/mutations/Runtime.delete.mutation.graphql (100%) rename src/packages/ce/src/runtime/{ => services}/mutations/Runtime.rotateToken.mutation.graphql (100%) rename src/packages/ce/src/runtime/{ => services}/mutations/Runtime.update.mutation.graphql (100%) rename src/packages/ce/src/runtime/{ => services}/queries/Runtime.global.query.graphql (100%) rename src/packages/ce/src/runtime/{ => services}/queries/Runtime.namespace.query.graphql (100%) rename src/packages/ce/src/{ui-dashboard/usage => runtime/views}/UsageView.tsx (100%) rename src/packages/ce/src/{ui-auth => user/pages}/UserEmailVerificationPage.tsx (97%) rename src/packages/ce/src/{ui-auth => user/pages}/UserForgotPasswordPage.tsx (97%) rename src/packages/ce/src/{ui-auth => user/pages}/UserLoginPage.tsx (98%) rename src/packages/ce/src/{ui-auth => user/pages}/UserRegistrationPage.tsx (98%) rename src/packages/ce/src/{ui-auth => user/pages}/UserResetPasswordPage.tsx (98%) rename src/packages/ce/src/{ui-dashboard/user => user/pages}/UsersPage.tsx (95%) rename src/packages/ce/src/user/{ => services}/User.service.ts (100%) rename src/packages/ce/src/user/{ => services}/fragments/User.basic.fragment.graphql (100%) rename src/packages/ce/src/user/{ => services}/fragments/User.fragment.graphql (81%) rename src/packages/ce/src/user/{ => services}/fragments/User.id.fragment.graphql (100%) rename src/packages/ce/src/user/{ => services}/identity/fragments/Identity.fragment.graphql (100%) rename src/packages/ce/src/user/{ => services}/mutations/User.emailVerification.mutation.graphql (100%) rename src/packages/ce/src/user/{ => services}/mutations/User.login.mutation.graphql (100%) rename src/packages/ce/src/user/{ => services}/mutations/User.logout.mutation.graphql (100%) rename src/packages/ce/src/user/{ => services}/mutations/User.passwordReset.mutation.graphql (100%) rename src/packages/ce/src/user/{ => services}/mutations/User.passwordResetRequest.mutation.graphql (100%) rename src/packages/ce/src/user/{ => services}/mutations/User.register.mutation.graphql (100%) rename src/packages/ce/src/user/{ => services}/queries/User.byId.query.graphql (100%) rename src/packages/ce/src/user/{ => services}/queries/User.byUsername.query.graphql (100%) rename src/packages/ce/src/user/{ => services}/queries/Users.query.graphql (100%) rename src/packages/ce/src/user/{ => services}/session/fragments/Session.fragment.graphql (100%) diff --git a/src/app/(auth)/email/page.tsx b/src/app/(auth)/email/page.tsx index 5f1932c7..dd8fb0ab 100644 --- a/src/app/(auth)/email/page.tsx +++ b/src/app/(auth)/email/page.tsx @@ -1,5 +1,5 @@ import React from "react"; -import {UserEmailVerificationPage} from "@edition/ui-auth/UserEmailVerificationPage"; +import {UserEmailVerificationPage} from "@edition/user/pages/UserEmailVerificationPage"; export default function Page() { return diff --git a/src/app/(auth)/layout.tsx b/src/app/(auth)/layout.tsx index 23f092a4..1cd99e4f 100644 --- a/src/app/(auth)/layout.tsx +++ b/src/app/(auth)/layout.tsx @@ -1,7 +1,7 @@ "use client" import {Col, Container, ContextStoreProvider, DFullScreen, DUserView, Flex, Text} from "@code0-tech/pictor"; -import {UserService} from "@edition/user/User.service"; +import {UserService} from "@edition/user/services/User.service"; import {useApolloClient} from "@apollo/client/react"; import {GraphqlClient} from "@core/util/graphql-client"; import Image from "next/image"; diff --git a/src/app/(auth)/login/page.tsx b/src/app/(auth)/login/page.tsx index 97793e7d..28b69e29 100644 --- a/src/app/(auth)/login/page.tsx +++ b/src/app/(auth)/login/page.tsx @@ -1,5 +1,5 @@ import React from "react"; -import {UserLoginPage} from "@edition/ui-auth/UserLoginPage"; +import {UserLoginPage} from "@edition/user/pages/UserLoginPage"; export default function Page() { return diff --git a/src/app/(auth)/password/page.tsx b/src/app/(auth)/password/page.tsx index 6444f601..fa65ee95 100644 --- a/src/app/(auth)/password/page.tsx +++ b/src/app/(auth)/password/page.tsx @@ -1,5 +1,5 @@ import React from "react"; -import {UserForgotPasswordPage} from "@edition/ui-auth/UserForgotPasswordPage"; +import {UserForgotPasswordPage} from "@edition/user/pages/UserForgotPasswordPage"; export default function Page() { return diff --git a/src/app/(auth)/password/reset/page.tsx b/src/app/(auth)/password/reset/page.tsx index c050eafc..f0347649 100644 --- a/src/app/(auth)/password/reset/page.tsx +++ b/src/app/(auth)/password/reset/page.tsx @@ -1,5 +1,5 @@ import React from "react"; -import {UserResetPasswordPage} from "@edition/ui-auth/UserResetPasswordPage"; +import {UserResetPasswordPage} from "@edition/user/pages/UserResetPasswordPage"; export default function Page() { return diff --git a/src/app/(auth)/register/page.tsx b/src/app/(auth)/register/page.tsx index 7d785e61..1c3e4f49 100644 --- a/src/app/(auth)/register/page.tsx +++ b/src/app/(auth)/register/page.tsx @@ -1,5 +1,5 @@ import React from "react"; -import {UserRegistrationPage} from "@edition/ui-auth/UserRegistrationPage"; +import {UserRegistrationPage} from "@edition/user/pages/UserRegistrationPage"; export default function Page() { return diff --git a/src/app/(dashboard)/@bar/default.tsx b/src/app/(dashboard)/@bar/default.tsx index 21601620..99055c6e 100644 --- a/src/app/(dashboard)/@bar/default.tsx +++ b/src/app/(dashboard)/@bar/default.tsx @@ -1,7 +1,7 @@ "use client"; import React from "react"; -import {ApplicationBarView} from "@edition/ui-dashboard/application/ApplicationBarView"; +import {ApplicationBarView} from "@edition/application/ApplicationBarView"; const Page = () => { return diff --git a/src/app/(dashboard)/@tab/namespace/[namespaceId]/members/default.tsx b/src/app/(dashboard)/@tab/namespace/[namespaceId]/members/default.tsx index 434d18b2..3881c19f 100644 --- a/src/app/(dashboard)/@tab/namespace/[namespaceId]/members/default.tsx +++ b/src/app/(dashboard)/@tab/namespace/[namespaceId]/members/default.tsx @@ -1,4 +1,4 @@ -import {NamespaceTabView} from "@edition/ui-dashboard/namespace/NamespaceTabView"; +import {NamespaceTabView} from "@edition/namespace/views/NamespaceTabView"; export default function Page() { return diff --git a/src/app/(dashboard)/@tab/namespace/[namespaceId]/page.tsx b/src/app/(dashboard)/@tab/namespace/[namespaceId]/page.tsx index 434d18b2..3881c19f 100644 --- a/src/app/(dashboard)/@tab/namespace/[namespaceId]/page.tsx +++ b/src/app/(dashboard)/@tab/namespace/[namespaceId]/page.tsx @@ -1,4 +1,4 @@ -import {NamespaceTabView} from "@edition/ui-dashboard/namespace/NamespaceTabView"; +import {NamespaceTabView} from "@edition/namespace/views/NamespaceTabView"; export default function Page() { return diff --git a/src/app/(dashboard)/@tab/namespace/[namespaceId]/projects/default.tsx b/src/app/(dashboard)/@tab/namespace/[namespaceId]/projects/default.tsx index 434d18b2..3881c19f 100644 --- a/src/app/(dashboard)/@tab/namespace/[namespaceId]/projects/default.tsx +++ b/src/app/(dashboard)/@tab/namespace/[namespaceId]/projects/default.tsx @@ -1,4 +1,4 @@ -import {NamespaceTabView} from "@edition/ui-dashboard/namespace/NamespaceTabView"; +import {NamespaceTabView} from "@edition/namespace/views/NamespaceTabView"; export default function Page() { return diff --git a/src/app/(dashboard)/@tab/namespace/[namespaceId]/roles/default.tsx b/src/app/(dashboard)/@tab/namespace/[namespaceId]/roles/default.tsx index 434d18b2..3881c19f 100644 --- a/src/app/(dashboard)/@tab/namespace/[namespaceId]/roles/default.tsx +++ b/src/app/(dashboard)/@tab/namespace/[namespaceId]/roles/default.tsx @@ -1,4 +1,4 @@ -import {NamespaceTabView} from "@edition/ui-dashboard/namespace/NamespaceTabView"; +import {NamespaceTabView} from "@edition/namespace/views/NamespaceTabView"; export default function Page() { return diff --git a/src/app/(dashboard)/@tab/namespace/[namespaceId]/runtimes/default.tsx b/src/app/(dashboard)/@tab/namespace/[namespaceId]/runtimes/default.tsx index 434d18b2..3881c19f 100644 --- a/src/app/(dashboard)/@tab/namespace/[namespaceId]/runtimes/default.tsx +++ b/src/app/(dashboard)/@tab/namespace/[namespaceId]/runtimes/default.tsx @@ -1,4 +1,4 @@ -import {NamespaceTabView} from "@edition/ui-dashboard/namespace/NamespaceTabView"; +import {NamespaceTabView} from "@edition/namespace/views/NamespaceTabView"; export default function Page() { return diff --git a/src/app/(dashboard)/@tab/namespace/[namespaceId]/settings/default.tsx b/src/app/(dashboard)/@tab/namespace/[namespaceId]/settings/default.tsx index 434d18b2..3881c19f 100644 --- a/src/app/(dashboard)/@tab/namespace/[namespaceId]/settings/default.tsx +++ b/src/app/(dashboard)/@tab/namespace/[namespaceId]/settings/default.tsx @@ -1,4 +1,4 @@ -import {NamespaceTabView} from "@edition/ui-dashboard/namespace/NamespaceTabView"; +import {NamespaceTabView} from "@edition/namespace/views/NamespaceTabView"; export default function Page() { return diff --git a/src/app/(dashboard)/@tab/organizations/default.tsx b/src/app/(dashboard)/@tab/organizations/default.tsx index d92de630..3ef9f84b 100644 --- a/src/app/(dashboard)/@tab/organizations/default.tsx +++ b/src/app/(dashboard)/@tab/organizations/default.tsx @@ -1,7 +1,7 @@ "use client" import React from "react"; -import {ApplicationTabView} from "@edition/ui-dashboard/application/ApplicationTabView"; +import {ApplicationTabView} from "@edition/application/ApplicationTabView"; const Page: React.FC = () => { return diff --git a/src/app/(dashboard)/@tab/page.tsx b/src/app/(dashboard)/@tab/page.tsx index d92de630..3ef9f84b 100644 --- a/src/app/(dashboard)/@tab/page.tsx +++ b/src/app/(dashboard)/@tab/page.tsx @@ -1,7 +1,7 @@ "use client" import React from "react"; -import {ApplicationTabView} from "@edition/ui-dashboard/application/ApplicationTabView"; +import {ApplicationTabView} from "@edition/application/ApplicationTabView"; const Page: React.FC = () => { return diff --git a/src/app/(dashboard)/@tab/runtimes/default.tsx b/src/app/(dashboard)/@tab/runtimes/default.tsx index d92de630..3ef9f84b 100644 --- a/src/app/(dashboard)/@tab/runtimes/default.tsx +++ b/src/app/(dashboard)/@tab/runtimes/default.tsx @@ -1,7 +1,7 @@ "use client" import React from "react"; -import {ApplicationTabView} from "@edition/ui-dashboard/application/ApplicationTabView"; +import {ApplicationTabView} from "@edition/application/ApplicationTabView"; const Page: React.FC = () => { return diff --git a/src/app/(dashboard)/@tab/settings/page.tsx b/src/app/(dashboard)/@tab/settings/page.tsx index d92de630..3ef9f84b 100644 --- a/src/app/(dashboard)/@tab/settings/page.tsx +++ b/src/app/(dashboard)/@tab/settings/page.tsx @@ -1,7 +1,7 @@ "use client" import React from "react"; -import {ApplicationTabView} from "@edition/ui-dashboard/application/ApplicationTabView"; +import {ApplicationTabView} from "@edition/application/ApplicationTabView"; const Page: React.FC = () => { return diff --git a/src/app/(dashboard)/@tab/users/page.tsx b/src/app/(dashboard)/@tab/users/page.tsx index d92de630..3ef9f84b 100644 --- a/src/app/(dashboard)/@tab/users/page.tsx +++ b/src/app/(dashboard)/@tab/users/page.tsx @@ -1,7 +1,7 @@ "use client" import React from "react"; -import {ApplicationTabView} from "@edition/ui-dashboard/application/ApplicationTabView"; +import {ApplicationTabView} from "@edition/application/ApplicationTabView"; const Page: React.FC = () => { return diff --git a/src/app/(dashboard)/layout.tsx b/src/app/(dashboard)/layout.tsx index 6eb12c97..3e15e148 100644 --- a/src/app/(dashboard)/layout.tsx +++ b/src/app/(dashboard)/layout.tsx @@ -16,16 +16,16 @@ import { Flex, useUserSession } from "@code0-tech/pictor"; -import {UserService} from "@edition/user/User.service"; +import {UserService} from "@edition/user/services/User.service"; import {GraphqlClient} from "@core/util/graphql-client"; import {useRouter} from "next/navigation"; -import {OrganizationService} from "@edition/organization/Organization.service"; -import {MemberService} from "@edition/member/Member.service"; -import {NamespaceService} from "@edition/namespace/Namespace.service"; +import {OrganizationService} from "@edition/organization/services/Organization.service"; +import {MemberService} from "@edition/member/services/Member.service"; +import {NamespaceService} from "@edition/namespace/services/Namespace.service"; import {usePersistentReactiveArrayService} from "@/hooks/usePersistentReactiveArrayService"; -import {RuntimeService} from "@edition/runtime/Runtime.service"; -import {ProjectService} from "@edition/project/Project.service"; -import {RoleService} from "@edition/role/Role.service"; +import {RuntimeService} from "@edition/runtime/services/Runtime.service"; +import {ProjectService} from "@edition/project/services/Project.service"; +import {RoleService} from "@edition/role/services/Role.service"; import Image from "next/image"; interface ApplicationLayoutProps { diff --git a/src/app/(dashboard)/namespace/[namespaceId]/members/add/page.tsx b/src/app/(dashboard)/namespace/[namespaceId]/members/add/page.tsx index 6c92133e..a5186c72 100644 --- a/src/app/(dashboard)/namespace/[namespaceId]/members/add/page.tsx +++ b/src/app/(dashboard)/namespace/[namespaceId]/members/add/page.tsx @@ -1,6 +1,6 @@ "use client" -import {MemberAddPage} from "@edition/ui-dashboard/member/MemberAddPage"; +import {MemberAddPage} from "@edition/member/pages/MemberAddPage"; export default function Page() { return diff --git a/src/app/(dashboard)/namespace/[namespaceId]/members/page.tsx b/src/app/(dashboard)/namespace/[namespaceId]/members/page.tsx index a2f83c1a..3e37f24d 100644 --- a/src/app/(dashboard)/namespace/[namespaceId]/members/page.tsx +++ b/src/app/(dashboard)/namespace/[namespaceId]/members/page.tsx @@ -1,6 +1,6 @@ "use client" -import {MembersPage} from "@edition/ui-dashboard/member/MembersPage"; +import {MembersPage} from "@edition/member/pages/MembersPage"; export default function Page() { return diff --git a/src/app/(dashboard)/namespace/[namespaceId]/page.tsx b/src/app/(dashboard)/namespace/[namespaceId]/page.tsx index 1dcf4140..dbfc7343 100644 --- a/src/app/(dashboard)/namespace/[namespaceId]/page.tsx +++ b/src/app/(dashboard)/namespace/[namespaceId]/page.tsx @@ -1,6 +1,6 @@ "use client" -import {NamespaceOverviewPage} from "@edition/ui-dashboard/namespace/NamespaceOverviewPage"; +import {NamespaceOverviewPage} from "@edition/namespace/pages/NamespaceOverviewPage"; export default function Page() { return diff --git a/src/app/(dashboard)/namespace/[namespaceId]/projects/create/page.tsx b/src/app/(dashboard)/namespace/[namespaceId]/projects/create/page.tsx index ea678af6..9b9fff72 100644 --- a/src/app/(dashboard)/namespace/[namespaceId]/projects/create/page.tsx +++ b/src/app/(dashboard)/namespace/[namespaceId]/projects/create/page.tsx @@ -1,4 +1,4 @@ -import {NamespaceProjectsCreatePage} from "@edition/ui-dashboard/namespace/NamespaceProjectsCreatePage"; +import {NamespaceProjectsCreatePage} from "@edition/namespace/pages/NamespaceProjectsCreatePage"; export default function Page() { return diff --git a/src/app/(dashboard)/namespace/[namespaceId]/projects/page.tsx b/src/app/(dashboard)/namespace/[namespaceId]/projects/page.tsx index 083ff8ea..b6743871 100644 --- a/src/app/(dashboard)/namespace/[namespaceId]/projects/page.tsx +++ b/src/app/(dashboard)/namespace/[namespaceId]/projects/page.tsx @@ -1,4 +1,4 @@ -import {NamespaceProjectsPage} from "@edition/ui-dashboard/namespace/NamespaceProjectsPage"; +import {NamespaceProjectsPage} from "@edition/namespace/pages/NamespaceProjectsPage"; export default function Page() { return diff --git a/src/app/(dashboard)/namespace/[namespaceId]/roles/[roleId]/settings/page.tsx b/src/app/(dashboard)/namespace/[namespaceId]/roles/[roleId]/settings/page.tsx index d6e166be..db745576 100644 --- a/src/app/(dashboard)/namespace/[namespaceId]/roles/[roleId]/settings/page.tsx +++ b/src/app/(dashboard)/namespace/[namespaceId]/roles/[roleId]/settings/page.tsx @@ -1,6 +1,6 @@ "use client" -import {RoleSettingsPage} from "@edition/ui-dashboard/role/RoleSettingsPage"; +import {RoleSettingsPage} from "@edition/role/pages/RoleSettingsPage"; export default function Page() { return diff --git a/src/app/(dashboard)/namespace/[namespaceId]/roles/create/page.tsx b/src/app/(dashboard)/namespace/[namespaceId]/roles/create/page.tsx index 56412d8b..320e44f5 100644 --- a/src/app/(dashboard)/namespace/[namespaceId]/roles/create/page.tsx +++ b/src/app/(dashboard)/namespace/[namespaceId]/roles/create/page.tsx @@ -1,6 +1,6 @@ "use client" -import {RoleCreatePage} from "@edition/ui-dashboard/role/RoleCreatePage"; +import {RoleCreatePage} from "@edition/role/pages/RoleCreatePage"; export default function Page() { return diff --git a/src/app/(dashboard)/namespace/[namespaceId]/roles/page.tsx b/src/app/(dashboard)/namespace/[namespaceId]/roles/page.tsx index a6dc5db1..68dd8172 100644 --- a/src/app/(dashboard)/namespace/[namespaceId]/roles/page.tsx +++ b/src/app/(dashboard)/namespace/[namespaceId]/roles/page.tsx @@ -1,4 +1,4 @@ -import {RolesPage} from "@edition/ui-dashboard/role/RolesPage"; +import {RolesPage} from "@edition/role/pages/RolesPage"; export default function Page() { return
diff --git a/src/app/(dashboard)/namespace/[namespaceId]/runtimes/create/page.tsx b/src/app/(dashboard)/namespace/[namespaceId]/runtimes/create/page.tsx index bdfd81b3..e149b9e1 100644 --- a/src/app/(dashboard)/namespace/[namespaceId]/runtimes/create/page.tsx +++ b/src/app/(dashboard)/namespace/[namespaceId]/runtimes/create/page.tsx @@ -1,4 +1,4 @@ -import {RuntimeCreatePage} from "@edition/ui-dashboard/runtime/RuntimeCreatePage"; +import {RuntimeCreatePage} from "@edition/runtime/pages/RuntimeCreatePage"; export default function Page() { return diff --git a/src/app/(dashboard)/namespace/[namespaceId]/runtimes/page.tsx b/src/app/(dashboard)/namespace/[namespaceId]/runtimes/page.tsx index 073e0dec..27fcc879 100644 --- a/src/app/(dashboard)/namespace/[namespaceId]/runtimes/page.tsx +++ b/src/app/(dashboard)/namespace/[namespaceId]/runtimes/page.tsx @@ -1,4 +1,4 @@ -import {RuntimesPage} from "@edition/ui-dashboard/runtime/RuntimesPage"; +import {RuntimesPage} from "@edition/runtime/pages/RuntimesPage"; export default function Page() { return diff --git a/src/app/(dashboard)/namespace/[namespaceId]/settings/page.tsx b/src/app/(dashboard)/namespace/[namespaceId]/settings/page.tsx index 41a2813e..5421a642 100644 --- a/src/app/(dashboard)/namespace/[namespaceId]/settings/page.tsx +++ b/src/app/(dashboard)/namespace/[namespaceId]/settings/page.tsx @@ -1,6 +1,6 @@ "use client" -import {OrganizationSettingsPage} from "@edition/ui-dashboard/organization/OrganizationSettingsPage"; +import {OrganizationSettingsPage} from "@edition/organization/pages/OrganizationSettingsPage"; export default function Page() { return diff --git a/src/app/(dashboard)/organizations/create/page.tsx b/src/app/(dashboard)/organizations/create/page.tsx index 742159a7..86e80fee 100644 --- a/src/app/(dashboard)/organizations/create/page.tsx +++ b/src/app/(dashboard)/organizations/create/page.tsx @@ -1,4 +1,4 @@ -import {OrganizationCreatePage} from "@edition/ui-dashboard/organization/OrganizationCreatePage"; +import {OrganizationCreatePage} from "@edition/organization/pages/OrganizationCreatePage"; export default function Page() { return diff --git a/src/app/(dashboard)/organizations/page.tsx b/src/app/(dashboard)/organizations/page.tsx index a1785309..e49f829e 100644 --- a/src/app/(dashboard)/organizations/page.tsx +++ b/src/app/(dashboard)/organizations/page.tsx @@ -1,4 +1,4 @@ -import {OrganizationsPage} from "@edition/ui-dashboard/organization/OrganizationsPage"; +import {OrganizationsPage} from "@edition/organization/pages/OrganizationsPage"; export default function Page() { return diff --git a/src/app/(dashboard)/page.tsx b/src/app/(dashboard)/page.tsx index 32c4fba6..f3fe6f60 100644 --- a/src/app/(dashboard)/page.tsx +++ b/src/app/(dashboard)/page.tsx @@ -1,7 +1,7 @@ "use client" import React from "react"; -import {ApplicationPage} from "@edition/ui-dashboard/application/ApplicationPage"; +import {ApplicationPage} from "@edition/application/ApplicationPage"; export default function Page() { return diff --git a/src/app/(dashboard)/runtimes/[runtimeId]/settings/page.tsx b/src/app/(dashboard)/runtimes/[runtimeId]/settings/page.tsx index 723295ca..1b30dce7 100644 --- a/src/app/(dashboard)/runtimes/[runtimeId]/settings/page.tsx +++ b/src/app/(dashboard)/runtimes/[runtimeId]/settings/page.tsx @@ -1,4 +1,4 @@ -import {RuntimeSettingsPage} from "@edition/ui-dashboard/runtime/RuntimeSettingsPage"; +import {RuntimeSettingsPage} from "@edition/runtime/pages/RuntimeSettingsPage"; export default function Page() { return diff --git a/src/app/(dashboard)/runtimes/create/page.tsx b/src/app/(dashboard)/runtimes/create/page.tsx index bdfd81b3..e149b9e1 100644 --- a/src/app/(dashboard)/runtimes/create/page.tsx +++ b/src/app/(dashboard)/runtimes/create/page.tsx @@ -1,4 +1,4 @@ -import {RuntimeCreatePage} from "@edition/ui-dashboard/runtime/RuntimeCreatePage"; +import {RuntimeCreatePage} from "@edition/runtime/pages/RuntimeCreatePage"; export default function Page() { return diff --git a/src/app/(dashboard)/runtimes/page.tsx b/src/app/(dashboard)/runtimes/page.tsx index aeec59c0..b0f607f2 100644 --- a/src/app/(dashboard)/runtimes/page.tsx +++ b/src/app/(dashboard)/runtimes/page.tsx @@ -1,6 +1,6 @@ "use client" -import {RuntimesPage} from "@edition/ui-dashboard/runtime/RuntimesPage"; +import {RuntimesPage} from "@edition/runtime/pages/RuntimesPage"; export default function Page() { return diff --git a/src/app/(dashboard)/settings/page.tsx b/src/app/(dashboard)/settings/page.tsx index 98c56932..47813a23 100644 --- a/src/app/(dashboard)/settings/page.tsx +++ b/src/app/(dashboard)/settings/page.tsx @@ -1,7 +1,7 @@ "use client" import React from "react"; -import {ApplicationSettingsPage} from "@edition/ui-dashboard/application/ApplicationSettingsPage"; +import {ApplicationSettingsPage} from "@edition/application/ApplicationSettingsPage"; export default function Page() { diff --git a/src/app/(dashboard)/users/page.tsx b/src/app/(dashboard)/users/page.tsx index 24545dc2..57051d43 100644 --- a/src/app/(dashboard)/users/page.tsx +++ b/src/app/(dashboard)/users/page.tsx @@ -1,4 +1,4 @@ -import {UsersPage} from "@edition/ui-dashboard/user/UsersPage"; +import {UsersPage} from "@edition/user/pages/UsersPage"; export default function Page() { return diff --git a/src/app/(flow)/@bar/default.tsx b/src/app/(flow)/@bar/default.tsx index 21601620..99055c6e 100644 --- a/src/app/(flow)/@bar/default.tsx +++ b/src/app/(flow)/@bar/default.tsx @@ -1,7 +1,7 @@ "use client"; import React from "react"; -import {ApplicationBarView} from "@edition/ui-dashboard/application/ApplicationBarView"; +import {ApplicationBarView} from "@edition/application/ApplicationBarView"; const Page = () => { return diff --git a/src/app/(flow)/layout.tsx b/src/app/(flow)/layout.tsx index dd843b09..a2d853ff 100644 --- a/src/app/(flow)/layout.tsx +++ b/src/app/(flow)/layout.tsx @@ -23,17 +23,17 @@ import React from "react"; import {GraphqlClient} from "@core/util/graphql-client"; import {Flow, Namespace, NamespaceProject} from "@code0-tech/sagittarius-graphql-types"; import {usePersistentReactiveArrayService} from "@/hooks/usePersistentReactiveArrayService"; -import {UserService} from "@edition/user/User.service"; -import {OrganizationService} from "@edition/organization/Organization.service"; -import {MemberService} from "@edition/member/Member.service"; -import {NamespaceService} from "@edition/namespace/Namespace.service"; -import {RuntimeService} from "@edition/runtime/Runtime.service"; -import {ProjectService} from "@edition/project/Project.service"; -import {RoleService} from "@edition/role/Role.service"; -import {FlowService} from "@edition/flow/Flow.service"; -import {FunctionService} from "@edition/function/Function.service"; -import {DatatypeService} from "@edition/datatype/Datatype.service"; -import {FlowTypeService} from "@edition/flowtype/FlowTypeService"; +import {UserService} from "@edition/user/services/User.service"; +import {OrganizationService} from "@edition/organization/services/Organization.service"; +import {MemberService} from "@edition/member/services/Member.service"; +import {NamespaceService} from "@edition/namespace/services/Namespace.service"; +import {RuntimeService} from "@edition/runtime/services/Runtime.service"; +import {ProjectService} from "@edition/project/services/Project.service"; +import {RoleService} from "@edition/role/services/Role.service"; +import {FlowService} from "@edition/flow/services/Flow.service"; +import {FunctionService} from "@edition/function/services/Function.service"; +import {DatatypeService} from "@edition/datatype/services/Datatype.service"; +import {FlowTypeService} from "@edition/flowtype/services/FlowTypeService"; import {FileTabsView} from "@code0-tech/pictor/dist/components/file-tabs/FileTabs.view"; import {FileTabsService} from "@code0-tech/pictor/dist/components/file-tabs/FileTabs.service"; import Image from "next/image"; diff --git a/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/layout.tsx b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/layout.tsx index 88c1fec4..5d91943e 100644 --- a/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/layout.tsx +++ b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/layout.tsx @@ -2,7 +2,7 @@ import React from "react"; import {DResizableHandle, DResizablePanel, DResizablePanelGroup} from "@code0-tech/pictor"; -import {FolderView} from "@edition/ui-flow/folder/FolderView"; +import {FolderView} from "@edition/flow/views/FolderView"; interface ApplicationLayoutProps { children: React.ReactNode diff --git a/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/settings/page.tsx b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/settings/page.tsx index 970e58dd..17a4168e 100644 --- a/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/settings/page.tsx +++ b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/settings/page.tsx @@ -1,7 +1,7 @@ "use client" import React from "react"; -import {ProjectSettingsPage} from "@edition/ui-dashboard/project/ProjectSettingsPage"; +import {ProjectSettingsPage} from "@edition/project/pages/ProjectSettingsPage"; export default function Page() { return diff --git a/src/packages/ce/src/ui-dashboard/application/ApplicationBarView.tsx b/src/packages/ce/src/application/ApplicationBarView.tsx similarity index 94% rename from src/packages/ce/src/ui-dashboard/application/ApplicationBarView.tsx rename to src/packages/ce/src/application/ApplicationBarView.tsx index e5b729eb..f16099f9 100644 --- a/src/packages/ce/src/ui-dashboard/application/ApplicationBarView.tsx +++ b/src/packages/ce/src/application/ApplicationBarView.tsx @@ -12,13 +12,13 @@ import { useStore, useUserSession } from "@code0-tech/pictor"; -import {UserService} from "@edition/user/User.service"; +import {UserService} from "@edition/user/services/User.service"; import {useRouter} from "next/navigation"; import React from "react"; import DUserMenu from "@code0-tech/pictor/dist/components/d-user/DUserMenu"; import Link from "next/link"; import {IconBuilding, IconFolders, IconInbox, IconLogout, IconSearch} from "@tabler/icons-react"; -import {ApplicationBreadcrumbView} from "@edition/ui-dashboard/application/ApplicationBreadcrumbView"; +import {ApplicationBreadcrumbView} from "@edition/application/ApplicationBreadcrumbView"; export const ApplicationBarView: React.FC = () => { diff --git a/src/packages/ce/src/ui-dashboard/application/ApplicationBreadcrumbView.tsx b/src/packages/ce/src/application/ApplicationBreadcrumbView.tsx similarity index 95% rename from src/packages/ce/src/ui-dashboard/application/ApplicationBreadcrumbView.tsx rename to src/packages/ce/src/application/ApplicationBreadcrumbView.tsx index af17a3ff..e7320fd0 100644 --- a/src/packages/ce/src/ui-dashboard/application/ApplicationBreadcrumbView.tsx +++ b/src/packages/ce/src/application/ApplicationBreadcrumbView.tsx @@ -4,12 +4,12 @@ import React from "react"; import {Badge, Breadcrumb, Text, useService, useStore} from "@code0-tech/pictor"; import {useParams, usePathname, useRouter} from "next/navigation"; import type {Namespace, NamespaceProject, NamespaceRole, Runtime, User} from "@code0-tech/sagittarius-graphql-types"; -import {NamespaceService} from "@edition/namespace/Namespace.service"; -import {RuntimeService} from "@edition/runtime/Runtime.service"; -import {UserService} from "@edition/user/User.service"; -import {ProjectService} from "@edition/project/Project.service"; -import {RoleService} from "@edition/role/Role.service"; -import {OrganizationService} from "@edition/organization/Organization.service"; +import {NamespaceService} from "@edition/namespace/services/Namespace.service"; +import {RuntimeService} from "@edition/runtime/services/Runtime.service"; +import {UserService} from "@edition/user/services/User.service"; +import {ProjectService} from "@edition/project/services/Project.service"; +import {RoleService} from "@edition/role/services/Role.service"; +import {OrganizationService} from "@edition/organization/services/Organization.service"; export const ApplicationBreadcrumbView: React.FC = () => { diff --git a/src/packages/ce/src/ui-dashboard/application/ApplicationPage.tsx b/src/packages/ce/src/application/ApplicationPage.tsx similarity index 91% rename from src/packages/ce/src/ui-dashboard/application/ApplicationPage.tsx rename to src/packages/ce/src/application/ApplicationPage.tsx index a31f94f0..44fb68e7 100644 --- a/src/packages/ce/src/ui-dashboard/application/ApplicationPage.tsx +++ b/src/packages/ce/src/application/ApplicationPage.tsx @@ -1,5 +1,5 @@ -import {PersonalProjectsView} from "@edition/ui-dashboard/project/PersonalProjectsView"; -import {OrganizationsView} from "@edition/ui-dashboard/organization/OrganizationsView"; +import {PersonalProjectsView} from "@edition/project/views/PersonalProjectsView"; +import {OrganizationsView} from "@edition/organization/views/OrganizationsView"; import { Avatar, Badge, @@ -12,7 +12,7 @@ import { useStore, useUserSession } from "@code0-tech/pictor"; -import {UserService} from "@edition/user/User.service"; +import {UserService} from "@edition/user/services/User.service"; import React from "react"; import {hashToColor} from "@code0-tech/pictor/dist/components/d-flow/DFlow.util"; diff --git a/src/packages/ce/src/ui-dashboard/application/ApplicationSettingsPage.tsx b/src/packages/ce/src/application/ApplicationSettingsPage.tsx similarity index 99% rename from src/packages/ce/src/ui-dashboard/application/ApplicationSettingsPage.tsx rename to src/packages/ce/src/application/ApplicationSettingsPage.tsx index 901f77ce..93c4a382 100644 --- a/src/packages/ce/src/ui-dashboard/application/ApplicationSettingsPage.tsx +++ b/src/packages/ce/src/application/ApplicationSettingsPage.tsx @@ -16,7 +16,7 @@ import { useStore, useUserSession } from "@code0-tech/pictor"; -import {UserService} from "@edition/user/User.service"; +import {UserService} from "@edition/user/services/User.service"; import {notFound} from "next/navigation"; import {Tab, TabContent, TabList, TabTrigger} from "@code0-tech/pictor/dist/components/tab/Tab"; import {IconLayoutSidebar} from "@tabler/icons-react"; diff --git a/src/packages/ce/src/ui-dashboard/application/ApplicationTabView.tsx b/src/packages/ce/src/application/ApplicationTabView.tsx similarity index 93% rename from src/packages/ce/src/ui-dashboard/application/ApplicationTabView.tsx rename to src/packages/ce/src/application/ApplicationTabView.tsx index 7e92c73a..c03add64 100644 --- a/src/packages/ce/src/ui-dashboard/application/ApplicationTabView.tsx +++ b/src/packages/ce/src/application/ApplicationTabView.tsx @@ -5,9 +5,9 @@ import {Tab, TabList, TabTrigger} from "@code0-tech/pictor/dist/components/tab/T import {Badge, Button, Container, useService, useStore, useUserSession} from "@code0-tech/pictor"; import {IconBuilding, IconHome, IconServer, IconSettings, IconUser} from "@tabler/icons-react"; import {usePathname, useRouter} from "next/navigation"; -import {UserService} from "@edition/user/User.service"; -import {RuntimeService} from "@edition/runtime/Runtime.service"; -import {OrganizationService} from "@edition/organization/Organization.service"; +import {UserService} from "@edition/user/services/User.service"; +import {RuntimeService} from "@edition/runtime/services/Runtime.service"; +import {OrganizationService} from "@edition/organization/services/Organization.service"; import {hashToColor} from "@code0-tech/pictor/dist/components/d-flow/DFlow.util"; export const ApplicationTabView: React.FC = () => { diff --git a/src/packages/ce/src/datatype/Datatype.service.ts b/src/packages/ce/src/datatype/services/Datatype.service.ts similarity index 96% rename from src/packages/ce/src/datatype/Datatype.service.ts rename to src/packages/ce/src/datatype/services/Datatype.service.ts index 16f4f523..61f546ec 100644 --- a/src/packages/ce/src/datatype/Datatype.service.ts +++ b/src/packages/ce/src/datatype/services/Datatype.service.ts @@ -5,7 +5,7 @@ import { } from "@code0-tech/pictor"; import {GraphqlClient} from "@core/util/graphql-client"; import {DataType, Query} from "@code0-tech/sagittarius-graphql-types"; -import dataTypeQuery from "@edition/datatype/queries/DataTypes.query.graphql" +import dataTypeQuery from "@edition/datatype/services/queries/DataTypes.query.graphql" import {View} from "@code0-tech/pictor/dist/utils/view"; export class DatatypeService extends DFlowDataTypeReactiveService { diff --git a/src/packages/ce/src/datatype/fragments/DataType.basic.fragment.graphql b/src/packages/ce/src/datatype/services/fragments/DataType.basic.fragment.graphql similarity index 100% rename from src/packages/ce/src/datatype/fragments/DataType.basic.fragment.graphql rename to src/packages/ce/src/datatype/services/fragments/DataType.basic.fragment.graphql diff --git a/src/packages/ce/src/datatype/fragments/DataType.fragment.graphql b/src/packages/ce/src/datatype/services/fragments/DataType.fragment.graphql similarity index 91% rename from src/packages/ce/src/datatype/fragments/DataType.fragment.graphql rename to src/packages/ce/src/datatype/services/fragments/DataType.fragment.graphql index 2cc0a7a8..b2f6cc6e 100644 --- a/src/packages/ce/src/datatype/fragments/DataType.fragment.graphql +++ b/src/packages/ce/src/datatype/services/fragments/DataType.fragment.graphql @@ -1,4 +1,4 @@ -#import "../../function/fragments/DataTypeIdentifier.fragment.graphql" +#import "@edition/function/services/fragments/DataTypeIdentifier.fragment.graphql" #import "./DataTypeRule.fragment.graphql" fragment DataType on DataType { diff --git a/src/packages/ce/src/datatype/fragments/DataTypeRule.fragment.graphql b/src/packages/ce/src/datatype/services/fragments/DataTypeRule.fragment.graphql similarity index 100% rename from src/packages/ce/src/datatype/fragments/DataTypeRule.fragment.graphql rename to src/packages/ce/src/datatype/services/fragments/DataTypeRule.fragment.graphql diff --git a/src/packages/ce/src/datatype/queries/DataTypes.query.graphql b/src/packages/ce/src/datatype/services/queries/DataTypes.query.graphql similarity index 100% rename from src/packages/ce/src/datatype/queries/DataTypes.query.graphql rename to src/packages/ce/src/datatype/services/queries/DataTypes.query.graphql diff --git a/src/packages/ce/src/flow/Flow.service.ts b/src/packages/ce/src/flow/services/Flow.service.ts similarity index 94% rename from src/packages/ce/src/flow/Flow.service.ts rename to src/packages/ce/src/flow/services/Flow.service.ts index 9a752b4d..f7403d0a 100644 --- a/src/packages/ce/src/flow/Flow.service.ts +++ b/src/packages/ce/src/flow/services/Flow.service.ts @@ -12,10 +12,10 @@ import { Query, ReferenceValue } from "@code0-tech/sagittarius-graphql-types"; import {GraphqlClient} from "@core/util/graphql-client"; -import flowsQuery from "@edition/flow/queries/Flows.query.graphql"; -import flowCreateMutation from "@edition/flow/mutations/Flow.create.mutation.graphql"; -import flowDeleteMutation from "@edition/flow/mutations/Flow.delete.mutation.graphql"; -import flowUpdateMutation from "@edition/flow/mutations/Flow.update.mutation.graphql"; +import flowsQuery from "@edition/flow/services/queries/Flows.query.graphql"; +import flowCreateMutation from "@edition/flow/services/mutations/Flow.create.mutation.graphql"; +import flowDeleteMutation from "@edition/flow/services/mutations/Flow.delete.mutation.graphql"; +import flowUpdateMutation from "@edition/flow/services/mutations/Flow.update.mutation.graphql"; import {View} from "@code0-tech/pictor/dist/utils/view"; diff --git a/src/packages/ce/src/flow/fragments/Flow.basic.fragment.graphql b/src/packages/ce/src/flow/services/fragments/Flow.basic.fragment.graphql similarity index 100% rename from src/packages/ce/src/flow/fragments/Flow.basic.fragment.graphql rename to src/packages/ce/src/flow/services/fragments/Flow.basic.fragment.graphql diff --git a/src/packages/ce/src/flow/fragments/Flow.fragment.graphql b/src/packages/ce/src/flow/services/fragments/Flow.fragment.graphql similarity index 100% rename from src/packages/ce/src/flow/fragments/Flow.fragment.graphql rename to src/packages/ce/src/flow/services/fragments/Flow.fragment.graphql diff --git a/src/packages/ce/src/flow/mutations/Flow.create.mutation.graphql b/src/packages/ce/src/flow/services/mutations/Flow.create.mutation.graphql similarity index 100% rename from src/packages/ce/src/flow/mutations/Flow.create.mutation.graphql rename to src/packages/ce/src/flow/services/mutations/Flow.create.mutation.graphql diff --git a/src/packages/ce/src/flow/mutations/Flow.delete.mutation.graphql b/src/packages/ce/src/flow/services/mutations/Flow.delete.mutation.graphql similarity index 100% rename from src/packages/ce/src/flow/mutations/Flow.delete.mutation.graphql rename to src/packages/ce/src/flow/services/mutations/Flow.delete.mutation.graphql diff --git a/src/packages/ce/src/flow/mutations/Flow.update.mutation.graphql b/src/packages/ce/src/flow/services/mutations/Flow.update.mutation.graphql similarity index 100% rename from src/packages/ce/src/flow/mutations/Flow.update.mutation.graphql rename to src/packages/ce/src/flow/services/mutations/Flow.update.mutation.graphql diff --git a/src/packages/ce/src/flow/queries/Flows.query.graphql b/src/packages/ce/src/flow/services/queries/Flows.query.graphql similarity index 100% rename from src/packages/ce/src/flow/queries/Flows.query.graphql rename to src/packages/ce/src/flow/services/queries/Flows.query.graphql diff --git a/src/packages/ce/src/ui-flow/folder/FolderView.tsx b/src/packages/ce/src/flow/views/FolderView.tsx similarity index 99% rename from src/packages/ce/src/ui-flow/folder/FolderView.tsx rename to src/packages/ce/src/flow/views/FolderView.tsx index 2731c081..6daa9cca 100644 --- a/src/packages/ce/src/ui-flow/folder/FolderView.tsx +++ b/src/packages/ce/src/flow/views/FolderView.tsx @@ -22,7 +22,7 @@ import { import {IconArrowsMaximize, IconArrowsMinimize, IconCircleDot, IconLayoutSidebar, IconPlus} from "@tabler/icons-react"; import {useParams, useRouter} from "next/navigation"; import {Flow, FlowType, NamespaceProject} from "@code0-tech/sagittarius-graphql-types"; -import {FlowService} from "@edition/flow/Flow.service"; +import {FlowService} from "@edition/flow/services/Flow.service"; import { DFlowFolderContextMenuGroupData, DFlowFolderContextMenuItemData diff --git a/src/packages/ce/src/flowtype/FlowTypeService.ts b/src/packages/ce/src/flowtype/services/FlowTypeService.ts similarity index 96% rename from src/packages/ce/src/flowtype/FlowTypeService.ts rename to src/packages/ce/src/flowtype/services/FlowTypeService.ts index c7f4f4fd..cffffe31 100644 --- a/src/packages/ce/src/flowtype/FlowTypeService.ts +++ b/src/packages/ce/src/flowtype/services/FlowTypeService.ts @@ -1,7 +1,7 @@ import {DFlowTypeDependencies, DFlowTypeReactiveService, FlowTypeView, ReactiveArrayStore} from "@code0-tech/pictor"; import {GraphqlClient} from "@core/util/graphql-client"; import {FlowType, Query} from "@code0-tech/sagittarius-graphql-types"; -import flowTypesQuery from "@edition/flowtype/queries/FlowTypes.query.graphql" +import flowTypesQuery from "@edition/flowtype/services/queries/FlowTypes.query.graphql" import {View} from "@code0-tech/pictor/dist/utils/view"; export class FlowTypeService extends DFlowTypeReactiveService { diff --git a/src/packages/ce/src/flowtype/fragments/FlowType.fragment.graphql b/src/packages/ce/src/flowtype/services/fragments/FlowType.fragment.graphql similarity index 89% rename from src/packages/ce/src/flowtype/fragments/FlowType.fragment.graphql rename to src/packages/ce/src/flowtype/services/fragments/FlowType.fragment.graphql index 5561cef1..b22d4754 100644 --- a/src/packages/ce/src/flowtype/fragments/FlowType.fragment.graphql +++ b/src/packages/ce/src/flowtype/services/fragments/FlowType.fragment.graphql @@ -1,6 +1,6 @@ -#import "../../function/fragments/DataTypeIdentifier.fragment.graphql" -#import "../../datatype/fragments/DataType.basic.fragment.graphql" -#import "../../datatype/fragments/DataTypeRule.fragment.graphql" +#import "@edition/function/services/fragments/DataTypeIdentifier.fragment.graphql" +#import "@edition/datatype/services/fragments/DataType.basic.fragment.graphql" +#import "@edition/datatype/services/fragments/DataTypeRule.fragment.graphql" fragment FlowType on FlowType { __typename diff --git a/src/packages/ce/src/flowtype/queries/FlowTypes.query.graphql b/src/packages/ce/src/flowtype/services/queries/FlowTypes.query.graphql similarity index 100% rename from src/packages/ce/src/flowtype/queries/FlowTypes.query.graphql rename to src/packages/ce/src/flowtype/services/queries/FlowTypes.query.graphql diff --git a/src/packages/ce/src/function/Function.service.ts b/src/packages/ce/src/function/services/Function.service.ts similarity index 96% rename from src/packages/ce/src/function/Function.service.ts rename to src/packages/ce/src/function/services/Function.service.ts index d4630fd3..c88beb79 100644 --- a/src/packages/ce/src/function/Function.service.ts +++ b/src/packages/ce/src/function/services/Function.service.ts @@ -6,7 +6,7 @@ import { } from "@code0-tech/pictor"; import {GraphqlClient} from "@core/util/graphql-client"; import {FunctionDefinition, Query} from "@code0-tech/sagittarius-graphql-types"; -import functionsQuery from "@edition/function/queries/Functions.query.graphql"; +import functionsQuery from "@edition/function/services/queries/Functions.query.graphql"; import {View} from "@code0-tech/pictor/dist/utils/view"; export class FunctionService extends DFlowFunctionReactiveService { diff --git a/src/packages/ce/src/function/fragments/DataTypeIdentifier.fragment.graphql b/src/packages/ce/src/function/services/fragments/DataTypeIdentifier.fragment.graphql similarity index 100% rename from src/packages/ce/src/function/fragments/DataTypeIdentifier.fragment.graphql rename to src/packages/ce/src/function/services/fragments/DataTypeIdentifier.fragment.graphql diff --git a/src/packages/ce/src/function/fragments/Function.fragment.graphql b/src/packages/ce/src/function/services/fragments/Function.fragment.graphql similarity index 100% rename from src/packages/ce/src/function/fragments/Function.fragment.graphql rename to src/packages/ce/src/function/services/fragments/Function.fragment.graphql diff --git a/src/packages/ce/src/function/queries/Functions.query.graphql b/src/packages/ce/src/function/services/queries/Functions.query.graphql similarity index 100% rename from src/packages/ce/src/function/queries/Functions.query.graphql rename to src/packages/ce/src/function/services/queries/Functions.query.graphql diff --git a/src/packages/ce/src/ui-dashboard/member/MemberAddPage.tsx b/src/packages/ce/src/member/pages/MemberAddPage.tsx similarity index 95% rename from src/packages/ce/src/ui-dashboard/member/MemberAddPage.tsx rename to src/packages/ce/src/member/pages/MemberAddPage.tsx index 0411b343..980136ea 100644 --- a/src/packages/ce/src/ui-dashboard/member/MemberAddPage.tsx +++ b/src/packages/ce/src/member/pages/MemberAddPage.tsx @@ -13,11 +13,11 @@ import { useService, useStore } from "@code0-tech/pictor"; -import {MemberService} from "@edition/member/Member.service"; +import {MemberService} from "@edition/member/services/Member.service"; import {useParams, useRouter} from "next/navigation"; import {Namespace} from "@code0-tech/sagittarius-graphql-types"; import Link from "next/link"; -import {UserService} from "@edition/user/User.service"; +import {UserService} from "@edition/user/services/User.service"; import {InputSyntaxSegment} from "@code0-tech/pictor/dist/components/form/Input.syntax.hook"; export const MemberAddPage: React.FC = () => { @@ -90,7 +90,7 @@ export const MemberAddPage: React.FC = () => { {...inputs.getInputProps("users")}/> - + diff --git a/src/packages/ce/src/ui-dashboard/member/MembersPage.tsx b/src/packages/ce/src/member/pages/MembersPage.tsx similarity index 81% rename from src/packages/ce/src/ui-dashboard/member/MembersPage.tsx rename to src/packages/ce/src/member/pages/MembersPage.tsx index c7b9e37b..8aea85be 100644 --- a/src/packages/ce/src/ui-dashboard/member/MembersPage.tsx +++ b/src/packages/ce/src/member/pages/MembersPage.tsx @@ -1,6 +1,6 @@ "use client" -import {MembersView} from "@edition/ui-dashboard/member/MembersView"; +import {MembersView} from "@edition/member/views/MembersView"; import React from "react"; export const MembersPage: React.FC = () => { diff --git a/src/packages/ce/src/member/Member.service.ts b/src/packages/ce/src/member/services/Member.service.ts similarity index 100% rename from src/packages/ce/src/member/Member.service.ts rename to src/packages/ce/src/member/services/Member.service.ts diff --git a/src/packages/ce/src/member/fragments/Member.basic.fragment.graphql b/src/packages/ce/src/member/services/fragments/Member.basic.fragment.graphql similarity index 65% rename from src/packages/ce/src/member/fragments/Member.basic.fragment.graphql rename to src/packages/ce/src/member/services/fragments/Member.basic.fragment.graphql index 9aac08c0..f68783d2 100644 --- a/src/packages/ce/src/member/fragments/Member.basic.fragment.graphql +++ b/src/packages/ce/src/member/services/fragments/Member.basic.fragment.graphql @@ -1,5 +1,5 @@ -#import "../../user/fragments/User.id.fragment.graphql" -#import "../../namespace/fragments/Namespace.id.fragment.graphql" +#import "@edition/user/services/fragments/User.id.fragment.graphql" +#import "@edition/namespace/services/fragments/Namespace.id.fragment.graphql" fragment BasicMember on NamespaceMember { id roles { diff --git a/src/packages/ce/src/member/fragments/Member.fragment.graphql b/src/packages/ce/src/member/services/fragments/Member.fragment.graphql similarity index 75% rename from src/packages/ce/src/member/fragments/Member.fragment.graphql rename to src/packages/ce/src/member/services/fragments/Member.fragment.graphql index bb28706e..e85742d8 100644 --- a/src/packages/ce/src/member/fragments/Member.fragment.graphql +++ b/src/packages/ce/src/member/services/fragments/Member.fragment.graphql @@ -1,5 +1,5 @@ -#import "../../user/fragments/User.id.fragment.graphql" -#import "../../namespace/fragments/Namespace.id.fragment.graphql" +#import "@edition/user/services/fragments/User.id.fragment.graphql" +#import "@edition/namespace/services/fragments/Namespace.id.fragment.graphql" fragment Member on NamespaceMember { id roles (first: $firstRole, after: $afterRole) { diff --git a/src/packages/ce/src/member/mutations/Member.assignRoles.mutation.graphql b/src/packages/ce/src/member/services/mutations/Member.assignRoles.mutation.graphql similarity index 100% rename from src/packages/ce/src/member/mutations/Member.assignRoles.mutation.graphql rename to src/packages/ce/src/member/services/mutations/Member.assignRoles.mutation.graphql diff --git a/src/packages/ce/src/member/mutations/Member.delete.mutation.graphql b/src/packages/ce/src/member/services/mutations/Member.delete.mutation.graphql similarity index 100% rename from src/packages/ce/src/member/mutations/Member.delete.mutation.graphql rename to src/packages/ce/src/member/services/mutations/Member.delete.mutation.graphql diff --git a/src/packages/ce/src/member/mutations/Member.invite.mutation.graphql b/src/packages/ce/src/member/services/mutations/Member.invite.mutation.graphql similarity index 100% rename from src/packages/ce/src/member/mutations/Member.invite.mutation.graphql rename to src/packages/ce/src/member/services/mutations/Member.invite.mutation.graphql diff --git a/src/packages/ce/src/member/queries/Members.query.graphql b/src/packages/ce/src/member/services/queries/Members.query.graphql similarity index 100% rename from src/packages/ce/src/member/queries/Members.query.graphql rename to src/packages/ce/src/member/services/queries/Members.query.graphql diff --git a/src/packages/ce/src/ui-dashboard/member/MembersView.tsx b/src/packages/ce/src/member/views/MembersView.tsx similarity index 96% rename from src/packages/ce/src/ui-dashboard/member/MembersView.tsx rename to src/packages/ce/src/member/views/MembersView.tsx index c9740c2f..575f5aef 100644 --- a/src/packages/ce/src/ui-dashboard/member/MembersView.tsx +++ b/src/packages/ce/src/member/views/MembersView.tsx @@ -4,7 +4,7 @@ import React from "react"; import {useParams} from "next/navigation"; import {Button, DNamespaceMemberList, Flex, Spacing, Text, useService, useStore} from "@code0-tech/pictor"; import Link from "next/link"; -import {MemberService} from "@edition/member/Member.service"; +import {MemberService} from "@edition/member/services/Member.service"; export const MembersView: React.FC = () => { diff --git a/src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewPage.tsx b/src/packages/ce/src/namespace/pages/NamespaceOverviewPage.tsx similarity index 78% rename from src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewPage.tsx rename to src/packages/ce/src/namespace/pages/NamespaceOverviewPage.tsx index ce1590ab..ad6402f2 100644 --- a/src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewPage.tsx +++ b/src/packages/ce/src/namespace/pages/NamespaceOverviewPage.tsx @@ -1,12 +1,12 @@ "use client" import React from "react"; -import {ProjectsView} from "@edition/ui-dashboard/project/ProjectsView"; +import {ProjectsView} from "@edition/project/views/ProjectsView"; import {DLayout, useService, useStore, useUserSession} from "@code0-tech/pictor"; -import {NamespaceOverviewRightView} from "@edition/ui-dashboard/namespace/NamespaceOverviewRightView"; -import {NamespaceOverviewLeftView} from "@edition/ui-dashboard/namespace/NamespaceOverviewLeftView"; +import {NamespaceOverviewRightView} from "@edition/namespace/views/NamespaceOverviewRightView"; +import {NamespaceOverviewLeftView} from "@edition/namespace/views/NamespaceOverviewLeftView"; import {useParams} from "next/navigation"; -import {UserService} from "@edition/user/User.service"; +import {UserService} from "@edition/user/services/User.service"; export const NamespaceOverviewPage: React.FC = () => { diff --git a/src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsCreatePage.tsx b/src/packages/ce/src/namespace/pages/NamespaceProjectsCreatePage.tsx similarity index 97% rename from src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsCreatePage.tsx rename to src/packages/ce/src/namespace/pages/NamespaceProjectsCreatePage.tsx index bffb4099..cab32b00 100644 --- a/src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsCreatePage.tsx +++ b/src/packages/ce/src/namespace/pages/NamespaceProjectsCreatePage.tsx @@ -4,7 +4,7 @@ import React from "react"; import {Button, Col, Flex, Spacing, Text, TextInput, toast, useForm, useService} from "@code0-tech/pictor"; import Link from "next/link"; import {useParams, useRouter} from "next/navigation"; -import {ProjectService} from "@edition/project/Project.service"; +import {ProjectService} from "@edition/project/services/Project.service"; import {Namespace} from "@code0-tech/sagittarius-graphql-types"; export const NamespaceProjectsCreatePage: React.FC = () => { @@ -87,7 +87,7 @@ export const NamespaceProjectsCreatePage: React.FC = () => { {...inputs.getInputProps("description")}/> - + diff --git a/src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsPage.tsx b/src/packages/ce/src/namespace/pages/NamespaceProjectsPage.tsx similarity index 81% rename from src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsPage.tsx rename to src/packages/ce/src/namespace/pages/NamespaceProjectsPage.tsx index 32ae387b..ea4da2bd 100644 --- a/src/packages/ce/src/ui-dashboard/namespace/NamespaceProjectsPage.tsx +++ b/src/packages/ce/src/namespace/pages/NamespaceProjectsPage.tsx @@ -1,6 +1,6 @@ "use client" -import {ProjectsView} from "@edition/ui-dashboard/project/ProjectsView"; +import {ProjectsView} from "@edition/project/views/ProjectsView"; import React from "react"; export const NamespaceProjectsPage: React.FC = () => { diff --git a/src/packages/ce/src/namespace/Namespace.service.ts b/src/packages/ce/src/namespace/services/Namespace.service.ts similarity index 100% rename from src/packages/ce/src/namespace/Namespace.service.ts rename to src/packages/ce/src/namespace/services/Namespace.service.ts diff --git a/src/packages/ce/src/namespace/fragments/Namespace.fragment.graphql b/src/packages/ce/src/namespace/services/fragments/Namespace.fragment.graphql similarity index 81% rename from src/packages/ce/src/namespace/fragments/Namespace.fragment.graphql rename to src/packages/ce/src/namespace/services/fragments/Namespace.fragment.graphql index 3e54c883..26755415 100644 --- a/src/packages/ce/src/namespace/fragments/Namespace.fragment.graphql +++ b/src/packages/ce/src/namespace/services/fragments/Namespace.fragment.graphql @@ -1,5 +1,5 @@ -#import "../../organization/fragments/Organization.id.fragment.graphql" -#import "../../user/fragments/User.id.fragment.graphql" +#import "@edition/organization/services/fragments/Organization.id.fragment.graphql" +#import "@edition/user/services/fragments/User.id.fragment.graphql" fragment Namespace on Namespace { __typename id diff --git a/src/packages/ce/src/namespace/fragments/Namespace.id.fragment.graphql b/src/packages/ce/src/namespace/services/fragments/Namespace.id.fragment.graphql similarity index 100% rename from src/packages/ce/src/namespace/fragments/Namespace.id.fragment.graphql rename to src/packages/ce/src/namespace/services/fragments/Namespace.id.fragment.graphql diff --git a/src/packages/ce/src/namespace/queries/Namespace.query.graphql b/src/packages/ce/src/namespace/services/queries/Namespace.query.graphql similarity index 100% rename from src/packages/ce/src/namespace/queries/Namespace.query.graphql rename to src/packages/ce/src/namespace/services/queries/Namespace.query.graphql diff --git a/src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewLeftView.tsx b/src/packages/ce/src/namespace/views/NamespaceOverviewLeftView.tsx similarity index 95% rename from src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewLeftView.tsx rename to src/packages/ce/src/namespace/views/NamespaceOverviewLeftView.tsx index f8443930..9b8140fb 100644 --- a/src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewLeftView.tsx +++ b/src/packages/ce/src/namespace/views/NamespaceOverviewLeftView.tsx @@ -1,8 +1,8 @@ import React from "react"; import {Avatar, Badge, Button, Flex, Spacing, Text, useService, useStore, useUserSession} from "@code0-tech/pictor"; -import {UserService} from "@edition/user/User.service"; +import {UserService} from "@edition/user/services/User.service"; import {IconMail, IconSparkles, IconUser, IconUserCog} from "@tabler/icons-react"; -import {OrganizationService} from "@edition/organization/Organization.service"; +import {OrganizationService} from "@edition/organization/services/Organization.service"; export const NamespaceOverviewLeftView: React.FC = () => { diff --git a/src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewRightView.tsx b/src/packages/ce/src/namespace/views/NamespaceOverviewRightView.tsx similarity index 93% rename from src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewRightView.tsx rename to src/packages/ce/src/namespace/views/NamespaceOverviewRightView.tsx index 36ef7b7f..7dc4a009 100644 --- a/src/packages/ce/src/ui-dashboard/namespace/NamespaceOverviewRightView.tsx +++ b/src/packages/ce/src/namespace/views/NamespaceOverviewRightView.tsx @@ -18,10 +18,10 @@ import { useService, useStore } from "@code0-tech/pictor"; -import {MemberService} from "@edition/member/Member.service"; +import {MemberService} from "@edition/member/services/Member.service"; import {useParams} from "next/navigation"; -import {NamespaceService} from "@edition/namespace/Namespace.service"; -import {UserService} from "@edition/user/User.service"; +import {NamespaceService} from "@edition/namespace/services/Namespace.service"; +import {UserService} from "@edition/user/services/User.service"; import Link from "next/link"; export const NamespaceOverviewRightView: React.FC = () => { diff --git a/src/packages/ce/src/ui-dashboard/namespace/NamespaceTabView.tsx b/src/packages/ce/src/namespace/views/NamespaceTabView.tsx similarity index 90% rename from src/packages/ce/src/ui-dashboard/namespace/NamespaceTabView.tsx rename to src/packages/ce/src/namespace/views/NamespaceTabView.tsx index 6695537e..b5c4462a 100644 --- a/src/packages/ce/src/ui-dashboard/namespace/NamespaceTabView.tsx +++ b/src/packages/ce/src/namespace/views/NamespaceTabView.tsx @@ -5,12 +5,12 @@ import {Badge, Button, useService, useStore} from "@code0-tech/pictor"; import {Tab, TabList, TabTrigger} from "@code0-tech/pictor/dist/components/tab/Tab"; import {IconFolders, IconHome, IconServer, IconSettings, IconUserCog, IconUsers} from "@tabler/icons-react"; import {useParams, usePathname, useRouter} from "next/navigation"; -import {NamespaceService} from "@edition/namespace/Namespace.service"; -import {OrganizationService} from "@edition/organization/Organization.service"; -import {ProjectService} from "@edition/project/Project.service"; -import {RoleService} from "@edition/role/Role.service"; -import {MemberService} from "@edition/member/Member.service"; -import {RuntimeService} from "@edition/runtime/Runtime.service"; +import {NamespaceService} from "@edition/namespace/services/Namespace.service"; +import {OrganizationService} from "@edition/organization/services/Organization.service"; +import {ProjectService} from "@edition/project/services/Project.service"; +import {RoleService} from "@edition/role/services/Role.service"; +import {MemberService} from "@edition/member/services/Member.service"; +import {RuntimeService} from "@edition/runtime/services/Runtime.service"; import {hashToColor} from "@code0-tech/pictor/dist/components/d-flow/DFlow.util"; export const NamespaceTabView: React.FC = () => { diff --git a/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableComponent.tsx b/src/packages/ce/src/organization/components/OrganizationDataTableComponent.tsx similarity index 88% rename from src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableComponent.tsx rename to src/packages/ce/src/organization/components/OrganizationDataTableComponent.tsx index 8927cf98..5cb502d7 100644 --- a/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableComponent.tsx +++ b/src/packages/ce/src/organization/components/OrganizationDataTableComponent.tsx @@ -2,9 +2,9 @@ import React from "react"; import {DataTable, DataTableColumn, Text, useService, useStore} from "@code0-tech/pictor"; import {DataTableFilterProps, DataTableSortProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; import {Organization} from "@code0-tech/sagittarius-graphql-types"; -import {OrganizationDataTableRowComponent} from "@edition/ui-dashboard/organization/OrganizationDataTableRowComponent"; -import {OrganizationService} from "@edition/organization/Organization.service"; -import {MemberService} from "@edition/member/Member.service"; +import {OrganizationDataTableRowComponent} from "@edition/organization/components/OrganizationDataTableRowComponent"; +import {OrganizationService} from "@edition/organization/services/Organization.service"; +import {MemberService} from "@edition/member/services/Member.service"; export interface OrganizationDataTableComponentProps { sort?: DataTableSortProps diff --git a/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableFilterInputComponent.tsx b/src/packages/ce/src/organization/components/OrganizationDataTableFilterInputComponent.tsx similarity index 94% rename from src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableFilterInputComponent.tsx rename to src/packages/ce/src/organization/components/OrganizationDataTableFilterInputComponent.tsx index 1241d26f..4abd5813 100644 --- a/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableFilterInputComponent.tsx +++ b/src/packages/ce/src/organization/components/OrganizationDataTableFilterInputComponent.tsx @@ -8,9 +8,9 @@ import { } from "@code0-tech/pictor"; import {IconCheck} from "@tabler/icons-react"; import {DataTableFilterProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; -import {OrganizationService} from "@edition/organization/Organization.service"; -import {NamespaceService} from "@edition/namespace/Namespace.service"; -import {MemberService} from "@edition/member/Member.service"; +import {OrganizationService} from "@edition/organization/services/Organization.service"; +import {NamespaceService} from "@edition/namespace/services/Namespace.service"; +import {MemberService} from "@edition/member/services/Member.service"; export interface OrganizationDataTableFilterInputComponentProps { onChange: (filter: DataTableFilterProps) => void diff --git a/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableRowComponent.tsx b/src/packages/ce/src/organization/components/OrganizationDataTableRowComponent.tsx similarity index 93% rename from src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableRowComponent.tsx rename to src/packages/ce/src/organization/components/OrganizationDataTableRowComponent.tsx index 8d943d98..e3a5051b 100644 --- a/src/packages/ce/src/ui-dashboard/organization/OrganizationDataTableRowComponent.tsx +++ b/src/packages/ce/src/organization/components/OrganizationDataTableRowComponent.tsx @@ -12,10 +12,10 @@ import { useUserSession } from "@code0-tech/pictor"; import {IconLogout} from "@tabler/icons-react"; -import {OrganizationService} from "@edition/organization/Organization.service"; -import {NamespaceService} from "@edition/namespace/Namespace.service"; -import {MemberService} from "@edition/member/Member.service"; -import {UserService} from "@edition/user/User.service"; +import {OrganizationService} from "@edition/organization/services/Organization.service"; +import {NamespaceService} from "@edition/namespace/services/Namespace.service"; +import {MemberService} from "@edition/member/services/Member.service"; +import {UserService} from "@edition/user/services/User.service"; import {hashToColor} from "@code0-tech/pictor/dist/components/d-flow/DFlow.util"; import {formatDistanceToNow} from "date-fns"; diff --git a/src/packages/ce/src/ui-dashboard/organization/OrganizationCreatePage.tsx b/src/packages/ce/src/organization/pages/OrganizationCreatePage.tsx similarity index 96% rename from src/packages/ce/src/ui-dashboard/organization/OrganizationCreatePage.tsx rename to src/packages/ce/src/organization/pages/OrganizationCreatePage.tsx index 2703bf56..03bcf7d1 100644 --- a/src/packages/ce/src/ui-dashboard/organization/OrganizationCreatePage.tsx +++ b/src/packages/ce/src/organization/pages/OrganizationCreatePage.tsx @@ -2,7 +2,7 @@ import {Button, Col, Flex, Spacing, Text, TextInput, useForm, useService} from "@code0-tech/pictor"; import Link from "next/link"; -import {OrganizationService} from "@edition/organization/Organization.service"; +import {OrganizationService} from "@edition/organization/services/Organization.service"; import React from "react"; import {useRouter} from "next/navigation"; diff --git a/src/packages/ce/src/ui-dashboard/organization/OrganizationSettingsPage.tsx b/src/packages/ce/src/organization/pages/OrganizationSettingsPage.tsx similarity index 88% rename from src/packages/ce/src/ui-dashboard/organization/OrganizationSettingsPage.tsx rename to src/packages/ce/src/organization/pages/OrganizationSettingsPage.tsx index 2a3fabb9..063e30a3 100644 --- a/src/packages/ce/src/ui-dashboard/organization/OrganizationSettingsPage.tsx +++ b/src/packages/ce/src/organization/pages/OrganizationSettingsPage.tsx @@ -15,14 +15,14 @@ import { useService, useStore } from "@code0-tech/pictor"; -import {NamespaceService} from "@edition/namespace/Namespace.service"; -import {OrganizationService} from "@edition/organization/Organization.service"; +import {NamespaceService} from "@edition/namespace/services/Namespace.service"; +import {OrganizationService} from "@edition/organization/services/Organization.service"; import {IconLayoutSidebar} from "@tabler/icons-react"; import {Tab, TabContent, TabList, TabTrigger} from "@code0-tech/pictor/dist/components/tab/Tab"; -import {UsageView} from "@edition/ui-dashboard/usage/UsageView"; -import {OrganizationUpgradeView} from "@edition/ui-dashboard/organization/OrganizationUpgradeView"; -import {OrganizationDeleteView} from "@edition/ui-dashboard/organization/OrganizationDeleteView"; -import {OrganizationGeneralSettingsView} from "@edition/ui-dashboard/organization/OrganizationGeneralSettingsView"; +import {UsageView} from "@edition/runtime/views/UsageView"; +import {OrganizationUpgradeView} from "@edition/organization/views/OrganizationUpgradeView"; +import {OrganizationDeleteView} from "@edition/organization/views/OrganizationDeleteView"; +import {OrganizationGeneralSettingsView} from "@edition/organization/views/OrganizationGeneralSettingsView"; export const OrganizationSettingsPage: React.FC = () => { diff --git a/src/packages/ce/src/ui-dashboard/organization/OrganizationsPage.tsx b/src/packages/ce/src/organization/pages/OrganizationsPage.tsx similarity index 78% rename from src/packages/ce/src/ui-dashboard/organization/OrganizationsPage.tsx rename to src/packages/ce/src/organization/pages/OrganizationsPage.tsx index a87a0573..5717f34d 100644 --- a/src/packages/ce/src/ui-dashboard/organization/OrganizationsPage.tsx +++ b/src/packages/ce/src/organization/pages/OrganizationsPage.tsx @@ -1,7 +1,7 @@ "use client" import React from "react"; -import {OrganizationsView} from "@edition/ui-dashboard/organization/OrganizationsView"; +import {OrganizationsView} from "@edition/organization/views/OrganizationsView"; export const OrganizationsPage = () => { return
{ diff --git a/src/packages/ce/src/ui-dashboard/organization/OrganizationGeneralSettingsView.tsx b/src/packages/ce/src/organization/views/OrganizationGeneralSettingsView.tsx similarity index 94% rename from src/packages/ce/src/ui-dashboard/organization/OrganizationGeneralSettingsView.tsx rename to src/packages/ce/src/organization/views/OrganizationGeneralSettingsView.tsx index 8cd1957b..2b32ed3b 100644 --- a/src/packages/ce/src/ui-dashboard/organization/OrganizationGeneralSettingsView.tsx +++ b/src/packages/ce/src/organization/views/OrganizationGeneralSettingsView.tsx @@ -4,8 +4,8 @@ import React from "react"; import CardSection from "@code0-tech/pictor/dist/components/card/CardSection"; import {Button, Card, Flex, Spacing, Text, TextInput, toast, useForm, useService, useStore} from "@code0-tech/pictor"; import {useParams} from "next/navigation"; -import {NamespaceService} from "@edition/namespace/Namespace.service"; -import {OrganizationService} from "@edition/organization/Organization.service"; +import {NamespaceService} from "@edition/namespace/services/Namespace.service"; +import {OrganizationService} from "@edition/organization/services/Organization.service"; import {Namespace} from "@code0-tech/sagittarius-graphql-types"; export const OrganizationGeneralSettingsView: React.FC = () => { diff --git a/src/packages/ce/src/ui-dashboard/organization/OrganizationUpgradeView.tsx b/src/packages/ce/src/organization/views/OrganizationUpgradeView.tsx similarity index 100% rename from src/packages/ce/src/ui-dashboard/organization/OrganizationUpgradeView.tsx rename to src/packages/ce/src/organization/views/OrganizationUpgradeView.tsx diff --git a/src/packages/ce/src/ui-dashboard/organization/OrganizationsView.tsx b/src/packages/ce/src/organization/views/OrganizationsView.tsx similarity index 96% rename from src/packages/ce/src/ui-dashboard/organization/OrganizationsView.tsx rename to src/packages/ce/src/organization/views/OrganizationsView.tsx index 931eb107..03e6c5d1 100644 --- a/src/packages/ce/src/ui-dashboard/organization/OrganizationsView.tsx +++ b/src/packages/ce/src/organization/views/OrganizationsView.tsx @@ -14,10 +14,10 @@ import { import Link from "next/link"; import React from "react"; import {useRouter} from "next/navigation"; -import {OrganizationDataTableComponent} from "@edition/ui-dashboard/organization/OrganizationDataTableComponent"; +import {OrganizationDataTableComponent} from "@edition/organization/components/OrganizationDataTableComponent"; import { OrganizationDataTableFilterInputComponent -} from "@edition/ui-dashboard/organization/OrganizationDataTableFilterInputComponent"; +} from "@edition/organization/components/OrganizationDataTableFilterInputComponent"; import {DataTableFilterProps, DataTableSortProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; import {ButtonGroup} from "@code0-tech/pictor/dist/components/button-group/ButtonGroup"; import {IconMinus, IconSortAscending, IconSortDescending} from "@tabler/icons-react"; diff --git a/src/packages/ce/src/ui-dashboard/project/ProjectDataTableComponent.tsx b/src/packages/ce/src/project/components/ProjectDataTableComponent.tsx similarity index 89% rename from src/packages/ce/src/ui-dashboard/project/ProjectDataTableComponent.tsx rename to src/packages/ce/src/project/components/ProjectDataTableComponent.tsx index 5a578613..1286e3d5 100644 --- a/src/packages/ce/src/ui-dashboard/project/ProjectDataTableComponent.tsx +++ b/src/packages/ce/src/project/components/ProjectDataTableComponent.tsx @@ -2,8 +2,8 @@ import React from "react"; import {DataTable, DataTableColumn, Text, useService, useStore} from "@code0-tech/pictor"; import {DataTableFilterProps, DataTableSortProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; import {Namespace, NamespaceProject} from "@code0-tech/sagittarius-graphql-types"; -import {ProjectService} from "@edition/project/Project.service"; -import {ProjectDataTableRowComponent} from "@edition/ui-dashboard/project/ProjectDataTableRowComponent"; +import {ProjectService} from "@edition/project/services/Project.service"; +import {ProjectDataTableRowComponent} from "@edition/project/components/ProjectDataTableRowComponent"; export interface ProjectDataTableComponentProps { namespaceId: Namespace["id"] diff --git a/src/packages/ce/src/ui-dashboard/project/ProjectDataTableFilterInputComponent.tsx b/src/packages/ce/src/project/components/ProjectDataTableFilterInputComponent.tsx similarity index 96% rename from src/packages/ce/src/ui-dashboard/project/ProjectDataTableFilterInputComponent.tsx rename to src/packages/ce/src/project/components/ProjectDataTableFilterInputComponent.tsx index 1af1e930..ea640a80 100644 --- a/src/packages/ce/src/ui-dashboard/project/ProjectDataTableFilterInputComponent.tsx +++ b/src/packages/ce/src/project/components/ProjectDataTableFilterInputComponent.tsx @@ -9,8 +9,8 @@ import { import {IconCheck} from "@tabler/icons-react"; import {Namespace} from "@code0-tech/sagittarius-graphql-types"; import {DataTableFilterProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; -import {ProjectService} from "@edition/project/Project.service"; -import {RuntimeService} from "@edition/runtime/Runtime.service"; +import {ProjectService} from "@edition/project/services/Project.service"; +import {RuntimeService} from "@edition/runtime/services/Runtime.service"; export interface ProjectDataTableFilterInputComponentProps { namespaceId: Namespace['id'] diff --git a/src/packages/ce/src/ui-dashboard/project/ProjectDataTableRowComponent.tsx b/src/packages/ce/src/project/components/ProjectDataTableRowComponent.tsx similarity index 94% rename from src/packages/ce/src/ui-dashboard/project/ProjectDataTableRowComponent.tsx rename to src/packages/ce/src/project/components/ProjectDataTableRowComponent.tsx index 42426e4e..6b534489 100644 --- a/src/packages/ce/src/ui-dashboard/project/ProjectDataTableRowComponent.tsx +++ b/src/packages/ce/src/project/components/ProjectDataTableRowComponent.tsx @@ -1,8 +1,8 @@ import React from "react"; import {NamespaceProject} from "@code0-tech/sagittarius-graphql-types"; import {Avatar, DataTableColumn, Flex, Text, useService, useStore} from "@code0-tech/pictor"; -import {ProjectService} from "@edition/project/Project.service"; -import {RuntimeService} from "@edition/runtime/Runtime.service"; +import {ProjectService} from "@edition/project/services/Project.service"; +import {RuntimeService} from "@edition/runtime/services/Runtime.service"; import {hashToColor} from "@code0-tech/pictor/dist/components/d-flow/DFlow.util"; import {formatDistanceToNow} from "date-fns"; diff --git a/src/packages/ce/src/ui-dashboard/project/ProjectSettingsPage.tsx b/src/packages/ce/src/project/pages/ProjectSettingsPage.tsx similarity index 90% rename from src/packages/ce/src/ui-dashboard/project/ProjectSettingsPage.tsx rename to src/packages/ce/src/project/pages/ProjectSettingsPage.tsx index f85e40f0..edec0b74 100644 --- a/src/packages/ce/src/ui-dashboard/project/ProjectSettingsPage.tsx +++ b/src/packages/ce/src/project/pages/ProjectSettingsPage.tsx @@ -5,9 +5,9 @@ import {Tab, TabList, TabTrigger} from "@code0-tech/pictor/dist/components/tab/T import React from "react"; import {Button, DResizableHandle, DResizablePanel, DResizablePanelGroup, Flex, Text} from "@code0-tech/pictor"; import {IconLayoutSidebar} from "@tabler/icons-react"; -import {ProjectSettingsGeneralView} from "@edition/ui-dashboard/project/ProjectSettingsGeneralView"; -import {ProjectSettingsRuntimesView} from "@edition/ui-dashboard/project/ProjectSettingsRuntimesView"; -import {ProjectSettingsDeleteView} from "@edition/ui-dashboard/project/ProjectSettingsDeleteView"; +import {ProjectSettingsGeneralView} from "@edition/project/views/ProjectSettingsGeneralView"; +import {ProjectSettingsRuntimesView} from "@edition/project/views/ProjectSettingsRuntimesView"; +import {ProjectSettingsDeleteView} from "@edition/project/views/ProjectSettingsDeleteView"; export const ProjectSettingsPage: React.FC = () => { return diff --git a/src/packages/ce/src/project/Project.service.ts b/src/packages/ce/src/project/services/Project.service.ts similarity index 100% rename from src/packages/ce/src/project/Project.service.ts rename to src/packages/ce/src/project/services/Project.service.ts diff --git a/src/packages/ce/src/project/fragments/Project.basic.fragment.graphql b/src/packages/ce/src/project/services/fragments/Project.basic.fragment.graphql similarity index 86% rename from src/packages/ce/src/project/fragments/Project.basic.fragment.graphql rename to src/packages/ce/src/project/services/fragments/Project.basic.fragment.graphql index efee302a..7cc10685 100644 --- a/src/packages/ce/src/project/fragments/Project.basic.fragment.graphql +++ b/src/packages/ce/src/project/services/fragments/Project.basic.fragment.graphql @@ -1,4 +1,4 @@ -#import "../../runtime/fragments/Runtime.id.fragment.graphql" +#import "@edition/runtime/services/fragments/Runtime.id.fragment.graphql" fragment BasicProject on NamespaceProject { __typename id diff --git a/src/packages/ce/src/project/fragments/Project.fragment.graphql b/src/packages/ce/src/project/services/fragments/Project.fragment.graphql similarity index 93% rename from src/packages/ce/src/project/fragments/Project.fragment.graphql rename to src/packages/ce/src/project/services/fragments/Project.fragment.graphql index c8351c0f..48911624 100644 --- a/src/packages/ce/src/project/fragments/Project.fragment.graphql +++ b/src/packages/ce/src/project/services/fragments/Project.fragment.graphql @@ -1,4 +1,4 @@ -#import "../../runtime/fragments/Runtime.id.fragment.graphql" +#import "@edition/runtime/services/fragments/Runtime.id.fragment.graphql" fragment Project on NamespaceProject { __typename id diff --git a/src/packages/ce/src/project/fragments/Project.id.fragment.graphql b/src/packages/ce/src/project/services/fragments/Project.id.fragment.graphql similarity index 100% rename from src/packages/ce/src/project/fragments/Project.id.fragment.graphql rename to src/packages/ce/src/project/services/fragments/Project.id.fragment.graphql diff --git a/src/packages/ce/src/project/mutations/Project.assignRuntimes.mutation.graphql b/src/packages/ce/src/project/services/mutations/Project.assignRuntimes.mutation.graphql similarity index 100% rename from src/packages/ce/src/project/mutations/Project.assignRuntimes.mutation.graphql rename to src/packages/ce/src/project/services/mutations/Project.assignRuntimes.mutation.graphql diff --git a/src/packages/ce/src/project/mutations/Project.create.mutation.graphql b/src/packages/ce/src/project/services/mutations/Project.create.mutation.graphql similarity index 100% rename from src/packages/ce/src/project/mutations/Project.create.mutation.graphql rename to src/packages/ce/src/project/services/mutations/Project.create.mutation.graphql diff --git a/src/packages/ce/src/project/mutations/Project.delete.mutation.graphql b/src/packages/ce/src/project/services/mutations/Project.delete.mutation.graphql similarity index 100% rename from src/packages/ce/src/project/mutations/Project.delete.mutation.graphql rename to src/packages/ce/src/project/services/mutations/Project.delete.mutation.graphql diff --git a/src/packages/ce/src/project/mutations/Project.update.mutation.graphql b/src/packages/ce/src/project/services/mutations/Project.update.mutation.graphql similarity index 100% rename from src/packages/ce/src/project/mutations/Project.update.mutation.graphql rename to src/packages/ce/src/project/services/mutations/Project.update.mutation.graphql diff --git a/src/packages/ce/src/project/queries/Projects.query.graphql b/src/packages/ce/src/project/services/queries/Projects.query.graphql similarity index 100% rename from src/packages/ce/src/project/queries/Projects.query.graphql rename to src/packages/ce/src/project/services/queries/Projects.query.graphql diff --git a/src/packages/ce/src/ui-dashboard/project/PersonalProjectsView.tsx b/src/packages/ce/src/project/views/PersonalProjectsView.tsx similarity index 95% rename from src/packages/ce/src/ui-dashboard/project/PersonalProjectsView.tsx rename to src/packages/ce/src/project/views/PersonalProjectsView.tsx index f0efad64..57b96325 100644 --- a/src/packages/ce/src/ui-dashboard/project/PersonalProjectsView.tsx +++ b/src/packages/ce/src/project/views/PersonalProjectsView.tsx @@ -13,12 +13,12 @@ import { useStore, useUserSession } from "@code0-tech/pictor"; -import {UserService} from "@edition/user/User.service"; +import {UserService} from "@edition/user/services/User.service"; import Link from "next/link"; import {useRouter} from "next/navigation"; -import {ProjectDataTableComponent} from "@edition/ui-dashboard/project/ProjectDataTableComponent"; +import {ProjectDataTableComponent} from "@edition/project/components/ProjectDataTableComponent"; import {DataTableFilterProps, DataTableSortProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; -import {ProjectDataTableFilterInputComponent} from "@edition/ui-dashboard/project/ProjectDataTableFilterInputComponent"; +import {ProjectDataTableFilterInputComponent} from "@edition/project/components/ProjectDataTableFilterInputComponent"; import {ButtonGroup} from "@code0-tech/pictor/dist/components/button-group/ButtonGroup"; import {IconMinus, IconSortAscending, IconSortDescending} from "@tabler/icons-react"; diff --git a/src/packages/ce/src/ui-dashboard/project/ProjectSettingsDeleteView.tsx b/src/packages/ce/src/project/views/ProjectSettingsDeleteView.tsx similarity index 100% rename from src/packages/ce/src/ui-dashboard/project/ProjectSettingsDeleteView.tsx rename to src/packages/ce/src/project/views/ProjectSettingsDeleteView.tsx diff --git a/src/packages/ce/src/ui-dashboard/project/ProjectSettingsGeneralView.tsx b/src/packages/ce/src/project/views/ProjectSettingsGeneralView.tsx similarity index 96% rename from src/packages/ce/src/ui-dashboard/project/ProjectSettingsGeneralView.tsx rename to src/packages/ce/src/project/views/ProjectSettingsGeneralView.tsx index 459d73b6..5ec0fb07 100644 --- a/src/packages/ce/src/ui-dashboard/project/ProjectSettingsGeneralView.tsx +++ b/src/packages/ce/src/project/views/ProjectSettingsGeneralView.tsx @@ -5,7 +5,7 @@ import {Button, Card, Flex, Spacing, Text, TextInput, useForm, useService, useSt import CardSection from "@code0-tech/pictor/dist/components/card/CardSection"; import {TabContent} from "@code0-tech/pictor/dist/components/tab/Tab"; import {useParams} from "next/navigation"; -import {ProjectService} from "@edition/project/Project.service"; +import {ProjectService} from "@edition/project/services/Project.service"; export const ProjectSettingsGeneralView: React.FC = () => { diff --git a/src/packages/ce/src/ui-dashboard/project/ProjectSettingsRuntimesView.tsx b/src/packages/ce/src/project/views/ProjectSettingsRuntimesView.tsx similarity index 91% rename from src/packages/ce/src/ui-dashboard/project/ProjectSettingsRuntimesView.tsx rename to src/packages/ce/src/project/views/ProjectSettingsRuntimesView.tsx index 87fc17bc..781b96aa 100644 --- a/src/packages/ce/src/ui-dashboard/project/ProjectSettingsRuntimesView.tsx +++ b/src/packages/ce/src/project/views/ProjectSettingsRuntimesView.tsx @@ -4,8 +4,8 @@ import React from "react" import {Button, DRuntimeCard, DRuntimeList, Flex, Spacing, Text, useService, useStore} from "@code0-tech/pictor"; import {TabContent} from "@code0-tech/pictor/dist/components/tab/Tab"; import {useParams} from "next/navigation"; -import {ProjectService} from "@edition/project/Project.service"; -import {RuntimeService} from "@edition/runtime/Runtime.service"; +import {ProjectService} from "@edition/project/services/Project.service"; +import {RuntimeService} from "@edition/runtime/services/Runtime.service"; export const ProjectSettingsRuntimesView: React.FC = () => { diff --git a/src/packages/ce/src/ui-dashboard/project/ProjectsView.tsx b/src/packages/ce/src/project/views/ProjectsView.tsx similarity index 96% rename from src/packages/ce/src/ui-dashboard/project/ProjectsView.tsx rename to src/packages/ce/src/project/views/ProjectsView.tsx index 02be7da7..65c76a19 100644 --- a/src/packages/ce/src/ui-dashboard/project/ProjectsView.tsx +++ b/src/packages/ce/src/project/views/ProjectsView.tsx @@ -15,11 +15,11 @@ import { } from "@code0-tech/pictor"; import Link from "next/link"; import {useParams, useRouter} from "next/navigation"; -import {ProjectDataTableComponent} from "@edition/ui-dashboard/project/ProjectDataTableComponent"; +import {ProjectDataTableComponent} from "@edition/project/components/ProjectDataTableComponent"; import {DataTableFilterProps, DataTableSortProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; import {ButtonGroup} from "@code0-tech/pictor/dist/components/button-group/ButtonGroup"; import {IconMinus, IconSortAscending, IconSortDescending} from "@tabler/icons-react"; -import {ProjectDataTableFilterInputComponent} from "@edition/ui-dashboard/project/ProjectDataTableFilterInputComponent"; +import {ProjectDataTableFilterInputComponent} from "@edition/project/components/ProjectDataTableFilterInputComponent"; //TODO: user abilities for project creation within namespace export const ProjectsView: React.FC = () => { diff --git a/src/packages/ce/src/ui-dashboard/role/RoleDataTableComponent.tsx b/src/packages/ce/src/role/components/RoleDataTableComponent.tsx similarity index 82% rename from src/packages/ce/src/ui-dashboard/role/RoleDataTableComponent.tsx rename to src/packages/ce/src/role/components/RoleDataTableComponent.tsx index ef6466c3..4f2703dd 100644 --- a/src/packages/ce/src/ui-dashboard/role/RoleDataTableComponent.tsx +++ b/src/packages/ce/src/role/components/RoleDataTableComponent.tsx @@ -2,10 +2,10 @@ import React from "react"; import {DataTable, DataTableColumn, Text, useService, useStore} from "@code0-tech/pictor"; import {DataTableFilterProps, DataTableSortProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; import {Namespace, NamespaceProject, NamespaceRole} from "@code0-tech/sagittarius-graphql-types"; -import {ProjectService} from "@edition/project/Project.service"; -import {ProjectDataTableRowComponent} from "@edition/ui-dashboard/project/ProjectDataTableRowComponent"; -import {RoleService} from "@edition/role/Role.service"; -import {RoleDataTableRowComponent} from "@edition/ui-dashboard/role/RoleDataTableRowComponent"; +import {ProjectService} from "@edition/project/services/Project.service"; +import {ProjectDataTableRowComponent} from "@edition/project/components/ProjectDataTableRowComponent"; +import {RoleService} from "@edition/role/services/Role.service"; +import {RoleDataTableRowComponent} from "@edition/role/components/RoleDataTableRowComponent"; export interface ProjectDataTableComponentProps { namespaceId: Namespace["id"] diff --git a/src/packages/ce/src/ui-dashboard/role/RoleDataTableFilterInputComponent.tsx b/src/packages/ce/src/role/components/RoleDataTableFilterInputComponent.tsx similarity index 98% rename from src/packages/ce/src/ui-dashboard/role/RoleDataTableFilterInputComponent.tsx rename to src/packages/ce/src/role/components/RoleDataTableFilterInputComponent.tsx index 56a747bf..353a20c8 100644 --- a/src/packages/ce/src/ui-dashboard/role/RoleDataTableFilterInputComponent.tsx +++ b/src/packages/ce/src/role/components/RoleDataTableFilterInputComponent.tsx @@ -9,7 +9,7 @@ import { import {IconCheck} from "@tabler/icons-react"; import {Namespace} from "@code0-tech/sagittarius-graphql-types"; import {DataTableFilterProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; -import {RoleService} from "@edition/role/Role.service"; +import {RoleService} from "@edition/role/services/Role.service"; export interface RoleDataTableFilterInputComponentProps { namespaceId: Namespace['id'] diff --git a/src/packages/ce/src/ui-dashboard/role/RoleDataTableRowComponent.tsx b/src/packages/ce/src/role/components/RoleDataTableRowComponent.tsx similarity index 89% rename from src/packages/ce/src/ui-dashboard/role/RoleDataTableRowComponent.tsx rename to src/packages/ce/src/role/components/RoleDataTableRowComponent.tsx index 6f486a84..dd89b097 100644 --- a/src/packages/ce/src/ui-dashboard/role/RoleDataTableRowComponent.tsx +++ b/src/packages/ce/src/role/components/RoleDataTableRowComponent.tsx @@ -1,11 +1,11 @@ import React from "react"; import {NamespaceProject, NamespaceRole} from "@code0-tech/sagittarius-graphql-types"; import {Avatar, DataTableColumn, Flex, Text, useService, useStore} from "@code0-tech/pictor"; -import {ProjectService} from "@edition/project/Project.service"; -import {RuntimeService} from "@edition/runtime/Runtime.service"; +import {ProjectService} from "@edition/project/services/Project.service"; +import {RuntimeService} from "@edition/runtime/services/Runtime.service"; import {hashToColor} from "@code0-tech/pictor/dist/components/d-flow/DFlow.util"; import {formatDistanceToNow} from "date-fns"; -import {RoleService} from "@edition/role/Role.service"; +import {RoleService} from "@edition/role/services/Role.service"; import {DNamespaceRolePermissions} from "@code0-tech/pictor/dist/components/d-role/DNamespaceRolePermissions"; export interface ProjectDataTableRowComponentProps { diff --git a/src/packages/ce/src/ui-dashboard/role/RoleCreatePage.tsx b/src/packages/ce/src/role/pages/RoleCreatePage.tsx similarity index 97% rename from src/packages/ce/src/ui-dashboard/role/RoleCreatePage.tsx rename to src/packages/ce/src/role/pages/RoleCreatePage.tsx index 7b162325..e529caa0 100644 --- a/src/packages/ce/src/ui-dashboard/role/RoleCreatePage.tsx +++ b/src/packages/ce/src/role/pages/RoleCreatePage.tsx @@ -31,7 +31,7 @@ export const RoleCreatePage: React.FC = () => { /> - + diff --git a/src/packages/ce/src/ui-dashboard/role/RoleSettingsPage.tsx b/src/packages/ce/src/role/pages/RoleSettingsPage.tsx similarity index 92% rename from src/packages/ce/src/ui-dashboard/role/RoleSettingsPage.tsx rename to src/packages/ce/src/role/pages/RoleSettingsPage.tsx index d28159aa..feb1f344 100644 --- a/src/packages/ce/src/ui-dashboard/role/RoleSettingsPage.tsx +++ b/src/packages/ce/src/role/pages/RoleSettingsPage.tsx @@ -14,10 +14,10 @@ import { Text } from "@code0-tech/pictor"; import {Tab, TabList, TabTrigger} from "@code0-tech/pictor/dist/components/tab/Tab"; -import {RoleProjectView} from "@edition/ui-dashboard/role/RoleProjectView"; -import {RolePermissionView} from "@edition/ui-dashboard/role/RolePermissionView"; -import {RoleGeneralAdjustmentView} from "@edition/ui-dashboard/role/RoleGeneralAdjustmentView"; -import {RoleDeleteView} from "@edition/ui-dashboard/role/RoleDeleteView"; +import {RoleProjectView} from "@edition/role/views/RoleProjectView"; +import {RolePermissionView} from "@edition/role/views/RolePermissionView"; +import {RoleGeneralAdjustmentView} from "@edition/role/views/RoleGeneralAdjustmentView"; +import {RoleDeleteView} from "@edition/role/views/RoleDeleteView"; import {IconLayoutSidebar} from "@tabler/icons-react"; export const RoleSettingsPage: React.FC = () => { diff --git a/src/packages/ce/src/ui-dashboard/role/RolesPage.tsx b/src/packages/ce/src/role/pages/RolesPage.tsx similarity index 63% rename from src/packages/ce/src/ui-dashboard/role/RolesPage.tsx rename to src/packages/ce/src/role/pages/RolesPage.tsx index 635c82b5..4e110b45 100644 --- a/src/packages/ce/src/ui-dashboard/role/RolesPage.tsx +++ b/src/packages/ce/src/role/pages/RolesPage.tsx @@ -1,7 +1,7 @@ "use client" import React from "react"; -import {RolesView} from "@edition/ui-dashboard/role/RolesView"; +import {RolesView} from "@edition/role/views/RolesView"; export const RolesPage: React.FC = () => { return diff --git a/src/packages/ce/src/role/Role.service.ts b/src/packages/ce/src/role/services/Role.service.ts similarity index 92% rename from src/packages/ce/src/role/Role.service.ts rename to src/packages/ce/src/role/services/Role.service.ts index e52fc04d..581c94ba 100644 --- a/src/packages/ce/src/role/Role.service.ts +++ b/src/packages/ce/src/role/services/Role.service.ts @@ -20,11 +20,11 @@ import { Query } from "@code0-tech/sagittarius-graphql-types" import {GraphqlClient} from "@core/util/graphql-client"; -import rolesQuery from "@edition/role/queries/Roles.query.graphql"; -import roleUpdateMutation from "@edition/role/mutations/Role.update.mutation.graphql"; -import roleDeleteMutation from "@edition/role/mutations/Role.delete.mutation.graphql"; -import roleAssignAbilitiesMutation from "@edition/role/mutations/Role.assignAbilities.mutation.graphql"; -import roleAssignProjectsMutation from "@edition/role/mutations/Role.assignProjects.mutation.graphql"; +import rolesQuery from "@edition/role/services/queries/Roles.query.graphql"; +import roleUpdateMutation from "@edition/role/services/mutations/Role.update.mutation.graphql"; +import roleDeleteMutation from "@edition/role/services/mutations/Role.delete.mutation.graphql"; +import roleAssignAbilitiesMutation from "@edition/role/services/mutations/Role.assignAbilities.mutation.graphql"; +import roleAssignProjectsMutation from "@edition/role/services/mutations/Role.assignProjects.mutation.graphql"; import {View} from "@code0-tech/pictor/dist/utils/view"; export class RoleService extends DNamespaceRoleReactiveService { diff --git a/src/packages/ce/src/role/fragments/Role.basic.fragment.graphql b/src/packages/ce/src/role/services/fragments/Role.basic.fragment.graphql similarity index 82% rename from src/packages/ce/src/role/fragments/Role.basic.fragment.graphql rename to src/packages/ce/src/role/services/fragments/Role.basic.fragment.graphql index eb91d664..f03ce7ac 100644 --- a/src/packages/ce/src/role/fragments/Role.basic.fragment.graphql +++ b/src/packages/ce/src/role/services/fragments/Role.basic.fragment.graphql @@ -1,4 +1,4 @@ -#import "../../namespace/fragments/Namespace.id.fragment.graphql" +#import "@edition/namespace/services/fragments/Namespace.id.fragment.graphql" fragment RoleBasic on NamespaceRole { __typename id diff --git a/src/packages/ce/src/role/fragments/Role.fragment.graphql b/src/packages/ce/src/role/services/fragments/Role.fragment.graphql similarity index 77% rename from src/packages/ce/src/role/fragments/Role.fragment.graphql rename to src/packages/ce/src/role/services/fragments/Role.fragment.graphql index 150f9d3f..177da517 100644 --- a/src/packages/ce/src/role/fragments/Role.fragment.graphql +++ b/src/packages/ce/src/role/services/fragments/Role.fragment.graphql @@ -1,5 +1,5 @@ -#import "../../namespace/fragments/Namespace.id.fragment.graphql" -#import "../../project/fragments/Project.id.fragment.graphql" +#import "@edition/namespace/services/fragments/Namespace.id.fragment.graphql" +#import "@edition/project/services/fragments/Project.id.fragment.graphql" fragment Role on NamespaceRole { __typename id diff --git a/src/packages/ce/src/role/fragments/Role.id.fragment.graphql b/src/packages/ce/src/role/services/fragments/Role.id.fragment.graphql similarity index 100% rename from src/packages/ce/src/role/fragments/Role.id.fragment.graphql rename to src/packages/ce/src/role/services/fragments/Role.id.fragment.graphql diff --git a/src/packages/ce/src/role/mutations/Role.assignAbilities.mutation.graphql b/src/packages/ce/src/role/services/mutations/Role.assignAbilities.mutation.graphql similarity index 100% rename from src/packages/ce/src/role/mutations/Role.assignAbilities.mutation.graphql rename to src/packages/ce/src/role/services/mutations/Role.assignAbilities.mutation.graphql diff --git a/src/packages/ce/src/role/mutations/Role.assignProjects.mutation.graphql b/src/packages/ce/src/role/services/mutations/Role.assignProjects.mutation.graphql similarity index 100% rename from src/packages/ce/src/role/mutations/Role.assignProjects.mutation.graphql rename to src/packages/ce/src/role/services/mutations/Role.assignProjects.mutation.graphql diff --git a/src/packages/ce/src/role/mutations/Role.create.mutation.graphql b/src/packages/ce/src/role/services/mutations/Role.create.mutation.graphql similarity index 100% rename from src/packages/ce/src/role/mutations/Role.create.mutation.graphql rename to src/packages/ce/src/role/services/mutations/Role.create.mutation.graphql diff --git a/src/packages/ce/src/role/mutations/Role.delete.mutation.graphql b/src/packages/ce/src/role/services/mutations/Role.delete.mutation.graphql similarity index 100% rename from src/packages/ce/src/role/mutations/Role.delete.mutation.graphql rename to src/packages/ce/src/role/services/mutations/Role.delete.mutation.graphql diff --git a/src/packages/ce/src/role/mutations/Role.update.mutation.graphql b/src/packages/ce/src/role/services/mutations/Role.update.mutation.graphql similarity index 100% rename from src/packages/ce/src/role/mutations/Role.update.mutation.graphql rename to src/packages/ce/src/role/services/mutations/Role.update.mutation.graphql diff --git a/src/packages/ce/src/role/queries/Roles.query.graphql b/src/packages/ce/src/role/services/queries/Roles.query.graphql similarity index 100% rename from src/packages/ce/src/role/queries/Roles.query.graphql rename to src/packages/ce/src/role/services/queries/Roles.query.graphql diff --git a/src/packages/ce/src/ui-dashboard/role/RoleDeleteView.tsx b/src/packages/ce/src/role/views/RoleDeleteView.tsx similarity index 96% rename from src/packages/ce/src/ui-dashboard/role/RoleDeleteView.tsx rename to src/packages/ce/src/role/views/RoleDeleteView.tsx index 4a712d29..3b65d92b 100644 --- a/src/packages/ce/src/ui-dashboard/role/RoleDeleteView.tsx +++ b/src/packages/ce/src/role/views/RoleDeleteView.tsx @@ -3,7 +3,7 @@ import React from "react"; import {useParams, useRouter} from "next/navigation"; import {Button, Card, Flex, Spacing, Text, toast, useService} from "@code0-tech/pictor"; -import {RoleService} from "@edition/role/Role.service"; +import {RoleService} from "@edition/role/services/Role.service"; import type {NamespaceRole} from "@code0-tech/sagittarius-graphql-types"; import {TabContent} from "@code0-tech/pictor/dist/components/tab/Tab"; diff --git a/src/packages/ce/src/ui-dashboard/role/RoleGeneralAdjustmentView.tsx b/src/packages/ce/src/role/views/RoleGeneralAdjustmentView.tsx similarity index 97% rename from src/packages/ce/src/ui-dashboard/role/RoleGeneralAdjustmentView.tsx rename to src/packages/ce/src/role/views/RoleGeneralAdjustmentView.tsx index c3a112fe..4efafb52 100644 --- a/src/packages/ce/src/ui-dashboard/role/RoleGeneralAdjustmentView.tsx +++ b/src/packages/ce/src/role/views/RoleGeneralAdjustmentView.tsx @@ -4,7 +4,7 @@ import React from "react"; import {Button, Card, Flex, Spacing, Text, TextInput, toast, useForm, useService, useStore} from "@code0-tech/pictor"; import CardSection from "@code0-tech/pictor/dist/components/card/CardSection"; import {TabContent} from "@code0-tech/pictor/dist/components/tab/Tab"; -import {RoleService} from "@edition/role/Role.service"; +import {RoleService} from "@edition/role/services/Role.service"; import type {Namespace, NamespaceRole} from "@code0-tech/sagittarius-graphql-types"; import {useParams} from "next/navigation"; diff --git a/src/packages/ce/src/ui-dashboard/role/RolePermissionView.tsx b/src/packages/ce/src/role/views/RolePermissionView.tsx similarity index 99% rename from src/packages/ce/src/ui-dashboard/role/RolePermissionView.tsx rename to src/packages/ce/src/role/views/RolePermissionView.tsx index c8cb4958..2017bfcc 100644 --- a/src/packages/ce/src/ui-dashboard/role/RolePermissionView.tsx +++ b/src/packages/ce/src/role/views/RolePermissionView.tsx @@ -21,7 +21,7 @@ import {DNamespaceRolePermissions} from "@code0-tech/pictor/dist/components/d-ro import CardSection from "@code0-tech/pictor/dist/components/card/CardSection"; import {TabContent} from "@code0-tech/pictor/dist/components/tab/Tab"; import {useParams} from "next/navigation"; -import {RoleService} from "@edition/role/Role.service"; +import {RoleService} from "@edition/role/services/Role.service"; type Permission = { label: string diff --git a/src/packages/ce/src/ui-dashboard/role/RoleProjectView.tsx b/src/packages/ce/src/role/views/RoleProjectView.tsx similarity index 98% rename from src/packages/ce/src/ui-dashboard/role/RoleProjectView.tsx rename to src/packages/ce/src/role/views/RoleProjectView.tsx index d33c3281..36e40da6 100644 --- a/src/packages/ce/src/ui-dashboard/role/RoleProjectView.tsx +++ b/src/packages/ce/src/role/views/RoleProjectView.tsx @@ -19,7 +19,7 @@ import {IconTrash} from "@tabler/icons-react"; import {TabContent} from "@code0-tech/pictor/dist/components/tab/Tab"; import React from "react"; import {useParams} from "next/navigation"; -import {RoleService} from "@edition/role/Role.service"; +import {RoleService} from "@edition/role/services/Role.service"; import type {Namespace, NamespaceRole, Scalars} from "@code0-tech/sagittarius-graphql-types"; export const RoleProjectView: React.FC = () => { diff --git a/src/packages/ce/src/ui-dashboard/role/RolesView.tsx b/src/packages/ce/src/role/views/RolesView.tsx similarity index 96% rename from src/packages/ce/src/ui-dashboard/role/RolesView.tsx rename to src/packages/ce/src/role/views/RolesView.tsx index d6a0e4b5..d06b0738 100644 --- a/src/packages/ce/src/ui-dashboard/role/RolesView.tsx +++ b/src/packages/ce/src/role/views/RolesView.tsx @@ -15,10 +15,10 @@ import { } from "@code0-tech/pictor"; import {IconMinus, IconSortAscending, IconSortDescending} from "@tabler/icons-react"; import Link from "next/link"; -import {RoleDataTableComponent} from "@edition/ui-dashboard/role/RoleDataTableComponent"; +import {RoleDataTableComponent} from "@edition/role/components/RoleDataTableComponent"; import {ButtonGroup} from "@code0-tech/pictor/dist/components/button-group/ButtonGroup"; import {DataTableFilterProps, DataTableSortProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; -import {RoleDataTableFilterInputComponent} from "@edition/ui-dashboard/role/RoleDataTableFilterInputComponent"; +import {RoleDataTableFilterInputComponent} from "@edition/role/components/RoleDataTableFilterInputComponent"; //TODO: user abilities for add role within namespace export const RolesView: React.FC = () => { diff --git a/src/packages/ce/src/ui-dashboard/runtime/RuntimeDataTableComponent.tsx b/src/packages/ce/src/runtime/components/RuntimeDataTableComponent.tsx similarity index 76% rename from src/packages/ce/src/ui-dashboard/runtime/RuntimeDataTableComponent.tsx rename to src/packages/ce/src/runtime/components/RuntimeDataTableComponent.tsx index 29650602..913e342f 100644 --- a/src/packages/ce/src/ui-dashboard/runtime/RuntimeDataTableComponent.tsx +++ b/src/packages/ce/src/runtime/components/RuntimeDataTableComponent.tsx @@ -2,12 +2,12 @@ import React from "react"; import {DataTable, DataTableColumn, Text, useService, useStore} from "@code0-tech/pictor"; import {DataTableFilterProps, DataTableSortProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; import {Namespace, NamespaceProject, NamespaceRole, Runtime} from "@code0-tech/sagittarius-graphql-types"; -import {ProjectService} from "@edition/project/Project.service"; -import {ProjectDataTableRowComponent} from "@edition/ui-dashboard/project/ProjectDataTableRowComponent"; -import {RoleService} from "@edition/role/Role.service"; -import {RoleDataTableRowComponent} from "@edition/ui-dashboard/role/RoleDataTableRowComponent"; -import {RuntimeService} from "@edition/runtime/Runtime.service"; -import {RuntimeDataTableRowComponent} from "@edition/ui-dashboard/runtime/RuntimeDataTableRowComponent"; +import {ProjectService} from "@edition/project/services/Project.service"; +import {ProjectDataTableRowComponent} from "@edition/project/components/ProjectDataTableRowComponent"; +import {RoleService} from "@edition/role/services/Role.service"; +import {RoleDataTableRowComponent} from "@edition/role/components/RoleDataTableRowComponent"; +import {RuntimeService} from "@edition/runtime/services/Runtime.service"; +import {RuntimeDataTableRowComponent} from "@edition/runtime/components/RuntimeDataTableRowComponent"; export interface ProjectDataTableComponentProps { namespaceId?: Namespace["id"] diff --git a/src/packages/ce/src/ui-dashboard/runtime/RuntimeDataTableFilterInputComponent.tsx b/src/packages/ce/src/runtime/components/RuntimeDataTableFilterInputComponent.tsx similarity index 98% rename from src/packages/ce/src/ui-dashboard/runtime/RuntimeDataTableFilterInputComponent.tsx rename to src/packages/ce/src/runtime/components/RuntimeDataTableFilterInputComponent.tsx index e6f62f9c..26868058 100644 --- a/src/packages/ce/src/ui-dashboard/runtime/RuntimeDataTableFilterInputComponent.tsx +++ b/src/packages/ce/src/runtime/components/RuntimeDataTableFilterInputComponent.tsx @@ -9,7 +9,7 @@ import { import {IconCheck} from "@tabler/icons-react"; import {Namespace} from "@code0-tech/sagittarius-graphql-types"; import {DataTableFilterProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; -import {RoleService} from "@edition/role/Role.service"; +import {RoleService} from "@edition/role/services/Role.service"; export interface RoleDataTableFilterInputComponentProps { namespaceId?: Namespace['id'] diff --git a/src/packages/ce/src/ui-dashboard/runtime/RuntimeDataTableRowComponent.tsx b/src/packages/ce/src/runtime/components/RuntimeDataTableRowComponent.tsx similarity index 95% rename from src/packages/ce/src/ui-dashboard/runtime/RuntimeDataTableRowComponent.tsx rename to src/packages/ce/src/runtime/components/RuntimeDataTableRowComponent.tsx index 576ff09d..74eefcb1 100644 --- a/src/packages/ce/src/ui-dashboard/runtime/RuntimeDataTableRowComponent.tsx +++ b/src/packages/ce/src/runtime/components/RuntimeDataTableRowComponent.tsx @@ -1,7 +1,7 @@ import React from "react"; import {Runtime} from "@code0-tech/sagittarius-graphql-types"; import {DataTableColumn, Flex, Text, useService, useStore, Badge} from "@code0-tech/pictor"; -import {RuntimeService} from "@edition/runtime/Runtime.service"; +import {RuntimeService} from "@edition/runtime/services/Runtime.service"; import {formatDistanceToNow} from "date-fns"; export interface ProjectDataTableRowComponentProps { diff --git a/src/packages/ce/src/ui-dashboard/runtime/RuntimeCreatePage.tsx b/src/packages/ce/src/runtime/pages/RuntimeCreatePage.tsx similarity index 96% rename from src/packages/ce/src/ui-dashboard/runtime/RuntimeCreatePage.tsx rename to src/packages/ce/src/runtime/pages/RuntimeCreatePage.tsx index c70ea5d1..f56077b1 100644 --- a/src/packages/ce/src/ui-dashboard/runtime/RuntimeCreatePage.tsx +++ b/src/packages/ce/src/runtime/pages/RuntimeCreatePage.tsx @@ -16,9 +16,9 @@ import { } from "@code0-tech/pictor"; import Link from "next/link"; import {notFound, useParams, useRouter} from "next/navigation"; -import {RuntimeService} from "@edition/runtime/Runtime.service"; -import {UserService} from "@edition/user/User.service"; -import {NamespaceService} from "@edition/namespace/Namespace.service"; +import {RuntimeService} from "@edition/runtime/services/Runtime.service"; +import {UserService} from "@edition/user/services/User.service"; +import {NamespaceService} from "@edition/namespace/services/Namespace.service"; export const RuntimeCreatePage: React.FC = () => { diff --git a/src/packages/ce/src/ui-dashboard/runtime/RuntimeSettingsPage.tsx b/src/packages/ce/src/runtime/pages/RuntimeSettingsPage.tsx similarity index 99% rename from src/packages/ce/src/ui-dashboard/runtime/RuntimeSettingsPage.tsx rename to src/packages/ce/src/runtime/pages/RuntimeSettingsPage.tsx index 66518366..447e047f 100644 --- a/src/packages/ce/src/ui-dashboard/runtime/RuntimeSettingsPage.tsx +++ b/src/packages/ce/src/runtime/pages/RuntimeSettingsPage.tsx @@ -16,7 +16,7 @@ import { useService, useStore } from "@code0-tech/pictor"; -import {RuntimeService} from "@edition/runtime/Runtime.service"; +import {RuntimeService} from "@edition/runtime/services/Runtime.service"; import {notFound, useParams, useRouter} from "next/navigation"; import {Tab, TabContent, TabList, TabTrigger} from "@code0-tech/pictor/dist/components/tab/Tab"; import CardSection from "@code0-tech/pictor/dist/components/card/CardSection"; diff --git a/src/packages/ce/src/ui-dashboard/runtime/RuntimesPage.tsx b/src/packages/ce/src/runtime/pages/RuntimesPage.tsx similarity index 93% rename from src/packages/ce/src/ui-dashboard/runtime/RuntimesPage.tsx rename to src/packages/ce/src/runtime/pages/RuntimesPage.tsx index 6d9d9001..7e79f259 100644 --- a/src/packages/ce/src/ui-dashboard/runtime/RuntimesPage.tsx +++ b/src/packages/ce/src/runtime/pages/RuntimesPage.tsx @@ -4,8 +4,8 @@ import React from "react"; import {Button, DRuntimeList, Flex, Spacing, Text, useService, useStore, useUserSession} from "@code0-tech/pictor"; import Link from "next/link"; import {notFound, useParams, useRouter} from "next/navigation"; -import {UserService} from "@edition/user/User.service"; -import {RuntimeDataTableComponent} from "@edition/ui-dashboard/runtime/RuntimeDataTableComponent"; +import {UserService} from "@edition/user/services/User.service"; +import {RuntimeDataTableComponent} from "@edition/runtime/components/RuntimeDataTableComponent"; export const RuntimesPage: React.FC = () => { diff --git a/src/packages/ce/src/runtime/Runtime.service.ts b/src/packages/ce/src/runtime/services/Runtime.service.ts similarity index 100% rename from src/packages/ce/src/runtime/Runtime.service.ts rename to src/packages/ce/src/runtime/services/Runtime.service.ts diff --git a/src/packages/ce/src/runtime/fragments/Runtime.fragment.graphql b/src/packages/ce/src/runtime/services/fragments/Runtime.fragment.graphql similarity index 100% rename from src/packages/ce/src/runtime/fragments/Runtime.fragment.graphql rename to src/packages/ce/src/runtime/services/fragments/Runtime.fragment.graphql diff --git a/src/packages/ce/src/runtime/fragments/Runtime.id.fragment.graphql b/src/packages/ce/src/runtime/services/fragments/Runtime.id.fragment.graphql similarity index 100% rename from src/packages/ce/src/runtime/fragments/Runtime.id.fragment.graphql rename to src/packages/ce/src/runtime/services/fragments/Runtime.id.fragment.graphql diff --git a/src/packages/ce/src/runtime/mutations/Runtime.create.mutation.graphql b/src/packages/ce/src/runtime/services/mutations/Runtime.create.mutation.graphql similarity index 100% rename from src/packages/ce/src/runtime/mutations/Runtime.create.mutation.graphql rename to src/packages/ce/src/runtime/services/mutations/Runtime.create.mutation.graphql diff --git a/src/packages/ce/src/runtime/mutations/Runtime.delete.mutation.graphql b/src/packages/ce/src/runtime/services/mutations/Runtime.delete.mutation.graphql similarity index 100% rename from src/packages/ce/src/runtime/mutations/Runtime.delete.mutation.graphql rename to src/packages/ce/src/runtime/services/mutations/Runtime.delete.mutation.graphql diff --git a/src/packages/ce/src/runtime/mutations/Runtime.rotateToken.mutation.graphql b/src/packages/ce/src/runtime/services/mutations/Runtime.rotateToken.mutation.graphql similarity index 100% rename from src/packages/ce/src/runtime/mutations/Runtime.rotateToken.mutation.graphql rename to src/packages/ce/src/runtime/services/mutations/Runtime.rotateToken.mutation.graphql diff --git a/src/packages/ce/src/runtime/mutations/Runtime.update.mutation.graphql b/src/packages/ce/src/runtime/services/mutations/Runtime.update.mutation.graphql similarity index 100% rename from src/packages/ce/src/runtime/mutations/Runtime.update.mutation.graphql rename to src/packages/ce/src/runtime/services/mutations/Runtime.update.mutation.graphql diff --git a/src/packages/ce/src/runtime/queries/Runtime.global.query.graphql b/src/packages/ce/src/runtime/services/queries/Runtime.global.query.graphql similarity index 100% rename from src/packages/ce/src/runtime/queries/Runtime.global.query.graphql rename to src/packages/ce/src/runtime/services/queries/Runtime.global.query.graphql diff --git a/src/packages/ce/src/runtime/queries/Runtime.namespace.query.graphql b/src/packages/ce/src/runtime/services/queries/Runtime.namespace.query.graphql similarity index 100% rename from src/packages/ce/src/runtime/queries/Runtime.namespace.query.graphql rename to src/packages/ce/src/runtime/services/queries/Runtime.namespace.query.graphql diff --git a/src/packages/ce/src/ui-dashboard/usage/UsageView.tsx b/src/packages/ce/src/runtime/views/UsageView.tsx similarity index 100% rename from src/packages/ce/src/ui-dashboard/usage/UsageView.tsx rename to src/packages/ce/src/runtime/views/UsageView.tsx diff --git a/src/packages/ce/src/ui-auth/UserEmailVerificationPage.tsx b/src/packages/ce/src/user/pages/UserEmailVerificationPage.tsx similarity index 97% rename from src/packages/ce/src/ui-auth/UserEmailVerificationPage.tsx rename to src/packages/ce/src/user/pages/UserEmailVerificationPage.tsx index 4c1199a6..bdc02e46 100644 --- a/src/packages/ce/src/ui-auth/UserEmailVerificationPage.tsx +++ b/src/packages/ce/src/user/pages/UserEmailVerificationPage.tsx @@ -2,7 +2,7 @@ import React from "react"; import {Button, setUserSession, Text, TextInput, useForm, useService} from "@code0-tech/pictor"; -import {UserService} from "@edition/user/User.service"; +import {UserService} from "@edition/user/services/User.service"; import Link from "next/link"; import Image from "next/image"; import {useRouter} from "next/navigation"; diff --git a/src/packages/ce/src/ui-auth/UserForgotPasswordPage.tsx b/src/packages/ce/src/user/pages/UserForgotPasswordPage.tsx similarity index 97% rename from src/packages/ce/src/ui-auth/UserForgotPasswordPage.tsx rename to src/packages/ce/src/user/pages/UserForgotPasswordPage.tsx index 739e8af8..40144c35 100644 --- a/src/packages/ce/src/ui-auth/UserForgotPasswordPage.tsx +++ b/src/packages/ce/src/user/pages/UserForgotPasswordPage.tsx @@ -2,7 +2,7 @@ import React from "react"; import {Button, EmailInput, emailValidation, Text, useForm, useService} from "@code0-tech/pictor"; -import {UserService} from "@edition/user/User.service"; +import {UserService} from "@edition/user/services/User.service"; import Link from "next/link"; import Image from "next/image"; import {useRouter} from "next/navigation"; diff --git a/src/packages/ce/src/ui-auth/UserLoginPage.tsx b/src/packages/ce/src/user/pages/UserLoginPage.tsx similarity index 98% rename from src/packages/ce/src/ui-auth/UserLoginPage.tsx rename to src/packages/ce/src/user/pages/UserLoginPage.tsx index e116c0e1..190587c7 100644 --- a/src/packages/ce/src/ui-auth/UserLoginPage.tsx +++ b/src/packages/ce/src/user/pages/UserLoginPage.tsx @@ -13,7 +13,7 @@ import { useForm, useService } from "@code0-tech/pictor"; -import {UserService} from "@edition/user/User.service"; +import {UserService} from "@edition/user/services/User.service"; import Image from "next/image"; import Link from "next/link"; import {useRouter, useSearchParams} from "next/navigation"; diff --git a/src/packages/ce/src/ui-auth/UserRegistrationPage.tsx b/src/packages/ce/src/user/pages/UserRegistrationPage.tsx similarity index 98% rename from src/packages/ce/src/ui-auth/UserRegistrationPage.tsx rename to src/packages/ce/src/user/pages/UserRegistrationPage.tsx index 9d4d3d3d..354b8177 100644 --- a/src/packages/ce/src/ui-auth/UserRegistrationPage.tsx +++ b/src/packages/ce/src/user/pages/UserRegistrationPage.tsx @@ -14,7 +14,7 @@ import { } from "@code0-tech/pictor"; import Image from "next/image"; import Link from "next/link"; -import {UserService} from "@edition/user/User.service"; +import {UserService} from "@edition/user/services/User.service"; import {useRouter} from "next/navigation"; export const UserRegistrationPage: React.FC = () => { diff --git a/src/packages/ce/src/ui-auth/UserResetPasswordPage.tsx b/src/packages/ce/src/user/pages/UserResetPasswordPage.tsx similarity index 98% rename from src/packages/ce/src/ui-auth/UserResetPasswordPage.tsx rename to src/packages/ce/src/user/pages/UserResetPasswordPage.tsx index c1d9c75a..b9d4ba14 100644 --- a/src/packages/ce/src/ui-auth/UserResetPasswordPage.tsx +++ b/src/packages/ce/src/user/pages/UserResetPasswordPage.tsx @@ -2,7 +2,7 @@ import React from "react"; import {Alert, Button, PasswordInput, Spacing, Text, TextInput, useForm, useService} from "@code0-tech/pictor"; -import {UserService} from "@edition/user/User.service"; +import {UserService} from "@edition/user/services/User.service"; import Link from "next/link"; import Image from "next/image"; import {useRouter, useSearchParams} from "next/navigation"; diff --git a/src/packages/ce/src/ui-dashboard/user/UsersPage.tsx b/src/packages/ce/src/user/pages/UsersPage.tsx similarity index 95% rename from src/packages/ce/src/ui-dashboard/user/UsersPage.tsx rename to src/packages/ce/src/user/pages/UsersPage.tsx index 49107ef8..8d41ea17 100644 --- a/src/packages/ce/src/ui-dashboard/user/UsersPage.tsx +++ b/src/packages/ce/src/user/pages/UsersPage.tsx @@ -2,7 +2,7 @@ import React from "react"; import {Button, DUserList, Flex, Spacing, Text, useService, useStore, useUserSession,} from "@code0-tech/pictor"; -import {UserService} from "@edition/user/User.service"; +import {UserService} from "@edition/user/services/User.service"; import {notFound} from "next/navigation"; export const UsersPage: React.FC = () => { diff --git a/src/packages/ce/src/user/User.service.ts b/src/packages/ce/src/user/services/User.service.ts similarity index 100% rename from src/packages/ce/src/user/User.service.ts rename to src/packages/ce/src/user/services/User.service.ts diff --git a/src/packages/ce/src/user/fragments/User.basic.fragment.graphql b/src/packages/ce/src/user/services/fragments/User.basic.fragment.graphql similarity index 100% rename from src/packages/ce/src/user/fragments/User.basic.fragment.graphql rename to src/packages/ce/src/user/services/fragments/User.basic.fragment.graphql diff --git a/src/packages/ce/src/user/fragments/User.fragment.graphql b/src/packages/ce/src/user/services/fragments/User.fragment.graphql similarity index 81% rename from src/packages/ce/src/user/fragments/User.fragment.graphql rename to src/packages/ce/src/user/services/fragments/User.fragment.graphql index 90282af6..187ec202 100644 --- a/src/packages/ce/src/user/fragments/User.fragment.graphql +++ b/src/packages/ce/src/user/services/fragments/User.fragment.graphql @@ -1,5 +1,5 @@ -#import "../identity/fragments/Identity.fragment.graphql" -#import "../session/fragments/Session.fragment.graphql" +#import "@edition/user/services/identity/fragments/Identity.fragment.graphql" +#import "@edition/user/services/session/fragments/Session.fragment.graphql" fragment User on User { __typename admin diff --git a/src/packages/ce/src/user/fragments/User.id.fragment.graphql b/src/packages/ce/src/user/services/fragments/User.id.fragment.graphql similarity index 100% rename from src/packages/ce/src/user/fragments/User.id.fragment.graphql rename to src/packages/ce/src/user/services/fragments/User.id.fragment.graphql diff --git a/src/packages/ce/src/user/identity/fragments/Identity.fragment.graphql b/src/packages/ce/src/user/services/identity/fragments/Identity.fragment.graphql similarity index 100% rename from src/packages/ce/src/user/identity/fragments/Identity.fragment.graphql rename to src/packages/ce/src/user/services/identity/fragments/Identity.fragment.graphql diff --git a/src/packages/ce/src/user/mutations/User.emailVerification.mutation.graphql b/src/packages/ce/src/user/services/mutations/User.emailVerification.mutation.graphql similarity index 100% rename from src/packages/ce/src/user/mutations/User.emailVerification.mutation.graphql rename to src/packages/ce/src/user/services/mutations/User.emailVerification.mutation.graphql diff --git a/src/packages/ce/src/user/mutations/User.login.mutation.graphql b/src/packages/ce/src/user/services/mutations/User.login.mutation.graphql similarity index 100% rename from src/packages/ce/src/user/mutations/User.login.mutation.graphql rename to src/packages/ce/src/user/services/mutations/User.login.mutation.graphql diff --git a/src/packages/ce/src/user/mutations/User.logout.mutation.graphql b/src/packages/ce/src/user/services/mutations/User.logout.mutation.graphql similarity index 100% rename from src/packages/ce/src/user/mutations/User.logout.mutation.graphql rename to src/packages/ce/src/user/services/mutations/User.logout.mutation.graphql diff --git a/src/packages/ce/src/user/mutations/User.passwordReset.mutation.graphql b/src/packages/ce/src/user/services/mutations/User.passwordReset.mutation.graphql similarity index 100% rename from src/packages/ce/src/user/mutations/User.passwordReset.mutation.graphql rename to src/packages/ce/src/user/services/mutations/User.passwordReset.mutation.graphql diff --git a/src/packages/ce/src/user/mutations/User.passwordResetRequest.mutation.graphql b/src/packages/ce/src/user/services/mutations/User.passwordResetRequest.mutation.graphql similarity index 100% rename from src/packages/ce/src/user/mutations/User.passwordResetRequest.mutation.graphql rename to src/packages/ce/src/user/services/mutations/User.passwordResetRequest.mutation.graphql diff --git a/src/packages/ce/src/user/mutations/User.register.mutation.graphql b/src/packages/ce/src/user/services/mutations/User.register.mutation.graphql similarity index 100% rename from src/packages/ce/src/user/mutations/User.register.mutation.graphql rename to src/packages/ce/src/user/services/mutations/User.register.mutation.graphql diff --git a/src/packages/ce/src/user/queries/User.byId.query.graphql b/src/packages/ce/src/user/services/queries/User.byId.query.graphql similarity index 100% rename from src/packages/ce/src/user/queries/User.byId.query.graphql rename to src/packages/ce/src/user/services/queries/User.byId.query.graphql diff --git a/src/packages/ce/src/user/queries/User.byUsername.query.graphql b/src/packages/ce/src/user/services/queries/User.byUsername.query.graphql similarity index 100% rename from src/packages/ce/src/user/queries/User.byUsername.query.graphql rename to src/packages/ce/src/user/services/queries/User.byUsername.query.graphql diff --git a/src/packages/ce/src/user/queries/Users.query.graphql b/src/packages/ce/src/user/services/queries/Users.query.graphql similarity index 100% rename from src/packages/ce/src/user/queries/Users.query.graphql rename to src/packages/ce/src/user/services/queries/Users.query.graphql diff --git a/src/packages/ce/src/user/session/fragments/Session.fragment.graphql b/src/packages/ce/src/user/services/session/fragments/Session.fragment.graphql similarity index 100% rename from src/packages/ce/src/user/session/fragments/Session.fragment.graphql rename to src/packages/ce/src/user/services/session/fragments/Session.fragment.graphql From e31c0102e9d1e490d255969d2dffe67960639c33 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sat, 14 Feb 2026 14:53:53 +0100 Subject: [PATCH 138/173] feat: add FlowCreateDialogComponent for creating new flows with type selection and validation --- .../components/FlowCreateDialogComponent.tsx | 226 ++++++++++++++++++ 1 file changed, 226 insertions(+) create mode 100644 src/packages/ce/src/flow/components/FlowCreateDialogComponent.tsx diff --git a/src/packages/ce/src/flow/components/FlowCreateDialogComponent.tsx b/src/packages/ce/src/flow/components/FlowCreateDialogComponent.tsx new file mode 100644 index 00000000..0d5c6c4a --- /dev/null +++ b/src/packages/ce/src/flow/components/FlowCreateDialogComponent.tsx @@ -0,0 +1,226 @@ +import React, {startTransition} from "react"; +import {FlowType, NamespaceProject} from "@code0-tech/sagittarius-graphql-types"; +import {IconArrowDown, IconArrowUp, IconCornerDownLeft, IconFile} from "@tabler/icons-react"; +import { + Badge, + Button, + Card, + Dialog, + DialogClose, + DialogContent, + DialogOverlay, + DialogPortal, + Flex, + InputDescription, + InputLabel, + InputMessage, + Menu, + MenuContent, + MenuItem, + MenuLabel, + MenuPortal, + MenuTrigger, + Spacing, + Text, + toast, + useForm, + useService, + useStore +} from "@code0-tech/pictor"; +import {hashToColor} from "@code0-tech/pictor/dist/components/d-flow/DFlow.util"; +import {FlowTypeService} from "@edition/flowtype/services/FlowTypeService"; +import {FlowNameInputComponent} from "@edition/flow/components/FlowNameInputComponent"; +import {ButtonGroup} from "@code0-tech/pictor/dist/components/button-group/ButtonGroup"; +import {useParams, useRouter} from "next/navigation"; +import {ProjectService} from "@edition/project/services/Project.service"; +import {RuntimeService} from "@edition/runtime/services/Runtime.service"; +import {FlowService} from "@edition/flow/services/Flow.service"; + +export interface FlowCreateDialogComponentProps { + open?: boolean + onOpenChange?: (open: boolean) => void + flowTypeId?: FlowType['id'] +} + +export const FlowCreateDialogComponent: React.FC = (props) => { + + const {open, onOpenChange, flowTypeId} = props + + const params = useParams() + const router = useRouter() + const flowService = useService(FlowService) + const flowTypeService = useService(FlowTypeService) + const flowTypeStore = useStore(FlowTypeService) + const projectService = useService(ProjectService) + const projectStore = useStore(ProjectService) + const runtimeService = useService(RuntimeService) + const runtimeStore = useStore(RuntimeService) + + const projectIndex = params.projectId as any as number + const projectId: NamespaceProject['id'] = `gid://sagittarius/NamespaceProject/${projectIndex}` + + const [createDialogOpen, setCreateDialogOpen] = React.useState(open) + const [selectedFlowTypeId, setSelectedFlowTypeId] = React.useState(flowTypeId) + + const selectedFlowType = React.useMemo(() => { + return flowTypeService.getById(selectedFlowTypeId) + }, [selectedFlowTypeId, flowTypeStore]) + + const initialValues = React.useMemo( + () => ({name: null, flowTypeId: flowTypeId ?? null}), + [] + ) + + const project = React.useMemo( + () => projectService.getById(projectId), + [projectStore, projectId] + ) + + const primaryRuntime = React.useMemo( + () => runtimeService.getById(project?.primaryRuntime?.id), + [project, runtimeStore] + ) + + const flowTypes = primaryRuntime?.id ? React.useMemo( + () => flowTypeService.values({runtimeId: primaryRuntime?.id}), + [flowTypeStore] + ) : [] + + const createFlow = React.useCallback((name: string, type: FlowType['id']) => { + if (!type) return + startTransition(() => { + flowService.flowCreate({ + // @ts-ignore + flow: { + settings: [], + name: name, + type: type, + nodes: [], + }, + projectId: projectId + }).then(payload => { + if ((payload?.errors?.length ?? 0) <= 0) { + toast({ + title: "The flow was successfully created.", + color: "success", + dismissible: true, + }) + + } + }) + }) + }, []) + + React.useEffect(() => { + setCreateDialogOpen(open) + }, [open]) + + const [inputs, validate] = useForm({ + initialValues: initialValues, + validate: { + name: (value) => { + if (!value) return "Name is required" + return null + }, + flowTypeId: (value) => { + if (!value) return "Flow type is required" + return null + } + }, + onSubmit: (values) => { + createFlow?.(values.name!, values.flowTypeId) + onOpenChange?.(false) + } + }) + + return onOpenChange?.(open)}> + + + + + {!primaryRuntime?.id ? <> + + You don't have a primary runtime yet, assign and/or create a runtime to be able to create flows. + + + + + + + + + + + + : ( + <> + Type of flow + You can choose a flow type here + + + + + + + + {flowTypes.map((flowType) => ( + { + inputs.getInputProps("flowTypeId").formValidation?.setValue(flowType.id) + setSelectedFlowTypeId(flowType.id) + }}> + {flowType.names?.[0].content} + + ))} + + + + + + + + + move + + + + + select + + + + + + + {!inputs.getInputProps("flowTypeId").formValidation?.valid ? + {inputs.getInputProps("flowTypeId").formValidation?.notValidMessage!} : null} + + + + + + + + + + + )} + + + +} \ No newline at end of file From 049509611ee1ca28a4541108f43661294c614a16 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sat, 14 Feb 2026 14:54:02 +0100 Subject: [PATCH 139/173] feat: add FlowNameInputComponent with path syntax highlighting and badge rendering --- .../components/FlowNameInputComponent.tsx | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/packages/ce/src/flow/components/FlowNameInputComponent.tsx diff --git a/src/packages/ce/src/flow/components/FlowNameInputComponent.tsx b/src/packages/ce/src/flow/components/FlowNameInputComponent.tsx new file mode 100644 index 00000000..6aff18fc --- /dev/null +++ b/src/packages/ce/src/flow/components/FlowNameInputComponent.tsx @@ -0,0 +1,47 @@ +import React from "react"; +import {TextInputProps, InputSuggestion, InputSyntaxSegment, TextInput, Badge} from "@code0-tech/pictor" + +export interface FlowNameInputComponentProps extends TextInputProps { + +} + +export const FlowNameInputComponent: React.FC = (props) => { + + const {...rest} = props + + const transformSyntax = ( + value?: string | null, + _: (InputSuggestion | any)[] = [], + ): InputSyntaxSegment[] => { + + const normalizePath = (s: string) => { + const r = [], b = "" + let buf = b + s.split("").forEach(c => + c === "/" + ? (buf && r.push(buf), buf = "", r.push("/")) + : buf += c + ) + buf && r.push(buf) + return r + }; + const splitValue = normalizePath(value ?? "") + let cursor = 0 + + return splitValue.map((value, index) => { + const segment = { + type: splitValue.length - 1 !== index ? "block" : "text", + value: value, + start: cursor, + end: cursor + value.length, + visualLength: splitValue.length - 1 !== index ? 1 : value.length, + content: splitValue.length - 1 !== index ? {value} : value, + } + cursor += value.length + return [segment] + }).flat() as InputSyntaxSegment[] + + } + + return +} From 4111f492e296fae25c8d0464a78fe39abd683200 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sat, 14 Feb 2026 14:54:11 +0100 Subject: [PATCH 140/173] feat: filter FlowTypeService values by runtimeId and improve dependency checks --- src/packages/ce/src/flowtype/services/FlowTypeService.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/packages/ce/src/flowtype/services/FlowTypeService.ts b/src/packages/ce/src/flowtype/services/FlowTypeService.ts index cffffe31..15824221 100644 --- a/src/packages/ce/src/flowtype/services/FlowTypeService.ts +++ b/src/packages/ce/src/flowtype/services/FlowTypeService.ts @@ -16,14 +16,14 @@ export class FlowTypeService extends DFlowTypeReactiveService { values(dependencies?: DFlowTypeDependencies): FlowTypeView[] { const functions = super.values() - if (!dependencies?.namespaceId || !dependencies.projectId || !dependencies.runtimeId) return functions + if (!dependencies?.runtimeId) return functions const namespaceId = dependencies.namespaceId const projectId = dependencies.projectId const runtimeId = dependencies.runtimeId - const filtered = functions.filter(flowType => flowType) //TODO: add runtime filter when available + const filtered = functions.filter(flowType => flowType.runtime?.id === runtimeId) - if (filtered.length <= 0) { + if (filtered.length <= 0 && namespaceId && projectId) { this.client.query({ query: flowTypesQuery, variables: { From 8c88ee1b8c012dc17adcbfe9a9ed9c27086629fb Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sat, 14 Feb 2026 14:54:17 +0100 Subject: [PATCH 141/173] feat: replace inline flow creation logic in FolderView with FlowCreateDialogComponent --- src/packages/ce/src/flow/views/FolderView.tsx | 81 ++++++------------- 1 file changed, 26 insertions(+), 55 deletions(-) diff --git a/src/packages/ce/src/flow/views/FolderView.tsx b/src/packages/ce/src/flow/views/FolderView.tsx index 6daa9cca..691f5be6 100644 --- a/src/packages/ce/src/flow/views/FolderView.tsx +++ b/src/packages/ce/src/flow/views/FolderView.tsx @@ -4,12 +4,10 @@ import React from "react"; import { Button, DFlowFolder, - DFlowFolderCreateDialog, DFlowFolderDeleteDialog, DFlowFolderHandle, DLayout, Flex, - Spacing, Text, toast, Tooltip, @@ -21,13 +19,14 @@ import { } from "@code0-tech/pictor"; import {IconArrowsMaximize, IconArrowsMinimize, IconCircleDot, IconLayoutSidebar, IconPlus} from "@tabler/icons-react"; import {useParams, useRouter} from "next/navigation"; -import {Flow, FlowType, NamespaceProject} from "@code0-tech/sagittarius-graphql-types"; +import {Flow, FlowType} from "@code0-tech/sagittarius-graphql-types"; import {FlowService} from "@edition/flow/services/Flow.service"; import { DFlowFolderContextMenuGroupData, DFlowFolderContextMenuItemData } from "@code0-tech/pictor/dist/components/d-flow-folder/DFlowFolderContextMenu"; import {ButtonGroup} from "@code0-tech/pictor/dist/components/button-group/ButtonGroup"; +import {FlowCreateDialogComponent} from "@edition/flow/components/FlowCreateDialogComponent"; export const FolderView: React.FC = () => { @@ -35,6 +34,11 @@ export const FolderView: React.FC = () => { const params = useParams() const flowService = useService(FlowService) + const namespaceIndex = params.namespaceId as any as number + const projectIndex = params.projectId as any as number + const flowIndex = params.flowId as any as number + const flowId: Flow['id'] = `gid://sagittarius/Flow/${flowIndex}` + const [, startTransition] = React.useTransition() const ref = React.useRef(null) @@ -48,37 +52,6 @@ export const FolderView: React.FC = () => { type: "folder" }) - const namespaceIndex = params.namespaceId as any as number - const projectIndex = params.projectId as any as number - const flowIndex = params.flowId as any as number - const flowId: Flow['id'] = `gid://sagittarius/Flow/${flowIndex}` - const projectId: NamespaceProject['id'] = `gid://sagittarius/NamespaceProject/${projectIndex}` - - const createFlow = React.useCallback((name: string, type: FlowType['id']) => { - if (!type) return - startTransition(() => { - flowService.flowCreate({ - // @ts-ignore - flow: { - settings: [], - name: name, - type: type, - nodes: [], - }, - projectId: projectId - }).then(payload => { - if ((payload?.errors?.length ?? 0) <= 0) { - toast({ - title: "The flow was successfully created.", - color: "success", - dismissible: true, - }) - - } - }) - }) - }, [flowService]) - const deleteFlow = React.useCallback((flow: Flow) => { if (!flow?.id) return startTransition(() => { @@ -95,15 +68,13 @@ export const FolderView: React.FC = () => { } }) }) - }, [flowService]) + }, []) return <> - setCreateDialogOpen(open)} - onCreate={createFlow} - flowTypeId={flowTypeId}/> + setCreateDialogOpen(open)} + flowTypeId={flowTypeId}/> setDeleteDialogOpen(open)} @@ -182,21 +153,21 @@ export const FolderView: React.FC = () => { }> - { - const number = flow.id?.match(/Flow\/(\d+)$/)?.[1] - router.push(`/namespace/${namespaceIndex}/project/${projectIndex}/flow/${number}`) - }} - onCreate={flowTypeId => { - setCreateDialogOpen(true) - setFlowTypeId(flowTypeId) - }} - onDelete={contextData => { - setDeleteDialogOpen(true) - setContextData(contextData) - }} - namespaceId={`gid://sagittarius/Namespace/${namespaceIndex}`} - projectId={`gid://sagittarius/NamespaceProject/${projectIndex}`}/> + { + const number = flow.id?.match(/Flow\/(\d+)$/)?.[1] + router.push(`/namespace/${namespaceIndex}/project/${projectIndex}/flow/${number}`) + }} + onCreate={flowTypeId => { + setCreateDialogOpen(true) + setFlowTypeId(flowTypeId) + }} + onDelete={contextData => { + setDeleteDialogOpen(true) + setContextData(contextData) + }} + namespaceId={`gid://sagittarius/Namespace/${namespaceIndex}`} + projectId={`gid://sagittarius/NamespaceProject/${projectIndex}`}/> } \ No newline at end of file From 1e2553647192435ccae895ef01b94e4644a7cef4 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sat, 14 Feb 2026 14:54:43 +0100 Subject: [PATCH 142/173] refactor: rename FolderView to FlowFolderView and update imports --- .../[namespaceId]/project/[projectId]/flow/layout.tsx | 4 ++-- .../ce/src/flow/views/{FolderView.tsx => FlowFolderView.tsx} | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/packages/ce/src/flow/views/{FolderView.tsx => FlowFolderView.tsx} (99%) diff --git a/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/layout.tsx b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/layout.tsx index 5d91943e..7212ef2e 100644 --- a/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/layout.tsx +++ b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/layout.tsx @@ -2,7 +2,7 @@ import React from "react"; import {DResizableHandle, DResizablePanel, DResizablePanelGroup} from "@code0-tech/pictor"; -import {FolderView} from "@edition/flow/views/FolderView"; +import {FlowFolderView} from "@edition/flow/views/FlowFolderView"; interface ApplicationLayoutProps { children: React.ReactNode @@ -14,7 +14,7 @@ const ApplicationLayout: React.FC = ({children, bar, tab return - + {children} diff --git a/src/packages/ce/src/flow/views/FolderView.tsx b/src/packages/ce/src/flow/views/FlowFolderView.tsx similarity index 99% rename from src/packages/ce/src/flow/views/FolderView.tsx rename to src/packages/ce/src/flow/views/FlowFolderView.tsx index 691f5be6..47f6638d 100644 --- a/src/packages/ce/src/flow/views/FolderView.tsx +++ b/src/packages/ce/src/flow/views/FlowFolderView.tsx @@ -28,7 +28,7 @@ import { import {ButtonGroup} from "@code0-tech/pictor/dist/components/button-group/ButtonGroup"; import {FlowCreateDialogComponent} from "@edition/flow/components/FlowCreateDialogComponent"; -export const FolderView: React.FC = () => { +export const FlowFolderView: React.FC = () => { const router = useRouter() const params = useParams() From 40f639d0c3b5393b4e3f51a2e6a53fe9c80cd4dd Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sat, 14 Feb 2026 16:12:23 +0100 Subject: [PATCH 143/173] refactor: remove hashToColor usage from IconSettings and IconHome in tab views --- src/packages/ce/src/application/ApplicationTabView.tsx | 4 ++-- src/packages/ce/src/namespace/views/NamespaceTabView.tsx | 9 ++------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/packages/ce/src/application/ApplicationTabView.tsx b/src/packages/ce/src/application/ApplicationTabView.tsx index c03add64..d0ab27c2 100644 --- a/src/packages/ce/src/application/ApplicationTabView.tsx +++ b/src/packages/ce/src/application/ApplicationTabView.tsx @@ -44,7 +44,7 @@ export const ApplicationTabView: React.FC = () => { @@ -56,7 +56,7 @@ export const ApplicationTabView: React.FC = () => { diff --git a/src/packages/ce/src/namespace/views/NamespaceTabView.tsx b/src/packages/ce/src/namespace/views/NamespaceTabView.tsx index b5c4462a..7233599f 100644 --- a/src/packages/ce/src/namespace/views/NamespaceTabView.tsx +++ b/src/packages/ce/src/namespace/views/NamespaceTabView.tsx @@ -24,11 +24,6 @@ export const NamespaceTabView: React.FC = () => { const namespaceStore = useStore(NamespaceService) const organizationService = useService(OrganizationService) const organizationStore = useStore(OrganizationService) - const projectService = useService(ProjectService) - const roleService = useService(RoleService) - const memberService = useService(MemberService) - const runtimeService = useService(RuntimeService) - const runtimeStore = useStore(RuntimeService) const namespace = React.useMemo(() => namespaceService.getById(`gid://sagittarius/Namespace/${namespaceId}`), [namespaceStore, namespaceId]) const parentOrganization = React.useMemo(() => namespace?.parent?.__typename === "Organization" ? organizationService.getById(namespace?.parent?.id) : null, [organizationStore, namespace]) @@ -51,7 +46,7 @@ export const NamespaceTabView: React.FC = () => { ) ? ( ) : null @@ -61,7 +56,7 @@ export const NamespaceTabView: React.FC = () => { From 11de1d75820484117c6d193d7b7ef0ddbc5e4e96 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sat, 14 Feb 2026 16:46:07 +0100 Subject: [PATCH 144/173] feat: enhance FlowCreateDialogComponent to filter flow types by project and namespace --- .../src/flow/components/FlowCreateDialogComponent.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/packages/ce/src/flow/components/FlowCreateDialogComponent.tsx b/src/packages/ce/src/flow/components/FlowCreateDialogComponent.tsx index 0d5c6c4a..44f46e47 100644 --- a/src/packages/ce/src/flow/components/FlowCreateDialogComponent.tsx +++ b/src/packages/ce/src/flow/components/FlowCreateDialogComponent.tsx @@ -77,14 +77,14 @@ export const FlowCreateDialogComponent: React.FC ) const primaryRuntime = React.useMemo( - () => runtimeService.getById(project?.primaryRuntime?.id), + () => runtimeService.values({namespaceId: project?.namespace?.id}).find(runtime => runtime.id == project?.primaryRuntime?.id), [project, runtimeStore] ) - const flowTypes = primaryRuntime?.id ? React.useMemo( - () => flowTypeService.values({runtimeId: primaryRuntime?.id}), + const flowTypes = React.useMemo( + () => flowTypeService.values({runtimeId: primaryRuntime?.id, projectId: projectId, namespaceId: project?.namespace?.id}), [flowTypeStore] - ) : [] + ) const createFlow = React.useCallback((name: string, type: FlowType['id']) => { if (!type) return @@ -139,7 +139,7 @@ export const FlowCreateDialogComponent: React.FC - {!primaryRuntime?.id ? <> + {!primaryRuntime ? <> You don't have a primary runtime yet, assign and/or create a runtime to be able to create flows. From ec08c03f6febdb1ad82c6e36a7e1fee4353946f9 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sat, 14 Feb 2026 17:14:39 +0100 Subject: [PATCH 145/173] feat: update RuntimeDataTableFilterInputComponent to filter by runtime and status instead of role and abilities --- .../RuntimeDataTableFilterInputComponent.tsx | 52 +++++++++---------- 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/src/packages/ce/src/runtime/components/RuntimeDataTableFilterInputComponent.tsx b/src/packages/ce/src/runtime/components/RuntimeDataTableFilterInputComponent.tsx index 26868058..6747d11b 100644 --- a/src/packages/ce/src/runtime/components/RuntimeDataTableFilterInputComponent.tsx +++ b/src/packages/ce/src/runtime/components/RuntimeDataTableFilterInputComponent.tsx @@ -1,39 +1,35 @@ import React from "react"; import { DataTableFilterInput, - DataTableFilterSuggestionMenu, + DataTableFilterSuggestionMenu, DRuntimeView, MenuCheckboxItem, useService, useStore } from "@code0-tech/pictor"; import {IconCheck} from "@tabler/icons-react"; -import {Namespace} from "@code0-tech/sagittarius-graphql-types"; +import {Namespace, Runtime} from "@code0-tech/sagittarius-graphql-types"; import {DataTableFilterProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; import {RoleService} from "@edition/role/services/Role.service"; +import {RuntimeService} from "@edition/runtime/services/Runtime.service"; export interface RoleDataTableFilterInputComponentProps { namespaceId?: Namespace['id'] onChange: (filter: DataTableFilterProps) => void + preFilter?: (project: DRuntimeView, index: number) => boolean } export const RuntimeDataTableFilterInputComponent: React.FC = (props) => { - const {namespaceId, onChange} = props + const {namespaceId, onChange, preFilter = () => true} = props - const roleService = useService(RoleService) - const roleStore = useStore(RoleService) + const runtimeService = useService(RuntimeService) + const runtimeStore = useStore(RuntimeService) - const roles = React.useMemo( - () => roleService.values({namespaceId: namespaceId}), - [roleStore, namespaceId] + const runtimes = React.useMemo( + () => runtimeService.values({namespaceId}).filter(preFilter), + [runtimeStore, namespaceId] ) - const abilities = React.useMemo(() => { - const all = new Set() - roles.forEach(role => role.abilities?.forEach(ability => all.add(ability))) - return Array.from(all) - }, [roles]) - return s.trim()).filter(Boolean) return - {roles.map(role => { + {runtimes.map(runtime => { - const isChecked = split.includes(role?.name!) + const isChecked = split.includes(runtime?.name!) - return { + return { e.preventDefault(); e.stopPropagation(); const updated = isChecked - ? split.filter(name => name !== role?.name) - : [...split, role?.name]; + ? split.filter(name => name !== runtime?.name) + : [...split, runtime?.name]; applySuggestion(updated.join(","), true); }}> {isChecked ? : } - {role?.name} + {runtime?.name} })} } }, { - token: "Permissions", - key: "abilities", + token: "Status", + key: "status", operators: ["isOneOf"], suggestion: (context, operator, currentValue, applySuggestion) => { const split = currentValue.split(",").map(s => s.trim()).filter(Boolean) return - {abilities.map(ability => { + {["CONNECTED", "DISCONNECTED"].map(status => { - const isChecked = split.includes(ability) + const isChecked = split.includes(status) - return { + return { e.preventDefault(); e.stopPropagation(); const updated = isChecked - ? split.filter(name => name !== ability) - : [...split, ability]; + ? split.filter(name => name !== status) + : [...split, status]; applySuggestion(updated.join(","), true); }}> {isChecked ? : } - {ability} + {status} })} From 192950990b3db547670bee6cc03aaaf12da5da12 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sat, 14 Feb 2026 17:14:43 +0100 Subject: [PATCH 146/173] feat: add filter input to RuntimesPage and connect to RuntimeDataTableComponent --- .../ce/src/runtime/pages/RuntimesPage.tsx | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/packages/ce/src/runtime/pages/RuntimesPage.tsx b/src/packages/ce/src/runtime/pages/RuntimesPage.tsx index 7e79f259..3b4b3506 100644 --- a/src/packages/ce/src/runtime/pages/RuntimesPage.tsx +++ b/src/packages/ce/src/runtime/pages/RuntimesPage.tsx @@ -6,15 +6,23 @@ import Link from "next/link"; import {notFound, useParams, useRouter} from "next/navigation"; import {UserService} from "@edition/user/services/User.service"; import {RuntimeDataTableComponent} from "@edition/runtime/components/RuntimeDataTableComponent"; +import {DataTableFilterProps, DataTableSortProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; +import { + OrganizationDataTableFilterInputComponent +} from "@edition/organization/components/OrganizationDataTableFilterInputComponent"; +import {RuntimeDataTableFilterInputComponent} from "@edition/runtime/components/RuntimeDataTableFilterInputComponent"; export const RuntimesPage: React.FC = () => { + const params = useParams() const currentSession = useUserSession() const userStore = useStore(UserService) const userService = useService(UserService) const currentUser = React.useMemo(() => userService.getById(currentSession?.user?.id), [userStore, currentSession]) - const params = useParams() + const [filter, setFilter] = React.useState({}) + const [sort, setSort] = React.useState({}) + const namespaceIndex = params.namespaceId as any as number if (!namespaceIndex && currentUser && !currentUser.admin) { @@ -45,7 +53,11 @@ export const RuntimesPage: React.FC = () => { - + namespaceIndex ? true : !runtime?.namespace?.id} namespaceId={namespaceIndex ? `gid://sagittarius/Namespace/${namespaceIndex}` : undefined} onChange={filter => setFilter(filter)}/> +
+ + namespaceIndex ? true : !runtime?.namespace?.id} onSelect={(runtime) => { const number = runtime?.id?.match(/Runtime\/(\d+)$/)?.[1] router.push(namespaceIndex ? `/namespace/${namespaceIndex}/runtimes/${number}/settings` : `/runtimes/${number}/settings`) From 183aead3ecee45be8396f3c287d03e216a91790b Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sat, 14 Feb 2026 17:16:06 +0100 Subject: [PATCH 147/173] feat: add sort menu to RuntimesPage with options for name, createdAt, and updatedAt --- .../ce/src/runtime/pages/RuntimesPage.tsx | 82 ++++++++++++++++++- 1 file changed, 78 insertions(+), 4 deletions(-) diff --git a/src/packages/ce/src/runtime/pages/RuntimesPage.tsx b/src/packages/ce/src/runtime/pages/RuntimesPage.tsx index 3b4b3506..0ca50b6a 100644 --- a/src/packages/ce/src/runtime/pages/RuntimesPage.tsx +++ b/src/packages/ce/src/runtime/pages/RuntimesPage.tsx @@ -1,7 +1,17 @@ "use client" import React from "react"; -import {Button, DRuntimeList, Flex, Spacing, Text, useService, useStore, useUserSession} from "@code0-tech/pictor"; +import { + Button, + DRuntimeList, + Flex, + Menu, MenuCheckboxItem, MenuContent, MenuPortal, MenuTrigger, + Spacing, + Text, + useService, + useStore, + useUserSession +} from "@code0-tech/pictor"; import Link from "next/link"; import {notFound, useParams, useRouter} from "next/navigation"; import {UserService} from "@edition/user/services/User.service"; @@ -11,6 +21,8 @@ import { OrganizationDataTableFilterInputComponent } from "@edition/organization/components/OrganizationDataTableFilterInputComponent"; import {RuntimeDataTableFilterInputComponent} from "@edition/runtime/components/RuntimeDataTableFilterInputComponent"; +import {IconMinus, IconSortAscending, IconSortDescending} from "@tabler/icons-react"; +import {ButtonGroup} from "@code0-tech/pictor/dist/components/button-group/ButtonGroup"; export const RuntimesPage: React.FC = () => { @@ -46,18 +58,80 @@ export const RuntimesPage: React.FC = () => { Manage runtimes that you have access to. Runtimes are the environments where your applications run.
- + - + + + + + + + { + if (sort["name"] === undefined) + setSort(prev => ({...prev, name: "asc"})) + else if (sort["name"] === "asc") + setSort(prev => ({...prev, name: "desc"})) + else + setSort(prev => ({...prev, name: undefined})) + + event.preventDefault() + event.stopPropagation() + }}> + {sort["name"] === undefined ? : sort["name"] === "asc" ? + : } + Name + + { + if (sort["createdAt"] === undefined) + setSort(prev => ({...prev, createdAt: "asc"})) + else if (sort["createdAt"] === "asc") + setSort(prev => ({...prev, createdAt: "desc"})) + else + setSort(prev => ({...prev, createdAt: undefined})) + + event.preventDefault() + event.stopPropagation() + }}> + {sort["createdAt"] === undefined ? + : sort["createdAt"] === "asc" ? + : } + Created At + + { + if (sort["updatedAt"] === undefined) + setSort(prev => ({...prev, updatedAt: "asc"})) + else if (sort["updatedAt"] === "asc") + setSort(prev => ({...prev, updatedAt: "desc"})) + else + setSort(prev => ({...prev, updatedAt: undefined})) + + event.preventDefault() + event.stopPropagation() + }}> + {sort["updatedAt"] === undefined ? + : sort["updatedAt"] === "asc" ? + : } + Updated At + + + + +
namespaceIndex ? true : !runtime?.namespace?.id} namespaceId={namespaceIndex ? `gid://sagittarius/Namespace/${namespaceIndex}` : undefined} onChange={filter => setFilter(filter)}/>
- namespaceIndex ? true : !runtime?.namespace?.id} onSelect={(runtime) => { const number = runtime?.id?.match(/Runtime\/(\d+)$/)?.[1] router.push(namespaceIndex ? `/namespace/${namespaceIndex}/runtimes/${number}/settings` : `/runtimes/${number}/settings`) From 7518b8701f40122df5af1513ac6a6fd681885ac9 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sat, 14 Feb 2026 17:44:45 +0100 Subject: [PATCH 148/173] refactor: update hashToColor usage in OrganizationDataTableRowComponent and ProjectDataTableRowComponent for consistent avatar coloring --- .../components/OrganizationDataTableRowComponent.tsx | 6 +++--- .../src/project/components/ProjectDataTableRowComponent.tsx | 5 ++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/packages/ce/src/organization/components/OrganizationDataTableRowComponent.tsx b/src/packages/ce/src/organization/components/OrganizationDataTableRowComponent.tsx index e3a5051b..de8f4dc6 100644 --- a/src/packages/ce/src/organization/components/OrganizationDataTableRowComponent.tsx +++ b/src/packages/ce/src/organization/components/OrganizationDataTableRowComponent.tsx @@ -9,14 +9,14 @@ import { Text, useService, useStore, - useUserSession + useUserSession, + hashToColor } from "@code0-tech/pictor"; import {IconLogout} from "@tabler/icons-react"; import {OrganizationService} from "@edition/organization/services/Organization.service"; import {NamespaceService} from "@edition/namespace/services/Namespace.service"; import {MemberService} from "@edition/member/services/Member.service"; import {UserService} from "@edition/user/services/User.service"; -import {hashToColor} from "@code0-tech/pictor/dist/components/d-flow/DFlow.util"; import {formatDistanceToNow} from "date-fns"; export interface OrganizationDataTableRowComponentProps { @@ -69,7 +69,7 @@ export const OrganizationDataTableRowComponent: React.FC diff --git a/src/packages/ce/src/project/components/ProjectDataTableRowComponent.tsx b/src/packages/ce/src/project/components/ProjectDataTableRowComponent.tsx index 6b534489..c9fecc93 100644 --- a/src/packages/ce/src/project/components/ProjectDataTableRowComponent.tsx +++ b/src/packages/ce/src/project/components/ProjectDataTableRowComponent.tsx @@ -1,9 +1,8 @@ import React from "react"; import {NamespaceProject} from "@code0-tech/sagittarius-graphql-types"; -import {Avatar, DataTableColumn, Flex, Text, useService, useStore} from "@code0-tech/pictor"; +import {Avatar, DataTableColumn, Flex, Text, useService, useStore, hashToColor} from "@code0-tech/pictor"; import {ProjectService} from "@edition/project/services/Project.service"; import {RuntimeService} from "@edition/runtime/services/Runtime.service"; -import {hashToColor} from "@code0-tech/pictor/dist/components/d-flow/DFlow.util"; import {formatDistanceToNow} from "date-fns"; export interface ProjectDataTableRowComponentProps { @@ -43,7 +42,7 @@ export const ProjectDataTableRowComponent: React.FC From de861ccf27b8bd33705bcc103ebf7cddafa641f0 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sat, 14 Feb 2026 18:19:25 +0100 Subject: [PATCH 149/173] feat: add user data table with filter input and row components to UsersPage --- .../components/UserDataTableComponent.tsx | 47 +++++++ .../UserDataTableFilterInputComponent.tsx | 116 ++++++++++++++++++ .../components/UserDataTableRowComponent.tsx | 47 +++++++ src/packages/ce/src/user/pages/UsersPage.tsx | 13 +- 4 files changed, 222 insertions(+), 1 deletion(-) create mode 100644 src/packages/ce/src/user/components/UserDataTableComponent.tsx create mode 100644 src/packages/ce/src/user/components/UserDataTableFilterInputComponent.tsx create mode 100644 src/packages/ce/src/user/components/UserDataTableRowComponent.tsx diff --git a/src/packages/ce/src/user/components/UserDataTableComponent.tsx b/src/packages/ce/src/user/components/UserDataTableComponent.tsx new file mode 100644 index 00000000..d801b883 --- /dev/null +++ b/src/packages/ce/src/user/components/UserDataTableComponent.tsx @@ -0,0 +1,47 @@ +import React from "react"; +import {DataTable, DataTableColumn, Text, useService, useStore} from "@code0-tech/pictor"; +import {DataTableFilterProps, DataTableSortProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; +import {Namespace, NamespaceProject, NamespaceRole, Runtime, User} from "@code0-tech/sagittarius-graphql-types"; +import {ProjectService} from "@edition/project/services/Project.service"; +import {ProjectDataTableRowComponent} from "@edition/project/components/ProjectDataTableRowComponent"; +import {RoleService} from "@edition/role/services/Role.service"; +import {RoleDataTableRowComponent} from "@edition/role/components/RoleDataTableRowComponent"; +import {RuntimeService} from "@edition/runtime/services/Runtime.service"; +import {RuntimeDataTableRowComponent} from "@edition/runtime/components/RuntimeDataTableRowComponent"; +import {UserDataTableRowComponent} from "@edition/user/components/UserDataTableRowComponent"; +import {UserService} from "@edition/user/services/User.service"; + +export interface UserDataTableComponentProps { + sort?: DataTableSortProps + filter?: DataTableFilterProps + preFilter?: (project: User, index: number) => boolean + onSelect?: (item: User | undefined) => void +} + +export const UserDataTableComponent: React.FC = (props) => { + + const {sort, filter, preFilter = () => true, onSelect} = props + + const userService = useService(UserService) + const userStore = useStore(UserService) + + const users = React.useMemo( + () => userService.values(), + [userStore] + ) + + return + + No user found. Create one to get started. + + } + onSelect={(item) => item && onSelect?.(item)} + data={users.map(u => u.json()).filter(preFilter)}> + {(runtime, index) => { + return + }} + + +} \ No newline at end of file diff --git a/src/packages/ce/src/user/components/UserDataTableFilterInputComponent.tsx b/src/packages/ce/src/user/components/UserDataTableFilterInputComponent.tsx new file mode 100644 index 00000000..bc8b88d5 --- /dev/null +++ b/src/packages/ce/src/user/components/UserDataTableFilterInputComponent.tsx @@ -0,0 +1,116 @@ +import React from "react"; +import { + DataTableFilterInput, + DataTableFilterSuggestionMenu, DRuntimeView, + MenuCheckboxItem, + useService, + useStore +} from "@code0-tech/pictor"; +import {IconCheck} from "@tabler/icons-react"; +import {Namespace, Runtime} from "@code0-tech/sagittarius-graphql-types"; +import {DataTableFilterProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; +import {RoleService} from "@edition/role/services/Role.service"; +import {RuntimeService} from "@edition/runtime/services/Runtime.service"; +import {UserService} from "@edition/user/services/User.service"; + +export interface UserDataTableFilterInputComponentProps { + onChange: (filter: DataTableFilterProps) => void +} + +export const UserDataTableFilterInputComponent: React.FC = (props) => { + + const {onChange} = props + + const userService = useService(UserService) + const userStore = useStore(UserService) + + const users = React.useMemo( + () => userService.values(), + [userStore] + ) + + return { + + const split = currentValue.split(",").map(s => s.trim()).filter(Boolean) + + return + {users.map(user => { + + const isChecked = split.includes(user?.username!) + + return { + e.preventDefault(); + e.stopPropagation(); + const updated = isChecked + ? split.filter(name => name !== user?.username) + : [...split, user?.username]; + applySuggestion(updated.join(","), true); + }}> + {isChecked ? : } + @{user?.username} + + })} + + } + }, { + token: "Email", + key: "email", + operators: ["isOneOf"], + suggestion: (context, operator, currentValue, applySuggestion) => { + + const split = currentValue.split(",").map(s => s.trim()).filter(Boolean) + + return + {users.map(user => { + + const isChecked = split.includes(user?.email!) + + return { + e.preventDefault(); + e.stopPropagation(); + const updated = isChecked + ? split.filter(name => name !== user?.email) + : [...split, user?.email]; + applySuggestion(updated.join(","), true); + }}> + {isChecked ? : } + {user?.email} + + })} + + } + }, { + token: "Owner", + key: "admin", + operators: ["isOneOf"], + suggestion: (context, operator, currentValue, applySuggestion) => { + + const split = currentValue.split(",").map(s => s.trim()).filter(Boolean) + + return + {["true", "false"].map(admin => { + + const isChecked = split.includes(admin) + + return { + e.preventDefault(); + e.stopPropagation(); + const updated = isChecked + ? split.filter(name => name !== admin) + : [...split, admin]; + applySuggestion(updated.join(","), true); + }}> + {isChecked ? : } + {admin} + + })} + + } + } + ]}/> +} \ No newline at end of file diff --git a/src/packages/ce/src/user/components/UserDataTableRowComponent.tsx b/src/packages/ce/src/user/components/UserDataTableRowComponent.tsx new file mode 100644 index 00000000..c8fcef57 --- /dev/null +++ b/src/packages/ce/src/user/components/UserDataTableRowComponent.tsx @@ -0,0 +1,47 @@ +import React from "react"; +import {User} from "@code0-tech/sagittarius-graphql-types"; +import {Avatar, Badge, DataTableColumn, Flex, hashToColor, Text, useService, useStore} from "@code0-tech/pictor"; +import {formatDistanceToNow} from "date-fns"; +import {UserService} from "@edition/user/services/User.service"; + +export interface UserDataTableRowComponentProps { + userId: User['id'] +} + +export const UserDataTableRowComponent: React.FC = (props) => { + + const {userId} = props + + const userService = useService(UserService) + const userStore = useStore(UserService) + + const user = React.useMemo( + () => userService.getById(userId), + [userStore, userId] + ) + + return <> + + + + + + + + @{user?.username} + + {user?.admin ? Owner : null} + + + {user?.email ?? ""} + + + + + Account created {formatDistanceToNow(user?.createdAt!)} ago + + + + +} \ No newline at end of file diff --git a/src/packages/ce/src/user/pages/UsersPage.tsx b/src/packages/ce/src/user/pages/UsersPage.tsx index 8d41ea17..48f7b593 100644 --- a/src/packages/ce/src/user/pages/UsersPage.tsx +++ b/src/packages/ce/src/user/pages/UsersPage.tsx @@ -4,6 +4,10 @@ import React from "react"; import {Button, DUserList, Flex, Spacing, Text, useService, useStore, useUserSession,} from "@code0-tech/pictor"; import {UserService} from "@edition/user/services/User.service"; import {notFound} from "next/navigation"; +import {UserDataTableComponent} from "@edition/user/components/UserDataTableComponent"; +import {DataTableFilterProps, DataTableSortProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; +import {RuntimeDataTableFilterInputComponent} from "@edition/runtime/components/RuntimeDataTableFilterInputComponent"; +import {UserDataTableFilterInputComponent} from "@edition/user/components/UserDataTableFilterInputComponent"; export const UsersPage: React.FC = () => { @@ -12,6 +16,9 @@ export const UsersPage: React.FC = () => { const userService = useService(UserService) const currentUser = React.useMemo(() => userService.getById(currentSession?.user?.id), [userStore, currentSession]) + const [filter, setFilter] = React.useState({}) + const [sort, setSort] = React.useState({}) + if (currentUser && !currentUser.admin) { notFound() } @@ -31,6 +38,10 @@ export const UsersPage: React.FC = () => { - +
+ setFilter(filter)}/> +
+ +
} \ No newline at end of file From 155c37b0b5670bc656d7cf05321918e6e76c60d2 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sat, 14 Feb 2026 20:13:25 +0100 Subject: [PATCH 150/173] refactor: update layout on ApplicationPage and conditionally render project, member, and runtime counts in data table rows --- .../ce/src/application/ApplicationPage.tsx | 28 ++++++++++++------- .../OrganizationDataTableRowComponent.tsx | 12 ++++++-- .../ProjectDataTableRowComponent.tsx | 20 +++++++------ 3 files changed, 39 insertions(+), 21 deletions(-) diff --git a/src/packages/ce/src/application/ApplicationPage.tsx b/src/packages/ce/src/application/ApplicationPage.tsx index 44fb68e7..2076932d 100644 --- a/src/packages/ce/src/application/ApplicationPage.tsx +++ b/src/packages/ce/src/application/ApplicationPage.tsx @@ -4,8 +4,13 @@ import { Avatar, Badge, Card, + Col, Flex, - ScrollArea, ScrollAreaScrollbar, ScrollAreaThumb, ScrollAreaViewport, + Row, + ScrollArea, + ScrollAreaScrollbar, + ScrollAreaThumb, + ScrollAreaViewport, Spacing, Text, useService, @@ -14,7 +19,6 @@ import { } from "@code0-tech/pictor"; import {UserService} from "@edition/user/services/User.service"; import React from "react"; -import {hashToColor} from "@code0-tech/pictor/dist/components/d-flow/DFlow.util"; export const ApplicationPage = () => { @@ -54,14 +58,18 @@ export const ApplicationPage = () => { - - - - - - - - + + + + + + + + + + + + diff --git a/src/packages/ce/src/organization/components/OrganizationDataTableRowComponent.tsx b/src/packages/ce/src/organization/components/OrganizationDataTableRowComponent.tsx index de8f4dc6..74b2bcf8 100644 --- a/src/packages/ce/src/organization/components/OrganizationDataTableRowComponent.tsx +++ b/src/packages/ce/src/organization/components/OrganizationDataTableRowComponent.tsx @@ -83,21 +83,27 @@ export const OrganizationDataTableRowComponent: React.FC - - + + {namespace?.projects?.count ? ( {namespace?.projects?.count ?? 0} {" "} projects + ) : null} + + {namespace?.members?.count ? ( {namespace?.members?.count ?? 0}{" "} members + ) : null} + + {namespace?.runtimes?.count ? ( {namespace?.runtimes?.count ?? 0}{" "} connected runtimes - + ) : null} {onLeave && namespaceMember && namespaceMember.userAbilities?.deleteMember ? ( diff --git a/src/packages/ce/src/project/components/ProjectDataTableRowComponent.tsx b/src/packages/ce/src/project/components/ProjectDataTableRowComponent.tsx index c9fecc93..a2ef403b 100644 --- a/src/packages/ce/src/project/components/ProjectDataTableRowComponent.tsx +++ b/src/packages/ce/src/project/components/ProjectDataTableRowComponent.tsx @@ -60,14 +60,18 @@ export const ProjectDataTableRowComponent: React.FC - - {project?.flows?.count ?? 0}{" "} - flows - - - {project?.runtimes?.count ?? 0}{" "} - assigned runtimes - + {project?.flows?.count ? ( + + {project?.flows?.count ?? 0}{" "} + flows + + ) : null} + {project?.runtimes?.count ? ( + + {project?.runtimes?.count ?? 0}{" "} + assigned runtimes + + ) : null} From 0a3c947d611af94e497838494d8674dc5e0aeed1 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sun, 15 Feb 2026 00:03:20 +0100 Subject: [PATCH 151/173] feat: add OrganizationsTopView with minimized organization data table and update avatar usage for consistency across views --- .../ce/src/application/ApplicationPage.tsx | 20 +++-- .../views/NamespaceOverviewLeftView.tsx | 25 +++++- .../views/NamespaceOverviewRightView.tsx | 5 +- .../OrganizationDataTableComponent.tsx | 5 +- .../OrganizationDataTableRowComponent.tsx | 83 ++++++++++--------- .../views/OrganizationsTopView.tsx | 31 +++++++ .../components/ProjectDataTableComponent.tsx | 2 +- .../components/UserDataTableRowComponent.tsx | 1 + 8 files changed, 116 insertions(+), 56 deletions(-) create mode 100644 src/packages/ce/src/organization/views/OrganizationsTopView.tsx diff --git a/src/packages/ce/src/application/ApplicationPage.tsx b/src/packages/ce/src/application/ApplicationPage.tsx index 2076932d..4b2dc5f0 100644 --- a/src/packages/ce/src/application/ApplicationPage.tsx +++ b/src/packages/ce/src/application/ApplicationPage.tsx @@ -1,6 +1,7 @@ import {PersonalProjectsView} from "@edition/project/views/PersonalProjectsView"; import {OrganizationsView} from "@edition/organization/views/OrganizationsView"; import { + AuroraBackground, Avatar, Badge, Card, @@ -19,6 +20,7 @@ import { } from "@code0-tech/pictor"; import {UserService} from "@edition/user/services/User.service"; import React from "react"; +import {OrganizationsTopView} from "@edition/organization/views/OrganizationsTopView"; export const ApplicationPage = () => { @@ -41,32 +43,32 @@ export const ApplicationPage = () => {
👋
- Welcome back! - - Hi, @{currentUser?.username ?? "user"} + + Hi, @{currentUser?.username ?? "user"}, + let's write some flows
-
+
+ +
- - + +
diff --git a/src/packages/ce/src/namespace/views/NamespaceOverviewLeftView.tsx b/src/packages/ce/src/namespace/views/NamespaceOverviewLeftView.tsx index 9b8140fb..720a89f2 100644 --- a/src/packages/ce/src/namespace/views/NamespaceOverviewLeftView.tsx +++ b/src/packages/ce/src/namespace/views/NamespaceOverviewLeftView.tsx @@ -1,5 +1,16 @@ import React from "react"; -import {Avatar, Badge, Button, Flex, Spacing, Text, useService, useStore, useUserSession} from "@code0-tech/pictor"; +import { + Avatar, + Badge, + Button, + Flex, + hashToColor, + Spacing, + Text, + useService, + useStore, + useUserSession +} from "@code0-tech/pictor"; import {UserService} from "@edition/user/services/User.service"; import {IconMail, IconSparkles, IconUser, IconUserCog} from "@tabler/icons-react"; import {OrganizationService} from "@edition/organization/services/Organization.service"; @@ -16,12 +27,16 @@ export const NamespaceOverviewLeftView: React.FC = () => { const organizations = React.useMemo(() => organizationService.values(), [organizationStore]) return - +
+ + + 👋 + +
{currentUser?.firstname} {currentUser?.lastname} - {currentUser?.email} @@ -53,7 +68,9 @@ export const NamespaceOverviewLeftView: React.FC = () => { {organizations.map(organization => { - return + return })}
diff --git a/src/packages/ce/src/namespace/views/NamespaceOverviewRightView.tsx b/src/packages/ce/src/namespace/views/NamespaceOverviewRightView.tsx index 7dc4a009..445f145a 100644 --- a/src/packages/ce/src/namespace/views/NamespaceOverviewRightView.tsx +++ b/src/packages/ce/src/namespace/views/NamespaceOverviewRightView.tsx @@ -54,19 +54,18 @@ export const NamespaceOverviewRightView: React.FC = () => { const user = userService.getById(member.user?.id!!) return - + - {user?.username} + @{user?.username} {user?.email} - diff --git a/src/packages/ce/src/organization/components/OrganizationDataTableComponent.tsx b/src/packages/ce/src/organization/components/OrganizationDataTableComponent.tsx index 5cb502d7..1c79ae32 100644 --- a/src/packages/ce/src/organization/components/OrganizationDataTableComponent.tsx +++ b/src/packages/ce/src/organization/components/OrganizationDataTableComponent.tsx @@ -11,11 +11,12 @@ export interface OrganizationDataTableComponentProps { filter?: DataTableFilterProps preFilter?: (project: Organization, index: number) => boolean onSelect?: (item: Organization | undefined) => void + minimized?: boolean } export const OrganizationDataTableComponent: React.FC = (props) => { - const {sort, filter, preFilter = () => true, onSelect} = props + const {sort, filter, preFilter = () => true, onSelect, minimized} = props const organizationService = useService(OrganizationService) const organizationStore = useStore(OrganizationService) @@ -56,7 +57,7 @@ export const OrganizationDataTableComponent: React.FC item && onSelect?.(item)} data={data}> {(organization, index) => { - return + return }} diff --git a/src/packages/ce/src/organization/components/OrganizationDataTableRowComponent.tsx b/src/packages/ce/src/organization/components/OrganizationDataTableRowComponent.tsx index 74b2bcf8..f51c8553 100644 --- a/src/packages/ce/src/organization/components/OrganizationDataTableRowComponent.tsx +++ b/src/packages/ce/src/organization/components/OrganizationDataTableRowComponent.tsx @@ -6,11 +6,11 @@ import { DataTableColumn, DOrganizationView, Flex, + hashToColor, Text, useService, useStore, - useUserSession, - hashToColor + useUserSession } from "@code0-tech/pictor"; import {IconLogout} from "@tabler/icons-react"; import {OrganizationService} from "@edition/organization/services/Organization.service"; @@ -22,11 +22,12 @@ import {formatDistanceToNow} from "date-fns"; export interface OrganizationDataTableRowComponentProps { organizationId: Organization['id'] onLeave?: (organization: DOrganizationView) => void + minimized?: boolean } export const OrganizationDataTableRowComponent: React.FC = (props) => { - const {organizationId, onLeave} = props + const {organizationId, onLeave, minimized} = props const organizationService = useService(OrganizationService) const organizationStore = useStore(OrganizationService) @@ -77,44 +78,52 @@ export const OrganizationDataTableRowComponent: React.FC - - Updated {formatDistanceToNow(organization?.updatedAt!)} ago - - - - - - {namespace?.projects?.count ? ( - - {namespace?.projects?.count ?? 0} {" "} - projects - - ) : null} - - {namespace?.members?.count ? ( + {!minimized && ( - {namespace?.members?.count ?? 0}{" "} - members + Updated {formatDistanceToNow(organization?.updatedAt!)} ago - ) : null} + )} - {namespace?.runtimes?.count ? ( - - {namespace?.runtimes?.count ?? 0}{" "} - connected runtimes - - ) : null} - {onLeave && namespaceMember && namespaceMember.userAbilities?.deleteMember ? ( - - - - ) : null} + {!minimized && ( + <> + + + {namespace?.projects?.count ? ( + + {namespace?.projects?.count ?? 0} {" "} + projects + + ) : null} + + {namespace?.members?.count ? ( + + {namespace?.members?.count ?? 0}{" "} + members + + ) : null} + + {namespace?.runtimes?.count ? ( + + {namespace?.runtimes?.count ?? 0}{" "} + connected runtimes + + ) : null} + + + {onLeave && namespaceMember && namespaceMember.userAbilities?.deleteMember ? ( + + + + ) : null} + + )} + } \ No newline at end of file diff --git a/src/packages/ce/src/organization/views/OrganizationsTopView.tsx b/src/packages/ce/src/organization/views/OrganizationsTopView.tsx new file mode 100644 index 00000000..60a36763 --- /dev/null +++ b/src/packages/ce/src/organization/views/OrganizationsTopView.tsx @@ -0,0 +1,31 @@ +"use client" + +import {Flex, Spacing, Text} from "@code0-tech/pictor"; +import React from "react"; +import {useRouter} from "next/navigation"; +import {OrganizationDataTableComponent} from "@edition/organization/components/OrganizationDataTableComponent"; + +export const OrganizationsTopView = () => { + + const router = useRouter() + + return <> + + + Top organizations + + + Manage organizations that you belong to. You can create new organizations and switch between them. + + + + {/**TODO: use namespaceId*/} + index < 5} onSelect={(organization) => { + const number = organization?.namespace?.id?.match(/Namespace\/(\d+)$/)?.[1] + router.push(`/namespace/${number}`) + }}/> + + +} \ No newline at end of file diff --git a/src/packages/ce/src/project/components/ProjectDataTableComponent.tsx b/src/packages/ce/src/project/components/ProjectDataTableComponent.tsx index 1286e3d5..78ce332b 100644 --- a/src/packages/ce/src/project/components/ProjectDataTableComponent.tsx +++ b/src/packages/ce/src/project/components/ProjectDataTableComponent.tsx @@ -25,7 +25,7 @@ export const ProjectDataTableComponent: React.FC sort={sort} emptyComponent={ - No role found. Create one to get started. + No project found. Create one to get started. } onSelect={(item) => item && onSelect?.(item)} diff --git a/src/packages/ce/src/user/components/UserDataTableRowComponent.tsx b/src/packages/ce/src/user/components/UserDataTableRowComponent.tsx index c8fcef57..fc1a9c8a 100644 --- a/src/packages/ce/src/user/components/UserDataTableRowComponent.tsx +++ b/src/packages/ce/src/user/components/UserDataTableRowComponent.tsx @@ -25,6 +25,7 @@ export const UserDataTableRowComponent: React.FC From fc8f848ddb1553b536a6ef043e31e785b2fd8776 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sun, 15 Feb 2026 00:05:48 +0100 Subject: [PATCH 152/173] feat: add sort menu to UsersPage with options for username, createdAt, and updatedAt --- src/packages/ce/src/user/pages/UsersPage.tsx | 81 ++++++++++++++++++-- 1 file changed, 75 insertions(+), 6 deletions(-) diff --git a/src/packages/ce/src/user/pages/UsersPage.tsx b/src/packages/ce/src/user/pages/UsersPage.tsx index 48f7b593..9321eba3 100644 --- a/src/packages/ce/src/user/pages/UsersPage.tsx +++ b/src/packages/ce/src/user/pages/UsersPage.tsx @@ -1,13 +1,14 @@ "use client" import React from "react"; -import {Button, DUserList, Flex, Spacing, Text, useService, useStore, useUserSession,} from "@code0-tech/pictor"; +import {Button, ButtonGroup, Flex, Spacing, Text, useService, useStore, useUserSession, Menu, MenuTrigger, MenuPortal, MenuContent, MenuCheckboxItem} from "@code0-tech/pictor"; import {UserService} from "@edition/user/services/User.service"; import {notFound} from "next/navigation"; import {UserDataTableComponent} from "@edition/user/components/UserDataTableComponent"; import {DataTableFilterProps, DataTableSortProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; -import {RuntimeDataTableFilterInputComponent} from "@edition/runtime/components/RuntimeDataTableFilterInputComponent"; import {UserDataTableFilterInputComponent} from "@edition/user/components/UserDataTableFilterInputComponent"; +import Link from "next/link"; +import {IconMinus, IconSortAscending, IconSortDescending} from "@tabler/icons-react"; export const UsersPage: React.FC = () => { @@ -23,7 +24,13 @@ export const UsersPage: React.FC = () => { notFound() } - return
+ return
@@ -33,15 +40,77 @@ export const UsersPage: React.FC = () => { Manage users who have access to your instance. You can invite new users and remove existing ones. - + - + + + + + + + { + if (sort["username"] === undefined) + setSort(prev => ({...prev, username: "asc"})) + else if (sort["username"] === "asc") + setSort(prev => ({...prev, username: "desc"})) + else + setSort(prev => ({...prev, username: undefined})) + + event.preventDefault() + event.stopPropagation() + }}> + {sort["username"] === undefined ? : sort["name"] === "asc" ? + : } + Username + + { + if (sort["createdAt"] === undefined) + setSort(prev => ({...prev, createdAt: "asc"})) + else if (sort["createdAt"] === "asc") + setSort(prev => ({...prev, createdAt: "desc"})) + else + setSort(prev => ({...prev, createdAt: undefined})) + + event.preventDefault() + event.stopPropagation() + }}> + {sort["createdAt"] === undefined ? + : sort["createdAt"] === "asc" ? + : } + Created At + + { + if (sort["updatedAt"] === undefined) + setSort(prev => ({...prev, updatedAt: "asc"})) + else if (sort["updatedAt"] === "asc") + setSort(prev => ({...prev, updatedAt: "desc"})) + else + setSort(prev => ({...prev, updatedAt: undefined})) + + event.preventDefault() + event.stopPropagation() + }}> + {sort["updatedAt"] === undefined ? + : sort["updatedAt"] === "asc" ? + : } + Updated At + + + + +
setFilter(filter)}/>
- +
} \ No newline at end of file From 914987bba5ba459ee5873361d2e5d1307cc61a3a Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sun, 15 Feb 2026 00:06:31 +0100 Subject: [PATCH 153/173] refactor: remove unused imports from user data table components for improved code clarity --- .../ce/src/user/components/UserDataTableComponent.tsx | 8 +------- .../user/components/UserDataTableFilterInputComponent.tsx | 5 +---- .../ce/src/user/components/UserDataTableRowComponent.tsx | 2 +- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/src/packages/ce/src/user/components/UserDataTableComponent.tsx b/src/packages/ce/src/user/components/UserDataTableComponent.tsx index d801b883..eae9fb21 100644 --- a/src/packages/ce/src/user/components/UserDataTableComponent.tsx +++ b/src/packages/ce/src/user/components/UserDataTableComponent.tsx @@ -1,13 +1,7 @@ import React from "react"; import {DataTable, DataTableColumn, Text, useService, useStore} from "@code0-tech/pictor"; import {DataTableFilterProps, DataTableSortProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; -import {Namespace, NamespaceProject, NamespaceRole, Runtime, User} from "@code0-tech/sagittarius-graphql-types"; -import {ProjectService} from "@edition/project/services/Project.service"; -import {ProjectDataTableRowComponent} from "@edition/project/components/ProjectDataTableRowComponent"; -import {RoleService} from "@edition/role/services/Role.service"; -import {RoleDataTableRowComponent} from "@edition/role/components/RoleDataTableRowComponent"; -import {RuntimeService} from "@edition/runtime/services/Runtime.service"; -import {RuntimeDataTableRowComponent} from "@edition/runtime/components/RuntimeDataTableRowComponent"; +import {User} from "@code0-tech/sagittarius-graphql-types"; import {UserDataTableRowComponent} from "@edition/user/components/UserDataTableRowComponent"; import {UserService} from "@edition/user/services/User.service"; diff --git a/src/packages/ce/src/user/components/UserDataTableFilterInputComponent.tsx b/src/packages/ce/src/user/components/UserDataTableFilterInputComponent.tsx index bc8b88d5..1b2cf287 100644 --- a/src/packages/ce/src/user/components/UserDataTableFilterInputComponent.tsx +++ b/src/packages/ce/src/user/components/UserDataTableFilterInputComponent.tsx @@ -1,16 +1,13 @@ import React from "react"; import { DataTableFilterInput, - DataTableFilterSuggestionMenu, DRuntimeView, + DataTableFilterSuggestionMenu, MenuCheckboxItem, useService, useStore } from "@code0-tech/pictor"; import {IconCheck} from "@tabler/icons-react"; -import {Namespace, Runtime} from "@code0-tech/sagittarius-graphql-types"; import {DataTableFilterProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; -import {RoleService} from "@edition/role/services/Role.service"; -import {RuntimeService} from "@edition/runtime/services/Runtime.service"; import {UserService} from "@edition/user/services/User.service"; export interface UserDataTableFilterInputComponentProps { diff --git a/src/packages/ce/src/user/components/UserDataTableRowComponent.tsx b/src/packages/ce/src/user/components/UserDataTableRowComponent.tsx index fc1a9c8a..f70de6c3 100644 --- a/src/packages/ce/src/user/components/UserDataTableRowComponent.tsx +++ b/src/packages/ce/src/user/components/UserDataTableRowComponent.tsx @@ -1,6 +1,6 @@ import React from "react"; import {User} from "@code0-tech/sagittarius-graphql-types"; -import {Avatar, Badge, DataTableColumn, Flex, hashToColor, Text, useService, useStore} from "@code0-tech/pictor"; +import {Avatar, Badge, DataTableColumn, Flex, Text, useService, useStore} from "@code0-tech/pictor"; import {formatDistanceToNow} from "date-fns"; import {UserService} from "@edition/user/services/User.service"; From 5b9a9fc82fcea186e4e10763f1ae63b0339b0316 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sun, 15 Feb 2026 00:57:33 +0100 Subject: [PATCH 154/173] feat: add member data table with filter input and row components to MembersView for improved member management --- .../components/MemberDataTableComponent.tsx | 57 ++++ .../MemberDataTableFilterInputComponent.tsx | 116 ++++++++ .../MemberDataTableRowComponent.tsx | 252 ++++++++++++++++++ .../ce/src/member/views/MembersView.tsx | 26 +- 4 files changed, 428 insertions(+), 23 deletions(-) create mode 100644 src/packages/ce/src/member/components/MemberDataTableComponent.tsx create mode 100644 src/packages/ce/src/member/components/MemberDataTableFilterInputComponent.tsx create mode 100644 src/packages/ce/src/member/components/MemberDataTableRowComponent.tsx diff --git a/src/packages/ce/src/member/components/MemberDataTableComponent.tsx b/src/packages/ce/src/member/components/MemberDataTableComponent.tsx new file mode 100644 index 00000000..8dd73b3f --- /dev/null +++ b/src/packages/ce/src/member/components/MemberDataTableComponent.tsx @@ -0,0 +1,57 @@ +import React from "react"; +import {DataTable, DataTableColumn, Text, useService, useStore} from "@code0-tech/pictor"; +import {DataTableFilterProps, DataTableSortProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; +import { + Namespace, + NamespaceMember, + NamespaceProject, + NamespaceRole, + Runtime, + User +} from "@code0-tech/sagittarius-graphql-types"; +import {ProjectService} from "@edition/project/services/Project.service"; +import {ProjectDataTableRowComponent} from "@edition/project/components/ProjectDataTableRowComponent"; +import {RoleService} from "@edition/role/services/Role.service"; +import {RoleDataTableRowComponent} from "@edition/role/components/RoleDataTableRowComponent"; +import {RuntimeService} from "@edition/runtime/services/Runtime.service"; +import {RuntimeDataTableRowComponent} from "@edition/runtime/components/RuntimeDataTableRowComponent"; +import {UserDataTableRowComponent} from "@edition/user/components/UserDataTableRowComponent"; +import {UserService} from "@edition/user/services/User.service"; +import {MemberService} from "@edition/member/services/Member.service"; +import {MemberDataTableRowComponent} from "@edition/member/components/MemberDataTableRowComponent"; + +export interface MemberDataTableComponentProps { + namespaceId: Namespace['id'] + sort?: DataTableSortProps + filter?: DataTableFilterProps + preFilter?: (project: NamespaceMember, index: number) => boolean + onSelect?: (item: NamespaceMember | undefined) => void +} + +export const MemberDataTableComponent: React.FC = (props) => { + + const {namespaceId, sort, filter, preFilter = () => true, onSelect} = props + + const memberService = useService(MemberService) + const memberStore = useStore(MemberService) + + const users = React.useMemo( + () => memberService.values({namespaceId: namespaceId}), + [memberStore] + ) + + return + + No member found. Create one to get started. + + } + onSelect={(item) => item && onSelect?.(item)} + data={users.map(u => u.json()).filter(preFilter)}> + {(member, index) => { + return + }} + + +} \ No newline at end of file diff --git a/src/packages/ce/src/member/components/MemberDataTableFilterInputComponent.tsx b/src/packages/ce/src/member/components/MemberDataTableFilterInputComponent.tsx new file mode 100644 index 00000000..69f1da19 --- /dev/null +++ b/src/packages/ce/src/member/components/MemberDataTableFilterInputComponent.tsx @@ -0,0 +1,116 @@ +import React from "react"; +import { + DataTableFilterInput, + DataTableFilterSuggestionMenu, DRuntimeView, + MenuCheckboxItem, + useService, + useStore +} from "@code0-tech/pictor"; +import {IconCheck} from "@tabler/icons-react"; +import {Namespace, Runtime} from "@code0-tech/sagittarius-graphql-types"; +import {DataTableFilterProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; +import {RoleService} from "@edition/role/services/Role.service"; +import {RuntimeService} from "@edition/runtime/services/Runtime.service"; +import {UserService} from "@edition/user/services/User.service"; + +export interface MemberDataTableFilterInputComponentProps { + onChange: (filter: DataTableFilterProps) => void +} + +export const MemberDataTableFilterInputComponent: React.FC = (props) => { + + const {onChange} = props + + const userService = useService(UserService) + const userStore = useStore(UserService) + + const users = React.useMemo( + () => userService.values(), + [userStore] + ) + + return { + + const split = currentValue.split(",").map(s => s.trim()).filter(Boolean) + + return + {users.map(user => { + + const isChecked = split.includes(user?.username!) + + return { + e.preventDefault(); + e.stopPropagation(); + const updated = isChecked + ? split.filter(name => name !== user?.username) + : [...split, user?.username]; + applySuggestion(updated.join(","), true); + }}> + {isChecked ? : } + @{user?.username} + + })} + + } + }, { + token: "Email", + key: "email", + operators: ["isOneOf"], + suggestion: (context, operator, currentValue, applySuggestion) => { + + const split = currentValue.split(",").map(s => s.trim()).filter(Boolean) + + return + {users.map(user => { + + const isChecked = split.includes(user?.email!) + + return { + e.preventDefault(); + e.stopPropagation(); + const updated = isChecked + ? split.filter(name => name !== user?.email) + : [...split, user?.email]; + applySuggestion(updated.join(","), true); + }}> + {isChecked ? : } + {user?.email} + + })} + + } + }, { + token: "Owner", + key: "admin", + operators: ["isOneOf"], + suggestion: (context, operator, currentValue, applySuggestion) => { + + const split = currentValue.split(",").map(s => s.trim()).filter(Boolean) + + return + {["true", "false"].map(admin => { + + const isChecked = split.includes(admin) + + return { + e.preventDefault(); + e.stopPropagation(); + const updated = isChecked + ? split.filter(name => name !== admin) + : [...split, admin]; + applySuggestion(updated.join(","), true); + }}> + {isChecked ? : } + {admin} + + })} + + } + } + ]}/> +} \ No newline at end of file diff --git a/src/packages/ce/src/member/components/MemberDataTableRowComponent.tsx b/src/packages/ce/src/member/components/MemberDataTableRowComponent.tsx new file mode 100644 index 00000000..aa769778 --- /dev/null +++ b/src/packages/ce/src/member/components/MemberDataTableRowComponent.tsx @@ -0,0 +1,252 @@ +import React, {startTransition} from "react"; +import {NamespaceMember} from "@code0-tech/sagittarius-graphql-types"; +import { + Avatar, + Badge, + Button, + Card, + DataTableColumn, + Dialog, + DialogClose, + DialogContent, + DialogOverlay, + DialogPortal, + Flex, + Menu, + MenuContent, + MenuItem, + MenuPortal, + MenuTrigger, + Spacing, + Text, + Tooltip, + TooltipContent, + TooltipPortal, + TooltipTrigger, + useService, + useStore +} from "@code0-tech/pictor"; +import {formatDistanceToNow} from "date-fns"; +import {UserService} from "@edition/user/services/User.service"; +import {MemberService} from "@edition/member/services/Member.service"; +import {RoleService} from "@edition/role/services/Role.service"; +import {RolePermissionComponent} from "@edition/role/components/RolePermissionComponent"; +import {IconDotsVertical, IconUserCog, IconUserOff, IconX} from "@tabler/icons-react"; + +export interface MemberDataTableRowComponentProps { + memberId: NamespaceMember['id'] +} + +export const MemberDataTableRowComponent: React.FC = (props) => { + + const {memberId} = props + + const memberService = useService(MemberService) + const memberStore = useStore(MemberService) + const userService = useService(UserService) + const userStore = useStore(UserService) + const roleService = useService(RoleService) + const roleStore = useStore(RoleService) + + const member = React.useMemo( + () => memberService.getById(memberId), + [memberStore, memberId] + ) + + const user = React.useMemo( + () => userService.getById(member?.user?.id), + [userStore, member] + ) + + const assignedRoles = React.useMemo( + () => member?.roles?.nodes?.map(role => roleService.getById(role?.id, {namespaceId: member?.namespace?.id})) || [], + [roleStore, member] + ) + + const [localAssignedRoles, setLocalAssignedRoles] = React.useState(assignedRoles) + const [openRemovedMemberDialog, setOpenRemovedMemberDialog] = React.useState(false) + const [openAssignRolesDialog, setOpenAssignRolesDialog] = React.useState(false) + + const rolesToAssign = roleService + .values({namespaceId: member?.namespace?.id}) + .filter(role => !localAssignedRoles.find(aRole => aRole?.id === role.id)) + + React.useEffect(() => { + setLocalAssignedRoles(assignedRoles) + }, [assignedRoles]) + + + const memberAssignRoles = React.useCallback(() => { + startTransition(() => { + memberService.memberAssignRoles({ + memberId: member?.id!, + roleIds: localAssignedRoles.map(r => r?.id!) + }) + }) + }, [localAssignedRoles, member]) + + const memberDelete = React.useCallback(() => { + startTransition(() => { + memberService.memberDelete({ + namespaceMemberId: member?.id! + }) + }) + }, [member]) + + return <> + setOpenRemovedMemberDialog(open)}> + + + + + + Are you sure you want to remove {" "} + + @{user?.username} + {" "} + from this organization/workspace? + + + + + + + + + + + + + + setOpenAssignRolesDialog(open)}> + + + + + + Assign, remove and manage the roles of a active + member + + + + + + + {rolesToAssign.map((role, index) => { + return <> + { + setLocalAssignedRoles(prevState => [...prevState, role]) + }}> + + {role?.name} + + + + + })} + + + + + + + {localAssignedRoles.map(role => { + return + + {role?.name} + + + + + + })} + + + + + + + + + + + + + + + + + + + + + + @{user?.username} + + {user?.admin ? Owner : null} + {user?.emailVerifiedAt ? Email verified : null} + + + {user?.email ?? ""} + + + + + Member since {formatDistanceToNow(member?.createdAt!)} ago + + + + + + {assignedRoles.map(role => { + return + + + {role?.name} + + + + + + + + + })} + + + + {member?.userAbilities?.deleteMember || member?.userAbilities?.assignMemberRoles ? ( + + + + + + + {member?.userAbilities?.deleteMember && ( + setOpenRemovedMemberDialog(true)}> + + Remove member + + )} + {member?.userAbilities?.assignMemberRoles && ( + setOpenAssignRolesDialog(true)}> + + Assign role + + )} + + + + ) : null} + + +} \ No newline at end of file diff --git a/src/packages/ce/src/member/views/MembersView.tsx b/src/packages/ce/src/member/views/MembersView.tsx index 575f5aef..e565f762 100644 --- a/src/packages/ce/src/member/views/MembersView.tsx +++ b/src/packages/ce/src/member/views/MembersView.tsx @@ -5,33 +5,13 @@ import {useParams} from "next/navigation"; import {Button, DNamespaceMemberList, Flex, Spacing, Text, useService, useStore} from "@code0-tech/pictor"; import Link from "next/link"; import {MemberService} from "@edition/member/services/Member.service"; +import {MemberDataTableComponent} from "@edition/member/components/MemberDataTableComponent"; +//TODO: user abilities for add user as member within namespace export const MembersView: React.FC = () => { const params = useParams() const namespaceId = params.namespaceId as any as number - const memberService = useService(MemberService) - const memberStore = useStore(MemberService) - const [, startTransition] = React.useTransition() - - const membersList = React.useMemo(() => { - return { - startTransition(() => { - memberService.memberAssignRoles({ - memberId: member.id!, - roleIds: roles.map(r => r.id!) - }) - }) - }} onRemove={(member) => { - startTransition(() => { - memberService.memberDelete({ - namespaceMemberId: member.id! - }) - }) - }} namespaceId={`gid://sagittarius/Namespace/${namespaceId}`}/> - }, [namespaceId, memberStore]) - - //TODO: user abilities for add user as member within namespace return <> @@ -46,7 +26,7 @@ export const MembersView: React.FC = () => { - {membersList} + From f89394e5cd953e2b28e4ce2a88a850e18d39f172 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sun, 15 Feb 2026 00:57:40 +0100 Subject: [PATCH 155/173] refactor: replace DNamespaceRolePermissions with RolePermissionComponent in RoleDataTableRowComponent for improved consistency --- .../src/role/components/RoleDataTableRowComponent.tsx | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/packages/ce/src/role/components/RoleDataTableRowComponent.tsx b/src/packages/ce/src/role/components/RoleDataTableRowComponent.tsx index dd89b097..5a9a69b1 100644 --- a/src/packages/ce/src/role/components/RoleDataTableRowComponent.tsx +++ b/src/packages/ce/src/role/components/RoleDataTableRowComponent.tsx @@ -1,12 +1,9 @@ import React from "react"; -import {NamespaceProject, NamespaceRole} from "@code0-tech/sagittarius-graphql-types"; -import {Avatar, DataTableColumn, Flex, Text, useService, useStore} from "@code0-tech/pictor"; -import {ProjectService} from "@edition/project/services/Project.service"; -import {RuntimeService} from "@edition/runtime/services/Runtime.service"; -import {hashToColor} from "@code0-tech/pictor/dist/components/d-flow/DFlow.util"; +import {NamespaceRole} from "@code0-tech/sagittarius-graphql-types"; +import {DataTableColumn, Flex, Text, useService, useStore} from "@code0-tech/pictor"; import {formatDistanceToNow} from "date-fns"; import {RoleService} from "@edition/role/services/Role.service"; -import {DNamespaceRolePermissions} from "@code0-tech/pictor/dist/components/d-role/DNamespaceRolePermissions"; +import {RolePermissionComponent} from "@edition/role/components/RolePermissionComponent"; export interface ProjectDataTableRowComponentProps { roleId: NamespaceRole['id'] @@ -31,7 +28,7 @@ export const RoleDataTableRowComponent: React.FC {role?.name} - + Updated {formatDistanceToNow(role?.updatedAt!)} ago From 5e0dc05d1043f50b671a5e3365b21f8a8e236c30 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sun, 15 Feb 2026 00:57:44 +0100 Subject: [PATCH 156/173] feat: add RolePermissionComponent for summarizing role abilities with categorized tooltips --- .../components/RolePermissionComponent.tsx | 179 ++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 src/packages/ce/src/role/components/RolePermissionComponent.tsx diff --git a/src/packages/ce/src/role/components/RolePermissionComponent.tsx b/src/packages/ce/src/role/components/RolePermissionComponent.tsx new file mode 100644 index 00000000..6131e221 --- /dev/null +++ b/src/packages/ce/src/role/components/RolePermissionComponent.tsx @@ -0,0 +1,179 @@ +import React from "react"; +import {IconCheck} from "@tabler/icons-react"; +import {Tooltip, TooltipArrow, TooltipContent, TooltipPortal, TooltipTrigger, Badge, Flex, Text} from "@code0-tech/pictor"; + +type AbilityCategory = + | "members" + | "projects" + | "roles" + | "runtimes" + | "flows" + | "license" + | "organization" + | "admin" + +const abilityCategoryByAbility: Record = { + ASSIGN_MEMBER_ROLES: "members", + INVITE_MEMBER: "members", + DELETE_MEMBER: "members", + + CREATE_NAMESPACE_PROJECT: "projects", + UPDATE_NAMESPACE_PROJECT: "projects", + DELETE_NAMESPACE_PROJECT: "projects", + ASSIGN_ROLE_PROJECTS: "projects", + READ_NAMESPACE_PROJECT: "projects", + + CREATE_NAMESPACE_ROLE: "roles", + UPDATE_NAMESPACE_ROLE: "roles", + ASSIGN_ROLE_ABILITIES: "roles", + + CREATE_RUNTIME: "runtimes", + UPDATE_RUNTIME: "runtimes", + DELETE_RUNTIME: "runtimes", + ROTATE_RUNTIME_TOKEN: "runtimes", + ASSIGN_PROJECT_RUNTIMES: "runtimes", + + CREATE_FLOW: "flows", + UPDATE_FLOW: "flows", + DELETE_FLOW: "flows", + + CREATE_NAMESPACE_LICENSE: "license", + READ_NAMESPACE_LICENSE: "license", + DELETE_NAMESPACE_LICENSE: "license", + + UPDATE_ORGANIZATION: "organization", + DELETE_ORGANIZATION: "organization", + + NAMESPACE_ADMINISTRATOR: "admin", +} + +const abilityCategoryLabels: Record = { + members: "members", + projects: "projects", + roles: "roles", + runtimes: "runtimes", + flows: "flows", + license: "licenses", + organization: "the organization", + admin: "everything", +} + +type AbilityAction = "create" | "update" | "delete" | "assign" | "read" | "manage" + +type AbilityCategoryInfo = { + category: AbilityCategory + label: string + abilities: string[] + action: AbilityAction +} + +function getAbilityAction(ability: string): AbilityAction { + if (ability.startsWith("CREATE_")) return "create" + if (ability.startsWith("UPDATE_")) return "update" + if (ability.startsWith("DELETE_")) return "delete" + if (ability.startsWith("ASSIGN_")) return "assign" + if (ability.startsWith("READ_")) return "read" + return "manage" +} + +function mergeAbilityActions(actions: AbilityAction[]): AbilityAction { + const uniqueActions = Array.from(new Set(actions)) + if (uniqueActions.length === 1) return uniqueActions[0] + return "manage" +} + +function buildAbilityCategories(abilities: string[] | undefined): AbilityCategoryInfo[] { + if (!abilities || abilities.length === 0) return [] + + const bucket = new Map() + + for (const ability of abilities) { + const category = abilityCategoryByAbility[ability] + if (!category) continue + + const list = bucket.get(category) ?? [] + list.push(ability) + bucket.set(category, list) + } + + return Array.from(bucket.entries()).map(([category, categoryAbilities]) => { + const actions = categoryAbilities.map(getAbilityAction) + const action = mergeAbilityActions(actions) + + return { + category, + label: abilityCategoryLabels[category], + abilities: categoryAbilities, + action, + } + }) +} + +function renderPermissionSummary(categories: AbilityCategoryInfo[]) { + if (categories.length === 0) return "No special permissions." + + const renderCategory = (category: AbilityCategoryInfo) => ( + <> + {category.action}{" "} + + + + {category.label} + + + + + + {category.abilities.map(ability => ( + + + {ability} + + ))} + + + + + + + ) + + if (categories.length === 1) { + const category = categories[0] + return <>Can {renderCategory(category)} + } + + const leadingCategories = categories.slice(0, -1) + const lastCategory = categories[categories.length - 1] + + return ( + <> + Can{" "} + {leadingCategories.map((category, index) => ( + + {index > 0 && ", "} + {renderCategory(category)} + + ))} + {" "}and {renderCategory(lastCategory)} + + ) +} + +export interface RolePermissionComponentProps { + abilities?: string[] +} + +export const RolePermissionComponent: React.FC = (props) => { + const {abilities} = props + const categories = React.useMemo( + () => buildAbilityCategories(abilities), + [abilities] + ) + + return ( + + {renderPermissionSummary(categories)} + + ) +} \ No newline at end of file From 4e96b2869edee88b36d319efbeeb91ad106e3020 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sun, 15 Feb 2026 02:19:03 +0100 Subject: [PATCH 157/173] feat: add filter and sort functionality to MembersView with updated filter input for username and roles --- .../components/MemberDataTableComponent.tsx | 4 +- .../MemberDataTableFilterInputComponent.tsx | 84 ++++++++----------- .../fragments/Member.fragment.graphql | 1 + .../ce/src/member/views/MembersView.tsx | 82 ++++++++++++++++-- 4 files changed, 115 insertions(+), 56 deletions(-) diff --git a/src/packages/ce/src/member/components/MemberDataTableComponent.tsx b/src/packages/ce/src/member/components/MemberDataTableComponent.tsx index 8dd73b3f..b5278dfd 100644 --- a/src/packages/ce/src/member/components/MemberDataTableComponent.tsx +++ b/src/packages/ce/src/member/components/MemberDataTableComponent.tsx @@ -35,7 +35,7 @@ export const MemberDataTableComponent: React.FC = const memberService = useService(MemberService) const memberStore = useStore(MemberService) - const users = React.useMemo( + const members = React.useMemo( () => memberService.values({namespaceId: namespaceId}), [memberStore] ) @@ -48,7 +48,7 @@ export const MemberDataTableComponent: React.FC = } onSelect={(item) => item && onSelect?.(item)} - data={users.map(u => u.json()).filter(preFilter)}> + data={members.map(u => u.json()).filter(preFilter)}> {(member, index) => { return }} diff --git a/src/packages/ce/src/member/components/MemberDataTableFilterInputComponent.tsx b/src/packages/ce/src/member/components/MemberDataTableFilterInputComponent.tsx index 69f1da19..d62858f3 100644 --- a/src/packages/ce/src/member/components/MemberDataTableFilterInputComponent.tsx +++ b/src/packages/ce/src/member/components/MemberDataTableFilterInputComponent.tsx @@ -12,101 +12,87 @@ import {DataTableFilterProps} from "@code0-tech/pictor/dist/components/data-tabl import {RoleService} from "@edition/role/services/Role.service"; import {RuntimeService} from "@edition/runtime/services/Runtime.service"; import {UserService} from "@edition/user/services/User.service"; +import {MemberService} from "@edition/member/services/Member.service"; export interface MemberDataTableFilterInputComponentProps { + namespaceId: Namespace['id'] onChange: (filter: DataTableFilterProps) => void } export const MemberDataTableFilterInputComponent: React.FC = (props) => { - const {onChange} = props + const {namespaceId, onChange} = props - const userService = useService(UserService) - const userStore = useStore(UserService) + const memberService = useService(MemberService) + const memberStore = useStore(MemberService) + const roleService = useService(RoleService) + const roleStore = useStore(RoleService) - const users = React.useMemo( - () => userService.values(), - [userStore] + const members = React.useMemo( + () => memberService.values({namespaceId: namespaceId}), + [memberStore] + ) + + const roles = React.useMemo( + () => { + const roleIds = members.map(m => m.roles?.nodes?.map(r => r?.id)).flat() + return roleIds.map(id => roleService.getById(id)).filter(Boolean) + }, + [roleStore] ) return { const split = currentValue.split(",").map(s => s.trim()).filter(Boolean) return - {users.map(user => { + {members.map(member => { - const isChecked = split.includes(user?.username!) + const isChecked = split.includes(member?.user?.username!) - return { + return { e.preventDefault(); e.stopPropagation(); const updated = isChecked - ? split.filter(name => name !== user?.username) - : [...split, user?.username]; + ? split.filter(name => name !== member?.user?.username) + : [...split, member?.user?.username]; applySuggestion(updated.join(","), true); }}> {isChecked ? : } - @{user?.username} + @{member?.user?.username} })} } - }, { - token: "Email", - key: "email", - operators: ["isOneOf"], - suggestion: (context, operator, currentValue, applySuggestion) => { - - const split = currentValue.split(",").map(s => s.trim()).filter(Boolean) - - return - {users.map(user => { - - const isChecked = split.includes(user?.email!) - - return { - e.preventDefault(); - e.stopPropagation(); - const updated = isChecked - ? split.filter(name => name !== user?.email) - : [...split, user?.email]; - applySuggestion(updated.join(","), true); - }}> - {isChecked ? : } - {user?.email} - - })} - - } - }, { - token: "Owner", - key: "admin", + }, + { + token: "Roles", + key: "roles.nodes.name", operators: ["isOneOf"], suggestion: (context, operator, currentValue, applySuggestion) => { const split = currentValue.split(",").map(s => s.trim()).filter(Boolean) return - {["true", "false"].map(admin => { + {roles.map(role => { - const isChecked = split.includes(admin) + const isChecked = split.includes(role?.name!) - return { + return { e.preventDefault(); e.stopPropagation(); const updated = isChecked - ? split.filter(name => name !== admin) - : [...split, admin]; + ? split.filter(name => name !== role?.name) + : [...split, role?.name]; applySuggestion(updated.join(","), true); }}> {isChecked ? : } - {admin} + {role?.name} })} diff --git a/src/packages/ce/src/member/services/fragments/Member.fragment.graphql b/src/packages/ce/src/member/services/fragments/Member.fragment.graphql index e85742d8..647cf062 100644 --- a/src/packages/ce/src/member/services/fragments/Member.fragment.graphql +++ b/src/packages/ce/src/member/services/fragments/Member.fragment.graphql @@ -7,6 +7,7 @@ fragment Member on NamespaceMember { nodes { __typename id + name } pageInfo { endCursor diff --git a/src/packages/ce/src/member/views/MembersView.tsx b/src/packages/ce/src/member/views/MembersView.tsx index e565f762..0805e5bf 100644 --- a/src/packages/ce/src/member/views/MembersView.tsx +++ b/src/packages/ce/src/member/views/MembersView.tsx @@ -2,10 +2,11 @@ import React from "react"; import {useParams} from "next/navigation"; -import {Button, DNamespaceMemberList, Flex, Spacing, Text, useService, useStore} from "@code0-tech/pictor"; +import {Button, DataTableFilterProps, DataTableSortProps, Flex, Spacing, Text, ButtonGroup, Menu, MenuTrigger, MenuPortal, MenuContent, MenuCheckboxItem} from "@code0-tech/pictor"; import Link from "next/link"; -import {MemberService} from "@edition/member/services/Member.service"; import {MemberDataTableComponent} from "@edition/member/components/MemberDataTableComponent"; +import {MemberDataTableFilterInputComponent} from "@edition/member/components/MemberDataTableFilterInputComponent"; +import {IconMinus, IconSortAscending, IconSortDescending} from "@tabler/icons-react"; //TODO: user abilities for add user as member within namespace export const MembersView: React.FC = () => { @@ -13,20 +14,91 @@ export const MembersView: React.FC = () => { const params = useParams() const namespaceId = params.namespaceId as any as number + const [filter, setFilter] = React.useState({}) + const [sort, setSort] = React.useState({}) + return <> Members - + - + + + + + + + { + if (sort["user.username"] === undefined) + setSort(prev => ({...prev, "user.username": "asc"})) + else if (sort["user.username"] === "asc") + setSort(prev => ({...prev, "user.username": "desc"})) + else + setSort(prev => ({...prev, "user.username": undefined})) + + event.preventDefault() + event.stopPropagation() + }}> + {sort["user.username"] === undefined ? : sort["user.username"] === "asc" ? + : } + Username + + { + if (sort["createdAt"] === undefined) + setSort(prev => ({...prev, createdAt: "asc"})) + else if (sort["createdAt"] === "asc") + setSort(prev => ({...prev, createdAt: "desc"})) + else + setSort(prev => ({...prev, createdAt: undefined})) + + event.preventDefault() + event.stopPropagation() + }}> + {sort["createdAt"] === undefined ? + : sort["createdAt"] === "asc" ? + : } + Created At + + { + if (sort["updatedAt"] === undefined) + setSort(prev => ({...prev, updatedAt: "asc"})) + else if (sort["updatedAt"] === "asc") + setSort(prev => ({...prev, updatedAt: "desc"})) + else + setSort(prev => ({...prev, updatedAt: undefined})) + + event.preventDefault() + event.stopPropagation() + }}> + {sort["updatedAt"] === undefined ? + : sort["updatedAt"] === "asc" ? + : } + Updated At + + + + + - +
+ setFilter(filter)}/> +
+ + From 1b432d28025cfcaa7a50b074ca7ec8d0bb035b40 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sun, 15 Feb 2026 02:20:13 +0100 Subject: [PATCH 158/173] feat: add descriptive subtitle to MembersView for improved user guidance --- src/packages/ce/src/member/views/MembersView.tsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/packages/ce/src/member/views/MembersView.tsx b/src/packages/ce/src/member/views/MembersView.tsx index 0805e5bf..41a4fa67 100644 --- a/src/packages/ce/src/member/views/MembersView.tsx +++ b/src/packages/ce/src/member/views/MembersView.tsx @@ -20,9 +20,14 @@ export const MembersView: React.FC = () => { return <> - - Members - + + + Members + + + Manage members that belong to this namespace. You can add new members and manage their permissions. + + From cd3db63cefbae69cf950f2e3222cdf49673580a5 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sun, 15 Feb 2026 03:30:43 +0100 Subject: [PATCH 159/173] feat: add NamespaceOverviewOrganizationLeftView with organization details, member list, and runtimes section --- .../NamespaceOverviewOrganizationLeftView.tsx | 116 ++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 src/packages/ce/src/namespace/views/NamespaceOverviewOrganizationLeftView.tsx diff --git a/src/packages/ce/src/namespace/views/NamespaceOverviewOrganizationLeftView.tsx b/src/packages/ce/src/namespace/views/NamespaceOverviewOrganizationLeftView.tsx new file mode 100644 index 00000000..3aa6c1e3 --- /dev/null +++ b/src/packages/ce/src/namespace/views/NamespaceOverviewOrganizationLeftView.tsx @@ -0,0 +1,116 @@ +import React from "react"; +import { + AuroraBackground, + Avatar, + Button, + Flex, + hashToColor, + ScrollArea, + ScrollAreaScrollbar, + ScrollAreaThumb, + ScrollAreaViewport, + Spacing, + Text, + Tooltip, + TooltipContent, + TooltipPortal, + TooltipTrigger, + useService, + useStore +} from "@code0-tech/pictor"; +import {UserService} from "@edition/user/services/User.service"; +import {OrganizationService} from "@edition/organization/services/Organization.service"; +import Link from "next/link"; +import {useParams} from "next/navigation"; +import {MemberService} from "@edition/member/services/Member.service"; +import {NamespaceService} from "@edition/namespace/services/Namespace.service"; +import {RuntimeDataTableComponent} from "@edition/runtime/components/RuntimeDataTableComponent"; + +export const NamespaceOverviewOrganizationLeftView: React.FC = () => { + + const params = useParams() + const userService = useService(UserService) + const userStore = useStore(UserService) + const organizationService = useService(OrganizationService) + const organizationStore = useStore(OrganizationService) + const memberService = useService(MemberService) + const memberStore = useStore(MemberService) + const namespaceService = useService(NamespaceService) + const namespaceStore = useStore(NamespaceService) + + const namespaceIndex = params.namespaceId as any as number + + const namespace = React.useMemo( + () => namespaceService.getById(`gid://sagittarius/Namespace/${namespaceIndex}`), + [namespaceStore, namespaceIndex] + ) + const parentOrganization = React.useMemo( + () => namespace?.parent?.__typename === "Organization" ? organizationService.getById(namespace?.parent?.id) : null, + [organizationStore, namespace] + ) + + const members = React.useMemo( + () => memberService.values({namespaceId: `gid://sagittarius/Namespace/${namespaceIndex}`}), + [memberStore, userStore] + ) + + return + + + + + {parentOrganization?.name} + + + + + +
+ + Members + + + {members.map(member => { + const user = userService.getById(member.user?.id!!) + return + + + + + + + + @{user?.username} + + + {user?.email} + + + + + + })} + {members.length <= 0 && + + + } + + +
+ + Runtimes + + +
+
+ + + +
+ +} \ No newline at end of file From 4d7daa42322e265ecc68fdaec5bb67c79e0ad66e Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sun, 15 Feb 2026 03:30:51 +0100 Subject: [PATCH 160/173] feat: update NamespaceOverviewPage to use organization and personal left views, add scrollable ProjectsView area --- .../namespace/pages/NamespaceOverviewPage.tsx | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/packages/ce/src/namespace/pages/NamespaceOverviewPage.tsx b/src/packages/ce/src/namespace/pages/NamespaceOverviewPage.tsx index ad6402f2..c4f8bdf4 100644 --- a/src/packages/ce/src/namespace/pages/NamespaceOverviewPage.tsx +++ b/src/packages/ce/src/namespace/pages/NamespaceOverviewPage.tsx @@ -2,11 +2,11 @@ import React from "react"; import {ProjectsView} from "@edition/project/views/ProjectsView"; -import {DLayout, useService, useStore, useUserSession} from "@code0-tech/pictor"; -import {NamespaceOverviewRightView} from "@edition/namespace/views/NamespaceOverviewRightView"; -import {NamespaceOverviewLeftView} from "@edition/namespace/views/NamespaceOverviewLeftView"; +import {DLayout, useService, useStore, useUserSession, ScrollArea, ScrollAreaScrollbar, ScrollAreaThumb, ScrollAreaViewport} from "@code0-tech/pictor"; +import {NamespaceOverviewPersonalLeftView} from "@edition/namespace/views/NamespaceOverviewPersonalLeftView"; import {useParams} from "next/navigation"; import {UserService} from "@edition/user/services/User.service"; +import {NamespaceOverviewOrganizationLeftView} from "@edition/namespace/views/NamespaceOverviewOrganizationLeftView"; export const NamespaceOverviewPage: React.FC = () => { @@ -20,8 +20,8 @@ export const NamespaceOverviewPage: React.FC = () => { const namespaceId = params.namespaceId as any as string return : undefined} - rightContent={}> + leftContent={namespaceIndexCurrentUser == namespaceId ? : + }>
{ borderTopLeftRadius: "1rem", borderTopRightRadius: "1rem" }}> - + + + + + + + +
} \ No newline at end of file From 301a5251c3dcb43b82725f557bad77284ef2aebb Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sun, 15 Feb 2026 03:30:57 +0100 Subject: [PATCH 161/173] feat: add NamespaceOverviewPersonalLeftView with scrollable layout, organizations and members sections, and profile actions --- .../views/NamespaceOverviewLeftView.tsx | 78 ---------- .../NamespaceOverviewPersonalLeftView.tsx | 147 ++++++++++++++++++ 2 files changed, 147 insertions(+), 78 deletions(-) delete mode 100644 src/packages/ce/src/namespace/views/NamespaceOverviewLeftView.tsx create mode 100644 src/packages/ce/src/namespace/views/NamespaceOverviewPersonalLeftView.tsx diff --git a/src/packages/ce/src/namespace/views/NamespaceOverviewLeftView.tsx b/src/packages/ce/src/namespace/views/NamespaceOverviewLeftView.tsx deleted file mode 100644 index 720a89f2..00000000 --- a/src/packages/ce/src/namespace/views/NamespaceOverviewLeftView.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import React from "react"; -import { - Avatar, - Badge, - Button, - Flex, - hashToColor, - Spacing, - Text, - useService, - useStore, - useUserSession -} from "@code0-tech/pictor"; -import {UserService} from "@edition/user/services/User.service"; -import {IconMail, IconSparkles, IconUser, IconUserCog} from "@tabler/icons-react"; -import {OrganizationService} from "@edition/organization/services/Organization.service"; - -export const NamespaceOverviewLeftView: React.FC = () => { - - const userService = useService(UserService) - const userStore = useStore(UserService) - const organizationService = useService(OrganizationService) - const organizationStore = useStore(OrganizationService) - const currentSession = useUserSession() - - const currentUser = React.useMemo(() => userService.getById(currentSession?.user?.id), [userStore, currentSession]) - const organizations = React.useMemo(() => organizationService.values(), [organizationStore]) - - return -
- - - 👋 - -
- - - - {currentUser?.firstname} {currentUser?.lastname} - - - - - - - @{currentUser?.username} - - - - {currentUser?.admin ? Admin : - User} - - - - {currentUser?.email} - - - - {currentUser?.admin ? PRO : BASIC} - - - - - -
- - Organizations - - - {organizations.map(organization => { - return - })} - -
- -} \ No newline at end of file diff --git a/src/packages/ce/src/namespace/views/NamespaceOverviewPersonalLeftView.tsx b/src/packages/ce/src/namespace/views/NamespaceOverviewPersonalLeftView.tsx new file mode 100644 index 00000000..13775728 --- /dev/null +++ b/src/packages/ce/src/namespace/views/NamespaceOverviewPersonalLeftView.tsx @@ -0,0 +1,147 @@ +import React from "react"; +import { + AuroraBackground, + Avatar, + Badge, + Button, + Flex, + hashToColor, + ScrollArea, + ScrollAreaScrollbar, + ScrollAreaThumb, + ScrollAreaViewport, + Spacing, + Text, + Tooltip, + TooltipContent, + TooltipPortal, + TooltipTrigger, + useService, + useStore, + useUserSession +} from "@code0-tech/pictor"; +import {UserService} from "@edition/user/services/User.service"; +import {IconMail, IconSparkles, IconUser, IconUserCog} from "@tabler/icons-react"; +import {OrganizationService} from "@edition/organization/services/Organization.service"; +import Link from "next/link"; +import {useParams} from "next/navigation"; +import {MemberService} from "@edition/member/services/Member.service"; + +export const NamespaceOverviewPersonalLeftView: React.FC = () => { + + const params = useParams() + const userService = useService(UserService) + const userStore = useStore(UserService) + const organizationService = useService(OrganizationService) + const organizationStore = useStore(OrganizationService) + const memberService = useService(MemberService) + const memberStore = useStore(MemberService) + + const namespaceIndex = params.namespaceId as any as number + + const currentSession = useUserSession() + const currentUser = React.useMemo( + () => userService.getById(currentSession?.user?.id), + [userStore, currentSession] + ) + const organizations = React.useMemo( + () => organizationService.values(), + [organizationStore] + ) + + const members = React.useMemo( + () => memberService.values({namespaceId: `gid://sagittarius/Namespace/${namespaceIndex}`}), + [memberStore, userStore] + ) + + return + + +
+ + + 👋 + +
+ + {currentUser?.firstname} {currentUser?.lastname} + + + + + @{currentUser?.username} + + + + {currentUser?.admin ? Admin : + User} + + + + {currentUser?.email} + + + + BASIC + + + + + + + +
+ + Organizations + + + {organizations.map(organization => { + return + })} + {organizations.length <= 0 && You aren't a member of any organization} + + +
+ + Members + + + {members.map(member => { + const user = userService.getById(member.user?.id!!) + return + + + + + + + + @{user?.username} + + + {user?.email} + + + + + + })} + {members.length <= 0 && + + + } + + +
+
+ + + +
+ +} \ No newline at end of file From 2907ecf698b09f6873834b667e0cb18e2f14681c Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sun, 15 Feb 2026 03:31:03 +0100 Subject: [PATCH 162/173] feat: add minimized prop to RuntimeDataTableComponent and pass to row component --- .../ce/src/runtime/components/RuntimeDataTableComponent.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/packages/ce/src/runtime/components/RuntimeDataTableComponent.tsx b/src/packages/ce/src/runtime/components/RuntimeDataTableComponent.tsx index 913e342f..76321d8d 100644 --- a/src/packages/ce/src/runtime/components/RuntimeDataTableComponent.tsx +++ b/src/packages/ce/src/runtime/components/RuntimeDataTableComponent.tsx @@ -15,11 +15,12 @@ export interface ProjectDataTableComponentProps { filter?: DataTableFilterProps preFilter?: (project: Runtime, index: number) => boolean onSelect?: (item: Runtime | undefined) => void + minimized?: boolean } export const RuntimeDataTableComponent: React.FC = (props) => { - const {namespaceId, sort, filter, preFilter = () => true, onSelect} = props + const {namespaceId, sort, filter, preFilter = () => true, onSelect, minimized} = props const runtimeService = useService(RuntimeService) const runtimeStore = useStore(RuntimeService) @@ -39,7 +40,7 @@ export const RuntimeDataTableComponent: React.FC onSelect={(item) => item && onSelect?.(item)} data={runtimes.map(r => r.json()).filter(preFilter)}> {(runtime, index) => { - return + return }} From 056e49b6aabc31d25cebf8339ab1aff3c39f185d Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sun, 15 Feb 2026 03:31:06 +0100 Subject: [PATCH 163/173] feat: add minimized prop to RuntimeDataTableRowComponent to conditionally hide description and updated time --- .../RuntimeDataTableRowComponent.tsx | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/packages/ce/src/runtime/components/RuntimeDataTableRowComponent.tsx b/src/packages/ce/src/runtime/components/RuntimeDataTableRowComponent.tsx index 74eefcb1..a7aed099 100644 --- a/src/packages/ce/src/runtime/components/RuntimeDataTableRowComponent.tsx +++ b/src/packages/ce/src/runtime/components/RuntimeDataTableRowComponent.tsx @@ -1,16 +1,17 @@ import React from "react"; import {Runtime} from "@code0-tech/sagittarius-graphql-types"; -import {DataTableColumn, Flex, Text, useService, useStore, Badge} from "@code0-tech/pictor"; +import {Badge, DataTableColumn, Flex, Text, useService, useStore} from "@code0-tech/pictor"; import {RuntimeService} from "@edition/runtime/services/Runtime.service"; import {formatDistanceToNow} from "date-fns"; export interface ProjectDataTableRowComponentProps { runtimeId: Runtime['id'] + minimized?: boolean } export const RuntimeDataTableRowComponent: React.FC = (props) => { - const {runtimeId} = props + const {runtimeId, minimized} = props const runtimeService = useService(RuntimeService) const runtimeStore = useStore(RuntimeService) @@ -27,13 +28,17 @@ export const RuntimeDataTableRowComponent: React.FC {runtime?.name} - - {runtime?.description} - + {!minimized && ( + + {runtime?.description} + + )}
- - Updated {formatDistanceToNow(runtime?.updatedAt!)} ago - + {!minimized && ( + + Updated {formatDistanceToNow(runtime?.updatedAt!)} ago + + )} From 4febb4008fa96423f64f81f2f7fd0db337ae1e8e Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sun, 15 Feb 2026 20:10:28 +0100 Subject: [PATCH 164/173] feat: upgrade @code0-tech/pictor to 0.0.0-mvp.44 and add avvvatars-react dependency --- package-lock.json | 34 +++++++++++++++++++++++++++++----- package.json | 2 +- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 10765116..f1d484a2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0", "dependencies": { "@apollo/client": "^4.0.9", - "@code0-tech/pictor": "^0.0.0-mvp.43", + "@code0-tech/pictor": "^0.0.0-mvp.44", "date-fns": "^4.1.0", "graphql": "^16.12.0", "graphql-tag": "^2.12.6", @@ -363,9 +363,9 @@ } }, "node_modules/@code0-tech/pictor": { - "version": "0.0.0-mvp.43", - "resolved": "https://registry.npmjs.org/@code0-tech/pictor/-/pictor-0.0.0-mvp.43.tgz", - "integrity": "sha512-l1ZdmiFW6EeTWzXKNewjnteW+8ttIzG+yjOruWBOgxWgDkJ0mSQYdTR766KuICSI89ubwkOfNuou5pSPfuw1XQ==", + "version": "0.0.0-mvp.44", + "resolved": "https://registry.npmjs.org/@code0-tech/pictor/-/pictor-0.0.0-mvp.44.tgz", + "integrity": "sha512-88HdeJSQWrRJamYEMz3yI2F3700x5Yr7vn2A48iO9wLh4/wx8p6JtPa5C4rMKvCGBxJhzvo6GtOTqnDIUty21Q==", "peerDependencies": { "@ariakit/react": "^0.4.17", "@code0-tech/sagittarius-graphql-types": "0.0.0-703d578a55a3f0f20be3cb6892418f9e04d25716", @@ -391,6 +391,7 @@ "@uiw/codemirror-themes": "^4.25.4", "@uiw/react-codemirror": "^4.25.4", "@xyflow/react": "^12.10.0", + "avvvatars-react": "^0.4.2", "cmdk": "^1.1.1", "js-md5": "^0.8.3", "ldrs": "^1.1.9", @@ -4033,6 +4034,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/avvvatars-react": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/avvvatars-react/-/avvvatars-react-0.4.2.tgz", + "integrity": "sha512-D/bnSM+P6pQi71dFeFVqQsqmv+ct5XG7uO2lvJoiksALpXLd6kPgpRR1SUQxFZJkJNrkmg0NPgbhIgJgOsDYRQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "goober": "^2.1.8" + }, + "peerDependencies": { + "react": ">= 16", + "react-dom": ">= 16" + } + }, "node_modules/axe-core": { "version": "4.11.1", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.1.tgz", @@ -4400,7 +4415,6 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "devOptional": true, "license": "MIT" }, "node_modules/d3-color": { @@ -5706,6 +5720,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/goober": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.18.tgz", + "integrity": "sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "csstype": "^3.0.10" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", diff --git a/package.json b/package.json index e3008d19..36e59585 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ }, "dependencies": { "@apollo/client": "^4.0.9", - "@code0-tech/pictor": "^0.0.0-mvp.43", + "@code0-tech/pictor": "^0.0.0-mvp.44", "date-fns": "^4.1.0", "graphql": "^16.12.0", "graphql-tag": "^2.12.6", From 7c733aaef08ba42b3bead79d155cf892577e59b4 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sun, 15 Feb 2026 22:27:49 +0100 Subject: [PATCH 165/173] feat: implement projectDelete and projectUpdate mutations in ProjectService with corresponding GraphQL files --- .../src/project/services/Project.service.ts | 69 ++++++++++++++++++- .../mutations/Project.delete.mutation.graphql | 19 +++++ .../mutations/Project.update.mutation.graphql | 23 +++++++ 3 files changed, 109 insertions(+), 2 deletions(-) diff --git a/src/packages/ce/src/project/services/Project.service.ts b/src/packages/ce/src/project/services/Project.service.ts index 33c0e21b..a3cb0668 100644 --- a/src/packages/ce/src/project/services/Project.service.ts +++ b/src/packages/ce/src/project/services/Project.service.ts @@ -13,11 +13,16 @@ import { NamespacesProjectsCreatePayload, NamespacesProjectsDeleteInput, NamespacesProjectsDeletePayload, + NamespacesProjectsUpdateInput, + NamespacesProjectsUpdatePayload, Query } from "@code0-tech/sagittarius-graphql-types"; import {GraphqlClient} from "@core/util/graphql-client"; import projectsQuery from "./queries/Projects.query.graphql" import projectCreateMutation from "./mutations/Project.create.mutation.graphql" +import projectDeleteMutation from "./mutations/Project.delete.mutation.graphql" +import projectUpdateMutation from "./mutations/Project.update.mutation.graphql" +import projectAssignRuntimesMutation from "./mutations/Project.assignRuntimes.mutation.graphql" import {View} from "@code0-tech/pictor/dist/utils/view"; export class ProjectService extends DNamespaceProjectReactiveService { @@ -68,7 +73,28 @@ export class ProjectService extends DNamespaceProjectReactiveService { } async projectAssignRuntimes(payload: NamespacesProjectsAssignRuntimesInput): Promise { - return Promise.resolve(undefined); + const result = await this.client.mutate({ + mutation: projectAssignRuntimesMutation, + variables: { + ...payload + } + }) + + if (result.data && result.data.namespacesProjectsAssignRuntimes && result.data.namespacesProjectsAssignRuntimes.namespaceProject) { + const project = result.data.namespacesProjectsAssignRuntimes.namespaceProject + const index = this.values({namespaceId: project?.namespace?.id}).findIndex(o => o.id === project.id) + const projectStored = this.values({namespaceId: project?.namespace?.id}).find(o => o.id === project.id) + this.set(index, new View(new DNamespaceProjectView({ + ...projectStored?.json(), + runtimes: { + count: payload.runtimeIds.length, + nodes: payload.runtimeIds.map(runtimeId => ({ id: runtimeId })) + } + }))) + + } + + return result.data?.namespacesProjectsAssignRuntimes ?? undefined } async projectCreate(payload: NamespacesProjectsCreateInput): Promise { @@ -90,7 +116,46 @@ export class ProjectService extends DNamespaceProjectReactiveService { } async projectDelete(payload: NamespacesProjectsDeleteInput): Promise { - return Promise.resolve(undefined); + const result = await this.client.mutate({ + mutation: projectDeleteMutation, + variables: { + ...payload + } + }) + + if (result.data && result.data.namespacesProjectsDelete && result.data.namespacesProjectsDelete.namespaceProject) { + const project = result.data.namespacesProjectsDelete.namespaceProject + const index = this.values({namespaceId: project?.namespace?.id}).findIndex(o => o.id === project.id) + this.delete(index) + + } + + return result.data?.namespacesProjectsDelete ?? undefined + } + + async projectUpdate(payload: NamespacesProjectsUpdateInput): Promise { + const result = await this.client.mutate({ + mutation: projectUpdateMutation, + variables: { + ...payload + } + }) + + if (result.data && result.data.namespacesProjectsUpdate && result.data.namespacesProjectsUpdate.namespaceProject) { + const project = result.data.namespacesProjectsUpdate.namespaceProject + const index = this.values({namespaceId: project?.namespace?.id}).findIndex(o => o.id === project.id) + const projectStored = this.values({namespaceId: project?.namespace?.id}).find(o => o.id === project.id) + this.set(index, new View(new DNamespaceProjectView({ + ...projectStored?.json(), + ...(payload.name ? {name: payload.name} : {}), + ...(payload.description ? {description: payload.description} : {}), + ...(payload.slug ? {slug: payload.slug} : {}), + ...(payload.primaryRuntimeId ? {primaryRuntime: {id: payload.primaryRuntimeId}} : {}), + }))) + + } + + return result.data?.namespacesProjectsUpdate ?? undefined } } \ No newline at end of file diff --git a/src/packages/ce/src/project/services/mutations/Project.delete.mutation.graphql b/src/packages/ce/src/project/services/mutations/Project.delete.mutation.graphql index e69de29b..6d7af7da 100644 --- a/src/packages/ce/src/project/services/mutations/Project.delete.mutation.graphql +++ b/src/packages/ce/src/project/services/mutations/Project.delete.mutation.graphql @@ -0,0 +1,19 @@ +#import "../fragments/Project.basic.fragment.graphql" +mutation projectDelete ($namespaceProjectId: NamespaceProjectID!) { + namespacesProjectsDelete(input: { + namespaceProjectId: $namespaceProjectId + }) { + errors { + ...on Error { + errorCode, + details { + ...on ActiveModelError { attribute type } + __typename + } + } + } + namespaceProject { + ...BasicProject + } + } +} \ No newline at end of file diff --git a/src/packages/ce/src/project/services/mutations/Project.update.mutation.graphql b/src/packages/ce/src/project/services/mutations/Project.update.mutation.graphql index e69de29b..cb4d2a13 100644 --- a/src/packages/ce/src/project/services/mutations/Project.update.mutation.graphql +++ b/src/packages/ce/src/project/services/mutations/Project.update.mutation.graphql @@ -0,0 +1,23 @@ +#import "../fragments/Project.basic.fragment.graphql" +mutation projectUpdate ($namespaceProjectId: NamespaceProjectID!, $name: String, $description: String, $slug: String, $primaryRuntimeId: RuntimeID) { + namespacesProjectsUpdate(input: { + namespaceProjectId: $namespaceProjectId + name: $name + description: $description + slug: $slug + primaryRuntimeId: $primaryRuntimeId + }) { + errors { + ...on Error { + errorCode, + details { + ...on ActiveModelError { attribute type } + __typename + } + } + } + namespaceProject { + ...BasicProject + } + } +} \ No newline at end of file From 116c7584b5794e90a4afc6dcb9f733545fbb1e1e Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sun, 15 Feb 2026 22:27:55 +0100 Subject: [PATCH 166/173] feat: enhance project settings views with runtime assignment, slug editing, and project deletion functionality --- .../views/ProjectSettingsDeleteView.tsx | 34 +++++++- .../views/ProjectSettingsGeneralView.tsx | 41 ++++++++- .../views/ProjectSettingsRuntimesView.tsx | 84 +++++++++++++++---- 3 files changed, 136 insertions(+), 23 deletions(-) diff --git a/src/packages/ce/src/project/views/ProjectSettingsDeleteView.tsx b/src/packages/ce/src/project/views/ProjectSettingsDeleteView.tsx index 3a3304b1..092bb139 100644 --- a/src/packages/ce/src/project/views/ProjectSettingsDeleteView.tsx +++ b/src/packages/ce/src/project/views/ProjectSettingsDeleteView.tsx @@ -1,10 +1,38 @@ "use client" -import React from "react"; -import {Button, Card, Flex, Spacing, Text} from "@code0-tech/pictor"; +import React, {startTransition} from "react"; +import {Button, Card, Flex, Spacing, Text, toast, useService, useStore} from "@code0-tech/pictor"; import {TabContent} from "@code0-tech/pictor/dist/components/tab/Tab"; +import {useParams, useRouter} from "next/navigation"; +import {ProjectService} from "@edition/project/services/Project.service"; export const ProjectSettingsDeleteView: React.FC = () => { + + const params = useParams() + const router = useRouter() + const projectService = useService(ProjectService) + + const projectId = params.projectId as any as number + const namespaceId = params.namespaceId as any as number + + const deleteProject = React.useCallback(() => { + startTransition(() => { + projectService.projectDelete({ + namespaceProjectId: `gid://sagittarius/NamespaceProject/${projectId}` + }).then(payload => { + if ((payload?.errors?.length ?? 0) <= 0) { + toast({ + title: "The project was successfully deleted.", + color: "success", + dismissible: true, + }) + } + router.push(`/namespace/${namespaceId}`) + }) + }) + }, [projectId]) + + return Delete @@ -17,7 +45,7 @@ export const ProjectSettingsDeleteView: React.FC = () => { This will delete the project and cannot be undone. - diff --git a/src/packages/ce/src/project/views/ProjectSettingsGeneralView.tsx b/src/packages/ce/src/project/views/ProjectSettingsGeneralView.tsx index 5ec0fb07..63710b0a 100644 --- a/src/packages/ce/src/project/views/ProjectSettingsGeneralView.tsx +++ b/src/packages/ce/src/project/views/ProjectSettingsGeneralView.tsx @@ -1,9 +1,20 @@ "use client" import React, {startTransition} from "react"; -import {Button, Card, Flex, Spacing, Text, TextInput, useForm, useService, useStore} from "@code0-tech/pictor"; +import { + Button, + Card, + Flex, + Spacing, + TabContent, + Text, + TextInput, + useForm, + useService, + useStore, + toast +} from "@code0-tech/pictor"; import CardSection from "@code0-tech/pictor/dist/components/card/CardSection"; -import {TabContent} from "@code0-tech/pictor/dist/components/tab/Tab"; import {useParams} from "next/navigation"; import {ProjectService} from "@edition/project/services/Project.service"; @@ -24,6 +35,7 @@ export const ProjectSettingsGeneralView: React.FC = () => { () => ({ name: project?.name, description: project?.description, + slug: project?.slug, }), [project] ) @@ -35,10 +47,27 @@ export const ProjectSettingsGeneralView: React.FC = () => { if (!value) return "Name is required" return null }, + slug: (value) => { + if (!value) return "Slug is required" + return null + } }, onSubmit: (values) => { startTransition(() => { - + projectService.projectUpdate({ + slug: values.slug, + name: values.name, + description: values.description, + namespaceProjectId: `gid://sagittarius/NamespaceProject/${projectId}` + }).then(payload => { + if ((payload?.errors?.length ?? 0) <= 0) { + toast({ + title: "The project was successfully deleted.", + color: "success", + dismissible: true, + }) + } + }) }) } }) @@ -64,6 +93,12 @@ export const ProjectSettingsGeneralView: React.FC = () => { + + + Slug + + + diff --git a/src/packages/ce/src/project/views/ProjectSettingsRuntimesView.tsx b/src/packages/ce/src/project/views/ProjectSettingsRuntimesView.tsx index 781b96aa..200e44a0 100644 --- a/src/packages/ce/src/project/views/ProjectSettingsRuntimesView.tsx +++ b/src/packages/ce/src/project/views/ProjectSettingsRuntimesView.tsx @@ -1,44 +1,94 @@ "use client" -import React from "react" -import {Button, DRuntimeCard, DRuntimeList, Flex, Spacing, Text, useService, useStore} from "@code0-tech/pictor"; +import React, {startTransition} from "react" +import { + Button, + Flex, + Menu, + MenuContent, + MenuItem, + MenuPortal, + MenuTrigger, + Spacing, + Text, + useService, + useStore +} from "@code0-tech/pictor"; import {TabContent} from "@code0-tech/pictor/dist/components/tab/Tab"; import {useParams} from "next/navigation"; -import {ProjectService} from "@edition/project/services/Project.service"; +import {RuntimeProjectDataTableComponent} from "@edition/runtime/components/RuntimeProjectDataTableComponent"; import {RuntimeService} from "@edition/runtime/services/Runtime.service"; +import {ProjectService} from "@edition/project/services/Project.service"; +import {Runtime} from "@code0-tech/sagittarius-graphql-types"; export const ProjectSettingsRuntimesView: React.FC = () => { const params = useParams() - const projectService = useService(ProjectService) - const projectStore = useStore(ProjectService) const runtimeService = useService(RuntimeService) const runtimeStore = useStore(RuntimeService) + const projectService = useService(ProjectService) + const projectStore = useStore(ProjectService) const projectId = params.projectId as any as number + const namespaceId = params.namespaceId as any as number + + const availableRuntimes = React.useMemo( + () => { + const globalRuntimes = runtimeService.values().filter(runtime => !runtime?.namespace?.id) + const namespaceRuntimes = runtimeService.values({namespaceId: `gid://sagittarius/Namespace/${namespaceId}`}) + return [...globalRuntimes, ...namespaceRuntimes] + }, + [runtimeStore, projectId] + ) const project = React.useMemo( () => projectService.getById(`gid://sagittarius/NamespaceProject/${projectId}`), [projectStore, projectId] ) + const assignRuntime = React.useCallback((runtimeId: Runtime['id']) => { + const runtimeIds = project?.runtimes?.nodes?.map(r => r?.id!) ?? [] + + if (!runtimeId) return + if (runtimeIds.includes(runtimeId)) return + + startTransition(() => { + projectService.projectAssignRuntimes({ + runtimeIds: [...runtimeIds, runtimeId], + namespaceProjectId: `gid://sagittarius/NamespaceProject/${projectId}` + }) + }) + }, [projectService, projectId, project]) + return Runtimes - + + + + + + + {availableRuntimes.map(runtime => { + return assignRuntime(runtime.id)}> + + + {runtime?.name} + + + {runtime?.description} + + + + })} + + + - Primary Runtime - - - - All Runtimes - - { - return project?.runtimes?.nodes?.map(runtime => runtime?.id).includes(runtime?.id) ?? false - }}/> + } \ No newline at end of file From 8e8a3b144d7d3f2e84c0a53d25d8164f22bea688 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sun, 15 Feb 2026 22:27:59 +0100 Subject: [PATCH 167/173] feat: add RuntimeProjectDataTableComponent and row component for managing project runtimes --- .../RuntimeProjectDataTableComponent.tsx | 55 ++++++++ .../RuntimeProjectDataTableRowComponent.tsx | 117 ++++++++++++++++++ 2 files changed, 172 insertions(+) create mode 100644 src/packages/ce/src/runtime/components/RuntimeProjectDataTableComponent.tsx create mode 100644 src/packages/ce/src/runtime/components/RuntimeProjectDataTableRowComponent.tsx diff --git a/src/packages/ce/src/runtime/components/RuntimeProjectDataTableComponent.tsx b/src/packages/ce/src/runtime/components/RuntimeProjectDataTableComponent.tsx new file mode 100644 index 00000000..44afd579 --- /dev/null +++ b/src/packages/ce/src/runtime/components/RuntimeProjectDataTableComponent.tsx @@ -0,0 +1,55 @@ +import React from "react"; +import {DataTable, DataTableColumn, Text, useService, useStore} from "@code0-tech/pictor"; +import {DataTableFilterProps, DataTableSortProps} from "@code0-tech/pictor/dist/components/data-table/DataTable"; +import {Namespace, NamespaceProject, NamespaceRole, Runtime} from "@code0-tech/sagittarius-graphql-types"; +import {ProjectService} from "@edition/project/services/Project.service"; +import {ProjectDataTableRowComponent} from "@edition/project/components/ProjectDataTableRowComponent"; +import {RoleService} from "@edition/role/services/Role.service"; +import {RoleDataTableRowComponent} from "@edition/role/components/RoleDataTableRowComponent"; +import {RuntimeService} from "@edition/runtime/services/Runtime.service"; +import {RuntimeDataTableRowComponent} from "@edition/runtime/components/RuntimeDataTableRowComponent"; +import {RuntimeProjectDataTableRowComponent} from "@edition/runtime/components/RuntimeProjectDataTableRowComponent"; + +export interface RuntimeProjectDataTableComponentProps { + projectId?: NamespaceProject["id"] + sort?: DataTableSortProps + filter?: DataTableFilterProps + preFilter?: (project: Runtime, index: number) => boolean + onSelect?: (item: Runtime | undefined) => void + minimized?: boolean +} + +export const RuntimeProjectDataTableComponent: React.FC = (props) => { + + const {projectId, sort, filter, preFilter = () => true, onSelect, minimized} = props + + const projectService = useService(ProjectService) + const projectStore = useStore(ProjectService) + const runtimeService = useService(RuntimeService) + const runtimeStore = useStore(RuntimeService) + + const project = React.useMemo( + () => projectService.getById(projectId), + [projectStore, projectId] + ) + + const runtimes = React.useMemo( + () => runtimeService.values().filter(runtime => project?.runtimes?.nodes?.some(r => r?.id === runtime.id)), + [runtimeStore, project] + ) + + return + + No runtime found. Create one to get started. + + } + onSelect={(item) => item && onSelect?.(item)} + data={runtimes.map(r => r.json()).filter(preFilter)}> + {(runtime, index) => { + return + }} + + +} \ No newline at end of file diff --git a/src/packages/ce/src/runtime/components/RuntimeProjectDataTableRowComponent.tsx b/src/packages/ce/src/runtime/components/RuntimeProjectDataTableRowComponent.tsx new file mode 100644 index 00000000..2ff5a231 --- /dev/null +++ b/src/packages/ce/src/runtime/components/RuntimeProjectDataTableRowComponent.tsx @@ -0,0 +1,117 @@ +import React, {startTransition} from "react"; +import {NamespaceProject, Runtime} from "@code0-tech/sagittarius-graphql-types"; +import { + Badge, + Button, + DataTableColumn, + Flex, + Menu, + MenuContent, + MenuItem, + MenuPortal, + MenuTrigger, + Text, + useService, + useStore +} from "@code0-tech/pictor"; +import {RuntimeService} from "@edition/runtime/services/Runtime.service"; +import {formatDistanceToNow} from "date-fns"; +import {IconDotsVertical, IconServerSpark, IconUserCog, IconUserOff, IconX} from "@tabler/icons-react"; +import {ProjectService} from "@edition/project/services/Project.service"; + +export interface RuntimeProjectDataTableRowComponentProps { + projectId: NamespaceProject['id'] + runtimeId: Runtime['id'] +} + +export const RuntimeProjectDataTableRowComponent: React.FC = (props) => { + + const {projectId, runtimeId} = props + + const projectService = useService(ProjectService) + const projectStore = useStore(ProjectService) + const runtimeService = useService(RuntimeService) + const runtimeStore = useStore(RuntimeService) + + const runtime = React.useMemo( + () => runtimeService.getById(runtimeId), + [runtimeStore, runtimeId] + ) + + const project = React.useMemo( + () => projectService.getById(projectId), + [projectStore, projectId] + ) + + const makePrimary = React.useCallback(() => { + startTransition(() => { + projectService.projectUpdate({ + primaryRuntimeId: runtimeId, + namespaceProjectId: projectId!, + }) + }) + }, [projectId, runtimeId]) + + const removeRuntime = React.useCallback(() => { + const runtimeIds = project?.runtimes?.nodes?.map(r => r?.id!) ?? [] + + startTransition(() => { + projectService.projectAssignRuntimes({ + runtimeIds: runtimeIds.filter(id => id !== runtimeId), + namespaceProjectId: projectId! + }) + }) + }, [projectId, project, runtimeId]) + + return <> + + + + + + {runtime?.name} + + {project?.primaryRuntime?.id === runtime?.id ? + Primary : null} + + + {runtime?.description} + + + + Updated {formatDistanceToNow(runtime?.updatedAt!)} ago + + + + + + {runtime?.status} + + + { + project?.primaryRuntime?.id !== runtime?.id && ( + + + + + + + + + + Remove runtime + + + + Make primary + + + + + + ) + } + +} \ No newline at end of file From 426231299d8e87d162c48f538f9509e596896d38 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sun, 15 Feb 2026 23:41:10 +0100 Subject: [PATCH 168/173] feat: enhance runtime assignment menu with avatars, status badges, and updated time --- .../views/ProjectSettingsRuntimesView.tsx | 45 ++++++++++++++----- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/src/packages/ce/src/project/views/ProjectSettingsRuntimesView.tsx b/src/packages/ce/src/project/views/ProjectSettingsRuntimesView.tsx index 200e44a0..694a4ae1 100644 --- a/src/packages/ce/src/project/views/ProjectSettingsRuntimesView.tsx +++ b/src/packages/ce/src/project/views/ProjectSettingsRuntimesView.tsx @@ -2,14 +2,18 @@ import React, {startTransition} from "react" import { + Avatar, Button, Flex, + hashToColor, Menu, MenuContent, MenuItem, MenuPortal, + MenuSeparator, MenuTrigger, Spacing, + Badge, Text, useService, useStore @@ -20,6 +24,7 @@ import {RuntimeProjectDataTableComponent} from "@edition/runtime/components/Runt import {RuntimeService} from "@edition/runtime/services/Runtime.service"; import {ProjectService} from "@edition/project/services/Project.service"; import {Runtime} from "@code0-tech/sagittarius-graphql-types"; +import {formatDistanceToNow} from "date-fns"; export const ProjectSettingsRuntimesView: React.FC = () => { @@ -71,17 +76,35 @@ export const ProjectSettingsRuntimesView: React.FC = () => { - {availableRuntimes.map(runtime => { - return assignRuntime(runtime.id)}> - - - {runtime?.name} - - - {runtime?.description} - - - + {availableRuntimes.map((runtime, index) => { + return <> + assignRuntime(runtime.id)}> + + + + + + {runtime?.name} + + + + {runtime?.status} + + + + + + + Updated {formatDistanceToNow(runtime?.updatedAt!)} ago + + + + {index < availableRuntimes.length - 1 ? + : null} + })} From 070cb652d772318eeb53f018cd1e4fb35cc662b6 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sun, 15 Feb 2026 23:41:15 +0100 Subject: [PATCH 169/173] feat: add runtime avatar to data table row and refactor layout for improved clarity --- .../RuntimeProjectDataTableRowComponent.tsx | 39 +++++++++++-------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/src/packages/ce/src/runtime/components/RuntimeProjectDataTableRowComponent.tsx b/src/packages/ce/src/runtime/components/RuntimeProjectDataTableRowComponent.tsx index 2ff5a231..03960923 100644 --- a/src/packages/ce/src/runtime/components/RuntimeProjectDataTableRowComponent.tsx +++ b/src/packages/ce/src/runtime/components/RuntimeProjectDataTableRowComponent.tsx @@ -1,10 +1,12 @@ import React, {startTransition} from "react"; import {NamespaceProject, Runtime} from "@code0-tech/sagittarius-graphql-types"; import { + Avatar, Badge, Button, DataTableColumn, Flex, + hashToColor, Menu, MenuContent, MenuItem, @@ -16,7 +18,7 @@ import { } from "@code0-tech/pictor"; import {RuntimeService} from "@edition/runtime/services/Runtime.service"; import {formatDistanceToNow} from "date-fns"; -import {IconDotsVertical, IconServerSpark, IconUserCog, IconUserOff, IconX} from "@tabler/icons-react"; +import {IconDotsVertical, IconServerSpark, IconX} from "@tabler/icons-react"; import {ProjectService} from "@edition/project/services/Project.service"; export interface RuntimeProjectDataTableRowComponentProps { @@ -66,17 +68,22 @@ export const RuntimeProjectDataTableRowComponent: React.FC - - - - {runtime?.name} + + + + + + {runtime?.name} + + {project?.primaryRuntime?.id === runtime?.id ? + Primary : null} + + + {runtime?.description} - {project?.primaryRuntime?.id === runtime?.id ? - Primary : null} - - {runtime?.description} - Updated {formatDistanceToNow(runtime?.updatedAt!)} ago @@ -88,9 +95,9 @@ export const RuntimeProjectDataTableRowComponent: React.FC{runtime?.status} - { - project?.primaryRuntime?.id !== runtime?.id && ( - + + { + project?.primaryRuntime?.id !== runtime?.id && ( - - ) - } + ) + } + } \ No newline at end of file From 162e6a680e84d494710988dbbf38093c6ce6c254 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sun, 15 Feb 2026 23:46:58 +0100 Subject: [PATCH 170/173] chore: upgrade @code0-tech/pictor to version 0.0.0-mvp.45 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index f1d484a2..8b085ea1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0", "dependencies": { "@apollo/client": "^4.0.9", - "@code0-tech/pictor": "^0.0.0-mvp.44", + "@code0-tech/pictor": "^0.0.0-mvp.45", "date-fns": "^4.1.0", "graphql": "^16.12.0", "graphql-tag": "^2.12.6", @@ -363,9 +363,9 @@ } }, "node_modules/@code0-tech/pictor": { - "version": "0.0.0-mvp.44", - "resolved": "https://registry.npmjs.org/@code0-tech/pictor/-/pictor-0.0.0-mvp.44.tgz", - "integrity": "sha512-88HdeJSQWrRJamYEMz3yI2F3700x5Yr7vn2A48iO9wLh4/wx8p6JtPa5C4rMKvCGBxJhzvo6GtOTqnDIUty21Q==", + "version": "0.0.0-mvp.45", + "resolved": "https://registry.npmjs.org/@code0-tech/pictor/-/pictor-0.0.0-mvp.45.tgz", + "integrity": "sha512-lCiqOhD+9dZowbnHg+UMJey2yWVVFUk8NRgxxk0DwUUVOXTqbWs+EGMv367tJi6aIrlhnsTlcWnFgbt2CvYY4w==", "peerDependencies": { "@ariakit/react": "^0.4.17", "@code0-tech/sagittarius-graphql-types": "0.0.0-703d578a55a3f0f20be3cb6892418f9e04d25716", diff --git a/package.json b/package.json index 36e59585..13cc515f 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ }, "dependencies": { "@apollo/client": "^4.0.9", - "@code0-tech/pictor": "^0.0.0-mvp.44", + "@code0-tech/pictor": "^0.0.0-mvp.45", "date-fns": "^4.1.0", "graphql": "^16.12.0", "graphql-tag": "^2.12.6", From 71bce1565a5124f338540a7761b0c97cc51f0aca Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sun, 15 Feb 2026 23:48:08 +0100 Subject: [PATCH 171/173] refactor: remove dynamic color from settings icon in project navigation --- .../namespace/[namespaceId]/project/[projectId]/default.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/(flow)/@tab/namespace/[namespaceId]/project/[projectId]/default.tsx b/src/app/(flow)/@tab/namespace/[namespaceId]/project/[projectId]/default.tsx index 7343f054..d2a8b584 100644 --- a/src/app/(flow)/@tab/namespace/[namespaceId]/project/[projectId]/default.tsx +++ b/src/app/(flow)/@tab/namespace/[namespaceId]/project/[projectId]/default.tsx @@ -46,7 +46,7 @@ export default function Page() { From d8fc2d4173aaa257cb46c0c7edb8732d9963bc0e Mon Sep 17 00:00:00 2001 From: nicosammito Date: Mon, 16 Feb 2026 00:01:47 +0100 Subject: [PATCH 172/173] refactor: remove unused bar and tab props from ApplicationLayout --- .../[namespaceId]/project/[projectId]/flow/layout.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/layout.tsx b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/layout.tsx index 7212ef2e..ae24ca0d 100644 --- a/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/layout.tsx +++ b/src/app/(flow)/namespace/[namespaceId]/project/[projectId]/flow/layout.tsx @@ -6,11 +6,9 @@ import {FlowFolderView} from "@edition/flow/views/FlowFolderView"; interface ApplicationLayoutProps { children: React.ReactNode - bar: React.ReactNode - tab: React.ReactNode } -const ApplicationLayout: React.FC = ({children, bar, tab}) => { +const ApplicationLayout: React.FC = ({children}) => { return From c48afa029a8cdf9e497392e73fa878f6c509738d Mon Sep 17 00:00:00 2001 From: nicosammito Date: Mon, 16 Feb 2026 00:01:51 +0100 Subject: [PATCH 173/173] chore: upgrade next and eslint-config-next to version 16.1.5 --- package-lock.json | 99 +++++++++++++++++++++++------------------------ package.json | 4 +- 2 files changed, 51 insertions(+), 52 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8b085ea1..350dbb7f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "date-fns": "^4.1.0", "graphql": "^16.12.0", "graphql-tag": "^2.12.6", - "next": "16.0.7", + "next": "16.1.5", "react": "19.2.3", "react-dom": "19.2.3", "rxjs": "^7.8.2", @@ -25,7 +25,7 @@ "@types/react-dom": "^19", "babel-plugin-react-compiler": "^1.0.0", "eslint": "^9", - "eslint-config-next": "16.0.7", + "eslint-config-next": "16.1.5", "typescript": "^5" } }, @@ -1412,15 +1412,15 @@ } }, "node_modules/@next/env": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-16.0.7.tgz", - "integrity": "sha512-gpaNgUh5nftFKRkRQGnVi5dpcYSKGcZZkQffZ172OrG/XkrnS7UBTQ648YY+8ME92cC4IojpI2LqTC8sTDhAaw==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.1.5.tgz", + "integrity": "sha512-CRSCPJiSZoi4Pn69RYBDI9R7YK2g59vLexPQFXY0eyw+ILevIenCywzg+DqmlBik9zszEnw2HLFOUlLAcJbL7g==", "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.0.7.tgz", - "integrity": "sha512-hFrTNZcMEG+k7qxVxZJq3F32Kms130FAhG8lvw2zkKBgAcNOJIxlljNiCjGygvBshvaGBdf88q2CqWtnqezDHA==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.1.5.tgz", + "integrity": "sha512-gUWcEsOl+1W7XakmouClcJ0TNFCkblvDUho31wulbDY9na0C6mGtBTSXGRU5GXJY65GjGj0zNaCD/GaBp888Mg==", "dev": true, "license": "MIT", "dependencies": { @@ -1428,9 +1428,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.0.7.tgz", - "integrity": "sha512-LlDtCYOEj/rfSnEn/Idi+j1QKHxY9BJFmxx7108A6D8K0SB+bNgfYQATPk/4LqOl4C0Wo3LACg2ie6s7xqMpJg==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.1.5.tgz", + "integrity": "sha512-eK7Wdm3Hjy/SCL7TevlH0C9chrpeOYWx2iR7guJDaz4zEQKWcS1IMVfMb9UKBFMg1XgzcPTYPIp1Vcpukkjg6Q==", "cpu": [ "arm64" ], @@ -1444,9 +1444,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.0.7.tgz", - "integrity": "sha512-rtZ7BhnVvO1ICf3QzfW9H3aPz7GhBrnSIMZyr4Qy6boXF0b5E3QLs+cvJmg3PsTCG2M1PBoC+DANUi4wCOKXpA==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.1.5.tgz", + "integrity": "sha512-foQscSHD1dCuxBmGkbIr6ScAUF6pRoDZP6czajyvmXPAOFNnQUJu2Os1SGELODjKp/ULa4fulnBWoHV3XdPLfA==", "cpu": [ "x64" ], @@ -1460,9 +1460,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.0.7.tgz", - "integrity": "sha512-mloD5WcPIeIeeZqAIP5c2kdaTa6StwP4/2EGy1mUw8HiexSHGK/jcM7lFuS3u3i2zn+xH9+wXJs6njO7VrAqww==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.1.5.tgz", + "integrity": "sha512-qNIb42o3C02ccIeSeKjacF3HXotGsxh/FMk/rSRmCzOVMtoWH88odn2uZqF8RLsSUWHcAqTgYmPD3pZ03L9ZAA==", "cpu": [ "arm64" ], @@ -1476,9 +1476,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.0.7.tgz", - "integrity": "sha512-+ksWNrZrthisXuo9gd1XnjHRowCbMtl/YgMpbRvFeDEqEBd523YHPWpBuDjomod88U8Xliw5DHhekBC3EOOd9g==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.1.5.tgz", + "integrity": "sha512-U+kBxGUY1xMAzDTXmuVMfhaWUZQAwzRaHJ/I6ihtR5SbTVUEaDRiEU9YMjy1obBWpdOBuk1bcm+tsmifYSygfw==", "cpu": [ "arm64" ], @@ -1492,9 +1492,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.7.tgz", - "integrity": "sha512-4WtJU5cRDxpEE44Ana2Xro1284hnyVpBb62lIpU5k85D8xXxatT+rXxBgPkc7C1XwkZMWpK5rXLXTh9PFipWsA==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.1.5.tgz", + "integrity": "sha512-gq2UtoCpN7Ke/7tKaU7i/1L7eFLfhMbXjNghSv0MVGF1dmuoaPeEVDvkDuO/9LVa44h5gqpWeJ4mRRznjDv7LA==", "cpu": [ "x64" ], @@ -1508,9 +1508,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.7.tgz", - "integrity": "sha512-HYlhqIP6kBPXalW2dbMTSuB4+8fe+j9juyxwfMwCe9kQPPeiyFn7NMjNfoFOfJ2eXkeQsoUGXg+O2SE3m4Qg2w==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.1.5.tgz", + "integrity": "sha512-bQWSE729PbXT6mMklWLf8dotislPle2L70E9q6iwETYEOt092GDn0c+TTNj26AjmeceSsC4ndyGsK5nKqHYXjQ==", "cpu": [ "x64" ], @@ -1524,9 +1524,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.7.tgz", - "integrity": "sha512-EviG+43iOoBRZg9deGauXExjRphhuYmIOJ12b9sAPy0eQ6iwcPxfED2asb/s2/yiLYOdm37kPaiZu8uXSYPs0Q==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.1.5.tgz", + "integrity": "sha512-LZli0anutkIllMtTAWZlDqdfvjWX/ch8AFK5WgkNTvaqwlouiD1oHM+WW8RXMiL0+vAkAJyAGEzPPjO+hnrSNQ==", "cpu": [ "arm64" ], @@ -1540,9 +1540,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.7.tgz", - "integrity": "sha512-gniPjy55zp5Eg0896qSrf3yB1dw4F/3s8VK1ephdsZZ129j2n6e1WqCbE2YgcKhW9hPB9TVZENugquWJD5x0ug==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.1.5.tgz", + "integrity": "sha512-7is37HJTNQGhjPpQbkKjKEboHYQnCgpVt/4rBrrln0D9nderNxZ8ZWs8w1fAtzUx7wEyYjQ+/13myFgFj6K2Ng==", "cpu": [ "x64" ], @@ -4089,7 +4089,6 @@ "version": "2.9.14", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.14.tgz", "integrity": "sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==", - "dev": true, "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.js" @@ -5010,13 +5009,13 @@ } }, "node_modules/eslint-config-next": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.0.7.tgz", - "integrity": "sha512-WubFGLFHfk2KivkdRGfx6cGSFhaQqhERRfyO8BRx+qiGPGp7WLKcPvYC4mdx1z3VhVRcrfFzczjjTrbJZOpnEQ==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.1.5.tgz", + "integrity": "sha512-XwXyv65DC1HXI3gMxm13jvgx0IxKu6XhZhIWTfCDt4c45njHYUM2pk1Y8QXMAWMMnqPy94I2OLMmvIrNGcwLwQ==", "dev": true, "license": "MIT", "dependencies": { - "@next/eslint-plugin-next": "16.0.7", + "@next/eslint-plugin-next": "16.1.5", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.32.0", @@ -6817,14 +6816,14 @@ "license": "MIT" }, "node_modules/next": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/next/-/next-16.0.7.tgz", - "integrity": "sha512-3mBRJyPxT4LOxAJI6IsXeFtKfiJUbjCLgvXO02fV8Wy/lIhPvP94Fe7dGhUgHXcQy4sSuYwQNcOLhIfOm0rL0A==", - "deprecated": "This version has a security vulnerability. Please upgrade to a patched version. See https://nextjs.org/blog/security-update-2025-12-11 for more details.", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/next/-/next-16.1.5.tgz", + "integrity": "sha512-f+wE+NSbiQgh3DSAlTaw2FwY5yGdVViAtp8TotNQj4kk4Q8Bh1sC/aL9aH+Rg1YAVn18OYXsRDT7U/079jgP7w==", "license": "MIT", "dependencies": { - "@next/env": "16.0.7", + "@next/env": "16.1.5", "@swc/helpers": "0.5.15", + "baseline-browser-mapping": "^2.8.3", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" @@ -6836,14 +6835,14 @@ "node": ">=20.9.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "16.0.7", - "@next/swc-darwin-x64": "16.0.7", - "@next/swc-linux-arm64-gnu": "16.0.7", - "@next/swc-linux-arm64-musl": "16.0.7", - "@next/swc-linux-x64-gnu": "16.0.7", - "@next/swc-linux-x64-musl": "16.0.7", - "@next/swc-win32-arm64-msvc": "16.0.7", - "@next/swc-win32-x64-msvc": "16.0.7", + "@next/swc-darwin-arm64": "16.1.5", + "@next/swc-darwin-x64": "16.1.5", + "@next/swc-linux-arm64-gnu": "16.1.5", + "@next/swc-linux-arm64-musl": "16.1.5", + "@next/swc-linux-x64-gnu": "16.1.5", + "@next/swc-linux-x64-musl": "16.1.5", + "@next/swc-win32-arm64-msvc": "16.1.5", + "@next/swc-win32-x64-msvc": "16.1.5", "sharp": "^0.34.4" }, "peerDependencies": { diff --git a/package.json b/package.json index 13cc515f..22eb150d 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "date-fns": "^4.1.0", "graphql": "^16.12.0", "graphql-tag": "^2.12.6", - "next": "16.0.7", + "next": "16.1.5", "react": "19.2.3", "react-dom": "19.2.3", "rxjs": "^7.8.2", @@ -31,7 +31,7 @@ "@types/react-dom": "^19", "babel-plugin-react-compiler": "^1.0.0", "eslint": "^9", - "eslint-config-next": "16.0.7", + "eslint-config-next": "16.1.5", "typescript": "^5" } }