|
|
@@ -3,10 +3,15 @@
|
|
|
<CommonRoot>
|
|
|
<LoadingPage v-if="loading" />
|
|
|
<FlexCol :padding="30">
|
|
|
+ <Alert
|
|
|
+ v-if="localSavedState"
|
|
|
+ type="info"
|
|
|
+ message="您的修改已经暂存,可以放心离开,下次接着编辑"
|
|
|
+ />
|
|
|
<DynamicForm
|
|
|
ref="formRef"
|
|
|
:options="formDefine"
|
|
|
- :model="formModel"formModel
|
|
|
+ :model="formModel"
|
|
|
:globalParams="querys"
|
|
|
/>
|
|
|
<Height :height="20" />
|
|
|
@@ -18,24 +23,25 @@
|
|
|
</template>
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
-import { nextTick, ref, type Ref } from 'vue';
|
|
|
-import { showError } from '@/common/composeabe/ErrorDisplay';
|
|
|
+import { nextTick, ref, watch, type Ref } from 'vue';
|
|
|
+import { useCollectStore } from '@/store/collect';
|
|
|
import { useLoadQuerys } from '@/common/composeabe/LoadQuerys';
|
|
|
-import { getVillageInfoForm } from './forms';
|
|
|
-import { RequestApiError, waitTimeOut } from '@imengyu/imengyu-utils';
|
|
|
+import { getVillageInfoForm, getVillageInfoFormIds, type SingleForm } from './forms';
|
|
|
+import { showError } from '@/common/composeabe/ErrorDisplay';
|
|
|
+import { backAndCallOnPageBack } from '@/components/utils/PageAction';
|
|
|
+import { toast } from '@/components/utils/DialogAction';
|
|
|
+import { confirm } from '@/components/dialog/CommonRoot';
|
|
|
+import { Debounce, RequestApiError, waitTimeOut } from '@imengyu/imengyu-utils';
|
|
|
import VillageInfoApi, { CommonInfoModel } from '@/api/inhert/VillageInfoApi';
|
|
|
import DynamicForm from '@/components/dynamic/DynamicForm.vue';
|
|
|
import LoadingPage from '@/components/display/loading/LoadingPage.vue';
|
|
|
import Button from '@/components/basic/Button.vue';
|
|
|
import CommonRoot from '@/components/dialog/CommonRoot.vue';
|
|
|
import FlexCol from '@/components/layout/FlexCol.vue';
|
|
|
-import type { IDynamicFormOptions, IDynamicFormRef } from '@/components/dynamic';
|
|
|
import Height from '@/components/layout/space/Height.vue';
|
|
|
-import { backAndCallOnPageBack } from '@/components/utils/PageAction';
|
|
|
import XBarSpace from '@/components/layout/space/XBarSpace.vue';
|
|
|
-import { toast } from '@/components/utils/DialogAction';
|
|
|
-import { confirm } from '@/components/dialog/CommonRoot';
|
|
|
-import { useCollectStore } from '@/store/collect';
|
|
|
+import type { IDynamicFormOptions, IDynamicFormRef } from '@/components/dynamic';
|
|
|
+import Alert from '@/components/feedback/Alert.vue';
|
|
|
|
|
|
const loading = ref(false);
|
|
|
const subTitle = ref('');
|
|
|
@@ -54,47 +60,7 @@ const formDefine = ref<IDynamicFormOptions>({
|
|
|
},
|
|
|
},
|
|
|
});
|
|
|
-
|
|
|
-async function submit() {
|
|
|
- if (!formRef.value)
|
|
|
- return;
|
|
|
- try {
|
|
|
- await formRef.value.validate();
|
|
|
- } catch {
|
|
|
- toast('有必填项未填写,请检查');
|
|
|
- return;
|
|
|
- }
|
|
|
- try {
|
|
|
- loading.value = true;
|
|
|
- formModel.value.type = querys.value.subId;
|
|
|
- await waitTimeOut(800);
|
|
|
- await VillageInfoApi.updateInfo(
|
|
|
- collectStore.getCollectModuleId(querys.value.subType),
|
|
|
- querys.value.subType,
|
|
|
- querys.value.subKey,
|
|
|
- querys.value.subId,
|
|
|
- querys.value.villageId,
|
|
|
- querys.value.villageVolunteerId,
|
|
|
- formModel.value as CommonInfoModel,
|
|
|
- );
|
|
|
- confirm({
|
|
|
- content: '您的提交已成功,感谢您的参与!',
|
|
|
- cancelText: '继续编辑',
|
|
|
- confirmText: '返回列表',
|
|
|
- icon: 'success',
|
|
|
- onConfirm: () => backPrev(true),
|
|
|
- })
|
|
|
- } catch (e) {
|
|
|
- showError(e);
|
|
|
- } finally {
|
|
|
- loading.value = false;
|
|
|
- }
|
|
|
-}
|
|
|
-function backPrev(needRefresh: boolean) {
|
|
|
- backAndCallOnPageBack('list', {
|
|
|
- needRefresh,
|
|
|
- });
|
|
|
-}
|
|
|
+let currentFormInfo : SingleForm|null = null;
|
|
|
|
|
|
const { querys } = useLoadQuerys({
|
|
|
villageId: 0,
|
|
|
@@ -114,17 +80,17 @@ const { querys } = useLoadQuerys({
|
|
|
return;
|
|
|
|
|
|
let formData = undefined;
|
|
|
-
|
|
|
await waitTimeOut(200);
|
|
|
|
|
|
try {
|
|
|
- const [model, forms] = getVillageInfoForm(querys.subType, querys.subId);
|
|
|
+ currentFormInfo = getVillageInfoForm(querys.subType, querys.subId);
|
|
|
+ const [model, forms] = currentFormInfo;
|
|
|
formModel.value = new model() as any;
|
|
|
formDefine.value = {
|
|
|
...formDefine.value,
|
|
|
...forms(formRef as any)
|
|
|
};
|
|
|
- if (querys.id >= 0)
|
|
|
+ if (querys.id >= 0) {
|
|
|
formData = await VillageInfoApi.getInfo(
|
|
|
collectStore.getCollectModuleId(querys.subType),
|
|
|
querys.subType,
|
|
|
@@ -135,19 +101,127 @@ const { querys } = useLoadQuerys({
|
|
|
querys.id,
|
|
|
model,
|
|
|
);
|
|
|
+ }
|
|
|
} catch (e) {
|
|
|
+ console.log(e);
|
|
|
if (!(e instanceof RequestApiError && e.errorMessage.startsWith('请完成')))
|
|
|
showError(e, undefined, () => backPrev(false));
|
|
|
} finally {
|
|
|
loading.value = false;
|
|
|
}
|
|
|
-
|
|
|
- if (formData) {
|
|
|
+
|
|
|
+ formData = await loadLocalSave(formData as CommonInfoModel);
|
|
|
+ if (formData)
|
|
|
formModel.value = formData as any;
|
|
|
- }
|
|
|
|
|
|
await nextTick();
|
|
|
-
|
|
|
formRef.value.initDefaultValuesToModel();
|
|
|
+
|
|
|
+ await waitTimeOut(1000);
|
|
|
+ canSaveNow = true;
|
|
|
});
|
|
|
+
|
|
|
+async function submit() {
|
|
|
+ if (!formRef.value)
|
|
|
+ return;
|
|
|
+ try {
|
|
|
+ await formRef.value.validate();
|
|
|
+ } catch {
|
|
|
+ toast('有必填项未填写,请检查');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ loading.value = true;
|
|
|
+ formModel.value.type = querys.value.subId;
|
|
|
+ await waitTimeOut(800);
|
|
|
+ if (currentFormInfo?.[2].typeName && querys.value.subId == -1) {
|
|
|
+ const ids = getVillageInfoFormIds(querys.value.subType);
|
|
|
+ for (const id of ids) {
|
|
|
+ await VillageInfoApi.updateInfo(
|
|
|
+ collectStore.getCollectModuleId(querys.value.subType),
|
|
|
+ querys.value.subType,
|
|
|
+ querys.value.subKey,
|
|
|
+ id,
|
|
|
+ querys.value.villageId,
|
|
|
+ querys.value.villageVolunteerId,
|
|
|
+ formModel.value as CommonInfoModel,
|
|
|
+ );
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ await VillageInfoApi.updateInfo(
|
|
|
+ collectStore.getCollectModuleId(querys.value.subType),
|
|
|
+ querys.value.subType,
|
|
|
+ querys.value.subKey,
|
|
|
+ querys.value.subId,
|
|
|
+ querys.value.villageId,
|
|
|
+ querys.value.villageVolunteerId,
|
|
|
+ formModel.value as CommonInfoModel,
|
|
|
+ );
|
|
|
+ }
|
|
|
+ confirm({
|
|
|
+ content: '您的提交已成功,感谢您的参与!',
|
|
|
+ cancelText: '继续编辑',
|
|
|
+ confirmText: '返回列表',
|
|
|
+ icon: 'success',
|
|
|
+ onConfirm: () => backPrev(true),
|
|
|
+ })
|
|
|
+ } catch (e) {
|
|
|
+ showError(e);
|
|
|
+ } finally {
|
|
|
+ loading.value = false;
|
|
|
+ }
|
|
|
+}
|
|
|
+function backPrev(needRefresh: boolean) {
|
|
|
+ backAndCallOnPageBack('list', {
|
|
|
+ needRefresh,
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
+const localSavedState = ref(false);
|
|
|
+const saveLocalSaveDebounce = new Debounce(1000, saveLocalSave);
|
|
|
+let canSaveNow = false;
|
|
|
+
|
|
|
+function getSaveName() {
|
|
|
+ return `FormLocalSave-${querys.value.id}-${querys.value.subType}-${querys.value.subId}-${querys.value.villageId}-${querys.value.villageVolunteerId}`;
|
|
|
+}
|
|
|
+async function loadLocalSave(formData: CommonInfoModel|undefined) {
|
|
|
+ if (!currentFormInfo)
|
|
|
+ return formData;
|
|
|
+ console.log('加载暂存数据');
|
|
|
+ const saveName = getSaveName();
|
|
|
+ const saveData = uni.getStorageSync(saveName);
|
|
|
+ if (saveData) {
|
|
|
+ const res = await confirm({
|
|
|
+ content: '您有上次编辑未完成的内容,是否要从上次的编辑数据继续?',
|
|
|
+ cancelText: '取消',
|
|
|
+ confirmText: '继续',
|
|
|
+ icon: 'prompt',
|
|
|
+ })
|
|
|
+ if (res) {
|
|
|
+ const d = JSON.parse(saveData);
|
|
|
+ d.id = 0;
|
|
|
+ formData = new currentFormInfo[0]().fromServerSide(d) as CommonInfoModel;
|
|
|
+ console.log('有暂存数据', formData);
|
|
|
+ } else
|
|
|
+ deleteLocalSave();
|
|
|
+ }
|
|
|
+ return formData;
|
|
|
+}
|
|
|
+function deleteLocalSave() {
|
|
|
+ const saveName = getSaveName();
|
|
|
+ uni.removeStorageSync(saveName);
|
|
|
+ localSavedState.value = false;
|
|
|
+}
|
|
|
+function saveLocalSave() {
|
|
|
+ const saveName = getSaveName();
|
|
|
+ uni.setStorageSync(saveName, JSON.stringify(formModel.value.toServerSide()));
|
|
|
+ localSavedState.value = true;
|
|
|
+ console.log('保存暂存数据');
|
|
|
+}
|
|
|
+
|
|
|
+watch(formModel, () => {
|
|
|
+ if (!canSaveNow)
|
|
|
+ return;
|
|
|
+ saveLocalSaveDebounce.executeWithDelay();
|
|
|
+}, { deep: true })
|
|
|
</script>
|