Files
nocodb/packages/nc-gui/components/general/JoinCloud.vue

169 lines
5.1 KiB
Vue

<script lang="ts" setup>
import type { CloudFeaturesType } from '~/lib/types'
const { $api } = useNuxtApp()
const { isDark } = useTheme()
const { cloudFeatures: _cloudFeatures } = useEeConfig()
const isLoading = ref(false)
const error = ref(false)
/**
* This hardcoded list will be used as fallback in case of api error
* Todo: @ramesh udpate coming soon once that feature is available
*/
const descriptions: CloudFeaturesType[] = [
{
Title: 'SAML based Single Sign-On',
Highlight: true,
},
{
Title: 'Form view branding',
},
{
Title: 'Personal views',
},
{
Title: 'Extensions',
},
{
Title: 'Scripts',
},
{
Title: 'AI Integrations',
Highlight: true,
},
]
const cloudFeatures = computed(() => {
if (error.value && !_cloudFeatures.value) return descriptions
return _cloudFeatures.value
})
const onMouseover = async () => {
if (isLoading.value) return
if (cloudFeatures.value.length && !error.value) {
isLoading.value = false
return
}
error.value = false
isLoading.value = true
try {
const res = await $api.utils.cloudFeatures()
_cloudFeatures.value = res
} catch (e: any) {
error.value = true
console.error(await extractSdkResponseErrorMsg(e))
} finally {
isLoading.value = false
}
}
</script>
<template>
<div
class="flex flex-row items-center w-full bg-bg-nc-bg-default rounded-lg border-1 border-nc-border-brand shadow-sm mb-0.5 overflow-hidden"
>
<a
v-e="['c:navbar:join-cloud']"
class="flex flex-grow !no-underline items-center justify-center border-r-1 h-full hover:bg-nc-bg-gray-light"
href="https://app.nocodb.com/signin?utm_source=OSS&utm_medium=OSS&utm_campaign=OSS&utm_content=OSS"
>
<div class="px-1 text-nc-content-gray-muted prose-sm" style="line-height: 1.3125rem">Try NocoDB Cloud</div>
</a>
<a-tooltip arrow-point-at-center overlay-class-name="nc-join-cloud-tooltip">
<NcButton type="text" size="small" class="!rounded-l-none !rounded-r-lg" @mouseover="onMouseover">
<GeneralIcon icon="help" class="!text-lg -mt-0.5 text-nc-content-gray-subtle" />
</NcButton>
<template #title>
<div class="w-70.5 bg-transparent overflow-hidden rounded-2xl shadow border-1 border-nc-border-gray-medium">
<div class="p-4 bg-nc-bg-default gap-4 inline-flex flex-col w-full">
<div class="flex items-center gap-3">
<div class="text-base text-nc-content-gray-emphasis font-bold flex-1">NocoDB Cloud</div>
<div class="text-caption px-1 rounded-md bg-nc-bg-brand text-nc-content-brand">Usage based</div>
</div>
<div class="text-sm font-bold text-nc-content-gray-emphasis">Includes</div>
<div v-if="!isLoading" class="flex flex-col gap-2">
<div
v-for="(feature, idx) of cloudFeatures"
:key="idx"
class="flex items-start text-nc-content-gray text-sm font-weight-500"
>
<span class="mr-2 h-5 inline-flex items-center">
<span class="rounded text-nc-content-brand bg-nc-bg-brand inline-flex items-center justify-center h-4 w-4">
<GeneralIcon icon="ncCheck" class="h-3 w-3" />
</span>
</span>
<span class="relative">
{{ feature.Title }}
<div v-if="feature.Highlight" class="nc-plan-description-gradient" :class="{ 'nc-dark': isDark }"></div>
</span>
<span v-if="feature['Coming Soon']" class="flex-1 inline-flex justify-end">
<span class="inline-block px-1 rounded-md bg-nc-bg-gray-medium text-sm text-nc-content-gray-subtle2">
Soon
</span>
</span>
</div>
</div>
<div v-else class="h-35 grid place-items-center">
<GeneralLoader size="large" />
</div>
<div class="flex flex-col gap-2">
<div class="text-xs leading-[18px] font-normal text-nc-content-gray-muted text-center">
(no credit card required)
</div>
<a href="https://app.nocodb.com/signin" target="_blank" class="!no-underline" rel="noopener">
<NcButton type="secondary" class="w-full">Start for Free</NcButton>
</a>
</div>
</div>
</div>
</template>
</a-tooltip>
</div>
</template>
<style lang="scss" scoped>
.nc-plan-description-gradient {
@apply absolute rounded-[30px] inset-0 z-0 pointer-events-none;
background: linear-gradient(90deg, rgba(255, 255, 255, 0.2) 0%, rgba(252, 58, 198, 0.2) 47.08%, rgba(255, 255, 255, 0.2) 100%);
filter: blur(2px);
&.nc-dark {
background: linear-gradient(
90deg,
rgba(255, 255, 255, 0.06) 0%,
rgba(252, 58, 198, 0.1) 47.08%,
rgba(255, 255, 255, 0.06) 100%
);
}
}
</style>
<style lang="scss">
.nc-join-cloud-tooltip {
@apply max-w-none;
.ant-tooltip-inner {
@apply !bg-transparent !p-0 rounded-2xl;
}
.ant-tooltip-arrow-content {
@apply !bg-nc-bg-default;
}
}
</style>