site-settings.tsx 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. import { defineComponent, onMounted, reactive } from 'vue';
  2. import styles from './site-settings.module.less';
  3. import MSticky from '@/components/m-sticky';
  4. import MHeader from '@/components/m-header';
  5. import {
  6. Button,
  7. Cell,
  8. CellGroup,
  9. Field,
  10. Icon,
  11. Image,
  12. List,
  13. Picker,
  14. Popup,
  15. showToast
  16. } from 'vant';
  17. import iconMusic from '@/common/images/icon-music.png';
  18. import iconTeacher from '@/common/images/icon-teacher-default.png';
  19. import iconEdit from '@/common/images/icon-edit.png';
  20. import SkeletonSettingsModal from './skeleton-settings-modal';
  21. import MFullRefresh from '@/components/m-full-refresh';
  22. import request from '@/helpers/request';
  23. import MEmpty from '@/components/m-empty';
  24. export default defineComponent({
  25. name: 'site-setting',
  26. setup() {
  27. const forms = reactive({
  28. showPopup: false,
  29. showOrchestraPopup: false,
  30. siteName: '',
  31. orchestraName: '全部乐团',
  32. orchestraColumns: [{ text: '全部乐团', value: '' }], //
  33. listState: {
  34. dataShow: true, // 判断是否有数据
  35. loading: true,
  36. finished: false,
  37. refreshing: false
  38. },
  39. params: {
  40. musicGroupId: null,
  41. page: 1,
  42. rows: 20
  43. },
  44. isClick: false,
  45. list: [],
  46. selectSite: {} as any //
  47. });
  48. const onEdit = (item: any) => {
  49. forms.selectSite = item;
  50. forms.siteName = item.teachingPoint;
  51. forms.showPopup = true;
  52. };
  53. const onSubmitUpdateSite = async () => {
  54. try {
  55. if (!forms.siteName) {
  56. showToast('请输入场地名称');
  57. return;
  58. }
  59. await request.post('/api-web/classGroup/teachingPoint', {
  60. hideLoading: false,
  61. data: {
  62. classGroupId: forms.selectSite.classGroupId,
  63. teachingPoint: forms.siteName
  64. }
  65. });
  66. forms.showPopup = false;
  67. forms.list = [];
  68. onRefresh();
  69. } catch {
  70. //
  71. }
  72. };
  73. const getList = async () => {
  74. try {
  75. if (forms.isClick) return;
  76. forms.isClick = true;
  77. const { data } = await request.post(
  78. '/api-web/classGroup/teachingPointClass',
  79. {
  80. data: forms.params
  81. }
  82. );
  83. const result = data || {};
  84. // 判断是否有数据
  85. if (forms.listState.refreshing) {
  86. forms.list = result.rows || [];
  87. } else {
  88. forms.list = forms.list.concat(result.rows || []);
  89. }
  90. forms.listState.finished = result.pageNo >= result.totalPage;
  91. forms.params.page = result.pageNo + 1;
  92. } catch {
  93. forms.listState.finished = true;
  94. } finally {
  95. forms.listState.dataShow = forms.list.length > 0;
  96. forms.listState.refreshing = false;
  97. forms.listState.loading = false;
  98. forms.isClick = false;
  99. }
  100. };
  101. const onRefresh = () => {
  102. forms.params.page = 1;
  103. getList();
  104. };
  105. // 乐团列表
  106. const musicGroupPage = async () => {
  107. try {
  108. const { data } = await request.get(
  109. '/api-web/cooperationOrgan/musicGroupPage'
  110. );
  111. (data || []).forEach((item: any) => {
  112. forms.orchestraColumns.push({
  113. text: item.name,
  114. value: item.id
  115. });
  116. });
  117. } catch {
  118. //
  119. }
  120. };
  121. onMounted(() => {
  122. musicGroupPage();
  123. getList();
  124. });
  125. return () => (
  126. <div class={styles.siteSetting}>
  127. <MSticky position="top">
  128. <MHeader />
  129. <div class={styles.searchGroup}>
  130. <div
  131. class={styles.searchItem}
  132. onClick={() => (forms.showOrchestraPopup = true)}>
  133. <span>{forms.orchestraName}</span>
  134. </div>
  135. </div>
  136. </MSticky>
  137. <SkeletonSettingsModal v-model:show={forms.listState.loading}>
  138. <MFullRefresh
  139. v-model:modelValue={forms.listState.refreshing}
  140. onRefresh={() => onRefresh()}
  141. style={{
  142. minHeight: `calc(100vh - var(--header-height))`
  143. }}>
  144. <List
  145. finished={forms.listState.finished}
  146. finishedText=" "
  147. style={{ overflow: 'hidden' }}
  148. onLoad={getList}
  149. immediateCheck={false}>
  150. {forms.listState.dataShow ? (
  151. forms.list.map((item: any) => (
  152. <CellGroup class={styles.cellGroup} border={false}>
  153. <Cell border={false} center>
  154. {{
  155. title: () => (
  156. <div class={styles.orchestraName}>
  157. <img src={iconMusic} class={styles.iconMusic} />
  158. <p class={styles.overhide}>{item.musicGroupName}</p>
  159. </div>
  160. ),
  161. default: () => (
  162. <div
  163. class={styles.address}
  164. onClick={() => onEdit(item)}>
  165. <p
  166. class={[
  167. styles.overhide,
  168. item.teachingPoint ? '' : styles.red
  169. ]}>
  170. {item.teachingPoint || '未设置场地'}
  171. </p>
  172. <Icon name={iconEdit} class={styles.iconEdit} />
  173. </div>
  174. )
  175. }}
  176. </Cell>
  177. <Cell center class={styles.username}>
  178. {{
  179. icon: () => (
  180. <Image
  181. src={item.teacherAvatar || iconTeacher}
  182. class={styles.iconTeacher}
  183. fit="contain"
  184. />
  185. ),
  186. title: () => (
  187. <div>
  188. <div class={styles.classname}>
  189. {item.classGroupName}
  190. </div>
  191. <div class={styles.name}>{item.teacherName}</div>
  192. </div>
  193. )
  194. }}
  195. </Cell>
  196. </CellGroup>
  197. ))
  198. ) : (
  199. <MEmpty
  200. style={{
  201. minHeight: `calc(100vh - var(--header-height))`
  202. }}
  203. description="暂无数据"
  204. />
  205. )}
  206. </List>
  207. </MFullRefresh>
  208. </SkeletonSettingsModal>
  209. <Popup
  210. v-model:show={forms.showPopup}
  211. round
  212. onClose={() => {
  213. forms.siteName = '';
  214. forms.selectSite = {};
  215. }}>
  216. <div class={styles.popupContainer}>
  217. <h2>设置场地</h2>
  218. <Field
  219. placeholder="请输入场地名称"
  220. v-model={forms.siteName}
  221. border={false}
  222. class={styles.field}
  223. maxlength={15}
  224. />
  225. <div class={['btnGroupPopup']}>
  226. <Button
  227. round
  228. onClick={() => {
  229. forms.showPopup = false;
  230. }}>
  231. 取消
  232. </Button>
  233. <Button type="primary" round onClick={onSubmitUpdateSite}>
  234. 确定
  235. </Button>
  236. </div>
  237. </div>
  238. </Popup>
  239. <Popup v-model:show={forms.showOrchestraPopup} round position="bottom">
  240. <Picker
  241. columns={forms.orchestraColumns}
  242. onCancel={() => (forms.showOrchestraPopup = false)}
  243. onConfirm={({ selectedOptions }: any) => {
  244. forms.showOrchestraPopup = false;
  245. const option = selectedOptions[0];
  246. forms.orchestraName = option.text;
  247. forms.params.musicGroupId = option.value;
  248. forms.list = [];
  249. forms.listState.dataShow = true;
  250. onRefresh();
  251. }}
  252. />
  253. </Popup>
  254. </div>
  255. );
  256. }
  257. });