Skip to content

Commit

Permalink
💄 front: WIP Implementation of the design for the share link portion (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
ericlinagora committed May 13, 2024
1 parent e0fa40f commit 3a0e0a9
Show file tree
Hide file tree
Showing 11 changed files with 561 additions and 167 deletions.
18 changes: 15 additions & 3 deletions tdrive/frontend/public/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -204,12 +204,24 @@
"components.public-link-get" : "Create link",
"components.public-link-copy" : "Copy link",
"components.public-link-access-level-create" : "Anyone with the link will have access to",
"components.public-link-access-level-update" : "Anyone with the link has access to",
"components.public-link-access-level-update-subtitle" : "Anyone with the link has access to",
"components.public-link-access-level-delete" : "Delete link",
"components.public-link-security": "Public link security",
"components.public-link-security-title": "Share with link",
"components.public-link-security": "Link security settings",
"components.public-link-security-change": "Change",
"components.public-link-security-change-subtitle": "Set password, expiration date, etc.",
"components.public-link-security_password": "Password",
"components.public-link-security_password_copied": "Password copied to clipboard",
"components.public-link-security_expired": "Expiration",
"components.public-link-security_password_removal_title": "About to remove password",
"components.public-link-security_password_removal_body": "Warning: about to remove the password on the public link making available to anyone knowing it",
"components.public-link-security_password_removal_confirm": "Remove password",
"components.public-link-security_expired": "Expired",
"components.public-link-security_field_confirm_edit": "Done",
"components.public-link-security_expiration_title": "Link expiration",
"components.public-link-security_expiration_removal_title": "About to remove expiry date of an expired link",
"components.public-link-security_expiration_removal_no_password": "Warning: about to remove the expiry on the public link making available to anyone knowing it",
"components.public-link-security_expiration_removal_but_password": "Warning: about to remove the expiry on the public link making available to anyone with the password",
"components.public-link-security_expiration_removal_confirm": "Remove expiration",
"components.internal-access_access_manage":"General access management",
"components.internal-access_inherit_parent":"Inherit parent folder",
"components.internal-access_inherit_parent_perm":"Choose to inherit or not the parent folder permissions.",
Expand Down
15 changes: 14 additions & 1 deletion tdrive/frontend/public/locales/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,20 @@
"components.public-link-security": "Sécurité du lien public",
"components.public-link-security_password": "Mot de passe",
"components.public-link-security_password_copied": "Mot de passe copié dans le presse-papiers",
"components.public-link-security_expired": "Expiration",
"components.public-link-security_expired": "Expiré",
"components.public-link-security_expiration_title": "Expiration du lien",
"components.public-link-security_expiration_removal_title": "À propos de la suppression de la date d'expiration d'un lien expiré",
"components.public-link-security_expiration_removal_no_password": "Attention : sur le point de supprimer l'expiration du lien public, rendant celui-ci accessible à quiconque le connaît",
"components.public-link-security_expiration_removal_but_password": "Attention : sur le point de supprimer l'expiration du lien public, rendant celui-ci accessible à quiconque possède le mot de passe",
"components.public-link-security_expiration_removal_confirm": "Supprimer l'expiration",
"components.public-link-security_field_confirm_edit": "Terminé",
"components.public-link-security_password_removal_title": "À propos de la suppression du mot de passe",
"components.public-link-security_password_removal_body": "Attention : sur le point de supprimer le mot de passe du lien public, le rendant accessible à quiconque le connaît",
"components.public-link-security_password_removal_confirm": "Supprimer le mot de passe",
"components.public-link-access-level-update-subtitle": "Toute personne disposant du lien y a accès à",
"components.public-link-security-change": "Modifier",
"components.public-link-security-change-subtitle": "Définir le mot de passe, la date d'expiration, etc.",
"components.public-link-security-title": "Partager avec un lien",
"components.internal-access_access_manage": "Gestion générale des accès",
"components.internal-access_inherit_parent": "Hériter du dossier parent",
"components.internal-access_inherit_parent_perm": "Hériter des permissions du dossier parent",
Expand Down
15 changes: 14 additions & 1 deletion tdrive/frontend/public/locales/ru.json
Original file line number Diff line number Diff line change
Expand Up @@ -179,10 +179,23 @@
"components.public-link-copied-info" : "Ссылка скопирована",
"components.public-link-get" : "Создать ссылку",
"components.public-link-copy" : "Копировать ссылку",
"components.public-link-security": "Public link security",
"components.public-link-security_password": "Password",
"components.public-link-security_password_copied": "Password copied to clipboard",
"components.public-link-security_expired": "Expiration",
"components.public-link-security_expiration_title": "Истечение срока действия ссылки",
"components.public-link-security_expiration_removal_title": "О удалении срока действия истекшей ссылки",
"components.public-link-security_expiration_removal_no_password": "Предупреждение: о удалении срока действия общедоступной ссылки, что делает её доступной для любого, кто знает её",
"components.public-link-security_expiration_removal_but_password": "Предупреждение: о удалении срока действия общедоступной ссылки, что делает её доступной для любого, кто знает пароль",
"components.public-link-security_expiration_removal_confirm": "Удалить срок действия",
"components.public-link-security_field_confirm_edit": "Готово",
"components.public-link-security_password_removal_title": "О удалении пароля",
"components.public-link-security_password_removal_body": "Предупреждение: о удалении пароля с общедоступной ссылки, что делает её доступной для любого, кто знает её",
"components.public-link-security_password_removal_confirm": "Удалить пароль",
"components.public-link-access-level-update-subtitle": "У каждого, кто имеет ссылку, есть доступ к",
"components.public-link-security": "Настройки безопасности ссылки",
"components.public-link-security-change": "Изменить",
"components.public-link-security-change-subtitle": "Установить пароль, срок действия и т.д.",
"components.public-link-security-title": "Поделиться ссылкой",
"components.internal-access_access_manage":"General access management",
"components.internal-access_inherit_parent":"Inherit parent folder",
"components.internal-access_inherit_parent_perm":"Choose to inherit or not the parent folder permissions.",
Expand Down
15 changes: 14 additions & 1 deletion tdrive/frontend/public/locales/vn.json
Original file line number Diff line number Diff line change
Expand Up @@ -195,10 +195,23 @@
"components.public-link-copied-info": "Đã sao chép liên kết",
"components.public-link-get" : "Tạo đường link",
"components.public-link-copy": "Sao chép đường dẫn",
"components.public-link-security": "Bảo mật liên kết công khai",
"components.public-link-security_password": "Mật khẩu",
"components.public-link-security_password_copied": "Mật khẩu đã được sao chép vào khay nhớ tạm",
"components.public-link-security_expired": "Hết hạn",
"components.public-link-security_expiration_title": "Hết hạn liên kết",
"components.public-link-security_expiration_removal_title": "Về việc xóa ngày hết hạn của một liên kết đã hết hạn",
"components.public-link-security_expiration_removal_no_password": "Cảnh báo: về việc xóa ngày hết hạn của liên kết công cộng, khiến nó có sẵn cho bất kỳ ai biết nó",
"components.public-link-security_expiration_removal_but_password": "Cảnh báo: về việc xóa ngày hết hạn của liên kết công cộng, khiến nó có sẵn cho bất kỳ ai có mật khẩu",
"components.public-link-security_expiration_removal_confirm": "Xóa hết hạn",
"components.public-link-security_field_confirm_edit": "Hoàn tất",
"components.public-link-security_password_removal_title": "Về việc xóa mật khẩu",
"components.public-link-security_password_removal_body": "Cảnh báo: về việc xóa mật khẩu của liên kết công cộng, khiến nó có sẵn cho bất kỳ ai biết nó",
"components.public-link-security_password_removal_confirm": "Xóa mật khẩu",
"components.public-link-access-level-update-subtitle": "Bất kỳ ai có liên kết đều có quyền truy cập vào",
"components.public-link-security": "Cài đặt bảo mật liên kết",
"components.public-link-security-change": "Thay đổi",
"components.public-link-security-change-subtitle": "Thiết lập mật khẩu, ngày hết hạn, vv.",
"components.public-link-security-title": "Chia sẻ với liên kết",
"components.internal-access_access_manage": "Quản lý quyền truy cập chung",
"components.internal-access_inherit_parent": "Thừa hưởng từ thư mục cha",
"components.internal-access_inherit_parent_perm": "Chọn có thừa hưởng quyền của thư mục cha hay không.",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
import moment from 'moment';
import 'moment/min/locales';

import { useEffect, useRef, useState } from 'react';
import { uniqueId } from 'lodash';

import Languages from 'features/global/services/languages-service';

import BaseBlock from '@molecules/grouped-rows/base';
import { Base, Info } from '@atoms/text';
import { Input } from 'app/atoms/input/input-text';
import { CheckboxSlider } from 'app/atoms/input/input-checkbox-slider';
import { Button } from 'app/atoms/button/button';
import { ShieldExclamationIcon, CalendarIcon, PencilAltIcon } from '@heroicons/react/outline';
import { Modal, ModalContent } from 'app/atoms/modal';

import Styles from './styles';

export const ExpiryEditorRow = (props: {
disabled?: boolean;
value: number;
isLinkPasswordProtected: boolean;
onChange: (value: number) => Promise<void>;
}) => {
const [isEditing, setIsEditing] = useState(false);
const [currentEditedValue, setCurrentEditedValue] = useState(0);
const [isWaitingForSave, setIsWaitingForSave] = useState(false);
const [isConfirmingExpiryRemoval, setIsConfirmingExpiryRemoval] = useState(false);

const inputRef = useRef<HTMLInputElement>(null);
const [chkExpiryId] = useState(uniqueId("chk"));

const disabled = props.disabled || isWaitingForSave;

useEffect(() => {
if (!isEditing || !inputRef.current) return;
let timeout: NodeJS.Timeout | null = setTimeout(() => {
timeout = null;
inputRef.current?.focus();
}, 10);
return () => {
if (timeout) clearTimeout(timeout);
timeout = null;
}
}, [ isEditing ])

function saveValue(value: number) {
setIsWaitingForSave(true);
props.
onChange(value).
then(
() => {
setIsWaitingForSave(false);
setIsEditing(false);
},
(e: unknown) => {
console.error("Error while saving expiry date:", e);
setIsWaitingForSave(false);
},
);
}

function confirmSaveExpiry(expiry: number) {
if (expiry === props.value) {
setIsEditing(false);
return;
}
if (expiry == 0 && (props.value > 0 && props.value < Date.now()))
setIsConfirmingExpiryRemoval(true);
else
saveValue(expiry);
}

function expirationDate(exp: moment.MomentInput) {
moment.locale(Languages.getLanguage());
return moment(exp).fromNow(true).toLocaleString();
}

return <>
<BaseBlock
className={"m-4" + (disabled ? Styles.Disabled.Yes : "")}
disabled={disabled}
avatar={<CalendarIcon className={Styles.SmallIconClasses} />}
title={
<Base>
<label htmlFor={chkExpiryId}>{Languages.t('components.public-link-security_expiration_title')}</label>
{!!props.value && !isEditing &&
<>
<a
className={disabled ? Styles.Disabled.Yes : ""}
onClick={() => {
if (!disabled) {
setCurrentEditedValue(props.value);
setIsEditing(true);
}
return false;
}}
>
<PencilAltIcon className={Styles.SmallIconClasses + "ml-1 inline align-bottom"} />
</a>

{(currentEditedValue || props.value) <= Date.now()
? <Info className="ml-2 !text-red-500">
({Languages.t('components.public-link-security_expired')})
</Info>
: <Info className="ml-2">({expirationDate(currentEditedValue || props.value)})</Info>
}{' '}
</>
}
</Base>
}
subtitle={''}
suffix={isEditing
? <>
<Input
inputRef={inputRef}
disabled={disabled}
className="max-w-xs mr-4 mt-1"
type="date"
size='sm'
min={moment().add(1, 'days').toISOString().split('T')[0]}
value={new Date(currentEditedValue).toISOString().split('T')[0]}
onChange={e => e.target.value && setCurrentEditedValue(new Date(e.target.value).getTime())}
onKeyUp={e => {
if (e.key == 'Escape')
setIsEditing(false);
else if (e.key == 'Enter')
confirmSaveExpiry(currentEditedValue);
}}
/>
<Button
disabled={disabled}
theme="default"
size="sm"
className="max-w-xs mr-2 mt-1"
onClick={() => confirmSaveExpiry(currentEditedValue)}
>
{Languages.t('components.public-link-security_field_confirm_edit')}
</Button>
</>
: <CheckboxSlider
id={chkExpiryId}
checked={!!props.value}
disabled={disabled}
onChange={({target: { checked }}) => {
if (checked) {
setIsEditing(checked);
if (checked && !currentEditedValue)
setCurrentEditedValue(props.value || moment().add(7, 'days').unix() * 1000);
} else
confirmSaveExpiry(0);
}}
/>
}
/>

<Modal open={isConfirmingExpiryRemoval} onClose={() => setIsConfirmingExpiryRemoval(false)}>
<ModalContent
title={Languages.t("components.public-link-security_expiration_removal_title")}
text={props.isLinkPasswordProtected
? Languages.t("components.public-link-security_expiration_removal_but_password")
: Languages.t("components.public-link-security_expiration_removal_no_password")
}
theme="danger"
icon={ShieldExclamationIcon}
buttons={
<>
<Button
className="ml-2"
theme='default'
onClick={() => setIsConfirmingExpiryRemoval(false)}
>
{Languages.t("general.cancel")}
</Button>
<Button
theme="danger"
onClick={() => {
setIsConfirmingExpiryRemoval(false)
saveValue(0);
}}
>
{Languages.t("components.public-link-security_expiration_removal_confirm")}
</Button>
</>
}
/>
</Modal>
</>;
}
Loading

0 comments on commit 3a0e0a9

Please sign in to comment.