import { computed, defineComponent, onBeforeUpdate, onUnmounted, type PropType, reactive, ref, } from 'vue'; import { DefaultComponentProps } from '../_default'; import { BCMSPropWrapper, BCMSPropWrapperArray, BCMSPropWrapperArrayItem, } from './_wrapper'; import { BCMSContentEditor } from '../content'; import type { BCMSArrayPropMoveEventData, BCMSEntrySync, BCMSPropValueExtended, BCMSPropValueExtendedRichTextData, } from '../../types'; import { useTranslation } from '../../translations'; import type { BCMSEntryContentNode } from '@becomes/cms-sdk/types'; type PropValueType = BCMSPropValueExtendedRichTextData[]; const component = defineComponent({ props: { ...DefaultComponentProps, lng: String, prop: { type: Object as PropType, required: true, }, parentId: String, basePropPath: String, entrySync: Object as PropType, }, emits: { update: (_nodes: BCMSEntryContentNode[], _propPath: string) => { return true; }, add: (_propPath: string) => { return true; }, move: (_propPath: string, _moveData: BCMSArrayPropMoveEventData) => { return true; }, remove: (_propPath: string) => { return true; }, updateContent: (_propPath: string, _updates: number[]) => { return true; }, }, setup(props, ctx) { const translations = computed(() => { return useTranslation(); }); props = reactive(props); const errors = ref((props.prop.data as PropValueType).map(() => '')); const unregisterFromChecker = window.bcms.prop.checker.register(() => { let isOk = true; if (props.prop.required) { if ((props.prop.data as PropValueType).length === 0) { errors.value[0] = translations.value.prop.richText.error.emptyValue; isOk = false; } else { for (let i = 0; i < (props.prop.data as PropValueType).length; i++) { if ((props.prop.data as PropValueType)[i].nodes.length === 0) { errors.value[i] = translations.value.prop.richText.error.emptyValue; isOk = false; } else { errors.value[i] = ''; } } } } return isOk; }); onBeforeUpdate(() => { const value = props.prop.data as PropValueType; if (value.length !== errors.value.length) { errors.value = value.map(() => ''); } }); onUnmounted(() => { unregisterFromChecker(); }); return () => (
{props.prop.array ? ( { ctx.emit('add', props.basePropPath + '.data'); }} > {(props.prop.data as PropValueType).map((_, valueIndex) => { return ( { ctx.emit('move', props.basePropPath + '.data', data); }} onRemove={(index) => { ctx.emit('remove', props.basePropPath + '.data.' + index); }} > { editor.on('update', () => { ctx.emit( 'update', editor.getJSON().content as BCMSEntryContentNode[], props.basePropPath + `.data.${valueIndex}.nodes` ); }); }} onUpdateContent={(propPath, updates) => { ctx.emit('updateContent', propPath, updates); }} /> ); })} ) : ( <> { setTimeout(() => { editor.on('update', () => { ctx.emit( 'update', editor.getJSON().content as BCMSEntryContentNode[], props.basePropPath + '.data.0.nodes' ); }); }, 100); }} onUpdateContent={(propPath, updates) => { ctx.emit('updateContent', propPath, updates); }} /> )}
); }, }); export default component;