Merge branch 'feature/update-langs_2.6.1' of https://github.com/ONLYOFFICE/DocSpace-client into feature/update-langs_2.6.1
This commit is contained in:
commit
b1cef0a131
@ -67771,6 +67771,138 @@
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
<concept_node>
|
||||
<name>FeedLocationSectionLabel</name>
|
||||
<description/>
|
||||
<comment/>
|
||||
<default_text/>
|
||||
<translations>
|
||||
<translation>
|
||||
<language>ar-SA</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>az-Latn-AZ</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>bg-BG</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>cs-CZ</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>de-DE</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>el-GR</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>es-ES</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fi-FI</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>hy-AM</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>it-IT</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>ja-JP</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>ko-KR</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>lo-LA</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>lv-LV</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>nl-NL</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>pl-PL</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>pt-BR</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>pt-PT</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>ro-RO</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>ru-RU</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>si-SI</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>sk-SK</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>sl-SI</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>sr-Cyrl-RS</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>sr-Latn-RS</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>tr-TR</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>uk-UA</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>vi-VN</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>zh-CN</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
<concept_node>
|
||||
<name>FileConverted</name>
|
||||
<description/>
|
||||
@ -122626,138 +122758,6 @@
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
<concept_node>
|
||||
<name>LogoutAllActiveConnections</name>
|
||||
<description/>
|
||||
<comment/>
|
||||
<default_text/>
|
||||
<translations>
|
||||
<translation>
|
||||
<language>ar-SA</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>az-Latn-AZ</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>bg-BG</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>cs-CZ</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>de-DE</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>el-GR</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>es-ES</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fi-FI</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-FR</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>hy-AM</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>it-IT</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>ja-JP</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>ko-KR</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>lo-LA</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>lv-LV</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>nl-NL</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>pl-PL</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>pt-BR</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>pt-PT</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>ro-RO</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>ru-RU</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>si-SI</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>sk-SK</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>sl-SI</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>sr-Cyrl-RS</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>sr-Latn-RS</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>tr-TR</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>uk-UA</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>vi-VN</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>zh-CN</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
<concept_node>
|
||||
<name>LogoutAllActiveSessionsDescription</name>
|
||||
<description/>
|
||||
|
@ -15,7 +15,6 @@
|
||||
"InterfaceTheme": "واجهة المستخدم",
|
||||
"LightTheme": "الوضع النهاري",
|
||||
"LogoutActiveConnection": "تسجيل الخروج من الاتصال النشط",
|
||||
"LogoutAllActiveConnections": "تسجيل الخروج من جميع الاتصالات النشطة",
|
||||
"LogoutAllActiveSessionsDescription": "سيتم تسجيل الخروج من جميع الاتصالات النشطة باستثناء هذا الاتصال، حيث أنه قيد الاستخدام حاليًا.",
|
||||
"LogoutBtn": "تسجيل الخروج",
|
||||
"LogoutDescription": "ملحوظة. سيتم تسجيل خروج جميع الاتصالات النشطة باستثناء هذا الاتصال ، حيث إنه قيد الاستخدام حاليًا.",
|
||||
|
@ -15,7 +15,6 @@
|
||||
"InterfaceTheme": "İnterfeys mövzusu",
|
||||
"LightTheme": "İşıqlı tema",
|
||||
"LogoutActiveConnection": "Aktiv bağlantıdan çıxın",
|
||||
"LogoutAllActiveConnections": "Bütün aktiv bağlantılardan çıxın",
|
||||
"LogoutAllActiveSessionsDescription": "Bundan başqa bütün aktiv bağlantılar hazırda istifadə edildiyi üçün sistemdən çıxacaq.",
|
||||
"LogoutBtn": "Çıxış",
|
||||
"LogoutDescription": "Qeyd. Bundan başqa bütün aktiv bağlantılar hazırda istifadə edildiyi üçün sistemdən çıxacaq.",
|
||||
|
@ -15,7 +15,6 @@
|
||||
"InterfaceTheme": "Тема на интерфейса",
|
||||
"LightTheme": "Светла тема",
|
||||
"LogoutActiveConnection": "Изход от активната връзка",
|
||||
"LogoutAllActiveConnections": "Изход от всички активни сесии",
|
||||
"LogoutAllActiveSessionsDescription": "Всички активни връзки с изключение на тази ще бъдат отписани, тъй като тази връзка се използва в момента.",
|
||||
"LogoutBtn": "Изход",
|
||||
"LogoutDescription": "Забележка. Всички активни връзки с изключение на тази ще бъдат отписани, тъй като тази връзка се използва в момента.",
|
||||
|
@ -15,7 +15,6 @@
|
||||
"InterfaceTheme": "Vzhled prostředí",
|
||||
"LightTheme": "Světlý motiv",
|
||||
"LogoutActiveConnection": "Odhlášení z aktivního připojení",
|
||||
"LogoutAllActiveConnections": "Odhlášení ze všech aktivních připojení",
|
||||
"LogoutAllActiveSessionsDescription": "Všechna aktivní připojení kromě tohoto připojení budou odhlášena, protože jsou právě používána.",
|
||||
"LogoutBtn": "Odhlášení",
|
||||
"LogoutDescription": "Poznámka. Všechna aktivní připojení kromě tohoto připojení budou odhlášena, protože jsou právě používána.",
|
||||
|
@ -15,7 +15,6 @@
|
||||
"InterfaceTheme": "Thema der Benutzeroberfläche",
|
||||
"LightTheme": "Heller Modus",
|
||||
"LogoutActiveConnection": "Abmelden von der aktiven Verbindung",
|
||||
"LogoutAllActiveConnections": "Abmelden von allen aktiven Verbindungen",
|
||||
"LogoutAllActiveSessionsDescription": "Alle aktiven Verbindungen mit Ausnahme dieser Verbindung werden abgemeldet, da sie gerade in Gebrauch ist.",
|
||||
"LogoutBtn": "Abmelden",
|
||||
"LogoutDescription": "Hinweis. Alle aktiven Verbindungen mit Ausnahme dieser Verbindung werden abgemeldet, da sie gerade in Gebrauch ist.",
|
||||
|
@ -15,7 +15,6 @@
|
||||
"InterfaceTheme": "Θέμα διεπαφής",
|
||||
"LightTheme": "Ανοιχτό θέμα",
|
||||
"LogoutActiveConnection": "Αποσύνδεση από ενεργή σύνδεση",
|
||||
"LogoutAllActiveConnections": "Αποσύνδεση από όλες τις ενεργές συνδέσεις",
|
||||
"LogoutAllActiveSessionsDescription": "Όλες οι ενεργές συνδέσεις θα τερματιστούν, εκτός από αυτήν τη σύνδεση, καθώς χρησιμοποιείται αυτήν τη στιγμή.",
|
||||
"LogoutBtn": "Αποσύνδεση",
|
||||
"LogoutDescription": "Σημείωση. Όλες οι ενεργές συνδέσεις θα τερματιστούν, εκτός από αυτήν τη σύνδεση, καθώς χρησιμοποιείται αυτήν τη στιγμή.",
|
||||
|
@ -12,6 +12,7 @@
|
||||
"FeedLocationLabel": "Folder «{{folderTitle}}»",
|
||||
"FeedLocationLabelFrom": "from «{{folderTitle}}»",
|
||||
"FeedLocationRoomLabel": "Room «{{folderTitle}}»",
|
||||
"FeedLocationSectionLabel": "Section «{{folderTitle}}»",
|
||||
"FileConverted": "File converted.",
|
||||
"FileCopied": "Files copied.",
|
||||
"FileCopiedTo": "Files copied to «{{folderTitle}}»",
|
||||
|
@ -15,7 +15,6 @@
|
||||
"InterfaceTheme": "Interface theme",
|
||||
"LightTheme": "Light theme",
|
||||
"LogoutActiveConnection": "Log out from active connection",
|
||||
"LogoutAllActiveConnections": "Log out from all active connections",
|
||||
"LogoutAllActiveSessionsDescription": "All active connections except this connection will be logged out, as it is currently in use.",
|
||||
"LogoutBtn": "Log out",
|
||||
"LogoutDescription": "Note. All active connections except this connection will be logged out, as it is currently in use.",
|
||||
|
@ -15,7 +15,6 @@
|
||||
"InterfaceTheme": "Tema de interfaz",
|
||||
"LightTheme": "Tema claro",
|
||||
"LogoutActiveConnection": "Salir de la conexión activa",
|
||||
"LogoutAllActiveConnections": "Salir de todas las conexiones activas",
|
||||
"LogoutAllActiveSessionsDescription": "Todas las conexiones activas excepto esta conexión se desconectarán, ya que está actualmente en uso.",
|
||||
"LogoutBtn": "Cerrar sesión",
|
||||
"LogoutDescription": "Aviso. Todas las conexiones activas excepto esta conexión se desconectarán, ya que está actualmente en uso.",
|
||||
|
@ -15,7 +15,6 @@
|
||||
"InterfaceTheme": "Käyttöliittymän teema",
|
||||
"LightTheme": "Kevyt teema",
|
||||
"LogoutActiveConnection": "Kirjaudu ulos aktiivisesta yhteydestä",
|
||||
"LogoutAllActiveConnections": "Kirjaudu ulos aktiivisista yhteyksistä",
|
||||
"LogoutAllActiveSessionsDescription": "Kaikki aktiiviset yhteydet paitsi tämä yhteys kirjataan ulos, koska se on tällä hetkellä käytössä oleva.",
|
||||
"LogoutBtn": "Kirjaudu ulos",
|
||||
"LogoutDescription": "Huom. Kaikki aktiiviset yhteydet paitsi tämä yhteys kirjataan ulos, koska se on tällä hetkellä käytössä oleva.",
|
||||
|
@ -15,7 +15,6 @@
|
||||
"InterfaceTheme": "Thème d'interface",
|
||||
"LightTheme": "Thème clair",
|
||||
"LogoutActiveConnection": "Déconnexion de la connexion active",
|
||||
"LogoutAllActiveConnections": "Déconnexion de toutes les connexions actives",
|
||||
"LogoutAllActiveSessionsDescription": "Toutes les connexions actives seront désactivées, à l’exception de cette connexion, car elle est en cours d’utilisation.",
|
||||
"LogoutBtn": "Se déconnecter",
|
||||
"LogoutDescription": "Remarque : toutes les connexions actives seront désactivées, à l’exception de cette connexion, car elle est en cours d’utilisation.",
|
||||
|
@ -15,7 +15,6 @@
|
||||
"InterfaceTheme": "Միջերեսի ոճ",
|
||||
"LightTheme": "Բաց ոճ",
|
||||
"LogoutActiveConnection": "Դուրս եկեք ակտիվ կապից",
|
||||
"LogoutAllActiveConnections": "Դուրս եկեք բոլոր ակտիվ կապերից",
|
||||
"LogoutAllActiveSessionsDescription": "Բոլոր ակտիվ կապերը, բացի այս կապից, դուրս կգրվեն, քանի որ այն ներկայումս օգտագործվում է:",
|
||||
"LogoutBtn": "Դուրս գալ",
|
||||
"LogoutDescription": "Նշում. Բոլոր ակտիվ կապերը, բացի այս կապից, դուրս կգրվեն, քանի որ այն ներկայումս օգտագործվում է:",
|
||||
|
@ -15,7 +15,6 @@
|
||||
"InterfaceTheme": "Tema dell'interfaccia",
|
||||
"LightTheme": "Tema chiaro",
|
||||
"LogoutActiveConnection": "Esci dalla connessione attiva",
|
||||
"LogoutAllActiveConnections": "Esci da tutte le connessioni attive",
|
||||
"LogoutAllActiveSessionsDescription": "Tutte le connessioni attive tranne questa che è attualmente in uso, verranno disconnesse.",
|
||||
"LogoutBtn": "Esci",
|
||||
"LogoutDescription": "Ti preghiamo di notare. Tutte le connessioni attive tranne questa connessione verranno disconnesse, poiché è attualmente in uso.",
|
||||
|
@ -15,7 +15,6 @@
|
||||
"InterfaceTheme": "インターフェイスのテーマ",
|
||||
"LightTheme": "ライトのテーマ",
|
||||
"LogoutActiveConnection": "アクティブな接続からログアウトする",
|
||||
"LogoutAllActiveConnections": "すべてのアクティブな接続からログアウトする",
|
||||
"LogoutAllActiveSessionsDescription": "この接続以外の接続は、現在使用中のため、ログアウトされます。",
|
||||
"LogoutBtn": "ログアウト",
|
||||
"LogoutDescription": "ご注意:この接続以外の接続は、現在使用中のため、ログアウトされます。",
|
||||
|
@ -15,7 +15,6 @@
|
||||
"InterfaceTheme": "인터페이스 테마",
|
||||
"LightTheme": "라이트 테마",
|
||||
"LogoutActiveConnection": "활성 연결에서 로그아웃",
|
||||
"LogoutAllActiveConnections": "모든 활성 연결에서 로그아웃",
|
||||
"LogoutAllActiveSessionsDescription": "현재 사용 중이므로 이 연결을 제외한 모든 활성 연결이 로그아웃됩니다.",
|
||||
"LogoutBtn": "로그아웃",
|
||||
"LogoutDescription": "참고. 현재 사용 중이므로 이 연결을 제외한 모든 활성 연결이 로그아웃됩니다.",
|
||||
|
@ -14,7 +14,6 @@
|
||||
"InterfaceTheme": "ການໂຕ້ຕອບ ຫົວຂໍ້",
|
||||
"LightTheme": "ແສງສະຫວ່າງ ຫົວຂໍ້",
|
||||
"LogoutActiveConnection": "ອອກຈາກລະບົບການເຊື່ອມຕໍ່ທີ່ໃຊ້ງານ",
|
||||
"LogoutAllActiveConnections": "ອອກຈາກລະບົບການເຊື່ອມຕໍ່ທັງໝົດ",
|
||||
"LogoutAllActiveSessionsDescription": "ການເຊື່ອມຕໍ່ທີ່ໃຊ້ງານທັງຫມົດຍົກເວັ້ນການເຊື່ອມຕໍ່ນີ້ຈະຖືກອອກຈາກລະບົບ, ເນື່ອງຈາກວ່າມັນກໍາລັງໃຊ້ໃນປັດຈຸບັນ",
|
||||
"LogoutBtn": "ອອກຈາກລະບົບ",
|
||||
"LogoutDescription": "ຫມາຍເຫດ. ການເຊື່ອມຕໍ່ທີ່ໃຊ້ງານທັງຫມົດຍົກເວັ້ນການເຊື່ອມຕໍ່ນີ້ຈະຖືກອອກຈາກລະບົບ, ເນື່ອງຈາກວ່າມັນກໍາລັງໃຊ້ໃນປັດຈຸບັນ.",
|
||||
|
@ -15,7 +15,6 @@
|
||||
"InterfaceTheme": "Interfeisa dizains",
|
||||
"LightTheme": "Gaišs dizains",
|
||||
"LogoutActiveConnection": "Izrakstīties no aktīvā savienojuma",
|
||||
"LogoutAllActiveConnections": "Izrakstīties no visiem aktīvajiem savienojumiem",
|
||||
"LogoutAllActiveSessionsDescription": "Visi aktīvie savienojumi, izņemot šo savienojumu, tiks izrakstīti, jo tas pašlaik tiek lietots.",
|
||||
"LogoutBtn": "Izrakstīties",
|
||||
"LogoutDescription": "Piezīme. Visi aktīvie savienojumi, izņemot šo savienojumu, tiks izrakstīti, jo tas pašlaik tiek lietots.",
|
||||
|
@ -15,7 +15,6 @@
|
||||
"InterfaceTheme": "Interface thema",
|
||||
"LightTheme": "Licht thema",
|
||||
"LogoutActiveConnection": "Uitloggen van actieve verbinding",
|
||||
"LogoutAllActiveConnections": "Uitloggen bij alle actieve verbindingen",
|
||||
"LogoutAllActiveSessionsDescription": "Alle actieve verbindingen behalve deze verbinding worden uitgelogd, omdat deze momenteel in gebruik is.",
|
||||
"LogoutBtn": "Uitloggen",
|
||||
"LogoutDescription": "Opmerking. Alle actieve verbindingen behalve deze verbinding worden uitgelogd, omdat deze momenteel in gebruik is.",
|
||||
|
@ -15,7 +15,6 @@
|
||||
"InterfaceTheme": "Motyw interfejsu",
|
||||
"LightTheme": "Motyw jasny",
|
||||
"LogoutActiveConnection": "Wyloguj z aktywnego połączenia",
|
||||
"LogoutAllActiveConnections": "Wyloguj ze wszystkich aktywnych połączeń",
|
||||
"LogoutAllActiveSessionsDescription": "Wszystkie aktywne połączenia, oprócz niniejszego zostaną wylogowane, ponieważ jest ono obecnie w użyciu.",
|
||||
"LogoutBtn": "Wyloguj",
|
||||
"LogoutDescription": "Uwaga. Wszystkie aktywne połączenia, oprócz niniejszego zostaną wylogowane, ponieważ jest ono obecnie w użyciu.",
|
||||
|
@ -15,7 +15,6 @@
|
||||
"InterfaceTheme": "Tema de interface",
|
||||
"LightTheme": "Tema claro",
|
||||
"LogoutActiveConnection": "Sair da conexão ativa",
|
||||
"LogoutAllActiveConnections": "Sair de todas as conexões ativas",
|
||||
"LogoutAllActiveSessionsDescription": "Todas as conexões ativas, exceto esta conexão, serão desconectadas, pois estão em uso no momento.",
|
||||
"LogoutBtn": "Sair",
|
||||
"LogoutDescription": "Observação. Todas as conexões ativas, exceto esta conexão, serão desconectadas, pois estão em uso no momento.",
|
||||
|
@ -15,7 +15,6 @@
|
||||
"InterfaceTheme": "Tema da interface",
|
||||
"LightTheme": "Tema claro",
|
||||
"LogoutActiveConnection": "Terminar a sessão na conexão ativa",
|
||||
"LogoutAllActiveConnections": "Terminar a sessão em todas as conexões ativas",
|
||||
"LogoutAllActiveSessionsDescription": "Todas as ligações ativas exceto esta ligação terão a sua sessão terminada, tal como está configurado atualmente.",
|
||||
"LogoutBtn": "Terminar sessão",
|
||||
"LogoutDescription": "Nota. Todas as ligações ativas exceto esta ligação terão a sua sessão terminada, tal como está configurado atualmente.",
|
||||
|
@ -15,7 +15,6 @@
|
||||
"InterfaceTheme": "Tema interfeței",
|
||||
"LightTheme": "Tema luminoasă",
|
||||
"LogoutActiveConnection": "Deconectează conexiunea activă",
|
||||
"LogoutAllActiveConnections": "Deconectează toate conexiuni active",
|
||||
"LogoutAllActiveSessionsDescription": "Toate conexiunile active vor fi deconectate, cu excepţia acestei conexiuni, deoarece ea este în curs de utilizare.",
|
||||
"LogoutBtn": "Deconectare",
|
||||
"LogoutDescription": "Menţiune. Toate conexiunile active vor fi deconectate, cu excepţia acestei conexiuni, deoarece ea este în curs de utilizare.",
|
||||
|
@ -15,7 +15,6 @@
|
||||
"InterfaceTheme": "Тема интерфейса",
|
||||
"LightTheme": "Светлая тема",
|
||||
"LogoutActiveConnection": "Выйти из активного подключения",
|
||||
"LogoutAllActiveConnections": "Выйти из всех активных подключений",
|
||||
"LogoutAllActiveSessionsDescription": "Все активные подключения, кроме этого подключения, будут отключены, так как оно используется в данный момент.",
|
||||
"LogoutBtn": "Выйти",
|
||||
"LogoutDescription": "Внимание. Все активные подключения, кроме этого, будут отключены, так как оно используется в данный момент.",
|
||||
|
@ -14,7 +14,6 @@
|
||||
"InterfaceTheme": "අතුරු මුහුණතේ තේමාව",
|
||||
"LightTheme": "දීප්ත තේමාව",
|
||||
"LogoutActiveConnection": "සක්රිය සම්බන්ධතාවයෙන් නික්මෙන්න",
|
||||
"LogoutAllActiveConnections": "සියළුම සක්රිය සම්බන්ධතා වලින් නික්මෙන්න",
|
||||
"LogoutAllActiveSessionsDescription": "මෙම සම්බන්ධතාවය හැර අනෙකුත් සියළුම සක්රිය සම්බන්ධතා නික්මවනු ඇත.",
|
||||
"LogoutBtn": "නික්මෙන්න",
|
||||
"LogoutDescription": "සටහන: මෙම සම්බන්ධතාවය හැර අනෙකුත් සියළුම සක්රිය සම්බන්ධතා නික්මවනු ඇත.",
|
||||
|
@ -15,7 +15,6 @@
|
||||
"InterfaceTheme": "Vzhľad prostredia",
|
||||
"LightTheme": "Svetlá téma",
|
||||
"LogoutActiveConnection": "Odhlásiť sa z aktívneho pripojenia",
|
||||
"LogoutAllActiveConnections": "Odhlásiť sa zo všetkých aktívnych pripojení",
|
||||
"LogoutAllActiveSessionsDescription": "Budú odhlásené všetky aktívne pripojenia okrem tohto pripojenia, keďže sa práve používa.",
|
||||
"LogoutBtn": "Odhlásiť sa",
|
||||
"LogoutDescription": "Poznámka. Budú odhlásené všetky aktívne pripojenia okrem tohto pripojenia, keďže sa práve používa.",
|
||||
|
@ -15,7 +15,6 @@
|
||||
"InterfaceTheme": "Tema vmesnika",
|
||||
"LightTheme": "Svetla tema",
|
||||
"LogoutActiveConnection": "Odjava iz aktivne povezave",
|
||||
"LogoutAllActiveConnections": "Odjava iz vseh aktivnih povezav",
|
||||
"LogoutAllActiveSessionsDescription": "Vse aktivne povezave bodo odjavljene, razen te, ki je trenutno v uporabi.",
|
||||
"LogoutBtn": "Odjava",
|
||||
"LogoutDescription": "Opomba. Vse aktivne povezave bodo odjavljene, razen te, ki je trenutno v uporabi.",
|
||||
|
@ -15,7 +15,6 @@
|
||||
"InterfaceTheme": "Тема интерфејса",
|
||||
"LightTheme": "Светла тема",
|
||||
"LogoutActiveConnection": "Одјави се са активних конекција",
|
||||
"LogoutAllActiveConnections": "Одјави се са свих активних конекција",
|
||||
"LogoutAllActiveSessionsDescription": "Све активне конекције осим ове конекције ће бити одјављене, зато што је тренутно у употреби.",
|
||||
"LogoutBtn": "Одјави се",
|
||||
"LogoutDescription": "Обратите пажњу. Све активне конекције осим ове конекције ће бити одјављене, зато што је тренутно у употреби.",
|
||||
|
@ -15,7 +15,6 @@
|
||||
"InterfaceTheme": "Tema interfejsa",
|
||||
"LightTheme": "Svetla tema",
|
||||
"LogoutActiveConnection": "Odjavi se sa aktivnih konekcija",
|
||||
"LogoutAllActiveConnections": "Odjavi se sa svih aktivnih konekcija",
|
||||
"LogoutAllActiveSessionsDescription": "Sve aktivne konekcije osim ove konekcije će biti odjavljene, zato što je trenutno u upotrebi.",
|
||||
"LogoutBtn": "Odjavi se",
|
||||
"LogoutDescription": "Obratite pažnju. Sve aktivne konekcije osim ove konekcije će biti odjavljene, zato što je trenutno u upotrebi.",
|
||||
|
@ -15,7 +15,6 @@
|
||||
"InterfaceTheme": "Arayüz teması",
|
||||
"LightTheme": "Açık tema",
|
||||
"LogoutActiveConnection": "Aktif bağlantıdan çıkış yap",
|
||||
"LogoutAllActiveConnections": "Tüm aktif bağlantılardan çıkış yap",
|
||||
"LogoutAllActiveSessionsDescription": "Şu anda kullanımda olduğundan, bu bağlantı dışındaki tüm aktif bağlantıların oturumu kapatılacaktır.",
|
||||
"LogoutBtn": "Çıkış Yap",
|
||||
"LogoutDescription": "Not. Şu anda kullanımda olduğundan, bu bağlantı dışındaki tüm aktif bağlantıların oturumu kapatılacaktır.",
|
||||
|
@ -15,7 +15,6 @@
|
||||
"InterfaceTheme": "Тема інтерфейсу",
|
||||
"LightTheme": "Світла тема",
|
||||
"LogoutActiveConnection": "Вийти з активного з’єднання",
|
||||
"LogoutAllActiveConnections": "Вийти з усіх активних з’єднань",
|
||||
"LogoutAllActiveSessionsDescription": "Для всіх активних з’єднань, окрім цього, яке зараз використовується, буде здійснено вихід із системи.",
|
||||
"LogoutBtn": "Вийти",
|
||||
"LogoutDescription": "Примітка. Для всіх активних з’єднань, окрім цього, яке зараз використовується, буде здійснено вихід із системи.",
|
||||
|
@ -15,7 +15,6 @@
|
||||
"InterfaceTheme": "Chủ đề giao diện\"",
|
||||
"LightTheme": "Nền sáng",
|
||||
"LogoutActiveConnection": "Đăng xuất khỏi kết nối đang hoạt động",
|
||||
"LogoutAllActiveConnections": "Đăng xuất khỏi tất cả các kết nối đang hoạt động",
|
||||
"LogoutAllActiveSessionsDescription": "Tất cả các kết nối đang hoạt động ngoại trừ kết nối này sẽ được đăng xuất, vì nó hiện đang được sử dụng.",
|
||||
"LogoutBtn": "Đăng xuất",
|
||||
"LogoutDescription": "Lưu ý. Tất cả các kết nối đang hoạt động ngoại trừ kết nối này sẽ được đăng xuất, vì nó hiện đang được sử dụng.",
|
||||
|
@ -1,14 +1,14 @@
|
||||
{
|
||||
"AppointAdmin": "预约管理员",
|
||||
"BackupPortal": " 备份{{productName}}数据",
|
||||
"ChangeInstruction": " 要更改{{productName}}所有者,请在下面选择新所有者的姓名。",
|
||||
"ChangeOwner": " 更改{{productName}}所有者",
|
||||
"ChangeInstruction": " 要更改{{productName}}所有者,请在下面选择新所有者的姓名。",
|
||||
"ChangeOwner": " 更改{{productName}}所有者",
|
||||
"ChangeUser": "变更用户",
|
||||
"DeactivateOrDeletePortal": "停用或删除{{productName}}",
|
||||
"DoTheSame": "与管理员进行相同操作",
|
||||
"ManagePortal": " 管理{{productName}}配置",
|
||||
"ManageUser": "管理用户账户",
|
||||
"NewPortalOwner": " 新{{productName}}所有者",
|
||||
"PortalOwnerCan": " {{productName}}所有者可以:",
|
||||
"NewPortalOwner": " 新{{productName}}所有者",
|
||||
"PortalOwnerCan": " {{productName}}所有者可以:",
|
||||
"SetAccessRights": "设置访问权限"
|
||||
}
|
||||
|
@ -3,6 +3,6 @@
|
||||
"ChangeUserTypeHeader": "变更用户类型",
|
||||
"ChangeUserTypeMessage": "‘{{ firstType }}’类型的用户将被移动至‘{{ secondType }}’类型。",
|
||||
"ChangeUserTypeMessageMulti": "选择的用户将被移动至'{{ secondType }}'类型。",
|
||||
"ChangeUserTypeMessageWarning": " 您无法更改{{productName}}管理员和您自己的类型。",
|
||||
"ChangeUserTypeMessageWarning": " 您无法更改{{productName}}管理员和您自己的类型。",
|
||||
"SuccessChangeUserType": "用户类型已成功变更"
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"AccountWillBeCreated": " 将为 <1>{{email}}</1>创建{{productName}}帐户。请完成您的注册:",
|
||||
"ChangePasswordSuccess": "密码已成功更改",
|
||||
"ConfirmOwnerPortalSuccessMessage": " {{productName}}所有者已成功更改。您将于 10 秒后被重定向。",
|
||||
"ConfirmOwnerPortalSuccessMessage": " {{productName}}所有者已成功更改。您将于 10 秒后被重定向。",
|
||||
"ConfirmOwnerPortalTitle": "请确认您要将{{productName}}所有者更改为{{newOwner}}。",
|
||||
"CurrentNumber": "您目前的手机号码",
|
||||
"DeleteProfileBtn": "删除我的账户",
|
||||
|
@ -15,7 +15,6 @@
|
||||
"InterfaceTheme": "界面主題",
|
||||
"LightTheme": "浅色主题",
|
||||
"LogoutActiveConnection": "从活动连接中注销",
|
||||
"LogoutAllActiveConnections": "从所有活动连接中注销",
|
||||
"LogoutAllActiveSessionsDescription": "由于此连接当前正在使用,故除此之外的所有活动连接都将被注销。",
|
||||
"LogoutBtn": "注销",
|
||||
"LogoutDescription": "注意,由于此连接当前正在使用,故除此之外的所有活动连接都将被注销。",
|
||||
|
@ -43,6 +43,7 @@ import { DeviceType, IndexedDBStores } from "@docspace/shared/enums";
|
||||
import indexedDbHelper from "@docspace/shared/utils/indexedDBHelper";
|
||||
import { useThemeDetector } from "@docspace/shared/hooks/useThemeDetector";
|
||||
import { sendToastReport } from "@docspace/shared/utils/crashReport";
|
||||
import { combineUrl } from "@docspace/shared/utils/combineUrl";
|
||||
|
||||
import config from "PACKAGE_FILE";
|
||||
|
||||
@ -77,6 +78,7 @@ const Shell = ({ items = [], page = "home", ...rest }) => {
|
||||
userTheme,
|
||||
//user,
|
||||
userId,
|
||||
userLoginEventId,
|
||||
currentDeviceType,
|
||||
timezone,
|
||||
showArticleLoader,
|
||||
@ -134,6 +136,7 @@ const Shell = ({ items = [], page = "home", ...rest }) => {
|
||||
command: "subscribe",
|
||||
data: { roomParts: "backup-restore" },
|
||||
});
|
||||
|
||||
socketHelper.on("restore-backup", () => {
|
||||
getRestoreProgress()
|
||||
.then((response) => {
|
||||
@ -159,7 +162,27 @@ const Shell = ({ items = [], page = "home", ...rest }) => {
|
||||
command: "subscribe",
|
||||
data: { roomParts: "QUOTA", individual: true },
|
||||
});
|
||||
}, [socketHelper]);
|
||||
|
||||
socketHelper.emit({
|
||||
command: "subscribe",
|
||||
data: { roomParts: userId },
|
||||
});
|
||||
|
||||
socketHelper.on("s:logout-session", (loginEventId) => {
|
||||
console.log(`[WS] "logout-session"`, loginEventId, userLoginEventId);
|
||||
|
||||
if (userLoginEventId === loginEventId || loginEventId === 0) {
|
||||
window.location.replace(
|
||||
combineUrl(window.ClientConfig?.proxy?.url, "/login"),
|
||||
);
|
||||
}
|
||||
});
|
||||
}, [
|
||||
socketHelper,
|
||||
userLoginEventId,
|
||||
setPreparationPortalDialogVisible,
|
||||
userId,
|
||||
]);
|
||||
|
||||
const { t, ready } = useTranslation(["Common"]); //TODO: if enable banner ["Common", "SmartBanner"]
|
||||
|
||||
@ -533,6 +556,7 @@ const ShellWrapper = inject(
|
||||
setSnackbarExist,
|
||||
userTheme: isFrame ? frameConfig?.theme : userTheme,
|
||||
userId: userStore?.user?.id,
|
||||
userLoginEventId: userStore?.user?.loginEventId,
|
||||
currentDeviceType,
|
||||
showArticleLoader: clientLoadingStore.showArticleLoader,
|
||||
setPortalTariff,
|
||||
|
@ -75,19 +75,16 @@ export const getDescription = (
|
||||
if (isFolder) {
|
||||
return match([parentRoomType, folderType, access])
|
||||
.with([P._, FolderType.Done, P._], () =>
|
||||
t("Files:EmptyFormFolderDoneHeaderText"),
|
||||
t("Files:EmptyFormFolderDoneDescriptionText"),
|
||||
)
|
||||
|
||||
.with([P._, FolderType.InProgress, P._], () =>
|
||||
t("Files:EmptyFormFolderProgressHeaderText"),
|
||||
t("Files:EmptyFormFolderProgressDescriptionText"),
|
||||
)
|
||||
.with(
|
||||
[
|
||||
P._,
|
||||
P.union(FolderType.SubFolderDone, FolderType.SubFolderInProgress),
|
||||
P._,
|
||||
],
|
||||
() => t("Files:EmptyFormSubFolderHeaderText"),
|
||||
.with([P._, FolderType.SubFolderDone, P._], () =>
|
||||
t("Files:EmptyFormSubFolderDoneDescriptionText"),
|
||||
)
|
||||
.with([P._, FolderType.SubFolderInProgress, P._], () =>
|
||||
t("Files:EmptyFormSubFolderProgressDescriptionText"),
|
||||
)
|
||||
.with(
|
||||
[
|
||||
@ -130,16 +127,19 @@ export const getTitle = (
|
||||
if (isFolder) {
|
||||
return match([parentRoomType, folderType, access])
|
||||
.with([P._, FolderType.Done, P._], () =>
|
||||
t("Files:EmptyFormFolderDoneDescriptionText"),
|
||||
t("Files:EmptyFormFolderDoneHeaderText"),
|
||||
)
|
||||
|
||||
.with([P._, FolderType.InProgress, P._], () =>
|
||||
t("Files:EmptyFormFolderProgressDescriptionText"),
|
||||
t("Files:EmptyFormFolderProgressHeaderText"),
|
||||
)
|
||||
.with([P._, FolderType.SubFolderDone, P._], () =>
|
||||
t("Files:EmptyFormSubFolderDoneDescriptionText"),
|
||||
)
|
||||
.with([P._, FolderType.SubFolderInProgress, P._], () =>
|
||||
t("Files:EmptyFormSubFolderProgressDescriptionText"),
|
||||
.with(
|
||||
[
|
||||
P._,
|
||||
P.union(FolderType.SubFolderDone, FolderType.SubFolderInProgress),
|
||||
P._,
|
||||
],
|
||||
() => t("Files:EmptyFormSubFolderHeaderText"),
|
||||
)
|
||||
.with(
|
||||
[
|
||||
|
@ -56,10 +56,9 @@ const LogoutAllSessionDialog = ({
|
||||
visible={visible}
|
||||
onClose={onClose}
|
||||
displayType="modal"
|
||||
autoMaxHeight
|
||||
>
|
||||
<ModalDialog.Header>
|
||||
{t("Profile:LogoutAllActiveConnections")}
|
||||
</ModalDialog.Header>
|
||||
<ModalDialog.Header>{t("Common:LogoutButton")}</ModalDialog.Header>
|
||||
<ModalDialog.Body>
|
||||
<Text>{t("Profile:LogoutDescription")}</Text>
|
||||
<Text style={{ margin: "15px 0" }}>
|
||||
@ -70,8 +69,8 @@ const LogoutAllSessionDialog = ({
|
||||
className="change-password"
|
||||
isChecked={isChecked}
|
||||
onChange={onChangeCheckbox}
|
||||
label={t("Profile:ChangePasswordAfterLoggingOut")}
|
||||
/>
|
||||
{t("Profile:ChangePasswordAfterLoggingOut")}
|
||||
</Box>
|
||||
</ModalDialog.Body>
|
||||
<ModalDialog.Footer>
|
||||
|
@ -110,7 +110,7 @@ export const enum PluginComponents {
|
||||
|
||||
export const enum PluginUsersType {
|
||||
owner = "Owner",
|
||||
docSpaceAdmin = "DocspaceAdmin",
|
||||
docSpaceAdmin = "DocSpaceAdmin",
|
||||
roomAdmin = "RoomAdmin",
|
||||
collaborator = "Collaborator",
|
||||
user = "User",
|
||||
|
@ -37,9 +37,9 @@ const OfficialDocumentation = ({ dataBackupUrl }) => {
|
||||
const { t } = useTranslation("PaymentsEnterprise");
|
||||
|
||||
const dockerLink =
|
||||
"https://helpcenter.onlyoffice.com/installation/docspace-enterprise-install-docker.aspx";
|
||||
"https://helpcenter.onlyoffice.com/installation/docspace-enterprise-install-script.aspx";
|
||||
const linuxDocker =
|
||||
"https://helpcenter.onlyoffice.com/installation/docspace-enterprise-install-linux.aspx";
|
||||
"https://helpcenter.onlyoffice.com/installation/docspace-enterprise-install-script.aspx";
|
||||
const windowsDocker =
|
||||
"https://helpcenter.onlyoffice.com/installation/docspace-enterprise-install-windows.aspx";
|
||||
|
||||
|
@ -55,7 +55,7 @@ const LanguageComboboxWrapper = (props: TLanguageCombobox) => {
|
||||
onSelectLanguage={onLanguageSelect}
|
||||
cultures={cultures}
|
||||
selectedCulture={currentCultureName}
|
||||
withBorder={false}
|
||||
withBorder={!isMobileView}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
@ -320,7 +320,9 @@ const CreateUserForm = (props) => {
|
||||
culture: currentCultureName,
|
||||
};
|
||||
|
||||
signupOAuth(signupAccount)
|
||||
const confirmKey = linkData.confirmHeader;
|
||||
|
||||
signupOAuth(signupAccount, confirmKey)
|
||||
.then(() => {
|
||||
const url = roomData.roomId
|
||||
? `/rooms/shared/${roomData.roomId}/filter?folder=${roomData.roomId}/`
|
||||
|
@ -27,6 +27,7 @@
|
||||
import { withTranslation } from "react-i18next";
|
||||
import { inject, observer } from "mobx-react";
|
||||
import { TTranslation } from "@docspace/shared/types";
|
||||
import { FolderType } from "@docspace/shared/enums";
|
||||
import { StyledHistoryBlockMessage } from "../../../styles/history";
|
||||
|
||||
type HistoryMainTextFolderInfoProps = {
|
||||
@ -54,12 +55,15 @@ const HistoryMainTextFolderInfo = ({
|
||||
|
||||
if (!parentTitle) return null;
|
||||
|
||||
const isFolder = parentType === 0;
|
||||
const isFromFolder = fromParentType === 0;
|
||||
const isSection = parentType === FolderType.USER;
|
||||
const isFolder = parentType === FolderType.DEFAULT;
|
||||
const isFromFolder = fromParentType === FolderType.DEFAULT;
|
||||
|
||||
const destination = isFolder
|
||||
? t("FeedLocationLabel", { folderTitle: parentTitle })
|
||||
: t("FeedLocationRoomLabel", { folderTitle: parentTitle });
|
||||
: isSection
|
||||
? t("FeedLocationSectionLabel", { folderTitle: parentTitle })
|
||||
: t("FeedLocationRoomLabel", { folderTitle: parentTitle });
|
||||
|
||||
const sourceDestination = isFromFolder
|
||||
? t("FeedLocationLabelFrom", { folderTitle: fromParentTitle })
|
||||
|
@ -141,25 +141,17 @@ class PeopleTableHeader extends React.Component {
|
||||
const { filter, setFilter, setIsLoading, navigate, location } = this.props;
|
||||
const newFilter = filter.clone();
|
||||
|
||||
if (newFilter.sortBy === sortBy && sortBy !== "AZ") {
|
||||
if (
|
||||
newFilter.sortBy === sortBy ||
|
||||
(sortBy === "AZ" && newFilter.sortBy === "firstname")
|
||||
) {
|
||||
newFilter.sortOrder =
|
||||
newFilter.sortOrder === "ascending" ? "descending" : "ascending";
|
||||
} else {
|
||||
newFilter.sortBy = sortBy;
|
||||
|
||||
if (sortBy === "AZ") {
|
||||
if (
|
||||
newFilter.sortBy !== "lastname" &&
|
||||
newFilter.sortBy !== "firstname"
|
||||
) {
|
||||
newFilter.sortBy = "firstname";
|
||||
} else if (newFilter.sortBy === "lastname") {
|
||||
newFilter.sortBy = "firstname";
|
||||
} else {
|
||||
newFilter.sortBy = "lastname";
|
||||
}
|
||||
newFilter.sortOrder =
|
||||
newFilter.sortOrder === "ascending" ? "descending" : "ascending";
|
||||
newFilter.sortBy = "firstname";
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -605,6 +605,7 @@ const PeopleTableRow = (props) => {
|
||||
onClick={onEmailClick}
|
||||
isTextOverflow
|
||||
dir="auto"
|
||||
enableUserSelect
|
||||
>
|
||||
{email}
|
||||
</Link>
|
||||
|
@ -379,6 +379,7 @@ class FilesTableHeader extends React.Component {
|
||||
columnInfoPanelStorageName,
|
||||
sortBy,
|
||||
sortOrder,
|
||||
isRecentTab,
|
||||
});
|
||||
} else {
|
||||
this.state = {
|
||||
@ -388,6 +389,7 @@ class FilesTableHeader extends React.Component {
|
||||
columnInfoPanelStorageName,
|
||||
sortBy,
|
||||
sortOrder,
|
||||
isRecentTab,
|
||||
};
|
||||
}
|
||||
};
|
||||
@ -447,7 +449,7 @@ class FilesTableHeader extends React.Component {
|
||||
isTrashFolder !== prevProps.isTrashFolder ||
|
||||
columnStorageName !== prevProps.columnStorageName ||
|
||||
columnInfoPanelStorageName !== prevProps.columnInfoPanelStorageName ||
|
||||
isRecentTab !== prevProps.isRecentTab ||
|
||||
isRecentTab !== this.state.isRecentTab ||
|
||||
showStorageInfo !== prevProps.showStorageInfo ||
|
||||
sortBy !== this.state.sortBy ||
|
||||
sortOrder !== this.state.sortOrder
|
||||
|
@ -196,6 +196,7 @@ const InfiniteGrid = (props) => {
|
||||
key={key}
|
||||
className={`tiles-loader ${type}`}
|
||||
isFolder={type === "isFolder"}
|
||||
isRoom={type === "isRoom"}
|
||||
/>,
|
||||
);
|
||||
}
|
||||
|
@ -2504,6 +2504,9 @@ class FilesActionStore {
|
||||
const { clearFiles, setBufferSelection } = this.filesStore;
|
||||
const { clearInsideGroup, insideGroupBackUrl } =
|
||||
this.peopleStore.groupsStore;
|
||||
const { isLoading } = this.clientLoadingStore;
|
||||
|
||||
if (isLoading) return;
|
||||
|
||||
setBufferSelection(null);
|
||||
|
||||
|
@ -586,7 +586,6 @@ class SettingsSetupStore {
|
||||
};
|
||||
|
||||
getSessions = () => {
|
||||
if (this.sessionsIsInit) return;
|
||||
this.getAllSessions().then((res) => {
|
||||
this.setSessions(res.items);
|
||||
this.currentSession = res.loginEvent;
|
||||
|
@ -103,6 +103,7 @@ const Root = ({
|
||||
const { filesSettings } = useFilesSettings({});
|
||||
const { socketHelper } = useSocketHelper({
|
||||
socketUrl: user ? settings?.socketUrl ?? "" : "",
|
||||
user,
|
||||
});
|
||||
const {
|
||||
onSDKRequestSaveAs,
|
||||
|
@ -43,6 +43,7 @@ export const StyledPage = styled.div`
|
||||
|
||||
.logo-wrapper {
|
||||
display: block;
|
||||
padding-bottom: 64px;
|
||||
}
|
||||
|
||||
@media ${mobile} {
|
||||
@ -85,6 +86,17 @@ export const StyledPage = styled.div`
|
||||
margin-bottom: 32px;
|
||||
}
|
||||
|
||||
.public-room_content-wrapper {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
-webkit-box-align: center;
|
||||
align-items: center;
|
||||
margin: 0px auto;
|
||||
max-width: 960px;
|
||||
box-sizing: border-box;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.public-room-content {
|
||||
padding-top: 9%;
|
||||
justify-content: unset;
|
||||
|
@ -54,7 +54,7 @@ import { ValidationStatus, WhiteLabelLogoType } from "@docspace/shared/enums";
|
||||
import { validatePublicRoomPassword } from "@docspace/shared/api/rooms";
|
||||
import Image from "next/image";
|
||||
|
||||
const FilesPassword = ({ shareKey, title, entryTitle }: FilePasswordProps) => {
|
||||
const FilePassword = ({ shareKey, title, entryTitle }: FilePasswordProps) => {
|
||||
const { t } = useTranslation(["Common"]);
|
||||
|
||||
const theme = useTheme();
|
||||
@ -111,7 +111,7 @@ const FilesPassword = ({ shareKey, title, entryTitle }: FilePasswordProps) => {
|
||||
|
||||
return (
|
||||
<>
|
||||
<StyledSimpleNav id="login-header">
|
||||
<StyledSimpleNav id="public-room-password-header">
|
||||
<Image
|
||||
className="logo"
|
||||
src={logoUrl}
|
||||
@ -122,90 +122,92 @@ const FilesPassword = ({ shareKey, title, entryTitle }: FilePasswordProps) => {
|
||||
/>
|
||||
</StyledSimpleNav>
|
||||
<StyledPage>
|
||||
<StyledContent className="public-room-content">
|
||||
<StyledBody>
|
||||
<Image
|
||||
priority
|
||||
src={logoUrl}
|
||||
className="logo-wrapper"
|
||||
alt="icon"
|
||||
width={416}
|
||||
height={200}
|
||||
/>
|
||||
<div className="public-room_content-wrapper">
|
||||
<StyledContent className="public-room-content">
|
||||
<StyledBody>
|
||||
<Image
|
||||
priority
|
||||
src={logoUrl}
|
||||
className="logo-wrapper"
|
||||
alt="icon"
|
||||
width={386}
|
||||
height={44}
|
||||
/>
|
||||
|
||||
<FormWrapper>
|
||||
<div className="password-form">
|
||||
<Text fontSize="16px" fontWeight="600">
|
||||
{t("Common:PasswordRequired")}
|
||||
</Text>
|
||||
|
||||
<Text
|
||||
fontSize="13px"
|
||||
fontWeight="400"
|
||||
className="public-room-text"
|
||||
>
|
||||
<Trans
|
||||
t={t}
|
||||
ns="Common"
|
||||
i18nKey="EnterPasswordDescription"
|
||||
values={{ fileName: entryTitle }}
|
||||
components={{ 1: <span className="bold" /> }}
|
||||
/>
|
||||
</Text>
|
||||
<div className="public-room-name">
|
||||
<PublicRoomIcon className="public-room-icon" />
|
||||
<Text
|
||||
className="public-room-text"
|
||||
fontSize="15px"
|
||||
fontWeight="600"
|
||||
>
|
||||
{title}
|
||||
<FormWrapper>
|
||||
<div className="password-form">
|
||||
<Text fontSize="16px" fontWeight="600">
|
||||
{t("Common:PasswordRequired")}
|
||||
</Text>
|
||||
|
||||
<Text
|
||||
fontSize="13px"
|
||||
fontWeight="400"
|
||||
className="public-room-text"
|
||||
>
|
||||
<Trans
|
||||
t={t}
|
||||
ns="Common"
|
||||
i18nKey="EnterPasswordDescription"
|
||||
values={{ fileName: entryTitle }}
|
||||
components={{ 1: <span className="bold" /> }}
|
||||
/>
|
||||
</Text>
|
||||
<div className="public-room-name">
|
||||
<PublicRoomIcon className="public-room-icon" />
|
||||
<Text
|
||||
className="public-room-text"
|
||||
fontSize="15px"
|
||||
fontWeight="600"
|
||||
>
|
||||
{title}
|
||||
</Text>
|
||||
</div>
|
||||
|
||||
<FieldContainer
|
||||
isVertical={true}
|
||||
labelVisible={false}
|
||||
hasError={!!errorMessage}
|
||||
errorMessage={errorMessage}
|
||||
>
|
||||
<PasswordInput
|
||||
simpleView
|
||||
id="password"
|
||||
inputName="password"
|
||||
placeholder={t("Common:Password")}
|
||||
type={InputType.password}
|
||||
inputValue={password}
|
||||
hasError={!!errorMessage}
|
||||
size={InputSize.large}
|
||||
scale
|
||||
tabIndex={1}
|
||||
autoComplete="current-password"
|
||||
onChange={onChangePassword}
|
||||
onKeyDown={onKeyPress}
|
||||
isDisabled={isLoading}
|
||||
isDisableTooltip
|
||||
isAutoFocussed
|
||||
// forwardedRef={inputRef}
|
||||
/>
|
||||
</FieldContainer>
|
||||
</div>
|
||||
|
||||
<FieldContainer
|
||||
isVertical={true}
|
||||
labelVisible={false}
|
||||
hasError={!!errorMessage}
|
||||
errorMessage={errorMessage}
|
||||
>
|
||||
<PasswordInput
|
||||
simpleView
|
||||
id="password"
|
||||
inputName="password"
|
||||
placeholder={t("Common:Password")}
|
||||
type={InputType.password}
|
||||
inputValue={password}
|
||||
hasError={!!errorMessage}
|
||||
size={InputSize.large}
|
||||
scale
|
||||
tabIndex={1}
|
||||
autoComplete="current-password"
|
||||
onChange={onChangePassword}
|
||||
onKeyDown={onKeyPress}
|
||||
isDisabled={isLoading}
|
||||
isDisableTooltip
|
||||
isAutoFocussed
|
||||
// forwardedRef={inputRef}
|
||||
/>
|
||||
</FieldContainer>
|
||||
</div>
|
||||
|
||||
<Button
|
||||
primary
|
||||
size={ButtonSize.medium}
|
||||
scale
|
||||
label={t("Common:ContinueButton")}
|
||||
tabIndex={5}
|
||||
onClick={onSubmit}
|
||||
isDisabled={isLoading}
|
||||
/>
|
||||
</FormWrapper>
|
||||
</StyledBody>
|
||||
</StyledContent>
|
||||
<Button
|
||||
primary
|
||||
size={ButtonSize.medium}
|
||||
scale
|
||||
label={t("Common:ContinueButton")}
|
||||
tabIndex={5}
|
||||
onClick={onSubmit}
|
||||
isDisabled={isLoading}
|
||||
/>
|
||||
</FormWrapper>
|
||||
</StyledBody>
|
||||
</StyledContent>
|
||||
</div>
|
||||
</StyledPage>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default FilesPassword;
|
||||
export default FilePassword;
|
||||
|
@ -29,12 +29,14 @@
|
||||
import React from "react";
|
||||
|
||||
import SocketIOHelper from "@docspace/shared/utils/socket";
|
||||
import { combineUrl } from "@docspace/shared/utils/combineUrl";
|
||||
import { getRestoreProgress } from "@docspace/shared/api/portal";
|
||||
import { getUser } from "@docspace/shared/api/people";
|
||||
import { EDITOR_ID } from "@docspace/shared/constants";
|
||||
|
||||
import { UseSocketHelperProps } from "@/types";
|
||||
|
||||
const useSocketHelper = ({ socketUrl }: UseSocketHelperProps) => {
|
||||
const useSocketHelper = ({ socketUrl, user }: UseSocketHelperProps) => {
|
||||
const [socketHelper, setSocketHelper] = React.useState<SocketIOHelper | null>(
|
||||
null,
|
||||
);
|
||||
@ -48,6 +50,11 @@ const useSocketHelper = ({ socketUrl }: UseSocketHelperProps) => {
|
||||
data: { roomParts: "backup-restore" },
|
||||
});
|
||||
|
||||
socketIOHelper.emit({
|
||||
command: "subscribe",
|
||||
data: { roomParts: user?.id || "" },
|
||||
});
|
||||
|
||||
socketIOHelper.on("restore-backup", async () => {
|
||||
try {
|
||||
const response = await getRestoreProgress();
|
||||
@ -69,6 +76,24 @@ const useSocketHelper = ({ socketUrl }: UseSocketHelperProps) => {
|
||||
}
|
||||
});
|
||||
|
||||
socketIOHelper.on("s:logout-session", async (loginEventId) => {
|
||||
console.log(`[WS] "logout-session"`, loginEventId, user?.loginEventId);
|
||||
|
||||
if (
|
||||
Number(loginEventId) === user?.loginEventId ||
|
||||
Number(loginEventId) === 0
|
||||
) {
|
||||
const docEditor =
|
||||
typeof window !== "undefined" &&
|
||||
window.DocEditor?.instances[EDITOR_ID];
|
||||
|
||||
docEditor?.requestClose();
|
||||
window.location.replace(
|
||||
combineUrl(window.ClientConfig?.proxy?.url, "/login"),
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
setSocketHelper(socketIOHelper);
|
||||
}, [socketHelper, socketUrl]);
|
||||
|
||||
@ -76,4 +101,3 @@ const useSocketHelper = ({ socketUrl }: UseSocketHelperProps) => {
|
||||
};
|
||||
|
||||
export default useSocketHelper;
|
||||
|
||||
|
@ -334,6 +334,7 @@ export interface SelectFileDialogProps {
|
||||
|
||||
export interface UseSocketHelperProps {
|
||||
socketUrl: string;
|
||||
user?: TUser;
|
||||
}
|
||||
|
||||
export interface UseEventsProps {
|
||||
|
@ -70,7 +70,7 @@ const LanguageComboboxWrapper = () => {
|
||||
onSelectLanguage={onLanguageSelect}
|
||||
cultures={cultures}
|
||||
selectedCulture={currentCulture}
|
||||
withBorder={false}
|
||||
withBorder={!isMobileView}
|
||||
isMobileView={isMobileView}
|
||||
/>
|
||||
);
|
||||
|
@ -346,12 +346,16 @@ export function linkOAuth(serializedProfile) {
|
||||
});
|
||||
}
|
||||
|
||||
export function signupOAuth(signupAccount) {
|
||||
return request({
|
||||
export function signupOAuth(signupAccount, confirmKey = null) {
|
||||
const options = {
|
||||
method: "post",
|
||||
url: "people/thirdparty/signup",
|
||||
data: signupAccount,
|
||||
});
|
||||
};
|
||||
|
||||
if (confirmKey) options.headers = { confirm: confirmKey };
|
||||
|
||||
return request(options);
|
||||
}
|
||||
|
||||
export function unlinkOAuth(provider) {
|
||||
|
@ -71,6 +71,7 @@ export type TUser = {
|
||||
cultureName?: string;
|
||||
groups?: TUserGroup[];
|
||||
shared?: boolean;
|
||||
loginEventId?: number;
|
||||
};
|
||||
|
||||
export type TGetUserList = {
|
||||
|
@ -28,7 +28,7 @@ import { List } from "react-virtualized";
|
||||
import styled, { css } from "styled-components";
|
||||
|
||||
import { Base } from "../../themes";
|
||||
import { mobile, tablet } from "../../utils";
|
||||
import { desktop, mobile, tablet } from "../../utils";
|
||||
import { TViewAs } from "../../types";
|
||||
|
||||
const StyledScroll = styled.div`
|
||||
@ -157,4 +157,28 @@ StyledScroll.defaultProps = {
|
||||
theme: Base,
|
||||
};
|
||||
|
||||
export { StyledScroll, StyledList };
|
||||
const paddingCss = css`
|
||||
@media ${desktop} {
|
||||
margin-inline-start: 1px;
|
||||
padding-inline-end: 0;
|
||||
}
|
||||
|
||||
@media ${tablet} {
|
||||
margin-inline-start: -1px;
|
||||
}
|
||||
`;
|
||||
|
||||
const StyledItem = styled.div`
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(216px, 1fr));
|
||||
gap: 14px 16px;
|
||||
width: 100%;
|
||||
|
||||
@media ${tablet} {
|
||||
gap: 14px;
|
||||
}
|
||||
|
||||
${paddingCss};
|
||||
`;
|
||||
|
||||
export { StyledScroll, StyledList, StyledItem };
|
||||
|
@ -24,27 +24,66 @@
|
||||
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
|
||||
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
|
||||
|
||||
import React from "react";
|
||||
import { useState, useEffect } from "react";
|
||||
import { isMobile } from "../../utils";
|
||||
|
||||
import ListComponent from "./sub-components/List";
|
||||
import GridComponent from "./sub-components/Grid";
|
||||
|
||||
import { InfiniteLoaderProps } from "./InfiniteLoader.types";
|
||||
import { MAX_INFINITE_LOADER_SHIFT } from "../../utils/device";
|
||||
|
||||
const InfiniteLoaderComponent = (props: InfiniteLoaderProps) => {
|
||||
const { viewAs, isLoading } = props;
|
||||
|
||||
const [scrollTop, setScrollTop] = useState(0);
|
||||
const [showSkeleton, setShowSkeleton] = useState(false);
|
||||
|
||||
const scroll = isMobile()
|
||||
? document.querySelector("#customScrollBar .scroll-wrapper > .scroller")
|
||||
: document.querySelector("#sectionScroll .scroll-wrapper > .scroller");
|
||||
|
||||
const onScroll = (e: Event) => {
|
||||
const eventTarget = e.target as HTMLElement;
|
||||
const currentScrollTop = eventTarget.scrollTop;
|
||||
|
||||
setScrollTop(currentScrollTop ?? 0);
|
||||
|
||||
const scrollShift = scrollTop - currentScrollTop;
|
||||
|
||||
if (
|
||||
scrollShift > MAX_INFINITE_LOADER_SHIFT ||
|
||||
scrollShift < -MAX_INFINITE_LOADER_SHIFT
|
||||
) {
|
||||
setShowSkeleton(true);
|
||||
setTimeout(() => {
|
||||
setShowSkeleton(false);
|
||||
}, 200);
|
||||
}
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
if (scroll) scroll.addEventListener("scroll", onScroll);
|
||||
|
||||
return () => {
|
||||
if (scroll) scroll.removeEventListener("scroll", onScroll);
|
||||
};
|
||||
});
|
||||
|
||||
if (isLoading) return null;
|
||||
|
||||
return viewAs === "tile" ? (
|
||||
<GridComponent scroll={scroll ?? window} {...props} />
|
||||
<GridComponent
|
||||
scroll={scroll ?? window}
|
||||
showSkeleton={showSkeleton}
|
||||
{...props}
|
||||
/>
|
||||
) : (
|
||||
<ListComponent scroll={scroll ?? window} {...props} />
|
||||
<ListComponent
|
||||
scroll={scroll ?? window}
|
||||
showSkeleton={showSkeleton}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
|
@ -42,6 +42,7 @@ export interface InfiniteLoaderProps {
|
||||
className?: string;
|
||||
infoPanelVisible?: boolean;
|
||||
countTilesInRow?: number;
|
||||
showSkeleton?: boolean;
|
||||
}
|
||||
|
||||
export interface ListComponentProps extends InfiniteLoaderProps {
|
||||
|
@ -26,8 +26,10 @@
|
||||
|
||||
import React, { useCallback, useEffect, useRef } from "react";
|
||||
import { InfiniteLoader, WindowScroller, List } from "react-virtualized";
|
||||
import { StyledList } from "../InfiniteLoader.styled";
|
||||
import { StyledItem, StyledList } from "../InfiniteLoader.styled";
|
||||
import { GridComponentProps } from "../InfiniteLoader.types";
|
||||
import { TileSkeleton } from "../../../skeletons/tiles";
|
||||
import { RectangleSkeleton } from "../../../skeletons";
|
||||
|
||||
const GridComponent = ({
|
||||
hasMoreFiles,
|
||||
@ -39,12 +41,13 @@ const GridComponent = ({
|
||||
children,
|
||||
className,
|
||||
scroll,
|
||||
showSkeleton,
|
||||
}: GridComponentProps) => {
|
||||
const loaderRef = useRef<InfiniteLoader | null>(null);
|
||||
const listRef = useRef<List | null>(null);
|
||||
|
||||
useEffect(() => {
|
||||
listRef?.current?.recomputeRowHeights();
|
||||
// listRef?.current?.recomputeRowHeights(); //TODO: return there will be problems with the height of the tile when clicking on the backspace
|
||||
});
|
||||
|
||||
const isItemLoaded = useCallback(
|
||||
@ -58,11 +61,50 @@ const GridComponent = ({
|
||||
index,
|
||||
style,
|
||||
key,
|
||||
isScrolling,
|
||||
}: {
|
||||
index: number;
|
||||
style: React.CSSProperties;
|
||||
key: string;
|
||||
isScrolling: boolean;
|
||||
}) => {
|
||||
const elem = children[index] as React.ReactElement;
|
||||
const itemClassNames = elem.props?.className;
|
||||
|
||||
const isFolder = itemClassNames?.includes("isFolder");
|
||||
const isRoom = itemClassNames?.includes("isRoom");
|
||||
const isHeader =
|
||||
itemClassNames?.includes("folder_header") ||
|
||||
itemClassNames?.includes("files_header");
|
||||
|
||||
if (isScrolling && showSkeleton) {
|
||||
const list = [];
|
||||
let i = 0;
|
||||
|
||||
if (isHeader) {
|
||||
return (
|
||||
<div key={key} style={style}>
|
||||
<StyledItem>
|
||||
<RectangleSkeleton height="22px" width="100px" animate />
|
||||
</StyledItem>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
while (i < countTilesInRow) {
|
||||
list.push(
|
||||
<TileSkeleton key={key} isFolder={isFolder} isRoom={isRoom} />,
|
||||
);
|
||||
i += 1;
|
||||
}
|
||||
|
||||
return (
|
||||
<div key={key} style={style}>
|
||||
<StyledItem>{list.map((item) => item)}</StyledItem>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="window-item" style={style} key={key}>
|
||||
{children[index]}
|
||||
|
@ -47,6 +47,7 @@ const ListComponent = ({
|
||||
className,
|
||||
scroll,
|
||||
infoPanelVisible,
|
||||
showSkeleton,
|
||||
}: ListComponentProps) => {
|
||||
const loaderRef = useRef<InfiniteLoader | null>(null);
|
||||
const listRef = useRef<List | null>(null);
|
||||
@ -89,13 +90,16 @@ const ListComponent = ({
|
||||
key,
|
||||
index,
|
||||
style,
|
||||
isScrolling,
|
||||
}: {
|
||||
key: string;
|
||||
index: number;
|
||||
style: React.CSSProperties;
|
||||
isScrolling: boolean;
|
||||
}) => {
|
||||
const isLoaded = isItemLoaded({ index });
|
||||
if (!isLoaded) return getLoader(style, key);
|
||||
if (!isLoaded || (isScrolling && showSkeleton))
|
||||
return getLoader(style, key);
|
||||
|
||||
return (
|
||||
<div className="row-list-item window-item" style={style} key={key}>
|
||||
@ -108,10 +112,12 @@ const ListComponent = ({
|
||||
index,
|
||||
style,
|
||||
key,
|
||||
isScrolling,
|
||||
}: {
|
||||
index: number;
|
||||
style: React.CSSProperties;
|
||||
key: string;
|
||||
isScrolling: boolean;
|
||||
}) => {
|
||||
if (!columnInfoPanelStorageName || !columnStorageName) {
|
||||
throw new Error("columnStorageName is required for a table view");
|
||||
@ -122,7 +128,8 @@ const ListComponent = ({
|
||||
: localStorage.getItem(columnStorageName);
|
||||
|
||||
const isLoaded = isItemLoaded({ index });
|
||||
if (!isLoaded) return getLoader(style, key);
|
||||
if (!isLoaded || (isScrolling && showSkeleton))
|
||||
return getLoader(style, key);
|
||||
|
||||
return (
|
||||
<div
|
||||
|
@ -111,6 +111,7 @@ export const ImageViewer = ({
|
||||
const toolbarRef = useRef<ImperativeHandle>(null);
|
||||
|
||||
const [scale, setScale] = useState(1);
|
||||
const [showOriginSrc, setShowOriginSrc] = useState(false);
|
||||
const [isError, setIsError] = useState<boolean>(false);
|
||||
const [isLoading, setIsLoading] = useState<boolean>(false);
|
||||
const [backgroundBlack, setBackgroundBlack] = useState<boolean>(() => false);
|
||||
@ -854,18 +855,19 @@ export const ImageViewer = ({
|
||||
}
|
||||
};
|
||||
|
||||
const onError = useCallback(
|
||||
(e: SyntheticEvent<HTMLImageElement, Event>) => {
|
||||
if (window.ClientConfig?.imageThumbnails && thumbnailSrc && src) {
|
||||
// if thumbnailSrc is unavailable, try to load original image
|
||||
e.currentTarget.src = src;
|
||||
return;
|
||||
}
|
||||
const onError = useCallback(() => {
|
||||
if (
|
||||
window.ClientConfig?.imageThumbnails &&
|
||||
thumbnailSrc &&
|
||||
(src || isTiff)
|
||||
) {
|
||||
// if thumbnailSrc is unavailable, try to load original image
|
||||
setShowOriginSrc(true);
|
||||
return;
|
||||
}
|
||||
|
||||
setIsError(true);
|
||||
},
|
||||
[src, thumbnailSrc],
|
||||
);
|
||||
setIsError(true);
|
||||
}, [src, thumbnailSrc, isTiff]);
|
||||
|
||||
const model = React.useMemo(() => contextModel(true), [contextModel]);
|
||||
|
||||
@ -951,6 +953,16 @@ export const ImageViewer = ({
|
||||
};
|
||||
}, []);
|
||||
|
||||
useLayoutEffect(() => {
|
||||
return () => {
|
||||
if (imgRef.current) {
|
||||
// abort img loading
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
imgRef.current.src = "";
|
||||
}
|
||||
};
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<>
|
||||
{isMobile && !backgroundBlack && mobileDetails}
|
||||
@ -973,7 +985,9 @@ export const ImageViewer = ({
|
||||
<Image
|
||||
draggable="false"
|
||||
src={
|
||||
window.ClientConfig?.imageThumbnails && thumbnailSrc
|
||||
window.ClientConfig?.imageThumbnails &&
|
||||
thumbnailSrc &&
|
||||
!showOriginSrc
|
||||
? `${thumbnailSrc}&size=3840x2160`
|
||||
: src
|
||||
}
|
||||
|
@ -63,7 +63,7 @@ const StyledSelector = styled.div`
|
||||
overflow: hidden;
|
||||
`;
|
||||
|
||||
const StyledHeader = styled.div<{ withoutBorder: boolean }>`
|
||||
const StyledHeader = styled.div<{ withoutBorder?: boolean }>`
|
||||
width: calc(100% - 32px);
|
||||
min-height: 53px;
|
||||
height: 53px;
|
||||
|
@ -47,7 +47,7 @@ type THeaderBackButton =
|
||||
| {
|
||||
onBackClick?: undefined;
|
||||
withoutBackButton?: undefined;
|
||||
withoutBorder: undefined;
|
||||
withoutBorder?: undefined;
|
||||
};
|
||||
|
||||
export type TInfoBarData = {
|
||||
|
@ -154,6 +154,7 @@ const LinkRow = ({
|
||||
type="onlyIcon"
|
||||
isDisabled={isExpiredLink || isLoaded}
|
||||
manualWidth="fit-content"
|
||||
withBackdrop={false}
|
||||
/>
|
||||
</div>
|
||||
</StyledLinkRow>
|
||||
|
@ -44,6 +44,7 @@ const useLoadersHelper = () => {
|
||||
const [isFirstLoad, setIsFirstLoad] = React.useState(true);
|
||||
|
||||
const startLoader = React.useRef<Date | null>(new Date());
|
||||
const loaderTimeout = React.useRef<NodeJS.Timeout | null>(null);
|
||||
|
||||
const breadCrumbsLoaderTimeout = React.useRef<NodeJS.Timeout | null>(null);
|
||||
const breadCrumbsStartLoader = React.useRef<Date | null>(new Date());
|
||||
@ -59,9 +60,10 @@ const useLoadersHelper = () => {
|
||||
|
||||
const calculateLoader = React.useCallback(() => {
|
||||
if (isFirstLoad) {
|
||||
setShowLoader(true);
|
||||
|
||||
startLoader.current = new Date();
|
||||
loaderTimeout.current = setTimeout(() => {
|
||||
startLoader.current = new Date();
|
||||
if (isMount.current) setShowLoader(true);
|
||||
}, SHOW_LOADER_TIMER);
|
||||
} else if (startLoader.current) {
|
||||
const currentDate = new Date();
|
||||
|
||||
@ -80,6 +82,11 @@ const useLoadersHelper = () => {
|
||||
setShowLoader(false);
|
||||
}
|
||||
}, MIN_LOADER_TIMER - ms);
|
||||
|
||||
loaderTimeout.current = null;
|
||||
} else if (loaderTimeout.current) {
|
||||
clearTimeout(loaderTimeout.current);
|
||||
loaderTimeout.current = null;
|
||||
}
|
||||
}, [isFirstLoad]);
|
||||
|
||||
|
@ -238,7 +238,7 @@ const FilesSelectorComponent = ({
|
||||
setSelectedItemType(undefined);
|
||||
getRootData();
|
||||
} else {
|
||||
setItems([]);
|
||||
// setItems([]);
|
||||
|
||||
setBreadCrumbs((bc) => {
|
||||
const idx = bc.findIndex(
|
||||
@ -302,7 +302,7 @@ const FilesSelectorComponent = ({
|
||||
if (item.isFolder) {
|
||||
setIsFirstLoad(true);
|
||||
|
||||
setItems([]);
|
||||
// setItems([]);
|
||||
setBreadCrumbs((value) => [
|
||||
...value,
|
||||
{
|
||||
@ -445,7 +445,14 @@ const FilesSelectorComponent = ({
|
||||
selectedFileInfo,
|
||||
);
|
||||
},
|
||||
[breadCrumbs, selectedFileInfo, selectedItemId, selectedTreeNode, onSubmit],
|
||||
[
|
||||
breadCrumbs,
|
||||
rootFolderType,
|
||||
onSubmit,
|
||||
selectedItemId,
|
||||
selectedTreeNode,
|
||||
selectedFileInfo,
|
||||
],
|
||||
);
|
||||
|
||||
React.useEffect(() => {
|
||||
@ -499,7 +506,7 @@ const FilesSelectorComponent = ({
|
||||
submitButtonLabel,
|
||||
submitButtonId,
|
||||
disableSubmitButton: getIsDisabled(
|
||||
isFirstLoad,
|
||||
isFirstLoad && showLoader,
|
||||
isSelectedParentFolder,
|
||||
selectedItemId,
|
||||
selectedItemType,
|
||||
|
@ -27,11 +27,19 @@
|
||||
import React from "react";
|
||||
import { RectangleSkeleton } from "@docspace/shared/skeletons";
|
||||
|
||||
import { StyledTile, StyledBottom, StyledMainContent } from "./Tiles.styled";
|
||||
import {
|
||||
StyledTile,
|
||||
StyledBottom,
|
||||
StyledMainContent,
|
||||
StyledRoomTile,
|
||||
StyledRoomTileTopContent,
|
||||
StyledRoomTileBottomContent,
|
||||
} from "./Tiles.styled";
|
||||
import type { TileSkeletonProps } from "./Tiles.types";
|
||||
|
||||
export const TileSkeleton = ({
|
||||
isFolder,
|
||||
isRoom,
|
||||
title,
|
||||
borderRadius,
|
||||
backgroundColor,
|
||||
@ -84,6 +92,79 @@ export const TileSkeleton = ({
|
||||
/>
|
||||
</StyledBottom>
|
||||
</StyledTile>
|
||||
) : isRoom ? (
|
||||
<StyledTile {...rest}>
|
||||
<StyledRoomTile>
|
||||
<StyledRoomTileTopContent>
|
||||
<RectangleSkeleton
|
||||
className="first-content"
|
||||
title={title}
|
||||
width="32px"
|
||||
height="32px"
|
||||
borderRadius={borderRadius}
|
||||
backgroundColor={backgroundColor}
|
||||
foregroundColor={foregroundColor}
|
||||
backgroundOpacity={backgroundOpacity}
|
||||
foregroundOpacity={foregroundOpacity}
|
||||
speed={speed}
|
||||
animate
|
||||
/>
|
||||
<RectangleSkeleton
|
||||
className="second-content"
|
||||
title={title}
|
||||
height="22px"
|
||||
borderRadius={borderRadius}
|
||||
backgroundColor={backgroundColor}
|
||||
foregroundColor={foregroundColor}
|
||||
backgroundOpacity={backgroundOpacity}
|
||||
foregroundOpacity={foregroundOpacity}
|
||||
speed={speed}
|
||||
animate
|
||||
/>
|
||||
<RectangleSkeleton
|
||||
className="option-button"
|
||||
title={title}
|
||||
height="16px"
|
||||
width="16px"
|
||||
borderRadius={borderRadius}
|
||||
backgroundColor={backgroundColor}
|
||||
foregroundColor={foregroundColor}
|
||||
backgroundOpacity={backgroundOpacity}
|
||||
foregroundOpacity={foregroundOpacity}
|
||||
speed={speed}
|
||||
animate
|
||||
/>
|
||||
</StyledRoomTileTopContent>
|
||||
<StyledRoomTileBottomContent>
|
||||
<RectangleSkeleton
|
||||
className="main-content"
|
||||
title={title}
|
||||
height="24px"
|
||||
width="50px"
|
||||
borderRadius={borderRadius}
|
||||
backgroundColor={backgroundColor}
|
||||
foregroundColor={foregroundColor}
|
||||
backgroundOpacity={backgroundOpacity}
|
||||
foregroundOpacity={foregroundOpacity}
|
||||
speed={speed}
|
||||
animate
|
||||
/>
|
||||
<RectangleSkeleton
|
||||
className="main-content"
|
||||
title={title}
|
||||
height="24px"
|
||||
width="50px"
|
||||
borderRadius={borderRadius}
|
||||
backgroundColor={backgroundColor}
|
||||
foregroundColor={foregroundColor}
|
||||
backgroundOpacity={backgroundOpacity}
|
||||
foregroundOpacity={foregroundOpacity}
|
||||
speed={speed}
|
||||
animate
|
||||
/>
|
||||
</StyledRoomTileBottomContent>
|
||||
</StyledRoomTile>
|
||||
</StyledTile>
|
||||
) : (
|
||||
<StyledTile {...rest}>
|
||||
<StyledMainContent>
|
||||
|
@ -120,3 +120,26 @@ export const StyledTilesWrapper = styled.div`
|
||||
grid-template-columns: 1fr;
|
||||
grid-gap: 16px;
|
||||
`;
|
||||
|
||||
export const StyledRoomTile = styled.div`
|
||||
border: ${(props) => props.theme.filesSection.tilesView.tile.border};
|
||||
border-radius: 6px;
|
||||
height: 120px;
|
||||
`;
|
||||
|
||||
export const StyledRoomTileTopContent = styled.div`
|
||||
display: grid;
|
||||
grid-template-columns: 32px 1fr 24px;
|
||||
gap: 8px;
|
||||
align-items: center;
|
||||
height: 61px;
|
||||
border-bottom: ${(props) => props.theme.filesSection.tilesView.tile.border};
|
||||
padding: 0 8px 0 16px;
|
||||
`;
|
||||
|
||||
export const StyledRoomTileBottomContent = styled.div`
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 16px;
|
||||
gap: 4px;
|
||||
`;
|
||||
|
@ -38,4 +38,5 @@ export interface StyledBottomProps {
|
||||
|
||||
export interface TileSkeletonProps extends RectangleSkeletonProps {
|
||||
isFolder?: boolean;
|
||||
isRoom?: boolean;
|
||||
}
|
||||
|
@ -26,6 +26,7 @@
|
||||
|
||||
export const INFO_PANEL_WIDTH = 400;
|
||||
export const TABLE_HEADER_HEIGHT = 40;
|
||||
export const MAX_INFINITE_LOADER_SHIFT = 800;
|
||||
|
||||
export function checkIsSSR() {
|
||||
return typeof window === "undefined";
|
||||
|
Loading…
Reference in New Issue
Block a user