forms.ts 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. import { CommonInfoModel } from "@/api/inhert/VillageInfoApi";
  2. import type { IDynamicFormOptions, IDynamicFormRef } from "@/components/dynamic";
  3. import type { FieldProps } from "@/components/form/Field.vue";
  4. import type { NewDataModel } from "@imengyu/js-request-transform";
  5. import type { Ref } from "vue";
  6. import { villageCommonContent } from "./data/common";
  7. import { villageInfoBuildingForm, villageInfoDistributionForm } from "./data/building";
  8. import { villageInfoCulture, villageInfoFolkCultureForm } from "./data/cultural";
  9. import { villageInfoFoodProductsForm } from "./data/food";
  10. import { villageInfoOverviewForm } from "./data/overview";
  11. import { villageInfoEnvironmentForm } from "./data/environment";
  12. import { villageInfoRelicForm } from "./data/relic";
  13. import { vilElementForm } from "./data/element";
  14. import { villageInfoFigureFormItems, villageInfoStoryFormItems } from "./data/history";
  15. import { villageInfoRouteForm, villageInfoTravelGuideForm } from "./data/travel";
  16. import { villageInfoSpeakerForm } from "./data/specker";
  17. import { ichFormItems } from "./data/ich";
  18. import type { PickerIdFieldProps } from "@/components/dynamic/wrappers/PickerIdField";
  19. import { villageInfoSpotsFormItems } from "./data/spots";
  20. export type SingleForm = [NewDataModel, (formRef: Ref<IDynamicFormRef>) => IDynamicFormOptions, {
  21. title: string,
  22. typeName: string,
  23. mergeSubs?: boolean,
  24. order?: number,
  25. id?: number,
  26. }]
  27. export type GroupForm = Record<number, SingleForm>
  28. export const CollectableModulesNameMapping : Record<string, string> = {
  29. 'overview': '村落概况',
  30. 'distribution': '建筑分布',
  31. 'building': '传统建筑',
  32. 'folk_culture': '民俗文化',
  33. 'food_product': '美食物产',
  34. 'route': '旅游路线',
  35. 'travel_guide': '旅游导览',
  36. 'element': '环境要素',
  37. 'environment': '环境格局',
  38. 'relic': '文物古迹',
  39. 'cultural': '历史文化',
  40. 'figure': '历史人物',
  41. 'ich': '非遗',
  42. 'story': '掌故轶事',
  43. 'spots': '风景名胜',
  44. 'speaker': '口述者',
  45. 'collect': '随手记',
  46. }
  47. const villageInfoForm : Record<string, GroupForm> = {
  48. 'overview': villageInfoOverviewForm,
  49. 'cultural': villageInfoCulture,
  50. 'story': {
  51. [0]: villageInfoStoryFormItems
  52. },
  53. 'spots': {
  54. [0]: villageInfoSpotsFormItems,
  55. },
  56. 'speaker': {
  57. [1]: villageInfoSpeakerForm,
  58. },
  59. 'figure': {
  60. [0]: villageInfoFigureFormItems,
  61. },
  62. 'element': {
  63. [0]: vilElementForm,
  64. },
  65. 'environment': {
  66. [0]: villageInfoEnvironmentForm
  67. },
  68. 'building': {
  69. [1]: villageInfoBuildingForm('文物建筑'),
  70. [2]: villageInfoBuildingForm('历史建筑'),
  71. [3]: villageInfoBuildingForm('重要传统建筑'),
  72. },
  73. 'distribution': { [0]: villageInfoDistributionForm },
  74. 'relic': { [0]: villageInfoRelicForm },
  75. 'folk_culture': {
  76. [1]: villageInfoFolkCultureForm('节庆活动'),
  77. [2]: villageInfoFolkCultureForm('祭祀崇礼'),
  78. [3]: villageInfoFolkCultureForm('婚丧嫁娶'),
  79. [4]: villageInfoFolkCultureForm('地方方言'),
  80. [5]: villageInfoFolkCultureForm('特色文化'),
  81. },
  82. 'ich': { [0]: ichFormItems },
  83. 'travel_guide': { [0]: villageInfoTravelGuideForm },
  84. 'route': { [0]: villageInfoRouteForm },
  85. 'food_product': {
  86. [1]: villageInfoFoodProductsForm('农副产品'),
  87. [2]: villageInfoFoodProductsForm('食品产品'),
  88. [3]: villageInfoFoodProductsForm('特色美食'),
  89. [4]: villageInfoFoodProductsForm('商业集市'),
  90. [5]: villageInfoFoodProductsForm('服装服饰'),
  91. [6]: villageInfoFoodProductsForm('运输工具'),
  92. },
  93. 'collect': {
  94. [1]: [CommonInfoModel, (r) => ({
  95. formItems: [
  96. {
  97. label: '标题',
  98. name: 'name',
  99. type: 'text',
  100. defaultValue: '',
  101. additionalProps: {
  102. placeholder: '请输入标题',
  103. } as FieldProps,
  104. rules: [{
  105. required: true,
  106. message: '请输入标题',
  107. }]
  108. },
  109. {
  110. label: '描述',
  111. name: 'desc',
  112. type: 'textarea',
  113. defaultValue: '',
  114. additionalProps: {
  115. placeholder: '请输入描述',
  116. maxLength: 200,
  117. showWordLimit: true,
  118. } as FieldProps,
  119. rules: []
  120. },
  121. ...villageCommonContent(r, {
  122. title: '记录',
  123. showTitle: false,
  124. }).formItems
  125. ]
  126. }), { title: '随手记', typeName: '', }]
  127. },
  128. }
  129. export function getVillageInfoForm(subType: string, subId: number) {
  130. const group = villageInfoForm[subType];
  131. if (!group)
  132. throw new Error('未定义的表单类型: ' + subType);
  133. if (subId === -1)
  134. return mergeFormItems(group);
  135. return group[subId];
  136. }
  137. export function getVillageInfoFormIds(subType: string) {
  138. return Object.keys(villageInfoForm[subType]).map((k) => Number(k));
  139. }
  140. export function mergeFormItems(group: GroupForm) {
  141. const groupArray = Object.keys(group)
  142. .map((k) => {
  143. const id = Number(k);
  144. const it = group[id];
  145. it[2].id = id;
  146. return it;
  147. })
  148. .sort((a, b) =>
  149. (a[2].order || 0) - (b[2].order || 0)
  150. );
  151. const [model, firstForm, info] = groupArray[0];
  152. const isOverview = group === villageInfoOverviewForm;
  153. const needType = !isOverview && info.typeName;
  154. const result : SingleForm = [model, (formRef: Ref<IDynamicFormRef>) => {
  155. const options : IDynamicFormOptions = {
  156. formItems: [],
  157. };
  158. if (needType) {
  159. options.formItems.push({
  160. label: '类型',
  161. name: info.typeName,
  162. type: 'select-id',
  163. additionalProps: {
  164. disabled: groupArray.length <= 1,
  165. loadData: async () => groupArray.map((it) => ({
  166. value: it[2].id,
  167. text: it[2].title,
  168. })),
  169. } as PickerIdFieldProps,
  170. defaultValue: groupArray[0][2].id,
  171. formProps: { showRightArrow: true } as FieldProps,
  172. rules: [{
  173. required: true,
  174. type: 'number',
  175. message: '请选择类型',
  176. }],
  177. });
  178. }
  179. if (needType || isOverview) {
  180. let i = 0;
  181. for (const it of groupArray) {
  182. const op = it[1](formRef);
  183. const ex = it[2];
  184. options.formItems.push({
  185. label: ex.title,
  186. name: 'group' + i,
  187. type: 'flat-group',
  188. childrenColProps: { span: 24 },
  189. children: op.formItems,
  190. show: isOverview ? undefined : { callback: (_, m) => m[info.typeName] == ex.id }
  191. });
  192. i++;
  193. }
  194. } else {
  195. options.formItems.push(...firstForm(formRef).formItems)
  196. }
  197. return options;
  198. }, info ?? { title: '合并', typeName: '' }]
  199. return result;
  200. }