<template>
    <div class="w-main docs-view">

        <v-title>{{$L('文档浏览')}}</v-title>

        <div class="view-box">
            <div class="view-head">
                <div class="header-title">
                    <span v-if="bookDetail.title">{{bookDetail.title}}</span>
                    <em v-if="bookDetail.title && docDetail.title">-</em>
                    {{docDetail.title}}
                </div>
                <Button class="header-button" size="small" type="primary" ghost @click="toggleFullscreen">{{$L(isFullscreen ? '退出全屏' : '全屏')}}</Button>
            </div>
            <div class="view-main" :class="{'view-book':isBook}">
                <div class="view-menu">
                    <div class="view-menu-list">
                        <nested-draggable :lists="sectionLists" :readonly="true" :activeid="sid" @change="handleSection"></nested-draggable>
                    </div>
                </div>
                <div class="view-body">
                    <div class="view-body-content">
                        <template v-if="docDetail.type=='document'">
                            <MarkdownPreview v-if="docContent.type=='md'" :initialValue="docContent.content"></MarkdownPreview>
                            <ReportContent v-else :content="docContent.content"></ReportContent>
                        </template>
                        <minder v-else-if="docDetail.type=='mind'" ref="myMind" class="body-mind" v-model="docContent" :readOnly="true"></minder>
                        <sheet v-else-if="docDetail.type=='sheet'" ref="mySheet" class="body-sheet" v-model="docContent.content" :readOnly="true"></sheet>
                        <flow v-else-if="docDetail.type=='flow'" ref="myFlow" class="body-flow" v-model="docContent" :readOnly="true"></flow>
                    </div>
                </div>
            </div>
        </div>
    </div>
</template>


<style lang="scss">
    .view-body {
        .view-body-content {
            .markdown-preview,
            .report-content {
                margin: 0 !important;
                padding: 0 !important;
            }
            .minder-editor-container {
                transform: translateZ(0);
            }
            .body-sheet {
                box-sizing: content-box;
                * {
                    box-sizing: content-box;
                }
            }
        }
    }
</style>
<style lang="scss" scoped>
    .docs-view {
        background-color: #ffffff;
        .view-box {
            display: flex;
            flex-direction: column;
            position: absolute;
            width: 100%;
            height: 100%;
            .view-head {
                display: flex;
                flex-direction: row;
                align-items: center;
                width: 100%;
                height: 38px;
                box-shadow: 0 1px 5px 0 rgba(0, 0, 0, 0.1);
                position: relative;
                z-index: 99;
                .header-title {
                    flex: 1;
                    color: #333333;
                    padding-left: 12px;
                    padding-right: 12px;
                    font-size: 16px;
                    font-weight: 500;
                    white-space: nowrap;
                    em {
                        padding: 0 3px;
                        font-weight: normal;
                    }
                }
                .header-hint {
                    padding-right: 22px;
                    font-size: 12px;
                    color: #666;
                    white-space: nowrap;
                    .ivu-btn {
                        font-size: 12px;
                        padding: 0 10px;
                    }
                    .ivu-dropdown-item {
                        font-size: 12px !important;
                    }
                }
                .header-button {
                    font-size: 12px;
                    margin-right: 12px;
                }
            }
            .view-main {
                flex: 1;
                width: 100%;
                display: flex;
                flex-direction: row;
                align-items: flex-start;
                justify-content: flex-start;
                &.view-book {
                    .view-menu {
                        border-right: 0;
                        width: 100%;
                        .view-menu-list {
                            padding: 18px 8%;
                        }
                    }
                    .view-body {
                        display: none;
                    }
                }
                .view-menu {
                    position: relative;
                    height: 100%;
                    width: 280px;
                    border-right: 1px solid #E6ECF1;
                    .view-menu-list {
                        position: absolute;
                        left: 0;
                        top: 0;
                        right: 0;
                        bottom: 0;
                        padding: 18px 12px;
                        overflow: auto;
                    }
                }
                .view-body {
                    flex: 1;
                    height: 100%;
                    position: relative;
                    .view-body-content {
                        position: absolute;
                        left: 0;
                        top: 0;
                        right: 0;
                        bottom: 0;
                        padding: 18px;
                        overflow: auto;
                    }
                }
            }
        }
    }
