💄 front: cosmetic changes (#50)

This commit is contained in:
Eric Doughty-Papassideris
2024-04-29 23:38:19 +02:00
committed by ericlinagora
parent 62dcb71c8a
commit f803e4cc51
9 changed files with 50 additions and 31 deletions
-1
View File
@@ -51,7 +51,6 @@
"scenes.app.workspaces.create_company.group_data.group_main_activity.administration": "Administration", "scenes.app.workspaces.create_company.group_data.group_main_activity.administration": "Administration",
"scenes.app.workspaces.create_company.group_data.group_main_activity.other": "Other", "scenes.app.workspaces.create_company.group_data.group_main_activity.other": "Other",
"components.drive_dropzone.uploading": "Uploading...", "components.drive_dropzone.uploading": "Uploading...",
"components.user_picker.modal_results_count_none": "No results found",
"components.user_picker.modal.result_add.none": "No rights", "components.user_picker.modal.result_add.none": "No rights",
"components.user_picker.modal.result_add.read": "Grant read", "components.user_picker.modal.result_add.read": "Grant read",
"components.user_picker.modal.result_add.write": "Grant write", "components.user_picker.modal.result_add.write": "Grant write",
@@ -10,7 +10,7 @@ export type ConfirmModalProps = {
title: string; title: string;
text: string; text: string;
theme?: ModalContentTheme; theme?: ModalContentTheme;
icon: React.ComponentType; icon?: React.ComponentType;
skipCancelOnClose?: boolean; skipCancelOnClose?: boolean;
buttonOkTheme?: ButtonTheme; buttonOkTheme?: ButtonTheme;
buttonOkLabel: string; buttonOkLabel: string;
@@ -40,17 +40,17 @@ export const ConfirmModal = (props: ConfirmModalProps) => {
<> <>
<Button <Button
className="ml-2" className="ml-2"
theme='default'
onClick={dialogCloseHandler(false)}
>
{Languages.t(props.buttonCancelLabel || "general.cancel")}
</Button>
<Button
theme={props.buttonOkTheme || "danger"} theme={props.buttonOkTheme || "danger"}
onClick={dialogCloseHandler(true)} onClick={dialogCloseHandler(true)}
> >
{Languages.t(props.buttonOkLabel)} {Languages.t(props.buttonOkLabel)}
</Button> </Button>
<Button
theme='default'
onClick={dialogCloseHandler(false)}
>
{Languages.t(props.buttonCancelLabel || "general.cancel")}
</Button>
</> </>
} }
/> />
@@ -14,6 +14,7 @@ interface UserBlockProps {
subtitle_suffix?: JSX.Element | string | false; subtitle_suffix?: JSX.Element | string | false;
user?: UserType; user?: UserType;
isSelf?: boolean; isSelf?: boolean;
onClick?: () => void;
} }
export default function UserBlock(props: UserBlockProps) { export default function UserBlock(props: UserBlockProps) {
@@ -22,7 +23,7 @@ export default function UserBlock(props: UserBlockProps) {
suffix={props.suffix} suffix={props.suffix}
title_suffix={props.title_suffix} title_suffix={props.title_suffix}
subtitle_suffix={props.subtitle_suffix} subtitle_suffix={props.subtitle_suffix}
onClick={props.onClick}
avatar={ avatar={
<Avatar <Avatar
avatar={props.user?.thumbnail || ''} avatar={props.user?.thumbnail || ''}
@@ -25,6 +25,7 @@ export const AccessLevelDropdown = ({
labelOverrides, labelOverrides,
className, className,
size, size,
noRedBobMode,
}: { }: {
disabled?: boolean; disabled?: boolean;
level: DriveFileAccessLevel | null; level: DriveFileAccessLevel | null;
@@ -33,6 +34,7 @@ export const AccessLevelDropdown = ({
labelOverrides?: { [key: string]: string }; labelOverrides?: { [key: string]: string };
hiddenLevels?: DriveFileAccessLevelOrRemove[] | string[]; hiddenLevels?: DriveFileAccessLevelOrRemove[] | string[];
size?: SelectSize, size?: SelectSize,
noRedBobMode?: boolean,
}) => { }) => {
const createOption = (level: DriveFileAccessLevelOrRemove) => const createOption = (level: DriveFileAccessLevelOrRemove) =>
!hiddenLevels?.includes(level) && <option value={level}>{(labelOverrides || {})[level] || translateAccessLevel(level)}</option>; !hiddenLevels?.includes(level) && <option value={level}>{(labelOverrides || {})[level] || translateAccessLevel(level)}</option>;
@@ -41,7 +43,7 @@ export const AccessLevelDropdown = ({
disabled={disabled} disabled={disabled}
size={size} size={size}
className={className + ' w-auto'} className={className + ' w-auto'}
theme={level === 'none' ? 'rose' : 'outline'} theme={(!noRedBobMode && level === 'none') ? 'rose' : 'outline'}
value={level || 'none'} value={level || 'none'}
onChange={e => onChange(e.target.value as DriveFileAccessLevel & 'remove')} onChange={e => onChange(e.target.value as DriveFileAccessLevel & 'remove')}
> >
@@ -25,7 +25,7 @@ export const CopyLinkButton = (props: {
}} }}
disabled={!haveTextToCopy} disabled={!haveTextToCopy}
theme={didJustCompleteACopy ? "green" : "primary"} theme={didJustCompleteACopy ? "green" : "primary"}
className="justify-center" className="justify-center w-64"
> >
{ didJustCompleteACopy { didJustCompleteACopy
? <CheckCircleIcon className="w-5 mr-2" /> ? <CheckCircleIcon className="w-5 mr-2" />
@@ -11,7 +11,7 @@ import A from '@atoms/link';
import { Subtitle } from '@atoms/text'; import { Subtitle } from '@atoms/text';
import { LockClosedIcon, EyeIcon, PencilIcon, ScaleIcon, EyeOffIcon } from '@heroicons/react/outline'; import { LockClosedIcon, EyeIcon, PencilIcon, ScaleIcon, EyeOffIcon } from '@heroicons/react/outline';
import { Modal, ModalContent } from '@atoms/modal'; import { Modal, ModalContent } from '@atoms/modal';
import { PublicLinkAccessOptions } from '../public-link/public-link-access-options'; import { PublicLinkAccessOptions } from './public-link-access-options';
import BaseBlock from '@molecules/grouped-rows/base'; import BaseBlock from '@molecules/grouped-rows/base';
import { AccessLevelDropdown, translateAccessLevel } from '../../components/access-level-dropdown'; import { AccessLevelDropdown, translateAccessLevel } from '../../components/access-level-dropdown';
import { CopyLinkButton } from './copy-link-button'; import { CopyLinkButton } from './copy-link-button';
@@ -93,7 +93,7 @@ const SwitchToAdvancedSettingsRow = (props: {
title={Languages.t('components.public-link-security')} title={Languages.t('components.public-link-security')}
suffix={ suffix={
<A <A
className={"pr-4 inline-block" + (props.disabled ? ' !text-zinc-500' : '')} className={"pr-4 inline-block " + (props.disabled ? '!text-zinc-500' : '!text-zinc-800')}
disabled={props.disabled} disabled={props.disabled}
noColor={props.disabled} noColor={props.disabled}
onClick={() => { onClick={() => {
@@ -114,8 +114,7 @@ const PublicLinkModalContent = (props: {
}) => { }) => {
const { id } = props; const { id } = props;
const { item, access, loading, update, refresh } = useDriveItem(id); const { item, access, loading, update, refresh } = useDriveItem(id);
const { item: parentItem } = useDriveItem(item?.parent_id || ''); const { refresh: refreshCompany } = useCurrentCompany();
const { company, refresh: refreshCompany } = useCurrentCompany();
useEffect(() => { useEffect(() => {
refresh(id); refresh(id);
refreshCompany(); refreshCompany();
@@ -80,7 +80,7 @@ export const PasswordEditorRow = (props: {
<label htmlFor={chkPasswordId}>{Languages.t('components.public-link-security_password')}</label> <label htmlFor={chkPasswordId}>{Languages.t('components.public-link-security_password')}</label>
{!!props.password?.length && !isEditingPassword && {!!props.password?.length && !isEditingPassword &&
<a <a
className={disabled ? Styles.Disabled.Yes : ""} className={disabled ? Styles.Disabled.Yes : "!text-zinc-800"}
onClick={() => { onClick={() => {
if (!disabled) { if (!disabled) {
setCurrentEditedPassword(props.password!); setCurrentEditedPassword(props.password!);
@@ -140,9 +140,7 @@ export const PasswordEditorRow = (props: {
open={isConfirmingPasswordRemoval} open={isConfirmingPasswordRemoval}
title={Languages.t("components.public-link-security_password_removal_title")} title={Languages.t("components.public-link-security_password_removal_title")}
text={Languages.t("components.public-link-security_password_removal_body")} text={Languages.t("components.public-link-security_password_removal_body")}
theme="danger" buttonOkTheme='primary'
icon={ShieldExclamationIcon}
buttonOkTheme='danger'
buttonOkLabel='components.public-link-security_password_removal_confirm' buttonOkLabel='components.public-link-security_password_removal_confirm'
onClose={() => setIsConfirmingPasswordRemoval(false)} onClose={() => setIsConfirmingPasswordRemoval(false)}
@@ -25,25 +25,25 @@ export const AccessModalAtom = atom<AccessModalType>({
export const AccessModal = () => { export const AccessModal = () => {
const [state, setState] = useRecoilState(AccessModalAtom); const [state, setState] = useRecoilState(AccessModalAtom);
const closeModal = () => setState({ ...state, open: false });
return ( return (
<Modal <Modal
open={state.open} open={state.open}
className='!overflow-visible' className='!overflow-visible'
onClose={() => setState({ ...state, open: false })} onClose={closeModal}
> >
{!!state.id && <AccessModalContent id={state.id} />} {!!state.id && <AccessModalContent id={state.id} onCloseModal={closeModal} />}
</Modal> </Modal>
); );
}; };
const AccessModalContent = (props: { const AccessModalContent = (props: {
id: string, id: string,
onCloseModal: () => void,
}) => { }) => {
const { id } = props; const { id } = props;
const { item, access, loading, update, refresh } = useDriveItem(id); const { item, access, loading, update, refresh } = useDriveItem(id);
const { item: parentItem } = useDriveItem(item?.parent_id || ''); const { refresh: refreshCompany } = useCurrentCompany();
const { company, refresh: refreshCompany } = useCurrentCompany();
useEffect(() => { useEffect(() => {
refresh(id); refresh(id);
refreshCompany(); refreshCompany();
@@ -60,7 +60,7 @@ const AccessModalContent = (props: {
> >
<div className={loading ? 'opacity-50' : ''}> <div className={loading ? 'opacity-50' : ''}>
{FeatureTogglesService.isActiveFeatureName(FeatureNames.COMPANY_SEARCH_USERS) && ( {FeatureTogglesService.isActiveFeatureName(FeatureNames.COMPANY_SEARCH_USERS) && (
<InternalAccessManager id={id} disabled={access !== 'manage'} /> <InternalAccessManager id={id} disabled={access !== 'manage'} onCloseModal={props.onCloseModal} />
)} )}
</div> </div>
</ModalContent> </ModalContent>
@@ -17,7 +17,15 @@ import { InputDecorationIcon } from '@atoms/input/input-decoration-icon';
import { AccessLevelDropdown } from '../../components/access-level-dropdown'; import { AccessLevelDropdown } from '../../components/access-level-dropdown';
import UserBlock from '@molecules/grouped-rows/user'; import UserBlock from '@molecules/grouped-rows/user';
export const InternalAccessManager = ({ id, disabled }: { id: string; disabled: boolean }) => { export const InternalAccessManager = ({
id,
disabled,
onCloseModal,
}: {
id: string;
disabled: boolean;
onCloseModal: () => void,
}) => {
const { item, loading, update } = useDriveItem(id); const { item, loading, update } = useDriveItem(id);
const [level, setLevel] = useState<DriveFileAccessLevel>('manage'); const [level, setLevel] = useState<DriveFileAccessLevel>('manage');
const usersWithAccess = item && getAllUserAccesses(item); const usersWithAccess = item && getAllUserAccesses(item);
@@ -113,6 +121,7 @@ export const InternalAccessManager = ({ id, disabled }: { id: string; disabled:
<div className="shrink-0"> <div className="shrink-0">
<AccessLevelDropdown <AccessLevelDropdown
className="rounded-l-none !p-0 leading-tight text-end !pr-8 !pl-2 border-none bg-zinc-100 dark:bg-zinc-800" className="rounded-l-none !p-0 leading-tight text-end !pr-8 !pl-2 border-none bg-zinc-100 dark:bg-zinc-800"
noRedBobMode={true}
disabled={loading || disabled} disabled={loading || disabled}
hiddenLevels={['remove']} hiddenLevels={['remove']}
level={level} level={level}
@@ -122,16 +131,16 @@ export const InternalAccessManager = ({ id, disabled }: { id: string; disabled:
</div> </div>
{showResults && {showResults &&
<> <>
<div className="flex flex-row border-t !border-x-0 dark:border-zinc-700 h-1" /> <div className="flex flex-row border-t !border-x-0 dark:border-zinc-700" />
<div className="relative w-full h-0"> {/* Necessary so the relative results don't take height */} <div className="relative w-full h-0"> {/* Necessary so the relative results don't take height */}
<div className={(showResults ? "rounded-md " : "rounded-md ") + "absolute z-10 w-full shadow-md border bg-white dark:bg-zinc-900 mt-2 dark:border-zinc-700"}> <div className={"rounded-md absolute z-10 w-full shadow-md border bg-white dark:bg-zinc-900 mt-1 dark:border-zinc-700"}>
{ shownResults && shownResults.map((user, index) => { shownResults && shownResults.map((user, index) =>
<UserAccessLevel <UserAccessLevel
key={user.id} key={user.id}
id={id} id={id}
userId={user.id!} userId={user.id!}
disabled={disabled} disabled={disabled}
className={'!border-x-0' + (index === selectedKeyIndex ? ' ring' : (index > 0 && index !== ((selectedKeyIndex ?? 0) + 1) ? ' border-t' : ''))} className={'hover:bg-zinc-300 dark:hover:bg-zinc-700 cursor-pointer !border-x-0' + (index === selectedKeyIndex ? ' ring' : (index > 0 && index !== ((selectedKeyIndex ?? 0) + 1) ? ' border-t' : ''))}
isSearchResultAdd={level} isSearchResultAdd={level}
onAddSearchResult={(userId) => { onAddSearchResult={(userId) => {
item && update(changeUserAccess(item, userId, level)); item && update(changeUserAccess(item, userId, level));
@@ -139,7 +148,7 @@ export const InternalAccessManager = ({ id, disabled }: { id: string; disabled:
/> />
)} )}
{!loading && resultFooterText && <> {!loading && resultFooterText && <>
<div className={(result.length == 0 ? 'rounded-md' : 'rounded-b-md') + ' grow text-center italic dark:text-zinc-400 py-2 dark:border-zinc-700 border-t bg-zinc-100 dark:bg-zinc-800'}> <div className={(result.length == 0 ? 'rounded-md' : 'rounded-b-md') + ' grow text-center italic text-red-700 dark:text-red-500 font-bold py-2 dark:border-zinc-700 border-t bg-zinc-100 dark:bg-zinc-800'}>
{resultFooterText} {resultFooterText}
</div> </div>
</>} </>}
@@ -166,6 +175,16 @@ export const InternalAccessManager = ({ id, disabled }: { id: string; disabled:
<div className="mt-2 flex flex-row items-center justify-center border-none h-1">&nbsp;</div> <div className="mt-2 flex flex-row items-center justify-center border-none h-1">&nbsp;</div>
} }
</div> </div>
<div className="flex flex-row place-content-end">
<Button
disabled={loading || disabled}
size="sm"
className='text-center'
onClick={onCloseModal}
>
{Languages.t('components.public-link-security_field_confirm_edit')}
</Button>
</div>
</> </>
); );
}; };
@@ -186,11 +205,11 @@ const UserAccessLevel = (props: {
className={"p-4 border-x dark:border-zinc-700" + ' ' + (props.className ?? '')} className={"p-4 border-x dark:border-zinc-700" + ' ' + (props.className ?? '')}
user={user} user={user}
isSelf={!!currentUser?.id && user?.id === currentUser?.id} isSelf={!!currentUser?.id && user?.id === currentUser?.id}
onClick={() => props.isSearchResultAdd && user && props.onAddSearchResult!(props.userId)}
suffix={ suffix={
props.isSearchResultAdd props.isSearchResultAdd
? <Button ? <Button
disabled={loading || props.disabled || user?.id === currentUser?.id} disabled={loading || props.disabled || user?.id === currentUser?.id}
onClick={() => user && props.onAddSearchResult!(props.userId)}
size="sm" size="sm"
> >
{Languages.t('components.user_picker.modal.result_add.' + props.isSearchResultAdd)} {Languages.t('components.user_picker.modal.result_add.' + props.isSearchResultAdd)}
@@ -198,6 +217,7 @@ const UserAccessLevel = (props: {
: <AccessLevelDropdown : <AccessLevelDropdown
disabled={loading || props.disabled || user?.id === currentUser?.id} disabled={loading || props.disabled || user?.id === currentUser?.id}
noRedBobMode={true}
level={(item && getUserAccessLevel(item, props.userId)) || "none"} level={(item && getUserAccessLevel(item, props.userId)) || "none"}
onChange={level => item && update(changeUserAccess(item, props.userId, level === 'remove' ? false : level))} onChange={level => item && update(changeUserAccess(item, props.userId, level === 'remove' ? false : level))}
/> />