diff --git a/public/locales/de-DE/translation.json b/public/locales/de-DE/translation.json index 5f7d6a9..005131d 100644 --- a/public/locales/de-DE/translation.json +++ b/public/locales/de-DE/translation.json @@ -639,6 +639,10 @@ "create": "Neue Autorisierung erstellen", "cancel-create": "Erstellung der Autorisierung abbrechen", "user-group": "Benutzer / Gruppe", + "user": "Benutzer", + "group": "Gruppe", + "user-id": "Benutzer-ID", + "group-id": "Gruppen-ID", "permissions": "Berechtigungen", "resource-id": "Ressourcen-ID", "global": "GLOBAL", diff --git a/public/locales/en-US/translation.json b/public/locales/en-US/translation.json index ac20fbe..f4674a6 100644 --- a/public/locales/en-US/translation.json +++ b/public/locales/en-US/translation.json @@ -639,6 +639,10 @@ "create": "Create new authorization", "cancel-create": "Cancel creating new authorization", "user-group": "User / Group", + "user": "User", + "group": "Group", + "user-id": "User ID", + "group-id": "Group ID", "permissions": "Permissions", "resource-id": "Resource ID", "global": "GLOBAL", diff --git a/src/pages/Admin.jsx b/src/pages/Admin.jsx index 92ac95e..78e3dfd 100644 --- a/src/pages/Admin.jsx +++ b/src/pages/Admin.jsx @@ -932,10 +932,11 @@ const AuthorizationCreate = ({ resource, resource_type, on_done }) => { state = useContext(AppState), { api: { authorization: { create } } } = state, [t] = useTranslation(), - form = useSignal({ type: 1, userId: '', permissions: [], resourceId: '*' }) + form = useSignal({ type: 1, assigneeType: 'user', userId: '', groupId: '', permissions: [], resourceId: '*' }) const set_value = (k, e) => form.value = { ...form.peek(), [k]: e.currentTarget.value }, + set_assignee_type = (e) => form.value = { ...form.peek(), assigneeType: e.currentTarget.value, userId: '', groupId: '' }, toggle_permission = (name, checked) => { const current = form.peek().permissions form.value = { @@ -945,11 +946,15 @@ const AuthorizationCreate = ({ resource, resource_type, on_done }) => { }, on_submit = e => { e.preventDefault() - const { type, userId, permissions, resourceId } = form.value + const { type, assigneeType, userId, groupId, permissions, resourceId } = form.value, + assignee = assigneeType === 'group' + ? { groupId: groupId || '*', userId: null } + : { userId: userId || '*', groupId: null } + void engine_rest.authorization.create(state, { type: Number(type), permissions, - userId: userId || '*', + ...assignee, resourceType: Number(resource_type), resourceId, }).then(() => { @@ -970,9 +975,23 @@ const AuthorizationCreate = ({ resource, resource_type, on_done }) => { - - set_value('userId', e)} placeholder="*" /> + + + + {form.value.assigneeType === 'group' + ? <> + + set_value('groupId', e)} placeholder="*" /> + + : <> + + set_value('userId', e)} placeholder="*" /> + }
{t("admin.authorization.available-permissions")} diff --git a/src/pages/Admin.test.jsx b/src/pages/Admin.test.jsx index 250f5d9..ef6c3a2 100644 --- a/src/pages/Admin.test.jsx +++ b/src/pages/Admin.test.jsx @@ -399,6 +399,35 @@ describe("AdminPage", () => { const call = engine_rest.authorization.create.mock.lastCall; expect(call[0]).toBe(state); expect(call[1].userId).toBe("carol"); + expect(call[1].groupId).toBeNull(); + expect(call[1].type).toBe(1); + expect(call[1].resourceType).toBe(1); + }); + + it("creates a group authorization via engine_rest.authorization.create", () => { + mockParams = { + page_id: "authorizations", + selection_id: "resource-type", + sub_selection_id: "1", + }; + signal_response(state.api.authorization.create, { id: "a3" }); + const { container, getByText } = renderPage(state); + + fireEvent.click(getByText("admin.authorization.create")); + fireEvent.input(container.querySelector("#auth-assignee-type"), { + target: { value: "group" }, + }); + fireEvent.input(container.querySelector("#auth-group"), { + target: { value: "ops" }, + }); + fireEvent.submit(container.querySelector("form.authorization-create")); + + expect(engine_rest.authorization.create).toHaveBeenCalled(); + const call = engine_rest.authorization.create.mock.lastCall; + expect(call[0]).toBe(state); + expect(call[1].userId).toBeNull(); + expect(call[1].groupId).toBe("ops"); + expect(call[1].type).toBe(1); expect(call[1].resourceType).toBe(1); });