answer.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. <template>
  2. <el-dialog
  3. title="新增活动内容"
  4. width="800px"
  5. :close-on-click-modal="false"
  6. :modal="true"
  7. :visible.sync="showBool"
  8. :before-close="formCancel"
  9. >
  10. <zj-form-container ref="formRef" :form-data="formData" :styleSwitch="false">
  11. <zj-form-module title="" label-width="100px" :showHade="false" :form-data="formData" :form-items="formItems">
  12. </zj-form-module>
  13. </zj-form-container>
  14. <div slot="footer" class="dialog-footer">
  15. <el-button size="mini" @click="formCancel">取 消</el-button>
  16. <el-button size="mini" @click="formConfirm">确 定</el-button>
  17. </div>
  18. </el-dialog>
  19. </template>
  20. <script>
  21. import ImageUpload from '@/components/file-upload'
  22. export default {
  23. props: {
  24. defaultData: {
  25. type: Object,
  26. default: () => ({})
  27. }
  28. },
  29. components: {
  30. ImageUpload
  31. },
  32. data() {
  33. return {
  34. showBool: true,
  35. formData: Object.assign(
  36. {
  37. question: '',
  38. type: 1,
  39. isRequire: true,
  40. answerType: '',
  41. answer: []
  42. },
  43. this.defaultData
  44. )
  45. }
  46. },
  47. computed: {
  48. formItems() {
  49. return [
  50. {
  51. md: 24,
  52. name: 'slot-component',
  53. formItemAttributes: {
  54. label: '',
  55. prop: ''
  56. },
  57. render: (h, { props, onInput }) => {
  58. return <div />
  59. }
  60. },
  61. {
  62. md: 24,
  63. isShow: true,
  64. name: 'el-input',
  65. attributes: { placeholder: '请输入' },
  66. formItemAttributes: {
  67. label: '名称',
  68. prop: 'question',
  69. rules: [{ required: true, message: '请输入', trigger: 'blur' }]
  70. }
  71. },
  72. {
  73. md: 24,
  74. isShow: true,
  75. name: 'el-radio',
  76. options: [
  77. { label: '单选题', value: 1 },
  78. { label: '多选题', value: 2 },
  79. { label: '填写', value: 3 },
  80. { label: '图片', value: 4 },
  81. { label: '视频', value: 5 }
  82. ],
  83. attributes: { filterable: true, placeholder: '请选择', disabled: false },
  84. formItemAttributes: {
  85. label: '类型',
  86. prop: 'type',
  87. rules: [{ required: true, message: '请选择', trigger: 'blur' }]
  88. },
  89. events: {
  90. change: newVal => {
  91. if (!!~[1, 2].indexOf(newVal)) {
  92. this.formData.answer = []
  93. } else {
  94. setTimeout(() => {
  95. this.formData.answer = [
  96. {
  97. option_name: '',
  98. option_value: '',
  99. option_files: [],
  100. option_limit: ''
  101. }
  102. ]
  103. }, 250)
  104. }
  105. }
  106. }
  107. },
  108. {
  109. md: 24,
  110. isShow: true,
  111. name: 'el-radio',
  112. options: [
  113. { label: '是', value: true },
  114. { label: '否', value: false }
  115. ],
  116. attributes: { filterable: true, placeholder: '请选择', disabled: false },
  117. formItemAttributes: {
  118. label: '是否必填',
  119. prop: 'isRequire',
  120. rules: [{ required: true, message: '请选择', trigger: 'blur' }]
  121. }
  122. },
  123. ...(() => {
  124. if (!!~[1, 2].indexOf(this.formData.type)) {
  125. return [
  126. {
  127. md: 24,
  128. isShow: true,
  129. name: 'el-radio',
  130. options: [
  131. { label: '图文结合', value: 1 },
  132. { label: '纯文字', value: 2 },
  133. { label: '纯图片', value: 3 }
  134. ],
  135. attributes: { filterable: true, placeholder: '请选择', disabled: false },
  136. formItemAttributes: {
  137. label: '选项类型',
  138. prop: 'answerType',
  139. rules: [{ required: true, message: '请选择', trigger: 'blur' }]
  140. }
  141. },
  142. {
  143. md: 24,
  144. name: 'slot-component',
  145. attributes: { placeholder: '请输入' },
  146. formItemAttributes: {
  147. label: '试题选项',
  148. prop: 'answer',
  149. rules: [{ required: true, message: '请添加选项', trigger: 'blur' }]
  150. },
  151. render: (h, { props, onInput }) => {
  152. var { value } = props
  153. return (
  154. <div>
  155. <div>
  156. <el-button
  157. size="mini"
  158. onClick={() => {
  159. this.formData.answer.push({
  160. option_name: '',
  161. option_value: '',
  162. option_files: [],
  163. option_limit: ''
  164. })
  165. }}
  166. type="primary"
  167. >
  168. 添加
  169. </el-button>
  170. </div>
  171. {this.formData.answer.map((item, index) => {
  172. item.option_name = `选项${index + 1}`
  173. return (
  174. <div>
  175. <div style="display: flex;justify-content: space-between;">
  176. <span style="font-weight: bold;">{this.formData.answer[index].option_name}</span>
  177. <span
  178. style="color: red;"
  179. onClick={() => {
  180. this.formData.answer.splice(index, 1)
  181. }}
  182. >
  183. 删除
  184. </span>
  185. </div>
  186. <div class="redbordererr">
  187. {~[1, 2].indexOf(this.formData.answerType) ? (
  188. <el-form-item
  189. label=""
  190. lebel-width="0px"
  191. prop={`answer.${index}.option_value`}
  192. rules={[{ required: true, message: '请填写', trigger: 'blur' }]}
  193. >
  194. <el-input
  195. type="textarea"
  196. rows={2}
  197. placeholder="请输入内容"
  198. value={this.formData.answer[index].option_value}
  199. onInput={val => {
  200. this.formData.answer[index].option_value = val
  201. }}
  202. ></el-input>
  203. </el-form-item>
  204. ) : null}
  205. {~[1].indexOf(this.formData.answerType) ? <div style="margin-top:5px"></div> : null}
  206. {~[1, 3].indexOf(this.formData.answerType) ? (
  207. <el-form-item
  208. label=""
  209. lebel-width="0px"
  210. prop={`answer.${index}.option_files`}
  211. rules={[{ required: true, message: '请填写', trigger: 'blur' }]}
  212. >
  213. <ImageUpload
  214. fileList={this.formData.answer[index].option_files}
  215. uid={`questionFiles_ImageUpload_${index}`}
  216. limit={1}
  217. isUpdate={false}
  218. />
  219. </el-form-item>
  220. ) : null}
  221. </div>
  222. <br />
  223. </div>
  224. )
  225. })}
  226. </div>
  227. )
  228. }
  229. }
  230. ]
  231. } else if (!!~[3, 4, 5].indexOf(this.formData.type)) {
  232. return [
  233. {
  234. md: 24,
  235. name: 'slot-component',
  236. attributes: { placeholder: '请输入' },
  237. formItemAttributes: {
  238. label: '限制数量',
  239. prop: 'answer',
  240. rules: []
  241. },
  242. render: (h, { props, onInput }) => {
  243. var { value } = props
  244. return (
  245. <div>
  246. {this.formData.answer.map((item, index) => {
  247. return (
  248. <div>
  249. <div>
  250. <el-input
  251. type="number"
  252. placeholder="请输入限制长度"
  253. value={this.formData.answer[index].option_limit}
  254. onInput={val => {
  255. this.formData.answer[index].option_limit = val
  256. }}
  257. ></el-input>
  258. </div>
  259. </div>
  260. )
  261. })}
  262. </div>
  263. )
  264. }
  265. }
  266. ]
  267. }
  268. return []
  269. })()
  270. ]
  271. }
  272. },
  273. methods: {
  274. formCancel() {
  275. this.$emit('close', this.formData)
  276. },
  277. formConfirm() {
  278. this.$refs.formRef.validate((valid, invalidFields, errLabels) => {
  279. if (valid) {
  280. this.$emit('confirm', this.formData)
  281. }
  282. })
  283. }
  284. }
  285. }
  286. </script>
  287. <style lang="scss" scoped>
  288. ::v-deep .el-dialog__body {
  289. padding: 30px 20px 0 20px !important;
  290. }
  291. ::v-deep .dialog-footer {
  292. padding: 0 !important;
  293. }
  294. ::v-deep .is-error {
  295. .add {
  296. border-color: red !important;
  297. }
  298. }
  299. </style>