edit.vue 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. <template>
  2. <el-dialog
  3. :title="title"
  4. :visible.sync="dialogVisible"
  5. :close-on-click-modal="false"
  6. :close-on-press-escape="false"
  7. append-to-body
  8. class="dialog"
  9. @open="getFormData"
  10. @close="closeDialog"
  11. >
  12. <el-form
  13. ref="form"
  14. v-loading="dialogLoading"
  15. :element-loading-text="$t('common.loading')"
  16. :model="form"
  17. :rules="rules"
  18. :label-width="formLabelWidth"
  19. @submit.native.prevent
  20. >
  21. <el-form-item label="动作类型:" prop="action">
  22. <el-select
  23. v-if="!readonly"
  24. v-model="form.action"
  25. :disabled="formId !== ''"
  26. placeholder="请选择"
  27. style="width: 100%"
  28. >
  29. <el-option
  30. v-for="option in actionOptions"
  31. :key="option.value"
  32. :label="option.label"
  33. :value="option.value"
  34. />
  35. </el-select>
  36. <el-tag
  37. v-else
  38. :type="form.action | optionsFilter(actionOptions, 'type')"
  39. >{{ form.action | optionsFilter(actionOptions, 'label') }}</el-tag
  40. >
  41. </el-form-item>
  42. <el-form-item label="是否默认:" prop="isDefault">
  43. <el-switch
  44. v-if="!readonly"
  45. v-model="form.isDefault"
  46. active-value="Y"
  47. inactive-value="N"
  48. />
  49. <el-tag
  50. v-else
  51. :type="form.isDefault | optionsFilter(isDefaultOptions, 'type')"
  52. >{{
  53. form.isDefault | optionsFilter(isDefaultOptions, 'label')
  54. }}</el-tag
  55. >
  56. </el-form-item>
  57. <el-form-item label="内容:" prop="value">
  58. <el-input
  59. v-if="!readonly"
  60. v-model="form.value"
  61. :autosize="{ minRows: 2, maxRows: 4 }"
  62. type="textarea"
  63. />
  64. <span v-else>{{ form.value }}</span>
  65. </el-form-item>
  66. <el-form-item v-if="readonly" label="创建人:" class="special-dispose">
  67. <ibps-employee-selector
  68. :value="form.createBy"
  69. style="width: 200px"
  70. :disabled="true"
  71. />
  72. </el-form-item>
  73. <el-form-item v-if="readonly" label="创建时间:">
  74. <span>{{ form.createTime }}</span>
  75. </el-form-item>
  76. <el-form-item v-if="readonly" label="使用次数:">
  77. <span>{{ form.times }}</span>
  78. </el-form-item>
  79. </el-form>
  80. <div slot="footer" class="el-dialog--center">
  81. <ibps-toolbar :actions="toolbars" @action-event="handleActionEvent" />
  82. </div>
  83. </el-dialog>
  84. </template>
  85. <script>
  86. import { save, get } from '@/api/platform/bpmn/bpmCommonStatment'
  87. import IbpsEmployeeSelector from '@/business/platform/org/employee/selector'
  88. import { actionOptions, isDefaultOptions } from './constants'
  89. import ActionUtils from '@/utils/action'
  90. export default {
  91. components: {
  92. IbpsEmployeeSelector,
  93. },
  94. props: {
  95. visible: {
  96. type: Boolean,
  97. default: false,
  98. },
  99. readonly: {
  100. type: Boolean,
  101. default: false,
  102. },
  103. id: String,
  104. title: String,
  105. },
  106. data() {
  107. return {
  108. formName: 'form',
  109. formLabelWidth: '120px',
  110. dialogVisible: this.visible,
  111. dialogLoading: false,
  112. actionOptions: actionOptions,
  113. isDefaultOptions: isDefaultOptions,
  114. defaultForm: {},
  115. createByOptions: [],
  116. form: {
  117. action: 'agree',
  118. isDefault: 'Y',
  119. value: '',
  120. },
  121. rules: {
  122. action: [{ required: false, message: this.$t('validate.required') }],
  123. isDefault: [{ required: false, message: this.$t('validate.required') }],
  124. value: [{ required: true, message: this.$t('validate.required') }],
  125. },
  126. toolbars: [
  127. {
  128. key: 'save',
  129. hidden: () => {
  130. return this.readonly
  131. },
  132. },
  133. { key: 'cancel' },
  134. ],
  135. }
  136. },
  137. computed: {
  138. formId() {
  139. return this.id
  140. },
  141. },
  142. watch: {
  143. visible: {
  144. handler: function (val, oldVal) {
  145. this.dialogVisible = this.visible
  146. },
  147. immediate: true,
  148. },
  149. },
  150. created() {
  151. this.defaultForm = JSON.parse(JSON.stringify(this.form))
  152. },
  153. methods: {
  154. handleActionEvent({ key }) {
  155. switch (key) {
  156. case 'save':
  157. this.handleSave()
  158. break
  159. case 'cancel':
  160. this.closeDialog()
  161. break
  162. default:
  163. break
  164. }
  165. },
  166. // 保存数据
  167. handleSave() {
  168. this.$refs[this.formName].validate((valid) => {
  169. if (valid) {
  170. this.saveData()
  171. } else {
  172. ActionUtils.saveErrorMessage()
  173. }
  174. })
  175. },
  176. // 提交保存数据
  177. saveData() {
  178. save(this.form)
  179. .then((response) => {
  180. this.$emit('callback', this)
  181. ActionUtils.saveSuccessMessage(response.message, (rtn) => {
  182. if (this.$utils.isEmpty(this.formId)) {
  183. this.$refs[this.formName].resetFields()
  184. }
  185. if (rtn) {
  186. this.closeDialog()
  187. }
  188. })
  189. })
  190. .catch((err) => {
  191. console.error(err)
  192. })
  193. },
  194. // 关闭当前窗口
  195. closeDialog() {
  196. this.$emit('close', false)
  197. this.$refs[this.formName].resetFields()
  198. },
  199. /**
  200. * 表单验证
  201. */
  202. formValidate() {
  203. if (this.readonly) return
  204. this.$nextTick(() => {
  205. this.$refs[this.formName].validate(() => {})
  206. })
  207. },
  208. /**
  209. * 获取表单数据
  210. */
  211. getFormData() {
  212. if (this.$utils.isEmpty(this.formId)) {
  213. // 重置表单
  214. this.form = JSON.parse(JSON.stringify(this.defaultForm))
  215. this.formValidate()
  216. return
  217. }
  218. this.dialogLoading = true
  219. get({
  220. id: this.formId,
  221. })
  222. .then((response) => {
  223. this.form = response.data
  224. this.formValidate()
  225. this.dialogLoading = false
  226. })
  227. .catch(() => {
  228. this.dialogLoading = false
  229. })
  230. },
  231. },
  232. }
  233. </script>
  234. <style lang="scss">
  235. .special-dispose {
  236. .el-form-item__content {
  237. .el-selector {
  238. .el-selector__tags {
  239. margin-top: 17px;
  240. .el-tag {
  241. margin: 0;
  242. }
  243. }
  244. .el-input--small {
  245. display: none;
  246. }
  247. }
  248. }
  249. }
  250. </style>