import * as React from 'react';
import { connect } from 'react-redux';
import { IColumnsState } from 'src/pages/VersionDashboard/AddProjectForm/types';
import { FormField } from 'mineral-ui/Form';
import Grid, { GridItem } from 'mineral-ui/Grid';
import Select from 'mineral-ui/Select';
import TextInput from 'mineral-ui/TextInput';
import Component from 'react-component-component';
import { withDebouncedOnChange } from 'src/utils/';
import { ISortEventData } from '../AggsStateEditor/SortableAggsStateList';
import {
IReduxExternalProps,
IReduxStateProps,
IReduxDisplatProps,
mapStateToProps,
mapDispatchToProps,
} from './ReduxContainer';
import SortableColumnsList from './SortableColumnsList';
import { booleanFilterOptions } from 'src/pages/ConfigEditorDashboard/AggsStateEditor';
import { ISelectOption } from '../ExtendedMappingEditor/FieldsFilterDisplay';
interface IExternalProps extends IReduxExternalProps {}
type ColumnConfig = IColumnsState['columns'][0];
export type TColumnWithIndex = ColumnConfig & {
index: number;
};
const DebouncedInput = withDebouncedOnChange()(TextInput);
export default connect(
mapStateToProps,
mapDispatchToProps,
)(
({
columnsState,
graphqlField,
onFieldSortChange,
}: IExternalProps & IReduxStateProps & IReduxDisplatProps) => {
if (!columnsState) {
return
LOADING... | null
;
}
interface IFilterState {
fieldFilter: string;
show: string | null;
sortable: string | null;
}
interface ICustomColumnConfig extends ColumnConfig {}
interface IFilterStateContainer {
state: { filter: IFilterState; customColumn: ICustomColumnConfig };
setState: (s: IFilterStateContainer['state']) => void;
}
const { columns } = columnsState;
/* TODO: implement adding custom columns */
const emptyCustomColumn: ICustomColumnConfig = {
field: '',
canChangeShow: false,
show: false,
sortable: false,
accessor: '',
jsonPath: '',
query: '',
type: '',
id: null,
};
const initialState: IFilterStateContainer['state'] = {
filter: { fieldFilter: '', show: null, sortable: null },
customColumn: emptyCustomColumn,
};
const columnsWithIndex: TColumnWithIndex[] = columns.map((col, index) => ({
...col,
index,
}));
const onSortEnd = (filteredFields: TColumnWithIndex[]) => (data: ISortEventData) => {
const currentItemAtNewIndex = filteredFields[data.newIndex];
const unfilteredNewIndex = currentItemAtNewIndex.index;
const fieldToMove = filteredFields[data.oldIndex];
onFieldSortChange({
oldIndex: fieldToMove.index,
newIndex: unfilteredNewIndex,
});
};
const onFieldFilterChange = (s: IFilterStateContainer) => (
e: React.SyntheticEvent,
) => {
s.setState({
...s.state,
filter: {
...s.state.filter,
fieldFilter: e.currentTarget.value,
},
});
};
const onColumnShowFilterSelect = (s: IFilterStateContainer) => (o: ISelectOption) => {
s.setState({
...s.state,
filter: {
...s.state.filter,
show: o.value,
},
});
};
const onColumnSortableFilterSelect = (s: IFilterStateContainer) => (o: ISelectOption) => {
s.setState({
...s.state,
filter: {
...s.state.filter,
sortable: o.value,
},
});
};
const getFilteredColumns = (s: IFilterStateContainer) =>
columnsWithIndex.filter(
(c) =>
c.field.includes(s.state.filter.fieldFilter) &&
(s.state.filter.show !== null ? String(c.show) === s.state.filter.show : true) &&
(s.state.filter.sortable !== null
? String(c.sortable) === s.state.filter.sortable
: true),
);
return (
{(s: IFilterStateContainer) => {
const filteredFields = getFilteredColumns(s);
return (
);
}}
);
},
);