diff --git a/tdrive/frontend/public/locales/de.json b/tdrive/frontend/public/locales/de.json index 55fd1a37..7dcc074b 100644 --- a/tdrive/frontend/public/locales/de.json +++ b/tdrive/frontend/public/locales/de.json @@ -45,7 +45,7 @@ "scenes.app.workspaces.create_company.group_data.group_main_activity.administration": "Verwaltung", "scenes.app.workspaces.create_company.group_data.group_main_activity.other": "Sonstige", "components.drive_dropzone.uploading": "Hochladen ...", - "components.user_picker.modal_no_result": "Kein Ergebnis gefunden", + "components.user_picker.modal_results_count_none": "Kein Ergebnis gefunden", "components.users_picker.add_me": "Mich hinzufügen", "scenes.app.workspaces.create_company.invitations.title": "Konfigurieren Sie Ihren Arbeitsbereich.", "scenes.app.header.disconnected": "Sie sind nicht verbunden", diff --git a/tdrive/frontend/public/locales/en.json b/tdrive/frontend/public/locales/en.json index 4ebe5722..af045d67 100644 --- a/tdrive/frontend/public/locales/en.json +++ b/tdrive/frontend/public/locales/en.json @@ -51,13 +51,14 @@ "scenes.app.workspaces.create_company.group_data.group_main_activity.administration": "Administration", "scenes.app.workspaces.create_company.group_data.group_main_activity.other": "Other", "components.drive_dropzone.uploading": "Uploading...", - "components.user_picker.modal_no_result": "No results found", + "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.read": "Grant read", "components.user_picker.modal.result_add.write": "Grant write", "components.user_picker.modal.result_add.manage": "Grant full", "components.user_picker.modal.result_add.remove": "Remove rights", - "components.user_picker.modal_results_trucated": "First {{$1}} results of {{$2}} shown...", + "components.user_picker.modal_results_count_none": "No user found matching \"{{$1}}\"", + "components.user_picker.modal_results_truncated": "First {{$1}} results of {{$2}} shown...", "components.users_picker.add_me": "Add me", "scenes.app.workspaces.create_company.invitations.title": "Configure your workspace.", "scenes.app.header.disconnected": "You are disconnected", @@ -222,7 +223,8 @@ "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_manage_title":"Manage access to", + "components.internal-access_manage_subtitle":"Grant access", "components.internal-access_inherit_parent":"Inherit parent folder", "components.internal-access_inherit_parent_perm":"Choose to inherit or not the parent folder permissions.", "components.internal-access_company_member":"Every member from the company", diff --git a/tdrive/frontend/public/locales/eo.json b/tdrive/frontend/public/locales/eo.json index 50b7d9e9..cf1ac4d7 100644 --- a/tdrive/frontend/public/locales/eo.json +++ b/tdrive/frontend/public/locales/eo.json @@ -84,7 +84,7 @@ "scenes.app.workspaces.create_company.group_data.group_main_activity.administration": "Administrado", "scenes.app.workspaces.create_company.group_data.group_main_activity.other": "Alia", "components.drive_dropzone.uploading": "Alŝutante…", - "components.user_picker.modal_no_result": "Neniuj rezultoj trovitaj", + "components.user_picker.modal_results_count_none": "Neniuj rezultoj trovitaj", "components.users_picker.add_me": "Aldonu min", "scenes.app.workspaces.create_company.invitations.title": "Agordu vian laborspacon.", "scenes.app.header.disconnected": "Vi estas malkonektita", diff --git a/tdrive/frontend/public/locales/es.json b/tdrive/frontend/public/locales/es.json index ba665fd8..7b9251e3 100644 --- a/tdrive/frontend/public/locales/es.json +++ b/tdrive/frontend/public/locales/es.json @@ -3,7 +3,7 @@ "general.continue": "Continuar", "general.back": "Atrás", "components.drive_dropzone.uploading": "Subiendo ...", - "components.user_picker.modal_no_result": "No se han encontrado resultados", + "components.user_picker.modal_results_count_none": "No se han encontrado resultados", "scenes.app.header.disconnected": "Estás desconectado", "scenes.app.header.disconnected.reload": "Recargar", "scenes.apps.parameters.workspace_sections.members": "Participantes", diff --git a/tdrive/frontend/public/locales/eu.json b/tdrive/frontend/public/locales/eu.json index c5151f71..520dae5c 100644 --- a/tdrive/frontend/public/locales/eu.json +++ b/tdrive/frontend/public/locales/eu.json @@ -27,7 +27,7 @@ "scenes.app.workspaces.create_company.group_data.group_main_activity.publishing_communication_multimedia": "Argitalpena / Komunikazioa / Multimedia", "scenes.app.workspaces.create_company.group_data.group_main_activity.education": "Hezkuntza", "general.continue": "Jarraitu", - "components.user_picker.modal_no_result": "Ez da emaitzarik aurkitu", + "components.user_picker.modal_results_count_none": "Ez da emaitzarik aurkitu", "scenes.app.workspaces.create_company.group_data.group_type.public_organization": "Erakunde publikoa", "scenes.app.workspaces.create_company.group_data.group_type.society_club_charity": "Elkartea, kluba edo ongintza", "scenes.app.workspaces.create_company.group_data.group_type.other_group": "Bestela", diff --git a/tdrive/frontend/public/locales/fi.json b/tdrive/frontend/public/locales/fi.json index 0607ef2e..5d900cf6 100644 --- a/tdrive/frontend/public/locales/fi.json +++ b/tdrive/frontend/public/locales/fi.json @@ -15,7 +15,7 @@ "scenes.app.workspaces.create_company.group_data.group_size.10_50": "11 - 49 käyttäjää", "scenes.app.workspaces.create_company.group_data.group_size.5000_more": "Yli 5000 käyttäjää", "components.drive_dropzone.uploading": "Lähetetään...", - "components.user_picker.modal_no_result": "Tuloksia ei löytynyt", + "components.user_picker.modal_results_count_none": "Tuloksia ei löytynyt", "components.users_picker.add_me": "Lisää minut", "scenes.app.header.disconnected": "Et ole yhdistettynä", "scenes.app.header.disconnected.reload": "Lataa uudelleen", diff --git a/tdrive/frontend/public/locales/fr.json b/tdrive/frontend/public/locales/fr.json index d8f971aa..5d7b0798 100644 --- a/tdrive/frontend/public/locales/fr.json +++ b/tdrive/frontend/public/locales/fr.json @@ -51,7 +51,8 @@ "scenes.app.workspaces.create_company.group_data.group_main_activity.administration": "Administration", "scenes.app.workspaces.create_company.group_data.group_main_activity.other": "Autre", "components.drive_dropzone.uploading": "Téléchargement...", - "components.user_picker.modal_no_result": "Aucun résultat trouvé", + "components.user_picker.modal_results_count_none": "Aucun résultat trouvé", + "components.user_picker.modal_results_truncated": "{{$1}} premiers résultats sur {{$2}} affichés...", "components.users_picker.add_me": "M'ajouter", "scenes.app.workspaces.create_company.invitations.title": "Configurez votre espace de travail.", "scenes.app.header.disconnected": "Vous êtes déconnecté", @@ -196,7 +197,8 @@ "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_manage_title":"Gérer l'accès à", + "components.internal-access_manage_subtitle":"Accorder l'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", "components.internal-access_company_member": "Toutes les personnes de l'entreprise", diff --git a/tdrive/frontend/public/locales/it.json b/tdrive/frontend/public/locales/it.json index 279feddb..7ce82a11 100644 --- a/tdrive/frontend/public/locales/it.json +++ b/tdrive/frontend/public/locales/it.json @@ -77,7 +77,7 @@ "scenes.app.workspaces.create_company.group_data.group_main_activity.administration": "Amministrazione", "scenes.app.workspaces.create_company.group_data.group_main_activity.other": "Altro", "components.drive_dropzone.uploading": "Caricamento in corso...", - "components.user_picker.modal_no_result": "Nessun risultato trovato", + "components.user_picker.modal_results_count_none": "Nessun risultato trovato", "components.users_picker.add_me": "Aggiungimi", "scenes.app.workspaces.create_company.invitations.title": "Configura il tuo spazio di lavoro.", "scenes.app.header.disconnected": "Sei disconnesso", diff --git a/tdrive/frontend/public/locales/ja.json b/tdrive/frontend/public/locales/ja.json index 71a157aa..e3e43eb8 100644 --- a/tdrive/frontend/public/locales/ja.json +++ b/tdrive/frontend/public/locales/ja.json @@ -3,7 +3,7 @@ "general.continue": "持続する", "general.back": "バック", "components.drive_dropzone.uploading": "アップロード中...", - "components.user_picker.modal_no_result": "結果が見つかりません", + "components.user_picker.modal_results_count_none": "結果が見つかりません", "scenes.app.header.disconnected": "あなたは切断されています", "scenes.app.header.disconnected.reload": "リロード", "scenes.apps.parameters.workspace_sections.members": "メンバー", diff --git a/tdrive/frontend/public/locales/nb_NO.json b/tdrive/frontend/public/locales/nb_NO.json index f3eeed52..7f3f67f6 100644 --- a/tdrive/frontend/public/locales/nb_NO.json +++ b/tdrive/frontend/public/locales/nb_NO.json @@ -54,7 +54,7 @@ "scenes.app.workspaces.create_company.group_data.group_main_activity.administration": "Administrasjon", "scenes.app.workspaces.create_company.group_data.group_main_activity.other": "Annet", "components.drive_dropzone.uploading": "Laster opp…", - "components.user_picker.modal_no_result": "Ingen resultater funnet", + "components.user_picker.modal_results_count_none": "Ingen resultater funnet", "scenes.app.workspaces.create_company.invitations.title": "Konfigurer arbeidsrommet ditt.", "scenes.app.popup.adduserfromtdriveconsole.current_users_state": "{{$1}} e-post(er) vil bli lagt til", "components.newversion.new_version_component.row.part_1": "Du kjører en utdatert Tdrive-versjon", diff --git a/tdrive/frontend/public/locales/pt.json b/tdrive/frontend/public/locales/pt.json index e266191c..303f8512 100644 --- a/tdrive/frontend/public/locales/pt.json +++ b/tdrive/frontend/public/locales/pt.json @@ -134,7 +134,7 @@ "scenes.app.workspaces.create_company.group_data.group_main_activity.administration": "Administração", "scenes.app.workspaces.create_company.group_data.group_main_activity.other": "Outras", "components.drive_dropzone.uploading": "Enviando...", - "components.user_picker.modal_no_result": "Nenhum resultado encontrado", + "components.user_picker.modal_results_count_none": "Nenhum resultado encontrado", "components.users_picker.add_me": "Me adicione", "scenes.app.workspaces.create_company.invitations.title": "Configure seu espaço de trabalho.", "scenes.app.header.disconnected": "Você está desconectado", diff --git a/tdrive/frontend/public/locales/ru.json b/tdrive/frontend/public/locales/ru.json index 34ab655d..da44146d 100644 --- a/tdrive/frontend/public/locales/ru.json +++ b/tdrive/frontend/public/locales/ru.json @@ -50,7 +50,8 @@ "scenes.app.workspaces.create_company.group_data.group_main_activity.administration": "Управление", "scenes.app.workspaces.create_company.group_data.group_main_activity.other": "Прочее", "components.drive_dropzone.uploading": "Загрузка...", - "components.user_picker.modal_no_result": "Результатов не найдено", + "components.user_picker.modal_results_count_none": "Результатов не найдено", + "components.user_picker.modal_results_truncated": "Показаны первые {{$1}} результата из {{$2}}...", "components.users_picker.add_me": "Добавить меня", "scenes.app.workspaces.create_company.invitations.title": "Настройка рабочей среды.", "scenes.app.header.disconnected": "Соединение отсутствует", @@ -196,7 +197,8 @@ "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_manage_title":"Управляйте доступом к", + "components.internal-access_manage_subtitle":"Предоставление доступа", "components.internal-access_inherit_parent":"Inherit parent folder", "components.internal-access_inherit_parent_perm":"Choose to inherit or not the parent folder permissions.", "components.internal-access_company_member":"Every member from the company", diff --git a/tdrive/frontend/public/locales/si.json b/tdrive/frontend/public/locales/si.json index 2d5b4201..96a41cdc 100644 --- a/tdrive/frontend/public/locales/si.json +++ b/tdrive/frontend/public/locales/si.json @@ -178,7 +178,7 @@ "scenes.app.workspaces.create_company.group_data.group_main_activity.electronics_electricity_energy": "ඉලෙක්ට්රොනික / විදුලි / බලශක්ති", "scenes.app.workspaces.create_company.group_data.group_main_activity.machinery_automotive": "යන්ත්‍රෝපකරණ / වාහන", "scenes.app.workspaces.create_company.group_data.group_main_activity.transport_logistics": "ප්රවාහන / සැපයුම්", - "components.user_picker.modal_no_result": "ප්‍රතිඵල හමු නොවිණි", + "components.user_picker.modal_results_count_none": "ප්‍රතිඵල හමු නොවිණි", "scenes.apps.account.title": "Account parameters", "components.alert.confirm": "ඔබේ ක්‍රියාව තහවුරු කරන්න", "scenes.app.popup.adduser.adresses_message": "කරුණාකර ලිපින කොමාවකින් හෝ ඉඩකින් වෙන් කරන්න. Tdrive ඔබගේ දායකත්වය මත පදනම්ව ආරාධනා ගණන සීමා කළ හැකි බව මතක තබා ගන්න.", diff --git a/tdrive/frontend/public/locales/tr.json b/tdrive/frontend/public/locales/tr.json index 01deea6f..ed2dd5fb 100644 --- a/tdrive/frontend/public/locales/tr.json +++ b/tdrive/frontend/public/locales/tr.json @@ -167,7 +167,7 @@ "scenes.join.create_the_company_button": "şirket oluştur", "scenes.join.join_workspace_from_company": "{{$2}}'ten {{$1}}'e katılın!", "scenes.join.tdrive_description": "Tdrive, ekip üretkenliğinizi artırmak için oluşturulmuş açık kaynaklı bir dijital çalışma alanıdır.", - "components.user_picker.modal_no_result": "Sonuç bulunamadı", + "components.user_picker.modal_results_count_none": "Sonuç bulunamadı", "components.users_picker.add_me": "beni ekle", "scenes.app.workspaces.create_company.invitations.title": "Çalışma alanınızı yapılandırın.", "scenes.app.header.disconnected": "bağlantınız kesildi", diff --git a/tdrive/frontend/public/locales/vi.json b/tdrive/frontend/public/locales/vi.json index c7283477..014982bd 100644 --- a/tdrive/frontend/public/locales/vi.json +++ b/tdrive/frontend/public/locales/vi.json @@ -39,7 +39,7 @@ "scenes.app.workspaces.create_company.group_data.group_main_activity.electronics_electricity_energy": "Điện tử / Điện / Năng lượng", "scenes.app.workspaces.create_company.group_data.group_main_activity.studies_and_advice": "Học và lời khuyên", "scenes.app.workspaces.create_company.group_data.group_main_activity.printing_paper": "In ấn / Giấy", - "components.user_picker.modal_no_result": "Không tìm thấy kết quả", + "components.user_picker.modal_results_count_none": "Không tìm thấy kết quả", "scenes.app.workspaces.create_company.group_data.group_main_activity.business_services": "Dịch vụ kinh doanh", "scenes.app.workspaces.create_company.group_data.group_main_activity.entertainment": "Giải trí", "scenes.app.workspaces.create_company.group_data.group_main_activity.textile_clothing_shoes": "Dệt may / Quần áo / Giày", diff --git a/tdrive/frontend/public/locales/vn.json b/tdrive/frontend/public/locales/vn.json index 5dfb0597..32976f4a 100644 --- a/tdrive/frontend/public/locales/vn.json +++ b/tdrive/frontend/public/locales/vn.json @@ -51,7 +51,8 @@ "scenes.app.workspaces.create_company.group_data.group_main_activity.administration": "Quản trị", "scenes.app.workspaces.create_company.group_data.group_main_activity.other": "Khác", "components.drive_dropzone.uploading": "Đang tải lên...", - "components.user_picker.modal_no_result": "Không tìm thấy kết quả", + "components.user_picker.modal_results_count_none": "Không tìm thấy kết quả", + "components.user_picker.modal_results_truncated": "{{$1}} kết quả đầu tiên trong số {{$2}} kết quả được hiển thị...", "components.users_picker.add_me": "Thêm tôi", "scenes.app.workspaces.create_company.invitations.title": "Cấu hình không gian làm việc của bạn.", "scenes.app.header.disconnected": "Bạn đang ngoại tuyến", @@ -212,7 +213,8 @@ "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_manage_title":"Quản lý quyền truy cập vào", + "components.internal-access_manage_subtitle":"Cấp phép truy cập", "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.", "components.internal-access_company_member": "Mọi thành viên của công ty", diff --git a/tdrive/frontend/public/locales/zh_Hans.json b/tdrive/frontend/public/locales/zh_Hans.json index b83b78d1..9fff93f1 100644 --- a/tdrive/frontend/public/locales/zh_Hans.json +++ b/tdrive/frontend/public/locales/zh_Hans.json @@ -46,7 +46,7 @@ "scenes.app.workspaces.create_company.group_data.group_main_activity.pharmaceutical_industry": "医药行业", "scenes.app.workspaces.create_company.group_data.group_main_activity.other": "其他", "components.drive_dropzone.uploading": "正在上传...", - "components.user_picker.modal_no_result": "未找到结果", + "components.user_picker.modal_results_count_none": "未找到结果", "components.users_picker.add_me": "添加我", "scenes.app.workspaces.create_company.invitations.title": "配置你的工作空间。", "scenes.app.header.disconnected": "您已断开连接", diff --git a/tdrive/frontend/src/app/views/client/body/drive/components/select-users.tsx b/tdrive/frontend/src/app/views/client/body/drive/components/select-users.tsx deleted file mode 100644 index b7551640..00000000 --- a/tdrive/frontend/src/app/views/client/body/drive/components/select-users.tsx +++ /dev/null @@ -1,135 +0,0 @@ -import { useEffect, useRef, useState } from 'react'; -import UserBlock from '@molecules/grouped-rows/user'; -import { Input } from '@atoms/input/input-text'; -import { useSearchUsers } from '@features/users/hooks/use-search-user-list'; -import { Button } from '@atoms/button/button'; -import { UserType } from '@features/users/types/user'; -import { InputDecorationIcon } from '@atoms/input/input-decoration-icon'; -import { SearchIcon } from '@heroicons/react/solid'; -import { Info } from '@atoms/text'; -import Languages from '@features/global/services/languages-service'; -import _ from 'lodash'; -import { DriveFileAccessLevel } from 'app/features/drive/types'; - - -export default (props: { - className?: string; - onChange: (users: UserType[]) => void; - initialUsers: UserType[]; - level: DriveFileAccessLevel; -}) => { - const [users, setUsers] = useState(props.initialUsers); - const { search, result, query } = useSearchUsers({ scope: 'company' }); - const [isFocus, setFocus] = useState(false); - const inputElement = useRef(null); - const maxUserResultsShown = 5; - const [selectedUserKey, setSelectedUserKey] = useState(''); - - useEffect(() => { - if (users.length) props.onChange(users); - }, [users]); - - const shownResults = _.reverse(result.slice(0, maxUserResultsShown)); - const selectedKeyIndex = shownResults.findIndex(({id}) => id === selectedUserKey); - - const moveSelection = (offset: number) => { - if (selectedKeyIndex === -1) { - if (offset < 0) - setSelectedUserKey(shownResults[shownResults.length - 1].id || ''); - else if (offset > 0) - setSelectedUserKey(shownResults[0].id || ''); - } else { - const nextIndex = (selectedKeyIndex + shownResults.length + offset) % shownResults.length; - setSelectedUserKey(shownResults[nextIndex].id || ''); - } - }; - const doEnterKey = () => { - const user = shownResults[selectedKeyIndex]; - if (user) { - setUsers([user]); - search(''); - } - setSelectedUserKey(''); - }; - - const keyEvents : { [key: string]: () => void } = { - "ArrowUp": () => moveSelection(-1), - "ArrowDown": () => moveSelection(1), - "Enter": () => doEnterKey(), - }; - - return ( -
- ( - setFocus(true)} - onBlur={() => { - setTimeout(() => { - if (inputElement.current !== document.activeElement) { - setFocus(false); - } - }, 200); - }} - onKeyDown={(e) => { - if (e.code in keyEvents) { - keyEvents[e.code](); - e.preventDefault(); - } - }} - placeholder={Languages.t('components.select-users_search_users')} - className={props.className + ' ' + className + ' w-full'} - theme="plain" - onChange={e => { - search(e.target.value); - setSelectedUserKey(''); - }} - inputRef={inputElement} - /> - )} - /> - {isFocus && query?.trim() && ( -
-
- {result.length === 0 && ( -
- {Languages.t('components.user_picker.modal_no_result')} -
- )} - {shownResults.map((user, i) => { - return ( - 0 && i !== (selectedKeyIndex + 1) ? ' border-t' : ''))} - suffix={ - - } - /> - ); - })} - {result.length > maxUserResultsShown && -
- {Languages.t('components.user_picker.modal_results_trucated', - [maxUserResultsShown, result.length], - 'First {{$1}} results of {{$2}} shown...')} -
} -
-
-
- )} -
- ); -}; diff --git a/tdrive/frontend/src/app/views/client/body/drive/modals/update-access/index.tsx b/tdrive/frontend/src/app/views/client/body/drive/modals/update-access/index.tsx index 616517d3..8dcc9ae5 100644 --- a/tdrive/frontend/src/app/views/client/body/drive/modals/update-access/index.tsx +++ b/tdrive/frontend/src/app/views/client/body/drive/modals/update-access/index.tsx @@ -29,6 +29,7 @@ export const AccessModal = () => { return ( setState({ ...state, open: false })} > {!!state.id && } diff --git a/tdrive/frontend/src/app/views/client/body/drive/modals/update-access/internal-access.tsx b/tdrive/frontend/src/app/views/client/body/drive/modals/update-access/internal-access.tsx index 47f5d236..6bb2e92d 100644 --- a/tdrive/frontend/src/app/views/client/body/drive/modals/update-access/internal-access.tsx +++ b/tdrive/frontend/src/app/views/client/body/drive/modals/update-access/internal-access.tsx @@ -1,90 +1,206 @@ -import { Subtitle } from '@atoms/text'; -import UserBlock from '@molecules/grouped-rows/user'; +import { useState, useRef } from 'react'; + +import type { DriveFileAccessLevel } from '@features/drive/types'; + +import Languages from 'features/global/services/languages-service'; import { useDriveItem } from '@features/drive/hooks/use-drive-item'; -import { DriveFileAccessLevel } from '@features/drive/types'; import { useCurrentUser } from '@features/users/hooks/use-current-user'; import { useUser } from '@features/users/hooks/use-user'; -import { UserType } from '@features/users/types/user'; -import { useState } from 'react'; -import SelectUsers from '../../components/select-users'; -import { AccessLevelDropdown } from '../../components/access-level-dropdown'; -import Languages from 'features/global/services/languages-service'; +import { useSearchUsers } from '@features/users/hooks/use-search-user-list'; import { changeUserAccess, getUserAccessLevel, getAllUserAccesses } from '@features/files/utils/access-info-helpers'; +import { Subtitle } from '@atoms/text'; +import { Input } from '@atoms/input/input-text'; +import { Button } from '@atoms/button/button'; +import { SearchIcon } from '@heroicons/react/solid'; +import { InputDecorationIcon } from '@atoms/input/input-decoration-icon'; +import { AccessLevelDropdown } from '../../components/access-level-dropdown'; +import UserBlock from '@molecules/grouped-rows/user'; export const InternalAccessManager = ({ id, disabled }: { id: string; disabled: boolean }) => { - const { item } = useDriveItem(id); + const { item, loading, update } = useDriveItem(id); + const [level, setLevel] = useState('manage'); + const usersWithAccess = item && getAllUserAccesses(item); + const { search, result, query } = useSearchUsers({ scope: 'company' }); + const [searchString, setSearchString] = useState(""); + const [isFocus, setFocus] = useState(false); + const inputElement = useRef(null); + const maxUserResultsShown = 5; + const minUserHeight = 3; + const showResults = isFocus && query?.trim(); + + const knownUsers = item && new Set(getAllUserAccesses(item).map(({id}) => id)); + const absentUserResults = item && result && result.filter(({id}) => !knownUsers?.has(id!)); + const shownResults = absentUserResults && absentUserResults.slice(0, maxUserResultsShown); + const resultFooterText = knownUsers && shownResults && + (shownResults.length == 0 + ? Languages.t('components.user_picker.modal_results_count_none', [searchString]) + : (absentUserResults.length > maxUserResultsShown + ? Languages.t('components.user_picker.modal_results_truncated', [maxUserResultsShown, absentUserResults.length]) + : false + )); + + const [selectedUserKey, setSelectedUserKey] = useState(''); + const selectedKeyIndex = shownResults ? shownResults.findIndex(({id}) => id === selectedUserKey) : -1; + + const moveSelection = (offset: number) => { + if (!shownResults) return; + if (selectedKeyIndex === -1) { + if (offset < 0) + setSelectedUserKey(shownResults[shownResults.length - 1].id || ''); + else if (offset > 0) + setSelectedUserKey(shownResults[0].id || ''); + } else if (selectedKeyIndex != null) { + const nextIndex = (selectedKeyIndex + shownResults.length + offset) % shownResults.length; + setSelectedUserKey(shownResults[nextIndex].id || ''); + } + }; + + const doEnterKey = () => { + const user = shownResults && selectedKeyIndex > -1 && shownResults[selectedKeyIndex]; + if (user) { + item && update(changeUserAccess(item, user.id!, level)); + search(''); + } + setSelectedUserKey(''); + }; + + const keyEvents : { [key: string]: () => void } = { + "ArrowUp": () => moveSelection(-1), + "ArrowDown": () => moveSelection(1), + "Enter": () => doEnterKey(), + }; return ( <> - {Languages.t('components.internal-access_specific_rules')} + {Languages.t('components.internal-access_manage_subtitle')} -
- - - {item && getAllUserAccesses(item)?.map(user => - +
+
+
+ ( + setFocus(true)} + onBlur={() => { + setTimeout(() => { + if (inputElement.current !== document.activeElement) { + setFocus(false); + } + }, 200); + }} + onKeyDown={(e) => { + if (e.code in keyEvents) { + keyEvents[e.code](); + e.preventDefault(); + } + }} + placeholder={Languages.t('components.select-users_search_users')} + className={className + ' w-full rounded-r-none'} + theme="plain" + onChange={e => { + search(e.target.value); + setSearchString(e.target.value); + }} + value={searchString} + inputRef={inputElement} + /> + )} + /> +
+
+ setLevel(level)} + /> +
+
+ {showResults && + <> +
+
{/* Necessary so the relative results don't take height */} +
+ { shownResults && shownResults.map((user, index) => + 0 && index !== ((selectedKeyIndex ?? 0) + 1) ? ' border-t' : ''))} + isSearchResultAdd={level} + onAddSearchResult={(userId) => { + item && update(changeUserAccess(item, userId, level)); + }} + /> + )} + {!loading && resultFooterText && <> +
+ {resultFooterText} +
+ } +
+
+
+ } + {usersWithAccess?.map((user, index) => + )} -
+ {(usersWithAccess?.length ?? 0) < minUserHeight && + [...Array(minUserHeight - (usersWithAccess?.length ?? 0))].map((_, i) => +
+
{/* make same size as userblock */} +
+ )} + {(!showResults) && +
 
+ }
); }; -const UserAccessSelector = ({ id, disabled }: { id: string; disabled: boolean }) => { - const { item, loading, update } = useDriveItem(id); - const [level, setLevel] = useState('manage'); - - return ( -
-
- { - const id = users[0]?.id; //TODO: all others ignored - item && id && update(changeUserAccess(item, id, level)); - }} - initialUsers={[]} - /> -
-
- setLevel(level)} - /> -
-
- ); -}; - -const UserAccessLevel = ({ - id, - userId, - disabled, -}: { +const UserAccessLevel = (props: { id: string; userId: string; disabled: boolean; + className?: string; + isSearchResultAdd?: DriveFileAccessLevel; + onAddSearchResult?: (userId: string) => void, }) => { - const { item, loading, update } = useDriveItem(id); - const user = useUser(userId); + const { item, loading, update } = useDriveItem(props.id); + const user = useUser(props.userId); const { user: currentUser } = useCurrentUser(); return ( item && update(changeUserAccess(item, userId, level === 'remove' ? false : level))} - /> + props.isSearchResultAdd + ? + + : item && update(changeUserAccess(item, props.userId, level === 'remove' ? false : level))} + /> } /> );