mirror of
https://github.com/nocodb/nocodb.git
synced 2026-05-01 14:26:43 +00:00
169 lines
5.1 KiB
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>
|