mirror of
https://github.com/gristlabs/grist-core.git
synced 2024-10-27 20:44:07 +00:00
f7c9919120
Summary: This gives more guidance to users when editing document shares in the UserManager dialog. * For a document on a team site, any shares with team members are marked `Team member`. * Shares that count as external collaborators are marked for documents on a team or personal site as `collaborator` (personal site) or `outside collaborator` (team site). * Collaborators are marked `1 of 2`, `2 of 2`, and then `limit exceeded`. * On a team site, links are offered for each collaborator to add them to the team. The links lead to a prefilled dialog for managing team membership which can be confirmed immediately, allowing the user to continue without interruption. * On a personal site, for the last collaborator and beyond, a link is added for creating a team. This isn't seamless since creating a team involves billing etc. There's a small unrelated tweak in tests to remove a confusing import from `test/browser` in `test/server`. One thing I didn't get to is checking if owner of doc is owner of site. If they aren't, they may try to add a member and be denied at that point - it would be more polite to change messaging earlier for them. Test Plan: added and updated tests Reviewers: georgegevoian Reviewed By: georgegevoian Differential Revision: https://phab.getgrist.com/D3083
148 lines
3.2 KiB
TypeScript
148 lines
3.2 KiB
TypeScript
import {colors, vars} from 'app/client/ui2018/cssVars';
|
|
import {icon} from 'app/client/ui2018/icons';
|
|
import {input, styled} from 'grainjs';
|
|
import {cssMenuItem} from 'popweasel';
|
|
|
|
// Styled elements used for rendering a user, e.g. in the UserManager, Billing, etc.
|
|
// There is a general structure, but enough small variation that there is no helper at this point.
|
|
//
|
|
// cssMemberListItem(
|
|
// cssMemberImage(
|
|
// createUserImage(getFullUser(member), 'large')
|
|
// ),
|
|
// cssMemberText(
|
|
// cssMemberPrimary(NAME),
|
|
// cssMemberSecondary(EMAIL),
|
|
// cssMemberType(DESCRIPTION),
|
|
// )
|
|
// )
|
|
|
|
export const cssMemberListItem = styled('div', `
|
|
display: flex;
|
|
width: 460px;
|
|
min-height: 64px;
|
|
margin: 0 auto;
|
|
padding: 12px 0;
|
|
`);
|
|
|
|
export const cssMemberImage = styled('div', `
|
|
width: 40px;
|
|
height: 40px;
|
|
margin: 0 4px;
|
|
border-radius: 20px;
|
|
background-color: ${colors.lightGreen};
|
|
background-size: cover;
|
|
|
|
.${cssMemberListItem.className}-removed & {
|
|
opacity: 0.4;
|
|
}
|
|
`);
|
|
|
|
export const cssMemberText = styled('div', `
|
|
display: flex;
|
|
flex-direction: column;
|
|
justify-content: center;
|
|
margin: 2px 12px;
|
|
flex: 1 1 0;
|
|
min-width: 0px;
|
|
font-size: ${vars.mediumFontSize};
|
|
|
|
.${cssMemberListItem.className}-removed & {
|
|
opacity: 0.4;
|
|
}
|
|
`);
|
|
|
|
export const cssMemberPrimary = styled('span', `
|
|
font-weight: bold;
|
|
color: ${colors.dark};
|
|
padding: 2px 0;
|
|
|
|
.${cssMenuItem.className}-sel & {
|
|
color: white;
|
|
}
|
|
`);
|
|
|
|
export const cssMemberSecondary = styled('span', `
|
|
color: ${colors.slate};
|
|
/* the following just undo annoying bootstrap styles that apply to all labels */
|
|
margin: 0px;
|
|
font-weight: normal;
|
|
padding: 2px 0;
|
|
white-space: nowrap;
|
|
|
|
.${cssMenuItem.className}-sel & {
|
|
color: white;
|
|
}
|
|
`);
|
|
|
|
export const cssMemberType = styled('span', `
|
|
color: ${colors.slate};
|
|
/* the following just undo annoying bootstrap styles that apply to all labels */
|
|
margin: 0px;
|
|
font-weight: normal;
|
|
padding: 2px 0;
|
|
white-space: nowrap;
|
|
|
|
.${cssMenuItem.className}-sel & {
|
|
color: white;
|
|
}
|
|
`);
|
|
|
|
export const cssMemberTypeProblem = styled('span', `
|
|
color: ${colors.error};
|
|
/* the following just undo annoying bootstrap styles that apply to all labels */
|
|
margin: 0px;
|
|
font-weight: normal;
|
|
padding: 2px 0;
|
|
white-space: nowrap;
|
|
|
|
.${cssMenuItem.className}-sel & {
|
|
color: white;
|
|
}
|
|
`);
|
|
|
|
export const cssMemberBtn = styled('div', `
|
|
width: 16px;
|
|
height: 16px;
|
|
cursor: pointer;
|
|
|
|
&-disabled {
|
|
opacity: 0.3;
|
|
cursor: default;
|
|
}
|
|
`);
|
|
|
|
export const cssRemoveIcon = styled(icon, `
|
|
margin: 12px 0;
|
|
`);
|
|
|
|
export const cssEmailInputContainer = styled('div', `
|
|
position: relative;
|
|
display: flex;
|
|
height: 42px;
|
|
padding: 0 3px;
|
|
margin: 16px 63px;
|
|
border: 1px solid ${colors.darkGrey};
|
|
border-radius: 3px;
|
|
font-size: ${vars.mediumFontSize};
|
|
outline: none;
|
|
|
|
&-green {
|
|
border: 1px solid ${colors.lightGreen};
|
|
}
|
|
`);
|
|
|
|
export const cssEmailInput = styled(input, `
|
|
flex: 1 1 0;
|
|
line-height: 42px;
|
|
font-size: ${vars.mediumFontSize};
|
|
font-family: ${vars.fontFamily};
|
|
outline: none;
|
|
border: none;
|
|
`);
|
|
|
|
export const cssMailIcon = styled(icon, `
|
|
margin: 12px 8px 12px 13px;
|
|
background-color: ${colors.slate};
|
|
`);
|