From e3107c621b3c6d01b8b200e0acd10323075913b6 Mon Sep 17 00:00:00 2001 From: zhiyong.zhou <zhiyong.zhou@highdatas.com> Date: 星期一, 04 三月 2024 10:56:51 +0800 Subject: [PATCH] 删除多余文件 --- src/views/admin/LayoutHeader.vue | 1 /dev/null | 52 ----------------- src/components/common/flowDialog.vue | 4 src/config/application/index.js | 2 src/views/admin/FormProcessDesign.vue | 5 - src/main.js | 7 +- src/views/common/process/nodes/ApprovalNode.vue | 12 --- src/views/admin/layout/ProcessDesign.vue | 20 ------ src/views/workspace/process/ProcessInstanceTabs.vue | 3 - src/views/common/process/config/ApprovalNodeConfig.vue | 17 ----- src/router/index.js | 8 -- src/components/common/OrgPicker.vue | 19 +----- 12 files changed, 15 insertions(+), 135 deletions(-) diff --git a/src/api/org.js b/src/api/org.js deleted file mode 100644 index bae49ea..0000000 --- a/src/api/org.js +++ /dev/null @@ -1,32 +0,0 @@ -import request from '@/api/request.js' - - -// 鏌ヨ缁勭粐鏋舵瀯鏍� -export function getOrgTree(param) { - return request({ - url: 'oa/org/tree', - method: 'get', - params: param - }) -} - -// 鏌ヨ绯荤粺瑙掕壊 -export function getRole() { - return request({ - url: 'oa/org/role', - method: 'get' - }) -} - -// 鎼滅储浜哄憳 -export function getUserByName(param) { - return request({ - url: 'oa/org/tree/user/search', - method: 'get', - params: param - }) -} - -export default { - getOrgTree, getUserByName, getRole -} diff --git a/src/components/common/OrgPicker.vue b/src/components/common/OrgPicker.vue index 7920309..85596db 100644 --- a/src/components/common/OrgPicker.vue +++ b/src/components/common/OrgPicker.vue @@ -1,5 +1,5 @@ <template> - <w-dialog :border="false" closeFree width="600px" @ok="selectOk" :title="title" v-model="visible"> + <flow-dialog :border="false" closeFree width="600px" @ok="selectOk" :title="title" v-model="visible"> <div class="picker"> <div class="candidate" v-loading="loading"> <div class="role-header" > @@ -36,11 +36,10 @@ </div> </div> </div> - </w-dialog> + </flow-dialog> </template> <script> -import {getOrgTree, getUserByName} from '@/api/org' import {getEntitySet} from "@/api/design"; export default { @@ -143,19 +142,7 @@ } return '**' }, - searchUser() { - let userName = this.search.trim() - this.searchUsers = [] - this.loading = true - getUserByName({userName: userName}).then(rsp => { - this.loading = false - this.searchUsers = rsp.data - this.selectToLeft() - }).catch(err => { - this.loading = false - this.$message.error("鎺ュ彛寮傚父") - }) - }, + selectToLeft() { let nodes = this.search.trim() === '' ? this.nodes : this.searchUsers; nodes.forEach(node => { diff --git a/src/components/common/Tip.vue b/src/components/common/Tip.vue deleted file mode 100644 index 397c9ca..0000000 --- a/src/components/common/Tip.vue +++ /dev/null @@ -1,36 +0,0 @@ -<template> - <el-tooltip :effect="isDark ? 'dark':'light'" :content="content" placement="top-start"> - <div> - <slot></slot> - <i class="el-icon-question" style="margin: 0 0px"></i> - </div> - </el-tooltip> -</template> - -<script> -export default { - install(Vue) { - Vue.component('Tip', this) - }, - name: "Tip", - components: {}, - props:{ - isDark:{ - type: Boolean, - default: false - }, - content:{ - type: String, - default: '' - } - }, - data() { - return {} - }, - methods: {} -} -</script> - -<style scoped> - -</style> diff --git a/src/components/common/WDialog.vue b/src/components/common/flowDialog.vue similarity index 96% rename from src/components/common/WDialog.vue rename to src/components/common/flowDialog.vue index 174ecf3..50fde30 100644 --- a/src/components/common/WDialog.vue +++ b/src/components/common/flowDialog.vue @@ -28,9 +28,9 @@ <script> export default { - name: "WDialog", + name: "flowDialog", install(Vue) { - Vue.component("WDialog", this); + Vue.component("flowDialog", this); }, components: {}, props: { diff --git a/src/config/application/index.js b/src/config/application/index.js index 354c601..191da31 100644 --- a/src/config/application/index.js +++ b/src/config/application/index.js @@ -4,5 +4,5 @@ import uat from './application-uat'; export default { - ...dev, + ...local, }; \ No newline at end of file diff --git a/src/config/tools.js b/src/config/tools.js deleted file mode 100644 index a565631..0000000 --- a/src/config/tools.js +++ /dev/null @@ -1,52 +0,0 @@ -import application from '@/config/application'; - -import baseApi from '@/common/services'; - -export default { - errorToast({title}) { - uni.showToast({ - title, - icon: 'error' - }); - }, - downFile(item) { - const filePath = `${application.baseURL}/worder/root/file/download?id=${item.id}`; - const tempLink = document.createElement("a"); - tempLink.style.display = "none"; - tempLink.href = filePath; - tempLink.setAttribute("download", item.name); - tempLink.setAttribute("target", "_blank"); - document.body.appendChild(tempLink); - tempLink.click(); - document.body.removeChild(tempLink); - }, - uploadFile(path) { - return new Promise((resolve, reject) => { - //鑾峰彇鍥剧墖涓存椂璺緞 - uni.uploadFile({ - url: baseApi.fileUploadUrl, //銆愬繀濉�戝浘鐗囦笂浼犲湴鍧� - filePath: path, //銆愬繀濉�戯紙files鍜宖ilePath閫夊叾涓�锛夎涓婁紶鏂囦欢璧勬簮鐨勮矾寰勩�� - name: 'file', //銆愬繀濉�戜笂浼犲悕瀛楋紝娉ㄦ剰涓庡悗鍙版帴鏀剁殑鍙傛暟鍚嶄竴鑷� - success: res => { - const id = JSON.parse(res.data).data.ids[0]; - resolve(id); - } - }); - }); - }, - pageBack(vue) { - window.setTimeout(() => { - vue.$router.go(-1); - }, 500); - }, - pageRefresh(vue) { - window.setTimeout(() => { - vue.$router.go(0); - }, 500); - }, - getPageParams() { - const currentPages = getCurrentPages(); - const currentPage = currentPages[currentPages.length - 1]; - return currentPage.options; - } -} \ No newline at end of file diff --git a/src/main.js b/src/main.js index e15975c..c841eb8 100644 --- a/src/main.js +++ b/src/main.js @@ -13,14 +13,13 @@ import "@/assets/iconfont/iconfont.css" import Ellipsis from '@/components/common/Ellipsis' -import WDialog from '@/components/common/WDialog' -import Tip from '@/components/common/Tip' +import flowDialog from '@/components/common/flowDialog.vue' import Utils from '@/utils/utils.js' Vue.use(ElementUI); Vue.use(Ellipsis); -Vue.use(WDialog); -Vue.use(Tip); +Vue.use(flowDialog); + Vue.use(vueEsign) Vue.config.productionTip = false Vue.prototype.$Utils = Utils diff --git a/src/router/index.js b/src/router/index.js index 7970826..68a4f05 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -16,14 +16,6 @@ redirect: "/formsPanel", }, { - path: "/index", - name: "index", - component: () => import("@/views/Index.vue"), - meta: { title: "OA宸ヤ綔娴�", viewport: viewport }, - }, - - - { path: "/formsPanel", name: "formsPanel", component: () => import("@/views/admin/FormsPanel.vue"), diff --git a/src/views/Index.vue b/src/views/Index.vue deleted file mode 100644 index d9cf7ea..0000000 --- a/src/views/Index.vue +++ /dev/null @@ -1,118 +0,0 @@ -<template> - <h1></h1> -</template> - -<script> - - -export default { - name: "Index", - data(){ - return{ - select:[], - loginUser: '' - } - }, - mounted(){ - let user = sessionStorage.getItem("user") - if (user !== null && user !== ''){ - this.loginUser = JSON.parse(user) - this.select.push(this.loginUser) - } - }, - methods:{ - selected(select){ - this.select = select - this.loginUser = select.length > 0 ? select[0]:'' - this.showUserSelect = false - sessionStorage.setItem("user", JSON.stringify(this.loginUser)) - }, - to(path){ - - this.$router.push(path) - - } - } -} -</script> - -<style lang="less" scoped> - -h4 { - margin: 0 auto; - color: #38adff; - margin-top: 150px; -} - -.user{ - position: absolute; - left: 20%; - margin-top: 20px; - div{ - margin-left: 20px; - display: inline-block; - } -} - -.work-panel { - text-align: left; - display: flex; - justify-content: center; - position: relative; - .panel { - margin-top: 80px; - max-width: 700px; - display: flex; - justify-content: center; - - .panel-item { - cursor: pointer; - margin: 0 40px; - width: 250px; - padding: 10px; - display: inline-block; - background: #ffffff; - border-radius: 10px; - border: 1px solid #ffffff; - box-shadow: 1px 1px 8px 0 #b0b0b1; - - &:hover { - border: 1px solid #2594ff; - box-shadow: 1px 1px 13px 0 #a4a4a5; - } - - div:nth-child(1) { - color: #7a7a7a; - font-weight: bold; - height: 60px; - line-height: 60px; - font-size: large; - border-bottom: 1px solid #cccdcd; - - span { - margin-left: 30px; - } - } - - i { - padding: 8px; - color: #ffffff; - background: #2594ff; - font-size: 25px; - border-radius: 5px; - } - - .el-icon-s-platform { - background: rgb(255, 148, 62); - } - - p { - padding: 10px 0; - color: #7a7a7a; - font-size: medium; - } - } - } - -} -</style> diff --git a/src/views/admin/FormProcessDesign.vue b/src/views/admin/FormProcessDesign.vue index 9e26c5f..924864a 100644 --- a/src/views/admin/FormProcessDesign.vue +++ b/src/views/admin/FormProcessDesign.vue @@ -6,7 +6,7 @@ <div class="layout-body"> <process-design ref="processDesign" v-show="activeSelect === 'processDesign'"/> </div> - <w-dialog :showFooter="false" v-model="validVisible" title="璁剧疆椤规鏌�"> + <flow-dialog :showFooter="false" v-model="validVisible" title="璁剧疆椤规鏌�"> <el-result :icon="validIcon" :title="errTitle" :subTitle="validResult.desc"> <i slot="icon" style="font-size: 30px" v-if="!validResult.finished" class="el-icon-loading"></i> <div slot="subTitle" class="err-info" v-if="validResult.errs.length > 0"> @@ -27,7 +27,7 @@ </el-form> </template> </el-result> - </w-dialog> + </flow-dialog> </el-container> </template> @@ -35,7 +35,6 @@ <script> import LayoutHeader from './LayoutHeader' import {createFlow, getFlowDetail} from '@/api/design' - import ProcessDesign from '@/views/admin/layout/ProcessDesign' export default { diff --git a/src/views/admin/LayoutHeader.vue b/src/views/admin/LayoutHeader.vue index 4e8866b..2fac42c 100644 --- a/src/views/admin/LayoutHeader.vue +++ b/src/views/admin/LayoutHeader.vue @@ -5,7 +5,6 @@ @select="handleSelect"> <el-menu-item index="processDesign" @click="to('processDesign')">瀹℃壒娴佺▼ </el-menu-item> -<!-- <el-menu-item index="proSetting" @click="to('proSetting')">鎵╁睍璁剧疆</el-menu-item>--> </el-menu> <div class="publish"> diff --git a/src/views/admin/layout/FormDesign.vue b/src/views/admin/layout/FormDesign.vue deleted file mode 100644 index 4dab936..0000000 --- a/src/views/admin/layout/FormDesign.vue +++ /dev/null @@ -1,533 +0,0 @@ -<template> - <el-container style="height: calc(100vh - 65px);"> - <el-aside> - <div class="components-nav"> - <span @click="libSelect = 0">缁勪欢搴�</span> - </div> - <div> - <div class="components" v-for="(group, i) in baseComponents" :key="i"> - <p>{{group.name}}</p> - <ul> - <draggable class="drag" :list="group.components" :options="{sort: false}" - :group="{ name: 'form', pull: 'clone', put: false }" - @start="isStart = true" @end="isStart = false" :clone="clone"> - <li v-for="(cp, id) in group.components" :key="id"> - <i :class="cp.icon"></i> - <span>{{ cp.title }}</span> - </li> - </draggable> - </ul> - </div> - </div> - - </el-aside> - - <el-main class="layout-main"> - <div class="tool-nav"> - <div> - <el-tooltip class="item" effect="dark" content="鎾ら攢" placement="bottom-start"> - <i class="el-icon-refresh-left"></i> - </el-tooltip> - <el-tooltip class="item" effect="dark" content="鎭㈠" placement="bottom-start"> - <i class="el-icon-refresh-right"></i> - </el-tooltip> - </div> - <div> - <el-tooltip class="item" effect="dark" content="棰勮琛ㄥ崟" placement="bottom-start"> - <i class="el-icon-view" @click="viewForms"></i> - </el-tooltip> - <el-tooltip class="item" effect="dark" content="绉诲姩绔�" placement="bottom-start"> - <i :class="{'el-icon-mobile':true, 'select': showMobile}" @click="showMobile = true"></i> - </el-tooltip> - <el-tooltip class="item" effect="dark" content="PC绔�" placement="bottom-start"> - <i :class="{'el-icon-monitor':true, 'select': !showMobile}" @click="showMobile = false"></i> - </el-tooltip> - </div> - </div> - <div class="work-form"> - <div :class="{'mobile': showMobile, 'pc': !showMobile}"> - <div :class="{'bd': showMobile}"> - <div :class="{'form-content': showMobile}"> - <div class="form"> - <div class="tip" v-show="forms.length === 0 && !isStart">馃憟 璇峰湪宸︿晶閫夋嫨鎺т欢骞舵嫋鑷虫澶�</div> - <draggable class="drag-from" :list="forms" group="form" - :options="{animation: 300, chosenClass:'choose', sort:true}" - @start="drag = true; selectFormItem = null" @end="drag = false"> - - <div v-for="(cp, id) in forms" :key="id" class="form-item" @click="selectItem(cp)" :style="getSelectedClass(cp)"> - <div class="form-header"> - <p><span v-if="cp.props.required">*</span>{{ cp.title }}</p> - <div class="option"> - <!--<i class="el-icon-copy-document" @click="copy"></i>--> - <i class="el-icon-close" @click="del(id)"></i> - </div> - <form-design-render :config="cp"/> - </div> - </div> - </draggable> - </div> - </div> - </div> - </div> - </div> - </el-main> - - <el-aside class="layout-param"> - <div class="tool-nav-r" v-if="selectFormItem"> - <i :class="selectFormItem.icon" style="margin-right: 5px; font-size: medium"></i> - <span>{{ selectFormItem.title }}</span> - </div> - <div v-if="!selectFormItem || forms.length === 0" class="tip"> - 馃榾 閫変腑鎺т欢鍚庡湪杩欓噷杩涜缂栬緫 - </div> - <div style="text-align:left; padding: 10px" v-else> - <form-component-config /> - </div> - </el-aside> - <w-dialog clickClose closeFree width="800px" :showFooter="false" :border="false" title="琛ㄥ崟棰勮" v-model="viewFormVisible"> - <form-render ref="form" :forms="forms" v-model="formData"/> - </w-dialog> - </el-container> -</template> - -<script> -import draggable from "vuedraggable"; -import FormRender from '@/views/common/form/FormRender' -import FormDesignRender from '@/views/admin/layout/form/FormDesignRender' -import FormComponentConfig from '@/views/common/form/FormComponentConfig' -import {baseComponents} from '@/views/common/form/ComponentsConfigExport' - -export default { - name: "FormDesign", - components: {draggable, FormComponentConfig, FormDesignRender, FormRender}, - data() { - return { - formData:{}, - libSelect: 0, - viewFormVisible: false, - isStart: false, - showMobile: true, - baseComponents, - select: null, - drag: false, - } - }, - computed: { - forms() { - return this.$store.state.design.formItems; - }, - selectFormItem: { - get(){ - return this.$store.state.selectFormItem - }, - set(val){ - this.$store.state.selectFormItem = val - }, - }, - nodeMap(){ - return this.$store.state.nodeMap - } - }, - methods: { - copy(node, index) { - this.form.splice(index + 1, 0, Object.assign({}, node)) - }, - getId() { - return 'field' + (Math.floor(Math.random() * (99999 - 10000)) + 10000).toString() - + new Date().getTime().toString().substring(5); - }, - del(index) { - this.$confirm('鍒犻櫎缁勪欢灏嗕細杩炲甫鍒犻櫎鍖呭惈璇ョ粍浠剁殑鏉′欢浠ュ強鐩稿叧璁剧疆锛屾槸鍚︾户缁�?', '鎻愮ず', { - confirmButtonText: '纭� 瀹�', - cancelButtonText: '鍙� 娑�', - type: 'warning' - }).then(() => { - if (this.forms[index].name === 'SpanLayout'){ - //鍒犻櫎鐨勬槸鍒嗘爮鍒欓亶鍘嗗垹闄ゅ垎鏍忓唴鎵�鏈夊瓙缁勪欢 - this.forms[index].props.items.forEach(item => { - this.removeFormItemAbout(item) - }) - this.forms[index].props.items.length = 0 - }else { - this.removeFormItemAbout(this.forms[index]) - } - this.forms.splice(index, 1) - }) - }, - async removeFormItemAbout(item){ - this.nodeMap.forEach(node => { - //鎼滃鏉′欢锛岃繘琛岀Щ闄� - if (node.type === 'CONDITION'){ - node.props.groups.forEach(group => { - let i = group.cids.remove(item.id) - if (i > -1){ - //浠庡瓙鏉′欢绉婚櫎 - group.conditions.splice(i, 1) - } - }) - } - //鎼滃鏉冮檺锛岃繘琛岀Щ闄� - if (node.type === 'ROOT' || node.type === 'APPROVAL' || node.type === 'CC'){ - node.props.formPerms.removeByKey('id', item.id) - if (node.props.formUser === item.id){ - node.props.formUser = '' - } - } - }) - }, - clone(obj) { - obj.id = this.getId() - return JSON.parse(JSON.stringify(obj)); - }, - viewForms(){ - this.viewFormVisible = true - }, - selectItem(cp){ - this.selectFormItem = cp - }, - getSelectedClass(cp){ - return this.selectFormItem && this.selectFormItem.id === cp.id ? - 'border-left: 4px solid #409eff':'' - }, - validateItem(err, titleSet, item){ - if (titleSet.has(item.title) && item.name !== 'SpanLayout'){ - err.push(`琛ㄥ崟 ${item.title} 鍚嶇О閲嶅`) - } - titleSet.add(item.title) - if (item.name === 'SelectInput' || item.name === 'MultipleSelect'){ - if (item.props.options.length === 0){ - err.push(`${item.title} 鏈缃�夐」`) - } - }else if (item.name === 'TableList'){ - if (item.props.columns.length === 0){ - err.push(`鏄庣粏琛� ${item.title} 鍐呮湭娣诲姞缁勪欢`) - } - }else if (item.name === 'SpanLayout'){ - if (item.props.items.length === 0){ - err.push('鍒嗘爮鍐呮湭娣诲姞缁勪欢') - }else { - item.props.items.forEach(sub => this.validateItem(err, titleSet, sub)) - } - } - }, - validate(){ - let err = [] - if (this.forms.length > 0){ - let titleSet = new Set() - this.forms.forEach(item => { - //涓昏鏍¢獙琛ㄦ牸鍙婂垎鏍�/閫夋嫨鍣�/琛ㄥ崟鍚嶇О/鏄惁璁剧疆 - this.validateItem(err, titleSet, item) - }) - }else { - err.push('琛ㄥ崟涓虹┖锛岃娣诲姞缁勪欢') - } - return err - } - } -} -</script> - -<style lang="less" scoped> - - -.choose { - border: 1px dashed @theme-primary !important; -} - -.process-form{ - /deep/ .el-form-item__label{ - padding: 0 0; - } -} - -.components-nav { - box-sizing: content-box; - display: flex; - align-items: center; - margin: 12px 12px 0; - height: 28px; - box-shadow: 0 2px 4px 0 rgba(17, 31, 44, 0.04); - border: 1px solid #ecedef; - border-radius: 16px; - background-color: #fff; - - .selected { - color: @theme-primary; - } - - .border { - border-left: 1px solid #f5f6f6; - border-right: 1px solid #f5f6f6; - } - - span { - flex: 1; - display: flex; - align-items: center; - justify-content: center; - height: 100%; - font-size: 12px; - color: rgba(17, 31, 44, 0.72); - cursor: pointer; - - &:hover { - color: @theme-primary; - } - } -} - -.components { - overflow-x: hidden; - overflow-y: scroll; - //margin-top: 20px; - //padding: 0 20px; - font-size: 12px; - width: 100%; - color: rgba(17, 31, 44, 0.85); - &>p{ - padding: 0 20px; - } - .drag { - margin-left: 20px; - display: flex; - flex-wrap: wrap; - align-items: center; - - li { - text-align: center; - display: flex; - align-items: center; - width: 124px; - height: 38px; - margin-bottom: 12px; - border: 1px solid transparent; - border-radius: 8px; - cursor: grab; - background-color: #fff; - - &:hover { - border: 1px solid @theme-primary; - color: @theme-primary; - } - - i { - margin: 0 12px; - } - } - - li:nth-child(odd) { - margin-right: 8px; - } - } -} - -/deep/ .el-main { - padding: 0; -} - -.layout-main { - background-color: #feffff; - - .tool-nav { - font-size: medium; - padding: 8px 20px; - background: #fafafb; - border-bottom: 1px solid #ebecee; - - div:first-child { - display: inline-block; - text-align: left; - - i { - margin-right: 10px - } - } - - div:last-child { - float: right; - - i { - margin-left: 10px - } - } - - i { - color: #7a7a7a; - cursor: pointer; - - &:hover { - color: #4b4b4b; - } - } - } - - .work-form { - margin: 0 auto; - height: calc(100% - 38px); - overflow-y: auto; - background: rgb(245, 246, 246); - border-left: 1px solid rgb(235, 236, 238); - border-right: 1px solid rgb(235, 236, 238); - - .pc { - margin-top: 4%; - - .drag-from { - height: calc(100vh - 190px); - background-color: rgb(245, 246, 246); - - .form-item, li { - cursor: grab; - background: #ffffff; - padding: 10px; - border: 1px solid #ebecee; - margin: 5px 0; - } - } - } - - .mobile { - margin-left: auto; - margin-right: auto; - width: 360px; - max-height: 640px; - margin-top: 4%; - border-radius: 24px; - box-shadow: 0 8px 40px 0 rgba(17, 31, 44, 0.12); - - .bd { - border: 1px solid rgba(17, 31, 44, 0.08); - border-radius: 24px; - padding: 10px 10px; - background-color: #ffffff; - - .form-content { - padding: 3px 2px; - border-radius: 14px; - background-color: #f2f4f5; - - .drag-from { - width: 100%; - height: calc(100vh - 190px); - min-height: 200px; - max-height: 600px; - } - - .form { - overflow-y: auto; - width: 100%; - display: inline-block; - max-height: 640px; - - .form-item, li { - border: 1px solid #ffffff; - list-style: none; - background: #ffffff; - padding: 10px; - margin: 5px 0; - cursor: grab; - } - } - } - } - } - - .tip { - //float: left; - margin: 0 auto; - width: 65%; - max-width: 400px; - padding: 35px 20px; - border-radius: 10px; - border: 1px dashed rgba(25, 31, 37, 0.12); - margin-top: 50px; - text-align: center; - font-size: 14px; - color: rgb(122, 122, 122); - z-index: 9999; - - &:hover { - border: 1px dashed @theme-primary; - } - } - } - -} - -.layout-param { - text-align: center; - font-size: 14px; - color: rgb(122, 122, 122); - - .tool-nav-r { - text-align: left; - font-size: small; - border-left: 1px solid #ebecee; - padding: 10px 20px; - background: #fafafb; - border-bottom: 1px solid #ebecee; - } - - .tip { - margin-top: 150px; - } -} - -.flip-list-move { - transition: transform 0.5s; -} - -.no-move { - transition: transform 0s; -} - -.select { - color: #4b4b4b !important; -} - -.form-header { - font-size: small; - color: #818181; - text-align: left; - position: relative; - background-color: #fff; - - p { - position: relative; - margin: 0 0 10px 0; - - span { - position: absolute; - left: -8px; - top: 3px; - color: rgb(217, 0, 19); - } - } - - .option { - position: absolute; - top: -10px; - right: -10px; - i { - font-size: large; - cursor: pointer; - color: #8c8c8c; - padding: 5px; - &:hover{ - color: #f56c6c; - } - } - } -} - -::-webkit-scrollbar { - width: 4px; - height: 4px; - background-color: #f8f8f8; -} - -::-webkit-scrollbar-thumb { - border-radius: 16px; - background-color: #e8e8e8; -} -</style> diff --git a/src/views/admin/layout/ProcessDesign.vue b/src/views/admin/layout/ProcessDesign.vue index 09583d0..b1a3eaf 100644 --- a/src/views/admin/layout/ProcessDesign.vue +++ b/src/views/admin/layout/ProcessDesign.vue @@ -1,14 +1,10 @@ <template> <el-main> -<!-- <div class="switchStyle">--> -<!-- <el-button size="small" @click="switchCss" >鍒囨崲</el-button>--> -<!-- </div>--> <div class="scale"> <el-button icon="el-icon-plus" size="small" @click="scale += 10" :disabled="scale >= 150" circle></el-button> <span>{{ scale }}%</span> <el-button icon="el-icon-minus" size="small" @click="scale -= 10" :disabled="scale <= 40" circle></el-button> -<!-- <el-button @click="validate">鏍¢獙娴佺▼</el-button>--> </div> <div class="design" :style="'transform: scale('+ scale / 100 +');'"> <process-tree ref="process-tree" @selectedNode="nodeSelected"/> @@ -57,21 +53,7 @@ }, methods: { - // switchCss(){ - // - // console.log(this.$cssSrc) - // console.log(this.$isVertical) - // - // if(this.$isVertical){ - // this.$cssSrc=require('@/assets/flowDesign.scss') - // this.$isVertical=false; - // }else{ - // this.$cssSrc=require('@/assets/flowDesignVertical.scss') - // this.$isVertical=true; - // } - // this.$forceUpdate() - // - // }, + validate(){ return this.$refs["process-tree"].validateProcess() }, diff --git a/src/views/admin/layout/form/FormDesignRender.vue b/src/views/admin/layout/form/FormDesignRender.vue deleted file mode 100644 index 6fd62f9..0000000 --- a/src/views/admin/layout/form/FormDesignRender.vue +++ /dev/null @@ -1,53 +0,0 @@ -<template> - <component ref="form" :is="config.name" :mode="mode" v-bind="config.props" v-model="_value" /> -</template> -<script> - -import components from '@/views/common/form/ComponentExport' - -export default { - name: "FormRender", - components: components, - props:{ - mode:{ - type: String, - default: 'DESIGN' - }, - value: { - default: undefined - }, - config:{ - type: Object, - default: ()=>{ - return {} - } - } - }, - computed: { - _value: { - get() { - const valueType = this.config.valueType - const value = valueType === "Number" && this.value ? Number(this.value) : this.value; - return value; - }, - set(val) { - const valueType = this.config.valueType - const value = valueType === "Number" ? Number(val) : val - this.$emit("input", value); - } - } - }, - data() { - return {} - }, - methods: { - validate(call){ - this.$refs.form.validate(call) - } - } -} -</script> - -<style lang="less" scoped> - -</style> diff --git a/src/views/common/process/config/ApprovalNodeConfig.vue b/src/views/common/process/config/ApprovalNodeConfig.vue index bf18300..a7d6880 100644 --- a/src/views/common/process/config/ApprovalNodeConfig.vue +++ b/src/views/common/process/config/ApprovalNodeConfig.vue @@ -66,16 +66,13 @@ </div> </el-form-item> </el-form> - <org-picker :title="pickerTitle" multiple :type="orgPickerType" ref="orgPicker" :selected="orgPickerSelected" - @ok="selected"/> </div> </template> <script> -import OrgPicker from "@/components/common/OrgPicker"; +//import OrgPicker from "@/components/common/OrgPicker"; import {getDict, getEntitySet} from "@/api/design"; export default { name: "ApprovalNodeConfig", - components: {OrgPicker}, props: { config: { type: Object, @@ -88,7 +85,6 @@ return { showOrgSelect: false, orgPickerSelected: [], - orgPickerType: 'user', groupNames: ['1', '2', '3', '4', '6', 'F', 'G', 'H', 'I', 'J'], approvalGroups: [ ], @@ -131,16 +127,7 @@ return this.config.assignedUser }, - pickerTitle() { - switch (this.orgPickerType) { - case 'user': - return '璇烽�夋嫨浜哄憳'; - case 'role': - return '璇烽�夋嫨绯荤粺瑙掕壊'; - default: - return null; - } - }, + }, mounted() { this.getApprovalGroup(); diff --git a/src/views/common/process/nodes/ApprovalNode.vue b/src/views/common/process/nodes/ApprovalNode.vue index eb94ceb..6326dd8 100644 --- a/src/views/common/process/nodes/ApprovalNode.vue +++ b/src/views/common/process/nodes/ApprovalNode.vue @@ -40,17 +40,7 @@ return String(texts).replaceAll(',', '銆�') }, - // flowText(){ - // const config = this.config - // console.log("flowText-config",config); - // - // // return config.approvalArr.filter(ite=>ite.node_id===config.id)[0].approval_time; - // if(config.approvalArr!==undefined){ - // return "鍙戣捣鏃堕棿:"+config.approvalArr.filter(ite=>ite.node_id===config.id)[0].approval_time; - // } - // - // return '' - // } + }, created() { console.log("鍔犺浇ApprovalNode.vue") diff --git a/src/views/workspace/InitiateProcess.vue b/src/views/workspace/InitiateProcess.vue deleted file mode 100644 index e4c836d..0000000 --- a/src/views/workspace/InitiateProcess.vue +++ /dev/null @@ -1,93 +0,0 @@ -<template> - <div v-loading="loading"> - <div v-if="!loading"> - <!--娓叉煋琛ㄥ崟--> - <form-render class="process-form" ref="form" :forms="forms" v-model="formData"/> - </div> - <el-divider>瀹℃壒娴佺▼</el-divider> - <div> - <!--娓叉煋娴佺▼鎵ц杩囩▼--> - <el-timeline :reverse="false"> - <!--<el-timeline-item v-for="(activity, index) in activities" :key="index"> - - </el-timeline-item>--> - </el-timeline> - </div> - </div> -</template> - -<script> -import FormRender from '@/views/common/form/FormRender' -import FormDesignRender from '@/views/admin/layout/form/FormDesignRender' -import {getFormDetail, getFormDetailV2} from '@/api/design' - -export default { - name: "InitiateProcess", - components: {FormDesignRender, FormRender}, - props: { - code: { - type: String, - required: true - } - }, - data() { - return { - loading: false, - formData: {}, - form: { - formId: '', - formName: "", - logo: {}, - formItems: [], - process: {}, - remark: "" - } - } - }, - mounted() { - this.loadFormInfo(this.code) - }, - computed: { - forms() { - return this.$store.state.design.formItems; - } - }, - methods: { - loadFormInfo(formId) { - this.loading = true - getFormDetailV2(formId).then(rsp => { - this.loading = false - console.log(rsp.data) - let form = rsp.data.result; - form.logo = JSON.parse(form.logo) - form.settings = JSON.parse(form.settings) - form.formItems = JSON.parse(form.formItems) - form.process = JSON.parse(form.process) - this.form = form - //鏋勫缓琛ㄥ崟鍙婃牎楠岃鍒� - this.$store.state.design = form - }).catch(err => { - this.loading = false - this.$message.error(err) - }) - }, - validate(call) { - this.$refs.form.validate(call); - }, - getFormData() { - return this.formData - }, - getForm() { - return this.form - } - } -} -</script> - -<style lang="less" scoped> -.process-form { - /deep/ .el-form-item__label { - padding: 0 0; - } -} -</style> diff --git a/src/views/workspace/SponsorProcess.vue b/src/views/workspace/SponsorProcess.vue deleted file mode 100644 index 3f08721..0000000 --- a/src/views/workspace/SponsorProcess.vue +++ /dev/null @@ -1,590 +0,0 @@ -<template> - <div> - <div class="el-row" style="margin-left: -10px; margin-right: -10px"> - <div - class="el-col el-col-15" - style=" - padding-left: 10px; - padding-right: 10px; - border-right: 1px solid rgb(232, 232, 232); - " - > - <form-render - class="process-form" - ref="form" - :forms="forms" - v-model="formData" - /> - </div> - <div - class="el-col el-col-9" - style="padding-left: 10px; padding-right: 10px" - > - <div> - <el-timeline> - <el-timeline-item - v-for="(activity, index) in cc" - :key="index" - :icon="activity.icon" - size="large" - class="task" - > - <div - class="process-node-render" - v-if="!activity.hasOwnProperty('options')" - > - <div> - <div style="font-size: 16px">{{ activity.title }}</div> - <span style="color: rgb(168, 173, 175)">{{ - activity.desc - }}</span> - </div> - <div style="display: flex"> - <div - class="avatar show-y" - v-for="(user, index) in activity.users" - :key="index" - > - <div class="a-img"> - <el-avatar - style="height: 38px; width: 38px; line-height: 38px" - :src="user.avatar" - ></el-avatar> - <i - class="close el-icon-close" - v-if="activity.isEdit" - @click="delUser(activity.users, user)" - ></i> - <i class="status" style="display: none"></i> - </div> - <span class="name line">{{ user.name }}</span> - </div> - <span - class="add-user" - v-if=" - activity.isEdit && - (activity.multiple || 0 === activity.users.length) - " - @click="addUser(activity)" - ><i class="el-icon-plus"></i> - <div>娣诲姞</div></span - > - </div> - </div> - <el-radio-group v-model="activity.id" size="mini" v-else> - <el-radio-button - :label="d.title" - :value="d.id" - v-for="(d, index) in activity.options" - :key="index" - ></el-radio-button> - </el-radio-group> - </el-timeline-item> - </el-timeline> - </div> - <org-picker - :type="this.selectedNode.type || 'user'" - :multiple="this.selectedNode.multiple || !1" - ref="orgPicker" - :selected="this.selectedNode.users || []" - @ok="selected" - ></org-picker> - </div> - </div> - <div></div> - </div> -</template> - -<script> -import FormRender from "@/views/common/form/FormRender"; -import { getFormDetailV2 } from "@/api/design"; -import OrgPicker from "@/components/common/OrgPicker"; -import {flatFormItem} from "@/views/workspace/form"; - -export default { - name: "SponsorProcess", - components: { FormRender, OrgPicker }, - props: { - code: { - type: String, - required: true, - }, - }, - data() { - return { - loading: false, - formData: {}, - select: [], - selectedNode: {}, - processUsers: {}, - form: { - formId: "", - formName: "", - logo: {}, - formItems: [], - process: {}, - remark: "", - }, - loginUser: {}, - conditionFormItem: new Set(), - activities: [], - cc: [], - }; - }, - mounted() { - this.loadLoginUser(); - this.loadFormInfo(this.code); - }, - watch: { - // 琚睛鍚殑鍙橀噺count - formData: { - // 瀵瑰璞¤繘琛屾繁搴︾洃鍚� - handler(nv) { - this.startProcess(nv, (this.cc = [])); - }, - immediate: true, - deep: true, - }, - }, - computed: { - forms() { - return this.$store.state.design.formItems; - }, - _value: { - get: function () { - return this.value; - }, - set: function (e) { - this.$emit("input", e); - }, - }, - }, - methods: { - loadLoginUser() { - this.loginUser = JSON.parse(sessionStorage.getItem("user")); - }, - loadFormInfo(formId) { - this.loading = true; - getFormDetailV2(formId) - .then((rsp) => { - this.loading = false; - let form = rsp.data.result; - form.logo = JSON.parse(form.logo); - form.settings = JSON.parse(form.settings); - form.process = JSON.parse(form.process); - const perms = form.process.props.formPerms || []; - // 琛ㄥ崟椤� 浠巎son杞崲涓烘暟缁� 鐢ㄤ簬娓叉煋琛ㄥ崟 鎵佸钩鍖栧鐞� 鍘婚櫎浜唖panLayout - const formItems = flatFormItem(JSON.parse(form.formItems)); - // item鏄剧ず鐘舵�佹槧灏勫叧绯� - const itemStatusMap = new Map(perms.map((it) => [it.id, it.perm])); - const items = formItems - .map((item) => { - // perm璇存槑 鍙R 缂栬緫E 闅愯棌H - const perm = itemStatusMap.get(item.id); - if (perm === "E") { - return item; - } else if (perm === "R") { - item.props.readerMode = true; - return item; - } else if (perm === "H") { - return undefined; - } - }) - .filter(Boolean); - form.formItems = items; - - this.form = form; - //鏋勫缓琛ㄥ崟鍙婃牎楠岃鍒� - this.$store.state.design = form; - this.startProcess(form.process, this.formData); - }) - .catch((err) => { - this.loading = false; - this.$message.error(err); - }); - }, - validate(call) { - this.$refs.form.validate(call); - }, - getFormData() { - return this.formData; - }, - getProcessUser() { - return this.processUsers; - }, - getForm() { - return this.form; - }, - addUser(e) { - (this.selectedNode = e), this.$refs.orgPicker.show(); - }, - delUser(e, t) { - e.splice(t, 1); - this.processUsers = e; - }, - startProcess() { - this.cc = []; - this.getProcess(this.form.process, this.activities, this.cc); - - this.cc.push({ - title: "缁撴潫", - name: "END", - icon: "el-icon-success", - isEdit: false, - }); - }, - selected(e) { - var t = this; - t.processUsers[t.selectedNode.id] = []; - - e.forEach((user) => { - var ddd = t.selectedNode.users.findIndex((t) => { - return t.id === user.id; - }); - if (ddd === -1) { - t.selectedNode.users.push(user); - t.processUsers[t.selectedNode.id].push(user); - t.$set(e, "isEdit", true); - } - }); - }, - getProcess(process, data, cc) { - if (null != process && undefined != process) { - if ("ROOT" === process.type) { - //鍙戣捣浜鸿妭鐐� - this.getRootNode(cc, process); - } else if ("APPROVAL" === process.type) { - //瀹℃壒鑺傜偣 - this.getApprovalNode(cc, process); - } else if ("CC" === process.type) { - this.getCcNode(cc, process); - } else if ("CONDITIONS" === process.type) { - //鍒ゆ柇鏄惁绗﹀悎鏉′欢绗﹀悎璧版潯浠跺垎鏀�,鍚﹀垯缁х画閫掑綊瀛愬垎鏀� - if (null != process.branchs && undefined != process.branchs) { - this.getConditionNode(cc, process); - } - } else if ("CONCURRENTS" === process.type) { - this.getConcurrentNode(cc, process); - } - if (null != process.children && undefined != process.children) { - this.getProcess(process.children, data, cc); - } - } - }, - //灏佽寮�濮嬭妭鐐� - getRootNode(cc, process) { - cc.push({ - id: process.id, - title: process.name, - name: "鍙戣捣浜�", - icon: "el-icon-user-solid", - isEdit: false, - users: [this.loginUser], - }); - }, - //灏佽瀹℃壒鑺傜偣 - getApprovalNode(cc, process) { - var data = { - id: process.id, - title: process.name, - name: "瀹℃壒浜�", - icon: "el-icon-s-check", - isEdit: false, - multiple: false, - mode: process.props.mode, - users: [], - desc: "", - }; - //鍒ゆ柇瀹℃壒浜虹被鍨� - switch (process.props.assignedType) { - case "ASSIGN_USER": - data.users = this.$deepCopy(process.props.assignedUser); - data.desc = "鎸囧畾瀹℃壒浜�"; - break; - case "ASSIGN_LEADER": - data.desc = "鎸囧畾閮ㄩ棬鐨勯瀵�"; - break; - case "SELF": - data.users = [this.loginUser]; - data.desc = "鍙戣捣浜鸿嚜宸卞鎵�"; - break; - case "SELF_SELECT": - data.isEdit = true; - data.multiple = process.props.selfSelect.multiple || false; - data.desc = "鑷�夊鎵逛汉"; - break; - case "LEADER_TOP": - data.desc = "杩炵画澶氱骇涓荤瀹℃壒"; - break; - case "LEADER": - data.desc = - 1 === process.props.leader.level - ? "鐩存帴涓荤瀹℃壒" - : "绗�".concat(process.props.leader.level, "绾т富绠″鎵�"); - break; - case "ROLE": - data.desc = "鐢辫鑹瞇".concat( - (process.props.role || []).map(function (e) { - return e.name; - }), - "]瀹℃壒" - ); - break; - case "REFUSE": - data.desc = "娴佺▼姝ゅ灏嗚鑷姩椹冲洖"; - break; - } - cc.push(data); - }, - getCcNode(cc, process) { - var data = { - id: process.id, - title: process.name, - icon: "el-icon-s-promotion", - name: "鎶勯�佷汉", - isEdit: process.props.shouldAdd, - type: "org", - multiple: true, - desc: process.props.shouldAdd ? "鍙坊鍔犳妱閫佷汉" : "", - users: this.$deepCopy(process.props.assignedUser), - }; - cc.push(data); - }, - getConditionNode(cc, process) { - for (var r = null, s = 0; s < process.branchs.length; s++) { - for ( - var a = process.branchs[s], n = false, o = 0, i = 0; - i < a.props.groups.length; - i++ - ) { - if ( - ((n = this.getConditionResultByGroup(a.props.groups[i])), - "OR" === a.props.groupsType && n) - ) { - r = a; - break; - } - "AND" === a.props.groupsType && n && o++; - } - - if (r) { - break; - } - if (o === a.props.groups.length) { - r = a; - break; - } - } - var d = []; - console.log( - "绗﹀悎鍒嗘敮鏉′欢,缁х画鎵ц閫掑綊,鑾峰彇绗﹀悎鏉′欢涓嬭妭鐐逛笅鐨勫瓙鑺傜偣!" + - JSON.stringify(r) - ); - r - ? this.getProcess(r, d, cc) - : console.log( - "鏉′欢鑺傜偣 " - .concat(process.id, " => ") - .concat(process.name, " 鍧囦笉婊¤冻锛屾棤娉曠户缁�"), - process - ); - }, - getConcurrentNode(cc, process) { - var data = { - id: process.id, - title: process.name, - name: "骞惰鍒嗘敮", - icon: "el-icon-s-operation", - isEdit: false, - active: process.branchs[0].id, - options: [], - desc: "鍒囨崲鍒嗘敮鍙樉绀哄搴旀墽琛屾祦绋�", - branchs: {}, - }; - cc.push(data); - process.branchs.forEach((b) => { - data.options.push({ id: b.id, title: b.name }); - this.$set(data.branchs, b.id, []); - var d = []; - this.getProcess(b.children, d, data.branchs[b.id]); - }); - }, - getConditionResultByGroup: function (e) { - var t = this, - r = !1, - s = 0; - e.conditions.forEach(function (e) { - return t.conditionFormItem.add(e.id); - }); - - for (var a = 0; a < e.conditions.length; a++) { - var n = e.conditions[a]; - switch (n.valueType) { - case "Number": - console.log("杩欐槸number绫诲瀷鍒ゆ柇"); - r = this.numberCompare(n); - break; - case "String": - console.log("杩欐槸string绫诲瀷鍒ゆ柇"); - break; - case "Date": - console.log("杩欐槸data绫诲瀷鍒ゆ柇"); - - break; - case "User": - console.log("杩欐槸user绫诲瀷鍒ゆ柇"); - - break; - case "Array": - console.log("杩欐槸array绫诲瀷鍒ゆ柇"); - - break; - } - if (r && "OR" === e.groupType) break; - r && "AND" === e.groupType && s++; - } - return "AND" === e.groupType && (r = s === e.conditions.length), r; - }, - numberCompare: function (e) { - var t = this.formData[e.id]; - switch (e.compare) { - case ">": - return t > parseFloat(e.value[0]); - case "<": - return t < parseFloat(e.value[0]); - case "=": - return t === parseFloat(e.value[0]); - case ">=": - return t >= parseFloat(e.value[0]); - case "<=": - return t <= parseFloat(e.value[0]); - case "B": - return t > parseFloat(e.value[0]) && t < parseFloat(e.value[1]); - case "AB": - return t >= parseFloat(e.value[0]) && t < parseFloat(e.value[1]); - case "BA": - return t > parseFloat(e.value[0]) && t <= parseFloat(e.value[1]); - case "ABA": - return t >= parseFloat(e.value[0]) && t <= parseFloat(e.value[1]); - case "IN": - return e.value.indexOf(String(t)) > -1; - default: - return !1; - } - }, - }, -}; -</script> - -<style lang="less" scoped> -.process-form { - /deep/ .el-form-item__label { - padding: 0 0; - } -} - -.task { - height: 60px; -} - -.el-timeline-item .el-timeline-item__content .process-node-render > div { - position: absolute; - display: inline-block; -} - -.el-timeline-item - .el-timeline-item__content - .process-node-render - > div:last-child { - right: 0; - top: -10px; -} - -.avatar { - display: flex; - flex-direction: row; - position: relative; - align-items: center; -} - -.show-y { - justify-content: center; - flex-direction: column !important; -} - -.show-y, -.w-h-center { - display: flex; - align-items: center; -} - -.avatar .a-img { - display: flex; - border-radius: 50%; - flex-direction: column; - justify-content: center; - background: #fff; - position: relative; -} - -.close { - position: absolute; - top: 0; - right: 0; - color: #fff; - cursor: pointer; - border-radius: 50%; - background: #000; -} - -.status { - position: absolute; - bottom: -4px; - right: -8px; - border-radius: 50%; - font-size: 15px; - background: #fff; - border: 2px solid #fff; -} - -.avatar .name { - text-align: center; - color: #19191a; - font-size: 14px; - margin-left: 10px; -} - -.show-y .name { - margin-left: 0 !important; -} - -.line { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.add-user { - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; -} - -.add-user i { - padding: 10px; - font-size: 1.1rem; - border-radius: 50%; - border: 1px dashed #8c8c8c; - cursor: pointer; -} - -.el-timeline-item .el-timeline-item__icon { - color: #babcc1; - font-size: 16px; -} - -.border .el-dialog__header { - border-bottom: 1px solid #e8e8e8; -} -</style> diff --git a/src/views/workspace/form.js b/src/views/workspace/form.js deleted file mode 100644 index 5a35d93..0000000 --- a/src/views/workspace/form.js +++ /dev/null @@ -1,33 +0,0 @@ -import * as moment from "moment"; - -/** - * @description 灏嗚〃鍗曢」鏍戠粨鏋勮浆鎹负鎵佸钩缁撴瀯 - * @param formItemTree {Array} - * @return Array - */ -export function flatFormItem(formItemTree) { - return formItemTree.reduce((result, item) => { - if (item.name === "SpanLayout") { - return result.concat(flatFormItem(item.props.items)); - } else { - return result.concat(item); - } - }, []); -} - -export function formatTime(row, column) { - if (row[column.property] === null) { - return ""; - } - return moment(row[column.property]).format("YYYY-MM-DD HH:mm:ss"); -} - -export function formatBusinessStatus(row, column) { - const map = { - "1": "姝e湪澶勭悊", - "2": "宸叉挙閿�", - "3": "椹冲洖", - "4": "鍔炵粨", - }; - return map[row[column.property]]; -} diff --git a/src/views/workspace/index.vue b/src/views/workspace/index.vue deleted file mode 100644 index 9739402..0000000 --- a/src/views/workspace/index.vue +++ /dev/null @@ -1,52 +0,0 @@ -<template> - <div class="workspace"> - <div class="workspace__header"> - <el-button icon="el-icon-back" class="back" type="info" size="mini" plain @click="$router.push('/')">杩斿洖涓婚〉</el-button> - </div> - </div> -</template> - -<script> - -export default { - name: 'workSpace', - data() { - return { - routes: [ - - ] - } - }, - methods: { - handleClick(tab) { - this.$router.push({ - path: tab.name - }) - } - } -} -</script> - -<style lang="less" scoped> -.workspace { - padding: 20px; - height: 100%; - display: flex; - flex-direction: column; - box-sizing: border-box; - - &__header { - margin-bottom: 10px; - } - - &__tabs { - flex: 1; - .route-tab { - /deep/ .el-tabs__content { - height: calc(100vh - 150px); - overflow-y: auto; - } - } - } -} -</style> diff --git a/src/views/workspace/process/ProcessInstanceTabs.vue b/src/views/workspace/process/ProcessInstanceTabs.vue index 6730c62..8502375 100644 --- a/src/views/workspace/process/ProcessInstanceTabs.vue +++ b/src/views/workspace/process/ProcessInstanceTabs.vue @@ -1,8 +1,6 @@ <template> <div class="process-view"> - <div class="process-view__tabs" v-loading="loading"> - <process-diagram-viewer /> </div> @@ -25,7 +23,6 @@ processInfo: "", }; }, - methods: { convertToTreeData(data, parent,index,parentId) { const tempJson = data.find(f => -- Gitblit v1.8.0