+
{{ i18n.baseText('workflows.item.readonly') }}
@@ -55,14 +101,6 @@ const dataStoreRoute = computed(() => {
-
- {{ i18n.baseText('dataStore.card.size', { interpolate: { size: dataStore.size } }) }}
-
{
>
{{
i18n.baseText('dataStore.card.row.count', {
- interpolate: { count: props.dataStore.recordCount },
+ interpolate: { count: props.dataStore.recordCount ?? 0 },
})
}}
@@ -83,7 +121,7 @@ const dataStoreRoute = computed(() => {
>
{{
i18n.baseText('dataStore.card.column.count', {
- interpolate: { count: props.dataStore.columnCount },
+ interpolate: { count: props.dataStore.columns.length },
})
}}
@@ -113,7 +151,8 @@ const dataStoreRoute = computed(() => {
v-if="props.actions.length"
:actions="props.actions"
theme="dark"
- data-test-id="folder-card-actions"
+ data-test-id="data-store-card-actions"
+ @action="onCardAction"
/>
@@ -132,6 +171,12 @@ const dataStoreRoute = computed(() => {
}
}
+.card-name {
+ color: $custom-font-dark;
+ font-size: var(--font-size-m);
+ margin-bottom: var(--spacing-5xs);
+}
+
.card-icon {
flex-shrink: 0;
color: var(--color-text-base);
diff --git a/packages/frontend/editor-ui/src/features/dataStore/dataStore.store.ts b/packages/frontend/editor-ui/src/features/dataStore/dataStore.store.ts
index cf3914749d..c42f549571 100644
--- a/packages/frontend/editor-ui/src/features/dataStore/dataStore.store.ts
+++ b/packages/frontend/editor-ui/src/features/dataStore/dataStore.store.ts
@@ -2,7 +2,12 @@ import { defineStore } from 'pinia';
import { DATA_STORE_STORE } from '@/features/dataStore/constants';
import { ref } from 'vue';
import { useRootStore } from '@n8n/stores/useRootStore';
-import { fetchDataStores, createDataStore } from '@/features/dataStore/datastore.api';
+import {
+ fetchDataStoresApi,
+ createDataStoreApi,
+ deleteDataStoreApi,
+ updateDataStoreApi,
+} from '@/features/dataStore/datastore.api';
import type { DataStoreEntity } from '@/features/dataStore/datastore.types';
export const useDataStoreStore = defineStore(DATA_STORE_STORE, () => {
@@ -11,26 +16,55 @@ export const useDataStoreStore = defineStore(DATA_STORE_STORE, () => {
const dataStores = ref
([]);
const totalCount = ref(0);
- const loadDataStores = async (projectId: string, page: number, pageSize: number) => {
- const response = await fetchDataStores(rootStore.restApiContext, projectId, {
- page,
- pageSize,
+ const fetchDataStores = async (projectId: string, page: number, pageSize: number) => {
+ const response = await fetchDataStoresApi(rootStore.restApiContext, projectId, {
+ skip: (page - 1) * pageSize,
+ take: pageSize,
});
+ console.log('Data stores fetched:', response);
+
dataStores.value = response.data;
totalCount.value = response.count;
};
- const createNewDataStore = async (name: string, projectId?: string) => {
- const newStore = await createDataStore(rootStore.restApiContext, name, projectId);
- dataStores.value.push(newStore.data);
+ const createDataStore = async (name: string, projectId?: string) => {
+ const newStore = await createDataStoreApi(rootStore.restApiContext, name, projectId);
+ dataStores.value.push(newStore);
totalCount.value += 1;
return newStore;
};
+ const deleteDataStore = async (datastoreId: string, projectId?: string) => {
+ const deleted = await deleteDataStoreApi(rootStore.restApiContext, datastoreId, projectId);
+ if (deleted) {
+ dataStores.value = dataStores.value.filter((store) => store.id !== datastoreId);
+ totalCount.value -= 1;
+ }
+ return deleted;
+ };
+
+ const updateDataStore = async (datastoreId: string, name: string, projectId?: string) => {
+ const updated = await updateDataStoreApi(
+ rootStore.restApiContext,
+ datastoreId,
+ name,
+ projectId,
+ );
+ if (updated) {
+ const index = dataStores.value.findIndex((store) => store.id === datastoreId);
+ if (index !== -1) {
+ dataStores.value[index] = { ...dataStores.value[index], name };
+ }
+ }
+ return updated;
+ };
+
return {
dataStores,
totalCount,
- loadDataStores,
- createNewDataStore,
+ fetchDataStores,
+ createDataStore,
+ deleteDataStore,
+ updateDataStore,
};
});
diff --git a/packages/frontend/editor-ui/src/features/dataStore/datastore.api.ts b/packages/frontend/editor-ui/src/features/dataStore/datastore.api.ts
index 53b3ed7077..f82b137eb8 100644
--- a/packages/frontend/editor-ui/src/features/dataStore/datastore.api.ts
+++ b/packages/frontend/editor-ui/src/features/dataStore/datastore.api.ts
@@ -1,29 +1,71 @@
-import { getFullApiResponse } from '@n8n/rest-api-client';
+import { makeRestApiRequest } from '@n8n/rest-api-client';
import type { IRestApiContext } from '@n8n/rest-api-client';
import { type DataStoreEntity } from '@/features/dataStore/datastore.types';
-export const fetchDataStores = async (
+export const fetchDataStoresApi = async (
context: IRestApiContext,
projectId?: string,
options?: {
- page?: number;
- pageSize?: number;
+ skip?: number;
+ take?: number;
},
) => {
- return await getFullApiResponse(context, 'GET', '/data-stores', {
- projectId,
- options,
- });
+ const apiEndpoint = projectId ? `/projects/${projectId}/data-stores` : '/data-stores-global';
+ return await makeRestApiRequest<{ count: number; data: DataStoreEntity[] }>(
+ context,
+ 'GET',
+ apiEndpoint,
+ {
+ ...options,
+ },
+ );
};
-export const createDataStore = async (
+export const createDataStoreApi = async (
context: IRestApiContext,
name: string,
projectId?: string,
) => {
- return await getFullApiResponse(context, 'POST', '/data-stores', {
- name,
- projectId,
- });
+ return await makeRestApiRequest(
+ context,
+ 'POST',
+ `/projects/${projectId}/data-stores`,
+ {
+ name,
+ columns: [],
+ },
+ );
+};
+
+export const deleteDataStoreApi = async (
+ context: IRestApiContext,
+ dataStoreId: string,
+ projectId?: string,
+) => {
+ return await makeRestApiRequest(
+ context,
+ 'DELETE',
+ `/projects/${projectId}/data-stores/${dataStoreId}`,
+ {
+ dataStoreId,
+ projectId,
+ },
+ );
+};
+
+export const updateDataStoreApi = async (
+ context: IRestApiContext,
+ dataStoreId: string,
+ name: string,
+ projectId?: string,
+) => {
+ return await makeRestApiRequest(
+ context,
+ 'PATCH',
+ `/projects/${projectId}/data-stores/${dataStoreId}`,
+ {
+ name,
+ },
+ );
};
diff --git a/packages/frontend/editor-ui/src/features/dataStore/datastore.types.ts b/packages/frontend/editor-ui/src/features/dataStore/datastore.types.ts
index a91fa97b55..f3ba0cb17b 100644
--- a/packages/frontend/editor-ui/src/features/dataStore/datastore.types.ts
+++ b/packages/frontend/editor-ui/src/features/dataStore/datastore.types.ts
@@ -1,10 +1,20 @@
+import type { ProjectSharingData } from 'n8n-workflow';
+
export type DataStoreEntity = {
id: string;
name: string;
- size: number;
+ sizeBytes: number;
recordCount: number;
- columnCount: number;
+ columns: DataStoreColumnEntity[];
createdAt: string;
updatedAt: string;
projectId?: string;
+ project?: ProjectSharingData;
+};
+
+export type DataStoreColumnEntity = {
+ id: string;
+ name: string;
+ type: string;
+ index: number;
};