</style>
<script>
    import Vue from 'vue'
    import minder from '../../components/docs/minder'
    Vue.use(minder)


    const Sheet = resolve => require(['../../components/docs/sheet/index'], resolve);
    const Flow = resolve => require(['../../components/docs/flow/index'], resolve);
    const NestedDraggable = resolve => require(['../../components/docs/NestedDraggable'], resolve);
    const MarkdownPreview = resolve => require(['../../components/MDEditor/components/preview/index'], resolve);
    const ReportContent = resolve => require(['../../components/report/content'], resolve);

    export default {
        components: {Sheet, Flow, ReportContent, MarkdownPreview, NestedDraggable},
        data () {
            return {
                loadIng: 0,

                sid: 0,

                docDetail: { },
                docContent: { },

                bookDetail: {},

                sectionLists: [],
                sectionNoDataText: "",

                routeName: '',

                isBook: false,
                isFullscreen: false,
            }
        },
        mounted() {
            this.routeName = this.$route.name;
            //
            document.addEventListener("fullscreenchange", () => {
                this.isFullscreen = !!document.fullscreenElement;
            });
        },
        activated() {
            this.refreshSid();
        },
        deactivated() {
            if ($A.getToken() === false) {
                this.sid = 0;
            }
        },
        watch: {
            sid(val) {
                if (!val) {
                    return;
                }
                val += "";
                if (val.substring(0, 1) == 'b') {
                    this.isBook = true;
                    this.docDetail.bookid = val.substring(1);
                    this.getSectionMenu();
                } else {
                    this.isBook = false;
                    this.refreshDetail();
                }
            },
            '$route' (To) {
                if (To.name == 'docs-view') {
                    this.sid = To.params.sid;
                }
            },
        },
        methods: {
            refreshSid() {
                this.sid = this.$route.params.sid;
                if (typeof this.$route.params.other === "object") {
                    this.$set(this.docDetail, 'title', $A.getObject(this.$route.params.other, 'title'))
                }
            },

            refreshDetail() {
                this.docDetail = { };
                this.docContent = { };
                this.getDetail();
            },

            getDetail() {
                this.loadIng++;
                $A.apiAjax({
                    url: 'docs/section/content',
                    data: {
                        act: 'view',
                        id: this.sid,
                    },
                    complete: () => {
                        this.loadIng--;
                    },
                    error: () => {
                        alert(this.$L('网络繁忙，请稍后再试！'));
                    },
                    success: (res) => {
                        if (res.ret === 1) {
                            this.docDetail = res.data;
                            this.docContent = $A.jsonParse(res.data.content);
                            this.getSectionMenu();
                        } else {
                            this.$Modal.error({
                                title: this.$L('温馨提示'),
                                content: res.msg,
                                onOk: () => {
                                    if (res.data == '-1001') {
                                        this.goForward({path: '/', query:{from:encodeURIComponent(window.location.href)}}, true);
                                    }
                                }
                            });
                        }
                    }
                });
            },

            getSectionMenu() {
                this.sectionNoDataText = this.$L("数据加载中.....");
                let bookid = this.docDetail.bookid;
                $A.apiAjax({
                    url: 'docs/section/lists',
                    data: {
                        act: 'view',
                        bookid: bookid
                    },
                    error: () => {
                        if (bookid != this.docDetail.bookid) {
                            return;
                        }
                        this.sectionNoDataText = this.$L("数据加载失败！");
                    },
                    success: (res) => {
                        if (bookid != this.docDetail.bookid) {
                            return;
                        }
                        if (res.ret === 1) {
                            this.bookDetail = res.data.book;
                            this.sectionLists = res.data.tree;
                            this.sectionNoDataText = this.$L("没有相关的数据");
                        } else {
                            this.sectionLists = [];
                            this.sectionNoDataText = res.msg;
                            this.$Modal.error({
                                title: this.$L('温馨提示'),
                                content: res.msg,
                                onOk: () => {
                                    if (res.data == '-1001') {
                                        this.goForward({path: '/', query:{from:encodeURIComponent(window.location.href)}}, true);
                                    }
                                }
                            });
                        }
                    }
                });
            },

            handleSection(act, detail) {
                if (act === 'open') {
                    this.goForward({name: 'docs-view', params: {sid: detail.id, other: detail || {}}});
                    this.refreshSid();
                }
            },

            toggleFullscreen() {
                if (this.isFullscreen) {
                    this.exitFullscreen();
                } else {
                    this.launchFullscreen(this.$el);
                }
            },

            launchFullscreen(element) {
                if (element.requestFullscreen) {
                    element.requestFullscreen();
                } else if (element.mozRequestFullScreen) {
                    element.mozRequestFullScreen();
                } else if (element.msRequestFullscreen) {
                    element.msRequestFullscreen();
                } else if (element.webkitRequestFullscreen) {
                    element.webkitRequestFullScreen();
                }
            },

            exitFullscreen() {
                if (document.exitFullscreen) {
                    document.exitFullscreen();
                } else if (document.msExitFullscreen) {
                    document.msExitFullscreen();
                } else if (document.mozCancelFullScreen) {
                    document.mozCancelFullScreen();
                } else if (document.webkitExitFullscreen) {
                    document.webkitExitFullscreen();
                }
            }
        },
    }
</script>
