Files
nocodb/packages/nc-gui/components/dashboard/Sidebar/UserInfo.vue
Anbarasu 04f49c13d8 feat: infinite scroll (#9403)
* feat: infinite scroll wip

* feat: implement column create

* feat: improve scroll performance and minor bugs

* fix: optimize cache clear fix: preserver selected items from cache clear

* feat: add keyboard support

* fix: get rid of unwanted data

* feat: infinite scroll

* fix: reload visible data

* fix: rowIndex Sync

* fix: row height fix

* fix: performance issues

* fix: small issues

* fix: stablize scrolling

* fix: scroll fails to load new data

* fix: best part is no part remove bunch of manual handling and move to computedProperty

* fix: load data as chunks instead of offset

* fix: deboucne 500 ms

* feat: safe chunk clearing

* feat: working infinite table(wip)

* fix: handle delete selected range of rows

* fix: update types

* fix: nuxt warnings

* fix: table fixes

* feat: undo-redo support for infiniteTable

* fix: fix addEmptyRow

* fix: groupby fixes

* fix: refactor visibleDtaa computed

* fix: cache clear

* fix: invalid offset error

* fix: add empty row elem

* fix: rows not loading at end

* fix: refactor

* fix: more tests passing

* fix: perf optimizations

* fix: couple tests

* fix: row height tests

* fix: row height tests

* fix: row height tests

* fix: sync row comment count

* fix: fixes

* fix: lot of tests

* fix: update the row placeholder columns size calculation

* fix: update the totalRows on loadData

* fix: tests when count is 0

* fix: hide placeholder if rowHeight is small

* fix: not required imo as infinite scroll is implemented

* fix: links tests

* fix: filter tests

* fix: insert after test fix: Row: Create, Update, Delete fix: Row height fix: Create column tests

* fix: error, timezone bug fix: shared view data not loading after 100

* fix: ignore shifting. this fixes errors in rows, which has some mandatory required cells

* fix: keyboardShortcuts test

* fix: project collaboration test

* fix: increase local cache fix: records empty on switching to full screen mode fix: links issue on new records

* fix: row and col margin for improved data rendering

* fix: addEmptyRow to table bottom

* fix: update gridShare test fix: shared view grid feat: new count endpoint public

* fix: undo-redo test failing

* fix: bulkUpdate chore: disabled bulkUpdate tests for now

* fix: slow searchBtn

* fix: limit max selection

* fix: limit selection to 100

* fix: initial chunk load to 100

* fix: couple fixes

* fix: couple fixes

* fix: row expand

* fix: scrollto Top and scrollTo Bottom on Shift Cmd Down/Up

* fix: drop support for cmd A

* fix: failing tests

* fix: error on clicking resize col

* fix: premature fetching

* fix: deleteSelected not working properly

* fix: test build

* fix: test build

* fix: throttled 500

* fix: scroll related issues fix: added transitions

* fix: scroll related issues

* fix: decrease col margin

* fix: increase local cache and update Buffer

* fix: decrease throttle

* fix: improve scroll performance

* fix: improve scroll performance

* fix: improve scroll performance

* fix: fixes

* feat: beta toggle show

* feat: beta toggle show

* fix: hold scroll action

* fix: sync visible data reloadVisibleDataHook

* fix: refactor useBetaFeatureToggle fix: useMultiSelect in table

* fix: dynamically reduce margin while loading records

* fix: some bugs

* fix: data loading in infinitescroll

* fix: shared view and search issues

* feat: betaToggles menu

* fix: scroll showing up in aggregation

* fix: text

* fix: implement shifting in addEmptyRow

* fix: calculate slices on rowHeight modified

* fix: keep invalid cells until another row selected

* fix: remove row if filter gets failed

* fix: update styles

* fix: move filter handling to nocodb-sdk

* fix: user field filter

* fix: sort order

* fix:user field sorting

* fix: update virtual cols

* fix: updated sort handling

* fix: updated sort handling

* fix: updated sort handling for bulkUpdate and undo-redo

* fix: unit tests

* fix: deleteSelectedRecords fails

* fix: chunkstates errors

* fix: sort bugs

* fix: scroll position

* fix: delete selectedrange of records

* fix: improved chunk management

* fix: sync toggle states across tabs

* fix: sync between tabs

* fix: limit issues

* fix: update issues

* fix: zIndex

* fix: minor fixes

* fix: cmd arrow issue

* fix: bulkdelete index issues

* fix: empty rows at top

* fix: queue add new record behaviour

* fix: resolve rowObj addEmptyRow

* fix: typo

* fix: clear indexes

* fix: reload if width is zero

* fix: manual handling

* fix: remove console

* fix: prefetch when scroll from below

* fix: refactor fixes

* fix:undo-redo with sort

---------

Co-authored-by: mertmit <mertmit99@gmail.com>
2024-11-08 11:38:47 +05:30

252 lines
7.9 KiB
Vue

<script lang="ts" setup>
const { user, signOut, appInfo } = useGlobal()
// So watcher in users store is triggered
useUsers()
const { leftSidebarState } = storeToRefs(useSidebarStore())
const name = computed(() => user.value?.display_name?.trim())
const isMenuOpen = ref(false)
const isAuthTokenCopied = ref(false)
const isLoggingOut = ref(false)
const { isMobileMode } = useGlobal()
const { isUIAllowed } = useRoles()
const logout = async () => {
isLoggingOut.value = true
try {
const isSsoUser = !!(user?.value as any)?.sso_client_id
await signOut({
redirectToSignin: true,
signinUrl: isSsoUser ? '/sso' : '/signin',
})
} catch (e) {
console.error(e)
} finally {
isLoggingOut.value = false
}
}
watch(isMenuOpen, () => {
if (isAuthTokenCopied.value) {
isAuthTokenCopied.value = false
}
})
watch(leftSidebarState, () => {
if (leftSidebarState.value === 'peekCloseEnd') {
isMenuOpen.value = false
}
})
// This is a hack to prevent github button error (prevents navigateTo if user is not signed in)
const isMounted = ref(false)
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'
})
</script>
<template>
<div class="flex w-full flex-col py-0.9 px-1 border-gray-200 gap-y-1">
<LazyGeneralMaintenanceAlert />
<div class="flex items-center pr-2 justify-between">
<NcDropdown v-model:visible="isMenuOpen" placement="topLeft" overlay-class-name="!min-w-64">
<div
class="flex flex-row py-1 px-3 gap-x-2 items-center hover:bg-gray-200 rounded-lg cursor-pointer h-8"
data-testid="nc-sidebar-userinfo"
>
<GeneralUserIcon :email="user?.email" size="auto" :name="user?.display_name" />
<NcTooltip>
<div class="flex max-w-32 truncate">
{{ name ? name : user?.email }}
</div>
<template #title>
<span>
{{ name ? name : user?.email }}
</span>
</template>
</NcTooltip>
<GeneralIcon icon="chevronDown" class="flex-none !min-w-5 transform rotate-180 !text-gray-500" />
</div>
<template #overlay>
<NcMenu data-testid="nc-sidebar-userinfo">
<NcMenuItem data-testid="nc-sidebar-user-logout" @click="logout">
<div v-e="['c:user:logout']" class="flex gap-2 items-center">
<GeneralLoader v-if="isLoggingOut" class="!ml-0.5 !mr-0.5 !max-h-4.5 !-mt-0.5" />
<GeneralIcon v-else icon="signout" class="menu-icon" />
<span class="menu-btn"> {{ $t('general.logout') }}</span>
</div>
</NcMenuItem>
<NcDivider />
<a
v-e="['c:nocodb:discord']"
href="https://discord.gg/5RgZmkW"
target="_blank"
class="!underline-transparent"
rel="noopener noreferrer"
>
<NcMenuItem class="social-icon-wrapper">
<GeneralIcon class="social-icon" icon="ncDiscord" />
<span class="menu-btn"> {{ $t('labels.community.joinDiscord') }} </span>
</NcMenuItem>
</a>
<a
v-e="['c:nocodb:reddit']"
href="https://www.reddit.com/r/NocoDB"
target="_blank"
class="!underline-transparent"
rel="noopener noreferrer"
>
<NcMenuItem class="social-icon-wrapper">
<GeneralIcon class="social-icon" icon="ncReddit" />
<span class="menu-btn"> {{ $t('labels.community.joinReddit') }} </span>
</NcMenuItem>
</a>
<a
v-e="['c:nocodb:twitter']"
href="https://twitter.com/nocodb"
target="_blank"
class="!underline-transparent"
rel="noopener noreferrer"
>
<NcMenuItem class="social-icon-wrapper group">
<GeneralIcon class="social-icon text-gray-500 group-hover:text-gray-800" icon="ncTwitter" />
<span class="menu-btn"> {{ $t('labels.twitter') }} </span>
</NcMenuItem>
</a>
<template v-if="!appInfo.ee">
<NcDivider />
<a-popover key="language" class="lang-menu !py-1.5" placement="rightBottom">
<NcMenuItem>
<div v-e="['c:translate:open']" class="flex gap-2 items-center">
<GeneralIcon icon="translate" class="group-hover:text-black nc-language ml-0.25 menu-icon" />
{{ $t('labels.language') }}
<div class="flex items-center text-gray-400 text-xs">{{ $t('labels.community.communityTranslated') }}</div>
<div class="flex-1" />
<MaterialSymbolsChevronRightRounded
class="transform group-hover:(scale-115 text-accent) text-xl text-gray-400"
/>
</div>
</NcMenuItem>
<template #content>
<div class="bg-white max-h-50vh scrollbar-thin-dull min-w-64 !overflow-auto">
<LazyGeneralLanguageMenu />
</div>
</template>
</a-popover>
</template>
<template v-if="!isMobileMode">
<NcDivider />
<a
v-e="['c:nocodb:forum-open']"
href="https://community.nocodb.com"
target="_blank"
class="!underline-transparent"
rel="noopener"
>
<NcMenuItem>
<GeneralIcon icon="ncHelp" class="menu-icon mt-0.5" />
<span class="menu-btn"> {{ $t('title.forum') }} </span>
</NcMenuItem>
</a>
<a
v-e="['c:nocodb:docs-open']"
href="https://docs.nocodb.com"
target="_blank"
class="!underline-transparent"
rel="noopener"
>
<NcMenuItem>
<GeneralIcon icon="file" class="menu-icon mt-0.5" />
<span class="menu-btn"> {{ $t('title.docs') }} </span>
</NcMenuItem>
</a>
<NcDivider />
<DashboardSidebarEEMenuOption v-if="isEeUI" />
<NcMenuItem @click="openExperimentationMenu">
<GeneralIcon icon="bulb" class="menu-icon mt-0.5" />
<span class="menu-btn"> {{ $t('general.featurePreview') }} </span>
</NcMenuItem>
<nuxt-link v-e="['c:user:settings']" class="!no-underline" :to="accountUrl">
<NcMenuItem> <GeneralIcon icon="ncSettings" class="menu-icon" /> {{ $t('title.accountSettings') }} </NcMenuItem>
</nuxt-link>
</template>
</NcMenu>
</template>
</NcDropdown>
<DashboardFeatureExperimentation v-model:value="isExperimentalFeatureModalOpen" />
<LazyNotificationMenu />
</div>
<template v-if="isMobileMode || appInfo.ee"></template>
<div v-else class="flex flex-row w-full justify-between pt-0.5 truncate">
<GeneralJoinCloud />
</div>
</div>
</template>
<style lang="scss" scoped>
.menu-btn {
line-height: 1.5;
}
.menu-icon {
@apply w-4 h-4;
font-size: 1rem;
}
:deep(.ant-popover-inner-content) {
@apply !p-0 !rounded-md;
}
.social-icon {
@apply my-0.5 w-4 h-4 stroke-transparent;
// Make icon black and white
filter: grayscale(100%);
// Make icon red on hover
&:hover {
filter: grayscale(100%) invert(100%);
}
}
.social-icon-wrapper {
.nc-icon {
@apply mr-0.15;
}
&:hover {
.social-icon {
filter: none !important;
}
}
}
</style>