diff --git a/packages/nc-gui/assets/nc-icons/bulb.svg b/packages/nc-gui/assets/nc-icons/bulb.svg new file mode 100644 index 0000000000..47ed29da94 --- /dev/null +++ b/packages/nc-gui/assets/nc-icons/bulb.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/packages/nc-gui/components/dashboard/FeatureExperimentation.vue b/packages/nc-gui/components/dashboard/FeatureExperimentation.vue new file mode 100644 index 0000000000..0e01c1c794 --- /dev/null +++ b/packages/nc-gui/components/dashboard/FeatureExperimentation.vue @@ -0,0 +1,110 @@ + + + diff --git a/packages/nc-gui/components/dashboard/Sidebar/UserInfo.vue b/packages/nc-gui/components/dashboard/Sidebar/UserInfo.vue index b910689230..1e628e1c13 100644 --- a/packages/nc-gui/components/dashboard/Sidebar/UserInfo.vue +++ b/packages/nc-gui/components/dashboard/Sidebar/UserInfo.vue @@ -52,6 +52,13 @@ onMounted(() => { isMounted.value = true }) +const isExperimentalFeatureModalOpen = ref(false) + +const openExperimentationMenu = () => { + isMenuOpen.value = false + isExperimentalFeatureModalOpen.value = true +} + const accountUrl = computed(() => { return isUIAllowed('superAdminSetup') && !isEeUI ? '/account/setup' : '/account/profile' }) @@ -183,6 +190,10 @@ const accountUrl = computed(() => { + + + {{ $t('general.featurePreview') }} + {{ $t('title.accountSettings') }} @@ -191,6 +202,7 @@ const accountUrl = computed(() => { + diff --git a/packages/nc-gui/components/smartsheet/Topbar.vue b/packages/nc-gui/components/smartsheet/Topbar.vue index ff03528d40..9d8ccc739a 100644 --- a/packages/nc-gui/components/smartsheet/Topbar.vue +++ b/packages/nc-gui/components/smartsheet/Topbar.vue @@ -14,6 +14,8 @@ const { appInfo } = useGlobal() const { toggleExtensionPanel, isPanelExpanded, extensionsEgg, onEggClick } = useExtensions() +const { isFeatureEnabled } = useBetaFeatureToggle() + const isSharedBase = computed(() => route.value.params.typeOrId === 'base') const topbarBreadcrumbItemWidth = computed(() => { @@ -54,7 +56,7 @@ const topbarBreadcrumbItemWidth = computed(() => { { -
diff --git a/packages/nc-gui/components/smartsheet/column/EditOrAdd.vue b/packages/nc-gui/components/smartsheet/column/EditOrAdd.vue index ea08d77c20..2910a1ba0a 100644 --- a/packages/nc-gui/components/smartsheet/column/EditOrAdd.vue +++ b/packages/nc-gui/components/smartsheet/column/EditOrAdd.vue @@ -59,7 +59,7 @@ const { $e } = useNuxtApp() const { appInfo } = useGlobal() -const { betaFeatureToggleState } = useBetaFeatureToggle() +const { isFeatureEnabled } = useBetaFeatureToggle() const { openedViewsTab } = storeToRefs(useViewsStore()) @@ -122,7 +122,9 @@ const isColumnTypeOpen = ref(false) const geoDataToggleCondition = (t: { name: UITypes }) => { if (!appInfo.value.ee) return true - return betaFeatureToggleState.show ? betaFeatureToggleState.show : !t.name.includes(UITypes.GeoData) + const isColEnabled = isFeatureEnabled(FEATURE_FLAG.GEODATA_COLUMN) + + return isColEnabled || !t.name.includes(UITypes.GeoData) } const showDeprecated = ref(false) diff --git a/packages/nc-gui/components/smartsheet/form/field-settings.vue b/packages/nc-gui/components/smartsheet/form/field-settings.vue index de8441e703..285a36a583 100644 --- a/packages/nc-gui/components/smartsheet/form/field-settings.vue +++ b/packages/nc-gui/components/smartsheet/form/field-settings.vue @@ -3,7 +3,7 @@ import { UITypes, isSelectTypeCol } from 'nocodb-sdk' const { formState, activeField, updateColMeta, isRequired } = useFormViewStoreOrThrow() -const { betaFeatureToggleState } = useBetaFeatureToggle() +const { isFeatureEnabled } = useBetaFeatureToggle() const updateSelectFieldLayout = (value: boolean) => { if (!activeField.value) return @@ -13,7 +13,7 @@ const updateSelectFieldLayout = (value: boolean) => { } const columnSupportsScanning = (elementType: UITypes) => - betaFeatureToggleState.show && + isFeatureEnabled(FEATURE_FLAG.FORM_SUPPORT_COLUMN_SCANNING) && [UITypes.SingleLineText, UITypes.Number, UITypes.Email, UITypes.URL, UITypes.LongText].includes(elementType) diff --git a/packages/nc-gui/components/smartsheet/grid/InfiniteTable.vue b/packages/nc-gui/components/smartsheet/grid/InfiniteTable.vue new file mode 100644 index 0000000000..a17fa04c20 --- /dev/null +++ b/packages/nc-gui/components/smartsheet/grid/InfiniteTable.vue @@ -0,0 +1,2848 @@ + + + + + diff --git a/packages/nc-gui/components/smartsheet/grid/PaginationV2.vue b/packages/nc-gui/components/smartsheet/grid/PaginationV2.vue index f4cab5c0ac..0e5dc34685 100644 --- a/packages/nc-gui/components/smartsheet/grid/PaginationV2.vue +++ b/packages/nc-gui/components/smartsheet/grid/PaginationV2.vue @@ -4,11 +4,13 @@ import { type PaginatedType, UITypes } from 'nocodb-sdk' const props = defineProps<{ scrollLeft?: number - paginationData: PaginatedType - changePage: (page: number) => void + paginationData?: PaginatedType + changePage?: (page: number) => void showSizeChanger?: boolean customLabel?: string + totalRows?: number depth?: number + disablePagination?: boolean }>() const emits = defineEmits(['update:paginationData']) @@ -23,6 +25,8 @@ const showSizeChanger = toRef(props, 'showSizeChanger') const vPaginationData = useVModel(props, 'paginationData', emits) +const disablePagination = toRef(props, 'disablePagination') + const { updateAggregate, getAggregations, visibleFieldsComputed, displayFieldComputed } = useViewAggregateOrThrow() const scrollLeft = toRef(props, 'scrollLeft') @@ -46,6 +50,9 @@ const count = computed(() => vPaginationData.value?.totalRows ?? Infinity) const page = computed({ get: () => vPaginationData?.value?.page ?? 1, set: async (p) => { + if (disablePagination.value) { + return + } isPaginationLoading.value = true try { await changePage?.(p) @@ -118,21 +125,36 @@ const renderAltOrOptlKey = () => { }" >
-
- -
- - - - {{ Intl.NumberFormat('en', { notation: 'compact' }).format(count) }} - {{ customLabel ? customLabel : count !== 1 ? $t('objects.records') : $t('objects.record') }} - - + + +