7fe4f761创建于 4月29日历史提交
<template>
    <div class="pb-rich-view-editor" :class="{'active':editing}">
        <div>
            <div ref="editorContainer"></div>
            <div v-if="editing" class="tw-pt-1">
                <a href="javascript:;"
                   @click="doConfirm"
                   class="btn btn-block btn-round btn-sm btn-primary">
                    <i class="iconfont icon-check-simple"></i> 确认
                </a>
            </div>
        </div>
        <div v-if="!editing" @click="doRichViewEdit"
             class="tw-overflow-auto"
             :style="{maxHeight:maxHeight}">
            <div class="ub-html" v-if="modelValue" v-html="modelValue"></div>
            <div class="ub-html tw-text-gray-400" v-else>
                <p>
                    <i class="iconfont icon-edit"></i>
                    点击编辑内容
                </p>
            </div>
        </div>
        <div v-if="richViewEditorShow"
             style="visibility:hidden;height:1px;width:1px;opacity:0;position:absolute;top:0;right:0;"
             id="richViewEditorPlaceholder">
            <script id="richViewEditor" name="richViewEditor" type="text/plain"></script>
        </div>
    </div>
</template>

<script>
import {VModelMixin} from "@ModStartAsset/svue/lib/fields-config";

let DefaultServer = '';
if (window.__msAdminRoot) {
    DefaultServer = window.__msAdminRoot + 'data/ueditor';
}
export default {
    name: "RichViewEditor",
    mixins: [VModelMixin],
    props: {
        server: {
            type: String,
            default: DefaultServer,
        },
        maxHeight: {
            type: String,
            default: '10em',
        }
    },
    data() {
        return {
            richViewEditorShow: false,
            editing: false,
        }
    },
    mounted() {
        this.richViewEditorInit();
    },
    methods: {
        richViewEditorInit() {
            if (window.__richViewEditor) {
                return;
            }
            this.richViewEditorShow = true;
            window.__richViewEditor = true;
            this.$nextTick(() => {
                window.__richViewEditorPlaceholder = document.getElementById('richViewEditorPlaceholder');
                window.__richViewEditor = window.api.editor.basic('richViewEditor', {
                    server: this.server,
                    ready: () => {
                        window.__richViewEditor.setContent(window.__richViewEditorValue || '');
                        window.__richViewEditor.focus(true)
                    }
                })
            });
        },
        doRichViewEdit() {
            if (this.editing) {
                return;
            }
            if (window.__richViewEditorEnd) {
                window.__richViewEditorEnd();
            }
            window.__richViewEditorEnd = () => {
                this.doConfirm()
            };
            this.editing = true;
            window.__richViewEditorValue = this.modelValue;
            $(this.$refs.editorContainer).html(window.__richViewEditor.container.parentNode);
            // this.htmlEditor.unsetFloating()
            window.__richViewEditor.fireEvent("beforefullscreenchange", true)
            window.__richViewEditor.reset()
        },
        doConfirm() {
            this.editing = false;
            this.modelValue = window.__richViewEditor.getContent();
            $(window.__richViewEditorPlaceholder).append(window.__richViewEditor.container.parentNode);
            window.__richViewEditorEnd = null;
        }
    }
}
</script>
<style lang="less">
.pb-rich-view-editor {
    border: 1px dashed #DDD;
    min-height: 1em;
    border-radius: 0.3125rem;
    cursor: pointer;
    padding: 0.125rem;

    &:hover, &.active {
        border-color: var(--color-primary);
    }
}
</style>