From ff4d199ce4892eb3bbcac382ec7e23c9a1137d4d Mon Sep 17 00:00:00 2001 From: Tobias Skarhed <1438972+tskarhed@users.noreply.github.com> Date: Sat, 25 Apr 2020 14:14:22 +0200 Subject: [PATCH] Migration: Admin org edit page (#23866) * Start migration * Migrate admin org edit page --- .../app/features/admin/AdminEditOrgPage.tsx | 110 ++++++++++++++++++ public/app/routes/routes.ts | 8 +- 2 files changed, 115 insertions(+), 3 deletions(-) create mode 100644 public/app/features/admin/AdminEditOrgPage.tsx diff --git a/public/app/features/admin/AdminEditOrgPage.tsx b/public/app/features/admin/AdminEditOrgPage.tsx new file mode 100644 index 00000000000..8bdbfb2e1c6 --- /dev/null +++ b/public/app/features/admin/AdminEditOrgPage.tsx @@ -0,0 +1,110 @@ +import React, { FC, useState, useEffect } from 'react'; +import Page from 'app/core/components/Page/Page'; +import { useSelector } from 'react-redux'; +import { StoreState, OrgUser } from 'app/types'; +import { getNavModel } from 'app/core/selectors/navModel'; +import UsersTable from '../users/UsersTable'; +import { useAsyncFn } from 'react-use'; +import { getBackendSrv } from '@grafana/runtime'; +import { UrlQueryValue } from '@grafana/data'; +import { Form, Field, Input, Button, Legend } from '@grafana/ui'; +import { css } from 'emotion'; + +interface OrgNameDTO { + orgName: string; +} + +const getOrg = async (orgId: UrlQueryValue) => { + return await getBackendSrv().get('/api/orgs/' + orgId); +}; + +const getOrgUsers = async (orgId: UrlQueryValue) => { + return await getBackendSrv().get('/api/orgs/' + orgId + '/users'); +}; + +const updateOrgUserRole = async (orgUser: OrgUser, orgId: UrlQueryValue) => { + await getBackendSrv().patch('/api/orgs/' + orgId + '/users/' + orgUser.userId, orgUser); +}; + +const removeOrgUser = async (orgUser: OrgUser, orgId: UrlQueryValue) => { + return await getBackendSrv().delete('/api/orgs/' + orgId + '/users/' + orgUser.userId); +}; + +export const AdminEditOrgPage: FC = () => { + const navIndex = useSelector((state: StoreState) => state.navIndex); + const navModel = getNavModel(navIndex, 'global-orgs'); + + const orgId = useSelector((state: StoreState) => state.location.routeParams.id); + + const [users, setUsers] = useState([]); + + const [orgState, fetchOrg] = useAsyncFn(() => getOrg(orgId), []); + const [, fetchOrgUsers] = useAsyncFn(() => getOrgUsers(orgId), []); + + useEffect(() => { + fetchOrg(); + fetchOrgUsers().then(res => setUsers(res)); + }, []); + + const updateOrgName = async (name: string) => { + return await getBackendSrv().put('/api/orgs/' + orgId, { ...orgState.value, name }); + }; + + return ( + + + <> + Edit Organization + + {orgState.value && ( +
await updateOrgName(values.orgName)} + > + {({ register, errors }) => ( + <> + + + + + + )} +
+ )} + +
+ Organization Users + {!!users.length && ( + { + updateOrgUserRole({ ...orgUser, role }, orgId); + setUsers( + users.map(user => { + if (orgUser.userId === user.userId) { + return { ...orgUser, role }; + } + return user; + }) + ); + fetchOrgUsers(); + }} + onRemoveUser={orgUser => { + removeOrgUser(orgUser, orgId); + setUsers(users.filter(user => orgUser.userId !== user.userId)); + fetchOrgUsers(); + }} + /> + )} +
+ +
+
+ ); +}; + +export default AdminEditOrgPage; diff --git a/public/app/routes/routes.ts b/public/app/routes/routes.ts index a72578025db..dbb43cdc7a1 100644 --- a/public/app/routes/routes.ts +++ b/public/app/routes/routes.ts @@ -349,9 +349,11 @@ export function setupAngularRoutes($routeProvider: route.IRouteProvider, $locati controllerAs: 'ctrl', }) .when('/admin/orgs/edit/:id', { - templateUrl: 'public/app/features/admin/partials/edit_org.html', - controller: 'AdminEditOrgCtrl', - controllerAs: 'ctrl', + template: '', + resolve: { + component: () => + SafeDynamicImport(import(/* webpackChunkName: "AdminEditOrgPage" */ 'app/features/admin/AdminEditOrgPage')), + }, }) .when('/admin/stats', { template: '',