EditFillQuestion.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. <template>
  2. <div class="edit-fill-question">
  3. <el-form
  4. ref="modalFormComp"
  5. :model="modalForm"
  6. :rules="rules"
  7. :key="modalForm.id"
  8. label-width="120px"
  9. >
  10. <el-form-item prop="endNumber" label="起止题号:">
  11. <el-input-number
  12. style="width:40px;"
  13. v-model="modalForm.startNumber"
  14. :min="0"
  15. :max="999"
  16. :step="1"
  17. step-strictly
  18. :controls="false"
  19. ></el-input-number>
  20. <span class="el-input-split"></span>
  21. <el-input-number
  22. style="width:40px;"
  23. v-model="modalForm.endNumber"
  24. :min="modalForm.startNumber"
  25. :max="999"
  26. :step="1"
  27. step-strictly
  28. :controls="false"
  29. ></el-input-number>
  30. </el-form-item>
  31. <el-form-item prop="optionCount" label="选项个数:">
  32. <el-input-number
  33. style="width:125px;"
  34. v-model="modalForm.optionCount"
  35. :min="2"
  36. :max="22"
  37. :step="1"
  38. step-strictly
  39. :controls="false"
  40. :disabled="modalForm.isBoolean"
  41. ></el-input-number>
  42. </el-form-item>
  43. <el-form-item label="小题排列方向:" required>
  44. <el-radio-group v-model="modalForm.questionDirection" size="small">
  45. <el-radio-button
  46. v-for="(val, key) in DIRECTION_TYPE"
  47. :key="key"
  48. :label="key"
  49. >{{ val }}</el-radio-button
  50. >
  51. </el-radio-group>
  52. </el-form-item>
  53. <el-form-item>
  54. <el-checkbox
  55. v-model="modalForm.isMultiply"
  56. :disabled="modalForm.isBoolean"
  57. >多选</el-checkbox
  58. >
  59. </el-form-item>
  60. <el-form-item>
  61. <el-checkbox
  62. v-model="modalForm.isBoolean"
  63. @change="selectTypeChange"
  64. :disabled="modalForm.isMultiply"
  65. >判断题</el-checkbox
  66. >
  67. <el-select
  68. v-if="modalForm.isBoolean"
  69. v-model="modalForm.booleanType"
  70. style="margin-left: 20px;width:125px;"
  71. placeholder="请选择"
  72. @change="booleanTypeChange"
  73. >
  74. <el-option
  75. v-for="item in BOOLEAN_TYPE"
  76. :key="item"
  77. :label="item"
  78. :value="item"
  79. ></el-option>
  80. </el-select>
  81. <span v-if="modalForm.isBoolean">(备选是否配置)</span>
  82. </el-form-item>
  83. <el-form-item
  84. v-if="modalForm.isBoolean"
  85. prop="booleanType"
  86. label="是否配置:"
  87. >
  88. <span>是:</span>
  89. <el-input
  90. v-model.trim="booleanTypes.yes"
  91. :maxlength="1"
  92. placeholder="是"
  93. style="margin-right: 20px;width:60px;"
  94. ></el-input>
  95. <span>否:</span>
  96. <el-input
  97. v-model.trim="booleanTypes.no"
  98. :maxlength="1"
  99. placeholder="否"
  100. style="margin-right: 20px;width:60px;"
  101. ></el-input>
  102. </el-form-item>
  103. </el-form>
  104. </div>
  105. </template>
  106. <script>
  107. import { BOOLEAN_TYPE, DIRECTION_TYPE } from "../../../../enumerate";
  108. const initModalForm = {
  109. id: "",
  110. topicName: "",
  111. startNumber: 1,
  112. endNumber: 5,
  113. questionsCount: 10,
  114. optionCount: 5,
  115. questionDirection: "horizontal",
  116. isBoolean: false,
  117. booleanType: BOOLEAN_TYPE[0],
  118. isMultiply: false
  119. };
  120. export default {
  121. name: "edit-fill-question",
  122. props: {
  123. instance: {
  124. type: Object,
  125. default() {
  126. return {};
  127. }
  128. }
  129. },
  130. data() {
  131. const numberRangeValidater = (rule, value, callback) => {
  132. if (!this.modalForm.startNumber || !this.modalForm.endNumber) {
  133. return callback(new Error("请输入起止题号"));
  134. }
  135. if (this.modalForm.startNumber > this.modalForm.endNumber) {
  136. callback(new Error("开始题号不能大于结束题号"));
  137. } else {
  138. callback();
  139. }
  140. };
  141. const booleanTypeValidater = (rule, value, callback) => {
  142. if (this.modalForm.isBoolean) {
  143. if (
  144. this.booleanTypes.yes &&
  145. this.booleanTypes.no &&
  146. this.booleanTypes.yes.length <= 2 &&
  147. this.booleanTypes.no.length <= 2
  148. ) {
  149. callback();
  150. } else {
  151. callback(new Error("请设置是否配置,单个设置最多两个字符。"));
  152. }
  153. } else {
  154. callback();
  155. }
  156. };
  157. return {
  158. modalForm: { ...initModalForm },
  159. BOOLEAN_TYPE,
  160. DIRECTION_TYPE,
  161. booleanTypes: {
  162. yes: "",
  163. no: ""
  164. },
  165. rules: {
  166. endNumber: [
  167. {
  168. required: true,
  169. message: "请输入起止题号",
  170. trigger: "change"
  171. },
  172. {
  173. type: "number",
  174. validator: numberRangeValidater,
  175. trigger: "change"
  176. }
  177. ],
  178. optionCount: [
  179. {
  180. required: true,
  181. type: "number",
  182. message: "请输入选项个数",
  183. trigger: "change"
  184. }
  185. ],
  186. booleanType: [
  187. {
  188. required: true,
  189. validator: booleanTypeValidater,
  190. trigger: "change"
  191. }
  192. ]
  193. }
  194. };
  195. },
  196. mounted() {
  197. this.initData(this.instance);
  198. },
  199. methods: {
  200. initData(val) {
  201. const valInfo = val.parent || val;
  202. this.modalForm = Object.assign({}, this.initModalForm, valInfo);
  203. this.modalForm.endNumber =
  204. this.modalForm.startNumber + this.modalForm.questionsCount - 1;
  205. this.booleanTypeChange();
  206. },
  207. selectTypeChange(val) {
  208. if (val) {
  209. this.modalForm.optionCount = 2;
  210. this.modalForm.isMultiply = false;
  211. this.modalForm.booleanType = BOOLEAN_TYPE[0];
  212. this.booleanTypeChange();
  213. }
  214. },
  215. booleanTypeChange() {
  216. const [yes, no] = this.modalForm.booleanType.split(",");
  217. this.booleanTypes.yes = yes;
  218. this.booleanTypes.no = no;
  219. },
  220. async submit() {
  221. const valid = await this.$refs.modalFormComp.validate().catch(() => {});
  222. if (!valid) return;
  223. this.modalForm.questionsCount =
  224. this.modalForm.endNumber - this.modalForm.startNumber + 1;
  225. this.modalForm.booleanType = [
  226. this.booleanTypes.yes,
  227. this.booleanTypes.no
  228. ].join();
  229. this.$emit("modified", this.modalForm);
  230. }
  231. }
  232. };
  233. </script>