diff --git a/studio/components/interfaces/Vault/EncryptionKeySelector.tsx b/studio/components/interfaces/Settings/Vault/EncryptionKeySelector.tsx similarity index 100% rename from studio/components/interfaces/Vault/EncryptionKeySelector.tsx rename to studio/components/interfaces/Settings/Vault/EncryptionKeySelector.tsx diff --git a/studio/components/interfaces/Settings/Vault/EncryptionKeysManagement.tsx b/studio/components/interfaces/Settings/Vault/EncryptionKeysManagement.tsx new file mode 100644 index 00000000000..3aded6cb0a6 --- /dev/null +++ b/studio/components/interfaces/Settings/Vault/EncryptionKeysManagement.tsx @@ -0,0 +1,192 @@ +import { FC, Fragment, useState } from 'react' +import { Input, IconSearch, Listbox, Button, Divider, Modal, Form, IconHelpCircle } from 'ui' +import SecretRow from './SecretRow' +import EncryptionKeySelector from './EncryptionKeySelector' +import InformationBox from 'components/ui/InformationBox' + +interface Props {} + +const EncryptionKeysManagement: FC = ({}) => { + const [searchValue, setSearchValue] = useState('') + const [selectedSort, setSelectedSort] = useState('name') + const [showAddKeyModal, setShowAddKeyModal] = useState(false) + const [selectedKeyToRemove, setSelectedKeyToRemove] = useState() + + const mockEncryptionKeys = [ + { + created_at: Number(new Date()), + }, + { + created_at: Number(new Date()), + }, + { + created_at: Number(new Date()), + }, + ] + + return ( + <> +
+

Encryption Keys

+
+
+ setSearchValue(event.target.value)} + icon={} + /> +
+ + + Name + + + Created at + + +
+
+ +
+ + {/* Table of secrets */} + {/*
+ {secrets.map((secret, idx) => { + return ( + + + {idx !== mockSecrets.length - 1 && } + + ) + })} + {secrets.length === 0 && ( + <> + {searchValue.length === 0 ? ( +
+

No secrets added yet

+

+ The Vault allows you to store sensitive information like API keys +

+
+ ) : ( +
+

No results found

+

+ Your search for "{searchValue}" did not return any results +

+
+ )} + + )} +
*/} +
+ + setSelectedKeyToRemove(undefined)} + onConfirm={() => setSelectedKeyToRemove(undefined)} + header={
Confirm to delete secret
} + > +
+ +
+

+ The following secret will be permanently removed and cannot be recovered. Are you + sure? +

+
+

{selectedKeyToRemove?.description}

+

+ ID: {selectedKeyToRemove?.key_id} +

+
+
+
+
+
+ + setShowAddKeyModal(false)} + header={
Add new secret
} + > +
{}} + onSubmit={() => {}} + > + {({ isSubmitting }: any) => { + return ( +
+ +
+ + +
+
+ + +
+ console.log(key)} + /> + } + url="asd" + urlLabel="Vault documentation" + title="What is a Key ID?" + description={ +
+

+ Every secret in the Vault is encrypted with a Key ID. The Vault comes + with a default value for this Key ID which is sufficient for simple + purposes. +

+

+ However, you may also use a custom Key ID for more advanced use cases, + such as having different secrets visible to different users +

+
+ } + /> +
+
+ + +
+ + +
+
+
+ ) + }} +
+
+ + ) +} + +export default EncryptionKeysManagement diff --git a/studio/components/interfaces/Settings/Vault/SecretsManagement.tsx b/studio/components/interfaces/Settings/Vault/SecretsManagement.tsx index 5930c73b241..e684805dc90 100644 --- a/studio/components/interfaces/Settings/Vault/SecretsManagement.tsx +++ b/studio/components/interfaces/Settings/Vault/SecretsManagement.tsx @@ -3,7 +3,7 @@ import Divider from 'components/ui/Divider' import { IconSearch, Input, Button, Listbox, Modal, Form, IconHelpCircle } from 'ui' import SecretRow from './SecretRow' import InformationBox from 'components/ui/InformationBox' -import EncryptionKeySelector from 'components/interfaces/Vault/EncryptionKeySelector' +import { EncryptionKeySelector } from 'components/interfaces/Settings/Vault' interface Props {} diff --git a/studio/components/interfaces/Settings/Vault/index.ts b/studio/components/interfaces/Settings/Vault/index.ts index 065adfdaec3..9e6199acced 100644 --- a/studio/components/interfaces/Settings/Vault/index.ts +++ b/studio/components/interfaces/Settings/Vault/index.ts @@ -1,4 +1,6 @@ import VaultToggle from './VaultToggle' import SecretsManagement from './SecretsManagement' +import EncryptionKeySelector from './EncryptionKeySelector' +import EncryptionKeysManagement from './EncryptionKeysManagement' -export { VaultToggle, SecretsManagement } +export { VaultToggle, SecretsManagement, EncryptionKeySelector, EncryptionKeysManagement } diff --git a/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnEditor.tsx b/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnEditor.tsx index fd289ea5e56..98982a84edb 100644 --- a/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnEditor.tsx +++ b/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnEditor.tsx @@ -27,7 +27,7 @@ import { import { TEXT_TYPES } from '../SidePanelEditor.constants' import { ColumnField, CreateColumnPayload, UpdateColumnPayload } from '../SidePanelEditor.types' import { FormSection, FormSectionContent, FormSectionLabel } from 'components/ui/Forms' -import EncryptionKeySelector from 'components/interfaces/Vault/EncryptionKeySelector' +import { EncryptionKeySelector } from 'components/interfaces/Settings/Vault' interface Props { column?: PostgresColumn diff --git a/studio/pages/project/[ref]/settings/vault.tsx b/studio/pages/project/[ref]/settings/vault.tsx index 05b99784dc3..88956bf90db 100644 --- a/studio/pages/project/[ref]/settings/vault.tsx +++ b/studio/pages/project/[ref]/settings/vault.tsx @@ -1,13 +1,20 @@ import { observer } from 'mobx-react-lite' import { NextPageWithLayout } from 'types' import { SettingsLayout } from 'components/layouts' -import { VaultToggle, SecretsManagement } from 'components/interfaces/Settings/Vault' +import { + VaultToggle, + SecretsManagement, + EncryptionKeysManagement, +} from 'components/interfaces/Settings/Vault' const VaultSettings: NextPageWithLayout = () => { return (
+ {/* Show encryption keys table if vault extension is enabled */} + + {/* Show secrets table if vault extension is enabled */}