@@ -81,6 +127,7 @@ const handleUseTemplate = async () => {
flex-direction: column;
justify-content: space-between;
min-width: 200px;
+ background-color: var(--color--background--light-2);
cursor: pointer;
}
diff --git a/packages/frontend/editor-ui/src/experiments/templatesDataQuality/components/TemplatesDataQualityInlineSection.vue b/packages/frontend/editor-ui/src/experiments/templatesDataQuality/components/TemplatesDataQualityInlineSection.vue
new file mode 100644
index 00000000000..92fbb0a4098
--- /dev/null
+++ b/packages/frontend/editor-ui/src/experiments/templatesDataQuality/components/TemplatesDataQualityInlineSection.vue
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+ {{ locale.baseText('workflows.empty.startWithTemplate') }}
+
+
+ {{ locale.baseText('workflows.templatesDataQuality.seeMoreTemplates') }}
+
+
+
+
+
+
+ {{ locale.baseText('workflows.templatesDataQuality.loadingTemplates') }}
+
+
+
+
+
+
+
+
+
diff --git a/packages/frontend/editor-ui/src/experiments/templatesDataQuality/stores/templatesDataQuality.store.ts b/packages/frontend/editor-ui/src/experiments/templatesDataQuality/stores/templatesDataQuality.store.ts
index 9eda85d58ad..d7afe6175ce 100644
--- a/packages/frontend/editor-ui/src/experiments/templatesDataQuality/stores/templatesDataQuality.store.ts
+++ b/packages/frontend/editor-ui/src/experiments/templatesDataQuality/stores/templatesDataQuality.store.ts
@@ -7,6 +7,8 @@ import batch1TemplateIds from '../data/batch1TemplateIds.json';
import batch2TemplateIds from '../data/batch2TemplateIds.json';
import batch3TemplateIds from '../data/batch3TemplateIds.json';
import { useSettingsStore } from '@/app/stores/settings.store';
+import { useNodeTypesStore } from '@/app/stores/nodeTypes.store';
+import type { ITemplatesWorkflowFull } from '@n8n/rest-api-client';
const NUMBER_OF_TEMPLATES = 6;
@@ -15,6 +17,7 @@ export const useTemplatesDataQualityStore = defineStore('templatesDataQuality',
const posthogStore = usePostHog();
const templatesStore = useTemplatesStore();
const settingsStore = useSettingsStore();
+ const nodeTypesStore = useNodeTypesStore();
const isFeatureEnabled = () => {
return (
@@ -28,7 +31,7 @@ export const useTemplatesDataQualityStore = defineStore('templatesDataQuality',
);
};
- async function getTemplateData(templateId: number) {
+ async function getTemplateData(templateId: number): Promise
{
return await templatesStore.fetchTemplateById(templateId.toString());
}
@@ -70,6 +73,22 @@ export const useTemplatesDataQualityStore = defineStore('templatesDataQuality',
templateId,
});
}
+
+ async function loadExperimentTemplates(): Promise {
+ await nodeTypesStore.loadNodeTypesIfNotLoaded();
+
+ const ids = getRandomTemplateIds();
+ const promises = ids.map(async (id) => await getTemplateData(id));
+ const results = await Promise.allSettled(promises);
+
+ const templates = results
+ .filter(
+ (result): result is PromiseFulfilledResult =>
+ result.status === 'fulfilled' && result.value !== null,
+ )
+ .map((result) => result.value as ITemplatesWorkflowFull);
+ return templates;
+ }
return {
isFeatureEnabled,
getRandomTemplateIds,
@@ -77,5 +96,6 @@ export const useTemplatesDataQualityStore = defineStore('templatesDataQuality',
getTemplateRoute,
trackTemplateTileClick,
trackTemplateShown,
+ loadExperimentTemplates,
};
});
diff --git a/packages/frontend/editor-ui/src/features/core/folders/folders.store.ts b/packages/frontend/editor-ui/src/features/core/folders/folders.store.ts
index 9c3e4c85260..772983fa05e 100644
--- a/packages/frontend/editor-ui/src/features/core/folders/folders.store.ts
+++ b/packages/frontend/editor-ui/src/features/core/folders/folders.store.ts
@@ -23,6 +23,7 @@ export const useFoldersStore = defineStore(STORES.FOLDERS, () => {
const rootStore = useRootStore();
const i18n = useI18n();
+ const workflowsCountLoaded = ref(false);
const totalWorkflowCount = ref(0);
// Resource that is currently being dragged
@@ -98,6 +99,7 @@ export const useFoldersStore = defineStore(STORES.FOLDERS, () => {
projectId?: string,
parentFolderId?: string,
): Promise {
+ workflowsCountLoaded.value = false;
const { count } = await workflowsApi.getWorkflowsAndFolders(
rootStore.restApiContext,
{ projectId, parentFolderId },
@@ -105,6 +107,7 @@ export const useFoldersStore = defineStore(STORES.FOLDERS, () => {
true,
);
totalWorkflowCount.value = count;
+ workflowsCountLoaded.value = true;
return count;
}
@@ -348,6 +351,7 @@ export const useFoldersStore = defineStore(STORES.FOLDERS, () => {
createFolder,
getFolderPath,
totalWorkflowCount,
+ workflowsCountLoaded,
deleteFolder,
deleteFoldersFromCache,
renameFolder,
diff --git a/packages/frontend/editor-ui/src/features/workflows/readyToRun/composables/useEmptyStateDetection.test.ts b/packages/frontend/editor-ui/src/features/workflows/readyToRun/composables/useEmptyStateDetection.test.ts
index 5c7cea0b3eb..81774250b52 100644
--- a/packages/frontend/editor-ui/src/features/workflows/readyToRun/composables/useEmptyStateDetection.test.ts
+++ b/packages/frontend/editor-ui/src/features/workflows/readyToRun/composables/useEmptyStateDetection.test.ts
@@ -12,6 +12,7 @@ const mockRoute = (overrides: Partial = {}) =>
vi.mock('@/features/core/folders/folders.store', () => ({
useFoldersStore: () => ({
totalWorkflowCount: 0,
+ workflowsCountLoaded: true,
}),
}));
diff --git a/packages/frontend/editor-ui/src/features/workflows/readyToRun/composables/useEmptyStateDetection.ts b/packages/frontend/editor-ui/src/features/workflows/readyToRun/composables/useEmptyStateDetection.ts
index 53b852b45d3..e72323a84fe 100644
--- a/packages/frontend/editor-ui/src/features/workflows/readyToRun/composables/useEmptyStateDetection.ts
+++ b/packages/frontend/editor-ui/src/features/workflows/readyToRun/composables/useEmptyStateDetection.ts
@@ -20,7 +20,8 @@ export function useEmptyStateDetection() {
* - Not currently refreshing data
*/
const isTrulyEmpty = (currentRoute: RouteLocationNormalized = route) => {
- const hasNoWorkflows = foldersStore.totalWorkflowCount === 0;
+ const hasNoWorkflows =
+ foldersStore.workflowsCountLoaded && foldersStore.totalWorkflowCount === 0;
const isNotInSpecificFolder = !currentRoute.params?.folderId;
const isMainWorkflowsPage = projectPages.isOverviewSubPage;