diff --git a/packages/nc-gui/components/project/SyncDataModal.vue b/packages/nc-gui/components/project/SyncDataModal.vue
deleted file mode 100644
index 05190ba453..0000000000
--- a/packages/nc-gui/components/project/SyncDataModal.vue
+++ /dev/null
@@ -1,153 +0,0 @@
-
-
-
-
-
diff --git a/packages/nc-gui/components/project/View.vue b/packages/nc-gui/components/project/View.vue
index 98249ed139..2ca080c618 100644
--- a/packages/nc-gui/components/project/View.vue
+++ b/packages/nc-gui/components/project/View.vue
@@ -6,7 +6,7 @@ const props = defineProps<{
baseId?: string
}>()
-useProvideIntegrationViewStore()
+const { integrations } = useProvideIntegrationViewStore()
const basesStore = useBases()
@@ -94,6 +94,18 @@ watch(
immediate: true,
},
)
+
+watch(
+ () => currentBase.value?.id,
+ () => {
+ /**
+ * When the current base ID changes, reset the integrations array.
+ * This ensures that the integration data is cleared, allowing it to be reloaded
+ * properly when opening the create/edit source modal with the updated base.
+ */
+ integrations.value = []
+ },
+)
diff --git a/packages/nc-gui/components/workspace/integrations/ConnectionsTab.vue b/packages/nc-gui/components/workspace/integrations/ConnectionsTab.vue
index 51ffd80463..499f978426 100644
--- a/packages/nc-gui/components/workspace/integrations/ConnectionsTab.vue
+++ b/packages/nc-gui/components/workspace/integrations/ConnectionsTab.vue
@@ -399,7 +399,7 @@ onKeyStroke('ArrowDown', onDown)
diff --git a/packages/nc-gui/components/workspace/integrations/IntegrationsTab.vue b/packages/nc-gui/components/workspace/integrations/IntegrationsTab.vue
index a38643fbc5..ff14f26bcd 100644
--- a/packages/nc-gui/components/workspace/integrations/IntegrationsTab.vue
+++ b/packages/nc-gui/components/workspace/integrations/IntegrationsTab.vue
@@ -91,25 +91,21 @@ const integrationsMapByCategory = computed(() => {
})
const isEmptyList = computed(() => {
- const categories = Object.keys(integrationsMapByCategory.value);
-
+ const categories = Object.keys(integrationsMapByCategory.value)
+
if (!categories.length) {
- return true;
+ return true
}
- console.log('cate', categories, integrationsMapByCategory.value)
-
- return !categories.some(category => integrationsMapByCategory.value[category].list.length > 0);
-});
+ return !categories.some((category) => integrationsMapByCategory.value[category].list.length > 0)
+})
const isAddNewIntegrationModalOpen = computed({
get: () => {
return pageMode.value === IntegrationsPageMode.LIST
},
set: (value: boolean) => {
- if (value) {
- pageMode.value = IntegrationsPageMode.LIST
- } else {
+ if (!value) {
pageMode.value = null
}
},
@@ -209,9 +205,12 @@ const handleAddIntegration = (category: IntegrationCategoryType, integration: In
ref="integrationListRef"
class="flex-1 px-6 pb-6 flex flex-col nc-workspace-settings-integrations-list overflow-y-auto nc-scrollbar-thin"
>
-
+
@@ -536,7 +543,7 @@ watch(
-
diff --git a/packages/nc-gui/composables/useIntegrationsStore.ts b/packages/nc-gui/composables/useIntegrationsStore.ts
index 8d54de4e69..1731362070 100644
--- a/packages/nc-gui/composables/useIntegrationsStore.ts
+++ b/packages/nc-gui/composables/useIntegrationsStore.ts
@@ -217,7 +217,9 @@ const [useProvideIntegrationViewStore, _useIntegrationStore] = useInjectionState
await loadIntegrations(loadDatasourceInfo, baseId)
- eventBus.emit(IntegrationStoreEvents.INTEGRATION_ADD, response)
+ if (mode === 'create') {
+ eventBus.emit(IntegrationStoreEvents.INTEGRATION_ADD, response)
+ }
pageMode.value = null
activeIntegration.value = null
diff --git a/packages/nc-gui/lang/en.json b/packages/nc-gui/lang/en.json
index d54de30db4..2eee53eeee 100644
--- a/packages/nc-gui/lang/en.json
+++ b/packages/nc-gui/lang/en.json
@@ -387,7 +387,11 @@
"bitbucket": "BitBucket",
"quickbooks": "Quickbooks",
"intercom": "Intercom",
- "dropbox": "Dropbox"
+ "dropbox": "Dropbox",
+ "openai": "OpenAI",
+ "claude": "Claude",
+ "ollama": "Ollama",
+ "groq": "Groq"
},
"integrationCategories": {
"allIntegrations": "All Integrations",
@@ -411,7 +415,8 @@
"ticketingSubtitle": "Manage and track support tickets efficiently with NocoDB.",
"storageSubtitle": "Integrate and organize your storage solutions seamlessly with NocoDB.",
"others": "Others",
- "othersSubtitle": "Discover additional versatile integrations to enhance your NocoDB experience."
+ "othersSubtitle": "Discover additional versatile integrations to enhance your NocoDB experience.",
+ "ai": "AI"
}
},
"datatype": {
diff --git a/packages/nc-gui/lib/enums.ts b/packages/nc-gui/lib/enums.ts
index dcf73d7371..470d2cc434 100644
--- a/packages/nc-gui/lib/enums.ts
+++ b/packages/nc-gui/lib/enums.ts
@@ -1,4 +1,4 @@
-export { ClientType } from 'nocodb-sdk'
+export { ClientType, IntegrationCategoryType, SyncDataType } from 'nocodb-sdk'
export enum Language {
ar = 'العربية',
@@ -177,73 +177,3 @@ export enum ExtensionsEvents {
export enum IntegrationStoreEvents {
INTEGRATION_ADD = 'integration-add',
}
-
-// Move this to nocodb-sdk
-export enum SyncDataType {
- // Database
- SNOWFLAKE = 'snowflake',
- MICROSOFT_ACCESS = 'microsoft-access',
- TABLEAU = 'tableau',
- ORACLE = 'oracle',
- // Communication
- SLACK = 'slack',
- DISCORD = 'discord',
- TWILLO = 'twillo',
- MICROSOFT_OUTLOOK = 'microsoft-outlook',
- MICROSOFT_TEAMS = 'microsoft-teams',
- TELEGRAM = 'telegram',
- GMAIL = 'gmail',
- WHATSAPP = 'whatsapp',
- // Project Management
- ASANA = 'asana',
- JIRA = 'jira',
- MIRO = 'miro',
- TRELLO = 'trello',
- // CRM
- SALESFORCE = 'salesforce',
- PIPEDRIVE = 'pipedrive',
- MICROSOFT_DYNAMICS_365 = 'microsoft-dynamics-365',
- ZOHO_CRM = 'zoho-crm',
- // Marketing
- HUBSPOT = 'hubspot',
- MAILCHIMP = 'mailchimp',
- SURVEYMONKEY = 'surveymonkey',
- TYPEFORM = 'typeform',
- // ATS
- WORKDAY = 'workday',
- GREENHOUSE = 'greenhouse',
- LEVER = 'lever',
- // Development
- GITHUB = 'github',
- GITLAB = 'gitlab',
- BITBUCKET = 'bitbucket',
- // Finance
- STRIPE = 'stripe',
- QUICKBOOKS = 'quickbooks',
- // Ticketing
- INTERCOM = 'intercom',
- ZENDESK = 'zendesk',
- // Storage
- BOX = 'box',
- GOOGLE_DRIVE = 'google-drive',
- DROPBOX = 'dropbox',
- // Others
- APPLE_NUMBERS = 'apple-numbers',
- GOOGLE_CALENDAR = 'google-calendar',
- MICROSOFT_EXCEL = 'microsoft-excel',
- GOOGLE_SHEETS = 'google-sheets',
-}
-
-export enum IntegrationCategoryType {
- DATABASE = 'database',
- COMMUNICATION = 'communication',
- PROJECT_MANAGEMENT = 'project-management',
- CRM = 'crm',
- MARKETING = 'marketing',
- ATS = 'ats',
- DEVELOPMENT = 'development',
- FINANCE = 'finance',
- TICKETING = 'ticketing',
- STORAGE = 'storage',
- OTHERS = 'others',
-}
diff --git a/packages/nc-gui/utils/iconUtils.ts b/packages/nc-gui/utils/iconUtils.ts
index acc7b43404..ad119b70e0 100644
--- a/packages/nc-gui/utils/iconUtils.ts
+++ b/packages/nc-gui/utils/iconUtils.ts
@@ -277,6 +277,10 @@ import NcBitBucket from '~icons/nc-icons/bit-bucket'
import NcQuickbooks from '~icons/nc-icons/quickbooks'
import NcIntercom from '~icons/nc-icons/intercom'
import NcDropbox from '~icons/nc-icons/dropbox'
+import NcOpenai from '~icons/nc-icons/openai'
+import NcClaude from '~icons/nc-icons/claude'
+import NcOllama from '~icons/nc-icons/ollama'
+import NcGroq from '~icons/nc-icons/groq'
// keep it for reference
// todo: remove it after all icons are migrated
@@ -777,6 +781,10 @@ export const iconMap = {
intercom: NcIntercom,
dropbox: NcDropbox,
gift: NcIconsGift,
+ openai: NcOpenai,
+ claude: NcClaude,
+ ollama: NcOllama,
+ groq: NcGroq,
}
export const getMdiIcon = (type: string): any => {
diff --git a/packages/nc-gui/utils/syncDataUtils.ts b/packages/nc-gui/utils/syncDataUtils.ts
index 9fb7f607ea..72e5c6f5d7 100644
--- a/packages/nc-gui/utils/syncDataUtils.ts
+++ b/packages/nc-gui/utils/syncDataUtils.ts
@@ -32,6 +32,16 @@ export const integrationCategories: IntegrationCategoryItemType[] = [
},
isAvailable: true,
},
+ {
+ title: 'objects.integrationCategories.ai',
+ subtitle: 'objects.integrationCategories.ai',
+ value: IntegrationCategoryType.AI,
+ icon: iconMap.openai,
+ iconBgColor: '#FFF0F7',
+ iconStyle: {
+ color: '#801044',
+ },
+ },
{
title: 'objects.integrationCategories.communication',
subtitle: 'objects.integrationCategories.communicationSubtitle',
@@ -179,6 +189,32 @@ export const allIntegrations: IntegrationItemType[] = [
categories: [IntegrationCategoryType.DATABASE],
},
+ // AI
+ {
+ title: 'objects.syncData.openai',
+ value: SyncDataType.OPENAI,
+ icon: iconMap.openai,
+ categories: [IntegrationCategoryType.AI],
+ },
+ {
+ title: 'objects.syncData.claude',
+ value: SyncDataType.CLAUDE,
+ icon: iconMap.claude,
+ categories: [IntegrationCategoryType.AI],
+ },
+ {
+ title: 'objects.syncData.ollama',
+ value: SyncDataType.OLLAMA,
+ icon: iconMap.ollama,
+ categories: [IntegrationCategoryType.AI],
+ },
+ {
+ title: 'objects.syncData.groq',
+ value: SyncDataType.GROQ,
+ icon: iconMap.groq,
+ categories: [IntegrationCategoryType.AI],
+ },
+
// Communication
{
title: 'general.slack',
@@ -444,14 +480,3 @@ export const allIntegrations: IntegrationItemType[] = [
categories: [IntegrationCategoryType.OTHERS],
},
]
-
-export const syncDataTypes = [] as {
- title: string
- icon: FunctionalComponent
- value: SyncDataType
-}[]
-
-export const syncDataTypesMap = allIntegrations.reduce((acc, curr) => {
- acc[curr.value] = curr
- return acc
-}, {} as Record)
diff --git a/packages/nocodb-sdk/src/lib/enums.ts b/packages/nocodb-sdk/src/lib/enums.ts
index 950dda6485..3f9e68b80f 100644
--- a/packages/nocodb-sdk/src/lib/enums.ts
+++ b/packages/nocodb-sdk/src/lib/enums.ts
@@ -353,3 +353,77 @@ export enum SSLUsage {
RequiredWithCa = 'Required-CA',
RequiredWithIdentity = 'Required-Identity',
}
+
+export enum SyncDataType {
+ // Database
+ MICROSOFT_ACCESS = 'microsoft-access',
+ TABLEAU = 'tableau',
+ ORACLE = 'oracle',
+ // AI
+ OPENAI = 'openai',
+ CLAUDE = 'claude',
+ OLLAMA = 'ollama',
+ GROQ = 'groq',
+ // Communication
+ SLACK = 'slack',
+ DISCORD = 'discord',
+ TWILLO = 'twillo',
+ MICROSOFT_OUTLOOK = 'microsoft-outlook',
+ MICROSOFT_TEAMS = 'microsoft-teams',
+ TELEGRAM = 'telegram',
+ GMAIL = 'gmail',
+ WHATSAPP = 'whatsapp',
+ // Project Management
+ ASANA = 'asana',
+ JIRA = 'jira',
+ MIRO = 'miro',
+ TRELLO = 'trello',
+ // CRM
+ SALESFORCE = 'salesforce',
+ PIPEDRIVE = 'pipedrive',
+ MICROSOFT_DYNAMICS_365 = 'microsoft-dynamics-365',
+ ZOHO_CRM = 'zoho-crm',
+ // Marketing
+ HUBSPOT = 'hubspot',
+ MAILCHIMP = 'mailchimp',
+ SURVEYMONKEY = 'surveymonkey',
+ TYPEFORM = 'typeform',
+ // ATS
+ WORKDAY = 'workday',
+ GREENHOUSE = 'greenhouse',
+ LEVER = 'lever',
+ // Development
+ GITHUB = 'github',
+ GITLAB = 'gitlab',
+ BITBUCKET = 'bitbucket',
+ // Finance
+ STRIPE = 'stripe',
+ QUICKBOOKS = 'quickbooks',
+ // Ticketing
+ INTERCOM = 'intercom',
+ ZENDESK = 'zendesk',
+ // Storage
+ BOX = 'box',
+ GOOGLE_DRIVE = 'google-drive',
+ DROPBOX = 'dropbox',
+ // Others
+ APPLE_NUMBERS = 'apple-numbers',
+ GOOGLE_CALENDAR = 'google-calendar',
+ MICROSOFT_EXCEL = 'microsoft-excel',
+ GOOGLE_SHEETS = 'google-sheets',
+}
+
+export enum IntegrationCategoryType {
+ DATABASE = 'database',
+ AI = 'ai',
+ COMMUNICATION = 'communication',
+ PROJECT_MANAGEMENT = 'project-management',
+ CRM = 'crm',
+ MARKETING = 'marketing',
+ ATS = 'ats',
+ DEVELOPMENT = 'development',
+ FINANCE = 'finance',
+ TICKETING = 'ticketing',
+ STORAGE = 'storage',
+ OTHERS = 'others',
+}
diff --git a/tests/playwright/pages/Dashboard/ProjectView/DataSourcePage.ts b/tests/playwright/pages/Dashboard/ProjectView/DataSourcePage.ts
index f11457fe76..ed822013b2 100644
--- a/tests/playwright/pages/Dashboard/ProjectView/DataSourcePage.ts
+++ b/tests/playwright/pages/Dashboard/ProjectView/DataSourcePage.ts
@@ -95,6 +95,8 @@ export class DataSourcePage extends BasePage {
await this.getDsDetailsModal().waitFor({ state: 'visible' });
await this.getDsDetailsModal().getByTestId('nc-connection-tab').click();
+
+ await this.getDsDetailsModal().locator('.nc-general-overlay').first().waitFor({ state: 'hidden' });
}
async openAcl({ dataSourceName = defaultBaseName }: { dataSourceName?: string } = {}) {
diff --git a/tests/playwright/pages/Dashboard/ProjectView/SourcePage.ts b/tests/playwright/pages/Dashboard/ProjectView/SourcePage.ts
index 984f980ded..51d3d2c4d4 100644
--- a/tests/playwright/pages/Dashboard/ProjectView/SourcePage.ts
+++ b/tests/playwright/pages/Dashboard/ProjectView/SourcePage.ts
@@ -20,6 +20,8 @@ export class SourcePage extends BasePage {
async openEditWindow({ sourceName }: { sourceName: string }) {
await this.get().locator('.ds-table-row', { hasText: sourceName }).click();
await this.getDsDetailsModal().getByTestId('nc-connection-tab').click();
+
+ await this.getDsDetailsModal().locator('.nc-general-overlay').first().waitFor({ state: 'hidden' });
}
async updateSchemaReadOnly({ sourceName, readOnly }: { sourceName: string; readOnly: boolean }) {
|