diff --git a/src/frontend/src/components/tableAutoCellRender/index.tsx b/src/frontend/src/components/tableAutoCellRender/index.tsx index 5c59f6430..37f58f3ac 100644 --- a/src/frontend/src/components/tableAutoCellRender/index.tsx +++ b/src/frontend/src/components/tableAutoCellRender/index.tsx @@ -24,7 +24,6 @@ export default function TableAutoCellRender({ } break; case "string": - console.log(isTimeStampString(value), value); if (isTimeStampString(value)) { return ; } diff --git a/src/frontend/src/components/tableComponent/index.tsx b/src/frontend/src/components/tableComponent/index.tsx index 6113316be..42211b3a8 100644 --- a/src/frontend/src/components/tableComponent/index.tsx +++ b/src/frontend/src/components/tableComponent/index.tsx @@ -1,7 +1,7 @@ import "ag-grid-community/styles/ag-grid.css"; // Mandatory CSS required by the grid import "ag-grid-community/styles/ag-theme-quartz.css"; // Optional Theme applied to the grid import { AgGridReact, AgGridReactProps } from "ag-grid-react"; -import { ElementRef, forwardRef, useCallback } from "react"; +import { ElementRef, forwardRef } from "react"; import { DEFAULT_TABLE_ALERT_MSG, DEFAULT_TABLE_ALERT_TITLE, @@ -46,7 +46,6 @@ const TableComponent = forwardRef< ); } - return (
{ + console.log(params); + + return params.data.id; + }} />
); diff --git a/src/frontend/src/modals/editNodeModal/index.tsx b/src/frontend/src/modals/editNodeModal/index.tsx index 548dfebb3..417b5bbb9 100644 --- a/src/frontend/src/modals/editNodeModal/index.tsx +++ b/src/frontend/src/modals/editNodeModal/index.tsx @@ -1,21 +1,17 @@ -import { cloneDeep } from "lodash"; -import { forwardRef, useEffect, useRef, useState } from "react"; -import IconComponent from "../../components/genericIconComponent"; -import { Badge } from "../../components/ui/badge"; -import { - LANGFLOW_SUPPORTED_TYPES, - limitScrollFieldsModal, -} from "../../constants/constants"; -import useFlowStore from "../../stores/flowStore"; -import { NodeDataType } from "../../types/flow"; -import { classNames } from "../../utils/utils"; -import BaseModal from "../baseModal"; -import TableComponent from "../../components/tableComponent"; -import TableAutoCellRender from "../../components/tableAutoCellRender"; -import { TemplateVariableType } from "../../types/api"; -import TableNodeCellRender from "../../components/tableNodeCellRender"; import { ColDef, ValueGetterParams } from "ag-grid-community"; +import { forwardRef, useEffect, useRef } from "react"; +import IconComponent from "../../components/genericIconComponent"; +import TableAutoCellRender from "../../components/tableAutoCellRender"; +import TableComponent from "../../components/tableComponent"; +import TableNodeCellRender from "../../components/tableNodeCellRender"; import TableTooltipRender from "../../components/tableTooltipRender"; +import ToggleShadComponent from "../../components/toggleShadComponent"; +import { Badge } from "../../components/ui/badge"; +import { LANGFLOW_SUPPORTED_TYPES } from "../../constants/constants"; +import useFlowStore from "../../stores/flowStore"; +import { TemplateVariableType } from "../../types/api"; +import { NodeDataType } from "../../types/flow"; +import BaseModal from "../baseModal"; const EditNodeModal = forwardRef( ( @@ -42,7 +38,7 @@ const EditNodeModal = forwardRef( function changeAdvanced(n) { myData.current.node!.template[n].advanced = - !myData.current.node!.template[n].advanced; + !myData.current.node!.template[n]?.advanced; } const handleOnNewValue = (newValue: any, name) => { @@ -51,7 +47,7 @@ const EditNodeModal = forwardRef( useEffect(() => { if (open) { - myData.current = data; // reset data to what it is on node when opening modal + myData.current = data; } }, [open]); @@ -77,6 +73,7 @@ const EditNodeModal = forwardRef( return { ...templateParam, key: key, + id: key, }; }); @@ -127,18 +124,25 @@ const EditNodeModal = forwardRef( { headerName: "Show", field: "advanced", - cellRenderer: "agCheckboxCellRenderer", - cellEditor: "agCheckboxCellEditor", - valueGetter: (params) => { - return !params.data.advanced; + cellRenderer: (params) => { + const templateParam = params.data; + return ( + <> + { + changeAdvanced(params.data.key); + }} + size="small" + editNode={true} + /> + + ); }, - valueSetter: (params) => { - changeAdvanced(params.data.key); - return true; - }, - editable: true, - flex: 1, - maxWidth: 70, + + editable: false, + maxWidth: 80, resizable: false, }, ]; diff --git a/src/frontend/src/pages/SettingsPage/pages/ApiKeysPage/components/ApiKeyHeader/index.tsx b/src/frontend/src/pages/SettingsPage/pages/ApiKeysPage/components/ApiKeyHeader/index.tsx new file mode 100644 index 000000000..cdd7c7c27 --- /dev/null +++ b/src/frontend/src/pages/SettingsPage/pages/ApiKeysPage/components/ApiKeyHeader/index.tsx @@ -0,0 +1,58 @@ +import ForwardedIconComponent from "../../../../../../components/genericIconComponent"; +import { Button } from "../../../../../../components/ui/button"; +import { API_PAGE_PARAGRAPH } from "../../../../../../constants/constants"; +import SecretKeyModal from "../../../../../../modals/secretKeyModal"; +import { cn } from "../../../../../../utils/utils"; + +type ApiKeyHeaderComponentProps = { + selectedRows: string[]; + handleDeleteKey: () => void; + fetchApiKeys: () => void; + userId: string; +}; +const ApiKeyHeaderComponent = ({ + selectedRows, + handleDeleteKey, + fetchApiKeys, + userId, +}: ApiKeyHeaderComponentProps) => { + return ( + <> +
+
+

+ API Keys + +

+

{API_PAGE_PARAGRAPH}

+
+
+ + + + +
+
+ + ); +}; +export default ApiKeyHeaderComponent; diff --git a/src/frontend/src/pages/SettingsPage/pages/ApiKeysPage/helpers/column-defs.ts b/src/frontend/src/pages/SettingsPage/pages/ApiKeysPage/helpers/column-defs.ts new file mode 100644 index 000000000..b9845098a --- /dev/null +++ b/src/frontend/src/pages/SettingsPage/pages/ApiKeysPage/helpers/column-defs.ts @@ -0,0 +1,40 @@ +import TableAutoCellRender from "../../../../../components/tableAutoCellRender"; + +export const getColumnDefs = () => { + return [ + { + headerCheckboxSelection: true, + checkboxSelection: true, + showDisabledCheckboxes: true, + headerName: "Name", + field: "name", + cellRenderer: TableAutoCellRender, + flex: 2, + }, + { + headerName: "Key", + field: "api_key", + cellRenderer: TableAutoCellRender, + flex: 1, + }, + { + headerName: "Created", + field: "created_at", + cellRenderer: TableAutoCellRender, + flex: 1, + }, + { + headerName: "Last Used", + field: "last_used_at", + cellRenderer: TableAutoCellRender, + flex: 1, + }, + { + headerName: "Total Uses", + field: "total_uses", + cellRenderer: TableAutoCellRender, + flex: 1, + resizable: false, + }, + ]; +}; diff --git a/src/frontend/src/pages/SettingsPage/pages/ApiKeysPage/hooks/use-api-keys.tsx b/src/frontend/src/pages/SettingsPage/pages/ApiKeysPage/hooks/use-api-keys.tsx new file mode 100644 index 000000000..8af9b4a0b --- /dev/null +++ b/src/frontend/src/pages/SettingsPage/pages/ApiKeysPage/hooks/use-api-keys.tsx @@ -0,0 +1,26 @@ +import { getApiKey } from "../../../../../controllers/API"; + +const useApiKeys = (userData, setLoadingKeys, keysList, setUserId) => { + const fetchApiKeys = () => { + setLoadingKeys(true); + getApiKey() + .then((keys) => { + keysList.current = keys["api_keys"].map((apikey) => ({ + ...apikey, + name: apikey.name && apikey.name !== "" ? apikey.name : "Untitled", + last_used_at: apikey.last_used_at ?? "Never", + })); + setUserId(keys["user_id"]); + setLoadingKeys(false); + }) + .catch((error) => { + setLoadingKeys(false); + }); + }; + + return { + fetchApiKeys, + }; +}; + +export default useApiKeys; diff --git a/src/frontend/src/pages/SettingsPage/pages/ApiKeysPage/hooks/use-handle-delete-key.tsx b/src/frontend/src/pages/SettingsPage/pages/ApiKeysPage/hooks/use-handle-delete-key.tsx new file mode 100644 index 000000000..74d5dae99 --- /dev/null +++ b/src/frontend/src/pages/SettingsPage/pages/ApiKeysPage/hooks/use-handle-delete-key.tsx @@ -0,0 +1,42 @@ +import { + DEL_KEY_ERROR_ALERT, + DEL_KEY_ERROR_ALERT_PLURAL, + DEL_KEY_SUCCESS_ALERT, + DEL_KEY_SUCCESS_ALERT_PLURAL, +} from "../../../../../constants/alerts_constants"; +import { deleteApiKey } from "../../../../../controllers/API"; + +const useDeleteApiKeys = ( + selectedRows, + resetFilter, + setSuccessData, + setErrorData, +) => { + const handleDeleteKey = () => { + Promise.all(selectedRows.map((selectedRow) => deleteApiKey(selectedRow))) + .then(() => { + resetFilter(); + setSuccessData({ + title: + selectedRows.length === 1 + ? DEL_KEY_SUCCESS_ALERT + : DEL_KEY_SUCCESS_ALERT_PLURAL, + }); + }) + .catch((error) => { + setErrorData({ + title: + selectedRows.length === 1 + ? DEL_KEY_ERROR_ALERT + : DEL_KEY_ERROR_ALERT_PLURAL, + list: [error?.response?.data?.detail], + }); + }); + }; + + return { + handleDeleteKey, + }; +}; + +export default useDeleteApiKeys; diff --git a/src/frontend/src/pages/SettingsPage/pages/ApiKeysPage/index.tsx b/src/frontend/src/pages/SettingsPage/pages/ApiKeysPage/index.tsx index d78a65afb..8efa2e3f9 100644 --- a/src/frontend/src/pages/SettingsPage/pages/ApiKeysPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/ApiKeysPage/index.tsx @@ -1,37 +1,13 @@ -import IconComponent from "../../../../components/genericIconComponent"; -import { Button } from "../../../../components/ui/button"; - -import { ColDef, ColGroupDef, SelectionChangedEvent } from "ag-grid-community"; +import { SelectionChangedEvent } from "ag-grid-community"; import { useContext, useEffect, useRef, useState } from "react"; -import AddNewVariableButton from "../../../../components/addNewVariableButtonComponent/addNewVariableButton"; -import Dropdown from "../../../../components/dropdownComponent"; -import ForwardedIconComponent from "../../../../components/genericIconComponent"; import TableComponent from "../../../../components/tableComponent"; -import { Badge } from "../../../../components/ui/badge"; import { Card, CardContent } from "../../../../components/ui/card"; -import { - deleteApiKey, - deleteGlobalVariable, - getApiKey, -} from "../../../../controllers/API"; -import useAlertStore from "../../../../stores/alertStore"; -import { useGlobalVariablesStore } from "../../../../stores/globalVariablesStore/globalVariables"; -import { cn } from "../../../../utils/utils"; -import { - API_PAGE_PARAGRAPH, - LAST_USED_SPAN_1, - LAST_USED_SPAN_2, -} from "../../../../constants/constants"; -import TableAutoCellRender from "../../../../components/tableAutoCellRender"; -import { - DEL_KEY_SUCCESS_ALERT, - DEL_KEY_ERROR_ALERT, - DEL_KEY_SUCCESS_ALERT_PLURAL, - DEL_KEY_ERROR_ALERT_PLURAL, -} from "../../../../constants/alerts_constants"; import { AuthContext } from "../../../../contexts/authContext"; -import { ApiKey } from "../../../../types/components"; -import SecretKeyModal from "../../../../modals/secretKeyModal"; +import useAlertStore from "../../../../stores/alertStore"; +import ApiKeyHeaderComponent from "./components/ApiKeyHeader"; +import { getColumnDefs } from "./helpers/column-defs"; +import useApiKeys from "./hooks/use-api-keys"; +import useDeleteApiKeys from "./hooks/use-handle-delete-key"; export default function ApiKeysPage() { const [loadingKeys, setLoadingKeys] = useState(true); @@ -43,138 +19,37 @@ export default function ApiKeysPage() { const keysList = useRef([]); useEffect(() => { - getKeys(); + fetchApiKeys(); }, [userData]); - function getKeys() { - setLoadingKeys(true); - if (userData) { - getApiKey() - .then((keys: [ApiKey]) => { - keysList.current = keys["api_keys"].map((apikey: ApiKey) => ({ - ...apikey, - name: apikey.name && apikey.name !== "" ? apikey.name : "Untitled", - last_used_at: apikey.last_used_at ?? "Never", - })); - setUserId(keys["user_id"]); - setLoadingKeys(false); - }) - .catch((error) => { - setLoadingKeys(false); - }); - } - } + const { fetchApiKeys } = useApiKeys( + userData, + setLoadingKeys, + keysList, + setUserId, + ); function resetFilter() { - getKeys(); + fetchApiKeys(); } - function handleDeleteKey() { - Promise.all(selectedRows.map((selectedRow) => deleteApiKey(selectedRow))) - .then((res) => { - resetFilter(); - setSuccessData({ - title: - selectedRows.length === 1 - ? DEL_KEY_SUCCESS_ALERT - : DEL_KEY_SUCCESS_ALERT_PLURAL, - }); - }) - .catch((error) => { - setErrorData({ - title: - selectedRows.length === 1 - ? DEL_KEY_ERROR_ALERT - : DEL_KEY_ERROR_ALERT_PLURAL, - list: [error["response"]["data"]["detail"]], - }); - }); - } + const { handleDeleteKey } = useDeleteApiKeys( + selectedRows, + resetFilter, + setSuccessData, + setErrorData, + ); - function lastUsedMessage() { - return ( -
- - {LAST_USED_SPAN_1} -

{LAST_USED_SPAN_2} -
-
- ); - } - - const columnDefs = [ - { - headerCheckboxSelection: true, - checkboxSelection: true, - showDisabledCheckboxes: true, - headerName: "Name", - field: "name", - cellRenderer: TableAutoCellRender, - flex: 2, - }, - { - headerName: "Key", - field: "api_key", - cellRenderer: TableAutoCellRender, - flex: 1, - }, - { - headerName: "Created", - field: "created_at", - cellRenderer: TableAutoCellRender, - flex: 1, - }, - { - headerName: "Last Used", - field: "last_used_at", - cellRenderer: TableAutoCellRender, - flex: 1, - }, - { - headerName: "Total Uses", - field: "total_uses", - cellRenderer: TableAutoCellRender, - flex: 1, - resizable: false, - }, - ]; + const columnDefs = getColumnDefs(); return (
-
-
-

- API Keys - -

-

{API_PAGE_PARAGRAPH}

-
-
- - - - -
-
+
diff --git a/src/frontend/src/types/components/index.ts b/src/frontend/src/types/components/index.ts index b87f3c57d..ee7c1cd83 100644 --- a/src/frontend/src/types/components/index.ts +++ b/src/frontend/src/types/components/index.ts @@ -38,7 +38,7 @@ export type InputComponentType = { export type ToggleComponentType = { enabled: boolean; setEnabled: (state: boolean) => void; - disabled: boolean | undefined; + disabled?: boolean | undefined; size: "small" | "medium" | "large"; id?: string; editNode?: boolean;