leezng commented on code in PR #8949:
URL: https://github.com/apache/inlong/pull/8949#discussion_r1333801715


##########
inlong-dashboard/src/ui/pages/SynchronizeDetail/SyncTransform/DetailModal.tsx:
##########
@@ -44,41 +45,224 @@ const Comp: React.FC<Props> = ({
   const [form] = useForm();
   const { t } = useTranslation();
 
-  const { defaultValue } = useDefaultMeta('transform');
+  const [sourceNames, setSourcesNames] = useState([]);
+  const [sinkNames, setSinkNames] = useState([]);
 
-  const [type, setType] = useState(defaultValue);
+  const { data, run: getData } = useRequest(
+    streamId => ({
+      url: `/stream/getBrief`,
+      params: {
+        groupId: inlongGroupId,
+        streamId,
+      },
+    }),
+    {
+      manual: true,
+    },
+  );
 
-  const { loading, Entity } = useLoadMeta<TransformMetaType>('transform', 
type);
+  const { data: sourceData, run: getSourceData } = useRequest(
+    inlongStreamId => ({
+      url: `/source/list`,
+      method: 'POST',
+      data: {
+        inlongGroupId,
+        inlongStreamId,
+      },
+    }),
+    {
+      manual: true,
+      onSuccess: result => {
+        const list = result.list.map(item => item.sourceName);
+        setSourcesNames(list);
+      },
+    },
+  );
 
-  const { data, run: getData } = useRequest(
+  const { data: sinkData, run: getSinkData } = useRequest(
+    inlongStreamId => ({
+      url: `/sink/list`,
+      method: 'POST',
+      data: {
+        inlongGroupId,
+        inlongStreamId,
+      },
+    }),
+    {
+      manual: true,
+      onSuccess: result => {
+        const list = result.list.map(item => item.sinkName);
+        setSinkNames(list);
+      },
+    },
+  );
+
+  const { data: transformData, run: getTransformData } = useRequest(
     id => ({
       url: `/transform/get/${id}`,
     }),
     {
       manual: true,
-      formatResult: result => new Entity()?.parse(result) || result,
       onSuccess: result => {
-        form.setFieldsValue(result);
-        setType(result.transform);
+        form.setFieldsValue(JSON.parse(result.transformDefinition));
       },
     },
   );
 
+  const columns: ColumnsItemProps[] = [
+    {
+      title: i18n.t('pages.SynchronizeDetail.Transform.LogicOperators'),
+      type: 'select',
+      dataIndex: 'relationWithPost',
+      rules: [{ required: true }],
+      props: {
+        options: [
+          {
+            label: 'AND',
+            value: 'AND',
+          },
+          {
+            label: 'OR',
+            value: 'OR',
+          },
+        ],
+      },
+    },
+    {
+      title: i18n.t('pages.SynchronizeDetail.Transform.FilterFields'),
+      type: 'select',
+      dataIndex: 'fieldSource',
+      rules: [{ required: true }],
+      props: (text, record, idx, isNew) => ({
+        options: data?.fieldList.map(item => ({
+          label: item.fieldName,
+          value: item.fieldName,
+        })),
+        onChange: (value, option) => {
+          record.fieldSource = value;

Review Comment:
   There should be no need to set `record.fieldSource = ` here



##########
inlong-dashboard/src/ui/pages/SynchronizeDetail/SyncTransform/DetailModal.tsx:
##########
@@ -44,41 +45,224 @@ const Comp: React.FC<Props> = ({
   const [form] = useForm();
   const { t } = useTranslation();
 
-  const { defaultValue } = useDefaultMeta('transform');
+  const [sourceNames, setSourcesNames] = useState([]);
+  const [sinkNames, setSinkNames] = useState([]);
 
-  const [type, setType] = useState(defaultValue);
+  const { data, run: getData } = useRequest(
+    streamId => ({
+      url: `/stream/getBrief`,
+      params: {
+        groupId: inlongGroupId,
+        streamId,
+      },
+    }),
+    {
+      manual: true,
+    },
+  );
 
-  const { loading, Entity } = useLoadMeta<TransformMetaType>('transform', 
type);
+  const { data: sourceData, run: getSourceData } = useRequest(
+    inlongStreamId => ({
+      url: `/source/list`,
+      method: 'POST',
+      data: {
+        inlongGroupId,
+        inlongStreamId,
+      },
+    }),
+    {
+      manual: true,
+      onSuccess: result => {
+        const list = result.list.map(item => item.sourceName);
+        setSourcesNames(list);
+      },
+    },
+  );
 
-  const { data, run: getData } = useRequest(
+  const { data: sinkData, run: getSinkData } = useRequest(
+    inlongStreamId => ({
+      url: `/sink/list`,
+      method: 'POST',
+      data: {
+        inlongGroupId,
+        inlongStreamId,
+      },
+    }),
+    {
+      manual: true,
+      onSuccess: result => {
+        const list = result.list.map(item => item.sinkName);
+        setSinkNames(list);
+      },
+    },
+  );
+
+  const { data: transformData, run: getTransformData } = useRequest(
     id => ({
       url: `/transform/get/${id}`,
     }),
     {
       manual: true,
-      formatResult: result => new Entity()?.parse(result) || result,
       onSuccess: result => {
-        form.setFieldsValue(result);
-        setType(result.transform);
+        form.setFieldsValue(JSON.parse(result.transformDefinition));
       },
     },
   );
 
+  const columns: ColumnsItemProps[] = [
+    {
+      title: i18n.t('pages.SynchronizeDetail.Transform.LogicOperators'),
+      type: 'select',
+      dataIndex: 'relationWithPost',
+      rules: [{ required: true }],
+      props: {
+        options: [
+          {
+            label: 'AND',
+            value: 'AND',
+          },
+          {
+            label: 'OR',
+            value: 'OR',
+          },
+        ],
+      },
+    },
+    {
+      title: i18n.t('pages.SynchronizeDetail.Transform.FilterFields'),
+      type: 'select',
+      dataIndex: 'fieldSource',
+      rules: [{ required: true }],
+      props: (text, record, idx, isNew) => ({
+        options: data?.fieldList.map(item => ({
+          label: item.fieldName,
+          value: item.fieldName,
+        })),
+        onChange: (value, option) => {
+          record.fieldSource = value;
+          const field = data?.fieldList.find(item => value === item.fieldName);
+          return (record.sourceField = {

Review Comment:
   return an object, do not return (var=)



##########
inlong-dashboard/src/ui/pages/SynchronizeDetail/SyncTransform/DetailModal.tsx:
##########
@@ -44,41 +45,224 @@ const Comp: React.FC<Props> = ({
   const [form] = useForm();
   const { t } = useTranslation();
 
-  const { defaultValue } = useDefaultMeta('transform');
+  const [sourceNames, setSourcesNames] = useState([]);
+  const [sinkNames, setSinkNames] = useState([]);
 
-  const [type, setType] = useState(defaultValue);
+  const { data, run: getData } = useRequest(
+    streamId => ({
+      url: `/stream/getBrief`,
+      params: {
+        groupId: inlongGroupId,
+        streamId,
+      },
+    }),
+    {
+      manual: true,
+    },
+  );
 
-  const { loading, Entity } = useLoadMeta<TransformMetaType>('transform', 
type);
+  const { data: sourceData, run: getSourceData } = useRequest(
+    inlongStreamId => ({
+      url: `/source/list`,
+      method: 'POST',
+      data: {
+        inlongGroupId,
+        inlongStreamId,
+      },
+    }),
+    {
+      manual: true,
+      onSuccess: result => {
+        const list = result.list.map(item => item.sourceName);
+        setSourcesNames(list);
+      },
+    },
+  );
 
-  const { data, run: getData } = useRequest(
+  const { data: sinkData, run: getSinkData } = useRequest(
+    inlongStreamId => ({
+      url: `/sink/list`,
+      method: 'POST',
+      data: {
+        inlongGroupId,
+        inlongStreamId,
+      },
+    }),
+    {
+      manual: true,
+      onSuccess: result => {
+        const list = result.list.map(item => item.sinkName);
+        setSinkNames(list);
+      },
+    },
+  );
+
+  const { data: transformData, run: getTransformData } = useRequest(
     id => ({
       url: `/transform/get/${id}`,
     }),
     {
       manual: true,
-      formatResult: result => new Entity()?.parse(result) || result,
       onSuccess: result => {
-        form.setFieldsValue(result);
-        setType(result.transform);
+        form.setFieldsValue(JSON.parse(result.transformDefinition));
       },
     },
   );
 
+  const columns: ColumnsItemProps[] = [
+    {
+      title: i18n.t('pages.SynchronizeDetail.Transform.LogicOperators'),
+      type: 'select',
+      dataIndex: 'relationWithPost',
+      rules: [{ required: true }],
+      props: {
+        options: [
+          {
+            label: 'AND',
+            value: 'AND',
+          },
+          {
+            label: 'OR',
+            value: 'OR',
+          },
+        ],
+      },
+    },
+    {
+      title: i18n.t('pages.SynchronizeDetail.Transform.FilterFields'),
+      type: 'select',
+      dataIndex: 'fieldSource',
+      rules: [{ required: true }],
+      props: (text, record, idx, isNew) => ({
+        options: data?.fieldList.map(item => ({
+          label: item.fieldName,
+          value: item.fieldName,
+        })),
+        onChange: (value, option) => {
+          record.fieldSource = value;
+          const field = data?.fieldList.find(item => value === item.fieldName);
+          return (record.sourceField = {
+            fieldName: field.fieldName,
+            fieldType: field.fieldType,
+          });
+        },
+      }),
+    },
+    {
+      title: i18n.t('pages.SynchronizeDetail.Transform.Operators'),
+      type: 'select',
+      dataIndex: 'operationType',
+      rules: [{ required: true }],
+      props: {
+        options: [
+          {
+            label: '<',
+            value: 'lt',
+          },
+          {
+            label: '>',
+            value: 'gt',
+          },
+          {
+            label: '<=',
+            value: 'le',
+          },
+          {
+            label: '>=',
+            value: 'ge',
+          },
+          {
+            label: '=',
+            value: 'eq',
+          },
+          {
+            label: '!=',
+            value: 'ne',
+          },
+          {
+            label: 
i18n.t('pages.SynchronizeDetail.Transform.Operators.IsNull'),
+            value: 'is_null',
+          },
+          {
+            label: 
i18n.t('pages.SynchronizeDetail.Transform.Operators.NotNull'),
+            value: 'not_null',
+          },
+        ],
+      },
+    },
+    {
+      title: i18n.t('pages.SynchronizeDetail.Transform.Type'),
+      type: 'select',
+      dataIndex: 'type',
+      rules: [{ required: true }],
+      props: {
+        options: [
+          {
+            label: i18n.t('pages.SynchronizeDetail.Transform.Type.Field'),
+            value: 'field',
+          },
+          {
+            label: 
i18n.t('pages.SynchronizeDetail.Transform.Type.CustomValue'),
+            value: 'customize',
+          },
+        ],
+      },
+    },
+    {
+      title: i18n.t('pages.SynchronizeDetail.Transform.ComparisonValue'),
+      type: 'autocomplete',
+      dataIndex: 'fieldSink',
+      initialValue: '',
+      rules: [{ required: true }],
+      props: (text, record, idx, isNew) => ({
+        options:
+          record.type === 'field'
+            ? sinkData?.list[0]?.sinkFieldList.map(item => ({
+                label: item.fieldName,
+                value: item.fieldName,
+              }))
+            : null,
+        onChange: (value, option) => {
+          record.fieldSink = value;

Review Comment:
   Same as above



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to