diff --git a/src/components/configuration-modal-form.tsx b/src/components/configuration-modal-form.tsx index aa68b47..422bafc 100644 --- a/src/components/configuration-modal-form.tsx +++ b/src/components/configuration-modal-form.tsx @@ -15,6 +15,7 @@ const ConfigurationModalFormComponent: React.FC< columnKeys, selectOptions, handleSetConfigurations, + isLoading, }) => { return ( <> @@ -82,6 +83,7 @@ const ConfigurationModalFormComponent: React.FC< type="primary" onClick={handleSetConfigurations} className="addColumnButton" + loading={isLoading} > Generate Datagrid diff --git a/src/components/datagrid-widget.tsx b/src/components/datagrid-widget.tsx index f79262f..b940fe8 100644 --- a/src/components/datagrid-widget.tsx +++ b/src/components/datagrid-widget.tsx @@ -17,6 +17,26 @@ const DatagridWidgetComponent: React.FC = ({ setSortedInfo(sorter); }; + //change color of negative values to red + const renderIntegerColumn = (value: number) => { + const textStyle = { + color: value < 0 ? "red" : "blue", + }; + return {value}; + }; + //updated column definition for antd table + const updatedColumns = columns.map((column) => { + const dataIndex = column.dataIndex; + const fetchedDataType = typeof data[0][dataIndex]; + if (fetchedDataType === "number") { + return { + ...column, + render: (text: any) => renderIntegerColumn(text), + }; + } + return column; + }); + const sortedData = React.useMemo(() => { if (!sortedInfo.columnKey || !sortedInfo.order) { return data; @@ -71,7 +91,30 @@ const DatagridWidgetComponent: React.FC = ({ dataSource={dataList} renderItem={(item) => ( - + 0 ? ( + {item.title} + ) : ( + {item.title} + ) + ) : ( + {item.title} + ) + } + description={ + typeof item.subtitle === "number" ? ( + item.subtitle > 0 ? ( + {item.subtitle} + ) : ( + {item.subtitle} + ) + ) : ( + {item.subtitle} + ) + } + /> )} /> @@ -81,7 +124,7 @@ const DatagridWidgetComponent: React.FC = ({ return (
= ({ const [columnsData, setColumnsData] = useState([]); const [apiURL, setApiURL] = useState(""); const [errorVisible, setErrorVisible] = useState(false); - + const [isLoading, setIsLoading]= useState(false); const handleAddColumn = () => { setDisplayTable(false); setColumnId((prevCount) => prevCount + 1); @@ -75,6 +75,7 @@ const ConfigurationModalForm: React.FC = ({ return; } try { + setIsLoading(true); const fetchedData = await FetchAPIData({ APIURL: apiURL, columns: columnsData, @@ -84,6 +85,9 @@ const ConfigurationModalForm: React.FC = ({ } catch (error) { console.error("Error fetching data:", error); } + finally{ + setIsLoading(false); + } }; useEffect(() => { @@ -123,6 +127,7 @@ const ConfigurationModalForm: React.FC = ({ columnKeys={columnKeys} selectOptions={selectOptions} handleSetConfigurations={handleSetConfigurations} + isLoading={isLoading} /> ); }; diff --git a/src/containers/datagrid-widget.tsx b/src/containers/datagrid-widget.tsx index 6f5daca..e18ae56 100644 --- a/src/containers/datagrid-widget.tsx +++ b/src/containers/datagrid-widget.tsx @@ -36,6 +36,7 @@ const DatagridWidget: React.FC = ({ title: config.label, dataIndex: config.key, key: config.key, + type: config.type, //add data type to table columns data sorter: true, })); setColumns(tableColumns); diff --git a/src/services/fetch-API-data.ts b/src/services/fetch-API-data.ts index cd8cdbe..b2bac95 100644 --- a/src/services/fetch-API-data.ts +++ b/src/services/fetch-API-data.ts @@ -10,7 +10,7 @@ interface FetchAPIDataProps { const FetchAPIData = async ({ APIURL, columns }: FetchAPIDataProps) => { try { - const response = await axios.get(APIURL); + const response = await axios.get(APIURL, {timeout: 10000}); const data = response.data; const processedData: Record = {}; const mismatchedDataTypes: string[] = []; diff --git a/src/types/configuration-modal-form-type.ts b/src/types/configuration-modal-form-type.ts index 0584667..2a8602d 100644 --- a/src/types/configuration-modal-form-type.ts +++ b/src/types/configuration-modal-form-type.ts @@ -17,4 +17,5 @@ export interface ConfigurationModalFormComponentProps { columnKeys: number[]; selectOptions: any; handleSetConfigurations: () => void; + isLoading: boolean; }