diff --git a/common/Tests/Frontend.Translations.Tests/spellcheck-excludes.json b/common/Tests/Frontend.Translations.Tests/spellcheck-excludes.json index 23c0196417..86032b7a23 100644 --- a/common/Tests/Frontend.Translations.Tests/spellcheck-excludes.json +++ b/common/Tests/Frontend.Translations.Tests/spellcheck-excludes.json @@ -1,629 +1,828 @@ [ { "Excludes": [ - "A-Z", - "Abunəlikdən", - "Abunəliklər", - "abunəliyi", - "Abunəliyinin", - "abunəliyiniz", - "abunəliyinizi", - "açarınızı", - "açılmırsa", - "açın", - "addımdan", - "adı", - "admin", - "Admin", - "administratoru", - "Administratorlar", - "administratorları", - "administratorlarını", - "Adminlər", - "adminləri", - "Adminləri", - "akkauntlar", - "Akkauntları", - "akkaunt", - "Akkaunt", - "Akkauntu", - "Akkauntun", - "aktivdir", - "aktivləşdirildi", - "aktivləşdirilmişdi", - "aktivləşdirilmişdir", - "aktivləşdirmə", - "Aktivləşdirmə", - "aktivlşdirilməsi", - "alqoritmi", - "Arxiv", - "Arxivlər", - "arxivləşdirilməsi", - "Atlamaq", - "audentifikasiya", - "Audentifikasiya", - "Audio", - "Avto", - "avtorizasiya", - "Avtorizasiya", - "avtorizasiyası", - "Axtarın", - "Ayarlar", - "Ayarlara", - "ayarları", - "Ayarları", - "ayarlarını", - "bağlandıqdan", - "Bağlantını", - "bağlantısı", - "Bağlayın", - "Başlıqda", - "baxılan", - "Bərkidilənlərdən", - "Bərkidin", - "bildirişi", - "bildirişlər", - "bildirişləri", - "bilməyəcəksiniz", - "bilmirsinizsə", - "bitmişdir", - "Blankı", - "Blokdan", - "Bloklamaq", - "bloklanılır", - "Bloklanmış", - "bölməyə", - "Bolqar", - "boşdur", - "boşluqlar", - "brauzer", - "brauzeriniz", - "buferə", - "buferinə", - "Buluda", - "Buludunuz", - "buraxılışından", - "Çat", - "Çex", - "Çexiya", - "Cədvəllər", - "çıxarın", - "çıxma", - "ÇXR", - "Daxilolma", - "dayandırmağı", - "deaktiv", - "Deaktiv", - "deaktivləşdirin", - "deaktivləşdirmək", - "dəfəlik", - "dəqiqədir", - "dəstəklənmir", - "Dəvəetmə", - "dəvətnamə", - "Dəvətnamə", - "dəyiş", - "dəyişdir", - "Dəyişdir", - "dəyişdirə", - "dəyişdirildi", - "dəyişdirilməsindən", - "dəyişdirilmişdir", - "dəyişdirin", - "dəyişdirmə", - "Dəyişiklər", - "dəyişikləriniz", - "dəyişiklikləriniz", - "dəyişikliksiz", - "dəyişin", - "dialoqunda", - "dialoqunun", - "dilinizi", - "doğrulama", - "Doğrulama", - "doldurun", - "domen", - "Domen", - "domendə", - "düyməyə", - "E-məktublarınızı", - "e-məktubu", - "e-poçt", - "E-poçt", - "Ehtiyyat", - "elementinin", - "elementlərdən", - "elementlərin", - "Elementlərin", - "elementlərini", - "emailin", - "endirin", - "Endirin", - "etdiyiz", - "Etibarsız", - "əlaqələndirə", - "Əlaqələrinizi", - "əlçatan", - "əlçatandır", - "əminsinizmi", - "ərzindəki", - "faktorlu", - "favorit", - "Favorit", - "Favoritlərdən", - "fayla", - "Fayla", - "Fayldan", - "faylın", - "Faylın", - "faylından", - "Faylından", - "faylını", - "faylınız", - "faylınızı", - "fayllar", - "Fayllar", - "faylları", - "Faylları", - "faylların", - "fərdiləşdirilmiş", - "Fərdiləşdirmə", - "Filtr", - "Filtri", - "Fin", - "Finlandiya", - "fonlu", - "formalaşdır", - "Formanı", - "Formanın", - "format", - "formatına", - "formatını", - "formatlı", - "Formu", - "funksionallıq", - "generasiya", - "generasiyası", - "Genişlik", - "gəldiniz", - "gəlmisiniz", - "Girişə", - "Girişi", - "Girişin", - "göndəriləcəkdir", - "göndərilsinmi", - "Göndərin", - "görməmisinizsə", - "görsənmirsə", - "görünməsi", - "görünsün", - "görüntülənəcək", - "göstərmə", - "Güvənilən", - "Hesabımı", - "Hesabınız", - "hesabınızdan", - "Hesabınızı", - "Hesabınızın", - "hesabınızla", - "hesablardakı", - "hesablarını", - "həcmdən", - "Həmkarların", - "hərflər", - "hüquqlara", - "icazənin", - "İcra", - "İki", - "İlk", - "İlkin", - "importu", - "İndi", - "İnsanlar", - "instruksiyası", - "İnteqrasiya", - "interfeysindən", - "İnternet", - "inzibatçı", - "İnzibatçı", - "inzibatçıları", - "inzibatçının", - "inzibatçısı", - "İş", - "işarələ", - "İşə", - "işləyin", - "İspan", - "istədiyinizdən", - "istəyirsinizmi", - "İstifadə", - "İstifadəçi", - "İstifadəçilər", - "istifadəçilərə", - "İstifadəçilərə", - "istifadəçiləri", - "İstifadəçiləri", - "istifadəçilərin", - "İstifadəçilərin", - "istifadəçilərlə", - "İstifadəçinin", - "istifadəçisinə", - "istifadəd", - "İtalyan", - "İzn", - "kataloqu", - "Kataloqu", - "keç", - "keçiriləcəklər", - "klikəyin", - "klikləməklə", - "klikləyin", - "köçürə", - "köçürüldü", - "Köçürüldü", - "köçürülən", - "Köçürülmə", - "köçürülmədi", - "köçürülsünmü", - "Köçürülür", - "kodlar", - "kodlardan", - "kodları", - "kodlarından", - "kodlarını", - "konfiqurasiyasını", - "Kontaktın", - "kontekst", - "Kontekst", - "konvertasiya", - "Konvertasiya", - "konvertasiyasını", - "kopyalandı", - "kopyalayın", - "Krallıq", - "Laos", - "Latış", - "Latviya", - "link", - "Link", - "linki", - "Linki", - "linkin", - "Lisenziyanı", - "Lisenziyanız", - "lisenziyanızı", - "lisenziyası", - "lokal", - "Lokal", - "loqo", - "Loqo", - "Loqonu", - "loqosu", - "lütfən", - "Lütfən", - "manual", - "Manual", - "masaüstü", - "Masaüstü", - "Meksika", - "Mesaj", - "məktubundan", - "məlumatlarını", - "Məlumatlarınızı", - "Məxfilik", - "modul", - "Modul", - "Modullar", - "Modullara", - "Modullarda", - "modullarına", - "moduluna", - "modulundan", - "mövcuddursa", - "mu", - "müəyyənləşdirin", - "Niderland", - "Nöm", - "nömrəsinin", - "Növün", - "nüsxəsi", - "nüsxəsini", - "o", - "Ödənişsiz", - "olunmusunuz", - "Onlayn", - "or", - "Oxunmuş", - "oxunulmuş", - "özüvüzün", - "parametrindən", - "Parolun", - "Parolunuzu", - "Paylanılmış", - "Paylaş", - "paylaşa", - "paylaşılan", - "Paylaşılanlar", - "paylaşıldı", - "Paylaşılmış", - "paylaşım", - "paylaşın", - "Paylaşma", - "pəncərəsi", - "planlaşdırın", - "Plitkalar", - "poçta", - "poçtu", - "poçtun", - "poçtuna", - "poçtunuz", - "poçtunuzu", - "portala", - "Portala", - "portalda", - "Portalda", - "portaldan", - "Portaldan", - "portalı", - "Portalı", - "portalın", - "portalınız", - "Portalınıza", - "portalınızı", - "portalınızla", - "Portuqal", - "Portuqaliya", - "Potalın", - "presetlərdən", - "Profil", - "Profili", - "profilin", - "Profilin", - "profillər", - "Profillərə", - "Provayder", - "Provayderin", - "qayıt", - "qısamüddətli", - "Qolvuğu", - "qoş", - "qoşmaq", - "qoşul", - "qoşulanlar", - "qoşulun", - "Qoşulun", - "qovluğa", - "qovluğu", - "Qovluğu", - "Qovluğua", - "qovluğuna", - "qovluğunda", - "qovluğundan", - "qovluğunun", - "qovluq", - "Qovluq", - "qovluqda", - "Qovluqda", - "qovluqlar", - "Qovluqlar", - "quraşdır", - "quraşdırın", - "qurşağı", - "Qurşağı", - "qurun", - "qutunu", - "qutusu", - "qutusuna", - "qutusundan", - "qutusunu", - "razılaşırsınız", - "razılaşmalarınız", - "razılaşmasını", - "redaktorları", - "resurs", - "rezerv", - "Rezerv", - "Rumın", - "Şablon", - "Şablonları", - "şablonu", - "şablonunu", - "sadalananlar", - "Sadalananlar", - "Sadələşdirilmiş", - "salamlama", - "Salamlama", - "Satınalma", - "satışlarınızı", - "saxlama", - "saxlandığına", - "saxlanıldı", - "saxlanılmaya", - "saxlanılmışdır", - "saxlanmayan", - "saxlanmış", - "sazlamalar", - "sazlamaları", - "seçdiyiniz", - "seçdiyinizə", - "seçiminə", - "seçinr", - "seçməklə", - "seçsəz", - "sessiya", - "Sessiya", - "səhifəni", - "səhifəyə", - "şəkillərdən", - "sənədinə", - "Sənədlərim", - "Sənədlərimə", - "Şərhi", - "Şərhlər", - "şifrə", - "Şifrə", - "Şifrədə", - "şifrədən", - "Şifrələmə", - "şifrələndiyi", - "şifrələnir", - "şifrələnmə", - "Şifrələnmiş", - "şifrələnmişdir", - "şifrəni", - "Şifrəni", - "şifrənin", - "Şifrənin", - "Şifrlənmiş", - "sil", - "silə", - "silin", - "Silin", - "silindi", - "silindiyi", - "silinəcək", - "silinəcəkdir", - "silinəcəklər", - "silinir", - "Silinir", - "silinməsi", - "silinmiş", - "silinmişdir", - "silinsin", - "silsəz", - "simvol", - "simvoldur", - "simvollardan", - "simvolun", - "Siyasətimizə", - "siyasətimizlə", - "sıfırla", - "sıfırlamaq", - "sıfırlanacaq", - "sıfırlayın", - "Sındırılmamış", - "sıxlaşdırılacaq", - "skan", - "Slovakiya", - "Sloven", - "Sloveniya", - "Slovak", - "Söndürülüb", - "sorğula", - "Sorğunu", - "soyad", - "Soyad", - "Status", - "statusuna", - "statusunda", - "statusunuzu", - "suallarınıza", - "sürüşdürün", - "süzgəc", - "süzgəci", - "süzgəcə", - "Susmaya", - "tabda", - "tanıdın", - "tapıla", - "tapılmadı", - "Tapşırıqları", - "tarixçəsinə", - "tarixləri", - "telefonunuz", - "Telefonunuz", - "teqini", - "təlimatı", - "təlimatını", - "təlimatlar", - "Təlimatlar", - "təlimatları", - "təmizləndi", - "təmizləyərək", - "təmizləyin", - "Təqdimatlar", - "Tərcümədə", - "təsdiqdən", - "Təsdiqləmə", - "təsdiqlənmə", - "təsdiqlənməsi", - "təsdiqləyin", - "tətbiqdən", - "Tətbiqə", - "tətbiqindən", - "tətbiqinizdən", - "Tətbiqləri", - "tipini", - "unutmusunuz", - "ünvanının", - "üsuldur", - "üzrəsiniz", - "Uzunluq", - "veb", - "Veb", - "Vebsaytın", - "Verilənlərin", - "verilməyən", - "versiyaları", - "versiyalarını", - "versiyanı", - "Versiyanı", - "Video", - "Vyetnam", - "went", - "xanada", - "Xanada", - "Xanadan", - "xəta", - "xətası", - "yaddaşda", - "yandırıldı", - "Yapon", - "yaradılma", - "yarat", - "Yaratdığınız", - "Yazdığınız", - "yazma", - "yazmanın", - "Yedəkləmə", - "yedəkləyin", - "yeniləmisinizsə", - "yeniləndi", - "Yeniləndi", - "Yenilənmə", - "yenilənmələr", - "yenilənmələri", - "yenilənməsi", - "yenilənmişdir", - "yeniləyin", - "Yenisini", - "yerdəyişdirildi", - "Yerdəyişmə", - "Yerdəyişmənin", - "yerdəyişməsi", - "yerləşdir", - "yerləşdirilsinmi", - "yerləşdirin", - "Yerləşdirmə", - "yerləşdirmək", - "yoldaşlarınız", - "yönləndiriləcəksiniz", - "yoxdurmu", - "yoxlayın", - "yüklə", - "yüklədiyiniz", - "Yükləmələr", - "yüklənə", - "Yüklənəcək", - "Yüklənildi", - "yüklənilmiş", - "Yüklənir", - "Yüklənmə", - "yüklənməsi", - "yükləyə", - "yükləyin", - "Yükləyin", - "Z-A" + "A-Z", + "Abunəlik", + "Abunəlikdən", + "Abunəliklər", + "abunəliyi", + "Abunəliyinin", + "abunəliyiniz", + "abunəliyinizi", + "açarınızı", + "açılmırsa", + "açın", + "addımdan", + "adı", + "admin", + "Admin", + "administrator", + "administratoru", + "Administratorunuzla", + "Administratorlar", + "administratorları", + "administratorlarını", + "Adminlər", + "adminləri", + "Adminləri", + "akkauntlar", + "Akkauntları", + "akkaunt", + "Akkaunt", + "Akkauntu", + "Akkauntun", + "aktivdir", + "aktivləşdirildi", + "aktivləşdirilmişdi", + "aktivləşdirilmişdir", + "aktivləşdirilməyəcək", + "aktivləşdirmə", + "Aktivləşdirmə", + "aktivlşdirilməsi", + "aktivləşdirin", + "alqoritmi", + "Arxiv", + "Arxivlər", + "arxivləşdirilməsi", + "Atlamaq", + "Audio", + "autentifikasiya", + "Avto", + "avtomatlaşdırmaq", + "avtorizasiya", + "Avtorizasiya", + "avtorizasiyası", + "Axtarın", + "Axşamınız", + "ayarlamağa", + "Ayarlar", + "Ayarlara", + "ayarları", + "Ayarları", + "ayarlarını", + "bağlandıqdan", + "Bağlantını", + "bağlantınızı", + "bağlantısı", + "Bağlayın", + "balansınızı", + "Balansınızı", + "Başladın", + "başlığını", + "Başlıqda", + "baxılan", + "balansınız", + "Bərkidilənlərdən", + "Bərkidin", + "bildirişi", + "bildirişlər", + "bildirişləri", + "bilməyəcəksiniz", + "bilmirsinizsə", + "bitmişdir", + "Blankı", + "Blokdan", + "Bloklamaq", + "bloklanılır", + "Bloklanmış", + "bölmələrə", + "bölməyə", + "Bolqar", + "boşdur", + "boşluqlar", + "brauzer", + "brauzeriniz", + "Brendinizə", + "buferə", + "buferinə", + "Buluda", + "Buludlar", + "buludlarına", + "Buludunuz", + "buraxılışından", + "Çat", + "Çex", + "çevirin", + "Çexiya", + "Cədvəllər", + "Cığır", + "çıxarıldınız", + "çıxarın", + "çıxma", + "com", + "ÇXR", + "Daxilolma", + "Dayandırın", + "dayandırmağı", + "deaktiv", + "Deaktiv", + "deaktivləşdirin", + "deaktivləşdirmək", + "dəfəlik", + "defolt", + "Detallara", + "Detalları", + "detallarına", + "dəqiqədir", + "dəstəklənmir", + "Dəvəetmə", + "dəvətnamə", + "Dəvətnamə", + "dəyiş", + "dəyişdir", + "Dəyişdir", + "dəyişdirə", + "dəyişdirildi", + "dəyişdirilməsindən", + "dəyişdirilmişdir", + "dəyişdirin", + "dəyişdirmə", + "dəyişmədən", + "Dəyişiklər", + "dəyişikləriniz", + "dəyişiklikləriniz", + "dəyişikliksiz", + "dəyişin", + "dəyişmə", + "dialoqunda", + "dialoqunun", + "dilinizi", + "dizayner", + "DOCXF", + "doğrulama", + "Doğrulama", + "doldurun", + "doldurulabilən", + "domen", + "Domen", + "domendə", + "Domeni", + "domenlər", + "domenləri", + "DropBox", + "düyməsinə", + "düyməsinin", + "düyməyə", + "E-məktublarınızı", + "e-məktubu", + "e-poçt", + "E-poçt", + "effektivliyinin", + "Ehtiyyat", + "elementinin", + "elementlərdən", + "elementlərin", + "Elementlərin", + "elementlərini", + "emailin", + "endirə", + "endirin", + "Endirin", + "Eskiz", + "etdiyiz", + "etibarlılıq", + "Etibarsız", + "etibarsızdır", + "Etiket", + "əlaqələndirə", + "əlaqələndirməlisiniz", + "Əlaqələrinizi", + "əlçatan", + "əlçatandır", + "əminsinizmi", + "ərzindəki", + "əyləmlərini", + "faktorlu", + "favorit", + "Favorit", + "Favoritlərdən", + "fayla", + "Fayla", + "Fayldan", + "faylın", + "Faylın", + "faylından", + "Faylından", + "faylını", + "faylınız", + "faylınızı", + "fayllar", + "Fayllar", + "faylları", + "Faylları", + "faylların", + "fəndlərlə", + "fərdiləşdirilmiş", + "Fərdiləşdirmə", + "Filtr", + "Filtri", + "Fin", + "Finlandiya", + "fonlu", + "formalaşdır", + "Formanı", + "Formanın", + "format", + "formatına", + "formatını", + "formatlarında", + "formatlı", + "Formu", + "Frilans", + "funksionallıq", + "generasiya", + "generasiyası", + "Genişlik", + "gəldiniz", + "gəlmisiniz", + "Girişə", + "Girişi", + "Girişin", + "Gizlət", + "göndərəcəyik", + "göndərilə", + "göndəriləcəkdir", + "göndərilsinmi", + "Göndərin", + "görməmisinizsə", + "görsənmirsə", + "görünəcək", + "görünməsi", + "görüntüyə", + "görünsün", + "görüntüsünü", + "görüntülənəcək", + "göstərmə", + "Güvənilən", + "GZ", + "hazırlayın", + "Hesabımı", + "Hesabınız", + "hesabınızdan", + "Hesabınızı", + "Hesabınızın", + "hesabınızla", + "hesablarda", + "hesablardakı", + "hesablarını", + "həcmdən", + "Həmkarların", + "hərflər", + "hərfləri", + "Hərvaxtınız", + "Http", + "hücumların", + "hüquqlara", + "hüquqlarınızı", + "içərisindəkilər", + "icazənin", + "İcra", + "İki", + "İlk", + "İlkin", + "importu", + "İnanılmış", + "İndi", + "İnsanlar", + "instruksiyası", + "İnteqrasiya", + "İnterfeys", + "interfeysindən", + "İnternet", + "inzibatçı", + "İnzibatçı", + "inzibatçıları", + "inzibatçının", + "inzibatçısı", + "İş", + "işarələ", + "işarədən", + "işarələrin", + "İşarələrin", + "İşə", + "işlət", + "işləyin", + "İşıqlı", + "İspan", + "istədiyinizdən", + "istəyirsinizmi", + "İstifadə", + "İstifadəçi", + "İstifadəçilər", + "istifadəçilərə", + "İstifadəçilərə", + "istifadəçiləri", + "İstifadəçiləri", + "istifadəçilərin", + "İstifadəçilərin", + "istifadəçilərinə", + "istifadəçilərinizi", + "istifadəçilərlə", + "İstifadəçinin", + "istifadəçisinə", + "istifadəd", + "itiriləcək", + "İtalyan", + "İzn", + "kataloqu", + "Kataloqu", + "keç", + "keçidinə", + "keçiriləcəklər", + "keçmələri", + "Kilidi", + "Kilidləndi", + "Klaviaturadakı", + "kliklədikdən", + "klikəyin", + "klikləməklə", + "klikləyin", + "köçürə", + "köçürüldü", + "Köçürüldü", + "köçürülən", + "Köçürülmə", + "köçürülmədi", + "köçürülsünmü", + "Köçürülür", + "köçürün", + "kodlar", + "kodlardan", + "kodları", + "kodlarından", + "kodlarını", + "Kodun", + "konfiqurasiyasını", + "Kontaktın", + "kontekst", + "Kontekst", + "Kontent", + "konvertasiya", + "Konvertasiya", + "konvertasiyasını", + "Kopyala", + "kopyalandı", + "kopyalayın", + "Krallıq", + "Laos", + "Latış", + "Latviya", + "limitlidir", + "link", + "Link", + "linkdən", + "linki", + "Linki", + "linkin", + "Linux", + "Lisenziyanı", + "Lisenziyanız", + "lisenziyanızı", + "lisenziyası", + "lokal", + "Lokal", + "loqo", + "Loqo", + "Loqonu", + "loqonuz", + "loqosu", + "lütfən", + "Lütfən", + "Mac", + "manual", + "Manual", + "masaüstü", + "Masaüstü", + "Meksika", + "məlumatlarının", + "məlumatlandırmaq", + "Mesaj", + "mesajları", + "məktubundan", + "məlumatlarını", + "Məlumatlarınızı", + "mətninizdən", + "Məxfilik", + "modul", + "Modul", + "Modullar", + "Modullara", + "Modullarda", + "modullarına", + "modulu", + "moduluna", + "modulundan", + "mövcuddursa", + "mu", + "müəyyənləşdirin", + "müdiri", + "müdirini", + "Nextcloud", + "Niderland", + "Nöm", + "nömrəniz", + "nömrənizi", + "nömrəsinin", + "Növün", + "nüsxələr", + "nüsxələri", + "nüsxələrin", + "nüsxələrinizi", + "Nüsxəni", + "nüsxənizi", + "nüsxəsi", + "nüsxəsini", + "o", + "Ödənişsiz", + "olunmusunuz", + "olunsunlar", + "Onlayn", + "ötürmə", + "OS", + "Oxunmuş", + "oxunulmuş", + "özüvüzün", + "parametrindən", + "parametrlərin", + "parolla", + "parollar", + "Parolun", + "Parolunuzu", + "Paylanılmış", + "Paylaş", + "paylaşa", + "paylaşılan", + "Paylaşılanlar", + "paylaşıldı", + "Paylaşılmış", + "paylaşım", + "paylaşın", + "Paylaşma", + "PDF", + "pəncərəsi", + "planlaşdırın", + "Play-dən", + "Plitkalar", + "poçta", + "poçtu", + "poçtun", + "poçtuna", + "poçtunuz", + "poçtunuzu", + "portala", + "Portala", + "portalda", + "Portalda", + "portaldan", + "Portaldan", + "portalı", + "Portalı", + "Portalımıza", + "portalın", + "portalından", + "portalınız", + "Portalınıza", + "portalınızı", + "portalınızla", + "portalınızda", + "portalındakı", + "Portuqal", + "Portuqaliya", + "Potalın", + "presetlərdən", + "Profil", + "Profili", + "profilin", + "Profilin", + "profillər", + "Profillərə", + "Provayder", + "Provayderin", + "qalereyası", + "qayıt", + "qaytarıla", + "qısamüddətli", + "qısayollar", + "Qısayollar", + "Qolvuğu", + "qoş", + "qoşmalısınız", + "qoşmaq", + "qoşul", + "qoşulanlar", + "qoşulmalısınız", + "qoşulmamısınız", + "qoşulun", + "Qoşulun", + "qovluğa", + "qovluğu", + "Qovluğu", + "Qovluğua", + "qovluğuna", + "qovluğunda", + "qovluğundan", + "qovluğunun", + "qovluq", + "Qovluq", + "qovluqda", + "Qovluqda", + "qovluqlar", + "Qovluqlar", + "quraşdır", + "quraşdırın", + "qurşağı", + "Qurşağı", + "qurşağına", + "qurşağını", + "qurun", + "qutunu", + "qutunuzu", + "qutusu", + "qutusuna", + "qutusundan", + "qutusunu", + "razılaşırsınız", + "razılaşmalarınız", + "razılaşmasını", + "redaktorları", + "Rəqəmləri", + "resurs", + "resursu", + "rezerv", + "Rezerv", + "Rumın", + "SaaS", + "Sabahınız", + "Şablon", + "Şablonları", + "şablonlarının", + "şablonu", + "şablonunu", + "sadalananlar", + "Sadalananlar", + "Sadələşdirilmiş", + "Sağdakı", + "salamlama", + "Salamlama", + "Satınalma", + "satışlarınızı", + "saxlama", + "saxlana", + "saxlanıldığı", + "saxlandığına", + "saxlanılacaq", + "saxlanıldı", + "saxlanılmaya", + "saxlanılmışdır", + "saxlanmayan", + "saxlamazdan", + "saxlanmış", + "saxlanmışdır", + "sazlamalar", + "sazlamaları", + "Səbətdən", + "seçdiyiniz", + "seçdiyinizə", + "seçimdən", + "seçimləri", + "seçilməyib", + "seçiminə", + "seçməklə", + "seçsəz", + "sehrli", + "səhifəni", + "səhifəsinə", + "səhifəyə", + "səhifəsindəki", + "şəkillərdən", + "sənədinə", + "Sənədlərim", + "Sənədlərimə", + "Şərhi", + "Şərhlər", + "Server", + "serverə", + "serverdə", + "serverdən", + "serverini", + "serverlərini", + "sessiya", + "Sessiya", + "səviyyədəki", + "şifrə", + "Şifrə", + "Şifrədə", + "şifrədən", + "Şifrələmə", + "şifrələndiyi", + "şifrələnir", + "şifrələnmə", + "Şifrələnmiş", + "şifrələnmişdir", + "şifrəni", + "Şifrəni", + "şifrənin", + "Şifrənin", + "şifrənizin", + "Şifrlənmiş", + "şifrəsiz", + "sil", + "silə", + "silin", + "Silin", + "silindi", + "silindiyi", + "silinəcək", + "silinəcəkdir", + "silinəcəklər", + "silinən", + "siliniblərsə", + "silinir", + "Silinir", + "silinməsi", + "silinmiş", + "silinmişdir", + "silinsin", + "silsəniz", + "silsəz", + "silsiləsi", + "simvol", + "simvoldur", + "simvollardan", + "simvolları", + "simvolun", + "Siyasətimizə", + "siyasətimizlə", + "sıfırla", + "sıfırlamaq", + "sıfırlanacaq", + "sıfırlayın", + "Sındırılmamış", + "Sıralama", + "sıxlaşdırılacaq", + "skan", + "Slovakiya", + "Sloven", + "Sloveniya", + "Slovak", + "sola", + "Soldakı", + "Söndürülüb", + "sonlandırın", + "sorğula", + "Sorğunu", + "sorğusu", + "soyad", + "Soyad", + "Spam", + "SSO", + "Status", + "statusuna", + "statusunda", + "statusunuzu", + "Store-da", + "suallarınıza", + "sürüşdürün", + "süzgəc", + "süzgəci", + "süzgəcə", + "Susmaya", + "şkalasından", + "tabda", + "tamamlandıqdan", + "tanıdın", + "tapıla", + "tapılmadı", + "Tapşırıqları", + "tarixçəsi", + "tarixçəsinə", + "tarixləri", + "telefonunuz", + "Telefonunuz", + "teqini", + "təəssüratını", + "təkrarlayın", + "təlimatı", + "təlimatını", + "təlimatlar", + "Təlimatlar", + "təlimatları", + "tema", + "temasından", + "təmizləndi", + "təmizləyərək", + "təmizləyin", + "tənzimləməsi", + "Tənzimləməsi", + "tənzimləmə", + "Təqdimatlar", + "Tərcümədə", + "təsdiqdən", + "Təsdiqləmə", + "təsdiqlənmə", + "təsdiqlənməsi", + "təsdiqləyin", + "Təsdiqləyirəm", + "tətbiqdən", + "Tətbiqə", + "tətbiqindən", + "tətbiqinizdən", + "Tətbiqləri", + "təxmin", + "tipini", + "unutmusunuz", + "ünvanının", + "ünvanınız", + "ünvanınızı", + "URL-si", + "üsuldur", + "uzadın", + "uzantısı", + "üzləşdiniz", + "üzrəsiniz", + "Uzunluq", + "uzunluqda", + "V", + "veb", + "Veb", + "Vebsaytın", + "Verilənin", + "Verilənlərin", + "verilənlərinizi", + "verilməyən", + "Versiyalar", + "versiyaları", + "versiyalarını", + "versiyanı", + "Versiyanı", + "Video", + "Vyetnam", + "xanada", + "Xanada", + "Xanadan", + "xəta", + "xətası", + "yaddaşda", + "yaddaşını", + "yaddaşlarında", + "yandırıldı", + "Yapon", + "yaradılma", + "yarat", + "Yaratdığınız", + "yaratdıqdan", + "Yazdığınız", + "yazma", + "yazmanın", + "Yedəkləmə", + "yedəkləmək", + "yedəkləməni", + "yedəklənməsi", + "yedəklənmiş", + "yedəkləyin", + "yeniləmisinizsə", + "yeniləndi", + "Yeniləndi", + "yeniləməyi", + "Yenilənmə", + "yenilənmələr", + "yenilənmələri", + "yenilənməsi", + "yenilənmişdir", + "yenilərini", + "yeniləyin", + "Yenisini", + "yerdəyişdirildi", + "Yerdəyişmə", + "Yerdəyişmənin", + "yerdəyişməsi", + "yerləşdir", + "yerləşdirilsinmi", + "yerləşdirilirlər", + "yerləşdirin", + "Yerləşdirmə", + "yerləşdirmək", + "yetirilməyən", + "yoldaşlarınız", + "yönləndiriləcəksiniz", + "yoxdurmu", + "yoxlaya", + "yoxlayın", + "yüklə", + "yüklədiyiniz", + "Yükləmələr", + "yüklənə", + "Yüklənəcək", + "Yüklənildi", + "yüklənilməsi", + "yüklənilmiş", + "Yüklənir", + "Yüklənmə", + "yüklənməsi", + "yükləyə", + "yükləyin", + "Yükləyin", + "Z-A" ], "Language": "az" }, diff --git a/packages/asc-web-common/components/Article/styled-article.js b/packages/asc-web-common/components/Article/styled-article.js index 65ec4f741a..bf51c62c49 100644 --- a/packages/asc-web-common/components/Article/styled-article.js +++ b/packages/asc-web-common/components/Article/styled-article.js @@ -147,6 +147,11 @@ const StyledArticleHeader = styled.div` padding: 16px 16px 17px; margin: 0; justify-content: ${(props) => (props.showText ? "flex-start" : "center")}; + + height: 61px; + min-height: 61px; + max-height: 61px; + box-sizing: border-box; } @media ${mobile} { @@ -204,7 +209,7 @@ const StyledHeading = styled(Heading)` const StyledIconBox = styled.div` display: none; align-items: center; - height: 28px; + height: 20px; @media ${tablet} { display: flex; diff --git a/packages/asc-web-common/components/Article/sub-components/article-header.js b/packages/asc-web-common/components/Article/sub-components/article-header.js index fb1b90716a..da274009cb 100644 --- a/packages/asc-web-common/components/Article/sub-components/article-header.js +++ b/packages/asc-web-common/components/Article/sub-components/article-header.js @@ -42,7 +42,11 @@ const ArticleHeader = ({ return ( {isTabletView && (isBurgerLoading || showLoader) ? ( - + ) : ( diff --git a/packages/asc-web-common/components/Section/index.js b/packages/asc-web-common/components/Section/index.js index 5c48078570..f5f55b56cd 100644 --- a/packages/asc-web-common/components/Section/index.js +++ b/packages/asc-web-common/components/Section/index.js @@ -559,22 +559,19 @@ Section.SectionFilter = SectionFilter; Section.SectionBody = SectionBody; Section.SectionPaging = SectionPaging; -export default inject(({ auth, infoPanelStore }) => { - const { isLoaded, settingsStore } = auth; +export default inject(({ auth }) => { + const { infoPanelStore, isLoaded, settingsStore } = auth; const { isHeaderVisible, isTabletView, - isDesktopClient, maintenanceExist, snackbarExist, setMaintenanceExist, - showText, } = settingsStore; - let infoPanelIsVisible = false; - if (infoPanelStore) infoPanelIsVisible = infoPanelStore.isVisible; + const { isVisible: infoPanelIsVisible } = infoPanelStore; return { isLoaded, @@ -588,6 +585,6 @@ export default inject(({ auth, infoPanelStore }) => { showText, - infoPanelIsVisible: infoPanelIsVisible, + infoPanelIsVisible, }; })(observer(Section)); diff --git a/packages/asc-web-common/components/Section/sub-components/info-panel-header.js b/packages/asc-web-common/components/Section/sub-components/info-panel-header.js index 224cbdeff1..d971af250f 100644 --- a/packages/asc-web-common/components/Section/sub-components/info-panel-header.js +++ b/packages/asc-web-common/components/Section/sub-components/info-panel-header.js @@ -51,9 +51,11 @@ const StyledInfoPanelToggleWrapper = styled.div` `; StyledInfoPanelToggleWrapper.defaultProps = { theme: Base }; -const SubInfoPanelHeader = ({ children, closeInfoPanel }) => { +const SubInfoPanelHeader = ({ children, setIsVisible }) => { const content = children?.props?.children; + const closeInfoPanel = () => setIsVisible(false); + return ( @@ -91,10 +93,7 @@ SubInfoPanelHeader.defaultProps = { theme: Base }; SubInfoPanelHeader.displayName = "SubInfoPanelHeader"; -export default inject(({ infoPanelStore }) => { - let closeInfoPanel = () => {}; - if (infoPanelStore) { - closeInfoPanel = () => infoPanelStore.setIsVisible(false); - } - return { closeInfoPanel }; +export default inject(({ auth }) => { + const { setIsVisible } = auth.infoPanelStore; + return { setIsVisible }; })(observer(SubInfoPanelHeader)); diff --git a/packages/asc-web-common/components/Section/sub-components/info-panel.js b/packages/asc-web-common/components/Section/sub-components/info-panel.js index 8cb0290bd1..d6ebde9cc4 100644 --- a/packages/asc-web-common/components/Section/sub-components/info-panel.js +++ b/packages/asc-web-common/components/Section/sub-components/info-panel.js @@ -182,15 +182,8 @@ StyledInfoPanelWrapper.defaultProps = { theme: Base }; StyledInfoPanel.defaultProps = { theme: Base }; InfoPanel.defaultProps = { theme: Base }; -export default inject(({ infoPanelStore }) => { - let isVisible = false; - let setIsVisible = () => {}; - - if (infoPanelStore) { - isVisible = infoPanelStore.isVisible; - setIsVisible = infoPanelStore.setIsVisible; - } - +export default inject(({ auth }) => { + const { isVisible, setIsVisible } = auth.infoPanelStore; return { isVisible, setIsVisible, diff --git a/packages/asc-web-common/store/AuthStore.js b/packages/asc-web-common/store/AuthStore.js index d0b8616f61..54f8dd9631 100644 --- a/packages/asc-web-common/store/AuthStore.js +++ b/packages/asc-web-common/store/AuthStore.js @@ -6,6 +6,7 @@ import ModuleStore from "./ModuleStore"; import SettingsStore from "./SettingsStore"; import UserStore from "./UserStore"; import TfaStore from "./TfaStore"; +import InfoPanelStore from "./InfoPanelStore"; import { logout as logoutDesktop, desktopConstants } from "../desktop"; import { combineUrl, isAdmin } from "../utils"; import isEmpty from "lodash/isEmpty"; @@ -17,6 +18,7 @@ class AuthStore { moduleStore = null; settingsStore = null; tfaStore = null; + infoPanelStore = null; isLoading = false; version = null; @@ -29,6 +31,7 @@ class AuthStore { this.moduleStore = new ModuleStore(); this.settingsStore = new SettingsStore(); this.tfaStore = new TfaStore(); + this.infoPanelStore = new InfoPanelStore(); makeAutoObservable(this); } diff --git a/products/ASC.Files/Client/src/store/InfoPanelStore.js b/packages/asc-web-common/store/InfoPanelStore.js similarity index 100% rename from products/ASC.Files/Client/src/store/InfoPanelStore.js rename to packages/asc-web-common/store/InfoPanelStore.js diff --git a/packages/asc-web-components/drag-and-drop/get-files-from-event.js b/packages/asc-web-components/drag-and-drop/get-files-from-event.js new file mode 100644 index 0000000000..3e86484a38 --- /dev/null +++ b/packages/asc-web-components/drag-and-drop/get-files-from-event.js @@ -0,0 +1,190 @@ +function toFileWithPath(file, path) { + if (typeof file?.path === "string") return file; + + // on electron, path is already set to the absolute path + const { webkitRelativePath } = file; + Object.defineProperty(file, "path", { + value: + typeof path === "string" + ? path + : // If is set, + // the File will have a {webkitRelativePath} property + // https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/webkitdirectory + typeof webkitRelativePath === "string" && webkitRelativePath.length > 0 + ? webkitRelativePath + : file.name, + }); + + return file; +} + +const FILES_TO_IGNORE = [ + // Thumbnail cache files for macOS and Windows + ".DS_Store", + "Thumbs.db", // Windows +]; +/** + * Convert a DragEvent's DataTrasfer object to a list of File objects + * NOTE: If some of the items are folders, + * everything will be flattened and placed in the same list but the paths will be kept as a {path} property. + * @param evt + */ +export default async function getFilesFromEvent(evt) { + return isDragEvt(evt) && evt.dataTransfer + ? getDataTransferFiles(evt.dataTransfer, evt.type) + : getInputFiles(evt); +} + +function isDragEvt(value) { + return !!value.dataTransfer; +} + +function getInputFiles(evt) { + const files = isInput(evt.target) + ? evt.target.files + ? fromList(evt.target.files) + : [] + : []; + return files.map((file) => toFileWithPath(file)); +} + +function isInput(value) { + return value !== null; +} + +async function getDataTransferFiles(dt, type) { + // IE11 does not support dataTransfer.items + // See https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/items#Browser_compatibility + if (dt.items) { + const items = fromList(dt.items).filter((item) => item.kind === "file"); + // According to https://html.spec.whatwg.org/multipage/dnd.html#dndevents, + // only 'dragstart' and 'drop' has access to the data (source node) + if (type !== "drop") { + return items; + } + const files = await Promise.all(items.map(toFilePromises)); + return noIgnoredFiles(flatten(files)); + } + return noIgnoredFiles(fromList(dt.files).map((file) => toFileWithPath(file))); +} + +function noIgnoredFiles(files) { + return files.filter((file) => FILES_TO_IGNORE.indexOf(file.name) === -1); +} + +// IE11 does not support Array.from() +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from#Browser_compatibility +// https://developer.mozilla.org/en-US/docs/Web/API/FileList +// https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItemList +function fromList(items) { + const files = []; + // tslint:disable: prefer-for-of + for (let i = 0; i < items.length; i++) { + const file = items[i]; + files.push(file); + } + return files; +} + +// https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItem +function toFilePromises(item) { + if (typeof item.webkitGetAsEntry !== "function") { + return fromDataTransferItem(item); + } + const entry = item.webkitGetAsEntry(); + // Safari supports dropping an image node from a different window and can be retrieved using + // the DataTransferItem.getAsFile() API + // NOTE: FileSystemEntry.file() throws if trying to get the file + if (entry && entry.isDirectory) { + return fromDirEntry(entry); + } + return fromDataTransferItem(item); +} + +function flatten(items) { + return items.reduce( + (acc, files) => [ + ...acc, + ...(Array.isArray(files) ? flatten(files) : [files]), + ], + [] + ); +} + +function fromDataTransferItem(item) { + const file = item.getAsFile(); + if (!file) { + return Promise.reject(`${item} is not a File`); + } + const fwp = toFileWithPath(file); + return Promise.resolve(fwp); +} + +// https://developer.mozilla.org/en-US/docs/Web/API/FileSystemEntry +async function fromEntry(entry) { + return entry.isDirectory ? fromDirEntry(entry) : fromFileEntry(entry); +} + +// https://developer.mozilla.org/en-US/docs/Web/API/FileSystemDirectoryEntry +function fromDirEntry(entry) { + const reader = entry.createReader(); + return new Promise((resolve, reject) => { + const entries = []; + let empty = true; + function readEntries() { + // https://developer.mozilla.org/en-US/docs/Web/API/FileSystemDirectoryEntry/createReader + // https://developer.mozilla.org/en-US/docs/Web/API/FileSystemDirectoryReader/readEntries + reader.readEntries( + async (batch) => { + if (!batch.length) { + // Done reading directory + try { + const files = await Promise.all(entries); + if (empty) { + files.push([createEmptyDirFile(entry)]); + } + resolve(files); + } catch (err) { + reject(err); + } + } else { + const items = Promise.all(batch.map(fromEntry)); + entries.push(items); + // Continue reading + empty = false; + readEntries(); + } + }, + (err) => { + reject(err); + } + ); + } + readEntries(); + }); +} + +function createEmptyDirFile(entry) { + const file = new File([], entry.name); + const fwp = toFileWithPath(file, entry.fullPath + "/"); + + Object.defineProperty(fwp, "isEmptyDirectory", { + value: true, + }); + return fwp; +} + +// https://developer.mozilla.org/en-US/docs/Web/API/FileSystemFileEntry +async function fromFileEntry(entry) { + return new Promise((resolve, reject) => { + entry.file( + (file) => { + const fwp = toFileWithPath(file, entry.fullPath); + resolve(fwp); + }, + (err) => { + reject(err); + } + ); + }); +} diff --git a/packages/asc-web-components/drag-and-drop/index.js b/packages/asc-web-components/drag-and-drop/index.js index 4d14beba7c..658e964d3d 100644 --- a/packages/asc-web-components/drag-and-drop/index.js +++ b/packages/asc-web-components/drag-and-drop/index.js @@ -1,5 +1,6 @@ -import React from "react"; +import React, { useCallback } from "react"; import { useDropzone } from "react-dropzone"; +import getFilesFromEvent from "./get-files-from-event"; import PropTypes from "prop-types"; import StyledDragAndDrop from "./styled-drag-and-drop"; @@ -8,7 +9,7 @@ const DragAndDrop = (props) => { const { isDropZone, children, dragging, className, ...rest } = props; const classNameProp = className ? className : ""; - const onDrop = (acceptedFiles, array) => { + const onDrop = (acceptedFiles) => { acceptedFiles.length && props.onDrop && props.onDrop(acceptedFiles); }; @@ -25,6 +26,7 @@ const DragAndDrop = (props) => { onDrop, onDragOver, onDragLeave, + getFilesFromEvent: (event) => getFilesFromEvent(event), }); return ( diff --git a/packages/asc-web-components/package.json b/packages/asc-web-components/package.json index 9d7a877511..6db303f0b0 100644 --- a/packages/asc-web-components/package.json +++ b/packages/asc-web-components/package.json @@ -30,7 +30,7 @@ "react-countdown": "2.3.2", "react-custom-scrollbars": "^4.2.1", "react-device-detect": "^1.17.0", - "react-dropzone": "^11.2.4", + "react-dropzone": "^11.4.2", "react-lifecycles-compat": "^3.0.4", "react-onclickoutside": "^6.11.2", "react-svg": "^12.1.0", diff --git a/packages/asc-web-components/toggle-button/index.js b/packages/asc-web-components/toggle-button/index.js index ecd8c9f800..a3015f4d84 100644 --- a/packages/asc-web-components/toggle-button/index.js +++ b/packages/asc-web-components/toggle-button/index.js @@ -78,7 +78,7 @@ class ToggleButton extends Component { //console.log("ToggleButton render"); return ( - + { - const { t, dragging, setDragging, startUpload } = this.props; + const { + t, + dragging, + setDragging, + startUpload, + uploadEmptyFolders, + } = this.props; dragging && setDragging(false); - startUpload(files, uploadToFolder, t); + + const emptyFolders = files.filter((f) => f.isEmptyDirectory); + + if (emptyFolders.length > 0) { + uploadEmptyFolders(emptyFolders, uploadToFolder).then(() => { + const onlyFiles = files.filter((f) => !f.isEmptyDirectory); + if (onlyFiles.length > 0) startUpload(onlyFiles, uploadToFolder, t); + }); + } else { + startUpload(files, uploadToFolder, t); + } }; onDrop = (items) => { @@ -247,6 +263,7 @@ export default function withFileActions(WrappedFileItem) { onSelectItem, setNewBadgeCount, openFileAction, + uploadEmptyFolders, } = filesActionsStore; const { setSharingPanelVisible } = dialogsStore; const { @@ -315,6 +332,7 @@ export default function withFileActions(WrappedFileItem) { dragging, setDragging, startUpload, + uploadEmptyFolders, draggable, setTooltipPosition, setStartDrag, diff --git a/products/ASC.Files/Client/src/components/Article/Body/Items.js b/products/ASC.Files/Client/src/components/Article/Body/Items.js index 0ae45ac58d..65f8504126 100644 --- a/products/ASC.Files/Client/src/components/Article/Body/Items.js +++ b/products/ASC.Files/Client/src/components/Article/Body/Items.js @@ -27,6 +27,7 @@ const Item = ({ onBadgeClick, showDragItems, startUpload, + uploadEmptyFolders, setDragging, }) => { const [isDragActive, setIsDragActive] = React.useState(false); @@ -41,9 +42,18 @@ const Item = ({ const onDropZoneUpload = React.useCallback( (files, uploadToFolder) => { dragging && setDragging(false); - startUpload(files, uploadToFolder, t); + const emptyFolders = files.filter((f) => f.isEmptyDirectory); + + if (emptyFolders.length > 0) { + uploadEmptyFolders(emptyFolders, uploadToFolder).then(() => { + const onlyFiles = files.filter((f) => !f.isEmptyDirectory); + if (onlyFiles.length > 0) startUpload(onlyFiles, uploadToFolder, t); + }); + } else { + startUpload(files, uploadToFolder, t); + } }, - [t, dragging, setDragging, startUpload] + [t, dragging, setDragging, startUpload, uploadEmptyFolders] ); const onDrop = React.useCallback( @@ -118,6 +128,7 @@ const Items = ({ dragging, setDragging, startUpload, + uploadEmptyFolders, isAdmin, myId, @@ -273,6 +284,7 @@ const Items = ({ t={t} setDragging={setDragging} startUpload={startUpload} + uploadEmptyFolders={uploadEmptyFolders} item={item} dragging={dragging} getFolderIcon={getFolderIcon} @@ -301,6 +313,7 @@ const Items = ({ showText, setDragging, startUpload, + uploadEmptyFolders, ] ); @@ -337,7 +350,7 @@ export default inject( } = treeFoldersStore; const { id } = selectedFolderStore; - + const { moveDragItems, uploadEmptyFolders } = filesActionsStore; return { isAdmin: auth.isAdmin, myId: myFolderId, @@ -352,8 +365,9 @@ export default inject( dragging, setDragging, setStartDrag, - moveDragItems: filesActionsStore.moveDragItems, + moveDragItems, startUpload, + uploadEmptyFolders, }; } )(withTranslation(["Home", "Common", "Translations"])(observer(Items))); diff --git a/products/ASC.Files/Client/src/components/EditingWrapperComponent.js b/products/ASC.Files/Client/src/components/EditingWrapperComponent.js index 8f27907435..eb79b23068 100644 --- a/products/ASC.Files/Client/src/components/EditingWrapperComponent.js +++ b/products/ASC.Files/Client/src/components/EditingWrapperComponent.js @@ -198,6 +198,8 @@ const EditingWrapperComponent = (props) => { const [CancelIconIsHovered, setIsHoveredCancel] = useState(false); const [isLoading, setIsLoading] = useState(false); + const inputRef = React.useRef(null); + const onKeyUpUpdateItem = (e) => { if (isLoading) return; @@ -228,6 +230,8 @@ const EditingWrapperComponent = (props) => { ) return false; + if (!document.hasFocus() && inputRef.current === e.target) return false; + !passwordEntryProcess && onClickUpdateItem(e, false); }; @@ -256,6 +260,7 @@ const EditingWrapperComponent = (props) => { isDisabled={isLoading} data-itemid={itemId} withBorder={!isTable} + forwardedRef={inputRef} /> )} {!isUpdatingRowItem && ( diff --git a/products/ASC.Files/Client/src/components/panels/SelectFileDialog/AsideView.js b/products/ASC.Files/Client/src/components/panels/SelectFileDialog/AsideView.js index 9f67e52d8b..f012c0ba16 100644 --- a/products/ASC.Files/Client/src/components/panels/SelectFileDialog/AsideView.js +++ b/products/ASC.Files/Client/src/components/panels/SelectFileDialog/AsideView.js @@ -33,92 +33,86 @@ const SelectFileDialogAsideView = ({ maxInputWidth, newFilter, }) => { - const onMouseEvent = (event) => { - event.stopPropagation(); - }; - return ( -
- - {dialogName} - - -
-
- - {t("Translations:FolderSelection")} - + + {dialogName} + + +
+
+ + {t("Translations:FolderSelection")} + - + - - {filesListTitle} - -
-
- + {filesListTitle} + +
+
+ +
+
+ {footer} +
+
-
- {footer} -
-
- - - -
+
+ + + ); }; export default SelectFileDialogAsideView; diff --git a/products/ASC.Files/Client/src/components/panels/SelectionPanel/SelectionPanelBody.js b/products/ASC.Files/Client/src/components/panels/SelectionPanel/SelectionPanelBody.js index 26a66a0b30..79859fbafc 100644 --- a/products/ASC.Files/Client/src/components/panels/SelectionPanel/SelectionPanelBody.js +++ b/products/ASC.Files/Client/src/components/panels/SelectionPanel/SelectionPanelBody.js @@ -47,119 +47,109 @@ const SelectionPanelBody = ({ isDisableButton, parentId, }) => { - const onMouseEvent = (event) => { - event.stopPropagation(); - }; - return ( -
- - {dialogName} - - -
-
- - {t("Common:Documents")} - + + {dialogName} + + +
+
+ + {t("Common:Documents")} + - {folderId && resultingFolderTree ? ( - + ) : ( + + )} +
+
+ <> +
+ {header} + + - ) : ( - - )} -
-
- <> -
- {header} - - - {folderSelection - ? t("FolderContents", { folderTitle }) - : filesListTitle} - -
- - - -
- -
-
{footer}
- -
-
+ + + +
+ +
+
{footer}
+ +
+
- - - -
+
+
+
+
); }; diff --git a/products/ASC.Files/Client/src/pages/FormGallery/Header.js b/products/ASC.Files/Client/src/pages/FormGallery/Header.js index b2b256e1ef..a853545deb 100644 --- a/products/ASC.Files/Client/src/pages/FormGallery/Header.js +++ b/products/ASC.Files/Client/src/pages/FormGallery/Header.js @@ -58,9 +58,8 @@ const SectionHeaderContent = (props) => { ); }; -export default inject(({ infoPanelStore }) => { - const { toggleIsVisible, isVisible } = infoPanelStore; - +export default inject(({ auth }) => { + const { toggleIsVisible, isVisible } = auth.infoPanelStore; return { toggleInfoPanel: toggleIsVisible, isInfoPanelVisible: isVisible, diff --git a/products/ASC.Files/Client/src/pages/FormGallery/StyledGallery.js b/products/ASC.Files/Client/src/pages/FormGallery/StyledGallery.js index ad63fae745..92a115e99a 100644 --- a/products/ASC.Files/Client/src/pages/FormGallery/StyledGallery.js +++ b/products/ASC.Files/Client/src/pages/FormGallery/StyledGallery.js @@ -56,6 +56,11 @@ const StyledContainer = styled.div` const StyledInfoPanelToggleWrapper = styled.div` margin-left: auto; + display: ${(props) => (props.isInfoPanelVisible ? "none" : "flex")}; + @media ${tablet} { + display: none; + } + .info-panel-toggle-bg { height: 32px; width: 32px; diff --git a/products/ASC.Files/Client/src/pages/FormGallery/TilesView/sub-components/Tile.js b/products/ASC.Files/Client/src/pages/FormGallery/TilesView/sub-components/Tile.js index 4dfb1f5a22..d265a49ef9 100644 --- a/products/ASC.Files/Client/src/pages/FormGallery/TilesView/sub-components/Tile.js +++ b/products/ASC.Files/Client/src/pages/FormGallery/TilesView/sub-components/Tile.js @@ -208,20 +208,18 @@ Tile.defaultProps = { item: {}, }; -export default inject( - ({ filesStore, settingsStore, infoPanelStore }, { item }) => { - const { gallerySelected, setGallerySelected } = filesStore; - const { getIcon } = settingsStore; - const { isVisible, setIsVisible } = infoPanelStore; +export default inject(({ filesStore, settingsStore, auth }, { item }) => { + const { gallerySelected, setGallerySelected } = filesStore; + const { getIcon } = settingsStore; + const { isVisible, setIsVisible } = auth.infoPanelStore; - const isSelected = item.id === gallerySelected?.id; + const isSelected = item.id === gallerySelected?.id; - return { - isSelected, - setGallerySelected, - getIcon, - setIsInfoPanelVisible: setIsVisible, - isInfoPanelVisible: isVisible, - }; - } -)(withTranslation(["FormGallery", "Common"])(withRouter(observer(Tile)))); + return { + isSelected, + setGallerySelected, + getIcon, + setIsInfoPanelVisible: setIsVisible, + isInfoPanelVisible: isVisible, + }; +})(withTranslation(["FormGallery", "Common"])(withRouter(observer(Tile)))); diff --git a/products/ASC.Files/Client/src/pages/Home/InfoPanel/Body/GalleryItem.js b/products/ASC.Files/Client/src/pages/Home/InfoPanel/Body/GalleryItem.js index 8cdf650624..bc0c0acee3 100644 --- a/products/ASC.Files/Client/src/pages/Home/InfoPanel/Body/GalleryItem.js +++ b/products/ASC.Files/Client/src/pages/Home/InfoPanel/Body/GalleryItem.js @@ -56,7 +56,7 @@ const SingleItem = (props) => {
{t("Home:ByLastModifiedDate")} - {parseAndFormatDate(selectedItem.updatedAt)} + {parseAndFormatDate(selectedItem.attributes.updatedAt)}
diff --git a/products/ASC.Files/Client/src/pages/Home/InfoPanel/Body/index.js b/products/ASC.Files/Client/src/pages/Home/InfoPanel/Body/index.js index 046afd2ec2..628e5105f4 100644 --- a/products/ASC.Files/Client/src/pages/Home/InfoPanel/Body/index.js +++ b/products/ASC.Files/Client/src/pages/Home/InfoPanel/Body/index.js @@ -69,7 +69,11 @@ const InfoPanelBodyContent = ({ ) : ( - + ) ) : ( diff --git a/products/ASC.Files/Client/src/pages/Home/Section/Body/RowsView/FilesRowContainer.js b/products/ASC.Files/Client/src/pages/Home/Section/Body/RowsView/FilesRowContainer.js index 75c5dfa0f6..2ac612c471 100644 --- a/products/ASC.Files/Client/src/pages/Home/Section/Body/RowsView/FilesRowContainer.js +++ b/products/ASC.Files/Client/src/pages/Home/Section/Body/RowsView/FilesRowContainer.js @@ -97,10 +97,9 @@ const FilesRowContainer = ({ ); }; -export default inject(({ filesStore, infoPanelStore }) => { +export default inject(({ filesStore, auth }) => { const { filesList, viewAs, setViewAs } = filesStore; - - const { isVisible: infoPanelVisible } = infoPanelStore; + const { isVisible: infoPanelVisible } = auth.infoPanelStore; return { filesList, viewAs, diff --git a/products/ASC.Files/Client/src/pages/Home/Section/Body/TableView/TableContainer.js b/products/ASC.Files/Client/src/pages/Home/Section/Body/TableView/TableContainer.js index 66368f3d51..a22870eb2b 100644 --- a/products/ASC.Files/Client/src/pages/Home/Section/Body/TableView/TableContainer.js +++ b/products/ASC.Files/Client/src/pages/Home/Section/Body/TableView/TableContainer.js @@ -163,8 +163,8 @@ const Table = ({ ); }; -export default inject(({ filesStore, infoPanelStore, auth }) => { - const { isVisible: infoPanelVisible } = infoPanelStore; +export default inject(({ filesStore, auth }) => { + const { isVisible: infoPanelVisible } = auth.infoPanelStore; const { filesList, diff --git a/products/ASC.Files/Client/src/pages/Home/Section/Body/TableView/TableHeader.js b/products/ASC.Files/Client/src/pages/Home/Section/Body/TableView/TableHeader.js index 76aaa0b488..5eb7d79b34 100644 --- a/products/ASC.Files/Client/src/pages/Home/Section/Body/TableView/TableHeader.js +++ b/products/ASC.Files/Client/src/pages/Home/Section/Body/TableView/TableHeader.js @@ -228,14 +228,8 @@ class FilesTableHeader extends React.Component { } export default inject( - ({ - auth, - filesStore, - selectedFolderStore, - treeFoldersStore, - infoPanelStore, - }) => { - const { isVisible: infoPanelVisible } = infoPanelStore; + ({ auth, filesStore, selectedFolderStore, treeFoldersStore }) => { + const { isVisible: infoPanelVisible } = auth.infoPanelStore; const { isHeaderChecked, diff --git a/products/ASC.Files/Client/src/pages/Home/Section/Body/TableView/TableRow.js b/products/ASC.Files/Client/src/pages/Home/Section/Body/TableView/TableRow.js index 2acda84325..6f7b5d2872 100644 --- a/products/ASC.Files/Client/src/pages/Home/Section/Body/TableView/TableRow.js +++ b/products/ASC.Files/Client/src/pages/Home/Section/Body/TableView/TableRow.js @@ -62,10 +62,15 @@ const StyledTableRow = styled(TableRow)` .table-container_file-name-cell { margin-left: -24px; padding-left: 24px; + z-index: 1; } .table-container_row-context-menu-wrapper { margin-right: -20px; padding-right: 18px; + + position: relative !important; + + z-index: 1; } } `} diff --git a/products/ASC.Files/Client/src/pages/Home/Section/Filter/index.js b/products/ASC.Files/Client/src/pages/Home/Section/Filter/index.js index cb425642a5..fdb96bfca9 100644 --- a/products/ASC.Files/Client/src/pages/Home/Section/Filter/index.js +++ b/products/ASC.Files/Client/src/pages/Home/Section/Filter/index.js @@ -351,13 +351,7 @@ const SectionFilterContent = ({ }; export default inject( - ({ - auth, - filesStore, - treeFoldersStore, - selectedFolderStore, - infoPanelStore, - }) => { + ({ auth, filesStore, treeFoldersStore, selectedFolderStore }) => { const { fetchFiles, filter, @@ -382,7 +376,7 @@ export default inject( authorType) && !(treeFoldersStore.isPrivacyFolder && isMobile); - const { isVisible: infoPanelVisible } = infoPanelStore; + const { isVisible: infoPanelVisible } = auth.infoPanelStore; return { customNames, diff --git a/products/ASC.Files/Client/src/pages/Home/Section/Header/index.js b/products/ASC.Files/Client/src/pages/Home/Section/Header/index.js index f9f9b44f11..2d5afe39bf 100644 --- a/products/ASC.Files/Client/src/pages/Home/Section/Header/index.js +++ b/products/ASC.Files/Client/src/pages/Home/Section/Header/index.js @@ -442,7 +442,6 @@ export default inject( treeFoldersStore, filesActionsStore, settingsStore, - infoPanelStore, }) => { const { setSelected, @@ -483,7 +482,7 @@ export default inject( backToParentFolder, } = filesActionsStore; - const { toggleIsVisible, isVisible } = infoPanelStore; + const { toggleIsVisible, isVisible } = auth.infoPanelStore; return { showText: auth.settingsStore.showText, diff --git a/products/ASC.Files/Client/src/pages/Home/index.js b/products/ASC.Files/Client/src/pages/Home/index.js index 942e79db06..0bfa841106 100644 --- a/products/ASC.Files/Client/src/pages/Home/index.js +++ b/products/ASC.Files/Client/src/pages/Home/index.js @@ -205,9 +205,24 @@ class PureHome extends React.Component { }; onDrop = (files, uploadToFolder) => { - const { t, startUpload, setDragging, dragging } = this.props; + const { + t, + startUpload, + setDragging, + dragging, + uploadEmptyFolders, + } = this.props; dragging && setDragging(false); - startUpload(files, uploadToFolder, t); + const emptyFolders = files.filter((f) => f.isEmptyDirectory); + + if (emptyFolders.length > 0) { + uploadEmptyFolders(emptyFolders, uploadToFolder).then(() => { + const onlyFiles = files.filter((f) => !f.isEmptyDirectory); + if (onlyFiles.length > 0) startUpload(onlyFiles, uploadToFolder, t); + }); + } else { + startUpload(files, uploadToFolder, t); + } }; showOperationToast = (type, qty, title) => { @@ -395,6 +410,7 @@ export default inject( treeFoldersStore, mediaViewerDataStore, settingsStore, + filesActionsStore, }) => { const { secondaryProgressDataStore, @@ -453,6 +469,8 @@ export default inject( converted, } = uploadDataStore; + const { uploadEmptyFolders } = filesActionsStore; + const selectionLength = isProgressFinished ? selection.length : null; const selectionTitle = isProgressFinished ? filesStore.selectionTitle @@ -511,6 +529,7 @@ export default inject( setUploadPanelVisible, setSelections, startUpload, + uploadEmptyFolders, isHeaderVisible: auth.settingsStore.isHeaderVisible, setHeaderVisible: auth.settingsStore.setHeaderVisible, personal: auth.settingsStore.personal, diff --git a/products/ASC.Files/Client/src/store/ContextOptionsStore.js b/products/ASC.Files/Client/src/store/ContextOptionsStore.js index 68fabcbf4d..7b500678c7 100644 --- a/products/ASC.Files/Client/src/store/ContextOptionsStore.js +++ b/products/ASC.Files/Client/src/store/ContextOptionsStore.js @@ -21,7 +21,6 @@ class ContextOptionsStore { uploadDataStore; versionHistoryStore; settingsStore; - infoPanelStore; filesSettingsStore; constructor( @@ -33,8 +32,7 @@ class ContextOptionsStore { treeFoldersStore, uploadDataStore, versionHistoryStore, - settingsStore, - infoPanelStore + settingsStore ) { makeAutoObservable(this); this.authStore = authStore; @@ -46,7 +44,6 @@ class ContextOptionsStore { this.uploadDataStore = uploadDataStore; this.versionHistoryStore = versionHistoryStore; this.settingsStore = settingsStore; - this.infoPanelStore = infoPanelStore; } onOpenFolder = (item) => { @@ -338,7 +335,7 @@ class ContextOptionsStore { }; onShowInfoPanel = () => { - const { setIsVisible } = this.infoPanelStore; + const { setIsVisible } = this.authStore.infoPanelStore; setIsVisible(true); }; diff --git a/products/ASC.Files/Client/src/store/FilesActionsStore.js b/products/ASC.Files/Client/src/store/FilesActionsStore.js index 60ef587158..8d26b758b9 100644 --- a/products/ASC.Files/Client/src/store/FilesActionsStore.js +++ b/products/ASC.Files/Client/src/store/FilesActionsStore.js @@ -10,6 +10,7 @@ import { markAsRead, removeFiles, removeShareFiles, + createFolder, } from "@appserver/common/api/files"; import { ConflictResolveType, @@ -34,7 +35,6 @@ class FilesActionStore { settingsStore; dialogsStore; mediaViewerDataStore; - infoPanelStore; constructor( authStore, @@ -44,8 +44,7 @@ class FilesActionStore { selectedFolderStore, settingsStore, dialogsStore, - mediaViewerDataStore, - infoPanelStore + mediaViewerDataStore ) { makeAutoObservable(this); this.authStore = authStore; @@ -55,7 +54,6 @@ class FilesActionStore { this.selectedFolderStore = selectedFolderStore; this.settingsStore = settingsStore; this.dialogsStore = dialogsStore; - this.infoPanelStore = infoPanelStore; this.mediaViewerDataStore = mediaViewerDataStore; } @@ -108,6 +106,76 @@ class FilesActionStore { }); }; + convertToTree = (folders) => { + let result = []; + let level = { result }; + try { + folders.forEach((folder) => { + folder.path + .split("/") + .filter((name) => name !== "") + .reduce((r, name, i, a) => { + if (!r[name]) { + r[name] = { result: [] }; + r.result.push({ name, children: r[name].result }); + } + + return r[name]; + }, level); + }); + } catch (e) { + console.error("convertToTree", e); + } + return result; + }; + + createFolderTree = async (treeList, parentFolderId) => { + if (!treeList || !treeList.length) return; + + for (let i = 0; i < treeList.length; i++) { + const treeNode = treeList[i]; + + // console.log( + // `createFolderTree parent id = ${parentFolderId} name '${treeNode.name}': `, + // treeNode.children + // ); + + const folder = await createFolder(parentFolderId, treeNode.name); + const parentId = folder.id; + + if (treeNode.children.length == 0) continue; + + await this.createFolderTree(treeNode.children, parentId); + } + }; + + uploadEmptyFolders = async (emptyFolders, folderId) => { + //console.log("uploadEmptyFolders", emptyFolders, folderId); + + const { secondaryProgressDataStore } = this.uploadDataStore; + const { + setSecondaryProgressBarData, + clearSecondaryProgressData, + } = secondaryProgressDataStore; + + const toFolderId = folderId ? folderId : this.selectedFolderStore.id; + + setSecondaryProgressBarData({ + icon: "file", + visible: true, + percent: 0, + label: "", + alert: false, + }); + + const tree = this.convertToTree(emptyFolders); + await this.createFolderTree(tree, toFolderId); + + this.updateCurrentFolder(null, [folderId]); + + setTimeout(() => clearSecondaryProgressData(), TIMEOUT); + }; + deleteAction = async ( translations, newSelection = null, @@ -854,8 +922,6 @@ class FilesActionStore { setDeleteDialogVisible, } = this.dialogsStore; - const { toggleIsVisible } = this.infoPanelStore; - switch (option) { case "share": if (!this.isAvailableOption("share")) return null; diff --git a/products/ASC.Files/Client/src/store/FilesStore.js b/products/ASC.Files/Client/src/store/FilesStore.js index 5f3aeefba4..325564c9c7 100644 --- a/products/ASC.Files/Client/src/store/FilesStore.js +++ b/products/ASC.Files/Client/src/store/FilesStore.js @@ -906,7 +906,7 @@ class FilesStore { "separator2", "delete", ]); - if (isThirdPartyFolder) { + if (isThirdPartyItem) { fileOptions = this.removeOptions(fileOptions, ["rename"]); } } diff --git a/products/ASC.Files/Client/src/store/index.js b/products/ASC.Files/Client/src/store/index.js index 033745a0c0..41ed33cbb4 100644 --- a/products/ASC.Files/Client/src/store/index.js +++ b/products/ASC.Files/Client/src/store/index.js @@ -16,7 +16,6 @@ import selectFolderDialogStore from "./SelectFolderDialogStore"; import ContextOptionsStore from "./ContextOptionsStore"; import HotkeyStore from "./HotkeyStore"; import store from "studio/store"; -import InfoPanelStore from "./InfoPanelStore"; import selectFileDialogStore from "./SelectFileDialogStore"; const selectedFolderStore = new SelectedFolderStore(store.auth.settingsStore); @@ -56,8 +55,6 @@ const uploadDataStore = new UploadDataStore( settingsStore ); -const infoPanelStore = new InfoPanelStore(); - const filesActionsStore = new FilesActionsStore( store.auth, uploadDataStore, @@ -66,8 +63,7 @@ const filesActionsStore = new FilesActionsStore( selectedFolderStore, settingsStore, dialogsStore, - mediaViewerDataStore, - infoPanelStore + mediaViewerDataStore ); const versionHistoryStore = new VersionHistoryStore(filesStore); @@ -80,8 +76,7 @@ const contextOptionsStore = new ContextOptionsStore( treeFoldersStore, uploadDataStore, versionHistoryStore, - settingsStore, - infoPanelStore + settingsStore ); const hotkeyStore = new HotkeyStore( @@ -106,7 +101,6 @@ const stores = { selectFolderDialogStore, contextOptionsStore, hotkeyStore, - infoPanelStore, selectFileDialogStore, }; diff --git a/products/ASC.People/Client/public/locales/az/Profile.json b/products/ASC.People/Client/public/locales/az/Profile.json index 9f5442859b..791a402f35 100644 --- a/products/ASC.People/Client/public/locales/az/Profile.json +++ b/products/ASC.People/Client/public/locales/az/Profile.json @@ -22,5 +22,5 @@ "Subscriptions": "Abunəliklər", "SystemTheme": "Sistem temasından istifadə edin", "TfaLoginSettings": "Daxilolma sazlamaları", - "TwoFactorDescription": "Bütün istifadəçilər üçün ikili audentifikasiya (kod generasiyası ilə) inzibatçı tərəfindən yandırıldı." + "TwoFactorDescription": "Bütün istifadəçilər üçün ikili autentifikasiya (kod generasiyası ilə) inzibatçı tərəfindən yandırıldı." } diff --git a/products/ASC.People/Client/public/locales/az/ResetApplicationDialog.json b/products/ASC.People/Client/public/locales/az/ResetApplicationDialog.json index 048d94b683..fa0c1f8a94 100644 --- a/products/ASC.People/Client/public/locales/az/ResetApplicationDialog.json +++ b/products/ASC.People/Client/public/locales/az/ResetApplicationDialog.json @@ -1,4 +1,4 @@ { - "ResetApplicationDescription": "Audentifikasiya üçün tətbiq sıfırlanacaq.", + "ResetApplicationDescription": "Autentifikasiya üçün tətbiq sıfırlanacaq.", "ResetApplicationTitle": "Tətbiq konfiqurasiyasını sıfırla" } diff --git a/web/ASC.Web.Client/public/locales/az/Errors.json b/web/ASC.Web.Client/public/locales/az/Errors.json index 82741688ce..dfd99ef648 100644 --- a/web/ASC.Web.Client/public/locales/az/Errors.json +++ b/web/ASC.Web.Client/public/locales/az/Errors.json @@ -3,7 +3,7 @@ "Error403Text": "Təəssüf ki, giriş rədd edilmişdir.", "Error404Text": "Təəssüf ki, resurs tapıla bilmir.", "ErrorEmptyResponse": "Boş cavab", - "ErrorInvalidHeader": "Yalnış e-poçt ünvanı və ya vaxtı bitmiş keçid", + "ErrorInvalidHeader": "Yanlış e-poçt ünvanı və ya vaxtı bitmiş keçid", "ErrorInvalidText": "10 saniyədə <1>giriş səhifəsinə yönləndiriləcəksiniz", "ErrorOfflineText": "İnternet bağlantısı tapılmadı." } diff --git a/web/ASC.Web.Client/public/locales/az/Settings.json b/web/ASC.Web.Client/public/locales/az/Settings.json index 707e6d7f19..26e3d2de16 100644 --- a/web/ASC.Web.Client/public/locales/az/Settings.json +++ b/web/ASC.Web.Client/public/locales/az/Settings.json @@ -32,7 +32,7 @@ "ChangeLogoButton": "Loqonu dəyişin", "ChangeOwner": "Portal sahibini dəyişin", "Characters": "İşarələrin {{length}}", - "ChooseOwner": "Sahibi seçinr", + "ChooseOwner": "Sahibi seçin", "ClearBackupList": "Bütün ehtiyat nüsxələri silin", "CompanyNameForCanvasLogo": "Şirkət adı", "ConfirmEmailSended": "Təsdiqləmə e-məktubu {{ownerName}} göndərilmişdir", diff --git a/web/ASC.Web.Client/src/components/Layout/index.js b/web/ASC.Web.Client/src/components/Layout/index.js index 5aafa948eb..7f821f8dcb 100644 --- a/web/ASC.Web.Client/src/components/Layout/index.js +++ b/web/ASC.Web.Client/src/components/Layout/index.js @@ -116,8 +116,12 @@ const Layout = (props) => { // height = window.screen.availHeight - correctorTabletSafari; // } // } + const isSmartBanner = + document.getElementsByClassName("smartbanner-container")[0].nodeName === + "DIV"; + const bannerHeight = isSmartBanner ? 80 : 0; - let vh = (height - 48) * 0.01; + let vh = (height - 48 - bannerHeight) * 0.01; document.documentElement.style.setProperty("--vh", `${vh}px`); setContentHeight(height); diff --git a/web/ASC.Web.Client/src/components/SmartBanner/main.css b/web/ASC.Web.Client/src/components/SmartBanner/main.css index d4404d6740..fc80dac710 100644 --- a/web/ASC.Web.Client/src/components/SmartBanner/main.css +++ b/web/ASC.Web.Client/src/components/SmartBanner/main.css @@ -15,7 +15,7 @@ line-height: 80px; font-family: Helvetica Neue, sans-serif; background: #f4f4f4; - z-index: 9998; + z-index: 100; -webkit-font-smoothing: antialiased; overflow: hidden; -webkit-text-size-adjust: none; diff --git a/web/ASC.Web.Login/public/locales/az/Login.json b/web/ASC.Web.Login/public/locales/az/Login.json index f5d6713cbd..c23322b054 100644 --- a/web/ASC.Web.Login/public/locales/az/Login.json +++ b/web/ASC.Web.Login/public/locales/az/Login.json @@ -15,7 +15,7 @@ "PasswordRecoveryTitle": "Parolun bərpa edilməsi", "Register": "Qeydiyyatdan keç", "RegisterSendButton": "Sorğunu göndər", - "RegisterTextBodyAfterDomainsList": "Qeydiyyatdan keçmək üçün, elektron poçt ünvanınıı daxil edin və Sorğunu göndər düyməsinə basın.", + "RegisterTextBodyAfterDomainsList": "Qeydiyyatdan keçmək üçün, elektron poçt ünvanını daxil edin və Sorğunu göndər düyməsinə basın.", "RegisterTextBodyBeforeDomainsList": "Elektron poçtu olan istifadəçilər üçün qeydiyyat mümkündür", "RegisterTitle": "Sorğunun qeydiyyatı", "RegistrationEmail": "Sizin qeydiyyat elektron poçtunuz", diff --git a/yarn.lock b/yarn.lock index 77593cb0b6..6583cce780 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16713,7 +16713,7 @@ react-draggable@^4.4.3: clsx "^1.1.1" prop-types "^15.6.0" -react-dropzone@^11.2.4: +react-dropzone@^11.4.2: version "11.7.1" resolved "https://registry.yarnpkg.com/react-dropzone/-/react-dropzone-11.7.1.tgz#3851bb75b26af0bf1b17ce1449fd980e643b9356" integrity sha512-zxCMwhfPy1olUEbw3FLNPLhAm/HnaYH5aELIEglRbqabizKAdHs0h+WuyOpmA+v1JXn0++fpQDdNfUagWt5hJQ==