feat: Read-only users (#1955)

* Introduce isViewer field

* Update policies

* Make users read-only feature

* Remove not demoting current user validation

* Update tests

* Catch the unhandled promise rejection

* Hide unnecessary ui elements for read-only user

* Update app/scenes/Settings/People.js

Co-authored-by: Tom Moor <tom.moor@gmail.com>

* Remove redundant logic for admin only policies

* Use can logic

* Update snapshot

* Remove lint error

* Update snapshot

* Minor fix

* Update app/menus/UserMenu.js

Co-authored-by: Tom Moor <tom.moor@gmail.com>

* Update server/api/users.js

Co-authored-by: Tom Moor <tom.moor@gmail.com>

* Update app/components/DocumentListItem.js

Co-authored-by: Tom Moor <tom.moor@gmail.com>

* Update app/stores/UsersStore.js

Co-authored-by: Tom Moor <tom.moor@gmail.com>

* Use useCurrentTeam hook in functional component

* Update translation

* Update ternary

* Remove punctuation

* Move the functions to User model

* Update share policy and shareMenu

* Rename makeAdmin to promote

* Create updateCounts function and Rank enum

* Update tests

* Remove enum

* Use async await, remove enum and create computed accessor

* Remove unused variable

* Fix lint issues

* Hide templates

* Create shared/types and use rank type from it

* Delete shared/utils/rank type file

Co-authored-by: Tom Moor <tom.moor@gmail.com>
This commit is contained in:
Saumya Pandey
2021-04-12 08:09:17 +05:30
committed by GitHub
parent cdc7f61fa1
commit bc4fe05147
34 changed files with 508 additions and 189 deletions

View File

@@ -15,8 +15,10 @@ import { Waypoint } from "react-waypoint";
import styled from "styled-components";
import breakpoint from "styled-components-breakpoint";
import AuthStore from "stores/AuthStore";
import { DEFAULT_PAGINATION_LIMIT } from "stores/BaseStore";
import DocumentsStore from "stores/DocumentsStore";
import PoliciesStore from "stores/PoliciesStore";
import UsersStore from "stores/UsersStore";
import Button from "components/Button";
@@ -44,7 +46,9 @@ type Props = {
match: Match,
location: LocationWithState,
documents: DocumentsStore,
auth: AuthStore,
users: UsersStore,
policies: PoliciesStore,
notFound: ?boolean,
t: TFunction,
};
@@ -255,11 +259,12 @@ class Search extends React.Component<Props> {
};
render() {
const { documents, notFound, location, t } = this.props;
const { documents, notFound, location, t, auth, policies } = this.props;
const results = documents.searchResults(this.query);
const showEmpty = !this.isLoading && this.query && results.length === 0;
const showShortcutTip =
!this.pinToTop && location.state && location.state.fromMenu;
const can = policies.abilities(auth.team?.id ? auth.team.id : "");
return (
<Container auto>
@@ -323,11 +328,11 @@ class Search extends React.Component<Props> {
<HelpText>
<Trans>
No documents found for your search filters. <br />
Create a new document?
</Trans>
{can.createDocument && <Trans>Create a new document?</Trans>}
</HelpText>
<Wrapper>
{this.collectionId ? (
{this.collectionId && can.createDocument ? (
<Button
onClick={this.handleNewDoc}
icon={<PlusIcon />}
@@ -435,5 +440,5 @@ const Filters = styled(Flex)`
`;
export default withTranslation()<Search>(
withRouter(inject("documents")(Search))
withRouter(inject("documents", "auth", "policies")(Search))
);