createClass.tsx 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. import {
  2. NButton,
  3. NSpace,
  4. useMessage,
  5. NForm,
  6. NFormItem,
  7. NCascader
  8. } from 'naive-ui';
  9. import { defineComponent, onMounted, reactive, ref, watch } from 'vue';
  10. import styles from '../index.module.less';
  11. import CSelect from '/src/components/CSelect';
  12. import { addClass, getConfiguredSubjects } from '../api';
  13. import { api_getCurrentGradeYear } from '../../studentList/api';
  14. export default defineComponent({
  15. props: {
  16. activeRow: {
  17. type: Object,
  18. default: () => ({ id: '' })
  19. },
  20. gradeYearList: {
  21. type: Array,
  22. default: () => []
  23. },
  24. gradeNumList: {
  25. type: Array,
  26. default: () => []
  27. },
  28. classArray: {
  29. type: Array,
  30. default: () => []
  31. }
  32. },
  33. name: 'resetStudent',
  34. emits: ['close', 'getList'],
  35. setup(props, { emit }) {
  36. const data = reactive({
  37. uploading: false
  38. });
  39. const message = useMessage();
  40. const foemsRef = ref();
  41. const createClassForm = reactive({
  42. gradeYear: null,
  43. currentGradeNum: null,
  44. currentClass: null,
  45. instrumentId: null
  46. });
  47. const gradeYearList = ref([] as any);
  48. const subjectList = ref([] as any);
  49. const submitForms = () => {
  50. foemsRef.value.validate(async (error: any) => {
  51. if (error) {
  52. return;
  53. }
  54. data.uploading = true;
  55. try {
  56. await addClass({ ...createClassForm });
  57. message.success('新增成功');
  58. emit('close');
  59. emit('getList');
  60. data.uploading = false;
  61. } catch (e) {
  62. console.log(e);
  63. }
  64. data.uploading = false;
  65. });
  66. };
  67. const getYearList = async () => {
  68. try {
  69. const { data } = await api_getCurrentGradeYear({});
  70. const temp = [
  71. {
  72. label: data + 1,
  73. value: data + 1
  74. },
  75. {
  76. label: data,
  77. value: data
  78. }
  79. ];
  80. gradeYearList.value = temp;
  81. } catch {
  82. //
  83. }
  84. };
  85. const getConfigSubject = async () => {
  86. try {
  87. const { data } = await getConfiguredSubjects({
  88. gradeYear: createClassForm.gradeYear,
  89. currentGradeNum: createClassForm.currentGradeNum,
  90. currentClass: createClassForm.currentClass
  91. });
  92. const temp = data || [];
  93. subjectList.value = temp;
  94. } catch {
  95. //
  96. }
  97. };
  98. watch(
  99. () => [
  100. createClassForm.gradeYear,
  101. createClassForm.currentGradeNum,
  102. createClassForm.currentClass
  103. ],
  104. () => {
  105. createClassForm.instrumentId = null;
  106. getConfigSubject();
  107. }
  108. );
  109. onMounted(() => {
  110. getYearList();
  111. });
  112. return () => (
  113. <div class={[styles.addClass]}>
  114. <NForm label-placement="left" model={createClassForm} ref={foemsRef}>
  115. <NFormItem
  116. path="gradeYear"
  117. rule={[
  118. {
  119. required: true,
  120. message: '请选择学年'
  121. }
  122. ]}>
  123. <CSelect
  124. {...({
  125. style: { width: '400px' },
  126. options: gradeYearList.value,
  127. placeholder: '选择学年',
  128. clearable: true
  129. } as any)}
  130. v-model:value={createClassForm.gradeYear}></CSelect>
  131. </NFormItem>
  132. <NFormItem
  133. path="currentGradeNum"
  134. rule={[
  135. {
  136. required: true,
  137. message: '请选择年级'
  138. }
  139. ]}>
  140. <CSelect
  141. {...({
  142. style: { width: '400px' },
  143. options: props.gradeNumList,
  144. placeholder: '选择年级',
  145. clearable: true
  146. } as any)}
  147. v-model:value={createClassForm.currentGradeNum}></CSelect>
  148. </NFormItem>
  149. <NFormItem
  150. path="currentClass"
  151. rule={[
  152. {
  153. required: true,
  154. message: '请选择班级'
  155. }
  156. ]}>
  157. <CSelect
  158. {...({
  159. style: { width: '400px' },
  160. options: props.classArray,
  161. placeholder: '选择班级',
  162. clearable: true
  163. } as any)}
  164. v-model:value={createClassForm.currentClass}></CSelect>
  165. </NFormItem>
  166. <NFormItem
  167. path="instrumentId"
  168. rule={[
  169. {
  170. required: true,
  171. message: '请选择乐器'
  172. }
  173. ]}>
  174. {/* <CSelect
  175. {...({
  176. style: { width: '400px' },
  177. options: subjectList.value,
  178. placeholder: '选择乐器',
  179. clearable: true
  180. } as any)}
  181. v-model:value={createClassForm.instrumentId}></CSelect> */}
  182. <NCascader
  183. placeholder="请选择乐器"
  184. v-model:value={createClassForm.instrumentId}
  185. options={subjectList.value}
  186. checkStrategy="child"
  187. showPath
  188. childrenField="instruments"
  189. expandTrigger="hover"
  190. labelField="name"
  191. valueField="id"
  192. clearable
  193. filterable
  194. style={{ width: '400px' }}
  195. />
  196. </NFormItem>
  197. </NForm>
  198. <NSpace class={styles.btnGroup} justify="center">
  199. <NButton round onClick={() => emit('close')}>
  200. 取消
  201. </NButton>
  202. <NButton
  203. round
  204. loading={data.uploading}
  205. onClick={() => submitForms()}
  206. type="primary">
  207. 保存
  208. </NButton>
  209. </NSpace>
  210. </div>
  211. );
  212. }
  213. });