diff --git a/.gitignore b/.gitignore
index 3680e52d2a..e3724783fd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -101,3 +101,5 @@ httpbin
# nix
result
+
+.cursorignore
\ No newline at end of file
diff --git a/packages/nc-gui/assets/nc-icons-v2/linear.svg b/packages/nc-gui/assets/nc-icons-v2/linear.svg
new file mode 100644
index 0000000000..022b9020a5
--- /dev/null
+++ b/packages/nc-gui/assets/nc-icons-v2/linear.svg
@@ -0,0 +1,3 @@
+
diff --git a/packages/nc-gui/components/account/Token.vue b/packages/nc-gui/components/account/Token.vue
index 5da61d5eb2..cede2d2a7d 100644
--- a/packages/nc-gui/components/account/Token.vue
+++ b/packages/nc-gui/components/account/Token.vue
@@ -247,7 +247,7 @@ const handleCancel = () => {
{
data-testid="nc-token-input"
:disabled="isLoading"
@press-enter="generateToken"
- @input="isValidTokenName = validateTokenName(selectedTokenData.value.description)"
+ @input="isValidTokenName = validateTokenName(selectedTokenData.description)"
/>
{{ errorMessage }}
diff --git a/packages/nc-gui/components/project/View.vue b/packages/nc-gui/components/project/View.vue
index 1db9600844..a7b076fdc3 100644
--- a/packages/nc-gui/components/project/View.vue
+++ b/packages/nc-gui/components/project/View.vue
@@ -130,10 +130,6 @@ onMounted(async () => {
if (props.tab) {
projectPageTab.value = props.tab
}
-
- await until(() => !!currentBase.value?.id).toBeTruthy()
-
- await loadAutomations({ baseId: currentBase.value?.id })
})
diff --git a/packages/nc-gui/components/smartsheet/Toolbar.vue b/packages/nc-gui/components/smartsheet/Toolbar.vue
index 3e1f8ca855..e95f2deb65 100644
--- a/packages/nc-gui/components/smartsheet/Toolbar.vue
+++ b/packages/nc-gui/components/smartsheet/Toolbar.vue
@@ -8,10 +8,6 @@ const { isViewsLoading } = storeToRefs(useViewsStore())
const { isLocalMode } = useViewColumnsOrThrow()
-const isPublic = inject(IsPublicInj, ref(false))
-
-const { isSharedBase } = useBase()
-
const containerRef = ref()
const { width } = useElementSize(containerRef)
@@ -27,12 +23,6 @@ const isTab = computed(() => {
return width.value > 1200
})
-const { isUIAllowed } = useRoles()
-
-const { isFeatureEnabled } = useBetaFeatureToggle()
-
-const isAutomationEnabled = computed(() => isFeatureEnabled(FEATURE_FLAG.NOCODB_SCRIPTS))
-
const isToolbarIconMode = computed(() => {
if (width.value < 768) {
return true
@@ -79,10 +69,6 @@ provide(IsToolbarIconMode, isToolbarIconMode)
-
-
diff --git a/packages/nc-gui/components/tabs/Smartsheet.vue b/packages/nc-gui/components/tabs/Smartsheet.vue
index 533c5e9324..ce2c85556f 100644
--- a/packages/nc-gui/components/tabs/Smartsheet.vue
+++ b/packages/nc-gui/components/tabs/Smartsheet.vue
@@ -49,8 +49,6 @@ const activeSource = computed(() => {
})
const { isFeatureEnabled } = useBetaFeatureToggle()
-const isAutomationEnabled = computed(() => isFeatureEnabled(FEATURE_FLAG.NOCODB_SCRIPTS))
-
useProvideKanbanViewStore(meta, activeView)
useProvideMapViewStore(meta, activeView)
useProvideCalendarViewStore(meta, activeView)
@@ -89,8 +87,6 @@ const grid = ref()
const extensionPaneRef = ref()
-const actionPaneRef = ref()
-
const onDrop = async (event: DragEvent) => {
event.preventDefault()
try {
@@ -177,15 +173,13 @@ const { isPanelExpanded, extensionPanelSize } = useExtensions()
const contentSize = computed(() => {
if (isPanelExpanded.value && extensionPanelSize.value) {
return 100 - extensionPanelSize.value
- } else if (isActionPaneActive.value && actionPaneSize.value) {
- return 100 - actionPaneSize.value
} else {
return 100
}
})
const contentMaxSize = computed(() => {
- if (!isPanelExpanded.value && !isActionPaneActive.value) {
+ if (!isPanelExpanded.value) {
return 100
} else {
return ((windowSize.value - leftSidebarWidth.value - 300) / (windowSize.value - leftSidebarWidth.value)) * 100
@@ -196,17 +190,12 @@ const onResize = () => {
if (isPanelExpanded.value && !extensionPaneRef.value?.isReady) {
extensionPaneRef.value?.onReady()
}
-
- if (isActionPaneActive.value && !actionPaneRef.value?.isReady) {
- actionPaneRef.value?.onReady()
- }
}
const onResized = (sizes: { min: number; max: number; size: number }[]) => {
if (sizes.length === 2) {
if (!sizes[1].size) return
if (isPanelExpanded.value) extensionPanelSize.value = sizes[1].size
- else if (isActionPaneActive.value) actionPaneSize.value = sizes[1].size
}
}
@@ -217,13 +206,6 @@ const onReady = () => {
extensionPaneRef.value?.onReady()
}, 300)
}
-
- if (isActionPaneActive.value && actionPaneRef.value) {
- // wait until action pane animation complete
- setTimeout(() => {
- actionPaneRef.value?.onReady()
- }, 300)
- }
}
@@ -269,7 +251,6 @@ const onReady = () => {
-
diff --git a/packages/nc-gui/composables/useGlobal/types.ts b/packages/nc-gui/composables/useGlobal/types.ts
index f6448737d4..2ca6b04f59 100644
--- a/packages/nc-gui/composables/useGlobal/types.ts
+++ b/packages/nc-gui/composables/useGlobal/types.ts
@@ -110,6 +110,8 @@ export interface Actions {
query?: any
tableId?: string
viewId?: string
+ automationId?: string
+ automation?: boolean
}) => void
getBaseUrl: (workspaceId: string) => string | undefined
getMainUrl: (workspaceId: string) => string | undefined
diff --git a/packages/nc-gui/lang/en.json b/packages/nc-gui/lang/en.json
index c2212b426d..2e77714a11 100644
--- a/packages/nc-gui/lang/en.json
+++ b/packages/nc-gui/lang/en.json
@@ -94,32 +94,32 @@
},
"upgrade": {
"UpgradeToInviteMore": "Invite more members",
- "UpgradeToInviteMoreSubtitle": "The {activePlan} plan allows up to {editors} editors & {commenters} commenters. Upgrade to the {plan} plan for unlimited users.",
+ "UpgradeToInviteMoreSubtitle": "The {activePlan} plan allows up to {editors} editors & {commenters} commenters per workspace. Upgrade to the {plan} plan for unlimited users.",
"UpgradeToPlanToAccessThisFeature": "Upgrade to {plan} plan to access this feature",
"UpgradeToCreateAdditionalSnapshots": "Upgrade to create additional snapshots",
"UpgradeToCreateAdditionalSnapshotsSubtitle": "The {activePlan} plan allows up to {n} snapshots. Upgrade to the {plan} plan and get access to additional snapshots.",
"UpgradeToCreateSnapshots": "Upgrade to create snapshots",
"UpgradeToCreateSnapshotsSubtitle": "The {activePlan} plan doesn't allow to create snapshots. Upgrade to the {plan} plan and get access to snapshots.",
- "upgradeToAddCustomBannerSubtitle": "Upload a custom banner to the form by upgrading your workspace to the Team plan.",
- "upgradeToAddCustomLogoSubtitle": "Upload your Logo on the form by upgrading your workspace to the Team plan.",
- "upgradeToHideFormBrandingSubtitle": "Hide NocoDB branding by upgrading your workspace to the Team plan.",
- "upgradeToAddRedirectUrlSubtitle": "Redirect your users to another webpage after filling out the form by upgrading to the Team plan.",
- "upgradeToAddCustomValidationSubtitle": "Add custom validations by upgrading your workspace to the Team plan.",
- "upgradeToAddCustomUrlSubtitle": "Create custom url by upgrading your workspace to the {plan} plan.",
- "upgradeToAccessPersonalViewSubtitle": "Access Personal view by upgrading your workspace to the Team plan.",
+ "upgradeToAddCustomBannerSubtitle": "Upload a custom banner to the form by upgrading your workspace to the {plan} plan.",
+ "upgradeToAddCustomLogoSubtitle": "Upload your Logo on the form by upgrading your workspace to the {plan} plan.",
+ "upgradeToHideFormBrandingSubtitle": "Hide NocoDB branding by upgrading your workspace to the {plan} plan.",
+ "upgradeToAddRedirectUrlSubtitle": "Redirect your users to another webpage after filling out the form by upgrading to the {plan} plan.",
+ "upgradeToAddCustomValidationSubtitle": "Add custom validations by upgrading your workspace to the {plan} plan.",
+ "upgradeToAddCustomUrlSubtitle": "Create custom URL by upgrading your workspace to the {plan} plan.",
+ "upgradeToAccessPersonalViewSubtitle": "Access Personal view by upgrading your workspace to the {plan} plan.",
"upgradeToAccessReassignViewSubtitle": "Access Re-assign view feature by upgrading your workspace to the {plan} plan.",
"updateToAddRecordFormView": "This Form is no longer accepting submissions",
- "updateToAddRecordFormViewSubtitle": "You’ve reached the limit for number of records on your {plan} plan. Upgrade to increase your record limit.",
+ "updateToAddRecordFormViewSubtitle": "You’ve reached the limit for number of records on your {activePlan} plan. Upgrade to increase your record limit.",
"updateToExtendRecordHistory": "Upgrade to extend your history",
"updateToExtendRecordHistorySubtitle": "The {activePlan} plan allows up to {period} of audit history. Upgrade to the {plan} plan to increase your audit history period.",
"planLimitReached": "Limit reached: Upgrade Plan",
"planLimitReachedSubtitle": "Upgrade to add more records",
"upgradeToAddLimitRecordSelection": "To limit record selection using filters, please upgrade to the {plan} plan.",
- "upgradeToAdd": "Upgrade to Add",
+ "upgradeToAdd": "Upgrade to add",
"requestUpgradeToAdd": "Request upgrade to add",
"upgradeToAddMoreExtensions": "You're currently on the Free plan, which allows only one extension. Upgrade to unlock unlimited extensions.",
"upgradeToAccessWsAudit": "Upgrade to access workspace audit",
- "upgradeToAccessWsAuditSubtitle": "Upgrade your plan to the {plan} plan to unlock workspace audit logs and track key activities with ease.",
+ "upgradeToAccessWsAuditSubtitle": "Upgrade to the {plan} plan to enable workspace audit logs and efficiently monitor key activities.",
"upgradeToAddMoreAttachments": "Upgrade to add more attachments",
"upgradeToAddMoreAttachmentsSubtitle": "The {activePlan} plan allows up to {limit} storage. Upgrade to the {plan} plan to increase your storage limit.",
"upgradeToCreateMoreRecords": "Upgrade to create more records",
@@ -127,8 +127,8 @@
"upgradeToCreateMoreRecordsForm": "This form is currently not accepting submissions",
"upgradeToCreateMoreRecordsFormSubtitle": "The owner may need to upgrade their workspace plan before this form can accept additional submissions.",
"upgradeToAccessFieldValidationSubtitle": "Add field validations by upgrading your workspace to the {plan} plan.",
- "upgradeToAddExternalSource": "Upgrade to add additional external source",
- "upgradeToAddExternalSourceSubtitle": "The {activePlan} plan allows up to {limit} external source. Upgrade to the {plan} plan and get access to additional external sources.",
+ "upgradeToAddExternalSource": "Upgrade to connect more external sources",
+ "upgradeToAddExternalSourceSubtitle": "Your current {activePlan} plan supports only {limit} external source. Upgrade to the {plan} plan to connect multiple external sources.",
"upgradeToAddWebhook": "Upgrade to add unlimited webhooks",
"upgradeToAddWebhookSubtitle": "The {activePlan} plan allows up to {limit} webhooks. Upgrade to the {plan} plan and get access to unlimited webhooks.",
"upgradeToAccessWebhookLogsSubtitle": "Access webhook logs by upgrading your workspace to the {plan} plan.",
@@ -137,8 +137,8 @@
"WorkspaceOwnerNotified": "Workspace owner notified",
"WorkspaceOwnerNotifiedSubtitle": "Your request to upgrade has been shared with the workspace owner.",
"failedToSendUpgradeRequest": "Failed to send upgrade request",
- "upgradeToSeeMoreRecord": "Only first 100 records will be visible, upgrade to Team plan to access all records visiblility",
- "upgradeToSeeMoreRecordInline": "Upgrade to view all records from external Datasources",
+ "upgradeToSeeMoreRecord": "Upgrade to unlock full data access",
+ "upgradeToSeeMoreRecordInline": "Upgrade to view all records from external datasources",
"upgradeToSeeMoreRecordSubtitle": "Unlock complete visibility into your connected sources. View all records by upgrading to the Team plan.",
"upgradeToSeeMoreRecordInlineSubtitle": "You're viewing {limit} of {total} records. Unlock access to the remaining {remaining} records by upgrading to the Team plan.",
"editorLimitExceedTooltip": "{prefix}. {activePlan} plan has an editor limit set to {limit}.",
@@ -795,7 +795,7 @@
"seatMonth": "/seat/month",
"mostPopular": "Most Popular",
"helpAndSupport": "Help & Support",
- "helpAndSupportSubtitle": "For help and support, please visit our Support Center where you can find detailed guides, contact our customer service team, or access our community forum for additional assistance.",
+ "helpAndSupportSubtitle": "Visit our Support Center for detailed guides, customer service contact options, and a community forum for additional help.",
"faq": "FAQ",
"faqSubtitle": "Explore the FAQ section and get quick answers to common questions about our services, features, and troubleshooting. ",
"downgradeToPlan": "Downgrade to {plan} plan?",
@@ -1189,8 +1189,8 @@
"nocoDBBaseImported": "NocoDB Base Imported",
"formatJson": "Format JSON",
"autoSelectFieldTypes": "Auto-Select Field Types",
- "firstRowAsHeaders": "Use First Record as Headers",
- "flattenNested": "Flatten Nested",
+ "firstRowAsHeaders": "Use first record as header",
+ "flattenNested": "Flatten nested",
"downloadAllowed": "Download allowed",
"weAreHiring": "We are Hiring!",
"primaryKey": "Primary key",
@@ -1271,7 +1271,7 @@
"viewHide": "View visibility ",
"osBrowser": "OS, Browser",
"rowId": "Row Id",
- "showJsonPayload": "Show json payload",
+ "showJsonPayload": "Show JSON payload",
"autoCreateMissingSelectionOptions": "Auto create missing select field options",
"fillForm": "Fill Form",
"proceedToLink": "Proceed to link",
@@ -1283,7 +1283,7 @@
"useSameTimezoneForAllMembers": "Use same timezone for all members",
"displayTimezone": "Display time zone",
"upgradePlan": "Upgrade Plan",
- "viewAllPlanDetails": "View all plan Details",
+ "viewAllPlanDetails": "View all plan details",
"contactSales": "Contact Sales",
"manageSubscription": "Manage Subscription",
"upgradeToPlan": "Upgrade To {plan}",
diff --git a/packages/nc-gui/store/workspace.ts b/packages/nc-gui/store/workspace.ts
index e4b7fde2a6..f3893fcd6c 100644
--- a/packages/nc-gui/store/workspace.ts
+++ b/packages/nc-gui/store/workspace.ts
@@ -249,7 +249,7 @@ export const useWorkspace = defineStore('workspaceStore', () => {
}
const getPlanLimit = (_arg: any) => {
- return 9999
+ return Infinity
}
return {
diff --git a/packages/nc-gui/utils/iconUtils.ts b/packages/nc-gui/utils/iconUtils.ts
index 3fca16a22e..148a81957c 100644
--- a/packages/nc-gui/utils/iconUtils.ts
+++ b/packages/nc-gui/utils/iconUtils.ts
@@ -238,6 +238,7 @@ import NcGoogleSheet from '~icons/nc-icons/google_sheet'
import NcGoogleDrive from '~icons/nc-icons/google-drive'
import NcHubspot from '~icons/nc-icons/hubspot'
import NcJira from '~icons/nc-icons/jira'
+import NcLinear from '~icons/nc-icons-v2/linear'
import NcMailchimp from '~icons/nc-icons/mailchimp'
import NcMicrosoftAccess from '~icons/nc-icons/microsoft_access'
import NcMicrosoftExcel from '~icons/nc-icons/microsoft_excel'
@@ -1205,6 +1206,7 @@ export const iconMap = {
'asana': NcAsana,
'box': NcBox,
'githubSolid': NcGithubSolid,
+ 'linear': NcLinear,
'gitlab': NcGitlab,
'googleCalendar': NcGoogleCalendar,
'googleSheet': NcGoogleSheet,
diff --git a/packages/nocodb/src/db/conditionV2.ts b/packages/nocodb/src/db/conditionV2.ts
index 0aa8354280..a3df78c1d2 100644
--- a/packages/nocodb/src/db/conditionV2.ts
+++ b/packages/nocodb/src/db/conditionV2.ts
@@ -823,7 +823,10 @@ const parseConditionV2 = async (
column.dt !== 'timestamptz'
) {
qb.where(
- knex.raw("?? AT TIME ZONE CURRENT_SETTING('timezone') AT TIME ZONE 'UTC'", [field]),
+ knex.raw(
+ "?? AT TIME ZONE CURRENT_SETTING('timezone') AT TIME ZONE 'UTC'",
+ [field],
+ ),
gt_op,
knex.raw('?::timestamptz', [val]),
);
@@ -879,7 +882,10 @@ const parseConditionV2 = async (
column.dt !== 'timestamptz'
) {
qb.where(
- knex.raw("?? AT TIME ZONE CURRENT_SETTING('timezone') AT TIME ZONE 'UTC'", [field]),
+ knex.raw(
+ "?? AT TIME ZONE CURRENT_SETTING('timezone') AT TIME ZONE 'UTC'",
+ [field],
+ ),
ge_op,
knex.raw('?::timestamptz', [val]),
);
@@ -934,7 +940,10 @@ const parseConditionV2 = async (
column.dt !== 'timestamptz'
) {
qb.where(
- knex.raw("?? AT TIME ZONE CURRENT_SETTING('timezone') AT TIME ZONE 'UTC'", [field]),
+ knex.raw(
+ "?? AT TIME ZONE CURRENT_SETTING('timezone') AT TIME ZONE 'UTC'",
+ [field],
+ ),
lt_op,
knex.raw('?::timestamptz', [val]),
);
@@ -991,7 +1000,10 @@ const parseConditionV2 = async (
column.dt !== 'timestamptz'
) {
qb.where(
- knex.raw("?? AT TIME ZONE CURRENT_SETTING('timezone') AT TIME ZONE 'UTC'", [field]),
+ knex.raw(
+ "?? AT TIME ZONE CURRENT_SETTING('timezone') AT TIME ZONE 'UTC'",
+ [field],
+ ),
le_op,
knex.raw('?::timestamptz', [val]),
);
diff --git a/packages/nocodb/src/interface/Jobs.ts b/packages/nocodb/src/interface/Jobs.ts
index f4cf97e82d..682fd45095 100644
--- a/packages/nocodb/src/interface/Jobs.ts
+++ b/packages/nocodb/src/interface/Jobs.ts
@@ -43,7 +43,6 @@ export enum JobTypes {
RestoreSnapshot = 'restore-snapshot',
ListenImport = 'listen-import',
SyncModuleSyncData = 'sync-module-sync-data',
- SubscriptionSchedule = 'subscription-schedule',
UpdateUsageStats = 'update-usage-stats',
}
@@ -56,7 +55,6 @@ export const SKIP_STORING_JOB_META = [
JobTypes.UpdateModelStat,
JobTypes.UpdateWsStat,
JobTypes.UpdateSrcStat,
- JobTypes.SubscriptionSchedule,
];
export enum JobStatus {
diff --git a/packages/nocodb/src/services/columns.service.ts b/packages/nocodb/src/services/columns.service.ts
index 665c4bde1f..07a6584d10 100644
--- a/packages/nocodb/src/services/columns.service.ts
+++ b/packages/nocodb/src/services/columns.service.ts
@@ -1465,7 +1465,13 @@ export class ColumnsService implements IColumnsService {
for (const filter of filters ?? []) {
let newValue = filter.value;
// do not try to map when the comparison has no value
- if(ncIsUndefined(newValue) || ncIsNull(newValue) || newValue === '') { continue; }
+ if (
+ ncIsUndefined(newValue) ||
+ ncIsNull(newValue) ||
+ newValue === ''
+ ) {
+ continue;
+ }
// Split filter values and update them based on title changes
const values = filter.value?.split(',');
const updatedValues = values.map((val) => {