index.vue 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. <template>
  2. <div class="ele-body">
  3. <el-card shadow="never">
  4. <el-button icon="el-icon-plus" plain @click="handleAddOrEdit('','add')">添加模板</el-button>
  5. <div class="content-box">
  6. <el-empty style="width: 100%;" :image-size="200" v-if="!Object.keys(templateList).length"
  7. description="暂无模板,快去新建吧"></el-empty>
  8. <div v-for="category in Object.keys(templateList)" :key="category" class="category_box">
  9. <div class="category_box_title">{{ getDictV('collaborative_type', category) }}</div>
  10. <div v-for="v in templateList[category]" :key="v.id" class="category_content"
  11. @mouseenter.self="()=>showEdit=v.id" @mouseleave.s.self="()=>showEdit=''">
  12. <div style="display: flex;align-items: center">
  13. <svg-icon
  14. style="margin-right: 5px"
  15. :icon-class="v.icon"
  16. className="svg-icon-set"
  17. ></svg-icon>
  18. <span>
  19. {{ v.name }}
  20. </span>
  21. </div>
  22. <span>
  23. <span v-if="v?.dataScope?.length" style="max-width: 200px;display: inline-block">
  24. {{ getDataScopeName(v.dataScope) }}
  25. </span>
  26. <span v-else style="max-width: 200px;display: inline-block">
  27. {{ '全公司可见' }}
  28. </span>
  29. <span v-if="showEdit==v.id">
  30. <el-button size="mini" type="text" @click="handleEditDataScope(v)">修改</el-button>
  31. </span>
  32. </span>
  33. <span>
  34. <el-button size="mini" style="color: #0C4C7F" v-if="!v.status" type="text" @click="handleAddOrEdit(v,'edit')">编辑</el-button>
  35. <el-button size="mini" type="text" @click="handleAddOrEdit(v,'copy')">复制</el-button>
  36. <el-button size="mini" type="text" v-if="!v.status" style="color: red" @click="handleDel(v)">删除</el-button>
  37. <el-button size="mini" type="text" v-if="v.status" style="color: red" @click="handleStatus(v,0)">停用</el-button>
  38. <el-button size="mini" type="text" v-if="!v.status" style="color: #58e805" @click="handleStatus(v,1)">启用</el-button>
  39. </span>
  40. </div>
  41. </div>
  42. </div>
  43. <addOrEditDialog :addOrEditDialogFlag.sync="addOrEditDialogFlag" ref="dialogRef" v-if="addOrEditDialogFlag"
  44. @reload="getTemplateList"></addOrEditDialog>
  45. <visibility-range-dialog :visibilityRangeDialogFlag.sync="visibilityRangeDialogFlag"
  46. v-if="visibilityRangeDialogFlag"
  47. @reload="getTemplateList"
  48. ref="visibilityRangeDialogRef"></visibility-range-dialog>
  49. </el-card>
  50. </div>
  51. </template>
  52. <script>
  53. import addOrEditDialog from "./addOrEditDialog.vue";
  54. import {bpmCustomFormDelete, bpmCustomFormUpdate, getBpmCustomFormPage} from "@/api/bpm/task";
  55. import formGenerator from "@/components/FormGenerator/index.vue";
  56. import visibilityRangeDialog from "@/views/bpm/formConfig/visibilityRangeDialog.vue";
  57. import {getByCode} from "@/api/system/dictionary-data";
  58. export default {
  59. components: {
  60. formGenerator,
  61. addOrEditDialog,
  62. visibilityRangeDialog
  63. },
  64. name: "index",
  65. data() {
  66. return {
  67. addOrEditDialogFlag: false,
  68. visibilityRangeDialogFlag: false,
  69. showEdit: false,
  70. templateList: {},
  71. list: {},
  72. dictList: {}
  73. }
  74. },
  75. created() {
  76. this.getDictList('collaborative_type')
  77. this.getTemplateList()
  78. },
  79. computed: {
  80. getDataScopeName() {
  81. return (dataScope) => {
  82. return dataScope.map(item => item.name).join(',')
  83. }
  84. }
  85. },
  86. methods: {
  87. getDictV(code, val) {
  88. if (!this.dictList[code]) return '';
  89. return this.dictList[code].find(item => item.value == val)?.label
  90. },
  91. async getDictList(code) {
  92. let {data: res} = await getByCode(code)
  93. this.dictList[code] = res.map(item => {
  94. let values = Object.keys(item)
  95. return {
  96. value: values[0],
  97. label: item[values[0]]
  98. }
  99. })
  100. },
  101. handleAddOrEdit(row = {}, type) {
  102. this.addOrEditDialogFlag = true
  103. this.$nextTick(() => {
  104. this.$refs.dialogRef.init(row, type)
  105. })
  106. },
  107. async getTemplateList() {
  108. let params = {
  109. pageNum: 1,
  110. size: 9999,
  111. }
  112. const {list} = await getBpmCustomFormPage(params)
  113. this.list = list
  114. this.templateList = _.groupBy(list, 'dictType');
  115. },
  116. handleCommand(command, v) {
  117. switch (command) {
  118. case 'start':
  119. this.handleStart(v, 1);
  120. break
  121. case 'stop':
  122. this.handleStatus(v, 0)
  123. break
  124. case 'del':
  125. this.handleDel(v);
  126. break
  127. case 'copy':
  128. this.handleAddOrEdit(v, command);
  129. break
  130. }
  131. },
  132. async handleDel(v) {
  133. this.$confirm('确定删除该模板?', '提示', {
  134. confirmButtonText: '确定',
  135. cancelButtonText: '取消',
  136. type: 'warning'
  137. })
  138. .then(async () => {
  139. await bpmCustomFormDelete([v.id])
  140. let findIndex = this.templateList[v.dictType].findIndex(i => i.id == v.id)
  141. this.templateList[v.dictType].splice(findIndex, 1)
  142. this.$message.success('操作成功')
  143. }).catch(()=>{
  144. })
  145. },
  146. handleEditDataScope(v) {
  147. this.visibilityRangeDialogFlag = true
  148. this.$nextTick(() => {
  149. this.$refs.visibilityRangeDialogRef.init(v)
  150. })
  151. },
  152. handleStatus(v,status) {
  153. let msg = status?'启用':'停用'
  154. this.$confirm(`是否${msg}此模板?`, '提示', {
  155. type: 'warning'
  156. }).then(async ()=>{
  157. v.status = status
  158. await bpmCustomFormUpdate(v)
  159. this.$message(`${msg}成功`)
  160. }).catch(e=>{
  161. console.log(e);
  162. })
  163. }
  164. }
  165. }
  166. </script>
  167. <style scoped lang="scss">
  168. .ele-body {
  169. padding: 15px 20% !important;
  170. }
  171. .content-box {
  172. display: flex;
  173. flex-direction: row;
  174. flex-wrap: wrap;
  175. justify-content: space-between;
  176. .category_box {
  177. border: 1px solid #e1e1e1;
  178. border-radius: 5px;
  179. width: 100%;
  180. margin-top: 15px;
  181. .category_box_title {
  182. font-size: 14px;
  183. font-weight: bold;
  184. color: #616161;
  185. height: 40px;
  186. display: flex;
  187. padding: 5px 20px;
  188. align-items: center;
  189. background: rgb(247, 247, 248);
  190. }
  191. .category_content {
  192. height: 40px;
  193. display: flex;
  194. align-items: center;
  195. padding: 5px 20px;
  196. justify-content: space-between;
  197. }
  198. .category_content:hover {
  199. background-color: rgba(135, 181, 243, 0.29);
  200. }
  201. }
  202. }
  203. ::v-deep .el-card__body {
  204. padding: 10px 5%;
  205. // height: 85vh;
  206. }
  207. </style>