|
@@ -30,19 +30,17 @@ import CustomMultiSelector from '@/components/customSelector/CustomMultiSelector
|
|
|
import CollectionColHeader from '../CollectionColHeader';
|
|
|
import DataView from '@/components/DataView/DataView';
|
|
|
import DataListView from '@/components/DataListView/DataListView';
|
|
|
-import type { CollectionObject, CollectionFullObject } from '@server/types';
|
|
|
+import type { QueryState } from '../../types';
|
|
|
|
|
|
export interface CollectionDataProps {
|
|
|
- collectionName: string;
|
|
|
- collections: CollectionObject[];
|
|
|
+ queryState: QueryState;
|
|
|
+ setQueryState: (state: QueryState) => void;
|
|
|
}
|
|
|
|
|
|
const CollectionData = (props: CollectionDataProps) => {
|
|
|
// props
|
|
|
- const { collections } = props;
|
|
|
- const collection = collections.find(
|
|
|
- i => i.collection_name === props.collectionName
|
|
|
- ) as CollectionFullObject;
|
|
|
+ const { queryState, setQueryState } = props;
|
|
|
+ const collection = queryState && queryState.collection;
|
|
|
|
|
|
// collection is not found or collection full object is not ready
|
|
|
if (!collection || !collection.consistency_level) {
|
|
@@ -52,16 +50,6 @@ const CollectionData = (props: CollectionDataProps) => {
|
|
|
// UI state
|
|
|
const [tableLoading, setTableLoading] = useState<boolean>();
|
|
|
const [selectedData, setSelectedData] = useState<any[]>([]);
|
|
|
- const [expression, setExpression] = useState<string>('');
|
|
|
- const [consistencyLevel, setConsistencyLevel] = useState<string>(
|
|
|
- collection.consistency_level
|
|
|
- );
|
|
|
-
|
|
|
- // collection fields, combine static and dynamic fields
|
|
|
- const fields = [
|
|
|
- ...collection.schema.fields,
|
|
|
- ...collection.schema.dynamicFields,
|
|
|
- ];
|
|
|
|
|
|
// UI functions
|
|
|
const { setDialog, handleCloseDialog, openSnackBar, setDrawer } =
|
|
@@ -90,7 +78,7 @@ const CollectionData = (props: CollectionDataProps) => {
|
|
|
const currentFilter: any = filterRef.current;
|
|
|
currentFilter?.getReset();
|
|
|
// update UI expression
|
|
|
- setExpression('');
|
|
|
+ setQueryState({ ...queryState, expr: '' });
|
|
|
// reset query
|
|
|
reset();
|
|
|
// ensure not loading
|
|
@@ -98,13 +86,13 @@ const CollectionData = (props: CollectionDataProps) => {
|
|
|
};
|
|
|
const handleFilterSubmit = async (expression: string) => {
|
|
|
// update UI expression
|
|
|
- setExpression(expression);
|
|
|
+ setQueryState({ ...queryState, expr: expression });
|
|
|
// update expression
|
|
|
setExpr(expression);
|
|
|
};
|
|
|
const handlePageChange = async (e: any, page: number) => {
|
|
|
// do the query
|
|
|
- await query(page, consistencyLevel);
|
|
|
+ await query(page, queryState.consistencyLevel);
|
|
|
// update page number
|
|
|
setCurrentPage(page);
|
|
|
};
|
|
@@ -140,7 +128,6 @@ const CollectionData = (props: CollectionDataProps) => {
|
|
|
currentPage,
|
|
|
total,
|
|
|
pageSize,
|
|
|
- expr,
|
|
|
queryResult,
|
|
|
setPageSize,
|
|
|
setCurrentPage,
|
|
@@ -148,12 +135,11 @@ const CollectionData = (props: CollectionDataProps) => {
|
|
|
query,
|
|
|
reset,
|
|
|
count,
|
|
|
- outputFields,
|
|
|
- setOutputFields,
|
|
|
+ expr,
|
|
|
} = useQuery({
|
|
|
collection,
|
|
|
- consistencyLevel,
|
|
|
- fields: fields.filter(f => !f.is_function_output),
|
|
|
+ consistencyLevel: queryState.consistencyLevel,
|
|
|
+ outputFields: queryState.outputFields,
|
|
|
onQueryStart: (expr: string = '') => {
|
|
|
setTableLoading(true);
|
|
|
if (expr === '') {
|
|
@@ -164,6 +150,7 @@ const CollectionData = (props: CollectionDataProps) => {
|
|
|
onQueryFinally: () => {
|
|
|
setTableLoading(false);
|
|
|
},
|
|
|
+ initialExpr: queryState.expr,
|
|
|
});
|
|
|
|
|
|
const onInsert = async (collectionName: string) => {
|
|
@@ -380,15 +367,15 @@ const CollectionData = (props: CollectionDataProps) => {
|
|
|
<CustomInput
|
|
|
type="text"
|
|
|
textConfig={{
|
|
|
- label: expression
|
|
|
+ label: queryState.expr
|
|
|
? collectionTrans('queryExpression')
|
|
|
: collectionTrans('exprPlaceHolder'),
|
|
|
key: 'advFilter',
|
|
|
className: 'textarea',
|
|
|
onChange: (value: string) => {
|
|
|
- setExpression(value);
|
|
|
+ setQueryState({ ...queryState, expr: value });
|
|
|
},
|
|
|
- value: expression,
|
|
|
+ value: queryState.expr,
|
|
|
disabled: !collection.loaded,
|
|
|
variant: 'filled',
|
|
|
required: false,
|
|
@@ -409,8 +396,8 @@ const CollectionData = (props: CollectionDataProps) => {
|
|
|
if (e.key === 'Enter') {
|
|
|
// reset page
|
|
|
setCurrentPage(0);
|
|
|
- if (expr !== expression) {
|
|
|
- setExpr(expression);
|
|
|
+ if (expr !== queryState.expr) {
|
|
|
+ setExpr(queryState.expr);
|
|
|
} else {
|
|
|
// ensure query
|
|
|
query();
|
|
@@ -424,14 +411,17 @@ const CollectionData = (props: CollectionDataProps) => {
|
|
|
|
|
|
<CustomSelector
|
|
|
options={CONSISTENCY_LEVEL_OPTIONS}
|
|
|
- value={consistencyLevel}
|
|
|
+ value={queryState.consistencyLevel}
|
|
|
label={collectionTrans('consistency')}
|
|
|
wrapperClass={classes.selector}
|
|
|
disabled={!collection.loaded}
|
|
|
variant="filled"
|
|
|
onChange={(e: { target: { value: unknown } }) => {
|
|
|
const consistency = e.target.value as string;
|
|
|
- setConsistencyLevel(consistency);
|
|
|
+ setQueryState({
|
|
|
+ ...queryState,
|
|
|
+ consistencyLevel: consistency,
|
|
|
+ });
|
|
|
}}
|
|
|
/>
|
|
|
</div>
|
|
@@ -439,7 +429,7 @@ const CollectionData = (props: CollectionDataProps) => {
|
|
|
<div className="right">
|
|
|
<CustomMultiSelector
|
|
|
className={classes.outputs}
|
|
|
- options={fields
|
|
|
+ options={queryState.fields
|
|
|
.filter(f => !f.is_function_output)
|
|
|
.map(f => {
|
|
|
return {
|
|
@@ -450,7 +440,7 @@ const CollectionData = (props: CollectionDataProps) => {
|
|
|
value: f.name,
|
|
|
};
|
|
|
})}
|
|
|
- values={outputFields}
|
|
|
+ values={queryState.outputFields}
|
|
|
renderValue={selected => (
|
|
|
<span>{`${(selected as string[]).length} ${
|
|
|
gridTrans[
|
|
@@ -463,7 +453,7 @@ const CollectionData = (props: CollectionDataProps) => {
|
|
|
variant="filled"
|
|
|
onChange={(e: { target: { value: unknown } }) => {
|
|
|
// add value to output fields if not exist, remove if exist
|
|
|
- const newOutputFields = [...outputFields];
|
|
|
+ const newOutputFields = [...queryState.outputFields];
|
|
|
const values = e.target.value as string[];
|
|
|
const newFields = values.filter(
|
|
|
v => !newOutputFields.includes(v as string)
|
|
@@ -480,11 +470,14 @@ const CollectionData = (props: CollectionDataProps) => {
|
|
|
// sort output fields by schema order
|
|
|
newOutputFields.sort(
|
|
|
(a, b) =>
|
|
|
- fields.findIndex(f => f.name === a) -
|
|
|
- fields.findIndex(f => f.name === b)
|
|
|
+ queryState.fields.findIndex(f => f.name === a) -
|
|
|
+ queryState.fields.findIndex(f => f.name === b)
|
|
|
);
|
|
|
|
|
|
- setOutputFields(newOutputFields);
|
|
|
+ setQueryState({
|
|
|
+ ...queryState,
|
|
|
+ outputFields: newOutputFields,
|
|
|
+ });
|
|
|
}}
|
|
|
/>
|
|
|
<CustomButton
|
|
@@ -500,8 +493,8 @@ const CollectionData = (props: CollectionDataProps) => {
|
|
|
variant="contained"
|
|
|
onClick={() => {
|
|
|
setCurrentPage(0);
|
|
|
- if (expr !== expression) {
|
|
|
- setExpr(expression);
|
|
|
+ if (expr !== queryState.expr) {
|
|
|
+ setExpr(queryState.expr);
|
|
|
} else {
|
|
|
// ensure query
|
|
|
query();
|
|
@@ -515,7 +508,7 @@ const CollectionData = (props: CollectionDataProps) => {
|
|
|
</div>
|
|
|
<AttuGrid
|
|
|
toolbarConfigs={[]}
|
|
|
- colDefinitions={outputFields.map(i => {
|
|
|
+ colDefinitions={queryState.outputFields.map(i => {
|
|
|
return {
|
|
|
id: i,
|
|
|
align: 'left',
|