Comments (2)
I have a solution but it's a bit of a hack, it would be great to have an official way of doing this:
JavaScript
function isStoryblokEditor() {
const urlParams = new URLSearchParams(window.location.search);
return urlParams.has('_storyblok');
}
if (isStoryblokEditor()) {
document.body.classList.add('is-storyblok-editor')
}
Use this to add a class to the body and then have CSS to disable all links.
CSS
body.is-storyblok-editor a {
pointer-events: none !important;
}
from storyblok-nuxt.
using a seperate component like this instead of NuxtLink
throughout your app is also a solution:
// e.g. /components/global/AppLink.vue
<script setup lang="ts">
const route = useRoute()
const isClickForbidden = ref(false)
onMounted(() => {
const isStoryblokEditor = !!route.query?._storyblok
if (isStoryblokEditor) {
isClickForbidden.value = true
}
})
const showClickForbiddenAlert = () => {
// eslint-disable-next-line no-alert
alert('Links are not clickable in the Storyblok editor. Please use the Storyblok editor navigation.')
}
</script>
<template>
<NuxtLink :class="{ relative: isClickForbidden }">
<div v-if="isClickForbidden" class="absolute inset-0 z-50 size-full cursor-not-allowed" @click.stop.prevent="showClickForbiddenAlert" />
<slot />
</NuxtLink>
</template>
classes are tailwind classes, but should be self-explainable.
here is a composable for doing the same within a renderRichText functionality:
// e.g. /utils/renderStoryblokRichText.ts
import cloneDeep from 'clone-deep'
import { type ISbRichtext, RichTextSchema } from '@storyblok/js'
export const renderStoryblokRichText = () => {
const { localePathByUuid } = useStoryRoutes()
const route = useRoute()
const isStoryblokEditor = !!route.query?._storyblok
const mySchema = cloneDeep(RichTextSchema)
mySchema.marks.link = (node) => {
const attrs = { ...node.attrs }
const { linktype = 'url' } = node.attrs
if (linktype === 'email') {
attrs.href = `mailto:${attrs.href}`
}
if (linktype === 'story') {
attrs.href = attrs.href
}
if (attrs.anchor) {
attrs.href = `${attrs.href}#${attrs.anchor}`
delete attrs.anchor
}
if (isStoryblokEditor) {
attrs.onclick = "event.preventDefault(); alert('Links are not clickable in the Storyblok editor. Please use the Storyblok editor navigation.');"
}
return {
tag: [
{
tag: 'a',
attrs,
},
],
}
}
const render = (richText: ISbRichtext) => {
return renderRichText(richText, {
schema: mySchema,
})
}
return {
render,
}
}
from storyblok-nuxt.
Related Issues (20)
- Consider giving the option to use `~/components/storyblok` for Storyblok Components HOT 5
- Component could not be found for blok HOT 8
- What is the correct way to access a story content inside a Nuxt plugin? HOT 8
- `renderRichText()` not working HOT 2
- Nuxt 3.4.0 - 3.8.2 + nitro 2.8.0 bug | [ERROR] No matching export in "node_modules/.pnpm/[email protected]/node_modules/unicorn-magic/default.js" for import "toPath" HOT 8
- Cannot read properties of null (reading 'parentNode') and Cannot read properties of null (reading 'subTree')
- cache not working anymore since v6.0.0 HOT 5
- Module breaks types for auto imported components HOT 16
- Enabling the @storyblok/nuxt module causes components to lose typings. HOT 7
- Internal link from rich text editor rendering wrong URL HOT 2
- Use nuxt preview composable to make sure that fetching is done properly
- Storyblok making requests clientside on full static site. HOT 16
- Cache version `cv=undefined` causes redirect HOT 1
- Add the option to set default API version (`draft` or `published`) from Nuxt Config and using an ENV variable HOT 4
- Add routes to " Hit rate limit..." messages. HOT 2
- ERROR Component could not be found for blok "ComponentName"! Is it defined in main.ts as "app.component("ComponentName", ComponentName); HOT 7
- Missing type for componetsDir HOT 2
- useAsyncStoryblok returns undefined when story is not found HOT 1
- Streamlining useAsyncStoryblok to nuxt's useAsyncData HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from storyblok-nuxt.