diff --git a/README.md b/README.md index d0f040bb0c..aaafca43a9 100644 --- a/README.md +++ b/README.md @@ -333,7 +333,7 @@ Infisical officially launched as v.1.0 on November 21st, 2022. There are a lot o - + ## 🌎 Translations diff --git a/frontend/components/basic/EventFilter.tsx b/frontend/components/basic/EventFilter.tsx index c9b31fd436..dc5ffe109b 100644 --- a/frontend/components/basic/EventFilter.tsx +++ b/frontend/components/basic/EventFilter.tsx @@ -55,7 +55,7 @@ export default function EventFilter({ {selected != '' ? (

{t("activity:event." + selected)}

) : ( -

Select an event

+

{String(t("common:select-event"))}

)} {selected != '' ? ( )} diff --git a/frontend/components/basic/dialog/DeleteEnvVar.tsx b/frontend/components/basic/dialog/DeleteEnvVar.tsx index 14f5fde476..4bb5840397 100644 --- a/frontend/components/basic/dialog/DeleteEnvVar.tsx +++ b/frontend/components/basic/dialog/DeleteEnvVar.tsx @@ -16,7 +16,6 @@ export const DeleteEnvVar = ({ isOpen, onClose, onSubmit }: Props) => {
{}}> -
{ leaveFrom="opacity-100" leaveTo="opacity-0" > -
+
{ leaveFrom="opacity-100 scale-100" leaveTo="opacity-0 scale-95" > - + { {t('dashboard:sidebar.delete-key-dialog.confirm-delete-message')}

-
+
); }; diff --git a/frontend/pages/activity/[id].tsx b/frontend/pages/activity/[id].tsx index 974607d0a5..090b5606d6 100644 --- a/frontend/pages/activity/[id].tsx +++ b/frontend/pages/activity/[id].tsx @@ -51,6 +51,7 @@ export default function Activity() { const router = useRouter(); const [eventChosen, setEventChosen] = useState(''); const [logsData, setLogsData] = useState([]); + const [isLoading, setIsLoading] = useState(false); const [currentOffset, setCurrentOffset] = useState(0); const currentLimit = 10; const [currentSidebarAction, toggleSidebar] = useState() @@ -60,6 +61,7 @@ export default function Activity() { useEffect(() => { setCurrentOffset(0); const getLogData = async () => { + setIsLoading(true); const tempLogsData = await getProjectLogs({ workspaceId: String(router.query.id), offset: 0, limit: currentLimit, userId: "", actionNames: eventChosen }) setLogsData(tempLogsData.map((log: logData) => { return { @@ -77,6 +79,7 @@ export default function Activity() { }) } })) + setIsLoading(false); } getLogData(); }, [eventChosen]); @@ -84,6 +87,7 @@ export default function Activity() { // this use effect adds more data in case 'View More' button is clicked useEffect(() => { const getLogData = async () => { + setIsLoading(true); const tempLogsData = await getProjectLogs({ workspaceId: String(router.query.id), offset: currentOffset, limit: currentLimit, userId: "", actionNames: eventChosen }) setLogsData(logsData.concat(tempLogsData.map((log: logData) => { return { @@ -101,6 +105,7 @@ export default function Activity() { }) } }))) + setIsLoading(false); } getLogData(); }, [currentLimit, currentOffset]); @@ -115,10 +120,10 @@ export default function Activity() { {currentSidebarAction && }
-

Activity Logs

+

{t("activity:title")}

- Event history for this Infisical project. + {t("activity:subtitle")}

@@ -130,10 +135,11 @@ export default function Activity() {
-
@@ -142,4 +148,4 @@ export default function Activity() { Activity.requireAuth = true; -export const getServerSideProps = getTranslatedServerSideProps(["activity"]); \ No newline at end of file +export const getServerSideProps = getTranslatedServerSideProps(["activity", "common"]); \ No newline at end of file diff --git a/frontend/pages/users/[id].js b/frontend/pages/users/[id].tsx similarity index 68% rename from frontend/pages/users/[id].js rename to frontend/pages/users/[id].tsx index 1aa1af2252..fd09ce40d8 100644 --- a/frontend/pages/users/[id].js +++ b/frontend/pages/users/[id].tsx @@ -20,6 +20,22 @@ import addUserToWorkspace from '../api/workspace/addUserToWorkspace'; import getWorkspaceUsers from '../api/workspace/getWorkspaceUsers'; import uploadKeys from '../api/workspace/uploadKeys'; +interface UserProps { + firstName: string; + lastName: string; + email: string; + _id: string; + publicKey: string; +} + +interface MembershipProps { + user: UserProps + inviteEmail: string; + role: string; + status: string; + _id: string; +} + // #TODO: Update all the workspaceIds const crypto = require('crypto'); const { @@ -30,10 +46,10 @@ const nacl = require('tweetnacl'); nacl.util = require('tweetnacl-util'); export default function Users() { - let [isAddOpen, setIsAddOpen] = useState(false); + const [isAddOpen, setIsAddOpen] = useState(false); // let [isDeleteOpen, setIsDeleteOpen] = useState(false); // let [userIdToBeDeleted, setUserIdToBeDeleted] = useState(false); - let [email, setEmail] = useState(''); + const [email, setEmail] = useState(''); const [personalEmail, setPersonalEmail] = useState(''); const [searchUsers, setSearchUsers] = useState(''); @@ -59,7 +75,7 @@ export default function Users() { // } async function submitAddModal() { - let result = await addUserToWorkspace(email, router.query.id); + const result = await addUserToWorkspace(email, String(router.query.id)); if (result?.invitee && result?.latestKey) { const PRIVATE_KEY = localStorage.getItem('PRIVATE_KEY'); @@ -77,7 +93,7 @@ export default function Users() { privateKey: PRIVATE_KEY }); - uploadKeys(router.query.id, result.invitee._id, ciphertext, nonce); + uploadKeys(String(router.query.id), result.invitee._id, ciphertext, nonce); } setEmail(''); setIsAddOpen(false); @@ -88,41 +104,45 @@ export default function Users() { setIsAddOpen(true); } - const [userList, setUserList] = useState(); + const [userList, setUserList] = useState([]); const [orgUserList, setOrgUserList] = useState([]); - // eslint-disable-next-line react-hooks/exhaustive-deps - useEffect(async () => { - const user = await getUser(); - setPersonalEmail(user.email); - workspaceId = router.query.id; - let workspaceUsers = await getWorkspaceUsers({ - workspaceId - }); - const tempUserList = workspaceUsers.map((user) => ({ - key: guidGenerator(), - firstName: user.user?.firstName, - lastName: user.user?.lastName, - email: user.user?.email == null ? user.inviteEmail : user.user?.email, - role: user?.role, - status: user?.status, - userId: user.user?._id, - membershipId: user._id, - publicKey: user.user?.publicKey - })); - setUserList(tempUserList); - const orgUsers = await getOrganizationUsers({ - orgId: localStorage.getItem('orgData.id') - }); - setOrgUserList(orgUsers); - setEmail( - orgUsers - ?.filter((user) => user.status == 'accepted') - .map((user) => user.user.email) - .filter( - (email) => !tempUserList?.map((user1) => user1.email).includes(email) - )[0] - ); + useEffect(() => { + (async () => { + const user = await getUser(); + setPersonalEmail(user.email); + + // This part quiries the current users of a project + const workspaceUsers = await getWorkspaceUsers({ + workspaceId: String(router.query.id) + }); + const tempUserList = workspaceUsers.map((membership: MembershipProps) => ({ + key: guidGenerator(), + firstName: membership.user?.firstName, + lastName: membership.user?.lastName, + email: membership.user?.email == null ? membership.inviteEmail : membership.user?.email, + role: membership?.role, + status: membership?.status, + userId: membership.user?._id, + membershipId: membership._id, + publicKey: membership.user?.publicKey + })); + setUserList(tempUserList); + + // This is needed to know wha users from an org (if any), we are able to add to a certain project + const orgUsers = await getOrganizationUsers({ + orgId: String(localStorage.getItem('orgData.id')) + }); + setOrgUserList(orgUsers); + setEmail( + orgUsers + ?.filter((membership: MembershipProps) => membership.status == 'accepted') + .map((membership: MembershipProps) => membership.user.email) + .filter( + (email: string) => !tempUserList?.map((user1: UserProps) => user1.email).includes(email) + )[0] + ); + })(); }, []); return userList ? ( @@ -151,17 +171,17 @@ export default function Users() { submitModal={submitAddModal} email={email} data={orgUserList - ?.filter((user) => user.status == 'accepted') - .map((user) => user.user.email) + ?.filter((membership: MembershipProps) => membership.status == 'accepted') + .map((membership: MembershipProps) => membership.user.email) .filter( - (email) => !userList?.map((user1) => user1.email).includes(email) + (email) => !userList?.map((user1: UserProps) => user1.email).includes(email) )} workspaceId={workspaceId} setEmail={setEmail} /> {/* */} -
-
+
+
setSearchUsers(e.target.value)} - placeholder={t("section-members:search-members")} + placeholder={String(t("section-members:search-members"))} />
-
+
-
+
diff --git a/frontend/public/locales/en/activity.json b/frontend/public/locales/en/activity.json index 5dff03d1ee..648e4d42c8 100644 --- a/frontend/public/locales/en/activity.json +++ b/frontend/public/locales/en/activity.json @@ -1,8 +1,11 @@ { + "title": "Activity Logs", + "subtitle": "Event history for this Infisical project.", "event": { "readSecrets": "Secrets Viewed", "updateSecrets": "Secrets Updated", "addSecrets": "Secrets Added", "deleteSecrets": "Secrets Deleted" - } + }, + "ip-address": "IP Address" } diff --git a/frontend/public/locales/en/common.json b/frontend/public/locales/en/common.json index badb4e8ad7..c0b1e5640f 100644 --- a/frontend/public/locales/en/common.json +++ b/frontend/public/locales/en/common.json @@ -22,5 +22,13 @@ "expired-in": "Expires in", "language": "Language", "search": "Search...", - "note": "Note" + "note": "Note", + "view-more": "View More", + "end-of-history": "End of History", + "select-event": "Select an event", + "event": "Event", + "user": "User", + "source": "Source", + "time": "Time", + "timestamp": "Timestamp" } diff --git a/img/infisical_github_repo.png b/img/infisical_github_repo.png index 96aa803106..0555166708 100644 Binary files a/img/infisical_github_repo.png and b/img/infisical_github_repo.png differ