Skip to content

Commit 2bdee89

Browse files
authored
chore: unifiy json editor dialog (#767)
Signed-off-by: ryjiang <jiangruiyi@gmail.com>
1 parent 74ec2f3 commit 2bdee89

File tree

4 files changed

+51
-190
lines changed

4 files changed

+51
-190
lines changed

Diff for: client/src/pages/databases/collections/data/CollectionData.tsx

+34-6
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import Filter from '@/components/advancedSearch';
1212
import DeleteTemplate from '@/components/customDialog/DeleteDialogTemplate';
1313
import CustomToolBar from '@/components/grid/ToolBar';
1414
import InsertDialog from '@/pages/dialogs/insert/Dialog';
15-
import EditEntityDialog from '@/pages/dialogs/EditEntityDialog';
15+
import EditJSONDialog from '@/pages/dialogs/EditJSONDialog';
1616
import { getLabelDisplayedRows } from '@/pages/search/Utils';
1717
import { getQueryStyles } from './Styles';
1818
import {
@@ -31,6 +31,7 @@ import CollectionColHeader from '../CollectionColHeader';
3131
import DataView from '@/components/DataView/DataView';
3232
import DataListView from '@/components/DataListView/DataListView';
3333
import type { QueryState } from '../../types';
34+
import { CollectionFullObject } from '@server/types';
3435

3536
export interface CollectionDataProps {
3637
queryState: QueryState;
@@ -148,7 +149,13 @@ const CollectionData = (props: CollectionDataProps) => {
148149
await fetchCollection(collectionName);
149150
};
150151

151-
const onEditEntity = async (id: string) => {
152+
const handleEditConfirm = async (data: Record<string, any>) => {
153+
const result = (await DataService.upsert(collection.collection_name, {
154+
fields_data: [data],
155+
})) as any;
156+
157+
const idField = result.IDs.id_field;
158+
const id = result.IDs[idField].data;
152159
// deselect all
153160
setSelectedData([]);
154161
const newExpr = `${collection.schema.primaryField.name} == ${id}`;
@@ -163,6 +170,25 @@ const CollectionData = (props: CollectionDataProps) => {
163170
});
164171
};
165172

173+
const getEditData = (data: any, collection: CollectionFullObject) => {
174+
// sort data by collection schema order
175+
const schema = collection.schema;
176+
let sortedData: { [key: string]: any } = {};
177+
schema.fields.forEach(field => {
178+
if (data[field.name] !== undefined) {
179+
sortedData[field.name] = data[field.name];
180+
}
181+
});
182+
183+
// add dynamic fields if exist
184+
const isDynamicSchema = collection.schema.dynamicFields.length > 0;
185+
if (isDynamicSchema) {
186+
sortedData = { ...sortedData, ...data[DYNAMIC_FIELD] };
187+
}
188+
189+
return sortedData;
190+
};
191+
166192
// Toolbar settings
167193
const toolbarConfigs: ToolBarConfig[] = [
168194
{
@@ -270,10 +296,12 @@ const CollectionData = (props: CollectionDataProps) => {
270296
type: 'custom',
271297
params: {
272298
component: (
273-
<EditEntityDialog
274-
data={selectedData[0]}
275-
collection={collection!}
276-
cb={onEditEntity}
299+
<EditJSONDialog
300+
data={getEditData(selectedData[0], collection)}
301+
dialogTitle={dialogTrans('editEntityTitle')}
302+
dialogTip={dialogTrans('editEntityInfo')}
303+
handleConfirm={handleEditConfirm}
304+
handleCloseDialog={handleCloseDialog}
277305
/>
278306
),
279307
},

Diff for: client/src/pages/dialogs/EditEntityDialog.tsx

-174
This file was deleted.

Diff for: client/src/pages/dialogs/EditAnalyzerDialog.tsx renamed to client/src/pages/dialogs/EditJSONDialog.tsx

+9-8
Original file line numberDiff line numberDiff line change
@@ -26,35 +26,36 @@ const useStyles = makeStyles((theme: Theme) => ({
2626
},
2727
}));
2828

29-
type EditAnalyzerDialogProps = {
29+
type EditJSONDialogProps = {
3030
data: { [key: string]: any };
3131
handleConfirm: (data: { [key: string]: any }) => void;
3232
handleCloseDialog: () => void;
33+
dialogTitle: string;
34+
dialogTip: string;
3335
cb?: () => void;
3436
};
3537

3638
// json linter for cm
3739
const linterExtension = linter(jsonParseLinter());
3840

39-
const EditAnalyzerDialog: FC<EditAnalyzerDialogProps> = props => {
41+
const EditJSONDialog: FC<EditJSONDialogProps> = props => {
42+
// hooks
4043
const theme = useTheme();
4144
const themeCompartment = new Compartment();
4245

4346
// props
4447
const { data, handleCloseDialog, handleConfirm } = props;
4548
// UI states
4649
const [disabled, setDisabled] = useState(true);
47-
// context
4850
// translations
4951
const { t: btnTrans } = useTranslation('btn');
50-
const { t: dialogTrans } = useTranslation('dialog');
5152
// refs
5253
const editorEl = useRef<HTMLDivElement>(null);
5354
const editor = useRef<EditorView>();
5455
// styles
5556
const classes = useStyles();
5657

57-
const originalData = JSON.stringify(data, null, 4) + '\n';
58+
const originalData = JSON.stringify(data, null, 2) + '\n';
5859

5960
// create editor
6061
useEffect(() => {
@@ -123,14 +124,14 @@ const EditAnalyzerDialog: FC<EditAnalyzerDialogProps> = props => {
123124

124125
return (
125126
<DialogTemplate
126-
title={dialogTrans('editAnalyzerTitle')}
127+
title={props.dialogTitle}
127128
handleClose={handleCloseDialog}
128129
children={
129130
<>
130131
<div
131132
className={classes.tip}
132133
dangerouslySetInnerHTML={{
133-
__html: dialogTrans('editAnalyzerInfo'),
134+
__html: props.dialogTip,
134135
}}
135136
></div>
136137
<div
@@ -150,4 +151,4 @@ const EditAnalyzerDialog: FC<EditAnalyzerDialogProps> = props => {
150151
);
151152
};
152153

153-
export default EditAnalyzerDialog;
154+
export default EditJSONDialog;

Diff for: client/src/pages/dialogs/create/CreateFields.tsx

+8-2
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ import {
3737
} from '@/consts';
3838
import { makeStyles } from '@mui/styles';
3939
import CustomIconButton from '@/components/customButton/CustomIconButton';
40-
import EditAnalyzerDialog from '@/pages/dialogs/EditAnalyzerDialog';
40+
import EditJSONDialog from '@/pages/dialogs/EditJSONDialog';
4141
import type {
4242
CreateFieldsProps,
4343
CreateFieldType,
@@ -171,11 +171,15 @@ const CreateFields: FC<CreateFieldsProps> = ({
171171
autoID,
172172
setFieldsValidation,
173173
}) => {
174+
// context
174175
const { setDialog2, handleCloseDialog2 } = useContext(rootContext);
175176

177+
// i18n
176178
const { t: collectionTrans } = useTranslation('collection');
177179
const { t: warningTrans } = useTranslation('warning');
180+
const { t: dialogTrans } = useTranslation('dialog');
178181

182+
// styles
179183
const classes = useStyles();
180184

181185
const AddIcon = icons.addOutline;
@@ -628,10 +632,12 @@ const CreateFields: FC<CreateFieldsProps> = ({
628632
type: 'custom',
629633
params: {
630634
component: (
631-
<EditAnalyzerDialog
635+
<EditJSONDialog
632636
data={getAnalyzerParams(
633637
field.analyzer_params || 'standard'
634638
)}
639+
dialogTitle={dialogTrans('editAnalyzerTitle')}
640+
dialogTip={dialogTrans('editAnalyzerInfo')}
635641
handleConfirm={data => {
636642
changeFields(field.id!, { analyzer_params: data });
637643
}}

0 commit comments

Comments
 (0)