Newer
Older
import { convertThemeToColorWhiteDefault, deleteEntity, editEntity } from '@/app/helpers';
import type { IParagraph } from '@/app/interfaces/entities';
import type { TTheme } from '@/app/interfaces/environment';
import cookies from '@/app/plugins/Cookie';
interface Props {
entityData: IParagraph;
}
const props = defineProps<Props>();
const emit = defineEmits(['saveChanges']);
const entityData = computed(() => props.entityData);
const newEntityData = ref({ ...entityData.value });
watch(entityData, () => (newEntityData.value = entityData.value));
const isModal = ref<boolean>(false);
const isModalToDeleteParagraph = ref<boolean>(false);
const changeFontSize = (newSize: '16' | '20' | '24' | '40' | '64') => {
entityData.value.font_size = newSize;
editEntity({ ...entityData.value, font_size: newSize });
};
const themeColor: TTheme = cookies.get('favorite_color');
const themeColorConverted = convertThemeToColorWhiteDefault(themeColor);
const isTitle = ref(!!entityData.value.title);
const isEntityWidthFull = ref(entityData.value.paragraph_size === 'full');
const maxLines = computed(() => {
if (isTitle.value) {
return Math.floor(168 / 24);
} else {
return Math.floor(240 / 24);
}
});
const entityIsTitleOptions = ref([
{
label: 'Off',
value: false,
textStyle: 'bold'
},
{
label: 'On',
value: true,
textStyle: 'bold'
}
]);
const isEntityWidthFullOptions = ref([
{
label: 'Half',
value: false,
textStyle: 'bold'
},
{
label: 'Full',
value: true,
textStyle: 'bold'
}
]);
const entityPositionOptions = ref([
},
{
label: 'center',
},
{
label: 'right',
]);
const entityTitlePositionOptions = ref([
},
{
label: 'center',
},
{
label: 'right',
const saveChanges = () => {
const entityPosition = isEntityWidthFull.value ? 'full' : 'half';
if (entityPosition !== entityData.value.entity_position) {
newEntityData.value.paragraph_size = entityPosition;
}
if (isTitle.value !== !!entityData.value.title) {
if (isTitle.value) {
newEntityData.value.title = 'Title';
} else {
newEntityData.value.title = null;
}
}
if (JSON.stringify(entityData.value) !== JSON.stringify(newEntityData.value)) {
emit('saveChanges', newEntityData.value);
}
isModal.value = false;
};
const toggleConfirmToDeleteParagraph = () => {
isModalToDeleteParagraph.value = !isModalToDeleteParagraph.value;
};
const deleteParagraph = () => {
deleteEntity(entityData.value.entity_uuid);
isModalToDeleteParagraph.value = false;
isModal.value = false;
};
</script>
<template>
<button
:style="`background-color: ${themeColorConverted}`"
class="settings absolute left-2 top-0 transition-all select-none size-10 flex justify-center items-center rounded-full hover:brightness-75 cursor-pointer"
@click.prevent="isModal = true"
>
<SettingsIcon color="white" size="25" />
</button>
<Modal v-model:isVisible="isModal" theme="black" width="90%"
><template #header><h3 class="w-max mx-auto">Edit paragraph</h3></template>
<Modal v-model:isVisible="isModalToDeleteParagraph" theme="black" width="30%"
><p class="font-bold pt-4 mb-4 text-center">Are you sure you want to delete this element?</p>
<div class="flex justify-between">
<Button
label="Yes, delete"
theme="red"
textColor="white"
textStyle="bold"
@click.prevent="deleteParagraph"
/>
<Button
label="Cancel"
theme="white"
textColor="black"
@click.prevent="toggleConfirmToDeleteParagraph"
/></div
></Modal>
<div class="p-10 flex gap-16 items-center">
<ParagraphSettingsList
v-model:newEntityData="newEntityData"
v-model:isTitle="isTitle"
v-model:isEntityWidthFull="isEntityWidthFull"
:themeColor="themeColor"
:entityIsTitleOptions="entityIsTitleOptions"
:isEntityWidthFullOptions="isEntityWidthFullOptions"
:entityPositionOptions="entityPositionOptions"
:entityTitlePositionOptions="entityTitlePositionOptions"
/>
<section
:style="`border-color: var(--${themeColor}-200); height: 320px`"
class="grow flex flex-col gap-4 p-4 min-h-full border-2 border-slate-100 border-dashed rounded-2xl"
>
<div :style="`justify-content: ${newEntityData.entity_position};`" class="flex">
<div
v-show="isTitle"
:style="`border-color: var(--${themeColor}-800); justify-content: ${newEntityData.entity_title_position}; width: ${isEntityWidthFull ? '100%' : '50%'}`"
class="flex text-2xl font-bold text-center px-2 py-4 border-2 border-dashed rounded-2xl"
>
<h3 class="w-2/3 overflow-ellipsis overflow-hidden whitespace-nowrap">
{{ newEntityData.title ?? 'Title' }}
</h3>
</div>
</div>
<div :style="`justify-content: ${newEntityData.entity_position}`" class="grow flex">
<div
:style="`border-color: var(--${themeColor}-400); width: ${isEntityWidthFull ? '100%' : '50%'};`"
class="h-full p-4 pb-2 border-2 border-dashed rounded-2xl overflow-hidden"
>
<p class="pb-0 overflow-hidden contain-inline-size text">{{ newEntityData.text }}</p>
</div>
</div>
</section>
<div
class="absolute top-4 right-16 z-10 hover:brightness-80 transition-all"
@click.prevent="toggleConfirmToDeleteParagraph"
>
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
<Button label="Delete" textColor="white" theme="red" textStyle="bold" size="medium">
<template #icon>
<TrashIcon color="white" size="25" />
</template>
</Button>
</div>
<div
class="absolute top-4 left-4 z-10 hover:brightness-80 transition-all"
@click.prevent="saveChanges"
>
<Button label="Save" textColor="white" :theme="themeColor" textStyle="bold" size="medium">
<template #icon>
<SaveIcon color="white" size="25" />
</template>
</Button>
</div>
</div>
</Modal>
</template>
<style scoped>
.text {
--max-lines: v-bind(maxLines);
overflow: hidden;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: var(--max-lines);
}
</style>