Merge branch 'develop' into feature/oauth2-client

This commit is contained in:
Timofey Boyko 2024-02-20 12:43:09 +03:00
commit 9573816860
513 changed files with 31457 additions and 8705 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<babeledit_project be_version="5.0.0" version="1.3">
<babeledit_project be_version="4.1.0" version="1.3">
<!--
BabelEdit project file
@ -26,6 +26,7 @@
<name>ErrorConfirmURLError</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -145,6 +146,7 @@
<name>ErrorExpiredActivationLink</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -264,6 +266,7 @@
<name>ErrorInvalidActivationLink</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -383,6 +386,7 @@
<name>ErrorNotAllowedOption</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -502,6 +506,7 @@
<name>ErrorUserNotFound</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -621,6 +626,7 @@
<name>InvalidUsernameOrPassword</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -740,6 +746,7 @@
<name>LoginWithAccountNotFound</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -859,6 +866,7 @@
<name>LoginWithBruteForce</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -978,6 +986,7 @@
<name>LoginWithBruteForceCaptcha</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -1097,6 +1106,7 @@
<name>RecaptchaInvalid</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -1216,6 +1226,7 @@
<name>SsoAttributesNotFound</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -1335,6 +1346,7 @@
<name>SsoAuthFailed</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -1454,6 +1466,7 @@
<name>SsoError</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -1573,6 +1586,7 @@
<name>SsoSettingsCantCreateUser</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -1692,6 +1706,7 @@
<name>SsoSettingsDisabled</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -1811,6 +1826,7 @@
<name>SsoSettingsEmptyToken</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -1930,6 +1946,7 @@
<name>SsoSettingsNotValidToken</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -2049,6 +2066,7 @@
<name>SsoSettingsUserTerminated</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -2173,6 +2191,7 @@
<name>CodeSubtitle</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -2292,6 +2311,7 @@
<name>CodeTitle</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -2411,6 +2431,7 @@
<name>CookieSettingsTitle</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -2530,6 +2551,7 @@
<name>ErrorInvalidText</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -2649,6 +2671,7 @@
<name>ExpiredCode</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -2768,6 +2791,7 @@
<name>ForgotPassword</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -2887,6 +2911,7 @@
<name>InvalidCode</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -3006,6 +3031,7 @@
<name>MessageAuthorize</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -3125,6 +3151,7 @@
<name>MessageEmailConfirmed</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -3244,6 +3271,7 @@
<name>MessageSendPasswordRecoveryInstructionsOnEmail</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -3363,6 +3391,7 @@
<name>NotFoundCode</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -3482,6 +3511,7 @@
<name>Or</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -3601,6 +3631,7 @@
<name>PasswordRecoveryTitle</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -3720,6 +3751,7 @@
<name>RecoverAccess</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -3839,6 +3871,7 @@
<name>RecoverContactEmailPlaceholder</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -3958,6 +3991,7 @@
<name>RecoverTextBody</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -4077,6 +4111,7 @@
<name>Register</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -4196,6 +4231,7 @@
<name>RegisterTextBodyAfterDomainsList</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -4315,6 +4351,7 @@
<name>RegisterTextBodyBeforeDomainsList</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -4434,6 +4471,7 @@
<name>RegisterTitle</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -4553,6 +4591,7 @@
<name>RegistrationEmailWatermark</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -4672,6 +4711,7 @@
<name>RememberHelper</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -4791,6 +4831,7 @@
<name>ResendCode</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -4910,6 +4951,7 @@
<name>SignInWithCode</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>
@ -5029,6 +5071,7 @@
<name>SignInWithPassword</name>
<description/>
<comment/>
<default_text/>
<translations>
<translation>
<language>ar-SA</language>

View File

