submits.vue 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. <template>
  2. <FlexCol :padding="30">
  3. <SearchBar
  4. v-model="searchText"
  5. placeholder="搜一搜"
  6. @search="search"
  7. />
  8. <Height :height="20" />
  9. <DropdownMenu>
  10. <DropdownMenuItem
  11. v-model="filterStatus"
  12. :options="[
  13. { text: '全部状态', value: -100 },
  14. { text: '未通过', value: CommonInfoModel.STATUS_REJECT },
  15. { text: '待审核', value: CommonInfoModel.STATUS_AUDIT },
  16. { text: '审核通过', value: CommonInfoModel.STATUS_PASS },
  17. { text: '专家评估', value: CommonInfoModel.STATUS_EXPERT },
  18. { text: '终审', value: CommonInfoModel.STATUS_FINAL },
  19. ]"
  20. type="single-check"
  21. />
  22. <DropdownMenuItem
  23. v-model="filterVillage"
  24. :options="villageListLoader.content.value || [{
  25. text: '未选择村社',
  26. value: -100,
  27. }]"
  28. type="single-check"
  29. />
  30. </DropdownMenu>
  31. <Height :height="20" />
  32. <SimplePageListLoader :loader="listLoader" :noEmpty="true">
  33. <template #empty>
  34. <Empty image="search" description="这里还没提交过投稿,欢迎成为志愿者投稿!">
  35. </Empty>
  36. </template>
  37. <FlexCol :gap="20">
  38. <Touchable
  39. v-for="item in listLoader.list.value"
  40. :key="item.id"
  41. :padding="[15,20]"
  42. radius="radius.md"
  43. justify="space-between"
  44. align="center"
  45. backgroundColor="white"
  46. direction="row"
  47. touchable
  48. @click="goDetail(item)"
  49. >
  50. <FlexRow align="center" :gap="20">
  51. <Image
  52. :src="item.image"
  53. :showFailed="false"
  54. :width="150"
  55. :height="150"
  56. radius="radius.sm"
  57. mode="aspectFill"
  58. />
  59. <FlexCol>
  60. <H4 :size="36">{{ item.title }}</H4>
  61. <Height :height="10" />
  62. <Text :size="23" :text="`栏目: ${item.catalogName || item.collectModuleName || ''}`" />
  63. <Text :size="23" :text="`时间: ${DataDateUtils.formatDate(item.updatedAt, 'YYYY-MM-dd')}`" />
  64. <FlexRow align="center">
  65. <Text :size="23" :text="`状态:`" />
  66. <Tag
  67. size="small"
  68. :text="(item.statusText as string)"
  69. :type="selectObjectByType(item.status as string, CommonInfoModel.STATUS_REJECT.toString(), {
  70. [CommonInfoModel.STATUS_REJECT]: 'danger',
  71. [CommonInfoModel.STATUS_DRAFT]: 'default',
  72. [CommonInfoModel.STATUS_AUDIT]: 'warning',
  73. [CommonInfoModel.STATUS_PASS]: 'primary',
  74. [CommonInfoModel.STATUS_EXPERT]: 'primary',
  75. [CommonInfoModel.STATUS_FINAL]: 'success',
  76. })"
  77. />
  78. </FlexRow>
  79. <Text v-if="item.opinion" :size="23" :text="`审核意见: ${item.opinion}`" />
  80. </FlexCol>
  81. </FlexRow>
  82. <Icon icon="arrow-right-bold" color="primary" :size="36" />
  83. </Touchable>
  84. </FlexCol>
  85. </SimplePageListLoader>
  86. <XBarSpace />
  87. </FlexCol>
  88. </template>
  89. <script setup lang="ts">
  90. import { ref, watch } from 'vue';
  91. import { onPullDownRefresh } from '@dcloudio/uni-app';
  92. import { DataDateUtils } from '@imengyu/js-request-transform';
  93. import { useSimplePageListLoader } from '@/components/composeabe/loader/SimplePageListLoader';
  94. import { useSimpleDataLoader } from '@/components/composeabe/loader/SimpleDataLoader';
  95. import { useLoadQuerys } from '@/components/composeabe/LoadQuerys';
  96. import { selectObjectByType } from '@/components/theme/ThemeTools';
  97. import { navTo } from '@/components/utils/PageAction';
  98. import SimplePageListLoader from '@/components/loader/SimplePageListLoader.vue';
  99. import VillageInfoApi, { CommonInfoModel } from '@/api/inhert/VillageInfoApi';
  100. import Image from '@/components/basic/Image.vue';
  101. import Empty from '@/components/feedback/Empty.vue';
  102. import SearchBar from '@/components/form/SearchBar.vue';
  103. import FlexCol from '@/components/layout/FlexCol.vue';
  104. import Text from '@/components/basic/Text.vue';
  105. import Height from '@/components/layout/space/Height.vue';
  106. import H4 from '@/components/typography/H4.vue';
  107. import Touchable from '@/components/feedback/Touchable.vue';
  108. import XBarSpace from '@/components/layout/space/XBarSpace.vue';
  109. import FlexRow from '@/components/layout/FlexRow.vue';
  110. import Tag from '@/components/display/Tag.vue';
  111. import Icon from '@/components/basic/Icon.vue';
  112. import DropdownMenu from '@/components/feedback/DropdownMenu.vue';
  113. import DropdownMenuItem from '@/components/feedback/DropdownMenuItem.vue';
  114. import VillageApi, { type VillageListItem } from '@/api/inhert/VillageApi';
  115. import { waitTimeOut } from '@imengyu/imengyu-utils';
  116. const searchText = ref('');
  117. const filterStatus = ref(-100);
  118. const filterVillage = ref(0);
  119. const villageListLoader = useSimpleDataLoader(async () => {
  120. let res = [] as VillageListItem[];
  121. try {
  122. res = await VillageApi.getClaimedVallageList()
  123. } catch (e) {
  124. console.log(e);
  125. }
  126. const list = res.map(item => ({
  127. text: item.villageName,
  128. value: item.villageId!,
  129. }));
  130. if (list.length == 0) {
  131. list.push({
  132. text: '未选择村社',
  133. value: -100,
  134. });
  135. }
  136. if (filterVillage.value == 0)
  137. filterVillage.value = list[0].value;
  138. return list;
  139. }, false);
  140. const listLoader = useSimplePageListLoader<CommonInfoModel>(8, async (page, pageSize) => {
  141. await waitTimeOut(300);
  142. const res = await VillageInfoApi.getList({
  143. villageId: filterVillage.value,
  144. villageVolunteerId: querys.value.villageVolunteerId,
  145. page,
  146. pageSize,
  147. status: filterStatus.value === -100 ? undefined : filterStatus.value,
  148. keywords: searchText.value,
  149. })
  150. return {
  151. list: res.list,
  152. total: res.total,
  153. };
  154. }, false);
  155. function goDetail(item: CommonInfoModel) {
  156. navTo('common', {
  157. id: item.id,
  158. villageId: item.villageId,
  159. villageVolunteerId: item.villageVolunteerId,
  160. catalogId: item.catalogId,
  161. collectModuleId: item.collectModuleId,
  162. subKey: '',
  163. subId: -1,
  164. subTitle: item.catalogName || item.collectModuleName || '',
  165. });
  166. }
  167. function search() {
  168. listLoader.reload();
  169. }
  170. const { querys } = useLoadQuerys({
  171. villageId: 0,
  172. villageVolunteerId: 0,
  173. }, async (querys) => {
  174. filterVillage.value = querys.villageId || 0;
  175. await villageListLoader.load()
  176. await listLoader.load(false, querys)
  177. });
  178. watch(filterStatus, () => listLoader.reload())
  179. watch(filterVillage, () => listLoader.reload())
  180. onPullDownRefresh(() => {
  181. listLoader.reload();
  182. });
  183. defineExpose({
  184. onPageBack(name: string, param: any) {
  185. if (param && param.needRefresh)
  186. listLoader.reload();
  187. }
  188. })
  189. </script>