table-generator / src / stores / tableSettings.js
tableSettings.js
Raw
import { defineStore } from 'pinia'

export const useTableSettingsStore = defineStore('tableSettings', {
    state: () => ({
        tableStyles: {
            color: '#FFFFFF',
            backgroundColor: '#000000',
            fontSize: '16px',
            lineHeight: '1.5',
            fontFamily: 'Arial',
            borderColor: '#696969',
            borderWidth: '0px',
            borderStyle: 'solid',
            fontWeight: 'normal',
            backgroundImage: "url('')",
            backgroundSize: "unset",
            backgroundPosition: "top",
            backgroundRepeat: "no-repeat",
            paddingRight: '25px',
            paddingLeft: '25px',
            paddingBottom: '25px',
            paddingTop: '25px',
            fontStyle: 'normal',
            textAlign: 'left',
            letterSpacing: '0px'
        },
        speechStyles: {
            color: '#FF7A00',
            fontStyle: 'normal',
            fontFamily: 'Georgia',
            lineHeight: '1.5',
            fontWeight: 'normal',
            fontSize: '16px',
            letterSpacing: '0px'
        },
        innerContentStyles: {
            paddingRight: '25px',
            paddingLeft: '25px',
            paddingBottom: '25px',
            paddingTop: '25px',
            borderColor: '#696969',
            borderWidth: '0px',
            borderStyle: 'solid'
        },
        imageStyles: {
            float: 'none'
        },
        textOne: {
            color: '#FF7A00',
            fontStyle: 'normal',
            fontFamily: 'Georgia',
            lineHeight: '1.5',
            fontWeight: 'normal',
            fontSize: '16px',
            textAlign: 'center',
            letterSpacing: '0px'
        },
        textTwo: {
            color: '#FF7A00',
            fontStyle: 'normal',
            fontFamily: 'Georgia',
            lineHeight: '1.5',
            fontWeight: 'normal',
            fontSize: '16px',
            textAlign: 'center',
            letterSpacing: '0px'
        },
        settings: {
            customFont: '',
            device: 'desktop',
            imageSrc: '',
            wrapText: false,
            imageSide: 'left',
            imageSpacing: '16px',
            imageAlignment: 'start',
            imageWidthPercent: '50%',
            imageWidthPixels: '200px',
            useMaxHeight: false,
            maxHeight: '500px',
            textOne: '',
            textTwo: '',
            textOnePosition: 'top',
            textTwoPosition: 'bottom',
            useInnerContentArea: false,
            innerContentBackgroundColor: '#000000',
            innerContentBackgroundOpacity: 100,
            useTransparentBackground: false
        }
    }),
    getters: {
        allTableStyles(state) {
            return {
                ...state.tableStyles,
                ...{ gap: state.settings.imageSpacing },
                ...state.flexDirection,
                ...state.imageAlign,
            }
        },
        imageAlign(state) {
            let alignItems = 'flex-start'
            let justifyContent = 'flex-start'
            const alignment = state.settings.imageAlignment
            const side = state.settings.imageSide

            if (!state.settings.wrapText) {
                switch(side) {
                    case 'right':
                    case 'left':
                        switch(alignment) {
                            case 'start':
                            case 'end':
                                justifyContent = `flex-${alignment}`
                                break
                            case 'center':
                                justifyContent = 'center'
                                break
                        }
                        break
                    case 'top':
                    case 'bottom':
                        switch(alignment) {
                            case 'start':
                            case 'end':
                                alignItems = `flex-${alignment}`
                                break
                            case 'center':
                                alignItems = 'center'
                                break
                        }
                        break
                }
            }

            return {
                alignItems: alignItems,
                justifyContent: justifyContent
            }
        },
        maxHeightStyles(state) {
            const maxHeight = state.settings.useMaxHeight ? state.settings.maxHeight : 'unset'
            const overflow = state.settings.useMaxHeight ? 'auto' : 'unset'
            
            return {
                overflow: overflow,
                maxHeight: maxHeight
            }
        },
        processedImageStyles(state) {
            const imageStyles = state.imageStyles
            const styles = {
                ...imageStyles,
            }
            
            const wrapText = state.settings.wrapText
            const side = state.settings.imageSide

            if (wrapText) {
                styles.float = side
                switch(side) {
                    case 'left':
                        styles.marginRight = state.settings.imageSpacing
                        styles.marginBottom = state.settings.imageSpacing
                        break
                    case 'right':
                        styles.marginLeft = state.settings.imageSpacing
                        styles.marginBottom = state.settings.imageSpacing
                        break
                }
            }

            styles.width = `max(${state.settings.imageWidthPercent}, ${state.settings.imageWidthPixels})`

            return styles
        },
        innerContentBackground(state) {
            const opacity = state.settings.innerContentBackgroundOpacity
            const color = state.settings.innerContentBackgroundColor
            let hex = color

            if (opacity !== 100) {
                hex += opacity
            }

            return {
                backgroundColor: hex
            }
        },
        processedInnerContentStyles(state) {
            let styles = { ...state.maxHeightStyles, ...state.innerContentStyles }

            if (state.settings.useInnerContentArea) {
                styles = { ...styles, ...state.innerContentBackground }
            }

            return styles
        },
        flexDirection(state) {
            let direction = 'row'
            const side = state.settings.imageSide

            if (!state.settings.wrapText) {
                switch(side) {
                    case 'right':
                        direction = 'row-reverse'
                        break
                    case 'top':
                        direction = 'column'
                        break
                    case 'bottom':
                        direction = 'column-reverse'
                }
            }

            return {
                flexDirection: direction
            }
        },
    },
    actions: {
        setAllPaddingTo(value) {
            this.tableStyles.paddingTop = `${value}px`
            this.tableStyles.paddingRight = `${value}px`
            this.tableStyles.paddingBottom = `${value}px`
            this.tableStyles.paddingLeft = `${value}px`
        }
    }
})