diff --git a/frontend/public/data/frequentInterfaces.ts b/frontend/public/data/frequentInterfaces.ts index fa6c73a57..953096e1d 100644 --- a/frontend/public/data/frequentInterfaces.ts +++ b/frontend/public/data/frequentInterfaces.ts @@ -13,6 +13,7 @@ export interface SecretDataProps { value: string | undefined; valueOverride: string | undefined; id: string; + idOverride?: string; comment: string; tags: Tag[]; } \ No newline at end of file diff --git a/frontend/src/components/dashboard/DashboardInputField.tsx b/frontend/src/components/dashboard/DashboardInputField.tsx index 3e171b722..f9fb39d7e 100644 --- a/frontend/src/components/dashboard/DashboardInputField.tsx +++ b/frontend/src/components/dashboard/DashboardInputField.tsx @@ -99,8 +99,8 @@ const DashboardInputField = ({ /> )} - {!error &&
+
@@ -166,7 +166,7 @@ export default function Navbar() { leaveFrom="transform opacity-100 scale-100" leaveTo="transform opacity-0 scale-95" > - +
{t('nav:user.signed-in-as')} diff --git a/frontend/src/ee/components/PITRecoverySidebar.tsx b/frontend/src/ee/components/PITRecoverySidebar.tsx index 24b58eb0f..e72f05cc9 100644 --- a/frontend/src/ee/components/PITRecoverySidebar.tsx +++ b/frontend/src/ee/components/PITRecoverySidebar.tsx @@ -102,7 +102,9 @@ const PITRecoverySidebar = ({ toggleSidebar, setSnapshotData, chosenSnapshot }: }); } - const decryptedSecretVersions = secretSnapshotData.secretVersions.map( + const decryptedSecretVersions = secretSnapshotData.secretVersions.filter( + (sv: EncrypetedSecretVersionListProps) => (sv.type !== undefined && sv.environment !== undefined) + ).map( (encryptedSecretVersion: EncrypetedSecretVersionListProps, pos: number) => ({ id: encryptedSecretVersion._id, pos, @@ -125,10 +127,13 @@ const PITRecoverySidebar = ({ toggleSidebar, setSnapshotData, chosenSnapshot }: ); const secretKeys = [ - ...new Set(decryptedSecretVersions.map((secret: SecretDataProps) => secret.key)) + ...new Set(decryptedSecretVersions.filter((dsv: any) => dsv.type !== undefined || dsv.environemnt !== undefined) + .map((secret: SecretDataProps) => secret.key)) ]; - const result = secretKeys.map((key, index) => ({ + const result = secretKeys.map((key, index) => (decryptedSecretVersions.filter( + (secret: SecretDataProps) => secret.key === key && secret.type === 'shared' + )[0]?.id ? { id: decryptedSecretVersions.filter( (secret: SecretDataProps) => secret.key === key && secret.type === 'shared' )[0].id, @@ -146,6 +151,24 @@ const PITRecoverySidebar = ({ toggleSidebar, setSnapshotData, chosenSnapshot }: valueOverride: decryptedSecretVersions.filter( (secret: SecretDataProps) => secret.key === key && secret.type === 'personal' )[0]?.value + } : { + id: decryptedSecretVersions.filter( + (secret: SecretDataProps) => secret.key === key && secret.type === 'personal' + )[0].id, + pos: index, + key, + environment: decryptedSecretVersions.filter( + (secret: SecretDataProps) => secret.key === key && secret.type === 'personal' + )[0].environment, + tags: decryptedSecretVersions.filter( + (secret: SecretDataProps) => secret.key === key && secret.type === 'personal' + )[0].tags, + value: decryptedSecretVersions.filter( + (secret: SecretDataProps) => secret.key === key && secret.type === 'shared' + )[0]?.value, + valueOverride: decryptedSecretVersions.filter( + (secret: SecretDataProps) => secret.key === key && secret.type === 'personal' + )[0]?.value })); setSnapshotData({ @@ -161,7 +184,7 @@ const PITRecoverySidebar = ({ toggleSidebar, setSnapshotData, chosenSnapshot }:
{isLoading ? (
diff --git a/frontend/src/pages/dashboard/[id].tsx b/frontend/src/pages/dashboard/[id].tsx index 484f4c290..fd43616a3 100644 --- a/frontend/src/pages/dashboard/[id].tsx +++ b/frontend/src/pages/dashboard/[id].tsx @@ -332,27 +332,27 @@ export default function Dashboard() { }; const modifyValue = (value: string, id: string) => { - setData((oldData) => oldData?.map((e) => (e.id === id ? { ...e, value } : e))); + setData((oldData) => oldData?.map((e) => ((e.id ? e.id : e.idOverride) === id ? { ...e, value } : e))); setHasUnsavedChanges(true); }; const modifyValueOverride = (valueOverride: string | undefined, id: string) => { - setData((oldData) => oldData?.map((e) => (e.id === id ? { ...e, valueOverride } : e))); + setData((oldData) => oldData?.map((e) => ((e.id ? e.id : e.idOverride) === id ? { ...e, valueOverride } : e))); setHasUnsavedChanges(true); }; const modifyKey = (key: string, id: string) => { - setData((oldData) => oldData?.map((e) => (e.id === id ? { ...e, key } : e))); + setData((oldData) => oldData?.map((e) => ((e.id ? e.id : e.idOverride) === id ? { ...e, key } : e))); setHasUnsavedChanges(true); }; const modifyComment = (comment: string, id: string) => { - setData((oldData) => oldData?.map((e) => (e.id === id ? { ...e, comment } : e))); + setData((oldData) => oldData?.map((e) => ((e.id ? e.id : e.idOverride) === id ? { ...e, comment } : e))); setHasUnsavedChanges(true); }; const modifyTags = (tags: Tag[], id: string) => { - setData((oldData) => oldData?.map((e) => (e.id === id ? { ...e, tags } : e))); + setData((oldData) => oldData?.map((e) => ((e.id ? e.id : e.idOverride) === id ? { ...e, tags } : e))); setHasUnsavedChanges(true); }; @@ -444,7 +444,8 @@ export default function Dashboard() { initialData! .filter( (initDataPoint) => - newData!.map((dataPoint) => dataPoint.id).includes(initDataPoint.id) && + newData!.filter((dataPoint) => dataPoint.id) + .map((dataPoint) => dataPoint.id).includes(initDataPoint.id) && (newData!.filter((dataPoint) => dataPoint.id === initDataPoint.id)[0].value !== initDataPoint.value || newData!.filter((dataPoint) => dataPoint.id === initDataPoint.id)[0].key !== @@ -477,7 +478,7 @@ export default function Dashboard() { const overridesToBeAdded = newOverrides! .filter( (newDataPoint) => - !initOverrides.map((initDataPoint) => initDataPoint.id).includes(newDataPoint.id) + !initOverrides.map((initDataPoint) => initDataPoint.idOverride).includes(newDataPoint.idOverride) ) .map((override) => ({ pos: override.pos, @@ -496,18 +497,21 @@ export default function Dashboard() { initOverrides .filter( (initDataPoint) => - newOverrides!.map((dataPoint) => dataPoint.id).includes(initDataPoint.id) && - (newOverrides!.filter((dataPoint) => dataPoint.id === initDataPoint.id)[0] + newOverrides!.map((dataPoint) => dataPoint.idOverride) + .includes(initDataPoint.idOverride) && + (newOverrides!.filter((dataPoint) => dataPoint.idOverride === initDataPoint.idOverride)[0] .valueOverride !== initDataPoint.valueOverride || - newOverrides!.filter((dataPoint) => dataPoint.id === initDataPoint.id)[0].key !== - initDataPoint.key || - newOverrides!.filter((dataPoint) => dataPoint.id === initDataPoint.id)[0] - .comment !== initDataPoint.comment || - JSON.stringify(newOverrides!.filter((dataPoint) => dataPoint.id === initDataPoint.id)[0]?.tags) !== - JSON.stringify(initDataPoint?.tags)) + newOverrides!.filter((dataPoint) => dataPoint.idOverride === initDataPoint.idOverride)[0].key !== + initDataPoint.key || + (newOverrides!.filter((dataPoint) => dataPoint.idOverride === initDataPoint.idOverride)[0] + .comment || '') !== (initDataPoint.comment || '') + || + (JSON.stringify(newOverrides!.filter((dataPoint) => dataPoint.idOverride === initDataPoint.idOverride)[0]?.tags) || '') !== + (JSON.stringify(initDataPoint?.tags) || '') + ) ) - .map((secret) => secret.id) - .includes(newDataPoint.id) + .map((secret) => secret.idOverride) + .includes(newDataPoint.idOverride) ) .map((override) => ({ pos: override.pos, @@ -665,7 +669,7 @@ export default function Dashboard() { idOverride: tempDecryptedSecrets.filter( (secret) => secret.key === key && secret.type === 'personal' )[0]?.id, - pos: (newData?.filter(dp => !dp.id.includes('-'))?.length ?? 0) + index, + pos: (newData?.filter(dp => !dp.id?.includes('-'))?.length ?? 0) + index, key, value: tempDecryptedSecrets.filter( (secret) => secret.key === key && secret.type === 'shared' @@ -681,8 +685,8 @@ export default function Dashboard() { )[0]?.tags })); - setInitialData(structuredClone(newData?.filter(dp => !dp.id.includes('-')).concat(formattedNewDecryptedKeys.filter(dk => dk.id)))); - setData(structuredClone(newData?.filter(dp => !dp.id.includes('-')).concat(formattedNewDecryptedKeys.filter(dk => dk.id)))) + setInitialData(structuredClone(newData?.filter(dp => !dp.id?.includes('-')).concat(formattedNewDecryptedKeys.filter(dk => dk.id)))); + setData(structuredClone(newData?.filter(dp => !dp.id?.includes('-')).concat(formattedNewDecryptedKeys.filter(dk => dk.id)))) } else { setInitialData(structuredClone(newData)); } @@ -882,17 +886,24 @@ export default function Dashboard() { comment: '', tags: sv.tags })); - setData(rolledBackSecrets); // Perform the rollback globally - performSecretRollback({ workspaceId, version: snapshotData.version }); - - setSnapshotData(undefined); - createNotification({ - text: `Rollback has been performed successfully.`, - type: 'success' - }); - setHasUnsavedChanges(false); + const result = await performSecretRollback({ workspaceId, version: snapshotData.version }); + if (result === undefined) { + createNotification({ + text: `Something went wrong during the rollback.`, + type: 'error' + }); + } else { + setData(rolledBackSecrets); + createNotification({ + text: `Successfully rolled back secrets.`, + type: 'success' + }); + setSnapshotData(undefined); + setHasUnsavedChanges(false); + togglePITSidebar(false); + } }} color="primary" size="md" @@ -975,7 +986,7 @@ export default function Dashboard() { alt="infisical loading indicator" />
- ) : data?.length !== 0 ? ( + ) : (data?.length !== 0 || snapshotData?.secretVersions) ? (
tag.name).join(" ")?.toUpperCase().includes(searchKeys.toUpperCase()) || row.comment?.toUpperCase().includes(searchKeys.toUpperCase())) .filter((row) => !sharedToHide.includes(row.id)) - .filter((row) => row.value !== undefined) + // .filter((row) => row.value !== undefined) .map((keyPair) => ( a.key.localeCompare(b.key)) .filter((row) => row.environment === selectedSnapshotEnv?.slug) .filter((row) => row.key.toUpperCase().includes(searchKeys.toUpperCase())) - .filter( - (row) => - !snapshotData.secretVersions - ?.filter((secretVersion) => - snapshotData.secretVersions - ?.map((item) => item.key) - .filter( - (item, index) => - index !== - snapshotData.secretVersions?.map((i) => i.key).indexOf(item) - ) - .includes(secretVersion.key) - ) - ?.map((item) => item.id) - .includes(row.id) - ) .map((keyPair) => (