From 1e2adb2b284faa1c4e44e3c464b211297ad1af88 Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Mon, 2 Mar 2026 01:58:34 +0000 Subject: [PATCH] Implemented multiple app passwords. --- assets/icons/apppasswordicon.svg | 8 + .../Dashboard/Management/AppPasswords.jsx | 99 ++++++++ .../AppPasswords/AppPasswordInfo.jsx | 212 ++++++++++++++++++ .../AppPasswords/NewAppPassword.jsx | 91 ++++++++ .../RegenerateAppPasswordSecret.jsx | 77 +++++++ .../Management/ManagementSidebar.jsx | 8 + .../Dashboard/Management/Users/UserInfo.jsx | 49 +++- .../Dashboard/common/ObjectActions.jsx | 8 +- .../Dashboard/common/ObjectTable.jsx | 7 +- .../Dashboard/context/ActionsModalContext.jsx | 4 +- src/components/Icons/AppPasswordIcon.jsx | 6 + src/database/ObjectModels.js | 3 + src/database/models/AppPassword.js | 139 ++++++++++++ src/database/models/User.js | 14 +- src/routes/ManagementRoutes.jsx | 12 + 15 files changed, 717 insertions(+), 20 deletions(-) create mode 100644 assets/icons/apppasswordicon.svg create mode 100644 src/components/Dashboard/Management/AppPasswords.jsx create mode 100644 src/components/Dashboard/Management/AppPasswords/AppPasswordInfo.jsx create mode 100644 src/components/Dashboard/Management/AppPasswords/NewAppPassword.jsx create mode 100644 src/components/Dashboard/Management/AppPasswords/RegenerateAppPasswordSecret.jsx create mode 100644 src/components/Icons/AppPasswordIcon.jsx create mode 100644 src/database/models/AppPassword.js diff --git a/assets/icons/apppasswordicon.svg b/assets/icons/apppasswordicon.svg new file mode 100644 index 0000000..d74a6e7 --- /dev/null +++ b/assets/icons/apppasswordicon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/components/Dashboard/Management/AppPasswords.jsx b/src/components/Dashboard/Management/AppPasswords.jsx new file mode 100644 index 0000000..b9d31ef --- /dev/null +++ b/src/components/Dashboard/Management/AppPasswords.jsx @@ -0,0 +1,99 @@ +import { useRef, useState } from 'react' +import { Button, Flex, Space, Modal, Dropdown } from 'antd' +import NewAppPassword from './AppPasswords/NewAppPassword' +import useColumnVisibility from '../hooks/useColumnVisibility' +import ColumnViewButton from '../common/ColumnViewButton' +import ObjectTable from '../common/ObjectTable' +import PlusIcon from '../../Icons/PlusIcon' +import ReloadIcon from '../../Icons/ReloadIcon' +import ListIcon from '../../Icons/ListIcon' +import GridIcon from '../../Icons/GridIcon' +import useViewMode from '../hooks/useViewMode' +import ExportListButton from '../common/ExportListButton' + +const AppPasswords = () => { + const [newAppPasswordOpen, setNewAppPasswordOpen] = useState(false) + const tableRef = useRef() + + const [viewMode, setViewMode] = useViewMode('appPassword') + const [columnVisibility, setColumnVisibility] = + useColumnVisibility('appPassword') + + const actionItems = { + items: [ + { + label: 'New App Password', + key: 'newAppPassword', + icon: + }, + { type: 'divider' }, + { + label: 'Reload List', + key: 'reloadList', + icon: + } + ], + onClick: ({ key }) => { + if (key === 'reloadList') { + tableRef.current?.reload() + } else if (key === 'newAppPassword') { + setNewAppPasswordOpen(true) + } + } + } + + return ( + <> + + + + + + + + + + +