Your IP : 216.73.216.229


Current Path : /home/jeromecohp/www/plugins/system/yooessentials/modules/core/app/fields/
Upload File :
Current File : /home/jeromecohp/www/plugins/system/yooessentials/modules/core/app/fields/SettingsPanelField.vue

<template>
    <div v-if="!field.panel" class="uk-text-danger">Panel not specified</div>

    <button
        v-else-if="isEmpty(value)"
        class="uk-button yo-button-panel yooessentials-button-plus uk-width-1-1"
        type="button"
        @click.prevent="add"
    >
        {{ $t(field.txtEmpty || 'Add') }}
    </button>

    <div v-else>
        <ul
            v-sortable="{ group: 'settings-items' }"
            class="uk-nav uk-nav-default yo-sidebar-marginless yo-nav-sortable yo-nav-iconnav uk-margin uk-margin-remove-bottom"
            cls-custom="yo-nav-sortable-drag"
        >
            <Item
                v-for="(item, i) in value"
                :key="i"
                :title="getItemTitle(item)"
                @edit="edit(i)"
                @copy="copy(i)"
                @remove="remove(i)"
            />
        </ul>

        <div>
            <hr class="uk-margin-small-bottom" />

            <div class="uk-flex uk-flex-right">
                <a
                    href
                    :title="$t(field.txtEmpty || 'Add')"
                    uk-tooltip="delay: 1000"
                    class="ye-builder-icon-add"
                    @click.prevent="add"
                ></a>
            </div>
        </div>
    </div>
</template>

<script>
import yootheme from 'yootheme';
import { deepCopy, reindex } from '../util';
import { Item } from '../components';
import { DynamicPanel } from '../source';
import { findIndex, fragment, isArray, isEmpty, isString } from 'uikit-util';

export default {
    name: 'SettingsPanel',

    components: {
        Item,
    },

    extends: yootheme.fields.components.FieldContentItems.extends,

    inject: {
        Sidebar: {},
        Builder: { default: undefined },
        $node: { default: undefined },
    },

    created() {
        if (!isArray(this.value)) {
            this.value = [];
        }
    },

    methods: {
        isEmpty,

        add() {
            this.push({});
            this.edit(this.value.length - 1);
        },

        edit(index) {
            const node = this.value[index];

            if (this.Builder) {
                this.Builder.adjacentOf = this.field?.adjacent ? this.$node : null;
            }

            this.$trigger('openPanel', {
                ...this.getPanel(this.field.panel),
                props: {
                    node,
                    values: node,
                    builder: this.Builder,
                    rootPanelValues: this.values,
                },
            });
        },

        push(value) {
            this.value = [...this.value, value];
        },

        remove(index) {
            this.value.splice(index, 1);
        },

        copy(index) {
            this.value.splice(index, 0, deepCopy(this.value[index]));
        },

        move(child, parent, toIndex) {
            const fromIndex = findIndex(parent.$children, (c) => c === child);
            reindex(this.value, fromIndex, toIndex);
        },

        getPanel(panel) {
            if (!panel) {
                throw new Error('Invalid Panel');
            }

            if (isString(panel)) {
                panel = {
                    name: panel,
                    // get panel from current panel, fallback to global panels
                    ...(this.Sidebar?.panel?.panels?.[panel] || this.Sidebar?.panels?.[panel]),
                };
            }

            panel = {
                ...panel,
                component: DynamicPanel,
            };

            if (!panel.name) {
                throw new Error('Panel is missing name');
            }

            return panel;
        },

        getItemTitle(item) {
            if (isString(this.field?.title)) {
                this.field.title = { prop: this.field.title };
            }

            const title = { prop: 'title', default: 'Item', ...(this.field?.title ?? {}) };

            return this.stripTags(item[title.prop]) || title.default;
        },

        stripTags(html) {
            return fragment(html)?.textContent;
        },
    },
};
</script>