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) => {