Merge branch 'bugfix/selectors' into feature/editor-nextjs

This commit is contained in:
Timofey Boyko 2024-02-14 13:59:55 +03:00
commit 41711d21dd
175 changed files with 10184 additions and 2290 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

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,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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -3,62 +3,66 @@
"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",
"AllTypes": "All types",
"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",
"Chat": "Chat",
"CSPDescription": "To safely embed DocSpace as an iframe in a website, add its URL to your allow list.",
"CSPHeader": "Embed DocSpace as iframe",
"CSPHelp": "This setting is a security mechanism that can be used to protect against content injection attacks. The CSP describes secure resource download sources. Downloading from resources not included in the `white list` is blocked. Specify the domains (together with the protocol) with which it will work.",
"CSPInputPlaceholder": "Enter URL like this: https://example.com",
"CustomizingDisplay": "Customizing the display",
"DefaultColumnsOption": "Default (Quantity depends on screen width)",
"DataDisplay": "Data display settings",
"DefaultColumnsOption": "Default (Quantity depends on screen width)",
"Descending": "Descending",
"DisplayColumns": "Displaying columns in a file row",
"EmbedCodeSuccessfullyCopied": "Embed code successfully copied to clipboard",
"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",
"ElementItself": "The element itself",
"ElementCalledAfterClicking": "The element will be called after clicking",
"FeedbackAndSupport": "Feedback&Support",
"Filter": "Search, Filter and Sort",
"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",
"FileId": "File 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).",
"InterfaceElements": "Interface elements",
"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.",
"MainElementParameter": "Main element parameter",
"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",
@ -67,33 +71,29 @@
"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",
"RightPanelCollapsed": "Right panel collapsed",
"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",
"ManagerSearchBlockDescription": "You can disable the search, filter and sort options.",
"FilesSearchDescription": "File search within the opened folder/room.",
"SearchTerm": "Search term",
"SelectToDocSpace": "Select to DocSpace",
"SelectImage": "Select image",
"SettingUpColumns": "Setting up Columns",
"SettingUpColumnsDescription": "You can disable the ability for users to manage and customize file information columns in list view.",
"SetItUp": "Set it up",
"SelectButtonText": "Select Button text",
"SelectFile": "Select a file",
"SelectRoom": "Select a room",
"SelectTypes": "Select types",
"SelectImage": "Select image",
"SelectorPreview": "Selector preview",
"SortOrder": "Sort order",
"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",
"Subtitle": "Subtitle",
"SubtitleDescription": "Subtitle with additional comments or descriptions for the current directory.",
"TabPlugins": "Tab Plugins",
"Title": "Navigate and Title",
"ManagerTitleDescription": "You can disable the title of the current section/room/folder.",
"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,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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

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

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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

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

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

@ -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

@ -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

@ -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