@ -1,6 +1,6 @@
{
"name": "docspace",
"version": "2.0.2",
"version": "2.0.3",
"private": true,
"workspaces": {
"packages": [

View File

@ -1,3 +1,6 @@
import type { TTheme } from "@docspace/shared/themes";
import type store from "./src/store";
declare module "*.svg" {
const SVG: React.VFC<React.SVGProps<SVGSVGElement>>;
export default SVG;
@ -6,3 +9,11 @@ declare module "*.svg?url" {
const SVGUrl: string;
export default SVGUrl;
}
declare global {
type TStore = typeof store;
interface Window {
theme: TTheme;
}
}

View File

@ -1,6 +1,6 @@
{
"name": "@docspace/client",
"version": "2.0.2",
"version": "2.0.3",
"private": true,
"homepage": "",
"scripts": {

View File

@ -1,14 +1,7 @@
{
"AccessDenied": "المحاولة مرفوضة",
"Error401Text": "عذرا، المورد غير متاح حاليا.",
"Error403Text": "نأسف، الوصول مرفوض.",
"Error404Text": "عذرا، لا يمكن العثور على المورد.",
"ErrorDeactivatedText": "DocSpace هذا معطل",
"ErrorEmptyResponse": "رد فارغ",
"ErrorOfflineText": "لا يوجد اتصال بالإنترنت",
"ErrorUnavailableText": "DocSpace غير متوفر",
"InvalidLink": "رابط غير صالح",
"LinkDoesNotExist": "الرابط الذي تحاول فتحه غير موجود",
"LinkHasExpired": "انتهت صلاحية الرابط الذي تحاول فتحه",
"PortalRestriction": "لم يتم تضمين عنوان IP الخاص بك في قائمة عناوين IP المسموح بها للوصول إلى DocSpace. قم بإيقاف تشغيل VPN إذا تم تمكينه وأعد تحميل الصفحة، أو استخدم عنوان IP آخر لتسجيل الدخول."
"LinkHasExpired": "انتهت صلاحية الرابط الذي تحاول فتحه"
}

View File

@ -35,7 +35,7 @@
"MobileWin": "حمّل ONLYOFFICE Desktop Editors لنظام ويندوز",
"MoveHere": "انقل إلى هنا",
"MoveToOperation": "جارٍ النقل",
"NewForm": "قوالب جاهزة",
"NewForm": "نموذج PDF",
"Other": "آخر",
"OwnerChange": "تغيير المالك",
"Presentations": "العروض التقديمية",

View File

@ -1,14 +1,7 @@
{
"AccessDenied": "Giriş qadağandır",
"Error401Text": "Təəssüf ki, resurs hal-hazırda əlçatan deyil.",
"Error403Text": "Təəssüf ki, giriş rədd edilmişdir.",
"Error404Text": "Təəssüf ki, resurs tapıla bilmir.",
"ErrorDeactivatedText": "Bu DocSpace deaktiv edilib",
"ErrorEmptyResponse": "Boş cavab",
"ErrorOfflineText": "İnternet bağlantısı tapılmadı",
"ErrorUnavailableText": "DocSpace əlçatan deyil",
"InvalidLink": "Etibarsız keçid",
"LinkDoesNotExist": "Açmağa çalışdığınız keçid mövcud deyil.",
"LinkHasExpired": "İzlədiyiniz keçidin vaxtı keçib.",
"PortalRestriction": "IP ünvanınız bu DocSpace-ə daxil olmağa icazə verilən IP ünvanlarının siyahısına daxil edilməyib. Aktivdirsə, VPN-i söndürün və səhifəni yenidən yükləyin və ya daxil olmaq üçün başqa IP ünvanından istifadə edin."
"LinkHasExpired": "İzlədiyiniz keçidin vaxtı keçib."
}

View File

@ -35,7 +35,7 @@
"MobileWin": "Windows üçün ONLYOFFICE Masaüstü Redaktorları endirin",
"MoveHere": "Bura köçürün",
"MoveToOperation": "Yer dəyişdirmə",
"NewForm": "Forma şablonu",
"NewForm": "PDF forma",
"Other": "Digər",
"OwnerChange": "Sahibi dəyiş",
"Presentations": "Təqdimatlar",

View File

@ -1,14 +1,7 @@
{
"AccessDenied": "Достъпът отказан",
"Error401Text": "Съжаляваме, в момента няма достъп до този ресурс.",
"Error403Text": "Съжаляваме, достъпът отказан.",
"Error404Text": "Съжаляваме, ресурсът не може да бъде открит.",
"ErrorDeactivatedText": "Този DocSpace е деактивиран",
"ErrorEmptyResponse": "Празен отговор",
"ErrorOfflineText": "Не е открита връзка с интернет",
"ErrorUnavailableText": "DocSpace не е наличен",
"InvalidLink": "Невалиден линк",
"LinkDoesNotExist": "Линкът, който се опитвате да отворите, не съществува.",
"LinkHasExpired": "Линкът, който сте последвали, е изтекъл.",
"PortalRestriction": "Вашият IP адрес не е включен в списъка с позволени IP адреси за достъп до този DocSpace. Изключете VPN, ако е активиран, и презаредете страницата или използвайте друг IP адрес, за да се впишете."
"LinkHasExpired": "Линкът, който сте последвали, е изтекъл."
}

View File

@ -35,7 +35,7 @@
"MobileWin": "Изтеглете ONLYOFFICE настолни редактори за Windows",
"MoveHere": "Премести се тук",
"MoveToOperation": "Преместване",
"NewForm": "Шаблон на формуляр",
"NewForm": "PDF формуляр",
"Other": "Друг",
"OwnerChange": "Смени собственик",
"Presentations": "Презентации",

View File

@ -1,14 +1,7 @@
{
"AccessDenied": "Přístup odepřen",
"Error401Text": "Omlouváme se, ale tento zdroj není v současné době přístupný.",
"Error403Text": "Omlouváme se, přístup odepřen.",
"Error404Text": "Omlouváme se, zdroj nelze najít.",
"ErrorDeactivatedText": "Tento prostor DocSpace je deaktivován",
"ErrorEmptyResponse": "Prázdná reakce",
"ErrorOfflineText": "Nebylo nalezeno připojení k internetu",
"ErrorUnavailableText": "DocSpace není k dispozici",
"InvalidLink": "Neplatný odkaz",
"LinkDoesNotExist": "Odkaz, který se snažíte otevřít, neexistuje.",
"LinkHasExpired": "Platnost odkazu, který jste použili, vypršela.",
"PortalRestriction": "Vaše IP adresa není uvedena v seznamu povolených IP adres pro přístup k tomuto DocSpace. Vypněte VPN, pokud je povolena, a znovu načtěte stránku nebo použijte k přihlášení jinou IP adresu."
"LinkHasExpired": "Platnost odkazu, který jste použili, vypršela."
}

View File

@ -35,7 +35,7 @@
"MobileWin": "Stáhnout ONLYOFFICE Desktop Editors pro Windows",
"MoveHere": "Přesunout zde",
"MoveToOperation": "Přesouvám",
"NewForm": "Šablona formuláře",
"NewForm": "PDF formulář",
"Other": "Jiný",
"OwnerChange": "Změnit vlastníka",
"Presentations": "Prezentace",

View File

@ -1,14 +1,7 @@
{
"AccessDenied": "Zugriff verweigert",
"Error401Text": "Die Ressource kann zurzeit nicht zugegriffen werden.",
"Error403Text": "Zugriff verweigert.",
"Error404Text": "Die Ressource kann nicht gefunden werden.",
"ErrorDeactivatedText": "Dieser DocSpace ist deaktiviert",
"ErrorEmptyResponse": "Leere Antwort",
"ErrorOfflineText": "Keine Internetverbindung gefunden",
"ErrorUnavailableText": "DocSpace nicht verfügbar",
"InvalidLink": "Ungültiger Link",
"LinkDoesNotExist": "Der Link, den Sie öffnen möchten, existiert nicht.",
"LinkHasExpired": "Der von Ihnen verwendete Link ist abgelaufen.",
"PortalRestriction": "Ihre IP-Adresse ist nicht in der Liste der erlaubten IP-Adressen für den Zugriff auf diesen DocSpace enthalten. Schalten Sie das VPN aus, falls es aktiviert ist, und laden Sie die Seite neu, oder verwenden Sie eine andere IP-Adresse, um sich anzumelden."
"LinkHasExpired": "Der von Ihnen verwendete Link ist abgelaufen."
}

View File

@ -35,7 +35,7 @@
"MobileWin": "Download ONLYOFFICE Desktop Editors für Windows",
"MoveHere": "Verschieben",
"MoveToOperation": "Wird verschoben",
"NewForm": "Formularvorlage",
"NewForm": "PDF-Formular",
"Other": "Sonstiges",
"OwnerChange": "Besitzer ändern",
"Presentations": "Präsentationen",

View File

@ -1,14 +1,7 @@
{
"AccessDenied": "Απαγόρευση πρόσβασης",
"Error401Text": "Δυστυχώς, ο πόρος δεν είναι προς το παρόν προσβάσιμος.",
"Error403Text": "Δυστυχώς, η πρόσβαση απορρίφθηκε.",
"Error404Text": "Δυστυχώς, ο πόρος δεν μπορεί να βρεθεί.",
"ErrorDeactivatedText": "Αυτό το DocSpace είναι απενεργοποιημένο",
"ErrorEmptyResponse": "Κενή απάντηση",
"ErrorOfflineText": "Δεν βρέθηκε σύνδεση στο διαδίκτυο.",
"ErrorUnavailableText": "DocSpace μη διαθέσιμο",
"InvalidLink": "Μη έγκυρος σύνδεσμος",
"LinkDoesNotExist": "Ο σύνδεσμος που προσπαθείτε να ανοίξετε δεν υπάρχει.",
"LinkHasExpired": "Ο σύνδεσμος που ακολουθήσατε έχει λήξει.",
"PortalRestriction": "Η διεύθυνση IP σας δεν περιλαμβάνεται στη λίστα των επιτρεπόμενων διευθύνσεων IP για πρόσβαση σε αυτό το DocSpace. Απενεργοποιήστε το VPN, αν είναι ενεργοποιημένο, και επαναφορτώστε τη σελίδα ή χρησιμοποιήστε άλλη διεύθυνση IP για να συνδεθείτε."
"LinkHasExpired": "Ο σύνδεσμος που ακολουθήσατε έχει λήξει."
}

View File

@ -35,7 +35,7 @@
"MobileWin": "Λήψη ONLYOFFICE Desktop Editors για Windows",
"MoveHere": "Μετακίνηση εδώ",
"MoveToOperation": "Μετακίνηση",
"NewForm": "Πρότυπο φόρμας",
"NewForm": "Φόρμα PDF",
"Other": "Άλλο",
"OwnerChange": "Αλλαγή κατόχου",
"Presentations": "Παρουσιάσεις",

View File

@ -1,14 +1,7 @@
{
"AccessDenied": "Access denied",
"Error401Text": "Sorry, the resource is not currently accessible.",
"Error403Text": "Sorry, access denied.",
"Error404Text": "Sorry, the resource cannot be found.",
"ErrorDeactivatedText": "This DocSpace is deactivated",
"ErrorEmptyResponse": "Empty response",
"ErrorOfflineText": "No internet connection",
"ErrorUnavailableText": "DocSpace unavailable",
"InvalidLink": "Invalid link",
"LinkDoesNotExist": "The link you are trying to open does not exist.",
"LinkHasExpired": "The link you followed has expired.",
"PortalRestriction": "Your IP address is not included in the list of allowed IP addresses to access this DocSpace. Turn off a VPN if it's enabled and reload the page, or use another IP address to log in."
"LinkHasExpired": "The link you followed has expired."
}

View File

@ -14,9 +14,9 @@
"ArchiveEmptyScreenUser": "Rooms that have been archived will appear here.",
"Archives": "Archives",
"AssignOwner": "Assign Owner",
"BackToParentFolderButton": "Back to parent folder",
"BadgeAlertDescription": "Several roles are specified in this form. Forms with multiple roles are not available for filling in this type of room",
"BadgeMyDraftTitle": "My draft",
"BackToParentFolderButton": "Back to parent folder",
"ByAuthor": "Author",
"ByCreation": "Created",
"ByErasure": "Erasure",
@ -27,20 +27,21 @@
"CollaborationRooms": "Collaboration",
"ContainsSpecCharacter": "The title can't contain any of the following characters: *+:\"<>?|/",
"Convert": "Convert",
"CopySharedLink": "Copy shared link",
"CopyItem": "<strong>{{title}}</strong> copied",
"CopyItems": "<strong>{{qty}}</strong> elements copied",
"CopyLink": "Copy link",
"CopyLinkPassword": "Copy link password",
"CopyPassword": "Copy password",
"CopySharedLink": "Copy shared link",
"CreateAndCopy": "Create and copy",
"CreateNewLink": "Create new link",
"CreateRoom": "Create room",
"CustomRooms": "Custom",
"DateLastOpened": "Date last opened",
"DaysRemaining": "Days remaining: {{daysRemaining}}",
"DeleteSharedLink": "The previous link will become unavailable. A new shared link will be created.",
"DeleteLink": "Delete link",
"DeleteLinkNote": "The link will be deleted permanently. You will not be able to undo this action.",
"DeleteSharedLink": "The previous link will become unavailable. A new shared link will be created.",
"DisableDownload": "Restrict file content copy, file download and printing",
"DisableLink": "Disable link",
"DisableNotifications": "Disable notifications",
@ -48,9 +49,9 @@
"DocumentEdited": "Cannot perform the action because the document is being edited.",
"DownloadAll": "Download all",
"EditAdditionalLink": "Edit additional link",
"EditSharedLink": "Edit shared link",
"EditLink": "Edit link",
"EditRoom": "Edit room",
"EditSharedLink": "Edit shared link",
"EmbeddingSettings": "Embedding settings",
"EmptyFile": "Empty file",
"EmptyFilterDescriptionText": "No files or folders match this filter. Try a different one or clear filter to view all files. ",
@ -58,12 +59,12 @@
"EmptyFolderDecription": "Drop files here or create new ones",
"EmptyFolderDescriptionUser": "Files and folders uploaded by admins will appear here.",
"EmptyFolderHeader": "No files in this folder",
"EmptyFormFolderDoneHeaderText": "No finished forms yet",
"EmptyFormFolderDoneDescriptionText": "This section will display all forms that are complete.",
"EmptyFormFolderProgressHeaderText": "Nothing here yet",
"EmptyFormFolderDoneHeaderText": "No finished forms yet",
"EmptyFormFolderProgressDescriptionText": "This section will display the forms in progress.",
"EmptyFormSubFolderHeaderText": "No files in this folder yet",
"EmptyFormFolderProgressHeaderText": "Nothing here yet",
"EmptyFormSubFolderDoneDescriptionText": "Here you will find forms which have been completely filled out by other users.",
"EmptyFormSubFolderHeaderText": "No files in this folder yet",
"EmptyFormSubFolderProgressDescriptionText": "Here you will find forms in progress, i.e. forms which users have started to fill out but haven't completed. ",
"EmptyRecycleBin": "Empty Trash",
"EmptyRootRoomHeader": "Welcome to DocSpace",
@ -73,8 +74,10 @@
"ExcludeSubfolders": "Exclude subfolders",
"FavoritesEmptyContainerDescription": "To mark files as favorites or remove them from this list, use the context menu.",
"FileContents": "File contents",
"FileDownloadingIsRestricted": "File downloading is restricted in this room.",
"FileRemoved": "File moved to Trash",
"FileRenamed": "The document '{{oldTitle}}' is renamed to '{{newTitle}}'",
"FilesWillAppearHere": "Files and folders added to the room will appear here.",
"FillingFormRooms": "Filling form",
"Filter": "Filter",
"FinalizeVersion": "Finalize version",
@ -84,7 +87,6 @@
"FormRoom": "Form room",
"Forms": "Forms",
"FormsTemplates": "Forms templates",
"SharedLinks": "Shared links",
"GeneralLinkDeletedSuccessfully": "New general link created successfully",
"GoToMyRooms": "Go to rooms",
"GoToPersonal": "Go to My Documents",
@ -99,6 +101,7 @@
"LinkEditedSuccessfully": "Link successfully edited and copied",
"LinkEnabledSuccessfully": "Link enabled successfully",
"LinkForPortalUsers": "Link for DocSpace users",
"LinkSettings": "Link settings",
"LinkSuccessfullyCopied": "Link successfully copied to clipboard",
"LinkSuccessfullyCreatedAndCopied": "Link successfully created and copied to clipboard",
"LinkValidUntil": "This link will be valid until",
@ -139,8 +142,8 @@
"PrivateRoomHeader": "Welcome to ONLYOFFICE private room where every symbol you type is encrypted",
"PrivateRoomSupport": "Work in Private Room is available via {{organizationName}} desktop app. <3>Instructions</3>",
"PublicRoom": "Public room",
"RecentlyAccessible": "Recently accessible via link",
"RecentEmptyContainerDescription": "Your last viewed or edited docs will be displayed in this section.",
"RecentlyAccessible": "Recently accessible via link",
"RecentViaLinkEmptyContainerDescription": "Here you will find a list of the recently opened files shared with you via an external link.",
"RecycleBinAction": "Empty trash",
"RemovedFromFavorites": "Removed from favorites",
@ -150,6 +153,7 @@
"RevokeLink": "Revoke link",
"RoomAvailableViaExternalLink": "Room available via external link",
"RoomCreated": "Room created",
"RoomEmptyAtTheMoment": "This room is empty at the moment.",
"RoomEmptyContainerDescription": "Please create the first room.",
"RoomEmptyContainerDescriptionUser": "Rooms shared with you will appear here.",
"RoomNotificationsDisabled": "Room notifications disabled",
@ -165,6 +169,7 @@
"SelectorEmptyScreenHeader": "No files and folders here yet",
"SendByEmail": "Send by email",
"Share": "Share",
"SharedLinks": "Shared links",
"ShareFolder": "Share folder",
"ShareFolderDescription": "A new room will be created and all the contents of the selected folder will be copied there. Afterwards, you can invite other users to collaborate on the files within a room.",
"ShareRoom": "Share room",
@ -190,9 +195,5 @@
"WantToRestoreTheRoom": "All shared links in this room will become active, and its contents will be available to everyone with the link. Do you want to restore the room?",
"WantToRestoreTheRooms": "All shared links in restored rooms will become active, and their contents will be available to everyone with the room links. Do you want to restore the rooms?",
"WithSubfolders": "With subfolders",
"YouLeftTheRoom": "You have left the room",
"LinkSettings": "Link settings",
"FileDownloadingIsRestricted": "File downloading is restricted in this room.",
"RoomEmptyAtTheMoment": "This room is empty at the moment.",
"FilesWillAppearHere": "Files and folders added to the room will appear here."
"YouLeftTheRoom": "You have left the room"
}

View File

@ -0,0 +1,4 @@
{
"GroupsNotFoundHeader": "No groups found",
"GroupsNotFoundDescription": "No groups match your search. Please adjust your search parameters or clear the search field to view the full list of groups."
}

View File

@ -29,6 +29,7 @@
"FileExtension": "File extension",
"FilesEmptyScreenText": "See file and folder details here",
"GalleryEmptyScreenText": "See form template details here",
"GroupsEmptyScreenText": "See group details here",
"HistoryEmptyScreenText": "Activity history will be shown here",
"InfoBanner": "The list of invited users includes the owner and/or admins of this DocSpace with full access to all rooms. The owner and/or administrator cannot be assigned other access rights. Once added to the room, they will be notified of all changes.",
"ItemsSelected": "Items selected",

View File

@ -3,6 +3,7 @@
"AddManuallyDescriptionAccounts": "Invite new users to DocSpace personally via email",
"AddManuallyDescriptionRoom": "Add existing DocSpace users to the room using the names or invite new users personally via email",
"EmailErrorMessage": "Email address is not valid. You can edit the email by clicking on it.",
"GroupMaxAvailableRoleWarning": "Groups have the maximum available role - “{{role}}”. You can issue an increase in rights after adding a group to the room.",
"InvitationLanguage": "Invitation language",
"InviteAccountSearchPlaceholder": "Invite people by email",
"Invited": "Invited",
@ -12,5 +13,6 @@
"InviteViaLinkDescriptionRoom": "Create a universal link for self-authorization in the room",
"LinkCopySuccess": "Link has been copied",
"ResetChange": "Reset change",
"SendInvitation": "Send invitation"
"SendInvitation": "Send invitation",
"UsersAlreadyAdded": "Some users have already been added"
}

View File

@ -1,7 +1,16 @@
{
"ActionButton": "Action button",
"ActionButtonDescription": "You can disable the Action and + buttons in the current section header to limit creation of files, folders, and rooms.",
"AddWatermarks": "Add watermarks to documents",
"AdvancedDisplay": "Advanced display settings",
"AllTypes": "All types",
"APILink": "API library",
"Ascending": "Ascending",
"ButtonColor": "Button color",
"ButtonCustomization": "Button customization",
"ButtonText": "Button text",
"CancelButtonText": "Cancel button text",
"Chat": "Chat",
"Code": "Code to insert",
"CopyWindowCode": "Copy window embed code",
"CreateSampleHeader": "Create sample DocSpace embed",
@ -11,28 +20,81 @@
"CSPInputPlaceholder": "Enter URL like this: https://example.com",
"CustomizingDisplay": "Customizing the display",
"DataDisplay": "Data display settings",
"DefaultColumnsOption": "Default (Quantity depends on screen width)",
"Descending": "Descending",
"DisplayColumns": "Displaying columns in a file row",
"Editor": "Editor",
"EditorDescription": "Allows you to open the SDK as a document editor for editing by specifying the id parameter for a file.",
"EditorPresetDescription": "This mode allows you to open the SDK as a document editor for editing by specifying the id parameter for a file.",
"ElementCalledAfterClicking": "The element will be called after clicking",
"ElementItself": "The element itself",
"EmbedCodeSuccessfullyCopied": "Embed code successfully copied to clipboard",
"EnterCount": "Enter count",
"EnterHeight": "Enter height",
"EnterId": "Enter id",
"EnterPage": "Enter page number",
"EnterWidth": "Enter width",
"FeedbackAndSupport": "Feedback&Support",
"FileId": "File ID",
"FileSelector": "File selector",
"FileSelectorDescription": "Opens the file selector and allows you to select a file from a list of available files.",
"FileSelectorPresetDescription": "Use this mode to display the file selector. It allows selecting a file from the list of the available ones.",
"FilesSearchDescription": "File search within the opened folder/room.",
"FileTypeDisplay": "File type display",
"Filter": "Search, Filter and Sort",
"FrameId": "Frame id",
"GetCode": "Get code to insert",
"Header": "Header",
"HeaderDescription": "You can disable header in the mobile version to limit access to the DocSpace sections (just like disabling the left menu in the desktop version).",
"InitializeSDK": "Initialize the SDK in the following modes",
"InLeftPanel": "in the left panel",
"InterfaceElements": "Interface elements",
"ItemsCount": "Items count on one page",
"ItemsCountDescription": "You can specify the number of files / folders displayed on one page, as well as specify which page to start displaying",
"JavascriptSdk": "Javascript SDK",
"MainElementParameter": "Main element parameter",
"Manager": "Manager",
"ManagerDescription": "Displays a list of entities depending on the specified rootPath. It allows you to create rooms, folders, and files and work with them.",
"ManagerPresetDescription": "Use this mode to display a list of entities depending on the specified rootPath. It allows creating and working with rooms, folders and files.",
"ManagerSearchBlockDescription": "You can disable the search, filter and sort options.",
"ManagerTitleDescription": "You can disable the title of the current section/room/folder.",
"Menu": "Left menu",
"MenuDescription": "You can disable the left menu if users don't need to navigate to other sections.",
"MobileOnly": "only mobile devices",
"Page": "Display page (number)",
"RightPanelCollapsed": "Right panel collapsed",
"RoomDescription": "You can select the room you want to display",
"RoomOrFolder": "Room or Folder",
"RoomOrFolderDescription": "You can select the section, room or folder you want to display",
"SDKDescription": "Using JavaScript SDK, you can embed a room or a folder from ONLYOFFICE DocSpace into your web interface as an iframe. Here, you can find settings for creating a sample iframe and configuring CSP. To use the complete SDK, please refer to the ",
"RoomSelector": "Room selector",
"RoomSelectorDescription": "Opens the room selector and allows you to select a room from a list of the available rooms.",
"RoomSelectorPresetDescription": "Use this mode to display the room selector. It allows selecting a room from the list of the available ones.",
"RoomTypeDisplay": "Room type display",
"Rotate": "Rotate",
"Scale": "Scale",
"SDKDescription": "Using JavaScript SDK, you can embed one of the available ONLYOFFICE DocSpace modes into your web interface as an iframe (file manager, room or file selector, editor and viewer). Here, you can find settings for creating a sample iframe using modes and configuring CSP. To use the complete SDK, please refer to the ",
"SearchBlock": "Search block",
"SearchTerm": "Search term",
"SelectButtonText": "Select Button text",
"SelectFile": "Select a file",
"SelectImage": "Select image",
"SelectorPreview": "Selector preview",
"SelectRoom": "Select a room",
"SelectToDocSpace": "Select to DocSpace",
"SelectTypes": "Select types",
"SetItUp": "Set it up",
"SettingUpColumns": "Setting up Columns",
"SettingUpColumnsDescription": "You can disable the ability for users to manage and customize file information columns in list view.",
"SetUp": "SET UP",
"SimpleRoom": "Simple Room",
"SimpleRoomDescription": "Opens the room selector and allows you to select a room from a list of the available rooms.",
"SimpleRoomPresetDescription": "Use this mode to display a list of entities depending on the specified rootPath. It allows creating and working with rooms, folders and files.",
"SortOrder": "Sort order",
"Title": "Navigate and Title"
"Subtitle": "Subtitle",
"SubtitleDescription": "Subtitle with additional comments or descriptions for the current directory.",
"TabPlugins": "Tab Plugins",
"Title": "Navigate and Title",
"Viewer": "Viewer",
"ViewerDescription": "Allows you to open the SDK as a document editor for viewing by specifying the id parameter for a file.",
"ViewerPresetDescription": "Allows you to open the SDK as a document editor for viewing by specifying the id parameter for a file."
}

View File

@ -1,8 +1,11 @@
{
"AccountLoginType": "Account login type",
"AddMembers": "Add members",
"CreateGroup": "Create group",
"DeleteSelfProfile": "Delete profile",
"DisabledEmployeeStatus": "Disabled",
"DisableUserButton": "Disable",
"EditGroup": "Edit group",
"EmailChangeButton": "Change email",
"EnableUserButton": "Enable",
"InviteLinkTitle": "Invitation link",
@ -17,5 +20,6 @@
"SuccessChangeUserStatus": "The user status was successfully changed",
"SuccessDeletePersonalData": "Personal data has been successfully deleted",
"SuccessSentInvitation": "The invitation was successfully sent",
"SuccessSentMultipleInvitatios": "Invitations were successfully sent"
"SuccessSentMultipleInvitatios": "Invitations were successfully sent",
"WithoutGroup": "Without group"
}

View File

@ -1,7 +1,7 @@
{
"AddGroupsForSharingButton": "Add groups",
"AddShareMessage": "Add message",
"AdditionalLinkRemove": "Additional link remove",
"AddShareMessage": "Add message",
"AnyoneWithLink": "Anyone with the link",
"Comment": "Comment",
"CopyExternalLink": "Copy external link",
@ -19,16 +19,16 @@
"GeneralAccessLinkRemove": "General access link remove",
"InternalLink": "Internal link",
"LinkAccessDenied": "Access to the link has been denied",
"LinkName": "Link name",
"LinkExpireAfter": "The link will expire after <1>{{date}}</1>",
"LinkExpired": "The link has expired.",
"LinkIsValid": "The link is valid for <1>{{date}}</1>",
"LinkName": "Link name",
"Notify users": "Notify users",
"ReadOnly": "Read only",
"ShareEmailBody": "You have been granted access to the {{itemName}} document. Click the link below to open the document right now: {{shareLink}}.",
"ShareEmailSubject": "You have been granted access to the {{itemName}} document",
"ShareDocument": "Share this document",
"ShareDocumentDescription": "Provide access to the document and set the permission levels.",
"ShareEmailBody": "You have been granted access to the {{itemName}} document. Click the link below to open the document right now: {{shareLink}}.",
"ShareEmailSubject": "You have been granted access to the {{itemName}} document",
"ShareVia": "Share via",
"SharingSettingsTitle": "Sharing settings"
}

View File

@ -35,7 +35,7 @@
"MobileWin": "Download ONLYOFFICE Desktop Editors for Windows",
"MoveHere": "Move here",
"MoveToOperation": "Moving",
"NewForm": "Form template",
"NewForm": "PDF Form",
"Other": "Other",
"OwnerChange": "Change owner",
"Presentations": "Presentations",
@ -56,6 +56,7 @@
"RoleViewer": "Viewer",
"RoleViewerDescription": "File viewing",
"SearchByOwner": "Search by Owners",
"SearchByHeadOfGroup": "Search by Head of group",
"Spreadsheets": "Spreadsheets",
"SubNewForm": "Blank",
"SubNewFormFile": "From text file",

View File

@ -1,14 +1,7 @@
{
"AccessDenied": "Acceso denegado ",
"Error401Text": "Perdón, el recurso no es accesible actualmente.",
"Error403Text": "Perdón, acceso denegado.",
"Error404Text": "Perdón, no se puede encontrar el recurso.",
"ErrorDeactivatedText": "Este DocSpace está desactivado",
"ErrorEmptyResponse": "Respuesta vacía",
"ErrorOfflineText": "No se ha encontrado ninguna conexión a Internet",
"ErrorUnavailableText": "DocSpace no está disponible",
"InvalidLink": "Enlace no válido",
"LinkDoesNotExist": "El enlace que usted intenta abrir no existe.",
"LinkHasExpired": "El enlace que usted ha seguido ha expirado.",
"PortalRestriction": "Su dirección IP no está incluida en la lista de direcciones IP permitidas para acceder a este DocSpace. Desactive su VPN si está activada y vuelva a cargar la página, o utilice otra dirección IP para iniciar sesión. "
"LinkHasExpired": "El enlace que usted ha seguido ha expirado."
}

View File

@ -35,7 +35,7 @@
"MobileWin": "Descargar los editores de escritorio ONLYOFFICE para Windows",
"MoveHere": "Mover aquí",
"MoveToOperation": "Moviendo",
"NewForm": "Plantilla de formulario",
"NewForm": "Formulario PDF",
"Other": "Otro",
"OwnerChange": "Cambiar propietario",
"Presentations": "Presentaciones",

View File

@ -1,14 +1,7 @@
{
"AccessDenied": "Pääsy evätty",
"Error401Text": "Valitettavasti resurssi ei ole tällä hetkellä käytettävissä.",
"Error403Text": "Valitettavasti pääsy on estetty.",
"Error404Text": "Valitettavasti resurssia ei löydy.",
"ErrorDeactivatedText": "Tämä DocSpace on poistettu käytöstä",
"ErrorEmptyResponse": "Tyhjä vastaus",
"ErrorOfflineText": "Internet-yhteyttä ei löydy",
"ErrorUnavailableText": "DocSpace ei ole saatavilla",
"InvalidLink": "Virheellinen linkki",
"LinkDoesNotExist": "Linkki, jota yrität avata ei ole olemassa.",
"LinkHasExpired": "Linkki, jota seurasit on vanhentunut.",
"PortalRestriction": "IP-osoitteesi ei sisälly tähän DocsSpaceen sallittujen IP-osoitteiden luetteloon. Sulje VPN, jos se on käytössä ja lataa sivu uudelleen, tai käytä toista IP-osoitetta kirjautuaksesi sisään."
"LinkHasExpired": "Linkki, jota seurasit on vanhentunut."
}

View File

@ -35,7 +35,7 @@
"MobileWin": "Lataa ONLYOFFICE Desktop Editors Windowsille",
"MoveHere": "Siirrä tänne",
"MoveToOperation": "Siirretään",
"NewForm": "Lomakemalli",
"NewForm": "PDF-lomake",
"Other": "Muu",
"OwnerChange": "Vaihda omistaja",
"Presentations": "Esitykset",

View File

@ -1,14 +1,7 @@
{
"AccessDenied": " Accès refusé",
"Error401Text": "Désolé, la ressource n'est pas disponible actuellement.",
"Error403Text": "Désolé, accès refusé.",
"Error404Text": "Désolé, la ressource n'a pu être trouvée.",
"ErrorDeactivatedText": "Ce DocSpace est désactivé",
"ErrorEmptyResponse": "Réponse vide",
"ErrorOfflineText": "Aucune connexion Internet trouvée",
"ErrorUnavailableText": "DocSpace non disponible",
"InvalidLink": "Lien incorrect",
"LinkDoesNotExist": "Le lien que vous essayez d'ouvrir n'existe pas.",
"LinkHasExpired": "Le lien que vous avez suivi a expiré.",
"PortalRestriction": " Votre adresse IP ne figure pas dans la liste des adresses IP autorisées à accéder à ce DocSpace. Désactivez un VPN s'il est activé et rechargez la page, ou utilisez une autre adresse IP pour vous connecter."
"LinkHasExpired": "Le lien que vous avez suivi a expiré."
}

View File

@ -35,7 +35,7 @@
"MobileWin": "Télécharger les applications de bureau ONLYOFFICE pour Windows",
"MoveHere": "Déplacer ici",
"MoveToOperation": "Déplacement",
"NewForm": "Modèle de formulaire",
"NewForm": "Formulaire PDF",
"Other": "Autre",
"OwnerChange": "Changer le propriétaire",
"Presentations": "Présentations",

View File

@ -1,14 +1,7 @@
{
"AccessDenied": "Մուտքն արգելված է",
"Error401Text": "Ներողություն, ռեսուրսը ներկայումս հասանելի չէ.",
"Error403Text": "Ներողություն, մատչումն արգելված է.",
"Error404Text": "Ներողություն, ռեսուրսը հնարավոր չէ գտնել:",
"ErrorDeactivatedText": "Այս DocSpace-ն ապաակտիվացված է",
"ErrorEmptyResponse": "Դատարկ պատասխան",
"ErrorOfflineText": "Ինտերնետ կապ չի գտնվել",
"ErrorUnavailableText": "DocSpace-ը առկա չէ",
"InvalidLink": "Անվավեր հղում",
"LinkDoesNotExist": "Հղումը, որը փորձում եք բացել, գոյություն չունի:",
"LinkHasExpired": "Ձեր հետևած հղումը ժամկետանց է:",
"PortalRestriction": "Ձեր IP հասցեն ներառված չէ այս DocSpace մուտք գործելու համար թույլատրված IP հասցեների ցանկում: Անջատեք VPN-ը, եթե այն միացված է, և վերաբեռնեք էջը կամ օգտագործեք այլ IP հասցե՝ մուտք գործելու համար: "
"LinkHasExpired": "Ձեր հետևած հղումը ժամկետանց է:"
}

View File

@ -35,7 +35,7 @@
"MobileWin": "Ներբեռնել ONLYOFFICE Desktop Editors Windows-ի համար",
"MoveHere": "Տեղափոխել այստեղ",
"MoveToOperation": "Տեղափոխություն",
"NewForm": "Ձևանմուշ",
"NewForm": "PDF Ձև",
"Other": "Այլ",
"OwnerChange": "Փոխել տնօրինողին",
"Presentations": "Ներկայացումներ",

View File

@ -1,14 +1,7 @@
{
"AccessDenied": " Accesso negato",
"Error401Text": "Spiacente, la risorsa non è attualmente accessibile.",
"Error403Text": "Spiacente, accesso negato.",
"Error404Text": "Spiacente, impossibile trovare la risorsa.",
"ErrorDeactivatedText": "Questo DocSpace è disattivato",
"ErrorEmptyResponse": "Risposta vuota",
"ErrorOfflineText": "Nessuna connessione a internet trovata",
"ErrorUnavailableText": "DocSpace non disponibile",
"InvalidLink": "Link non valido",
"LinkDoesNotExist": "Il link che stai cercando di aprire non esiste.",
"LinkHasExpired": "Il link che hai seguito è scaduto.",
"PortalRestriction": " Il tuo indirizzo IP non è incluso nell'elenco degli indirizzi IP consentiti per accedere a questo DocSpace. Disattiva una VPN se è abilitata e ricarica la pagina oppure utilizza un altro indirizzo IP per accedere."
"LinkHasExpired": "Il link che hai seguito è scaduto."
}

View File

@ -35,7 +35,7 @@
"MobileWin": "Scarica ONLYOFFICE Desktop Editors per Windows",
"MoveHere": "Sposta qui",
"MoveToOperation": "Sta spostando",
"NewForm": "Modello di modulo",
"NewForm": "Modulo PDF",
"Other": "Altro",
"OwnerChange": "Cambiare proprietario",
"Presentations": "Presentazioni",

View File

@ -1,14 +1,7 @@
{
"AccessDenied": "アクセス拒否",
"Error401Text": "申し訳ありませんが、このリソースは現在アクセスできません。",
"Error403Text": "申し訳ありませんが、アクセスが拒否されました。",
"Error404Text": "申し訳ありませんが、リソースが見つかりません。",
"ErrorDeactivatedText": "このDocSpaceは無効になっています。",
"ErrorEmptyResponse": "反応なし",
"ErrorOfflineText": "インターネットに接続されていません。",
"ErrorUnavailableText": "DocSpaceは現在、ご利用いただけません",
"InvalidLink": "無効なリンク",
"LinkDoesNotExist": "開こうとしているリンクは存在しません。",
"LinkHasExpired": "リンクの有効期限が切れています。",
"PortalRestriction": "現在のIPアドレスは、このDocSpaceへのアクセスを許可するIPアドレスリストに含まれていません。VPNが有効になっている場合はオフにしてページを再読み込みするか、別のIPアドレスを使ってログインしてください。"
"LinkHasExpired": "リンクの有効期限が切れています。"
}

View File

@ -35,7 +35,7 @@
"MobileWin": "Windows用のONLYOFFICEデスクトップエディタをダウンロードする",
"MoveHere": "ここに移動",
"MoveToOperation": "移動中",
"NewForm": "フォーム テンプレート",
"NewForm": "PDFフォーム",
"Other": "その他",
"OwnerChange": "オーナー変更",
"Presentations": "プレゼンテーション",

View File

@ -1,14 +1,7 @@
{
"AccessDenied": "액세스가 거부되었습니다",
"Error401Text": "죄송하지만, 현재 해당 리소스에 액세스할 수 없습니다.",
"Error403Text": "죄송하지만, 액세스가 거부되었습니다.",
"Error404Text": "죄송하지만, 해당 리소스를 찾을 수 없습니다.",
"ErrorDeactivatedText": "이 DocSpace는 비활성화 상태입니다",
"ErrorEmptyResponse": "응답이 없습니다",
"ErrorOfflineText": "인터넷 연결을 찾을 수 없습니다.",
"ErrorUnavailableText": "DocSpace 이용 불가",
"InvalidLink": "유효하지 않은 링크입니다",
"LinkDoesNotExist": "열려고 하는 링크가 존재하지 않습니다.",
"LinkHasExpired": "팔로우한 링크가 만료되었습니다.",
"PortalRestriction": "이 DocSpace에 액세스하도록 허용된 IP 주소 목록에 포함되어 있지 않은 IP 주소입니다. VPN이 켜져 있는 경우 VPN을 끄고 페이지를 다시 로드하거나 다른 IP 주소를 사용하여 로그인하세요."
"LinkHasExpired": "팔로우한 링크가 만료되었습니다."
}

View File

@ -35,7 +35,7 @@
"MobileWin": "Windows용 ONLYOFFICE Desktop Editors를 다운로드 받으세요",
"MoveHere": "여기로 이동",
"MoveToOperation": "이동 중",
"NewForm": "양식 템플릿",
"NewForm": "PDF 양식",
"Other": "기타",
"OwnerChange": "소유자 변경",
"Presentations": "프레젠테이션",

View File

@ -1,10 +1,4 @@
{
"AccessDenied": "ປະ​ຕິ​ເສດ​ການ​ເຂົ້າ​ເຖິງ",
"Error401Text": "ຂໍອະໄພ, ບໍ່ສາມາດເຂົ້າເຖິງຊັບພະຍາກອນໄດ້.",
"Error403Text": "ຂໍ້ອະໄພ.ການເຂົ້າເຖິງຖືກປະຕິເສດ",
"Error404Text": "ຂໍອະໄພ, ບໍ່ສາມາດເຂົ້າເຖິງຊັບພະຍາກອນໄດ້",
"ErrorEmptyResponse": "ການຕອບສະຫນອງທີ່ວ່າງເປົ່າ",
"ErrorOfflineText": "ບໍ່ພົບການເຊື່ອມຕໍ່ອິນເຕີເນັດ.",
"ErrorUnavailableText": "DocSpace ບໍ່ສາມາດໃຊ້ໄດ້",
"PortalRestriction": "ທີ່​ຢູ່ IP ຂອງ​ທ່ານ​ບໍ່​ໄດ້​ລວມ​ເຂົ້າ​ໃນ​ລາຍ​ຊື່​ຂອງ​ທີ່​ຢູ່ IP ທີ່​ອະ​ນຸ​ຍາດ​ໃຫ້​ເຂົ້າ​ເຖິງ DocSpace ນີ້ . ປິດ VPN ຖ້າມັນຖືກເປີດໃຊ້ ແລະໂຫຼດໜ້ານີ້ຄືນໃໝ່, ຫຼືໃຊ້ທີ່ຢູ່ IP ອື່ນເພື່ອເຂົ້າສູ່ລະບົບ."
"ErrorUnavailableText": "DocSpace ບໍ່ສາມາດໃຊ້ໄດ້"
}

View File

@ -34,7 +34,7 @@
"MobileWin": "ດາວໂຫລດ ONLYOFFICE Desktop Editors ສໍາລັບ Windows",
"MoveHere": "ຍ້າຍ ນີ້",
"MoveToOperation": "ກຳລັງເຄື່ອນຍ້າຍ",
"NewForm": "ແບບຟອມ",
"NewForm": "ແບບຟອມ PDF",
"Other": "ອື່ນໆ",
"OwnerChange": "ປ່ຽນເຈົ້າຂອງ",
"Presentations": "ບົດສະເຫນີ",

View File

@ -1,14 +1,7 @@
{
"AccessDenied": "Pieeja ir liegta",
"Error401Text": "Diemžēl resurss pašlaik nav pieejams.",
"Error403Text": "Diemžēl piekļuve liegta",
"Error404Text": "Diemžēl resursu nevar atrast.",
"ErrorDeactivatedText": "Šī DocSpace ir deaktivizēta",
"ErrorEmptyResponse": "Tukša atbilde",
"ErrorOfflineText": "Interneta savienojums nav atrasts",
"ErrorUnavailableText": "DocSpace nav pieejams",
"InvalidLink": "Nederīga saite",
"LinkDoesNotExist": "Saite, kuru mēģināt atvērt, neeksistē.",
"LinkHasExpired": "Saitei, kurai sekojāt, ir beidzies derīguma termiņš.",
"PortalRestriction": "Jūsu interneta protokola (IP) adrese nav iekļauta atļauto IP adrešu sarakstā, lai piekļūtu šai DocSpace. Izslēdziet virtuālo privāto tīklu (VPN), ja tas ir iespējots, un atkārtoti ielādējiet lapu vai izmantojiet citu IP adresi, lai pieteiktos."
"LinkHasExpired": "Saitei, kurai sekojāt, ir beidzies derīguma termiņš."
}

View File

@ -35,7 +35,7 @@
"MobileWin": "Lejupielādēt ONLYOFFICE darbvirsmas redaktorus operētājsistēmai Windows",
"MoveHere": "Pārvietoties šeit",
"MoveToOperation": "Pārvieto",
"NewForm": "Veidlapas veidne",
"NewForm": "PDF veidlapa",
"Other": "Cits",
"OwnerChange": "Mainīt īpašnieku",
"Presentations": "Prezentācijas",

View File

@ -1,14 +1,7 @@
{
"AccessDenied": "Toegang geweigerd",
"Error401Text": "Sorry, de bron is momenteel niet beschikbaar.",
"Error403Text": "Sorry, toegang geweigerd.",
"Error404Text": "Sorry, de bron kan niet worden gevonden.",
"ErrorDeactivatedText": "Deze DocSpace is gedeactiveerd",
"ErrorEmptyResponse": "Lege reactie",
"ErrorOfflineText": "Geen internetverbinding gevonden",
"ErrorUnavailableText": "DocSpace niet beschikbaar",
"InvalidLink": "Ongeldige link",
"LinkDoesNotExist": "De link die u probeert te openen bestaat niet.",
"LinkHasExpired": "De link die u heeft gevolgd is verlopen.",
"PortalRestriction": "Uw IP-adres staat niet in de lijst met toegestane IP-adressen voor toegang tot deze DocSpace. Als een VPN is ingeschakeld, schakel deze dan uit en laad de pagina opnieuw, of gebruik een ander IP-adres om in te loggen."
"LinkHasExpired": "De link die u heeft gevolgd is verlopen."
}

View File

@ -35,7 +35,7 @@
"MobileWin": "Download ONLYOFFICE Desktop Editors voor Windows",
"MoveHere": "Hierheen verplaatsen",
"MoveToOperation": "Verplaatsen",
"NewForm": "Formulier sjabloon",
"NewForm": "PDF-formulier",
"Other": "Overige",
"OwnerChange": "Wijzig eigenaar",
"Presentations": "Presentaties",

View File

@ -1,14 +1,7 @@
{
"AccessDenied": "Odmowa dostępu",
"Error401Text": "Przepraszamy, wybrany zasób jest w tej chwili niedostępny.",
"Error403Text": "Przepraszamy, odmówiono dostępu.",
"Error404Text": "Przepraszamy, nie znaleziono zasobu.",
"ErrorDeactivatedText": "Dane konto DocSpace zostało dezaktywowane",
"ErrorEmptyResponse": "Pusta odpowiedź",
"ErrorOfflineText": "Brak połączenia z Internetem",
"ErrorUnavailableText": "Oprogramowanie DocSpace jest niedostępne",
"InvalidLink": "Nieprawidłowy link",
"LinkDoesNotExist": "Link, który próbujesz otworzyć, nie istnieje.",
"LinkHasExpired": "Dany link wygasł.",
"PortalRestriction": "Twój adres IP nie znajduje się na liście dozwolonych adresów IP z dostępem do tego obszaru DocSpace. Jeżeli masz włączony VPN, wyłącz go i odśwież stronę lub skorzystaj z innego adresu IP, aby się zalogować."
"LinkHasExpired": "Dany link wygasł."
}

View File

@ -35,7 +35,7 @@
"MobileWin": "Pobierz ONLYOFFICE Desktop Editors dla Windows",
"MoveHere": "Przenieś tutaj",
"MoveToOperation": "Przenoszenie",
"NewForm": "Szablon formularza",
"NewForm": "Formularz PDF",
"Other": "Inny",
"OwnerChange": "Zmień właściciela",
"Presentations": "Prezentacje",

View File

@ -1,14 +1,7 @@
{
"AccessDenied": "Acesso negado",
"Error401Text": "Desculpe, o recurso não está atualmente acessível.",
"Error403Text": "Desculpe, acesso negado.",
"Error404Text": "Desculpe, o recurso não pode ser encontrado.",
"ErrorDeactivatedText": "Este DocSpace está desativado",
"ErrorEmptyResponse": "Resposta vazia",
"ErrorOfflineText": "Nenhuma conexão com a Internet foi encontrada",
"ErrorUnavailableText": "DocSpace indisponível",
"InvalidLink": "Link inválido",
"LinkDoesNotExist": "O link que você está tentando abrir não existe.",
"LinkHasExpired": "O link que você seguiu expirou.",
"PortalRestriction": "Seu endereço IP não está incluído na lista de endereços IP permitidos para acessar este DocSpace. Desative uma VPN se estiver ativada e recarregue a página ou use outro endereço IP para fazer login."
"LinkHasExpired": "O link que você seguiu expirou."
}

View File

@ -35,7 +35,7 @@
"MobileWin": "Baixar ONLYOFFICE Desktop Editors para Windows",
"MoveHere": "Mover aqui",
"MoveToOperation": "Movendo",
"NewForm": "Modelo de formulário",
"NewForm": "Formulário PDF",
"Other": "Outro",
"OwnerChange": "Alterar proprietário",
"Presentations": "Apresentações ",

View File

@ -1,14 +1,7 @@
{
"AccessDenied": "Acesso negado",
"Error401Text": "Desculpe, este recurso não está acessível de momento.",
"Error403Text": "Desculpe, acesso negado.",
"Error404Text": "Desculpe, o recurso não foi encontrado.",
"ErrorDeactivatedText": "Este DocSpace está desativado",
"ErrorEmptyResponse": "Resposta vazia",
"ErrorOfflineText": "Não foi encontrada qualquer conexão à internet",
"ErrorUnavailableText": "O DocSpace não está disponível",
"InvalidLink": "Link inválido",
"LinkDoesNotExist": "O link que você está tentando abrir não existe.",
"LinkHasExpired": "O link que você seguiu expirou.",
"PortalRestriction": "Seu endereço IP não está incluído na lista de endereços IP permitidos para acessar este DocSpace. Desative uma VPN se estiver ativada e recarregue a página ou use outro endereço IP para fazer login."
"LinkHasExpired": "O link que você seguiu expirou."
}

View File

@ -35,7 +35,7 @@
"MobileWin": "Faça o download do ONLYOFFICE Desktop Editors para Windows",
"MoveHere": "Mover para aqui",
"MoveToOperation": "A mover",
"NewForm": "Modelo de Formulário",
"NewForm": "Formulário PDF",
"Other": "Outros",
"OwnerChange": "Alterar dono",
"Presentations": "Apresentações ",

View File

@ -1,14 +1,7 @@
{
"AccessDenied": "Acces refuzat ",
"Error401Text": "Ne pare rău, sursa nu este accesibilă.",
"Error403Text": "Ne pare rău, accesul este refuzat.",
"Error404Text": "Ne pare rău, sursa nu s-a găsit.",
"ErrorDeactivatedText": "Acest spațiu DocSpace este dezactivat",
"ErrorEmptyResponse": "Răspunsul necompletat",
"ErrorOfflineText": "Nu există nicio conexiune la Internet",
"ErrorUnavailableText": "DocSpace nu este disponibil",
"InvalidLink": "Link-ul invalid",
"LinkDoesNotExist": "Lunk-ul pe care încercați să-l deschideți nu există.",
"LinkHasExpired": "Linkul pe care l-ați urmat a expirat.",
"PortalRestriction": "Adresa IP al dvs nu este inclusă în lista adreselor IP cu permisiuni de acces la acest spațiu DocSpace. Dacă utilizați VPN, dezactivați VPN-ul și reîncărcați pagina sau vă conectați cu o altă adresă IP."
"LinkHasExpired": "Linkul pe care l-ați urmat a expirat."
}

View File

@ -35,7 +35,7 @@
"MobileWin": "Descarcă ONLYOFFICE Desktop Editors pentru Windows",
"MoveHere": "Mutare în acest loc",
"MoveToOperation": "Mutare",
"NewForm": "Șablon formă,",
"NewForm": "Formular PDF",
"Other": "Altă",
"OwnerChange": "Schimbare proprietar",
"Presentations": "Prezentări",

View File

@ -1,14 +1,7 @@
{
"AccessDenied": "Доступ запрещен",
"Error401Text": "Извините, страница недоступна.",
"Error403Text": "Извините, доступ закрыт.",
"Error404Text": "Извините, страница не найдена.",
"ErrorDeactivatedText": "Этот DocSpace деактивирован",
"ErrorEmptyResponse": "Пустой ответ",
"ErrorOfflineText": "Нет подключения к интернету",
"ErrorUnavailableText": "DocSpace недоступен",
"InvalidLink": "Недействительная ссылка",
"LinkDoesNotExist": "Ссылки, которую вы пытаетесь открыть, не существует.",
"LinkHasExpired": "Ссылка, по которой вы перешли, просрочена.",
"PortalRestriction": "Ваш IP-адрес не включен в список IP-адресов, которым разрешен доступ к этому DocSpace. Отключите VPN, если он включен, и перезагрузите страницу или используйте другой IP-адрес для входа."
"LinkHasExpired": "Ссылка, по которой вы перешли, просрочена."
}

View File

@ -29,6 +29,7 @@
"FileExtension": "Расширение файла",
"FilesEmptyScreenText": "Здесь будут представлены свойства файлов и папок",
"GalleryEmptyScreenText": "Здесь будут представлены подробности о шаблонах форм",
"GroupsEmptyScreenText": "Здесь будут представлены подробности о группах",
"HistoryEmptyScreenText": "Здесь будет отображаться история активности",
"InfoBanner": "В список приглашенных пользователей входят владелец и(или) администраторы этого DocSpace с полным доступом ко всем комнатам. Владельцу и(или) администратору не могут быть назначены другие права доступа. После добавления в комнату они будут получать уведомления обо всех изменениях.",
"ItemsSelected": "Выбрано элементов",

View File

@ -1,8 +1,11 @@
{
"AccountLoginType": "Тип входа в аккаунт",
"AddMembers": "Добавить участников",
"CreateGroup": "Создать группу",
"DeleteSelfProfile": "Удалить профиль",
"DisabledEmployeeStatus": "Заблокирован",
"DisableUserButton": "Заблокировать",
"EditGroup": "Изменить группу",
"EmailChangeButton": "Изменить email",
"EnableUserButton": "Разблокировать",
"InviteLinkTitle": "Пригласительная ссылка",

View File

@ -35,7 +35,7 @@
"MobileWin": "Скачать десктопные редакторы ONLYOFFICE для Windows",
"MoveHere": "Переместить сюда",
"MoveToOperation": "Перемещение",
"NewForm": "Шаблон формы",
"NewForm": "PDF-форма",
"Other": "Другой",
"OwnerChange": "Сменить владельца",
"Presentations": "Презентации",

View File

@ -1,14 +1,7 @@
{
"AccessDenied": "Prístup bol zamietnutý",
"Error401Text": "Je nám ľúto, zdroj nie je momentálne dostupný.",
"Error403Text": "Prepáčte, prístup odmietnutý.",
"Error404Text": "Prepáčte, zdroj sa nedá nájsť.",
"ErrorDeactivatedText": "Tento DocSpace je deaktivovaný",
"ErrorEmptyResponse": "Prázdna odpoveď",
"ErrorOfflineText": "Nenašlo sa žiadne internetové pripojenie",
"ErrorUnavailableText": "DocSpace je nedostupný",
"InvalidLink": "Neplatný odkaz",
"LinkDoesNotExist": "Odkaz, ktorý sa pokúšate otvoriť, neexistuje.",
"LinkHasExpired": "Odkaz, ktorý používate, je neplatný.",
"PortalRestriction": "Vaša IP adresa nie je uvedená v zozname povolených IP adries pre prístup do tohto priestoru DocSpace. Vypnite VPN, ak je zapnuté, a znovu načítajte stránku alebo na prihlásenie použite inú IP adresu."
"LinkHasExpired": "Odkaz, ktorý používate, je neplatný."
}

View File

@ -35,7 +35,7 @@
"MobileWin": "Stiahnite si ONLYOFFICE Desktop Editors pre Windows",
"MoveHere": "Posunúť sem",
"MoveToOperation": "Presúva sa",
"NewForm": "Šablóna formulára",
"NewForm": "Formulár PDF",
"Other": "Iný",
"OwnerChange": "Zmeniť vlastníka",
"Presentations": "Prezentácie",

View File

@ -1,14 +1,7 @@
{
"AccessDenied": "Dostop je zavrnjen",
"Error401Text": "Žal vir trenutno ni dostopen.",
"Error403Text": "Žal je dostop zavrnjen.",
"Error404Text": "Žal vira ni mogoče najti.",
"ErrorDeactivatedText": "Ta DocSpace je deaktiviran",
"ErrorEmptyResponse": "Prazen odziv",
"ErrorOfflineText": "Internetne povezave ni bilo mogoče najti",
"ErrorUnavailableText": "DocSpace ni na voljo",
"InvalidLink": "Neveljavna povezava",
"LinkDoesNotExist": "Povezava, ki jo poskušate odpreti, ne obstaja.",
"LinkHasExpired": "Povezava, ki ste ji sledili, je potekla.",
"PortalRestriction": "Vaš naslov IP ni vključen na seznam dovoljenih naslovov IP za dostop do tega prostora DocSpace. Izklopite VPN, če je omogočen, in znova naložite stran ali uporabite drug naslov IP za prijavo."
"LinkHasExpired": "Povezava, ki ste ji sledili, je potekla."
}

View File

@ -35,7 +35,7 @@
"MobileWin": "Prenesi ONLYOFFICE namizne urejevalnike za Windows",
"MoveHere": "Premakni sem",
"MoveToOperation": "Premikanje",
"NewForm": "Predloga obrazca",
"NewForm": "PDF obrazec",
"Other": "Drugo",
"OwnerChange": "Spremeni lastnika",
"Presentations": "Predstavitve",

View File

@ -1,14 +1,7 @@
{
"AccessDenied": "Erişim engellendi",
"Error401Text": "Üzgünüz, kaynak şu anda ulaşılabilir değil.",
"Error403Text": "Üzgünüz, erişim reddedildi.",
"Error404Text": "Üzgünüz, kaynak bulunamadı.",
"ErrorDeactivatedText": "Bu DocSpace devre dışı bırakıldı",
"ErrorEmptyResponse": "Boş yanıt",
"ErrorOfflineText": "İnternet bağlantısı bulunamadı",
"ErrorUnavailableText": "DocSpace kullanılamıyor",
"InvalidLink": "Geçersiz bağlantı",
"LinkDoesNotExist": "Açmaya çalıştığınız bağlantı mevcut değil.",
"LinkHasExpired": "Takip ettiğiniz bağlantının süresi doldu.",
"PortalRestriction": "IP adresiniz bu DocSpace'e erişimine izin verilen IP adresleri listesinde yer almıyor. Etkinleştirilmişse VPN'i kapatın ve sayfayı yeniden yükleyin veya oturum açmak için başka bir IP adresi kullanın."
"LinkHasExpired": "Takip ettiğiniz bağlantının süresi doldu."
}

View File

@ -35,7 +35,7 @@
"MobileWin": "Windows için ONLYOFFICE Masaüstü Düzenleyicilerini İndirin",
"MoveHere": "Buraya taşı",
"MoveToOperation": "Taşınıyor",
"NewForm": "Form şablonu",
"NewForm": "PDF formu",
"Other": "Diğer",
"OwnerChange": "Sahibi değiştir",
"Presentations": "Sunumlar",

View File

@ -1,14 +1,7 @@
{
"AccessDenied": "Доступ заборонено",
"Error401Text": "На жаль, ресурс наразі недоступний.",
"Error403Text": "На жаль, доступ заборонено.",
"Error404Text": "На жаль, ресурс неможливо знайти.",
"ErrorDeactivatedText": "Цей DocSpace деактивовано",
"ErrorEmptyResponse": "Пуста відповідь",
"ErrorOfflineText": "Підключення до Інтернету не знайдено",
"ErrorUnavailableText": "DocSpace недоступний",
"InvalidLink": "Недійсне посилання",
"LinkDoesNotExist": "Посилання, яке ви намагаєтеся відкрити, не існує.",
"LinkHasExpired": "Термін дії посилання, за яким ви перейшли, закінчився.",
"PortalRestriction": "Ваша IP-адреса не входить до списку IP-адрес, яким дозволено доступ до цього DocSpace. Вимкніть VPN, якщо її увімкнено, і перезавантажте сторінку або використовуйте іншу IP-адресу для входу."
"LinkHasExpired": "Термін дії посилання, за яким ви перейшли, закінчився."
}

View File

@ -35,7 +35,7 @@
"MobileWin": "Завантажити настільні редактори ONLYOFFICE для Windows",
"MoveHere": "Перемістити сюди",
"MoveToOperation": "Переміщення",
"NewForm": "Шаблон форми",
"NewForm": "Форма PDF",
"Other": "Інше",
"OwnerChange": "Змінити власника",
"Presentations": "Презентації",

View File

@ -1,14 +1,7 @@
{
"AccessDenied": "Truy cập bị từ chối",
"Error401Text": " Xin lỗi, hiện không thể truy cập tài nguyên.",
"Error403Text": " Xin lỗi, truy cập bị từ chối.",
"Error404Text": " Xin lỗi, không thể tìm thấy tài nguyên.",
"ErrorDeactivatedText": "DocSpace này đã bị vô hiệu hóa",
"ErrorEmptyResponse": "Không có hồi đáp",
"ErrorOfflineText": "Không tìm thấy kết nối internet",
"ErrorUnavailableText": "DocSpace không khả dụng",
"InvalidLink": "Liên kết không hợp lệ",
"LinkDoesNotExist": "Liên kết bạn đang cố gắng mở không tồn tại.",
"LinkHasExpired": "Liên kết bạn theo dõi đã hết hạn.",
"PortalRestriction": "Địa chỉ IP của bạn không được bao gồm trong danh sách các địa chỉ IP được phép truy cập DocSpace này. Hãy tắt VPN nếu nó được bật và tải lại trang hoặc sử dụng một địa chỉ IP khác để đăng nhập."
"LinkHasExpired": "Liên kết bạn theo dõi đã hết hạn."
}

View File

@ -35,7 +35,7 @@
"MobileWin": "Tải xuống Trình chỉnh sửa ONLYOFFICE cho máy tính Windows",
"MoveHere": "Chuyển vào đây",
"MoveToOperation": "Đang di chuyển",
"NewForm": "Mẫu biểu mẫu",
"NewForm": "Mẫu PDF",
"Other": "Khác",
"OwnerChange": "Thay đổi chủ sở hữu",
"Presentations": "Bản trình bày",

View File

@ -1,14 +1,7 @@
{
"AccessDenied": "拒绝访问",
"Error401Text": "抱歉,资源目前无法访问。",
"Error403Text": "对不起,拒绝访问。",
"Error404Text": "对不起,找不到资源。",
"ErrorDeactivatedText": "该协作空间已停用",
"ErrorEmptyResponse": "空响应",
"ErrorOfflineText": "未找到网络连接。",
"ErrorUnavailableText": "协作空间不可用",
"InvalidLink": "无效链接",
"LinkDoesNotExist": "链接不存在。",
"LinkHasExpired": "您关注的链接已过期。",
"PortalRestriction": "您的IP地址不在可访问此文档空间的IP地址列表中。请关闭 VPN如已启用并重新加载页面或使用其他IP地址进行登录。"
"LinkHasExpired": "您关注的链接已过期。"
}

View File

@ -35,7 +35,7 @@
"MobileWin": "下载适用于Windows的ONLYOFFICE桌面编辑器",
"MoveHere": "移到这里",
"MoveToOperation": "移动中",
"NewForm": "表单模板",
"NewForm": "PDF表格",
"Other": "其他",
"OwnerChange": "变更所有者",
"Presentations": "演示文稿",

View File

@ -1,17 +1,30 @@
// import "@docspace/shared/utils/wdyr";
import React from "react";
import { I18nextProvider } from "react-i18next";
import { RouterProvider } from "react-router-dom";
import { Provider as MobxProvider } from "mobx-react";
import ThemeProvider from "./components/ThemeProviderWrapper";
import ErrorBoundary from "./components/ErrorBoundaryWrapper";
import store from "client/store";
import i18n from "./i18n";
import ErrorBoundary from "@docspace/common/components/ErrorBoundary";
import "@docspace/common/custom.scss";
import router from "./router";
const App = () => {
return (
<ErrorBoundary>
<RouterProvider router={router} />
</ErrorBoundary>
<MobxProvider {...store}>
<I18nextProvider i18n={i18n}>
<ThemeProvider>
<ErrorBoundary>
<RouterProvider router={router} />;
</ErrorBoundary>
</ThemeProvider>
</I18nextProvider>
</MobxProvider>
);
};

View File

@ -1,46 +0,0 @@
import React from "react";
import styled from "styled-components";
import { ReactSVG } from "react-svg";
import { mobile } from "@docspace/shared/utils";
import { inject, observer } from "mobx-react";
import { getLogoFromPath } from "@docspace/shared/utils";
const StyledWrapper = styled.div`
.logo-wrapper {
width: 386px;
height: 44px;
}
@media ${mobile} {
display: none;
}
`;
const DocspaceLogo = (props) => {
const { className, whiteLabelLogoUrls, theme } = props;
const logo = getLogoFromPath(
!theme.isBase
? whiteLabelLogoUrls[1]?.path?.dark
: whiteLabelLogoUrls[1]?.path?.light
);
return (
<StyledWrapper>
{logo ? (
<ReactSVG src={logo} className={`logo-wrapper ${className}`} />
) : (
<></>
)}
</StyledWrapper>
);
};
export default inject(({ settingsStore }) => {
const { whiteLabelLogoUrls, theme } = settingsStore;
return {
whiteLabelLogoUrls,
theme,
};
})(observer(DocspaceLogo));

View File

@ -58,12 +58,15 @@ export default function withContent(WrappedContent) {
titleWithoutExt,
isPublicRoom,
publicRoomKey,
culture,
} = this.props;
const locale = getCookie(LANGUAGE) || culture;
const { access, createdBy, fileStatus, href } = item;
const { access, createdBy, fileStatus, href, lastOpened } = item;
const updatedDate = this.getStatusByDate(false);
const createdDate = this.getStatusByDate(true);
const lastOpenedDate = getCorrectDate(locale, lastOpened);
const fileOwner =
createdBy &&
@ -93,6 +96,7 @@ export default function withContent(WrappedContent) {
titleWithoutExt={titleWithoutExt}
updatedDate={updatedDate}
createdDate={createdDate}
lastOpenedDate={lastOpenedDate}
fileOwner={fileOwner}
accessToEdit={accessToEdit}
linkStyles={linkStyles}
@ -118,7 +122,7 @@ export default function withContent(WrappedContent) {
publicRoomStore,
userStore,
},
{ item }
{ item },
) => {
const {
createFile,
@ -187,6 +191,6 @@ export default function withContent(WrappedContent) {
isPublicRoom,
publicRoomKey,
};
}
},
)(observer(WithContent));
}

View File

@ -255,6 +255,7 @@ export default function withFileActions(WrappedFileItem) {
itemIndex,
currentDeviceType,
isDisabledDropItem,
isRecentTab,
} = this.props;
const { access, id } = item;
@ -320,6 +321,7 @@ export default function withFileActions(WrappedFileItem) {
onDragOver={this.onDragOver}
onDragLeave={this.onDragLeave}
badgeUrl={badgeUrl}
isRecentTab={isRecentTab}
{...this.props}
/>
);
@ -338,7 +340,7 @@ export default function withFileActions(WrappedFileItem) {
uploadDataStore,
contextOptionsStore,
},
{ item, t }
{ item, t },
) => {
const {
selectRowAction,
@ -355,6 +357,7 @@ export default function withFileActions(WrappedFileItem) {
isRecycleBinFolder,
isRoomsFolder,
isArchiveFolder,
isRecentTab,
} = treeFoldersStore;
const {
dragging,
@ -380,7 +383,7 @@ export default function withFileActions(WrappedFileItem) {
const { startUpload } = uploadDataStore;
const selectedItem = selection.find(
(x) => x.id === item.id && x.fileExst === item.fileExst
(x) => x.id === item.id && x.fileExst === item.fileExst,
);
const isDisabledDropItem = !item.security.Create;
@ -402,12 +405,12 @@ export default function withFileActions(WrappedFileItem) {
const activeFileIndex = activeFiles.findIndex(
(x) =>
x.id === item.id &&
(Boolean(item.fileExst) || item.fileType !== undefined)
(Boolean(item.fileExst) || item.fileType !== undefined),
);
const activeFolderIndex = activeFolders.findIndex(
(x) =>
x.id === item.id &&
(item.isFolder || (!item.fileExst && item.id === -1))
(item.isFolder || (!item.fileExst && item.id === -1)),
);
const isFileProgress = isProgress(activeFileIndex, activeFiles);
@ -471,7 +474,8 @@ export default function withFileActions(WrappedFileItem) {
setSelection,
currentDeviceType: settingsStore.currentDeviceType,
isDisabledDropItem,
isRecentTab,
};
}
},
)(observer(WithFileActions));
}

View File

@ -25,9 +25,11 @@ const withLoader = (WrappedComponent) => (Loader) => {
const location = useLocation();
const currentViewAs = location.pathname.includes("/accounts/filter")
? accountsViewAs
: viewAs;
const currentViewAs =
location.pathname.includes("/accounts/people") ||
location.pathname.includes("/accounts/groups")
? accountsViewAs
: viewAs;
return (!isEditor && firstLoad && !isGallery) ||
!isLoaded ||
@ -77,7 +79,7 @@ const withLoader = (WrappedComponent) => (Loader) => {
showBodyLoader,
accountsViewAs,
};
}
},
)(observer(withLoader));
};
export default withLoader;

