Skip to content

Commit

Permalink
Merge pull request #115 from mitaai/blms/ui-tweaks
Browse files Browse the repository at this point in the history
#106 Unauthorized handling and style tweaks
  • Loading branch information
blms committed Dec 29, 2020
2 parents fe8afe1 + 7dc4b97 commit 23cd83a
Show file tree
Hide file tree
Showing 17 changed files with 111 additions and 40 deletions.
2 changes: 1 addition & 1 deletion src/components/Footer/Footer.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import moment from 'moment';
function Footer() {
return (
<footer className="footer mt-auto py-3">
<Container className="px-0">
<Container fluid className="px-5">
<Row>
<Col>
<Image src="/logo_mit.png" alt="MIT logo" className="logo mr-3 mt-2" />
Expand Down
4 changes: 2 additions & 2 deletions src/components/Header/Header.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ function Header({
const router = useRouter();
return (
<header sticky="top">
<Navbar bg="dark" variant="dark">
<Container>
<Navbar bg="dark" variant="dark" className="px-0">
<Container fluid className="px-5">
<Navbar.Brand href="/">Annotation Studio</Navbar.Brand>
<Navbar.Toggle aria-controls="responsive-navbar-nav" />
<Navbar.Collapse className="justify-content-end">
Expand Down
12 changes: 6 additions & 6 deletions src/components/SecondNavbar/SecondNavbar.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,10 @@ const SecondNavbar = ({
const [showMoreDocumentInfo, setShowMoreDocumentInfo] = useState();
return (
<>
<Navbar bg="light" variant="light" className="second-navbar" data-testid="second-navbar">
<Container>
<Navbar bg="light" variant="light" className="second-navbar px-0" data-testid="second-navbar">
<Container fluid className="px-5">
<Row>
<Col sm={8}>
<Col>
<Nav>
<Breadcrumb>
<Breadcrumb.Item active={type === 'dashboard'} href="/">Dashboard</Breadcrumb.Item>
Expand Down Expand Up @@ -91,7 +91,7 @@ const SecondNavbar = ({
</Container>
{type === 'document' && document && docView && (
<>
<div style={{ position: 'absolute', right: '16px', top: '7px' }}>
<div style={{ position: 'absolute', right: '9px', top: '7px' }} className="pr-5">
<FilterPopover session={session} />
</div>
<Modal
Expand All @@ -106,7 +106,7 @@ const SecondNavbar = ({
</Modal.Title>
</Modal.Header>
<Modal.Body>
<Table bordered hover size="sm">
<Table bordered size="sm">
<tbody>
{Object.keys(metaData).map((key) => {
let str = '';
Expand All @@ -119,7 +119,7 @@ const SecondNavbar = ({
}
return (
<tr>
<td className="table-meta-data-name">{metaData[key]}</td>
<td className="table-meta-data-name"><strong>{metaData[key]}</strong></td>
<td>{str}</td>
</tr>
);
Expand Down
10 changes: 10 additions & 0 deletions src/components/UnauthorizedCard/UnauthorizedCard.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { Card } from 'react-bootstrap';

const UnauthorizedCard = () => (
<Card>
<Card.Header><Card.Title>Not authorized</Card.Title></Card.Header>
<Card.Body>You are not authorized to view this page.</Card.Body>
</Card>
);

export default UnauthorizedCard;
12 changes: 12 additions & 0 deletions src/components/UnauthorizedCard/UnauthorizedCard.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/**
* @jest-environment jsdom
*/

import { render } from '@testing-library/react';
import UnauthorizedCard from './UnauthorizedCard';

test('renders card', () => {
const { getByText } = render(<UnauthorizedCard />);
const cardTitle = getByText('Not authorized');
expect(cardTitle).toBeInTheDocument();
});
3 changes: 3 additions & 0 deletions src/components/UnauthorizedCard/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import UnauthorizedCard from './UnauthorizedCard';

export default UnauthorizedCard;
6 changes: 2 additions & 4 deletions src/pages/annotations/index.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { useSession } from 'next-auth/client';
import { Card } from 'react-bootstrap';
import Layout from '../../components/Layout';
import LoadingSpinner from '../../components/LoadingSpinner';
import UnauthorizedCard from '../../components/UnauthorizedCard';
import DashboardAnnotationList from '../../components/Dashboard/DashboardAnnotationList';

const AnnotationsListVIew = ({
Expand All @@ -22,10 +23,7 @@ const AnnotationsListVIew = ({
</Card>
)}
{!session && !loading && (
<Card>
<Card.Header><Card.Title>Not authorized</Card.Title></Card.Header>
<Card.Body>Please log in to use the application.</Card.Body>
</Card>
<UnauthorizedCard />
)}
{session && !loading && (
<DashboardAnnotationList
Expand Down
6 changes: 5 additions & 1 deletion src/pages/documents/[slug]/edit.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
} from 'react-bootstrap';
import Layout from '../../../components/Layout';
import LoadingSpinner from '../../../components/LoadingSpinner';
import UnauthorizedCard from '../../../components/UnauthorizedCard';
import DocumentForm from '../../../components/DocumentForm';

import { prefetchDocumentBySlug } from '../../../utils/docUtil';
Expand All @@ -23,9 +24,12 @@ const EditDocument = ({ document, alerts, statefulSession }) => {
<Layout alerts={errors} type="document" title={document ? `Edit Document: ${document.title}` : 'error'} statefulSession={statefulSession}>
<Col lg="12" className="mx-auto">
<Card>
{((!session && loading) || pageLoading) && (
{((!session && loading) || (session && pageLoading)) && (
<LoadingSpinner />
)}
{!session && !loading && (
<UnauthorizedCard />
)}
{session && document && !loading && !pageLoading && (
<>
<Card.Header><Card.Title>Edit document</Card.Title></Card.Header>
Expand Down
6 changes: 5 additions & 1 deletion src/pages/documents/index.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {
import Layout from '../../components/Layout';
import DocumentList from '../../components/DocumentList';
import LoadingSpinner from '../../components/LoadingSpinner';
import UnauthorizedCard from '../../components/UnauthorizedCard';
import { getSharedDocumentsByGroup, getDocumentsByUser } from '../../utils/docUtil';

const DocumentsIndex = ({
Expand Down Expand Up @@ -50,7 +51,7 @@ const DocumentsIndex = ({

return (
<Layout alerts={alerts} type="document" statefulSession={statefulSession}>
{((loading && !session) || listLoading) && (
{((loading && !session) || (session && listLoading)) && (
<Card>
<Card.Header>
<Card.Title>
Expand All @@ -62,6 +63,9 @@ const DocumentsIndex = ({
</Card.Body>
</Card>
)}
{!loading && !session && (
<UnauthorizedCard />
)}
{!loading && session && !listLoading && (
<Card>
<Card.Header>
Expand Down
6 changes: 5 additions & 1 deletion src/pages/documents/new.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {
Card, Col,
} from 'react-bootstrap';
import Layout from '../../components/Layout';
import UnauthorizedCard from '../../components/UnauthorizedCard';
import LoadingSpinner from '../../components/LoadingSpinner';
import DocumentForm from '../../components/DocumentForm';

Expand All @@ -22,9 +23,12 @@ const NewDocument = ({ statefulSession }) => {
<Layout alerts={errors} type="document" title="New Document" statefulSession={statefulSession}>
<Col lg="12" className="mx-auto">
<Card>
{((!session && loading) || pageLoading) && (
{((!session && loading) || (session && pageLoading)) && (
<LoadingSpinner />
)}
{!session && !loading && (
<UnauthorizedCard />
)}
{session && !loading && !pageLoading && (
<>
<Card.Header><Card.Title>Create a new document</Card.Title></Card.Header>
Expand Down
16 changes: 10 additions & 6 deletions src/pages/groups/[id]/edit.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import { useRouter } from 'next/router';
import { Formik } from 'formik';
import Layout from '../../../components/Layout';
import LoadingSpinner from '../../../components/LoadingSpinner';
import UnauthorizedCard from '../../../components/UnauthorizedCard';
import ConfirmationDialog from '../../../components/ConfirmationDialog';
import GroupRoleSummaries from '../../../components/GroupRoleSummaries';
import GroupRoleBadge from '../../../components/GroupRoleBadge';
Expand Down Expand Up @@ -58,9 +59,9 @@ const EditGroup = ({
showModal: false,
editingGroupName: false,
showTooltip: false,
groupName: group.name,
inviteUrl: group.inviteUrl,
members: group.members,
groupName: group ? group.name : '',
inviteUrl: group ? group.inviteUrl : '',
members: group ? group.members : '',
});
const handleCloseModal = () => setState({ ...state, showModal: false });
const handleShowModal = () => setState({ ...state, showModal: true });
Expand All @@ -87,12 +88,15 @@ const EditGroup = ({
};

return (
<Layout alerts={alerts} type="group" title={`Manage Group: ${group.name}`} statefulSession={statefulSession}>
<Layout alerts={alerts} type="group" title={`Manage Group: ${group ? group.name : ''}`} statefulSession={statefulSession}>
<Card>
{((!session && loading) || pageLoading) && (
{((!session && loading) || (session && pageLoading)) && (
<LoadingSpinner />
)}
{session && !loading && !pageLoading
{((!session && !loading) || (session && group && roleInGroup(session) === 'unauthorized')) && (
<UnauthorizedCard />
)}
{session && !loading && !pageLoading && group
&& (session.user.role === 'admin'
|| roleInGroup(session) === 'owner'
|| roleInGroup(session) === 'manager')
Expand Down
16 changes: 13 additions & 3 deletions src/pages/groups/[id]/index.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import {
} from 'react-bootstrap-icons';
import Layout from '../../../components/Layout';
import LoadingSpinner from '../../../components/LoadingSpinner';
import UnauthorizedCard from '../../../components/UnauthorizedCard';
import ConfirmationDialog from '../../../components/ConfirmationDialog';
import GroupRoleSummaries from '../../../components/GroupRoleSummaries';
import GroupRoleBadge from '../../../components/GroupRoleBadge';
Expand All @@ -23,15 +24,24 @@ const ViewGroup = ({ group, statefulSession }) => {
const handleCloseModal = () => setShowModal(false);
const handleShowModal = () => setShowModal(true);

const roleInGroup = (currentSession) => currentSession.user.groups.find((o) => Object.entries(o).some(([k, value]) => k === 'id' && value === group.id)).role;
const roleInGroup = (currentSession) => {
const groupInSession = currentSession.user.groups.find((o) => Object.entries(o).some(([k, value]) => k === 'id' && value === group.id));
const memberInGroup = group.members.find((o) => Object.entries(o).some(([k, value]) => k === 'id' && value === currentSession.user.id));
if (groupInSession || memberInGroup) {
return groupInSession ? groupInSession.role : memberInGroup.role;
} return 'unauthorized';
};

return (
<Layout alerts={alerts} type="group" title={group.name} statefulSession={statefulSession}>
<Layout alerts={alerts} type="group" title={group ? group.name : ''} statefulSession={statefulSession}>
<Card>
{!session && loading && (
<LoadingSpinner />
)}
{session && !loading && (
{((!session && !loading) || (session && group && roleInGroup(session) === 'unauthorized')) && (
<UnauthorizedCard />
)}
{session && !loading && group && (
<>
<Card.Header>
{group.name}
Expand Down
6 changes: 5 additions & 1 deletion src/pages/groups/index.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
} from 'react-bootstrap-icons';
import Layout from '../../components/Layout';
import LoadingSpinner from '../../components/LoadingSpinner';
import UnauthorizedCard from '../../components/UnauthorizedCard';
import ConfirmationDialog from '../../components/ConfirmationDialog';
import GroupRoleSummaries from '../../components/GroupRoleSummaries';
import GroupRoleBadge from '../../components/GroupRoleBadge';
Expand Down Expand Up @@ -45,9 +46,12 @@ const GroupList = ({ query, initAlerts, statefulSession }) => {
return (
<Layout alerts={alerts} type="group" statefulSession={statefulSession}>
<Card>
{((!session && loading) || pageLoading) && (
{((!session && loading) || (session && pageLoading)) && (
<LoadingSpinner />
)}
{!session && !loading && (
<UnauthorizedCard />
)}
{session && !loading && !pageLoading && (
<>
<Card.Header>
Expand Down
6 changes: 5 additions & 1 deletion src/pages/groups/new.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import Router from 'next/router';
import { addGroupToUser } from '../../utils/groupUtil';
import Layout from '../../components/Layout';
import LoadingSpinner from '../../components/LoadingSpinner';
import UnauthorizedCard from '../../components/UnauthorizedCard';

const NewGroup = ({ statefulSession }) => {
const [session, loading] = useSession();
Expand Down Expand Up @@ -63,9 +64,12 @@ const NewGroup = ({ statefulSession }) => {
<Layout alerts={alerts} type="group" title="New Group" statefulSession={statefulSession}>
<Col lg="8" className="mx-auto">
<Card>
{((!session && loading) || pageLoading) && (
{((!session && loading) || (session && pageLoading)) && (
<LoadingSpinner />
)}
{!session && !loading && (
<UnauthorizedCard />
)}
{session && !loading && !pageLoading && (
<Card.Body className="text-center">
<Card.Title>Create a new group</Card.Title>
Expand Down
30 changes: 18 additions & 12 deletions src/pages/user/[slug]/editprofile.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
import { FullName } from '../../../utils/nameUtil';
import Layout from '../../../components/Layout';
import LoadingSpinner from '../../../components/LoadingSpinner';
import UnauthorizedCard from '../../../components/UnauthorizedCard';
import { updateAllAnnotationsByUser } from '../../../utils/annotationUtil';

const EditProfile = ({ user, updateSession, statefulSession }) => {
Expand All @@ -31,18 +32,20 @@ const EditProfile = ({ user, updateSession, statefulSession }) => {
slug: values.email.replace(/[*+~.()'"!:@]/g, '-'),
};

updateSession({
user: {
name: newName,
firstName: values.firstName,
email: values.email,
image: session.user.image,
id: session.user.id,
groups: session.user.groups,
role: session.user.role,
},
expires: session.expires,
});
if (values.email === session.user.email) {
updateSession({
user: {
name: newName,
firstName: values.firstName,
email: values.email,
image: session.user.image,
id: session.user.id,
groups: session.user.groups,
role: session.user.role,
},
expires: session.expires,
});
}

// eslint-disable-next-line no-undef
const res = await fetch('/api/users', {
Expand Down Expand Up @@ -117,6 +120,9 @@ const EditProfile = ({ user, updateSession, statefulSession }) => {
{!session && loading && (
<LoadingSpinner />
)}
{((!session && !loading) || (session && !user)) && (
<UnauthorizedCard />
)}
{session && user && (
<Card.Body>
<Card.Title>Edit Profile</Card.Title>
Expand Down
6 changes: 5 additions & 1 deletion src/pages/user/newuser.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import Link from 'next/link';
import Router from 'next/router';
import { FullName } from '../../utils/nameUtil';
import Layout from '../../components/Layout';
import UnauthorizedCard from '../../components/UnauthorizedCard';
import LoadingSpinner from '../../components/LoadingSpinner';
import { addUserToGroup } from '../../utils/groupUtil';

Expand Down Expand Up @@ -108,9 +109,12 @@ const NewUser = ({ groupId, updateSession, statefulSession }) => {
<Layout alerts={alerts} type="newuser" statefulSession={statefulSession}>
<Col lg="8" className="mx-auto">
<Card>
{(pageLoading || !session) && (
{((loading && !session) || (pageLoading && session)) && (
<LoadingSpinner />
)}
{!loading && !session && (
<UnauthorizedCard />
)}
{!pageLoading && (statefulSession || (session && session.user.firstName)) && (
<Card.Body className="text-center">
<Card.Title>Welcome to Annotation Studio</Card.Title>
Expand Down
4 changes: 4 additions & 0 deletions src/style/custom.scss
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ $theme-colors: (
"dark": #000000,
);

ol.breadcrumb {
padding-left: 0px !important;
}

.footer .logo {
height: 30px;
max-height: 30px;
Expand Down

0 comments on commit 23cd83a

Please sign in to comment.