Browse Source

fix(registration): hide and skip validation of human-only fields in pet product environment

sw 3 weeks ago
parent
commit
20a28c1807

+ 6 - 0
src/domain/humanSpecificInfo.ts

@@ -0,0 +1,6 @@
+const omitSchemaFields = ['pregnancy_status'] as const;
+//表单验证时忽略动物专用字段
+const omitHumanSchemaMap = Object.fromEntries(
+  omitSchemaFields.map((k) => [k, true])
+) as Record<(typeof omitSchemaFields)[number], true>;
+export { omitHumanSchemaMap };

+ 20 - 17
src/pages/patient/components/register.form.tsx

@@ -275,24 +275,27 @@ const BasicInfoForm: React.FC<BasicInfoFormProps> = ({
           />
         </Form.Item>
       )}
-      <Form.Item
-        label={
-          <FormattedMessage
-            id="register.pregnancyStatus"
-            defaultMessage="register.pregnancyStatus"
+      {/** 人类专用 */}
+      {productName === 'DROS' && (
+        <Form.Item
+          label={
+            <FormattedMessage
+              id="register.pregnancyStatus"
+              defaultMessage="register.pregnancyStatus"
+            />
+          }
+          name="pregnancy_status"
+          required={registerFormFields.pregnancy_status.required}
+          validateTrigger={registerFormFields.pregnancy_status.trigger}
+          rules={registerFormFields.pregnancy_status.validation}
+        >
+          <Radio.Group
+            options={pregnancyStatusOptions}
+            optionType="button"
+            buttonStyle="solid"
           />
-        }
-        name="pregnancy_status"
-        required={registerFormFields.pregnancy_status.required}
-        validateTrigger={registerFormFields.pregnancy_status.trigger}
-        rules={registerFormFields.pregnancy_status.validation}
-      >
-        <Radio.Group
-          options={pregnancyStatusOptions}
-          optionType="button"
-          buttonStyle="solid"
-        />
-      </Form.Item>
+        </Form.Item>
+      )}
       {/** 宠物专用 */}
       {productName === 'VETDROS' && (
         <Form.Item

+ 15 - 3
src/pages/patient/register.tsx

@@ -1,7 +1,7 @@
 import React from 'react';
 import { Row, Col, Collapse, Grid, Button, Space, Form, message } from 'antd';
 import { FormattedMessage } from 'react-intl';
-import { useDispatch } from 'react-redux';
+import { useDispatch, useSelector } from 'react-redux';
 import { setFormData } from '@/states/patient/register/formSlice';
 import BasicInfoForm from './components/register.form';
 import SelectedProtocolList from './components/register.selected.view.list';
@@ -20,6 +20,8 @@ import utc from 'dayjs/plugin/utc';
 import { View } from '@/API/patient/viewActions';
 import BodyPositionFilter from './components/bodyPositionFilter';
 import { omitAnimalSchemaMap } from '@/domain/animalSpecificInfo';
+import { RootState } from '@/states/store';
+import { omitHumanSchemaMap } from '@/domain/humanSpecificInfo';
 dayjs.extend(utc);
 
 const { useBreakpoint } = Grid;
@@ -30,6 +32,9 @@ const RegisterPage: React.FC = () => {
   const [form] = Form.useForm();
   const dispatch = useDispatch();
   const { selectedViews, currentPatientType } = useRegisterState();
+  const productName = useSelector(
+    (state: RootState) => state.product.productName
+  );
 
   const handleRegister = async (): Promise<{
     success: boolean;
@@ -50,8 +55,15 @@ const RegisterPage: React.FC = () => {
 
       values = { ...values, patient_dob: formatDob };
       console.log(`${JSON.stringify(values, null, 2)}`);
-      const humanSchema = registerformSchema.omit(omitAnimalSchemaMap);
-      const validateResult = humanSchema.safeParse(values);
+
+      let validateResult;
+      if (productName === 'VETDROS') {
+        const animalSchema = registerformSchema.omit(omitHumanSchemaMap);
+        validateResult = animalSchema.safeParse(values);
+      } else {
+        const humanSchema = registerformSchema.omit(omitAnimalSchemaMap);
+        validateResult = humanSchema.safeParse(values);
+      }
       if (!validateResult.success) {
         message.error(`必填项未填写或者不合规则`);
         // todo 更详细和人性化的提示