From 0b89eb111c8b7498bac29829b30b0f09135e2b4e Mon Sep 17 00:00:00 2001 From: "d.malygin" Date: Wed, 21 Aug 2024 18:56:23 +0500 Subject: [PATCH] refactor of entity of text and some more additions --- components.d.ts | 4 + src/app/interfaces/entities.ts | 19 +- src/app/interfaces/environment.ts | 23 ++- src/components/CreateEntityMenu.vue | 8 +- ...mageMoveMenu.vue => ImagePositionMenu.vue} | 70 +++++++- .../editEntityMenu/ImageSizeMenu.vue | 59 +++++-- .../editEntityMenu/ImageStateMenu.vue | 14 +- .../editEntityMenu/TextFontMenu.vue | 90 ++++++++++ .../editEntityMenu/TextMoveMenu.vue | 73 -------- .../editEntityMenu/TextPositionMenu.vue | 164 ++++++++++++++++++ .../editEntityMenu/TextStateMenu.vue | 2 +- src/modules/entities/ImageItem.vue | 107 ++++++++---- src/modules/entities/TextItem.vue | 132 ++++++++++---- src/output.css | 83 +++++---- 14 files changed, 636 insertions(+), 212 deletions(-) rename src/components/editEntityMenu/{ImageMoveMenu.vue => ImagePositionMenu.vue} (63%) create mode 100644 src/components/editEntityMenu/TextFontMenu.vue delete mode 100644 src/components/editEntityMenu/TextMoveMenu.vue create mode 100644 src/components/editEntityMenu/TextPositionMenu.vue diff --git a/components.d.ts b/components.d.ts index c0b7007..6a4a099 100644 --- a/components.d.ts +++ b/components.d.ts @@ -15,6 +15,7 @@ declare module 'vue' { Drawer: typeof import('primevue/drawer')['default'] ImageItem: typeof import('@/modules/entities/ImageItem.vue')['default'] ImageMoveMenu: typeof import('./src/components/editEntityMenu/ImageMoveMenu.vue')['default'] + ImagePositionMenu: typeof import('./src/components/editEntityMenu/ImagePositionMenu.vue')['default'] ImageSizeMenu: typeof import('./src/components/editEntityMenu/ImageSizeMenu.vue')['default'] ImageStateMenu: typeof import('./src/components/editEntityMenu/ImageStateMenu.vue')['default'] LogoAndLabel: typeof import('./src/components/LogoAndLabel.vue')['default'] @@ -29,9 +30,12 @@ declare module 'vue' { StateImageMenu: typeof import('./src/components/editEntityMenu/image/StateImageMenu.vue')['default'] StateMenu: typeof import('./src/components/editEntityMenu/text/StateMenu.vue')['default'] StateTextMenu: typeof import('./src/components/editEntityMenu/text/StateTextMenu.vue')['default'] + TextFontMenu: typeof import('./src/components/editEntityMenu/TextFontMenu.vue')['default'] TextItem: typeof import('@/modules/entities/TextItem.vue')['default'] TextMoveMenu: typeof import('./src/components/editEntityMenu/TextMoveMenu.vue')['default'] + TextPositionMenu: typeof import('./src/components/editEntityMenu/TextPositionMenu.vue')['default'] TextStateMenu: typeof import('./src/components/editEntityMenu/TextStateMenu.vue')['default'] + TextWidthMenu: typeof import('./src/components/editEntityMenu/TextWidthMenu.vue')['default'] Toast: typeof import('primevue/toast')['default'] Tree: typeof import('primevue/tree')['default'] UserInfoHeaderWithSettings: typeof import('./src/components/UserInfoHeaderWithSettings.vue')['default'] diff --git a/src/app/interfaces/entities.ts b/src/app/interfaces/entities.ts index 984ca16..956d3fb 100644 --- a/src/app/interfaces/entities.ts +++ b/src/app/interfaces/entities.ts @@ -1,4 +1,6 @@ -export interface ITable { +import type { IEntity } from '@/app/interfaces/environment'; + +export interface ITable extends IEntity { entity_type: 'table'; entity_uuid: string; title?: string; @@ -24,24 +26,29 @@ type ITableColumnTypes = | 'rating' | 'knob'; -export interface IText { +export interface IText extends IEntity { entity_type: 'text'; entity_uuid: string; title?: string; text: string; + font_size?: '16' | '20' | '24' | '40' | '64'; + paragraph_size?: 'full' | 'half'; + entity_title_position: 'left' | 'center' | 'right'; + entity_position: 'left' | 'center' | 'right'; } -export interface IImage { +export interface IImage extends IEntity { entity_type: 'image'; entity_uuid: string; title?: string; text?: string; - text_size?: 'small' | 'medium' | 'large'; - paragraph_size?: 'small' | 'medium' | 'large' | 'extraLarge'; + font_size?: '16' | '20' | '24' | '40' | '64'; + paragraph_size?: 'full' | 'half'; text_position?: 'left' | 'right'; image_url: string; image_width: number; image_height: number; - image_position: 'left' | 'center' | 'right'; image_scale: string; + entity_title_position: 'left' | 'center' | 'right'; + entity_position: 'left' | 'center' | 'right'; } diff --git a/src/app/interfaces/environment.ts b/src/app/interfaces/environment.ts index 699199e..a0f290d 100644 --- a/src/app/interfaces/environment.ts +++ b/src/app/interfaces/environment.ts @@ -1,5 +1,3 @@ -import type { IImage, ITable, IText } from '@/app/interfaces/entities'; - export interface ISheet { sheet_uuid: string; title: string; @@ -7,7 +5,26 @@ export interface ISheet { entities: IEntity[]; } -export type IEntity = IText | ITable | IImage; +export interface IEntity { + entity_uuid: string; + entity_user?: string; + user_nick_name?: string; + entity_order?: number; + entity_type: string; + title?: string; + text?: string; + font_size?: string; + paragraph_size?: string; + text_position?: string; + image_url?: string; + image_width?: number; + image_height?: number; + entity_position?: string; + entity_title_position?: string; + image_scale?: string; + table_columns?: string; + table_data?: string; +} export type TThemes = | 'green-blue' diff --git a/src/components/CreateEntityMenu.vue b/src/components/CreateEntityMenu.vue index cb07a87..15d92a7 100644 --- a/src/components/CreateEntityMenu.vue +++ b/src/components/CreateEntityMenu.vue @@ -23,7 +23,8 @@ const addImage = async (files: FileList) => { entity_type: 'image', entity_uuid: imageUuid, image_url: image.src, - image_position: 'left', + entity_position: 'left', + entity_title_position: 'center', image_width: image.width, image_height: image.height, image_scale: '1' @@ -44,7 +45,10 @@ const speedDialItems = ref([ emit('addEntity', { entity_type: 'text', entity_uuid: uuidv4(), - text: '' + text: '', + paragraph_size: 'full', + font_size: '24', + entity_position: 'left' }); } }, diff --git a/src/components/editEntityMenu/ImageMoveMenu.vue b/src/components/editEntityMenu/ImagePositionMenu.vue similarity index 63% rename from src/components/editEntityMenu/ImageMoveMenu.vue rename to src/components/editEntityMenu/ImagePositionMenu.vue index 6ba5846..95dd045 100644 --- a/src/components/editEntityMenu/ImageMoveMenu.vue +++ b/src/components/editEntityMenu/ImagePositionMenu.vue @@ -8,12 +8,18 @@ interface Props { entityData: IImage; } const props = defineProps(); -const emit = defineEmits(['editPosition', 'editTextPosition']); +const emit = defineEmits([ + 'editPosition', + 'editTitlePosition', + 'editTextPosition', + 'editParagraphWidth' +]); -const position = computed(() => props.entityData.image_position); +const position = computed(() => props.entityData.entity_position); +const titlePosition = computed(() => props.entityData.entity_title_position); const speedDialMove = computed(() => { - const state = []; + let state = []; switch (position.value) { case 'left': state.push({ @@ -70,6 +76,43 @@ const speedDialMove = computed(() => { command: () => changeOrderHomeEntity(props.entityData.entity_uuid, 'down') }); } + switch (titlePosition.value) { + case 'left': + state.push({ + label: 'Title center', + icon: 'pi pi-align-center', + command: () => emit('editTitlePosition', 'center') + }); + state.push({ + label: 'Title right', + icon: 'pi pi-align-right', + command: () => emit('editTitlePosition', 'right') + }); + break; + case 'center': + state.push({ + label: 'Title left', + icon: 'pi pi-align-left', + command: () => emit('editTitlePosition', 'left') + }); + state.push({ + label: 'Title right', + icon: 'pi pi-align-right', + command: () => emit('editTitlePosition', 'right') + }); + break; + case 'right': + state.push({ + label: 'Title left', + icon: 'pi pi-align-left', + command: () => emit('editTitlePosition', 'left') + }); + state.push({ + label: 'Title center', + icon: 'pi pi-align-center', + command: () => emit('editTitlePosition', 'center') + }); + } if (props.entityData?.text || props.entityData?.text === '') { if (props.entityData?.text_position === 'right') { state.push({ @@ -85,12 +128,29 @@ const speedDialMove = computed(() => { }); } } + const paragraphSize = props.entityData?.paragraph_size; + if (paragraphSize) { + if (paragraphSize === 'full') { + state = state.filter( + (item) => item.label !== 'Left' && item.label !== 'Center' && item.label !== 'Right' + ); + state.push({ + label: 'Text half width', + command: () => emit('editParagraphWidth', 'half') + }); + } else { + state.push({ + label: 'Text full width', + command: () => emit('editParagraphWidth', 'full') + }); + } + } return state; });