@ -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,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 () => {

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

@ -35,7 +35,6 @@ import DeleteLinkDialog from "./DeleteLinkDialog";
import MoveToPublicRoom from "./MoveToPublicRoom";
import BackupToPublicRoom from "./BackupToPublicRoom";
import SettingsPluginDialog from "./SettingsPluginDialog";
import ReportDialog from "./ReportDialog";
import PluginDialog from "./PluginDialog";
import DeletePluginDialog from "./DeletePluginDialog";
import ShareFolderDialog from "./ShareFolderDialog";
@ -78,7 +77,6 @@ export {
MoveToPublicRoom,
BackupToPublicRoom,
SettingsPluginDialog,
ReportDialog,
PluginDialog,
DeletePluginDialog,
ShareFolderDialog,

View File

@ -3,7 +3,7 @@ import React from "react";
import styled, { css } from "styled-components";
import { withTranslation } from "react-i18next";
import { useNavigate } from "react-router-dom";
import Headline from "@docspace/common/components/Headline";
import Headline from "@docspace/shared/components/headline/Headline";
import { IconButton } from "@docspace/shared/components/icon-button";
import { tablet } from "@docspace/shared/utils";

View File

@ -13,7 +13,7 @@ import {
import withLoader from "../withLoader";
import { FormWrapper } from "@docspace/shared/components/form-wrapper";
import { toastr } from "@docspace/shared/components/toast";
import DocspaceLogo from "../../../DocspaceLogo";
import DocspaceLogo from "../../../components/DocspaceLogoWrapper";
import { ownerChange } from "@docspace/shared/api/settings";
import { getUserFromConfirm } from "@docspace/shared/api/people";

View File

@ -12,7 +12,7 @@ import { FormWrapper } from "@docspace/shared/components/form-wrapper";
import { createPasswordHash } from "@docspace/shared/utils/common";
import { login } from "@docspace/shared/utils/loginUtils";
import DocspaceLogo from "../../../DocspaceLogo";
import DocspaceLogo from "../../../components/DocspaceLogoWrapper";
import { getPasswordErrorMessage } from "../../../helpers/utils";
import withLoader from "../withLoader";
import { StyledPage, StyledBody, StyledContent } from "./StyledConfirm";

View File

@ -8,7 +8,7 @@ import { inject, observer } from "mobx-react";
import { StyledPage, StyledBody, StyledContent } from "./StyledConfirm";
import withLoader from "../withLoader";
import { FormWrapper } from "@docspace/shared/components/form-wrapper";
import DocspaceLogo from "../../../DocspaceLogo";
import DocspaceLogo from "../../../components/DocspaceLogoWrapper";
const ChangePhoneForm = (props) => {
const { t, greetingTitle } = props;

View File

@ -17,7 +17,7 @@ import {
import withLoader from "../withLoader";
import { FormWrapper } from "@docspace/shared/components/form-wrapper";
import DocspaceLogo from "../../../DocspaceLogo";
import DocspaceLogo from "../../../components/DocspaceLogoWrapper";
const ContinuePortal = (props) => {
const { t, greetingTitle, linkData } = props;

View File

@ -28,7 +28,7 @@ import MoreLoginModal from "@docspace/shared/components/more-login-modal";
import { EmailInput } from "@docspace/shared/components/email-input";
import { getPasswordErrorMessage } from "../../../helpers/utils";
import { FormWrapper } from "@docspace/shared/components/form-wrapper";
import DocspaceLogo from "../../../DocspaceLogo";
import DocspaceLogo from "../../../components/DocspaceLogoWrapper";
import DefaultUserPhoto from "PUBLIC_DIR/images/default_user_photo_size_82-82.png";
import { StyledPage, StyledContent } from "./StyledConfirm";
import {

View File

@ -17,7 +17,7 @@ import {
import withLoader from "../withLoader";
import { FormWrapper } from "@docspace/shared/components/form-wrapper";
import DocspaceLogo from "../../../DocspaceLogo";
import DocspaceLogo from "../../../components/DocspaceLogoWrapper";
const DeactivatePortal = (props) => {
const { t, greetingTitle, linkData, companyInfoSettingsData } = props;

View File

@ -10,7 +10,7 @@ import { toastr } from "@docspace/shared/components/toast";
import { StyledPage, StyledBody, StyledContent } from "./StyledConfirm";
import withLoader from "../withLoader";
import { FormWrapper } from "@docspace/shared/components/form-wrapper";
import DocspaceLogo from "../../../DocspaceLogo";
import DocspaceLogo from "../../../components/DocspaceLogoWrapper";
const ProfileRemoveForm = (props) => {
const { t, greetingTitle, linkData, legalTerms, currentColorScheme } = props;

View File

@ -18,7 +18,7 @@ import {
import withLoader from "../withLoader";
import { FormWrapper } from "@docspace/shared/components/form-wrapper";
import DocspaceLogo from "../../../DocspaceLogo";
import DocspaceLogo from "../../../components/DocspaceLogoWrapper";
const RemovePortal = (props) => {
const { t, greetingTitle, linkData, companyInfoSettingsData } = props;

View File

@ -9,11 +9,11 @@ import { inject, observer } from "mobx-react";
import { Box } from "@docspace/shared/components/box";
import withLoader from "../withLoader";
import { toastr } from "@docspace/shared/components/toast";
import ErrorContainer from "@docspace/common/components/ErrorContainer";
import ErrorContainer from "@docspace/shared/components/error-container/ErrorContainer";
import { mobile, tablet } from "@docspace/shared/utils";
import { Link } from "@docspace/shared/components/link";
import { FormWrapper } from "@docspace/shared/components/form-wrapper";
import DocspaceLogo from "../../../DocspaceLogo";
import DocspaceLogo from "../../../components/DocspaceLogoWrapper";
import { StyledPage, StyledContent } from "./StyledConfirm";
import {
getTfaSecretKeyAndQR,

View File

@ -12,7 +12,7 @@ import { toastr } from "@docspace/shared/components/toast";
import withLoader from "../withLoader";
import { mobile } from "@docspace/shared/utils";
import { FormWrapper } from "@docspace/shared/components/form-wrapper";
import DocspaceLogo from "../../../DocspaceLogo";
import DocspaceLogo from "../../../components/DocspaceLogoWrapper";
import { StyledPage, StyledContent } from "./StyledConfirm";
import { validateTfaCode } from "@docspace/shared/api/settings";
import { loginWithTfaCode } from "@docspace/shared/api/user";

View File

@ -1,36 +0,0 @@
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import Backend from "@docspace/shared/utils/i18next-http-backend";
import { LANGUAGE } from "@docspace/shared/constants";
import config from "PACKAGE_FILE";
import { getCookie } from "@docspace/shared/utils";
import { loadLanguagePath } from "SRC_DIR/helpers/utils";
const newInstance = i18n.createInstance();
newInstance
.use(Backend)
.use(initReactI18next)
.init({
lng: getCookie(LANGUAGE) || "en",
fallbackLng: "en",
load: "currentOnly",
//debug: true,
interpolation: {
escapeValue: false, // not needed for react as it escapes by default
format: function (value, format) {
if (format === "lowercase") return value.toLowerCase();
return value;
},
},
backend: {
loadPath: loadLanguagePath(config.homepage, "Errors"),
},
react: {
useSuspense: false,
},
});
export default newInstance;

View File

@ -1,17 +0,0 @@
import React from "react";
import ErrorContainer from "@docspace/common/components/ErrorContainer";
import { I18nextProvider, useTranslation } from "react-i18next";
import i18n from "./i18n";
const Error401 = ({}) => {
const { t } = useTranslation("Errors");
return <ErrorContainer headerText={t("Error401Text")} />;
};
export default () => (
<I18nextProvider i18n={i18n}>
<Error401 />
</I18nextProvider>
);

View File

@ -1,36 +0,0 @@
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import Backend from "@docspace/shared/utils/i18next-http-backend";
import { LANGUAGE } from "@docspace/shared/constants";
import config from "PACKAGE_FILE";
import { getCookie } from "@docspace/shared/utils";
import { loadLanguagePath } from "SRC_DIR/helpers/utils";
const newInstance = i18n.createInstance();
newInstance
.use(Backend)
.use(initReactI18next)
.init({
lng: getCookie(LANGUAGE) || "en",
fallbackLng: "en",
load: "currentOnly",
//debug: true,
interpolation: {
escapeValue: false, // not needed for react as it escapes by default
format: function (value, format) {
if (format === "lowercase") return value.toLowerCase();
return value;
},
},
backend: {
loadPath: loadLanguagePath(config.homepage, "Errors"),
},
react: {
useSuspense: false,
},
});
export default newInstance;

View File

@ -1,16 +0,0 @@
import React from "react";
import ErrorContainer from "@docspace/common/components/ErrorContainer";
import { I18nextProvider, useTranslation } from "react-i18next";
import i18n from "./i18n";
const Error403 = () => {
const { t } = useTranslation("Errors");
return <ErrorContainer headerText={t("Error403Text")} />;
};
export default () => (
<I18nextProvider i18n={i18n}>
<Error403 />
</I18nextProvider>
);

View File

@ -1,36 +0,0 @@
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import Backend from "@docspace/shared/utils/i18next-http-backend";
import { LANGUAGE } from "@docspace/shared/constants";
import config from "PACKAGE_FILE";
import { getCookie } from "@docspace/shared/utils";
import { loadLanguagePath } from "SRC_DIR/helpers/utils";
const newInstance = i18n.createInstance();
newInstance
.use(Backend)
.use(initReactI18next)
.init({
lng: getCookie(LANGUAGE) || "en",
fallbackLng: "en",
load: "currentOnly",
//debug: true,
interpolation: {
escapeValue: false, // not needed for react as it escapes by default
format: function (value, format) {
if (format === "lowercase") return value.toLowerCase();
return value;
},
},
backend: {
loadPath: loadLanguagePath(config.homepage, "Errors"),
},
react: {
useSuspense: false,
},
});
export default newInstance;

View File

@ -1,15 +0,0 @@
import React from "react";
import ErrorContainer from "@docspace/common/components/ErrorContainer";
import { I18nextProvider, useTranslation } from "react-i18next";
import i18n from "./i18n";
const Error404 = () => {
const { t, ready } = useTranslation("Errors");
return ready ? <ErrorContainer headerText={t("Error404Text")} /> : <></>;
};
export default () => (
<I18nextProvider i18n={i18n}>
<Error404 />
</I18nextProvider>
);

View File

@ -1,36 +0,0 @@
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import Backend from "@docspace/shared/utils/i18next-http-backend";
import { LANGUAGE } from "@docspace/shared/constants";
import config from "PACKAGE_FILE";
import { getCookie } from "@docspace/shared/utils";
import { loadLanguagePath } from "SRC_DIR/helpers/utils";
const newInstance = i18n.createInstance();
newInstance
.use(Backend)
.use(initReactI18next)
.init({
lng: getCookie(LANGUAGE) || "en",
fallbackLng: "en",
load: "currentOnly",
//debug: true,
interpolation: {
escapeValue: false, // not needed for react as it escapes by default
format: function (value, format) {
if (format === "lowercase") return value.toLowerCase();
return value;
},
},
backend: {
loadPath: loadLanguagePath(config.homepage),
},
react: {
useSuspense: false,
},
});
export default newInstance;

View File

@ -1,128 +0,0 @@
import React, { useState, useEffect } from "react";
import styled from "styled-components";
import { inject, observer } from "mobx-react";
import { I18nextProvider, useTranslation } from "react-i18next";
import ErrorContainer from "@docspace/common/components/ErrorContainer";
import { useParams } from "react-router-dom";
import { Link } from "@docspace/shared/components/link";
import { ZendeskAPI } from "@docspace/shared/components/zendesk";
import { ReportDialog } from "SRC_DIR/components/dialogs";
import DocspaceLogo from "SRC_DIR/DocspaceLogo";
import {
getCrashReport,
downloadJson,
getCurrentDate,
} from "SRC_DIR/helpers/crashReport";
import i18n from "./i18n";
const StyledWrapper = styled.div`
width: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
margin: 0 16px;
.logo {
margin-bottom: 28px;
}
.link {
margin-top: 24px;
}
#customized-text {
max-width: 480px;
text-align: center;
}
`;
const Error520 = ({
errorLog,
currentColorScheme,
FirebaseHelper,
user,
version,
}) => {
const { t } = useTranslation(["Common"]);
const { error } = useParams();
const [reportDialogVisible, setReportDialogVisible] = useState(false);
const autoSendReport = async () => {
const report = getCrashReport(user.id, version, user.cultureName, errorLog);
const reportWithDescription = Object.assign(report, {
description: "AUTO SEND",
});
await FirebaseHelper.sendCrashReport(reportWithDescription);
};
useEffect(() => {
FirebaseHelper.isEnabledDB && autoSendReport();
}, []);
const showDialog = () => {
setReportDialogVisible(true);
};
const closeDialog = () => {
setReportDialogVisible(false);
};
const onReloadClick = () => {
window.location.reload();
};
ZendeskAPI("webWidget", "show");
if (!FirebaseHelper.isEnabledDB)
return <ErrorContainer headerText={t("SomethingWentWrong")} />;
return (
<StyledWrapper>
<DocspaceLogo className="logo" />
<ErrorContainer
isPrimaryButton={false}
headerText={t("SomethingWentWrong")}
//customizedBodyText={t("SomethingWentWrongDescription")}
//buttonText={t("SendReport")}
//onClickButton={showDialog}
/>
<Link
className="link"
type="action"
isHovered
fontWeight={600}
onClick={onReloadClick}
color={currentColorScheme?.main?.accent}
>
{t("ReloadPage")}
</Link>
<ReportDialog
visible={reportDialogVisible}
onClose={closeDialog}
error={errorLog}
/>
</StyledWrapper>
);
};
const Error520Wrapper = inject(({ authStore, settingsStore, userStore }) => {
const { currentColorScheme, firebaseHelper } = settingsStore;
const { user } = userStore;
return {
currentColorScheme,
FirebaseHelper: firebaseHelper,
user,
version: authStore.version,
};
})(observer(Error520));
export default (props) => (
<I18nextProvider i18n={i18n}>
<Error520Wrapper {...props} />
</I18nextProvider>
);

View File

@ -1,36 +0,0 @@
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import Backend from "@docspace/shared/utils/i18next-http-backend";
import { LANGUAGE } from "@docspace/shared/constants";
import config from "PACKAGE_FILE";
import { loadLanguagePath } from "SRC_DIR/helpers/utils";
const newInstance = i18n.createInstance();
newInstance
.use(Backend)
.use(initReactI18next)
.init({
lng: localStorage.getItem(LANGUAGE) || "en",
fallbackLng: "en",
load: "currentOnly",
//debug: true,
interpolation: {
escapeValue: false, // not needed for react as it escapes by default
format: function (value, format) {
if (format === "lowercase") return value.toLowerCase();
return value;
},
},
backend: {
loadPath: loadLanguagePath(config.homepage, "Errors"),
},
react: {
useSuspense: false,
},
});
export default newInstance;

View File

@ -1,41 +0,0 @@
import { useEffect } from "react";
import styled from "styled-components";
import { I18nextProvider, useTranslation } from "react-i18next";
import ErrorContainer from "@docspace/common/components/ErrorContainer";
import i18n from "./i18n";
const StyledWrapper = styled.div`
width: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 64px;
`;
const AccessRestricted = () => {
const { t, ready } = useTranslation("Errors");
useEffect(() => {
window.history.replaceState(null, "");
}, []);
return ready ? (
<StyledWrapper>
<ErrorContainer
headerText={t("AccessDenied")}
bodyText={t("PortalRestriction")}
/>
</StyledWrapper>
) : (
<></>
);
};
export default () => (
<I18nextProvider i18n={i18n}>
<AccessRestricted />
</I18nextProvider>
);

View File

@ -1,36 +0,0 @@
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import Backend from "@docspace/shared/utils/i18next-http-backend";
import { LANGUAGE } from "@docspace/shared/constants";
import config from "PACKAGE_FILE";
import { loadLanguagePath } from "SRC_DIR/helpers/utils";
const newInstance = i18n.createInstance();
newInstance
.use(Backend)
.use(initReactI18next)
.init({
lng: localStorage.getItem(LANGUAGE) || "en",
fallbackLng: "en",
load: "currentOnly",
//debug: true,
interpolation: {
escapeValue: false, // not needed for react as it escapes by default
format: function (value, format) {
if (format === "lowercase") return value.toLowerCase();
return value;
},
},
backend: {
loadPath: loadLanguagePath(config.homepage, "Errors"),
},
react: {
useSuspense: false,
},
});
export default newInstance;

View File

@ -1,34 +0,0 @@
import React from "react";
import styled from "styled-components";
import ErrorContainer from "@docspace/common/components/ErrorContainer";
import { I18nextProvider, useTranslation } from "react-i18next";
import i18n from "./i18n";
import DocspaceLogo from "../../../DocspaceLogo";
const StyledWrapper = styled.div`
width: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 64px;
`;
const ErrorUnavailable = ({ logoUrl }) => {
const { t, ready } = useTranslation("Errors");
return ready ? (
<StyledWrapper>
<DocspaceLogo />
<ErrorContainer headerText={t("ErrorDeactivatedText")} />
</StyledWrapper>
) : (
<></>
);
};
export default () => (
<I18nextProvider i18n={i18n}>
<ErrorUnavailable />
</I18nextProvider>
);

View File

@ -1,5 +0,0 @@
export { default as Error401 } from "./401";
export { default as Error403 } from "./403";
export { default as Error404 } from "./404";
export { default as Error520 } from "./520";
export { default as Offline } from "./offline";

View File

@ -1,36 +0,0 @@
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import Backend from "@docspace/shared/utils/i18next-http-backend";
import { LANGUAGE } from "@docspace/shared/constants";
import config from "PACKAGE_FILE";
import { getCookie } from "@docspace/shared/utils";
import { loadLanguagePath } from "SRC_DIR/helpers/utils";
const newInstance = i18n.createInstance();
newInstance
.use(Backend)
.use(initReactI18next)
.init({
lng: getCookie(LANGUAGE) || "en",
fallbackLng: "en",
load: "currentOnly",
//debug: true,
interpolation: {
escapeValue: false, // not needed for react as it escapes by default
format: function (value, format) {
if (format === "lowercase") return value.toLowerCase();
return value;
},
},
backend: {
loadPath: loadLanguagePath(config.homepage, "Errors"),
},
react: {
useSuspense: false,
},
});
export default newInstance;

View File

@ -1,15 +0,0 @@
import React from "react";
import ErrorContainer from "@docspace/common/components/ErrorContainer";
import { I18nextProvider, useTranslation } from "react-i18next";
import i18n from "./i18n";
const ErrorOfflineContainer = () => {
const { t } = useTranslation("Errors");
return <ErrorContainer headerText={t("ErrorOfflineText")} />;
};
export default () => (
<I18nextProvider i18n={i18n}>
<ErrorOfflineContainer />
</I18nextProvider>
);

View File

@ -1,7 +1,7 @@
import styled, { css } from "styled-components";
import { tablet, mobile } from "@docspace/shared/utils";
import Headline from "@docspace/common/components/Headline";
import Headline from "@docspace/shared/components/headline/Headline";
import { Base } from "@docspace/shared/themes";
import { Button } from "@docspace/shared/components/button";

View File

@ -2,7 +2,7 @@ import React, { useCallback } from "react";
import { useTranslation } from "react-i18next";
import styled, { css } from "styled-components";
import Error520 from "client/Error520";
import Error520 from "../../../../components/Error520Wrapper";
import { inject, observer } from "mobx-react";
import { combineUrl } from "@docspace/shared/utils/combineUrl";
import config from "PACKAGE_FILE";

View File

@ -6,7 +6,7 @@ import { inject, observer } from "mobx-react";
import styled, { css } from "styled-components";
import { useNavigate, useLocation } from "react-router-dom";
import { withTranslation } from "react-i18next";
import Headline from "@docspace/common/components/Headline";
import Headline from "@docspace/shared/components/headline/Headline";
import { IconButton } from "@docspace/shared/components/icon-button";
import { TableGroupMenu } from "@docspace/shared/components/table";
import { DropDownItem } from "@docspace/shared/components/drop-down-item";

View File

@ -10,7 +10,7 @@ import { useNavigate } from "react-router-dom";
import ArrowPathReactSvgUrl from "PUBLIC_DIR/images/arrow.path.react.svg?url";
import RetryIcon from "PUBLIC_DIR/images/refresh.react.svg?url";
import Headline from "@docspace/common/components/Headline";
import Headline from "@docspace/shared/components/headline/Headline";
import { IconButton } from "@docspace/shared/components/icon-button";
import { tablet, mobile } from "@docspace/shared/utils";

View File

@ -7,7 +7,7 @@ import { inject, observer } from "mobx-react";
import ArrowPathReactSvgUrl from "PUBLIC_DIR/images/arrow.path.react.svg?url";
import RetryIcon from "PUBLIC_DIR/images/refresh.react.svg?url";
import Headline from "@docspace/common/components/Headline";
import Headline from "@docspace/shared/components/headline/Headline";
import { IconButton } from "@docspace/shared/components/icon-button";
// import { Hint } from "../../styled-components";

View File

@ -1,11 +1,11 @@
import React, { useState, useEffect } from "react";
import ErrorContainer from "@docspace/common/components/ErrorContainer";
import { useTranslation } from "react-i18next";
import { Text } from "@docspace/shared/components/text";
import styled from "styled-components";
import { inject, observer } from "mobx-react";
import { ReactSVG } from "react-svg";
import { Button } from "@docspace/shared/components/button";
import ErrorContainer from "@docspace/shared/components/error-container/ErrorContainer";
import RecoverAccessModalDialog from "@docspace/common/components/Dialogs/RecoverAccessModalDialog";
import { ColorTheme, ThemeId } from "@docspace/shared/components/color-theme";
import { mobile } from "@docspace/shared/utils";

View File

@ -1,5 +1,5 @@
import React, { useEffect, useState } from "react";
import ErrorContainer from "@docspace/common/components/ErrorContainer";
import ErrorContainer from "@docspace/shared/components/error-container/ErrorContainer";
import { withTranslation } from "react-i18next";
import { StyledPreparationPortal } from "./StyledPreparationPortal";

View File

@ -11,7 +11,7 @@ import { inject, observer } from "mobx-react";
import { IconButton } from "@docspace/shared/components/icon-button";
import { ContextMenuButton } from "@docspace/shared/components/context-menu-button";
import Headline from "@docspace/common/components/Headline";
import Headline from "@docspace/shared/components/headline/Headline";
import Loaders from "@docspace/common/components/Loaders";
import { DeleteSelfProfileDialog } from "SRC_DIR/components/dialogs";
import { DeleteOwnerProfileDialog } from "SRC_DIR/components/dialogs";

View File

@ -1,7 +1,7 @@
import styled, { css } from "styled-components";
import { tablet, mobile } from "@docspace/shared/utils";
import Headline from "@docspace/common/components/Headline";
import Headline from "@docspace/shared/components/headline/Headline";
const StyledHeadline = styled(Headline)`
font-weight: 700;

View File

@ -1,7 +1,7 @@
import React, { useEffect } from "react";
import { withTranslation } from "react-i18next";
import { frameCallCommand } from "@docspace/shared/utils/common";
import ErrorContainer from "@docspace/common/components/ErrorContainer";
import ErrorContainer from "@docspace/shared/components/error-container/ErrorContainer";
const RoomErrors = ({ t, tReady, isInvalid }) => {
const headerText = isInvalid ? t("InvalidLink") : t("Common:ExpiredLink");

View File

@ -10,7 +10,7 @@ import { StyledPage, StyledBody, StyledContent } from "./RoomStyles";
import { frameCallCommand } from "@docspace/shared/utils/common";
import { toastr } from "@docspace/shared/components/toast";
import { FormWrapper } from "@docspace/shared/components/form-wrapper";
import DocspaceLogo from "../../../DocspaceLogo";
import DocspaceLogo from "../../../components/DocspaceLogoWrapper";
import { ValidationStatus } from "../../../helpers/constants";
import PublicRoomIcon from "PUBLIC_DIR/images/icons/32/room/public.svg";

View File

@ -1,7 +1,7 @@
import { useState, useEffect } from "react";
import { useTranslation } from "react-i18next";
import { getObjectByLocation } from "@docspace/shared/utils/common";
import ErrorContainer from "@docspace/common/components/ErrorContainer";
import ErrorContainer from "@docspace/shared/components/error-container/ErrorContainer";
import Section from "@docspace/shared/components/section";
import { RectangleSkeleton } from "@docspace/shared/skeletons";
import { setDocumentTitle } from "SRC_DIR/helpers/utils";

View File

@ -1,7 +1,7 @@
import ArrowPathReactSvgUrl from "PUBLIC_DIR/images/arrow.path.react.svg?url";
import React from "react";
import styled, { css } from "styled-components";
import Headline from "@docspace/common/components/Headline";
import Headline from "@docspace/shared/components/headline/Headline";
import { IconButton } from "@docspace/shared/components/icon-button";
import { desktop, tablet } from "@docspace/shared/utils";

View File

@ -14,7 +14,7 @@ import { Link } from "@docspace/shared/components/link";
import { Checkbox } from "@docspace/shared/components/checkbox";
import { Button } from "@docspace/shared/components/button";
import { FieldContainer } from "@docspace/shared/components/field-container";
import ErrorContainer from "@docspace/common/components/ErrorContainer";
import ErrorContainer from "@docspace/shared/components/error-container/ErrorContainer";
import { FileInput } from "@docspace/shared/components/file-input";
import { Loader } from "@docspace/shared/components/loader";
@ -42,7 +42,7 @@ import {
} from "./StyledWizard";
import { getUserTimezone, getSelectZone } from "./timezonesHelper";
import DocspaceLogo from "SRC_DIR/DocspaceLogo";
import DocspaceLogo from "../../components/DocspaceLogoWrapper";
import RefreshReactSvgUrl from "PUBLIC_DIR/images/refresh.react.svg?url";
import {
DEFAULT_SELECT_TIMEZONE,

View File

@ -2,7 +2,7 @@ import React from "react";
import { createBrowserRouter } from "react-router-dom";
import routes from "./routes";
import Error404 from "SRC_DIR/pages/Errors/404";
import Error404 from "@docspace/shared/components/errors/Error404";
import Root from "./Shell";

View File

@ -4,9 +4,10 @@ import loadable from "@loadable/component";
import PrivateRoute from "@docspace/common/components/PrivateRoute";
import PublicRoute from "@docspace/common/components/PublicRoute";
import ErrorBoundary from "@docspace/common/components/ErrorBoundary";
import Error404 from "@docspace/shared/components/errors/Error404";
import ErrorBoundary from "../components/ErrorBoundaryWrapper";
import Error404 from "SRC_DIR/pages/Errors/404";
import FilesView from "SRC_DIR/pages/Home/View/Files";
import AccountsView from "SRC_DIR/pages/Home/View/Accounts";
import SettingsView from "SRC_DIR/pages/Home/View/Settings";
@ -25,12 +26,30 @@ const About = loadable(() => import("../pages/About"));
const Wizard = loadable(() => import("../pages/Wizard"));
const PreparationPortal = loadable(() => import("../pages/PreparationPortal"));
const PortalUnavailable = loadable(() => import("../pages/PortalUnavailable"));
const ErrorUnavailable = loadable(() => import("../pages/Errors/Unavailable"));
const ErrorUnavailable = loadable(
() => import("../components/ErrorUnavailableWrapper"),
);
const AccessRestricted = loadable(
() => import("../pages/Errors/AccessRestricted")
() => import("@docspace/shared/components/errors/AccessRestricted"),
);
const Error401 = loadable(() => import("client/Error401"));
const Error401 = loadable(
() => import("@docspace/shared/components/errors/Error401"),
);
const Error403 = loadable(
() => import("@docspace/shared/components/errors/Error403"),
);
const Error520 = loadable(() => import("../components/Error520Wrapper"));
const ErrorAccessRestricted = loadable(
() => import("@docspace/shared/components/errors/AccessRestricted"),
);
const ErrorOffline = loadable(
() => import("@docspace/shared/components/errors/ErrorOffline"),
);
const ClientRoutes = [
{
@ -362,7 +381,7 @@ const ClientRoutes = [
),
},
{
path: "/error401",
path: "/error/401",
element: (
<PrivateRoute>
<ErrorBoundary>
@ -371,6 +390,46 @@ const ClientRoutes = [
</PrivateRoute>
),
},
{
path: "/error/403",
element: (
<PrivateRoute>
<ErrorBoundary>
<Error403 />
</ErrorBoundary>
</PrivateRoute>
),
},
{
path: "/error/520",
element: (
<PrivateRoute>
<ErrorBoundary>
<Error520 />
</ErrorBoundary>
</PrivateRoute>
),
},
{
path: "/error/access/restricted",
element: (
<PrivateRoute>
<ErrorBoundary>
<ErrorAccessRestricted />
</ErrorBoundary>
</PrivateRoute>
),
},
{
path: "/error/offline",
element: (
<PrivateRoute>
<ErrorBoundary>
<ErrorOffline />
</ErrorBoundary>
</PrivateRoute>
),
},
];
export default ClientRoutes;

View File

@ -2,9 +2,9 @@ import React from "react";
import loadable from "@loadable/component";
import ConfirmRoute from "../helpers/confirmRoute";
import ErrorBoundary from "@docspace/common/components/ErrorBoundary";
import ErrorBoundary from "../components/ErrorBoundaryWrapper";
import Error404 from "SRC_DIR/pages/Errors/404";
import Error404 from "@docspace/shared/components/errors/Error404";
import { AuthenticatedAction } from "../helpers/enums";
const Confirm = loadable(() => import("../pages/Confirm"));

View File

@ -3,135 +3,157 @@ import { Navigate } from "react-router-dom";
import loadable from "@loadable/component";
import PrivateRoute from "@docspace/common/components/PrivateRoute";
import ErrorBoundary from "@docspace/common/components/ErrorBoundary";
import ErrorBoundary from "../components/ErrorBoundaryWrapper";
import Error404 from "SRC_DIR/pages/Errors/404";
import Error404 from "@docspace/shared/components/errors/Error404";
import { generalRoutes } from "./general";
const PortalSettings = loadable(() => import("../pages/PortalSettings"));
const CustomizationSettings = loadable(() =>
import("../pages/PortalSettings/categories/common/index.js")
const CustomizationSettings = loadable(
() => import("../pages/PortalSettings/categories/common/index.js")
);
const LanguageAndTimeZoneSettings = loadable(() =>
import(
"../pages/PortalSettings/categories/common/Customization/language-and-time-zone"
)
const LanguageAndTimeZoneSettings = loadable(
() =>
import(
"../pages/PortalSettings/categories/common/Customization/language-and-time-zone"
)
);
const WelcomePageSettings = loadable(() =>
import(
"../pages/PortalSettings/categories/common/Customization/welcome-page-settings"
)
const WelcomePageSettings = loadable(
() =>
import(
"../pages/PortalSettings/categories/common/Customization/welcome-page-settings"
)
);
const DNSSettings = loadable(() =>
import("../pages/PortalSettings/categories/common/Customization/dns-settings")
const DNSSettings = loadable(
() =>
import(
"../pages/PortalSettings/categories/common/Customization/dns-settings"
)
);
const PortalRenaming = loadable(() =>
import(
"../pages/PortalSettings/categories/common/Customization/portal-renaming"
)
const PortalRenaming = loadable(
() =>
import(
"../pages/PortalSettings/categories/common/Customization/portal-renaming"
)
);
const WhiteLabel = loadable(() =>
import("../pages/PortalSettings/categories/common/Branding/whitelabel")
const WhiteLabel = loadable(
() => import("../pages/PortalSettings/categories/common/Branding/whitelabel")
);
const CompanyInfoSettings = loadable(() =>
import(
"../pages/PortalSettings/categories/common/Branding/companyInfoSettings"
)
const CompanyInfoSettings = loadable(
() =>
import(
"../pages/PortalSettings/categories/common/Branding/companyInfoSettings"
)
);
const AdditionalResources = loadable(() =>
import(
"../pages/PortalSettings/categories/common/Branding/additionalResources"
)
const AdditionalResources = loadable(
() =>
import(
"../pages/PortalSettings/categories/common/Branding/additionalResources"
)
);
const SecuritySettings = loadable(() =>
import("../pages/PortalSettings/categories/security/index.js")
const SecuritySettings = loadable(
() => import("../pages/PortalSettings/categories/security/index.js")
);
const TfaPage = loadable(() =>
import("../pages/PortalSettings/categories/security/access-portal/tfa")
const TfaPage = loadable(
() => import("../pages/PortalSettings/categories/security/access-portal/tfa")
);
const PasswordStrengthPage = loadable(() =>
import(
"../pages/PortalSettings/categories/security/access-portal/passwordStrength"
)
const PasswordStrengthPage = loadable(
() =>
import(
"../pages/PortalSettings/categories/security/access-portal/passwordStrength"
)
);
const TrustedMailPage = loadable(() =>
import(
"../pages/PortalSettings/categories/security/access-portal/trustedMail"
)
const TrustedMailPage = loadable(
() =>
import(
"../pages/PortalSettings/categories/security/access-portal/trustedMail"
)
);
const IpSecurityPage = loadable(() =>
import("../pages/PortalSettings/categories/security/access-portal/ipSecurity")
const IpSecurityPage = loadable(
() =>
import(
"../pages/PortalSettings/categories/security/access-portal/ipSecurity"
)
);
const BruteForceProtectionPage = loadable(() =>
import(
"../pages/PortalSettings/categories/security/access-portal/bruteForceProtection"
)
const BruteForceProtectionPage = loadable(
() =>
import(
"../pages/PortalSettings/categories/security/access-portal/bruteForceProtection"
)
);
const AdminMessagePage = loadable(() =>
import(
"../pages/PortalSettings/categories/security/access-portal/adminMessage"
)
const AdminMessagePage = loadable(
() =>
import(
"../pages/PortalSettings/categories/security/access-portal/adminMessage"
)
);
const SessionLifetimePage = loadable(() =>
import(
"../pages/PortalSettings/categories/security/access-portal/sessionLifetime"
)
const SessionLifetimePage = loadable(
() =>
import(
"../pages/PortalSettings/categories/security/access-portal/sessionLifetime"
)
);
const Integration = loadable(() =>
import("../pages/PortalSettings/categories/integration")
const Integration = loadable(
() => import("../pages/PortalSettings/categories/integration")
);
const Payments = loadable(() =>
import("../pages/PortalSettings/categories/payments")
const Payments = loadable(
() => import("../pages/PortalSettings/categories/payments")
);
const ThirdParty = loadable(() =>
import(
"../pages/PortalSettings/categories/integration/ThirdPartyServicesSettings"
)
const ThirdParty = loadable(
() =>
import(
"../pages/PortalSettings/categories/integration/ThirdPartyServicesSettings"
)
);
const DocumentService = loadable(() =>
import("../pages/PortalSettings/categories/integration/DocumentService")
const DocumentService = loadable(
() => import("../pages/PortalSettings/categories/integration/DocumentService")
);
const SingleSignOn = loadable(() =>
import("../pages/PortalSettings/categories/integration/SingleSignOn")
const SingleSignOn = loadable(
() => import("../pages/PortalSettings/categories/integration/SingleSignOn")
);
const SPSettings = loadable(() =>
import(
"../pages/PortalSettings/categories/integration/SingleSignOn/SPSettings"
)
const SPSettings = loadable(
() =>
import(
"../pages/PortalSettings/categories/integration/SingleSignOn/SPSettings"
)
);
const SPMetadata = loadable(() =>
import(
"../pages/PortalSettings/categories/integration/SingleSignOn/ProviderMetadata"
)
const SPMetadata = loadable(
() =>
import(
"../pages/PortalSettings/categories/integration/SingleSignOn/ProviderMetadata"
)
);
const DeveloperTools = loadable(() =>
import("../pages/PortalSettings/categories/developer-tools/index.js")
const DeveloperTools = loadable(
() => import("../pages/PortalSettings/categories/developer-tools/index.js")
);
const WebhookHistory = loadable(() =>
import(
"../pages/PortalSettings/categories/developer-tools/Webhooks/WebhookHistory"
)
const WebhookHistory = loadable(
() =>
import(
"../pages/PortalSettings/categories/developer-tools/Webhooks/WebhookHistory"
)
);
const WebhookDetails = loadable(() =>
import(
"../pages/PortalSettings/categories/developer-tools/Webhooks/WebhookEventDetails"
)
const WebhookDetails = loadable(
() =>
import(
"../pages/PortalSettings/categories/developer-tools/Webhooks/WebhookEventDetails"
)
);
const Backup = loadable(() =>
import("../pages/PortalSettings/categories/data-management/index")
const Backup = loadable(
() => import("../pages/PortalSettings/categories/data-management/index")
);
const DeleteDataPage = loadable(() =>
import("../pages/PortalSettings/categories/delete-data")
const DeleteDataPage = loadable(
() => import("../pages/PortalSettings/categories/delete-data")
);
const RestoreBackup = loadable(() =>
import(
"../pages/PortalSettings/categories/data-management/backup/restore-backup/index"
)
const RestoreBackup = loadable(
() =>
import(
"../pages/PortalSettings/categories/data-management/backup/restore-backup/index"
)
);
const Bonus = loadable(() => import("../pages/Bonus"));

View File

@ -292,10 +292,6 @@ module.exports = (env, argv) => {
exposes: {
"./shell": "./src/Shell",
"./store": "./src/store",
"./Error404": "./src/pages/Errors/404/",
"./Error401": "./src/pages/Errors/401",
"./Error403": "./src/pages/Errors/403",
"./Error520": "./src/pages/Errors/520",
"./Layout": "./src/components/Layout",
"./Layout/context": "./src/components/Layout/context.js",
"./Main": "./src/components/Main",

View File

@ -1,38 +0,0 @@
import React from "react";
import PropTypes from "prop-types";
import Error520 from "client/Error520";
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { error: null };
}
// eslint-disable-next-line no-unused-vars
static getDerivedStateFromError(error) {
// Update state so the next render will show the fallback UI.
return { error: error ?? "Unhandled exception" };
}
componentDidCatch(error, errorInfo) {
// You can also log the error to an error reporting service
console.error(error, errorInfo);
this.props.onError && this.props.onError();
}
render() {
if (this.state.error) {
// You can render any custom fallback UI
return <Error520 errorLog={this.state.error} />;
}
return this.props.children;
}
}
ErrorBoundary.propTypes = {
children: PropTypes.any,
onError: PropTypes.func,
};
export default ErrorBoundary;

View File

@ -1 +0,0 @@
export default from "./ErrorBoundary";

View File

@ -1,21 +0,0 @@
import React from "react";
import { storiesOf } from "@storybook/react";
import withReadme from "storybook-readme/with-readme";
import Readme from "./README.md";
import { withKnobs, text } from "@storybook/addon-knobs/react";
import ErrorContainer from ".";
storiesOf("Components| ErrorContainer", module)
.addDecorator(withKnobs)
.addDecorator(withReadme(Readme))
.add("base", () => (
<ErrorContainer
headerText={text("headerText", "Error 404. Page not found")}
bodyText={text(
"bodyText",
"This page was removed, renamed or doesnt exist anymore."
)}
buttonText={text("buttonText", "Return to homepage")}
onClickButton={() => console.log("click")}
/>
));

View File

@ -1,44 +0,0 @@
import React from "react";
import { mount } from "enzyme";
import ErrorContainer from ".";
describe("<ErrorContainer />", () => {
it("renders without error", () => {
const wrapper = mount(<ErrorContainer />);
expect(wrapper).toExist();
});
it("renders with props", () => {
const wrapper = mount(
<ErrorContainer
headerText="Some error has happened"
bodyText="Try again later"
buttonText="Go back"
/>
);
expect(wrapper).toExist();
expect(wrapper.prop("headerText")).toEqual("Some error has happened");
expect(wrapper.prop("bodyText")).toEqual("Try again later");
expect(wrapper.prop("buttonText")).toEqual("Go back");
});
it("accepts id", () => {
const wrapper = mount(<ErrorContainer id="testId" />);
expect(wrapper.prop("id")).toEqual("testId");
});
it("accepts className", () => {
const wrapper = mount(<ErrorContainer className="test" />);
expect(wrapper.prop("className")).toEqual("test");
});
it("accepts style", () => {
const wrapper = mount(<ErrorContainer style={{ color: "red" }} />);
expect(wrapper.getDOMNode().style).toHaveProperty("color", "red");
});
});

View File

@ -1 +0,0 @@
export default from "./ErrorContainer";

View File

@ -1,34 +0,0 @@
import React from "react";
import PropTypes from "prop-types";
import StyledHeading from "./StyledHeadline";
import { classNames } from "@docspace/shared/utils";
const Headline = ({ type, className, ...props }) => {
//console.log("Headline render");
return (
<StyledHeading
headlineType={type}
className={classNames("headline-heading", className)}
{...props}
/>
);
};
Headline.propTypes = {
level: PropTypes.oneOf([1, 2, 3, 4, 5, 6]),
children: PropTypes.any,
color: PropTypes.string,
title: PropTypes.string,
truncate: PropTypes.bool,
isInline: PropTypes.bool,
type: PropTypes.oneOf(["content", "header", "menu"]),
};
Headline.defaultProps = {
title: null,
truncate: false,
isInline: false,
level: 1,
};
export default Headline;

View File

@ -1,37 +0,0 @@
import React from "react";
import { storiesOf } from "@storybook/react";
import {
text,
boolean,
withKnobs,
color,
select,
} from "@storybook/addon-knobs/react";
import Heading from ".";
import Section from "../../../.storybook/decorators/section";
import withReadme from "storybook-readme/with-readme";
import Readme from "./README.md";
const type = ["content", "header", "menu"];
const levels = [1, 2, 3, 4, 5, 6];
storiesOf("Components|Heading", module)
.addDecorator(withKnobs)
.addDecorator(withReadme(Readme))
.add("base", () => (
<Section>
<div style={{ width: "100%" }}>
<Heading
type={select("type", type, "content")}
color={color("color", "#333333")}
level={select("level", levels, 1)}
title={text("title", "")}
truncate={boolean("truncate", false)}
isInline={boolean("isInline", false)}
>
{text("Text", "Sample text Heading")}
</Heading>
</div>
</Section>
));

View File

@ -1,15 +0,0 @@
import React from "react";
import { mount } from "enzyme";
import Headline from ".";
describe("<Headline />", () => {
it("renders without error", () => {
const wrapper = mount(
<Headline level={1} title="Some title">
Some text
</Headline>
);
expect(wrapper).toExist();
});
});

View File

@ -1 +0,0 @@
export default from "./Headline";

View File

@ -2,7 +2,7 @@
import React from "react";
import { Navigate, useLocation } from "react-router-dom";
import { inject, observer } from "mobx-react";
import Error403 from "client/Error403";
import Error403 from "@docspace/shared/components/errors/Error403";
import AppLoader from "../AppLoader";
@ -195,7 +195,7 @@ const PrivateRoute = ({ children, ...rest }) => {
// }
if (isPortalRenameUrl && !enablePortalRename) {
return <Navigate replace to={"/error404"} />;
return <Navigate replace to={"/error/404"} />;
}
if (
@ -208,10 +208,10 @@ const PrivateRoute = ({ children, ...rest }) => {
}
if (restricted) {
return <Navigate replace to={"/error401"} />;
return <Navigate replace to={"/error/401"} />;
}
return <Navigate replace to={"/error404"} />;
return <Navigate replace to={"/error/404"} />;
};
const component = renderComponent();

View File

@ -1,11 +1,8 @@
export { default as PrivateRoute } from "./PrivateRoute";
export { default as PublicRoute } from "./PublicRoute";
export { default as ExternalRedirect } from "./ExternalRedirect";
export { default as Headline } from "./Headline";
export { default as AdvancedSelector } from "./AdvancedSelector";
export { default as Section } from "./Section";
export { default as ErrorContainer } from "./ErrorContainer";
export { default as ErrorBoundary } from "./ErrorBoundary";
export { default as FilterInput } from "./FilterInput";
export { default as Loaders } from "./Loaders";
export { default as SystemThemeDetector } from "./SystemThemeDetector";

View File

@ -31,7 +31,7 @@ import {
import { getEditorTheme } from "@docspace/shared/utils";
import { toastr } from "@docspace/shared/components/toast";
import { DocumentEditor } from "@onlyoffice/document-editor-react";
import ErrorContainer from "@docspace/common/components/ErrorContainer";
import ErrorContainer from "@docspace/shared/components/error-container/ErrorContainer";
import DeepLink from "./DeepLink";
import { getDeepLink } from "../helpers/deepLinkHelper";

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