View File

@ -10,7 +10,6 @@ export default function withContent(WrappedContent) {
const WithContent = (props) => {
const {
item,
selectGroup,
checked,
selectUser,
deselectUser,
@ -39,63 +38,6 @@ export default function withContent(WrappedContent) {
<Avatar size="min" role={role} userName={displayName} source={avatar} />
);
const getFormattedGroups = () => {
let temp = [];
const groups = item.groups;
const linkColor =
item.statusType === "pending"
? theme.peopleWithContent.pendingColor
: theme.peopleWithContent.color;
if (!groups) temp.push({ key: 0, label: "" });
groups &&
groups.map((group) =>
temp.push({
key: group.id,
label: group.name,
onClick: () => selectGroup(group.id),
})
);
if (temp.length <= 1) {
return (
<Link
isTextOverflow
containerMinWidth="120px"
containerWidth="15%"
type="action"
title={temp[0].label}
fontSize="12px"
fontWeight={400}
color={linkColor}
onClick={temp[0].onClick}
>
{temp[0].label}
</Link>
);
} else {
return (
<LinkWithDropdown
className="link-with-dropdown-group"
isTextOverflow
containerMinWidth="120px"
containerWidth="15%"
directionY="both"
title={temp[0].label}
fontSize="12px"
fontWeight={400}
color={linkColor}
data={temp}
>
{temp[0].label}
</LinkWithDropdown>
);
}
};
const groups = getFormattedGroups();
const onPhoneClick = () => window.open(`sms:${mobilePhone}`);
const onEmailClick = () => window.open(`mailto:${email}`);
@ -125,7 +67,7 @@ export default function withContent(WrappedContent) {
onContentRowClick={onContentRowClick}
onPhoneClick={onPhoneClick}
onEmailClick={onEmailClick}
groups={groups}
groups={[]}
checkedProps={checkedProps}
element={element}
contextOptionsProps={contextOptionsProps}
@ -138,7 +80,6 @@ export default function withContent(WrappedContent) {
return inject(({ settingsStore, peopleStore, userStore }, { item }) => {
const { theme, standalone } = settingsStore;
const { selectGroup } = peopleStore.selectedGroupStore;
const { getTargetUser } = peopleStore.targetUserStore;
const { selectionStore, contextOptionsStore } = peopleStore;
@ -156,7 +97,6 @@ export default function withContent(WrappedContent) {
theme,
standalone,
currentUserId: userStore.user.id,
selectGroup,
fetchProfile: getTargetUser,
checked: selection.some((el) => el.id === item.id),
isSeveralSelection: selection.length > 1,

View File

@ -58,7 +58,9 @@ export default function withQuickButtons(WrappedComponent) {
const primaryLink = await getPrimaryFileLink(item.id);
if (primaryLink) {
copy(primaryLink.sharedTo.shareLink);
toastr.success(t("Files:LinkSuccessfullyCopied"));
item.shared
? toastr.success(t("Files:LinkSuccessfullyCopied"))
: toastr.success(t("Files:LinkSuccessfullyCreatedAndCopied"));
setShareChanged(true);
}
};

View File

@ -1,37 +1,33 @@
import React, { useEffect, useState } from "react";
import { useLocation, useNavigate, Outlet } from "react-router-dom";
import { inject, observer, Provider as MobxProvider } from "mobx-react";
import NavMenu from "./components/NavMenu";
import Main from "./components/Main";
import moment from "moment-timezone";
import React, { useEffect } from "react";
import { Outlet } from "react-router-dom";
import { useTheme } from "styled-components";
import { inject, observer } from "mobx-react";
import { useTranslation } from "react-i18next";
import { isMobile, isIOS, isFirefox } from "react-device-detect";
import Layout from "./components/Layout";
import ScrollToTop from "./components/Layout/ScrollToTop";
import { Toast, toastr } from "@docspace/shared/components/toast";
import { ThemeProvider } from "@docspace/shared/components/theme-provider";
import { SnackBar } from "@docspace/shared/components/snackbar";
import { Portal } from "@docspace/shared/components/portal";
import { updateTempContent } from "@docspace/shared/utils/common";
import { getLogoFromPath } from "@docspace/shared/utils";
import store from "client/store";
import { Portal } from "@docspace/shared/components/portal";
import { SnackBar } from "@docspace/shared/components/snackbar";
import { Toast, toastr } from "@docspace/shared/components/toast";
import { getRestoreProgress } from "@docspace/shared/api/portal";
import { updateTempContent } from "@docspace/shared/utils/common";
import { DeviceType, IndexedDBStores } from "@docspace/shared/enums";
import indexedDbHelper from "@docspace/shared/utils/indexedDBHelper";
import { useThemeDetector } from "@docspace/shared/hooks/useThemeDetector";
import config from "PACKAGE_FILE";
import { I18nextProvider, useTranslation } from "react-i18next";
import i18n from "./i18n";
import moment from "moment-timezone";
//import ReactSmartBanner from "./components/SmartBanner";
import { useThemeDetector } from "@docspace/shared/hooks/useThemeDetector";
import { isMobile, isIOS, isFirefox } from "react-device-detect";
import IndicatorLoader from "./components/IndicatorLoader";
import DialogsWrapper from "./components/dialogs/DialogsWrapper";
import Main from "./components/Main";
import Layout from "./components/Layout";
import NavMenu from "./components/NavMenu";
import MainBar from "./components/MainBar";
import ScrollToTop from "./components/Layout/ScrollToTop";
import IndicatorLoader from "./components/IndicatorLoader";
import ErrorBoundary from "./components/ErrorBoundaryWrapper";
import DialogsWrapper from "./components/dialogs/DialogsWrapper";
import indexedDbHelper from "@docspace/shared/utils/indexedDBHelper";
import { DeviceType, IndexedDBStores } from "@docspace/shared/enums";
import { getRestoreProgress } from "@docspace/shared/api/portal";
import { useTheme } from "styled-components";
// import ReactSmartBanner from "./components/SmartBanner";
const Shell = ({ items = [], page = "home", ...rest }) => {
const {
@ -108,13 +104,13 @@ const Shell = ({ items = [], page = "home", ...rest }) => {
shortcutIconLink.href = favicon;
const appleIconLink = document.querySelector(
"link[rel~='apple-touch-icon']"
"link[rel~='apple-touch-icon']",
);
if (appleIconLink) appleIconLink.href = favicon;
const androidIconLink = document.querySelector(
"link[rel~='android-touch-icon']"
"link[rel~='android-touch-icon']",
);
if (androidIconLink) androidIconLink.href = favicon;
}, [whiteLabelLogoUrls]);
@ -136,7 +132,7 @@ const Shell = ({ items = [], page = "home", ...rest }) => {
.then((response) => {
if (!response) {
console.log(
"Skip show <PreparationPortalDialog /> - empty progress response"
"Skip show <PreparationPortalDialog /> - empty progress response",
);
return;
}
@ -176,7 +172,7 @@ const Shell = ({ items = [], page = "home", ...rest }) => {
const { fromDate, toDate, desktop } = campaign;
console.log(
`FB: 'bar/maintenance' desktop=${desktop} fromDate=${fromDate} toDate=${toDate}`
`FB: 'bar/maintenance' desktop=${desktop} fromDate=${fromDate} toDate=${toDate}`,
);
if (!campaign || !fromDate || !toDate) {
@ -351,7 +347,7 @@ const Shell = ({ items = [], page = "home", ...rest }) => {
Array.from(document.querySelectorAll("style")).forEach((sheet) => {
if (
sheet?.textContent?.includes(
"-webkit-filter: hue-rotate(180deg) invert(100%) !important;"
"-webkit-filter: hue-rotate(180deg) invert(100%) !important;",
)
) {
sheet.parentNode?.removeChild(sheet);
@ -475,40 +471,13 @@ const ShellWrapper = inject(
showArticleLoader: clientLoadingStore.showArticleLoader,
};
}
},
)(observer(Shell));
const ThemeProviderWrapper = inject(
({ authStore, settingsStore, loginStore }) => {
let currentColorScheme = false;
const { theme } = settingsStore;
const { i18n } = useTranslation();
if (loginStore) {
currentColorScheme = loginStore.currentColorScheme;
} else if (authStore) {
currentColorScheme = settingsStore.currentColorScheme || false;
}
const { timezone } = settingsStore;
window.theme = theme;
window.timezone = timezone;
return {
theme: { ...theme, interfaceDirection: i18n.dir() },
currentColorScheme,
timezone,
};
}
)(observer(ThemeProvider));
export default () => (
<MobxProvider {...store}>
<I18nextProvider i18n={i18n}>
<ThemeProviderWrapper>
<ShellWrapper />
</ThemeProviderWrapper>
</I18nextProvider>
</MobxProvider>
const Root = () => (
<ErrorBoundary>
<ShellWrapper />
</ErrorBoundary>
);
export default Root;

View File

@ -166,7 +166,7 @@ const ArticleBodyContent = (props) => {
selectedFolderId,
isAccounts,
setSelection,
]
],
);
const onShowNewFilesPanel = React.useCallback(
@ -179,7 +179,7 @@ const ArticleBodyContent = (props) => {
setDisableBadgeClick(false);
},
[disableBadgeClick]
[disableBadgeClick],
);
React.useEffect(() => {
@ -207,10 +207,7 @@ const ArticleBodyContent = (props) => {
)
return setActiveItemId(recycleBinFolderId);
if (
location.pathname.includes("/accounts/filter") &&
activeItemId !== "accounts"
)
if (location.pathname.includes("/accounts") && activeItemId !== "accounts")
return setActiveItemId("accounts");
if (location.pathname.includes("/settings") && activeItemId !== "settings")
@ -332,5 +329,5 @@ export default inject(
setSelection,
currentDeviceType,
};
}
},
)(withTranslation([])(observer(ArticleBodyContent)));

View File

@ -42,6 +42,8 @@ const MobileView = ({
actionOptions,
buttonOptions,
isRooms,
withoutButton,
withMenu,
files,
clearUploadData,
setUploadPanelVisible,
@ -85,7 +87,7 @@ const MobileView = ({
let currentPrimaryNumEl = primaryNumEl;
const uploadedFileCount = files.filter(
(item) => item.percent === 100 && !item.cancel
(item) => item.percent === 100 && !item.cancel,
).length;
const fileLength = files.filter((item) => !item.cancel).length;
@ -111,7 +113,7 @@ const MobileView = ({
const secondaryProgressStatus = secondaryProgressDataStoreIsDownload
? `${Math.floor(secondaryProgressDataStorePercent)}%`
: `${Math.floor(
currentSecondaryProgressItem
currentSecondaryProgressItem,
)}/${secondaryProgressDataStoreCurrentFilesCount}`;
const newProgressOptions = [
@ -184,9 +186,9 @@ const MobileView = ({
percent={percentProgress}
progressOptions={progressOptions}
title={titleProp}
withoutButton={isRooms}
withoutButton={withoutButton}
alert={primaryProgressDataAlert}
withMenu={!isRooms}
withMenu={withMenu}
onClick={onMainButtonClick}
onAlertClick={showUploadPanel}
withAlertClick={isRoomsFolder}

View File

@ -134,6 +134,9 @@ const ArticleMainButtonContent = (props) => {
isGracePeriod,
setInviteUsersWarningDialogVisible,
currentDeviceType,
isFrame,
disableActionButton,
} = props;
const navigate = useNavigate();
@ -164,7 +167,7 @@ const ArticleMainButtonContent = (props) => {
window.dispatchEvent(event);
},
[setAction]
[setAction],
);
const onCreateRoom = React.useCallback(() => {
@ -185,7 +188,7 @@ const ArticleMainButtonContent = (props) => {
(e) => {
startUpload(e.target.files, null, t);
},
[startUpload, t]
[startUpload, t],
);
const onUploadFileClick = React.useCallback(() => {
@ -238,11 +241,16 @@ const ArticleMainButtonContent = (props) => {
const onInviteAgain = React.useCallback(() => {
resendInvitesAgain()
.then(() =>
toastr.success(t("PeopleTranslations:SuccessSentMultipleInvitatios"))
toastr.success(t("PeopleTranslations:SuccessSentMultipleInvitatios")),
)
.catch((err) => toastr.error(err));
}, [resendInvitesAgain]);
const onCreateGroup = React.useCallback(() => {
const event = new Event(Events.GROUP_CREATE);
window.dispatchEvent(event);
}, []);
React.useEffect(() => {
const isFolderHiddenDropdown =
isArchiveFolder ||
@ -317,49 +325,78 @@ const ArticleMainButtonContent = (props) => {
},
];
const addAdmin = isOwner
? [
{
id: "invite_doc-space-administrator",
className: "main-button_drop-down",
icon: PersonAdminReactSvgUrl,
label: t("Common:DocSpaceAdmin"),
onClick: onInvite,
action: EmployeeType.Admin,
key: "administrator",
},
]
: [];
const actions = isAccountsPage
? [
...addAdmin,
{
id: "invite_room-admin",
className: "main-button_drop-down",
icon: PersonManagerReactSvgUrl,
label: t("Common:RoomAdmin"),
onClick: onInvite,
action: EmployeeType.User,
key: "manager",
},
{
id: "invite_room-collaborator",
className: "main-button_drop-down",
icon: PersonReactSvgUrl,
label: t("Common:PowerUser"),
onClick: onInvite,
action: EmployeeType.Collaborator,
key: "collaborator",
},
{
id: "invite_user",
id: "actions_invite_user",
className: "main-button_drop-down",
icon: PersonUserReactSvgUrl,
label: t("Common:User"),
onClick: onInvite,
action: EmployeeType.Guest,
key: "user",
label: t("Common:Invite"),
key: "new-user",
items: [
...(isOwner
? [
{
id: "invite_doc-space-administrator",
className: "main-button_drop-down",
icon: PersonAdminReactSvgUrl,
label: t("Common:DocSpaceAdmin"),
onClick: onInvite,
action: EmployeeType.Admin,
key: "administrator",
},
]
: []),
{
id: "invite_room-admin",
className: "main-button_drop-down",
icon: PersonManagerReactSvgUrl,
label: t("Common:RoomAdmin"),
onClick: onInvite,
action: EmployeeType.User,
key: "manager",
},
{
id: "invite_room-collaborator",
className: "main-button_drop-down",
icon: PersonReactSvgUrl,
label: t("Common:PowerUser"),
onClick: onInvite,
action: EmployeeType.Collaborator,
key: "collaborator",
},
{
id: "invite_user",
className: "main-button_drop-down",
icon: PersonUserReactSvgUrl,
label: t("Common:User"),
onClick: onInvite,
action: EmployeeType.Guest,
key: "user",
},
{
isSeparator: true,
key: "invite-users-separator",
},
{
id: "invite_again",
className: "main-button_drop-down",
icon: InviteAgainReactSvgUrl,
label: t("People:LblInviteAgain"),
onClick: onInviteAgain,
action: "invite-again",
key: "invite-again",
},
],
},
{
id: "create_group",
className: "main-button_drop-down",
icon: PersonUserReactSvgUrl,
label: t("PeopleTranslations:CreateGroup"),
onClick: onCreateGroup,
action: "group",
key: "group",
},
]
: [
@ -401,37 +438,25 @@ const ArticleMainButtonContent = (props) => {
},
];
const uploadActions = isAccountsPage
? [
{
id: "invite_again",
className: "main-button_drop-down",
icon: InviteAgainReactSvgUrl,
label: t("People:LblInviteAgain"),
onClick: onInviteAgain,
action: "invite-again",
key: "invite-again",
},
]
: [
{
id: "actions_upload-files",
className: "main-button_drop-down",
icon: ActionsUploadReactSvgUrl,
label: t("UploadFiles"),
onClick: onUploadFileClick,
key: "upload-files",
},
{
id: "actions_upload-folders",
className: "main-button_drop-down",
icon: ActionsUploadReactSvgUrl,
label: t("UploadFolder"),
disabled: isPrivacy,
onClick: onUploadFolderClick,
key: "upload-folder",
},
];
const uploadActions = [
{
id: "actions_upload-files",
className: "main-button_drop-down",
icon: ActionsUploadReactSvgUrl,
label: t("UploadFiles"),
onClick: onUploadFileClick,
key: "upload-files",
},
{
id: "actions_upload-folders",
className: "main-button_drop-down",
icon: ActionsUploadReactSvgUrl,
label: t("UploadFolder"),
disabled: isPrivacy,
onClick: onUploadFolderClick,
key: "upload-folder",
},
];
if (pluginItems.length > 0) {
// menuModel.push({
@ -457,13 +482,15 @@ const ArticleMainButtonContent = (props) => {
const menuModel = [...actions];
menuModel.push({
isSeparator: true,
key: "separator",
});
if (!isAccountsPage) {
menuModel.push({
isSeparator: true,
key: "separator",
});
menuModel.push(...uploadActions);
setUploadActions(uploadActions);
menuModel.push(...uploadActions);
setUploadActions(uploadActions);
}
setModel(menuModel);
setActions(actions);
@ -488,15 +515,15 @@ const ArticleMainButtonContent = (props) => {
onUploadFolderClick,
]);
const mainButtonText = isAccountsPage
? t("Common:Invite")
: t("Common:Actions");
const mainButtonText = t("Common:Actions");
const isDisabled = isSettingsPage
? isSettingsPage
: isAccountsPage
? !isAccountsPage
: !security?.Create;
const isDisabled = isFrame
? disableActionButton
: isSettingsPage
? isSettingsPage
: isAccountsPage
? !isAccountsPage
: !security?.Create;
const isProfile = location.pathname.includes("/profile");
@ -525,8 +552,9 @@ const ArticleMainButtonContent = (props) => {
t={t}
titleProp={t("Upload")}
actionOptions={actions}
buttonOptions={uploadActions}
isRooms={isRoomsFolder}
buttonOptions={!isAccountsPage && uploadActions}
withoutButton={isRoomsFolder || isAccountsPage}
withMenu={!isRoomsFolder}
mainButtonMobileVisible={
mainButtonMobileVisible && mainButtonVisible
}
@ -638,6 +666,8 @@ export default inject(
const { setOformFromFolderId, oformsFilter } = oformsStore;
const { mainButtonItemsList } = pluginStore;
const { frameConfig, isFrame } = settingsStore;
return {
isGracePeriod,
setInviteUsersWarningDialogVisible,
@ -680,8 +710,11 @@ export default inject(
versionHistoryPanelVisible,
security,
currentDeviceType,
isFrame,
disableActionButton: frameConfig?.disableActionButton,
};
}
},
)(
withTranslation([
"Article",
@ -690,5 +723,5 @@ export default inject(
"Files",
"People",
"PeopleTranslations",
])(observer(ArticleMainButtonContent))
])(observer(ArticleMainButtonContent)),
);

View File

@ -130,7 +130,7 @@ const Badges = ({
const iconForm =
sizeBadge === "medium" ? FormFillRectSvgUrl : AccessEditFormReactSvgUrl;
const iconEdit = !isForm ? FileActionsConvertEditDocReactSvgUrl : iconForm;
const iconEdit = !isPdf ? FileActionsConvertEditDocReactSvgUrl : iconForm;
const iconRefresh = desktopView ? Refresh12ReactSvgUrl : RefreshReactSvgUrl;
@ -206,7 +206,7 @@ const Badges = ({
/>
</BadgeWrapper>
)}
{isEditing && !isVisitor && !isPdf && !(isRecentTab && !canEditing) && (
{isEditing && !isVisitor && !(isRecentTab && !canEditing) && (
<ColorTheme
themeId={ThemeId.IconButton}
isEditing={isEditing}
@ -215,7 +215,7 @@ const Badges = ({
size={sizeBadge}
onClick={onFilesClick}
hoverColor={theme.filesBadges.hoverIconColor}
title={isForm ? t("Common:FillFormButton") : t("Common:EditButton")}
title={isPdf ? t("Common:FillFormButton") : t("Common:EditButton")}
/>
)}
{item.viewAccessibility?.MustConvert &&

View File

@ -0,0 +1,25 @@
import React from "react";
import { inject, observer } from "mobx-react";
import BetaBadge from "@docspace/shared/components/beta-badge/BetaBadge";
import type BetaBadgeProps from "@docspace/shared/components/beta-badge/BetaBadge.props";
const BetaBadgeWrapper = (props: BetaBadgeProps) => {
return <BetaBadge {...props} />;
};
export default inject<TStore>(({ settingsStore }) => {
const {
forumLink,
currentColorScheme,
documentationEmail,
currentDeviceType,
} = settingsStore;
return {
documentationEmail,
currentColorScheme,
currentDeviceType,
forumLink,
};
})(observer(BetaBadgeWrapper));

View File

@ -0,0 +1,24 @@
import { inject, observer } from "mobx-react";
import DocspaceLogo from "@docspace/shared/components/docspace-logo/DocspaceLogo";
import type { DocspaceLogoProps } from "@docspace/shared/components/docspace-logo/DocspaceLogo.types";
const DocspaceLogoWrapper = ({
whiteLabelLogoUrls,
className,
}: Partial<DocspaceLogoProps>) => {
return (
<DocspaceLogo
whiteLabelLogoUrls={whiteLabelLogoUrls!}
className={className}
/>
);
};
export default inject<TStore>(({ settingsStore }) => {
const { whiteLabelLogoUrls } = settingsStore;
return {
whiteLabelLogoUrls,
};
})(observer(DocspaceLogoWrapper));

View File

@ -40,12 +40,12 @@ const EmptyFolderContainer = ({
const imageSrc = useMemo(getIcon, [getIcon]);
const headerText = useMemo(
() => getHeaderText(type, displayRoomCondition, t),
[t, displayRoomCondition, type]
[t, displayRoomCondition, type],
);
const descriptionText = useMemo(
() => getDescriptionText(type, canCreateFiles, t),
[t, canCreateFiles, type]
[t, canCreateFiles, type],
);
return (
@ -76,8 +76,6 @@ export default inject(
const { isLoading } = clientLoadingStore;
const { isArchiveFolderRoot } = treeFoldersStore;
const { isEmptyPage } = filesStore;
return {
isLoading,
@ -85,7 +83,6 @@ export default inject(
canCreateFiles,
isArchiveFolderRoot,
theme: settingsStore.theme,
isEmptyPage,
};
}
},
)(withTranslation(["Files", "Translations"])(observer(EmptyFolderContainer)));

View File

@ -28,6 +28,7 @@ const EmptyContainer = ({
setInviteUsersWarningDialogVisible,
isRoot,
isPublicRoom,
isEmptyPage,
}) => {
//const location = useLocation();
@ -85,6 +86,7 @@ const EmptyContainer = ({
onCreate={onCreate}
linkStyles={linkStyles}
type={type}
isEmptyPage={isEmptyPage}
/>
);
};
@ -128,5 +130,5 @@ export default inject(
isRoot,
isPublicRoom,
};
}
},
)(observer(EmptyContainer));

View File

@ -0,0 +1,28 @@
import { inject, observer } from "mobx-react";
import Error520 from "@docspace/shared/components/errors/Error520";
import type { Error520Props } from "@docspace/shared/components/errors/Errors.types";
const Error520Wrapper = (props: Error520Props) => {
return <Error520 {...props} />;
};
export default inject<TStore>(({ authStore, settingsStore, userStore }) => {
const {
whiteLabelLogoUrls,
firebaseHelper,
currentDeviceType,
currentColorScheme,
} = settingsStore;
const { user } = userStore;
const version = authStore.version;
return {
user,
version,
firebaseHelper,
currentDeviceType,
whiteLabelLogoUrls,
currentColorScheme,
};
})(observer(Error520Wrapper));

View File

@ -0,0 +1,29 @@
import { inject, observer } from "mobx-react";
import ErrorBoundary from "@docspace/shared/components/error-boundary/ErrorBoundary";
import type { ErrorBoundaryProps } from "@docspace/shared/components/error-boundary/ErrorBoundary.types";
const ErrorBoundaryWrapper = (props: ErrorBoundaryProps) => {
return <ErrorBoundary {...props} />;
};
export default inject<TStore>(({ authStore, settingsStore, userStore }) => {
const {
whiteLabelLogoUrls,
firebaseHelper,
currentDeviceType,
currentColorScheme,
} = settingsStore;
const { user } = userStore;
const version = authStore.version;
return {
user,
version,
firebaseHelper,
currentDeviceType,
whiteLabelLogoUrls,
currentColorScheme,
};
})(observer(ErrorBoundaryWrapper));

View File

@ -0,0 +1,16 @@
import { inject, observer } from "mobx-react";
import ErrorUnavailable from "@docspace/shared/components/errors/ErrorUnavailable";
import type { ErrorUnavailableProps } from "@docspace/shared/components/errors/Errors.types";
const ErrorUnavailableWrapper = (props: ErrorUnavailableProps) => {
return <ErrorUnavailable {...props} />;
};
export default inject<TStore>(({ settingsStore }) => {
const { whiteLabelLogoUrls } = settingsStore;
return {
whiteLabelLogoUrls,
};
})(observer(ErrorUnavailableWrapper));

View File

@ -142,6 +142,10 @@ export type FilesSelectorProps = {
onClose?: () => void;
withSearch: boolean;
withBreadCrumbs: boolean;
withSubtitle: boolean;
isMove?: boolean;
isCopy?: boolean;
isRestore: boolean;
@ -226,6 +230,8 @@ export type FilesSelectorProps = {
embedded: boolean;
withHeader: boolean;
withCancelButton: boolean;
cancelButtonLabel: string;
acceptButtonLabel: string;
settings: any;
roomsFolderId?: number;

View File

@ -46,6 +46,10 @@ const FilesSelector = ({
onClose,
withSearch = true,
withBreadCrumbs = true,
withSubtitle = true,
isMove,
isCopy,
isRestore,
@ -103,6 +107,8 @@ const FilesSelector = ({
embedded,
withHeader,
withCancelButton = true,
cancelButtonLabel,
acceptButtonLabel,
getIcon,
isRoomBackup,
@ -265,24 +271,31 @@ const FilesSelector = ({
}, [selectedItemId, isRoot]);
React.useEffect(() => {
const sessionPath = window.sessionStorage.getItem("filesSelectorPath");
let folderId = currentFolderId
? currentFolderId
: sessionPath && (isMove || isCopy || isRestore || isRestoreAll)
? +sessionPath
: fromFolderId;
const getRoomSettings = () => {
setSelectedItemType("rooms");
getRoomList(0, true);
};
const needRoomList = isRoomsOnly && !currentFolderId;
const needRoomList = isRoomsOnly && !folderId;
if (needRoomList) {
getRoomSettings();
return;
}
if (!currentFolderId) {
if (!folderId) {
getRootData();
return;
}
setSelectedItemId(currentFolderId);
setSelectedItemId(folderId);
if (
needRoomList ||
@ -296,8 +309,8 @@ const FilesSelector = ({
}
setSelectedItemType("files");
getFileList(0, currentFolderId, true);
}, []);
getFileList(0, folderId, true);
}, [currentFolderId]);
const onClickBreadCrumb = (item: BreadCrumb) => {
if (!isFirstLoad) {
@ -505,7 +518,7 @@ const FilesSelector = ({
isRestore,
);
const acceptButtonLabel = getAcceptButtonLabel(
const defaultAcceptButtonLabel = getAcceptButtonLabel(
t,
isEditorDialog,
isCopy,
@ -544,10 +557,10 @@ const FilesSelector = ({
onClearSearch={onClearSearchAction}
items={items ? items : []}
onSelect={onSelectAction}
acceptButtonLabel={acceptButtonLabel}
acceptButtonLabel={acceptButtonLabel || defaultAcceptButtonLabel}
onAccept={onAcceptAction}
withCancelButton={withCancelButton}
cancelButtonLabel={t("Common:CancelButton")}
cancelButtonLabel={cancelButtonLabel || t("Common:CancelButton")}
onCancel={onCloseAction}
emptyScreenImage={
theme.isBase ? EmptyScreenAltSvgUrl : EmptyScreenAltSvgDarkUrl
@ -561,12 +574,12 @@ const FilesSelector = ({
}
searchEmptyScreenHeader={t("Common:NotFoundTitle")}
searchEmptyScreenDescription={t("EmptyFilterDescriptionText")}
withBreadCrumbs
withBreadCrumbs={withBreadCrumbs}
breadCrumbs={breadCrumbs}
onSelectBreadCrumb={onClickBreadCrumb}
isLoading={showLoader}
isBreadCrumbsLoading={showBreadCrumbsLoader}
withSearch={!isRoot && items ? items.length > 0 : !isRoot && isFirstLoad}
withSearch={withSearch && !isRoot && items ? items.length > 0 : !isRoot && isFirstLoad}
rowLoader={
<RowLoader
isMultiSelect={false}
@ -590,7 +603,7 @@ const FilesSelector = ({
currentFooterInputValue={currentFooterInputValue}
footerCheckboxLabel={footerCheckboxLabel}
descriptionText={
!filterParam || filterParam === "ALL"
!withSubtitle || !filterParam || filterParam === "ALL"
? ""
: descriptionText ?? t("Common:SelectDOCXFormat")
}
@ -652,8 +665,6 @@ export default inject(
filesActionsStore;
const { itemOperationToFolder, clearActiveOperations } = uploadDataStore;
const sessionPath = window.sessionStorage.getItem("filesSelectorPath");
const { treeFolders, roomsFolderId } = treeFoldersStore;
const {
@ -727,13 +738,8 @@ export default inject(
? parentId
: selectedId;
const currentFolderId =
sessionPath && (isMove || isCopy || isRestore || isRestoreAll)
? +sessionPath
: fromFolderId;
return {
currentFolderId,
fromFolderId,
parentId,
rootFolderType,

View File

@ -0,0 +1,12 @@
import CreateGroupDialog from "@docspace/client/src/components/dialogs/CreateEditGroupDialog/CreateGroupDialog";
interface CreateGroupEventProps {
visible: boolean;
onClose: () => void;
}
const CreateGroupEvent = ({ visible, onClose }: CreateGroupEventProps) => {
return <CreateGroupDialog visible={visible} onClose={onClose} />;
};
export default CreateGroupEvent;

View File

@ -0,0 +1,12 @@
import EditGroupDialog from "@docspace/client/src/components/dialogs/CreateEditGroupDialog/EditGroupDialog";
interface CreateGroupEventProps {
visible: boolean;
onClose: () => void;
}
const EditGroupEvent = ({ item, visible, onClose }: CreateGroupEventProps) => {
return <EditGroupDialog visible={visible} onClose={onClose} group={item} />;
};
export default EditGroupEvent;

View File

@ -9,6 +9,8 @@ import CreateEvent from "./CreateEvent";
import RenameEvent from "./RenameEvent";
import CreateRoomEvent from "./CreateRoomEvent";
import EditRoomEvent from "./EditRoomEvent";
import CreateGroupEvent from "./GroupEvents/CreateGroupEvent";
import EditGroupEvent from "./GroupEvents/EditGroupEvent";
import ChangeUserTypeEvent from "./ChangeUserTypeEvent";
import CreatePluginFile from "./CreatePluginFileEvent";
@ -42,6 +44,16 @@ const GlobalEvents = ({ enablePlugins, eventListenerItemsList }) => {
onClose: null,
});
const [createGroupDialogProps, setCreateGroupDialogProps] = useState({
visible: false,
onClose: null,
});
const [editGroupDialogProps, setEditGroupDialogProps] = useState({
visible: false,
onClose: null,
});
const [changeUserTypeDialog, setChangeUserTypeDialogProps] = useState({
visible: false,
onClose: null,
@ -105,12 +117,13 @@ const GlobalEvents = ({ enablePlugins, eventListenerItemsList }) => {
title: e?.title,
visible: true,
onClose: () =>
setCreateRoomDialogProps({ title: "", visible: false, onClose: null }),
setCreateRoomDialogProps({ visible: false, onClose: null }),
});
}, []);
const onEditRoom = useCallback((e) => {
const visible = e.item ? true : false;
console.log(e);
const visible = !!e.item;
setEditRoomDialogProps({
visible: visible,
@ -125,6 +138,31 @@ const GlobalEvents = ({ enablePlugins, eventListenerItemsList }) => {
});
}, []);
const onCreateGroup = useCallback((e) => {
setCreateGroupDialogProps({
title: e?.title,
visible: true,
onClose: () =>
setCreateGroupDialogProps({ title: "", visible: false, onClose: null }),
});
}, []);
const onEditGroup = useCallback((e) => {
const visible = !!e.item;
setEditGroupDialogProps({
visible: visible,
item: e.item,
onClose: () => {
setEditGroupDialogProps({
visible: false,
item: null,
onClose: null,
});
},
});
}, []);
const onChangeUserType = useCallback((e) => {
setChangeUserTypeDialogProps({
visible: true,
@ -148,7 +186,7 @@ const GlobalEvents = ({ enablePlugins, eventListenerItemsList }) => {
},
});
},
[enablePlugins]
[enablePlugins],
);
useEffect(() => {
@ -157,11 +195,13 @@ const GlobalEvents = ({ enablePlugins, eventListenerItemsList }) => {
window.addEventListener(Events.ROOM_CREATE, onCreateRoom);
window.addEventListener(Events.ROOM_EDIT, onEditRoom);
window.addEventListener(Events.CHANGE_USER_TYPE, onChangeUserType);
window.addEventListener(Events.GROUP_CREATE, onCreateGroup);
window.addEventListener(Events.GROUP_EDIT, onEditGroup);
if (enablePlugins) {
window.addEventListener(
Events.CREATE_PLUGIN_FILE,
onCreatePluginFileDialog
onCreatePluginFileDialog,
);
if (eventListenerItemsList) {
@ -183,18 +223,20 @@ const GlobalEvents = ({ enablePlugins, eventListenerItemsList }) => {
window.removeEventListener(Events.ROOM_CREATE, onCreateRoom);
window.removeEventListener(Events.ROOM_EDIT, onEditRoom);
window.removeEventListener(Events.CHANGE_USER_TYPE, onChangeUserType);
window.removeEventListener(Events.GROUP_CREATE, onCreateGroup);
window.removeEventListener(Events.GROUP_EDIT, onEditGroup);
if (enablePlugins) {
window.removeEventListener(
Events.CREATE_PLUGIN_FILE,
onCreatePluginFileDialog
onCreatePluginFileDialog,
);
if (eventListenerItemsList) {
eventListenerItemsList.forEach((item, index) => {
window.removeEventListener(
item.eventType,
eventHandlersList.current[index]
eventHandlersList.current[index],
);
});
}
@ -205,6 +247,8 @@ const GlobalEvents = ({ enablePlugins, eventListenerItemsList }) => {
onCreate,
onCreateRoom,
onEditRoom,
onCreateGroup,
onEditGroup,
onChangeUserType,
onCreatePluginFileDialog,
enablePlugins,
@ -223,6 +267,12 @@ const GlobalEvents = ({ enablePlugins, eventListenerItemsList }) => {
editRoomDialogProps.visible && (
<EditRoomEvent key={Events.ROOM_EDIT} {...editRoomDialogProps} />
),
createGroupDialogProps.visible && (
<CreateGroupEvent key={Events.GROUP_CREATE} {...createGroupDialogProps} />
),
editGroupDialogProps.visible && (
<EditGroupEvent key={Events.GROUP_EDIT} {...editGroupDialogProps} />
),
changeUserTypeDialog.visible && (
<ChangeUserTypeEvent
key={Events.CHANGE_USER_TYPE}

View File

@ -1,6 +1,7 @@
import React from "react";
import { inject, observer } from "mobx-react";
import styled, { css } from "styled-components";
import { useLocation } from "react-router-dom";
import { mobile } from "@docspace/shared/utils";
import Bar from "./Bar";
@ -29,7 +30,6 @@ const StyledContainer = styled.div`
}
`;
const pathname = window.location.pathname;
const MainBar = ({
firstLoad,
checkedMaintenance,
@ -38,15 +38,18 @@ const MainBar = ({
isNotPaidPeriod,
isFrame,
}) => {
const { pathname } = useLocation();
React.useEffect(() => {
return () => setMaintenanceExist && setMaintenanceExist(false);
}, []);
const isVisibleBar =
!isFrame &&
!isNotPaidPeriod &&
pathname.indexOf("confirm") === -1 &&
pathname !== "/preparation-portal" &&
!isFrame;
!pathname.includes("error") &&
!pathname.includes("confirm") &&
!pathname.includes("preparation-portal");
return (
<StyledContainer id={"main-bar"} className={"main-bar"}>
@ -78,5 +81,5 @@ export default inject(
isNotPaidPeriod,
isFrame,
};
}
},
)(observer(MainBar));

View File

@ -1,161 +0,0 @@
import DepartmentsGroupReactSvgUrl from "PUBLIC_DIR/images/departments.group.react.svg?url";
import CatalogFolderReactSvgUrl from "PUBLIC_DIR/images/catalog.folder.react.svg?url";
import React from "react";
import { withTranslation } from "react-i18next";
import Filter from "@docspace/shared/api/people/filter";
import { inject, observer } from "mobx-react";
import { getSelectedGroup } from "../../../helpers/people-helpers";
import { useNavigate } from "react-router-dom";
import { isMobile } from "@docspace/shared/utils";
import { isMobileOnly } from "react-device-detect";
import config from "PACKAGE_FILE";
import { combineUrl } from "@docspace/shared/utils/combineUrl";
import { ArticleItem } from "@docspace/shared/components/article-item";
import withLoader from "../../../HOCs/withLoader";
import { ArticleFolderLoader } from "@docspace/shared/skeletons/article";
const departmentsIcon = DepartmentsGroupReactSvgUrl;
const groupIcon = CatalogFolderReactSvgUrl;
const ArticleBodyContent = ({
selectedKey,
groups,
toggleArticleOpen,
showText,
groupsCaption,
filter,
selectGroup,
isVisitor,
isAdmin,
setDocumentTitle,
}) => {
const [groupItems, setGroupItems] = React.useState(null);
const navigate = useNavigate();
const changeTitleDocument = React.useCallback(
(id) => {
const currentGroup = getSelectedGroup(
groups,
id === "root" ? selectedKey : id
);
currentGroup ? setDocumentTitle(currentGroup.name) : setDocumentTitle();
},
[getSelectedGroup, groups, selectedKey, setDocumentTitle]
);
const isActive = React.useCallback(
(group) => {
if (group === selectedKey) return true;
return false;
},
[selectedKey]
);
const onClick = React.useCallback(
(data) => {
const isRoot = data === "departments";
const groupId = isRoot ? "root" : data;
changeTitleDocument(groupId);
if (window.location.pathname.indexOf("/accounts/filter") > 0) {
selectGroup(groupId);
if (isMobileOnly || isMobile()) toggleArticleOpen();
} else {
const newFilter = isRoot ? Filter.getDefault() : filter.clone();
if (!isRoot) newFilter.group = groupId;
const urlFilter = newFilter.toUrlParams();
const url = combineUrl(
window.DocSpaceConfig?.proxy?.url,
config.homepage,
`/accounts/filter?${urlFilter}`
);
navigate(url);
if (isMobileOnly || isMobile()) toggleArticleOpen();
}
},
[changeTitleDocument, selectGroup, toggleArticleOpen, filter]
);
const getItems = React.useCallback(
(data) => {
const items = data.map((group) => {
const active = isActive(group.id);
return (
<ArticleItem
key={group.id}
id={group.id}
icon={groupIcon}
text={group.name}
showText={showText}
showInitial={true}
onClick={onClick}
isActive={active}
/>
);
});
setGroupItems(items);
},
[onClick, isActive, showText]
);
React.useEffect(() => {
getItems(groups);
}, [groups, getItems]);
return (
<>
{!isVisitor && (
<div style={!isAdmin && isMobileOnly ? { marginTop: "16px" } : null}>
<ArticleItem
key={"root"}
id={"departments"}
icon={departmentsIcon}
onClick={onClick}
text={groupsCaption}
showText={showText}
isActive={isActive("root")}
/>
{groupItems}
</div>
)}
</>
);
};
const BodyContent = withTranslation(["Article"])(
withLoader(ArticleBodyContent)(<ArticleFolderLoader />)
);
export default inject(
({ authStore, settingsStore, peopleStore, userStore }) => {
const { setDocumentTitle, isAdmin } = authStore;
const { customNames, showText, toggleArticleOpen } = settingsStore;
const { groupsStore, selectedGroupStore, filterStore } = peopleStore;
const { filter } = filterStore;
const { groups } = groupsStore;
const { groupsCaption } = customNames;
const { selectedGroup, selectGroup } = selectedGroupStore;
const selectedKey = selectedGroup ? selectedGroup : "root";
return {
setDocumentTitle,
isVisitor: userStore.user.isVisitor,
isAdmin,
groups,
groupsCaption,
selectedKey,
selectGroup,
filter,
showText,
toggleArticleOpen,
};
}
)(observer(BodyContent));

View File

@ -1,8 +1,9 @@
import React from "react";
import AppLoader from "@docspace/common/components/AppLoader";
import ErrorBoundary from "@docspace/common/components/ErrorBoundary";
import Error520 from "client/Error520";
import Error404 from "client/Error404";
import Error404 from "@docspace/shared/components/errors/Error404";
import ErrorBoundary from "../ErrorBoundaryWrapper";
import Error520 from "../Error520Wrapper";
function loadComponent(scope, module) {
return async () => {
@ -92,7 +93,7 @@ const System = (props) => {
}
const Component = React.lazy(
loadComponent(props.system.scope, props.system.module)
loadComponent(props.system.scope, props.system.module),
);
return (

View File

@ -0,0 +1,37 @@
import React, { PropsWithChildren } from "react";
import { inject, observer } from "mobx-react";
import { useTranslation } from "react-i18next";
import { ThemeProvider } from "@docspace/shared/components/theme-provider";
import type { ThemeProviderProps } from "@docspace/shared/components/theme-provider/ThemeProvider.types";
const ThemeProviderWrapper = ({
children,
theme,
currentColorScheme,
}: PropsWithChildren<Partial<Omit<ThemeProviderProps, "children">>>) => {
const { i18n } = useTranslation();
return (
<ThemeProvider
theme={{ ...theme!, interfaceDirection: i18n.dir() }}
currentColorScheme={currentColorScheme}
>
{children}
</ThemeProvider>
);
};
const ThemeProviderInjectWrapper = inject<TStore>(({ settingsStore }) => {
const { theme, timezone, currentColorScheme } = settingsStore;
window.theme = theme;
window.timezone = timezone;
return {
theme,
currentColorScheme,
timezone,
};
})(observer(ThemeProviderWrapper));
export default ThemeProviderInjectWrapper;

View File

@ -0,0 +1,127 @@
import { useState, ChangeEvent } from "react";
import {
ModalDialog,
ModalDialogType,
} from "@docspace/shared/components/modal-dialog";
import { Button, ButtonSize } from "@docspace/shared/components/button";
import { toastr } from "@docspace/shared/components/toast";
import { observer, inject } from "mobx-react";
import { useTranslation } from "react-i18next";
import { useNavigate } from "react-router-dom";
import { GroupParams } from "./types";
import { createGroup } from "@docspace/shared/api/groups";
import GroupNameParam from "./sub-components/GroupNameParam";
import HeadOfGroup from "./sub-components/HeadOfGroupParam";
import MembersParam from "./sub-components/MembersParam";
interface CreateGroupDialogProps {
visible: boolean;
onClose: () => void;
getGroups: () => void;
}
const CreateGroupDialog = ({
visible,
onClose,
getGroups,
}: CreateGroupDialogProps) => {
const navigate = useNavigate();
const { t } = useTranslation(["Common", "PeopleTranslations"]);
const [groupParams, setGroupParams] = useState<GroupParams>({
groupName: "",
groupManager: null,
groupMembers: [],
});
const [isLoading, setIsLoading] = useState<boolean>(false);
const onChangeGroupName = (e: ChangeEvent<HTMLInputElement>) =>
setGroupParams({ ...groupParams, groupName: e.target.value });
const setGroupManager = (groupManager: object | null) =>
setGroupParams({ ...groupParams, groupManager });
const setGroupMembers = (groupMembers: object[]) =>
setGroupParams({ ...groupParams, groupMembers });
const onCreateGroup = async () => {
setIsLoading(true);
const groupManagerId = groupParams.groupManager.id;
const groupMemebersIds = groupParams.groupMembers.map((gm) => gm.id);
createGroup(groupParams.groupName, groupManagerId, groupMemebersIds)
.then(() => {
navigate("/accounts/groups/filter");
getGroups();
})
.catch((err) => toastr.error(err.message))
.finally(() => {
setIsLoading(false);
onClose();
});
};
return (
<ModalDialog
displayType={ModalDialogType.aside}
withBodyScroll
visible={visible}
onClose={onClose}
withFooterBorder
// isScrollLocked={isScrollLocked}
// isOauthWindowOpen={isOauthWindowOpen}
>
<ModalDialog.Header>
{t("PeopleTranslations:CreateGroup")}
</ModalDialog.Header>
<ModalDialog.Body>
<GroupNameParam
groupName={groupParams.groupName}
onChangeGroupName={onChangeGroupName}
/>
<HeadOfGroup
groupManager={groupParams.groupManager}
setGroupManager={setGroupManager}
onClose={onClose}
/>
<MembersParam
groupManager={groupParams.groupManager}
groupMembers={groupParams.groupMembers}
setGroupMembers={setGroupMembers}
onClose={onClose}
/>
</ModalDialog.Body>
<ModalDialog.Footer>
<Button
id="create-group-modal_submit"
tabIndex={5}
label={t("Common:Create")}
size={ButtonSize.normal}
primary
scale
onClick={onCreateGroup}
isDisabled={!groupParams.groupManager || !groupParams.groupName}
isLoading={isLoading}
/>
<Button
id="create-group-modal_cancel"
tabIndex={5}
label={t("Common:CancelButton")}
size={ButtonSize.normal}
scale
isDisabled={isLoading}
onClick={onClose}
/>
</ModalDialog.Footer>
</ModalDialog>
);
};
export default inject(({ peopleStore }) => ({
getGroups: peopleStore.groupsStore.getGroups,
}))(observer(CreateGroupDialog));

Some files were not shown because too many files have changed in this diff Show More