diff options
328 files changed, 1676 insertions, 913 deletions
diff --git a/apps/comments/l10n/nb.js b/apps/comments/l10n/nb.js index a2511dc0a86..c43da655029 100644 --- a/apps/comments/l10n/nb.js +++ b/apps/comments/l10n/nb.js @@ -13,11 +13,15 @@ OC.L10N.register( "Files app plugin to add comments to files" : "Tillegg for å legge til kommentarer til filer", "Edit comment" : "Rediger kommentar", "Delete comment" : "Slett kommentar", + "Cancel edit" : "Avbryt endring", + "Post comment" : "Send kommentar", "No comments yet, start the conversation!" : "Ingen kommentarer enda, start diskusjonen!", + "No more messages" : "Ingen flere meldinger", "Retry" : "Prøv igjen", "_%n unread comment_::_%n unread comments_" : ["%n ulest kommentar","%n uleste kommentarer"], "_1 new comment_::_{unread} new comments_" : ["[uleste] nye kommentarer","{uleste} nye kommentarer"], "Comment" : "Kommentar", + "Comment deleted" : "Kommentar slettet", "You were mentioned on “{file}”, in a comment by a user that has since been deleted" : "Du ble nevnte på \"{file}\", i en kommentar av en bruker som siden har blitt slettet", "{user} mentioned you in a comment on “{file}”" : "{user} nevnte deg i en kommentar på “{file}”" }, diff --git a/apps/comments/l10n/nb.json b/apps/comments/l10n/nb.json index e219d860521..cc8a43dfa25 100644 --- a/apps/comments/l10n/nb.json +++ b/apps/comments/l10n/nb.json @@ -11,11 +11,15 @@ "Files app plugin to add comments to files" : "Tillegg for å legge til kommentarer til filer", "Edit comment" : "Rediger kommentar", "Delete comment" : "Slett kommentar", + "Cancel edit" : "Avbryt endring", + "Post comment" : "Send kommentar", "No comments yet, start the conversation!" : "Ingen kommentarer enda, start diskusjonen!", + "No more messages" : "Ingen flere meldinger", "Retry" : "Prøv igjen", "_%n unread comment_::_%n unread comments_" : ["%n ulest kommentar","%n uleste kommentarer"], "_1 new comment_::_{unread} new comments_" : ["[uleste] nye kommentarer","{uleste} nye kommentarer"], "Comment" : "Kommentar", + "Comment deleted" : "Kommentar slettet", "You were mentioned on “{file}”, in a comment by a user that has since been deleted" : "Du ble nevnte på \"{file}\", i en kommentar av en bruker som siden har blitt slettet", "{user} mentioned you in a comment on “{file}”" : "{user} nevnte deg i en kommentar på “{file}”" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/dashboard/l10n/ar.js b/apps/dashboard/l10n/ar.js index 3ab0fd1dca6..3e5b3df2de1 100644 --- a/apps/dashboard/l10n/ar.js +++ b/apps/dashboard/l10n/ar.js @@ -22,9 +22,9 @@ OC.L10N.register( "Hello" : "مرحبا", "Hello, {name}" : "مرحبا، {name} ", "Pick from Files" : "اختر من الملفات", - "Default images" : "الصور الإفتراضية", "Plain background" : "خلفية سادة", "Insert from {productName}" : "اضف من {productName}", - "Show something" : "أظهر شي ما" + "Show something" : "أظهر شي ما", + "Default images" : "الصور الإفتراضية" }, "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"); diff --git a/apps/dashboard/l10n/ar.json b/apps/dashboard/l10n/ar.json index 65588c75cae..3ee82304e08 100644 --- a/apps/dashboard/l10n/ar.json +++ b/apps/dashboard/l10n/ar.json @@ -20,9 +20,9 @@ "Hello" : "مرحبا", "Hello, {name}" : "مرحبا، {name} ", "Pick from Files" : "اختر من الملفات", - "Default images" : "الصور الإفتراضية", "Plain background" : "خلفية سادة", "Insert from {productName}" : "اضف من {productName}", - "Show something" : "أظهر شي ما" + "Show something" : "أظهر شي ما", + "Default images" : "الصور الإفتراضية" },"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/bg.js b/apps/dashboard/l10n/bg.js index c2a301c5480..077b96010c2 100644 --- a/apps/dashboard/l10n/bg.js +++ b/apps/dashboard/l10n/bg.js @@ -24,9 +24,9 @@ OC.L10N.register( "Hello" : "Здравейте", "Hello, {name}" : "Здравейте, {name}", "Pick from Files" : "Избери от Файловете", - "Default images" : "Изображения по подразбиране", "Plain background" : "Обикновен фон", "Insert from {productName}" : "Вмъкване от {productName}", - "Show something" : "Покажи нещо" + "Show something" : "Покажи нещо", + "Default images" : "Изображения по подразбиране" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/dashboard/l10n/bg.json b/apps/dashboard/l10n/bg.json index ef278e9e99b..7225daa180c 100644 --- a/apps/dashboard/l10n/bg.json +++ b/apps/dashboard/l10n/bg.json @@ -22,9 +22,9 @@ "Hello" : "Здравейте", "Hello, {name}" : "Здравейте, {name}", "Pick from Files" : "Избери от Файловете", - "Default images" : "Изображения по подразбиране", "Plain background" : "Обикновен фон", "Insert from {productName}" : "Вмъкване от {productName}", - "Show something" : "Покажи нещо" + "Show something" : "Покажи нещо", + "Default images" : "Изображения по подразбиране" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/ca.js b/apps/dashboard/l10n/ca.js index a7fd27ce198..562dbc76dc9 100644 --- a/apps/dashboard/l10n/ca.js +++ b/apps/dashboard/l10n/ca.js @@ -24,9 +24,9 @@ OC.L10N.register( "Hello" : "Hola", "Hello, {name}" : "Hola {name}", "Pick from Files" : "Trieu dels fitxers", - "Default images" : "Imatges predeterminades", "Plain background" : "Fons senzill", "Insert from {productName}" : "Insereix des de {productName}", - "Show something" : "Mostra alguna cosa" + "Show something" : "Mostra alguna cosa", + "Default images" : "Imatges predeterminades" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/dashboard/l10n/ca.json b/apps/dashboard/l10n/ca.json index 09971eb006e..d22ebb65321 100644 --- a/apps/dashboard/l10n/ca.json +++ b/apps/dashboard/l10n/ca.json @@ -22,9 +22,9 @@ "Hello" : "Hola", "Hello, {name}" : "Hola {name}", "Pick from Files" : "Trieu dels fitxers", - "Default images" : "Imatges predeterminades", "Plain background" : "Fons senzill", "Insert from {productName}" : "Insereix des de {productName}", - "Show something" : "Mostra alguna cosa" + "Show something" : "Mostra alguna cosa", + "Default images" : "Imatges predeterminades" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/cs.js b/apps/dashboard/l10n/cs.js index 09612dbc0a0..495fa460395 100644 --- a/apps/dashboard/l10n/cs.js +++ b/apps/dashboard/l10n/cs.js @@ -3,15 +3,15 @@ OC.L10N.register( { "Dashboard" : "Nástěnka", "Dashboard app" : "Aplikace Nástěnka", - "Start your day informed\n\nThe Nextcloud Dashboard is your starting point of the day, giving you an\noverview of your upcoming appointments, urgent emails, chat messages,\nincoming tickets, latest tweets and much more! Users can add the widgets\nthey like and change the background to their liking." : "Začněte svůj den informovaní\n\nNextcloud Přehled je Váš úvodní bod dne, který vám podává přehled nadcházejících schůzek, neodkladných e-mailů, zpráv v chatu,\npříchozích požadavcích, nejnovějších tweetů a mnoho dalšího! Uživatelé si mohou přidávat ovládací prvky, které chtějí a měnit pozadí dle své libosti.", + "Start your day informed\n\nThe Nextcloud Dashboard is your starting point of the day, giving you an\noverview of your upcoming appointments, urgent emails, chat messages,\nincoming tickets, latest tweets and much more! Users can add the widgets\nthey like and change the background to their liking." : "Začněte svůj den informovaní\n\nNextcloud Nástěnka je váš úvodní bod dne, který vám podává přehled\nnadcházejících schůzek, neodkladných e-mailů, zpráv v chatech, příchozích\npožadavků, nejnovějších tweetů a mnoha dalšího! Uživatelé si\nmohou přidávat ovládací prvky, které chtějí a měnit pozadí dle své libosti.", "Customize" : "Přizpůsobit si", "Edit widgets" : "Upravit ovládací prvky", - "Get more widgets from the App Store" : "Získejte další ovládací prvky z katalogu aplikací", + "Get more widgets from the App Store" : "Získat další ovládací prvky z katalogu aplikací", "Change background image" : "Změnit obrázek na pozadí", "Weather service" : "Služba předpovědi počasí", - "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Z důvodu ochrany vašeho soukromí, jsou údaje o počasí pro vás vyžádány vámi využívaným Nextcloud serverem, takže služba, poskytující tato data, neobdrží žádné osobní údaje.", - "Weather data from Met.no" : "Data o počasí z Met.no", - "geocoding with Nominatim" : "geokódování s Nominatim", + "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Vaše soukromí je chráněno tím, že komunikaci se službou předpovědi počasí zprostředkovává vámi využívaný Nextcloud server. Díky tomu služba, která tyto údaje poskytuje, neobdrží z vašeho počítače žádné osobní údaje.", + "Weather data from Met.no" : "Údaje o počasí z Met.no", + "geocoding with Nominatim" : "z popisu polohy na souřadnice převáděno službou Nominatim", "elevation data from OpenTopoData" : "data o nadmořských výškách z OpenTopoData", "Weather" : "Počasí", "Status" : "Stav", @@ -21,12 +21,13 @@ OC.L10N.register( "Good afternoon, {name}" : "Dobré odpoledne, {name}", "Good evening" : "Dobrý večer", "Good evening, {name}" : "Dobrý večer, {name}", - "Hello" : "Zdravíme", - "Hello, {name}" : "Zdravíme, {name}", - "Pick from Files" : "Vyberte ze souborů", - "Default images" : "Výchozí obrázky", + "Hello" : "Dobrý den", + "Hello, {name}" : "Dobrý den, {name}", + "Pick from Files" : "Vybrat ze souborů", + "Default image" : "Výchozí obrázek", "Plain background" : "Jednolité pozadí", "Insert from {productName}" : "Vložit z {productName}", - "Show something" : "Zobrazit něco" + "Show something" : "Zobrazit něco", + "Default images" : "Výchozí obrázek" }, "nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;"); diff --git a/apps/dashboard/l10n/cs.json b/apps/dashboard/l10n/cs.json index 9733310d030..5c7300a9b71 100644 --- a/apps/dashboard/l10n/cs.json +++ b/apps/dashboard/l10n/cs.json @@ -1,15 +1,15 @@ { "translations": { "Dashboard" : "Nástěnka", "Dashboard app" : "Aplikace Nástěnka", - "Start your day informed\n\nThe Nextcloud Dashboard is your starting point of the day, giving you an\noverview of your upcoming appointments, urgent emails, chat messages,\nincoming tickets, latest tweets and much more! Users can add the widgets\nthey like and change the background to their liking." : "Začněte svůj den informovaní\n\nNextcloud Přehled je Váš úvodní bod dne, který vám podává přehled nadcházejících schůzek, neodkladných e-mailů, zpráv v chatu,\npříchozích požadavcích, nejnovějších tweetů a mnoho dalšího! Uživatelé si mohou přidávat ovládací prvky, které chtějí a měnit pozadí dle své libosti.", + "Start your day informed\n\nThe Nextcloud Dashboard is your starting point of the day, giving you an\noverview of your upcoming appointments, urgent emails, chat messages,\nincoming tickets, latest tweets and much more! Users can add the widgets\nthey like and change the background to their liking." : "Začněte svůj den informovaní\n\nNextcloud Nástěnka je váš úvodní bod dne, který vám podává přehled\nnadcházejících schůzek, neodkladných e-mailů, zpráv v chatech, příchozích\npožadavků, nejnovějších tweetů a mnoha dalšího! Uživatelé si\nmohou přidávat ovládací prvky, které chtějí a měnit pozadí dle své libosti.", "Customize" : "Přizpůsobit si", "Edit widgets" : "Upravit ovládací prvky", - "Get more widgets from the App Store" : "Získejte další ovládací prvky z katalogu aplikací", + "Get more widgets from the App Store" : "Získat další ovládací prvky z katalogu aplikací", "Change background image" : "Změnit obrázek na pozadí", "Weather service" : "Služba předpovědi počasí", - "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Z důvodu ochrany vašeho soukromí, jsou údaje o počasí pro vás vyžádány vámi využívaným Nextcloud serverem, takže služba, poskytující tato data, neobdrží žádné osobní údaje.", - "Weather data from Met.no" : "Data o počasí z Met.no", - "geocoding with Nominatim" : "geokódování s Nominatim", + "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Vaše soukromí je chráněno tím, že komunikaci se službou předpovědi počasí zprostředkovává vámi využívaný Nextcloud server. Díky tomu služba, která tyto údaje poskytuje, neobdrží z vašeho počítače žádné osobní údaje.", + "Weather data from Met.no" : "Údaje o počasí z Met.no", + "geocoding with Nominatim" : "z popisu polohy na souřadnice převáděno službou Nominatim", "elevation data from OpenTopoData" : "data o nadmořských výškách z OpenTopoData", "Weather" : "Počasí", "Status" : "Stav", @@ -19,12 +19,13 @@ "Good afternoon, {name}" : "Dobré odpoledne, {name}", "Good evening" : "Dobrý večer", "Good evening, {name}" : "Dobrý večer, {name}", - "Hello" : "Zdravíme", - "Hello, {name}" : "Zdravíme, {name}", - "Pick from Files" : "Vyberte ze souborů", - "Default images" : "Výchozí obrázky", + "Hello" : "Dobrý den", + "Hello, {name}" : "Dobrý den, {name}", + "Pick from Files" : "Vybrat ze souborů", + "Default image" : "Výchozí obrázek", "Plain background" : "Jednolité pozadí", "Insert from {productName}" : "Vložit z {productName}", - "Show something" : "Zobrazit něco" + "Show something" : "Zobrazit něco", + "Default images" : "Výchozí obrázek" },"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/da.js b/apps/dashboard/l10n/da.js index a06004ea9ab..bee5669acd4 100644 --- a/apps/dashboard/l10n/da.js +++ b/apps/dashboard/l10n/da.js @@ -23,9 +23,9 @@ OC.L10N.register( "Hello" : "Hej", "Hello, {name}" : "Hej {name}", "Pick from Files" : "Vælg fra Filer", - "Default images" : "Standardbilleder", "Plain background" : "Standard baggrund", "Insert from {productName}" : "Indsæt fra {productName}", - "Show something" : "Vis noget" + "Show something" : "Vis noget", + "Default images" : "Standardbilleder" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/dashboard/l10n/da.json b/apps/dashboard/l10n/da.json index 90458ad211f..beca69ed432 100644 --- a/apps/dashboard/l10n/da.json +++ b/apps/dashboard/l10n/da.json @@ -21,9 +21,9 @@ "Hello" : "Hej", "Hello, {name}" : "Hej {name}", "Pick from Files" : "Vælg fra Filer", - "Default images" : "Standardbilleder", "Plain background" : "Standard baggrund", "Insert from {productName}" : "Indsæt fra {productName}", - "Show something" : "Vis noget" + "Show something" : "Vis noget", + "Default images" : "Standardbilleder" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/de.js b/apps/dashboard/l10n/de.js index cb185c0db2d..eb074991b77 100644 --- a/apps/dashboard/l10n/de.js +++ b/apps/dashboard/l10n/de.js @@ -24,9 +24,9 @@ OC.L10N.register( "Hello" : "Hallo", "Hello, {name}" : "Hallo, {name}", "Pick from Files" : "Aus Dateien auswählen", - "Default images" : "Standardbilder", "Plain background" : "Einfacher Hintergrund", "Insert from {productName}" : "Von {productName} einfügen", - "Show something" : "Zeige etwas an" + "Show something" : "Zeige etwas an", + "Default images" : "Standardbilder" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/dashboard/l10n/de.json b/apps/dashboard/l10n/de.json index e90d05b9527..ff303d8d1b4 100644 --- a/apps/dashboard/l10n/de.json +++ b/apps/dashboard/l10n/de.json @@ -22,9 +22,9 @@ "Hello" : "Hallo", "Hello, {name}" : "Hallo, {name}", "Pick from Files" : "Aus Dateien auswählen", - "Default images" : "Standardbilder", "Plain background" : "Einfacher Hintergrund", "Insert from {productName}" : "Von {productName} einfügen", - "Show something" : "Zeige etwas an" + "Show something" : "Zeige etwas an", + "Default images" : "Standardbilder" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/de_DE.js b/apps/dashboard/l10n/de_DE.js index ee9d9f72289..9d866a2e5ef 100644 --- a/apps/dashboard/l10n/de_DE.js +++ b/apps/dashboard/l10n/de_DE.js @@ -24,9 +24,10 @@ OC.L10N.register( "Hello" : "Hallo", "Hello, {name}" : "Hallo, {name}", "Pick from Files" : "Aus Dateien auswählen", - "Default images" : "Standardbilder", + "Default image" : "Standardbild", "Plain background" : "Einfacher Hintergrund", "Insert from {productName}" : "Von {productName} einfügen", - "Show something" : "Etwas anzeigen" + "Show something" : "Etwas anzeigen", + "Default images" : "Standardbild" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/dashboard/l10n/de_DE.json b/apps/dashboard/l10n/de_DE.json index 9f901398ba7..37d81b81b31 100644 --- a/apps/dashboard/l10n/de_DE.json +++ b/apps/dashboard/l10n/de_DE.json @@ -22,9 +22,10 @@ "Hello" : "Hallo", "Hello, {name}" : "Hallo, {name}", "Pick from Files" : "Aus Dateien auswählen", - "Default images" : "Standardbilder", + "Default image" : "Standardbild", "Plain background" : "Einfacher Hintergrund", "Insert from {productName}" : "Von {productName} einfügen", - "Show something" : "Etwas anzeigen" + "Show something" : "Etwas anzeigen", + "Default images" : "Standardbild" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/el.js b/apps/dashboard/l10n/el.js index 99d0e2c57bd..61a1f5718ae 100644 --- a/apps/dashboard/l10n/el.js +++ b/apps/dashboard/l10n/el.js @@ -24,9 +24,9 @@ OC.L10N.register( "Hello" : "Γειά", "Hello, {name}" : "Γειά, {name}", "Pick from Files" : "Επιλέξτε από αρχεία", - "Default images" : "Προεπιλεγμένες εικόνες", "Plain background" : "Απλό παρασκήνιο", "Insert from {productName}" : "Εισαγωγή από {productName}", - "Show something" : "Δείξε οτιδήποτε" + "Show something" : "Δείξε οτιδήποτε", + "Default images" : "Προεπιλεγμένες εικόνες" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/dashboard/l10n/el.json b/apps/dashboard/l10n/el.json index b9dac1c638d..4ba92f11776 100644 --- a/apps/dashboard/l10n/el.json +++ b/apps/dashboard/l10n/el.json @@ -22,9 +22,9 @@ "Hello" : "Γειά", "Hello, {name}" : "Γειά, {name}", "Pick from Files" : "Επιλέξτε από αρχεία", - "Default images" : "Προεπιλεγμένες εικόνες", "Plain background" : "Απλό παρασκήνιο", "Insert from {productName}" : "Εισαγωγή από {productName}", - "Show something" : "Δείξε οτιδήποτε" + "Show something" : "Δείξε οτιδήποτε", + "Default images" : "Προεπιλεγμένες εικόνες" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/es.js b/apps/dashboard/l10n/es.js index 4ac8098b636..3361f1bea9e 100644 --- a/apps/dashboard/l10n/es.js +++ b/apps/dashboard/l10n/es.js @@ -24,9 +24,9 @@ OC.L10N.register( "Hello" : "Hola", "Hello, {name}" : "Hola, {name}", "Pick from Files" : "Elegir de Archivos", - "Default images" : "Imágenes predeterminadas", "Plain background" : "Fondo liso", "Insert from {productName}" : "Insertar desde {productName}", - "Show something" : "Mostrar algo" + "Show something" : "Mostrar algo", + "Default images" : "Imágenes predeterminadas" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/dashboard/l10n/es.json b/apps/dashboard/l10n/es.json index 36305f3d88b..7a555b7e9f5 100644 --- a/apps/dashboard/l10n/es.json +++ b/apps/dashboard/l10n/es.json @@ -22,9 +22,9 @@ "Hello" : "Hola", "Hello, {name}" : "Hola, {name}", "Pick from Files" : "Elegir de Archivos", - "Default images" : "Imágenes predeterminadas", "Plain background" : "Fondo liso", "Insert from {productName}" : "Insertar desde {productName}", - "Show something" : "Mostrar algo" + "Show something" : "Mostrar algo", + "Default images" : "Imágenes predeterminadas" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/eu.js b/apps/dashboard/l10n/eu.js index 8987e09a60c..d5b990a47fc 100644 --- a/apps/dashboard/l10n/eu.js +++ b/apps/dashboard/l10n/eu.js @@ -24,9 +24,9 @@ OC.L10N.register( "Hello" : "Kaixo", "Hello, {name}" : "Kaixo, {name}", "Pick from Files" : "Hautatu fitxategietatik", - "Default images" : "Irudi lehenetsiak", "Plain background" : "Atzeko plano arrunta", "Insert from {productName}" : "Txertatu hemendik: {productName}", - "Show something" : "Erakutsi zerbait" + "Show something" : "Erakutsi zerbait", + "Default images" : "Irudi lehenetsiak" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/dashboard/l10n/eu.json b/apps/dashboard/l10n/eu.json index 2b81c3a2333..5410a9d6753 100644 --- a/apps/dashboard/l10n/eu.json +++ b/apps/dashboard/l10n/eu.json @@ -22,9 +22,9 @@ "Hello" : "Kaixo", "Hello, {name}" : "Kaixo, {name}", "Pick from Files" : "Hautatu fitxategietatik", - "Default images" : "Irudi lehenetsiak", "Plain background" : "Atzeko plano arrunta", "Insert from {productName}" : "Txertatu hemendik: {productName}", - "Show something" : "Erakutsi zerbait" + "Show something" : "Erakutsi zerbait", + "Default images" : "Irudi lehenetsiak" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/fa.js b/apps/dashboard/l10n/fa.js index c38a42a3a89..ce70f503445 100644 --- a/apps/dashboard/l10n/fa.js +++ b/apps/dashboard/l10n/fa.js @@ -20,9 +20,9 @@ OC.L10N.register( "Hello" : "سلام", "Hello, {name}" : "سلام {name}", "Pick from Files" : "از اسناد انتخاب کنید", - "Default images" : "تصاویر پیشفرض", "Plain background" : "تصویر زمینه ساده", "Insert from {productName}" : "درج از {productName}", - "Show something" : "نمایش چیزی" + "Show something" : "نمایش چیزی", + "Default images" : "تصاویر پیشفرض" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/dashboard/l10n/fa.json b/apps/dashboard/l10n/fa.json index 4a5f0793119..9ca02f563ac 100644 --- a/apps/dashboard/l10n/fa.json +++ b/apps/dashboard/l10n/fa.json @@ -18,9 +18,9 @@ "Hello" : "سلام", "Hello, {name}" : "سلام {name}", "Pick from Files" : "از اسناد انتخاب کنید", - "Default images" : "تصاویر پیشفرض", "Plain background" : "تصویر زمینه ساده", "Insert from {productName}" : "درج از {productName}", - "Show something" : "نمایش چیزی" + "Show something" : "نمایش چیزی", + "Default images" : "تصاویر پیشفرض" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/fi.js b/apps/dashboard/l10n/fi.js index 35d2943cbff..6e02e5a2f9a 100644 --- a/apps/dashboard/l10n/fi.js +++ b/apps/dashboard/l10n/fi.js @@ -23,9 +23,10 @@ OC.L10N.register( "Hello" : "Hei", "Hello, {name}" : "Hei {name}", "Pick from Files" : "Valitse tiedostoista", - "Default images" : "Oletuskuvat", + "Default image" : "Oletuskuva", "Plain background" : "Yksinkertainen tausta", "Insert from {productName}" : "Aseta kohteesta {productName}", - "Show something" : "Näytä jotain" + "Show something" : "Näytä jotain", + "Default images" : "Oletuskuvat" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/dashboard/l10n/fi.json b/apps/dashboard/l10n/fi.json index b78a983c280..822396adae5 100644 --- a/apps/dashboard/l10n/fi.json +++ b/apps/dashboard/l10n/fi.json @@ -21,9 +21,10 @@ "Hello" : "Hei", "Hello, {name}" : "Hei {name}", "Pick from Files" : "Valitse tiedostoista", - "Default images" : "Oletuskuvat", + "Default image" : "Oletuskuva", "Plain background" : "Yksinkertainen tausta", "Insert from {productName}" : "Aseta kohteesta {productName}", - "Show something" : "Näytä jotain" + "Show something" : "Näytä jotain", + "Default images" : "Oletuskuvat" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/fr.js b/apps/dashboard/l10n/fr.js index 7c23e6ff2dd..3812aeb48ba 100644 --- a/apps/dashboard/l10n/fr.js +++ b/apps/dashboard/l10n/fr.js @@ -23,9 +23,9 @@ OC.L10N.register( "Hello" : "Bonjour", "Hello, {name}" : "Bonjour {name}", "Pick from Files" : "Sélectionnez parmi les fichiers", - "Default images" : "Images par défaut", "Plain background" : "Fond uni", "Insert from {productName}" : "Insérer depuis {productName}", - "Show something" : "Montrer quelque chose" + "Show something" : "Montrer quelque chose", + "Default images" : "Images par défaut" }, "nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/dashboard/l10n/fr.json b/apps/dashboard/l10n/fr.json index 57b0fefe8bf..078920f9da9 100644 --- a/apps/dashboard/l10n/fr.json +++ b/apps/dashboard/l10n/fr.json @@ -21,9 +21,9 @@ "Hello" : "Bonjour", "Hello, {name}" : "Bonjour {name}", "Pick from Files" : "Sélectionnez parmi les fichiers", - "Default images" : "Images par défaut", "Plain background" : "Fond uni", "Insert from {productName}" : "Insérer depuis {productName}", - "Show something" : "Montrer quelque chose" + "Show something" : "Montrer quelque chose", + "Default images" : "Images par défaut" },"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/gl.js b/apps/dashboard/l10n/gl.js index 2ef1ab106fb..119926afe75 100644 --- a/apps/dashboard/l10n/gl.js +++ b/apps/dashboard/l10n/gl.js @@ -22,9 +22,9 @@ OC.L10N.register( "Hello" : "Hello", "Hello, {name}" : "Ola, {name}", "Pick from Files" : "Escolla entre os ficheiros", - "Default images" : "Imaxes predeterminadas", "Plain background" : "Fondo sinxelo", "Insert from {productName}" : "Inserir dende {productName}", - "Show something" : "Amosar algo" + "Show something" : "Amosar algo", + "Default images" : "Imaxes predeterminadas" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/dashboard/l10n/gl.json b/apps/dashboard/l10n/gl.json index 52a4ad3c8bf..1f00e5b2c76 100644 --- a/apps/dashboard/l10n/gl.json +++ b/apps/dashboard/l10n/gl.json @@ -20,9 +20,9 @@ "Hello" : "Hello", "Hello, {name}" : "Ola, {name}", "Pick from Files" : "Escolla entre os ficheiros", - "Default images" : "Imaxes predeterminadas", "Plain background" : "Fondo sinxelo", "Insert from {productName}" : "Inserir dende {productName}", - "Show something" : "Amosar algo" + "Show something" : "Amosar algo", + "Default images" : "Imaxes predeterminadas" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/he.js b/apps/dashboard/l10n/he.js index 3228c73b6a6..74311d1deee 100644 --- a/apps/dashboard/l10n/he.js +++ b/apps/dashboard/l10n/he.js @@ -22,9 +22,9 @@ OC.L10N.register( "Hello" : "שלום", "Hello, {name}" : "שלום, {name}", "Pick from Files" : "בחירה מקבצים", - "Default images" : "תמונות ברירת מחדל", "Plain background" : "רקע רגיל", "Insert from {productName}" : "הכנס מ-{productName}", - "Show something" : "תראה משהו" + "Show something" : "תראה משהו", + "Default images" : "תמונות ברירת מחדל" }, "nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;"); diff --git a/apps/dashboard/l10n/he.json b/apps/dashboard/l10n/he.json index e3e1a155a8a..7763b32fe05 100644 --- a/apps/dashboard/l10n/he.json +++ b/apps/dashboard/l10n/he.json @@ -20,9 +20,9 @@ "Hello" : "שלום", "Hello, {name}" : "שלום, {name}", "Pick from Files" : "בחירה מקבצים", - "Default images" : "תמונות ברירת מחדל", "Plain background" : "רקע רגיל", "Insert from {productName}" : "הכנס מ-{productName}", - "Show something" : "תראה משהו" + "Show something" : "תראה משהו", + "Default images" : "תמונות ברירת מחדל" },"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/hr.js b/apps/dashboard/l10n/hr.js index fb71c5a96ea..a5cad4f4a91 100644 --- a/apps/dashboard/l10n/hr.js +++ b/apps/dashboard/l10n/hr.js @@ -23,9 +23,9 @@ OC.L10N.register( "Hello" : "Pozdrav", "Hello, {name}" : "Pozdrav, {name}", "Pick from Files" : "Odaberi iz datoteka", - "Default images" : "Zadane slike", "Plain background" : "Obična pozadina", "Insert from {productName}" : "Umetni iz {productName}", - "Show something" : "Prikaži nešto" + "Show something" : "Prikaži nešto", + "Default images" : "Zadane slike" }, "nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;"); diff --git a/apps/dashboard/l10n/hr.json b/apps/dashboard/l10n/hr.json index e14e45819e0..f557307c8c7 100644 --- a/apps/dashboard/l10n/hr.json +++ b/apps/dashboard/l10n/hr.json @@ -21,9 +21,9 @@ "Hello" : "Pozdrav", "Hello, {name}" : "Pozdrav, {name}", "Pick from Files" : "Odaberi iz datoteka", - "Default images" : "Zadane slike", "Plain background" : "Obična pozadina", "Insert from {productName}" : "Umetni iz {productName}", - "Show something" : "Prikaži nešto" + "Show something" : "Prikaži nešto", + "Default images" : "Zadane slike" },"pluralForm" :"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/hu.js b/apps/dashboard/l10n/hu.js index a8b8ec3fa7b..bfa4966ace4 100644 --- a/apps/dashboard/l10n/hu.js +++ b/apps/dashboard/l10n/hu.js @@ -24,9 +24,9 @@ OC.L10N.register( "Hello" : "Üdv", "Hello, {name}" : "Üdv {name}!", "Pick from Files" : "Választás a fájlok közül", - "Default images" : "Alapértelmezett képek", "Plain background" : "Egyszerű háttér", "Insert from {productName}" : "Beillesztés innen: {productName}-", - "Show something" : "Mutasson valamit" + "Show something" : "Mutasson valamit", + "Default images" : "Alapértelmezett képek" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/dashboard/l10n/hu.json b/apps/dashboard/l10n/hu.json index 69bb37a387a..daf50e931d6 100644 --- a/apps/dashboard/l10n/hu.json +++ b/apps/dashboard/l10n/hu.json @@ -22,9 +22,9 @@ "Hello" : "Üdv", "Hello, {name}" : "Üdv {name}!", "Pick from Files" : "Választás a fájlok közül", - "Default images" : "Alapértelmezett képek", "Plain background" : "Egyszerű háttér", "Insert from {productName}" : "Beillesztés innen: {productName}-", - "Show something" : "Mutasson valamit" + "Show something" : "Mutasson valamit", + "Default images" : "Alapértelmezett képek" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/id.js b/apps/dashboard/l10n/id.js index 5eb912602b1..262c0afddbf 100644 --- a/apps/dashboard/l10n/id.js +++ b/apps/dashboard/l10n/id.js @@ -23,9 +23,9 @@ OC.L10N.register( "Hello" : "Halo", "Hello, {name}" : "Halo, {name}", "Pick from Files" : "Pilih dari File", - "Default images" : "Gambar bawaan", "Plain background" : "Latar belakang polos", "Insert from {productName}" : "Sisipkan dari {productName}", - "Show something" : "Tunjukkan sesuatu" + "Show something" : "Tunjukkan sesuatu", + "Default images" : "Gambar bawaan" }, "nplurals=1; plural=0;"); diff --git a/apps/dashboard/l10n/id.json b/apps/dashboard/l10n/id.json index fbc0292a504..726f857e460 100644 --- a/apps/dashboard/l10n/id.json +++ b/apps/dashboard/l10n/id.json @@ -21,9 +21,9 @@ "Hello" : "Halo", "Hello, {name}" : "Halo, {name}", "Pick from Files" : "Pilih dari File", - "Default images" : "Gambar bawaan", "Plain background" : "Latar belakang polos", "Insert from {productName}" : "Sisipkan dari {productName}", - "Show something" : "Tunjukkan sesuatu" + "Show something" : "Tunjukkan sesuatu", + "Default images" : "Gambar bawaan" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/it.js b/apps/dashboard/l10n/it.js index 0c82e43db8b..b8f7793a79a 100644 --- a/apps/dashboard/l10n/it.js +++ b/apps/dashboard/l10n/it.js @@ -23,9 +23,9 @@ OC.L10N.register( "Hello" : "Ciao", "Hello, {name}" : "Ciao {name}", "Pick from Files" : "Scegli da File", - "Default images" : "Immagini predefinite", "Plain background" : "Sfondo semplice", "Insert from {productName}" : "Inserisci da {productName}", - "Show something" : "Mostra qualcosa" + "Show something" : "Mostra qualcosa", + "Default images" : "Immagini predefinite" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/dashboard/l10n/it.json b/apps/dashboard/l10n/it.json index c5643d5c987..926ab87507e 100644 --- a/apps/dashboard/l10n/it.json +++ b/apps/dashboard/l10n/it.json @@ -21,9 +21,9 @@ "Hello" : "Ciao", "Hello, {name}" : "Ciao {name}", "Pick from Files" : "Scegli da File", - "Default images" : "Immagini predefinite", "Plain background" : "Sfondo semplice", "Insert from {productName}" : "Inserisci da {productName}", - "Show something" : "Mostra qualcosa" + "Show something" : "Mostra qualcosa", + "Default images" : "Immagini predefinite" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/ja.js b/apps/dashboard/l10n/ja.js index 3fe490ab0bd..8bbc9fe9dba 100644 --- a/apps/dashboard/l10n/ja.js +++ b/apps/dashboard/l10n/ja.js @@ -24,9 +24,9 @@ OC.L10N.register( "Hello" : "こんにちは", "Hello, {name}" : "こんにちは、{name} さん", "Pick from Files" : "ファイルから選択", - "Default images" : "デフォルトの画像", "Plain background" : "シンプルな背景", "Insert from {productName}" : "{productName} から挿入", - "Show something" : "何か表示されます" + "Show something" : "何か表示されます", + "Default images" : "デフォルトの画像" }, "nplurals=1; plural=0;"); diff --git a/apps/dashboard/l10n/ja.json b/apps/dashboard/l10n/ja.json index afe2f2c7996..4e932ff4654 100644 --- a/apps/dashboard/l10n/ja.json +++ b/apps/dashboard/l10n/ja.json @@ -22,9 +22,9 @@ "Hello" : "こんにちは", "Hello, {name}" : "こんにちは、{name} さん", "Pick from Files" : "ファイルから選択", - "Default images" : "デフォルトの画像", "Plain background" : "シンプルな背景", "Insert from {productName}" : "{productName} から挿入", - "Show something" : "何か表示されます" + "Show something" : "何か表示されます", + "Default images" : "デフォルトの画像" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/ka_GE.js b/apps/dashboard/l10n/ka_GE.js index 1392cd51c1c..cee7501dc0b 100644 --- a/apps/dashboard/l10n/ka_GE.js +++ b/apps/dashboard/l10n/ka_GE.js @@ -20,9 +20,9 @@ OC.L10N.register( "Hello" : "გამარჯობა", "Hello, {name}" : "გამარჯობა, {name}", "Pick from Files" : "აირჩიე ფაილებიდან", - "Default images" : "საწყისი სურათები", "Plain background" : "ცარიელი ფონი", "Insert from {productName}" : "შეავსეთ {productName}-დან", - "Show something" : "აჩვენე რამე" + "Show something" : "აჩვენე რამე", + "Default images" : "საწყისი სურათები" }, "nplurals=2; plural=(n!=1);"); diff --git a/apps/dashboard/l10n/ka_GE.json b/apps/dashboard/l10n/ka_GE.json index 4c6592d6fa7..cc942d201e5 100644 --- a/apps/dashboard/l10n/ka_GE.json +++ b/apps/dashboard/l10n/ka_GE.json @@ -18,9 +18,9 @@ "Hello" : "გამარჯობა", "Hello, {name}" : "გამარჯობა, {name}", "Pick from Files" : "აირჩიე ფაილებიდან", - "Default images" : "საწყისი სურათები", "Plain background" : "ცარიელი ფონი", "Insert from {productName}" : "შეავსეთ {productName}-დან", - "Show something" : "აჩვენე რამე" + "Show something" : "აჩვენე რამე", + "Default images" : "საწყისი სურათები" },"pluralForm" :"nplurals=2; plural=(n!=1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/ko.js b/apps/dashboard/l10n/ko.js index ec88d767f5b..0958224e263 100644 --- a/apps/dashboard/l10n/ko.js +++ b/apps/dashboard/l10n/ko.js @@ -22,8 +22,8 @@ OC.L10N.register( "Hello" : "안녕하세요", "Hello, {name}" : "{name} 님, 안녕하세요", "Pick from Files" : "파일로부터 선택", - "Default images" : "기본 이미지", "Plain background" : "일반 배경", - "Insert from {productName}" : "{productName}로부터 삽입" + "Insert from {productName}" : "{productName}로부터 삽입", + "Default images" : "기본 이미지" }, "nplurals=1; plural=0;"); diff --git a/apps/dashboard/l10n/ko.json b/apps/dashboard/l10n/ko.json index 6bbd796ead4..79f44d191fb 100644 --- a/apps/dashboard/l10n/ko.json +++ b/apps/dashboard/l10n/ko.json @@ -20,8 +20,8 @@ "Hello" : "안녕하세요", "Hello, {name}" : "{name} 님, 안녕하세요", "Pick from Files" : "파일로부터 선택", - "Default images" : "기본 이미지", "Plain background" : "일반 배경", - "Insert from {productName}" : "{productName}로부터 삽입" + "Insert from {productName}" : "{productName}로부터 삽입", + "Default images" : "기본 이미지" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/lt_LT.js b/apps/dashboard/l10n/lt_LT.js index dc8d24bbde5..3313e553d68 100644 --- a/apps/dashboard/l10n/lt_LT.js +++ b/apps/dashboard/l10n/lt_LT.js @@ -23,9 +23,10 @@ OC.L10N.register( "Hello" : "Sveiki", "Hello, {name}" : "Sveiki, {name},", "Pick from Files" : "Pasirinkti iš Failų", - "Default images" : "Numatytieji paveikslai", + "Default image" : "Numatytasis paveikslas", "Plain background" : "Vientisas fonas", "Insert from {productName}" : "Įterpti iš {productName}", - "Show something" : "Ką nors rodyti" + "Show something" : "Ką nors rodyti", + "Default images" : "Numatytieji paveikslai" }, "nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);"); diff --git a/apps/dashboard/l10n/lt_LT.json b/apps/dashboard/l10n/lt_LT.json index 61fb9ac8a95..b46bb284c7b 100644 --- a/apps/dashboard/l10n/lt_LT.json +++ b/apps/dashboard/l10n/lt_LT.json @@ -21,9 +21,10 @@ "Hello" : "Sveiki", "Hello, {name}" : "Sveiki, {name},", "Pick from Files" : "Pasirinkti iš Failų", - "Default images" : "Numatytieji paveikslai", + "Default image" : "Numatytasis paveikslas", "Plain background" : "Vientisas fonas", "Insert from {productName}" : "Įterpti iš {productName}", - "Show something" : "Ką nors rodyti" + "Show something" : "Ką nors rodyti", + "Default images" : "Numatytieji paveikslai" },"pluralForm" :"nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/mk.js b/apps/dashboard/l10n/mk.js index 9c03cbe0a0b..5b6e6b0fddd 100644 --- a/apps/dashboard/l10n/mk.js +++ b/apps/dashboard/l10n/mk.js @@ -24,9 +24,9 @@ OC.L10N.register( "Hello" : "Здраво", "Hello, {name}" : "Здраво, {name}", "Pick from Files" : "Избери од датотеките", - "Default images" : "Стандардни слики", "Plain background" : "Обична позадина", "Insert from {productName}" : "Вметнни од {productName}", - "Show something" : "Прикажи нешто" + "Show something" : "Прикажи нешто", + "Default images" : "Стандардни слики" }, "nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"); diff --git a/apps/dashboard/l10n/mk.json b/apps/dashboard/l10n/mk.json index d271c9a1a76..5b3442e2efb 100644 --- a/apps/dashboard/l10n/mk.json +++ b/apps/dashboard/l10n/mk.json @@ -22,9 +22,9 @@ "Hello" : "Здраво", "Hello, {name}" : "Здраво, {name}", "Pick from Files" : "Избери од датотеките", - "Default images" : "Стандардни слики", "Plain background" : "Обична позадина", "Insert from {productName}" : "Вметнни од {productName}", - "Show something" : "Прикажи нешто" + "Show something" : "Прикажи нешто", + "Default images" : "Стандардни слики" },"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/nb.js b/apps/dashboard/l10n/nb.js index 77c7d336c77..ee88e2f920a 100644 --- a/apps/dashboard/l10n/nb.js +++ b/apps/dashboard/l10n/nb.js @@ -24,9 +24,9 @@ OC.L10N.register( "Hello" : "Hallo", "Hello, {name}" : "Hallo, {name}", "Pick from Files" : "Velg fra Filer", - "Default images" : "Standardbilde", "Plain background" : "Ensfarget bakgrunn", "Insert from {productName}" : "Sett inn fra {productName}", - "Show something" : "Vis noe" + "Show something" : "Vis noe", + "Default images" : "Standardbilde" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/dashboard/l10n/nb.json b/apps/dashboard/l10n/nb.json index 25d75624cd9..6253450198d 100644 --- a/apps/dashboard/l10n/nb.json +++ b/apps/dashboard/l10n/nb.json @@ -22,9 +22,9 @@ "Hello" : "Hallo", "Hello, {name}" : "Hallo, {name}", "Pick from Files" : "Velg fra Filer", - "Default images" : "Standardbilde", "Plain background" : "Ensfarget bakgrunn", "Insert from {productName}" : "Sett inn fra {productName}", - "Show something" : "Vis noe" + "Show something" : "Vis noe", + "Default images" : "Standardbilde" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/nl.js b/apps/dashboard/l10n/nl.js index a2712247071..06f1ce25225 100644 --- a/apps/dashboard/l10n/nl.js +++ b/apps/dashboard/l10n/nl.js @@ -23,9 +23,9 @@ OC.L10N.register( "Hello" : "Hallo", "Hello, {name}" : "Hallo, {name}", "Pick from Files" : "Kies uit Bestanden", - "Default images" : "Standaardafbeeldingen", "Plain background" : "Kale achtergrond", "Insert from {productName}" : "Invoegen vanuit {productName}", - "Show something" : "Toon iets" + "Show something" : "Toon iets", + "Default images" : "Standaardafbeeldingen" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/dashboard/l10n/nl.json b/apps/dashboard/l10n/nl.json index 7e76f68d926..7ecd5f0b3ac 100644 --- a/apps/dashboard/l10n/nl.json +++ b/apps/dashboard/l10n/nl.json @@ -21,9 +21,9 @@ "Hello" : "Hallo", "Hello, {name}" : "Hallo, {name}", "Pick from Files" : "Kies uit Bestanden", - "Default images" : "Standaardafbeeldingen", "Plain background" : "Kale achtergrond", "Insert from {productName}" : "Invoegen vanuit {productName}", - "Show something" : "Toon iets" + "Show something" : "Toon iets", + "Default images" : "Standaardafbeeldingen" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/oc.js b/apps/dashboard/l10n/oc.js index 255961cf75c..5ad45768ecb 100644 --- a/apps/dashboard/l10n/oc.js +++ b/apps/dashboard/l10n/oc.js @@ -21,8 +21,8 @@ OC.L10N.register( "Good evening, {name}" : "Bonser, {name}", "Hello" : "Adieu", "Hello, {name}" : "Adieu, {name}", - "Default images" : "Imatges per defaut", "Plain background" : "Fons unit", - "Show something" : "Mostrar quicòm" + "Show something" : "Mostrar quicòm", + "Default images" : "Imatges per defaut" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/dashboard/l10n/oc.json b/apps/dashboard/l10n/oc.json index 9a62c204b23..c6077ab347c 100644 --- a/apps/dashboard/l10n/oc.json +++ b/apps/dashboard/l10n/oc.json @@ -19,8 +19,8 @@ "Good evening, {name}" : "Bonser, {name}", "Hello" : "Adieu", "Hello, {name}" : "Adieu, {name}", - "Default images" : "Imatges per defaut", "Plain background" : "Fons unit", - "Show something" : "Mostrar quicòm" + "Show something" : "Mostrar quicòm", + "Default images" : "Imatges per defaut" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/pl.js b/apps/dashboard/l10n/pl.js index 53595587df7..803efaa9772 100644 --- a/apps/dashboard/l10n/pl.js +++ b/apps/dashboard/l10n/pl.js @@ -24,9 +24,9 @@ OC.L10N.register( "Hello" : "Witaj", "Hello, {name}" : "Witaj, {name}", "Pick from Files" : "Wybierz z Plików", - "Default images" : "Obrazy domyślne", "Plain background" : "Zwykłe tło", "Insert from {productName}" : "Wstaw z {productName}", - "Show something" : "Pokaż coś" + "Show something" : "Pokaż coś", + "Default images" : "Obrazy domyślne" }, "nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);"); diff --git a/apps/dashboard/l10n/pl.json b/apps/dashboard/l10n/pl.json index 79280cd879b..c2c09de276e 100644 --- a/apps/dashboard/l10n/pl.json +++ b/apps/dashboard/l10n/pl.json @@ -22,9 +22,9 @@ "Hello" : "Witaj", "Hello, {name}" : "Witaj, {name}", "Pick from Files" : "Wybierz z Plików", - "Default images" : "Obrazy domyślne", "Plain background" : "Zwykłe tło", "Insert from {productName}" : "Wstaw z {productName}", - "Show something" : "Pokaż coś" + "Show something" : "Pokaż coś", + "Default images" : "Obrazy domyślne" },"pluralForm" :"nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/pt_BR.js b/apps/dashboard/l10n/pt_BR.js index c947cba67cb..db4f2b99fad 100644 --- a/apps/dashboard/l10n/pt_BR.js +++ b/apps/dashboard/l10n/pt_BR.js @@ -24,9 +24,9 @@ OC.L10N.register( "Hello" : "Olá", "Hello, {name}" : "Olá, {name}", "Pick from Files" : "Escolher de Arquivos", - "Default images" : "Imagens padrão", "Plain background" : "Fundo simples", "Insert from {productName}" : "Inserir de {productName}", - "Show something" : "Mostrar alguma coisa" + "Show something" : "Mostrar alguma coisa", + "Default images" : "Imagens padrão" }, "nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/dashboard/l10n/pt_BR.json b/apps/dashboard/l10n/pt_BR.json index 4d831cf4df0..d08ab288d85 100644 --- a/apps/dashboard/l10n/pt_BR.json +++ b/apps/dashboard/l10n/pt_BR.json @@ -22,9 +22,9 @@ "Hello" : "Olá", "Hello, {name}" : "Olá, {name}", "Pick from Files" : "Escolher de Arquivos", - "Default images" : "Imagens padrão", "Plain background" : "Fundo simples", "Insert from {productName}" : "Inserir de {productName}", - "Show something" : "Mostrar alguma coisa" + "Show something" : "Mostrar alguma coisa", + "Default images" : "Imagens padrão" },"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/pt_PT.js b/apps/dashboard/l10n/pt_PT.js index 6410058b610..a24cdf01104 100644 --- a/apps/dashboard/l10n/pt_PT.js +++ b/apps/dashboard/l10n/pt_PT.js @@ -22,9 +22,9 @@ OC.L10N.register( "Hello" : "Olá", "Hello, {name}" : "Olá, {name}", "Pick from Files" : "Escolha a partir dos Ficheiros", - "Default images" : "Imagens predefinidas", "Plain background" : "Fundo simples", "Insert from {productName}" : "Inserir de {productName}", - "Show something" : "Mostrar algo" + "Show something" : "Mostrar algo", + "Default images" : "Imagens predefinidas" }, "nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/dashboard/l10n/pt_PT.json b/apps/dashboard/l10n/pt_PT.json index f0a5aea4eca..226d1534203 100644 --- a/apps/dashboard/l10n/pt_PT.json +++ b/apps/dashboard/l10n/pt_PT.json @@ -20,9 +20,9 @@ "Hello" : "Olá", "Hello, {name}" : "Olá, {name}", "Pick from Files" : "Escolha a partir dos Ficheiros", - "Default images" : "Imagens predefinidas", "Plain background" : "Fundo simples", "Insert from {productName}" : "Inserir de {productName}", - "Show something" : "Mostrar algo" + "Show something" : "Mostrar algo", + "Default images" : "Imagens predefinidas" },"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/ro.js b/apps/dashboard/l10n/ro.js index c3716430422..c517c9f4793 100644 --- a/apps/dashboard/l10n/ro.js +++ b/apps/dashboard/l10n/ro.js @@ -24,9 +24,9 @@ OC.L10N.register( "Hello" : "Bună", "Hello, {name}" : "Bună, {name}", "Pick from Files" : "Alege din Fișiere", - "Default images" : "Imagini implicite", "Plain background" : "Fundal simplu", "Insert from {productName}" : "Introduce din {productName}", - "Show something" : "Arată ceva" + "Show something" : "Arată ceva", + "Default images" : "Imagini implicite" }, "nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"); diff --git a/apps/dashboard/l10n/ro.json b/apps/dashboard/l10n/ro.json index 98ef3671d91..c6addb56d46 100644 --- a/apps/dashboard/l10n/ro.json +++ b/apps/dashboard/l10n/ro.json @@ -22,9 +22,9 @@ "Hello" : "Bună", "Hello, {name}" : "Bună, {name}", "Pick from Files" : "Alege din Fișiere", - "Default images" : "Imagini implicite", "Plain background" : "Fundal simplu", "Insert from {productName}" : "Introduce din {productName}", - "Show something" : "Arată ceva" + "Show something" : "Arată ceva", + "Default images" : "Imagini implicite" },"pluralForm" :"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/ru.js b/apps/dashboard/l10n/ru.js index 3735ceea873..602da918a5c 100644 --- a/apps/dashboard/l10n/ru.js +++ b/apps/dashboard/l10n/ru.js @@ -24,9 +24,9 @@ OC.L10N.register( "Hello" : "Здравствуйте", "Hello, {name}" : "Здравствуйте, {name}!", "Pick from Files" : "Выбрать из файлов", - "Default images" : "Изображения по умолчанию", "Plain background" : "Обычный фон", "Insert from {productName}" : "Вставить из {productName}", - "Show something" : "Показать" + "Show something" : "Показать", + "Default images" : "Изображения по умолчанию" }, "nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"); diff --git a/apps/dashboard/l10n/ru.json b/apps/dashboard/l10n/ru.json index 38f93527cfa..d90b60888ac 100644 --- a/apps/dashboard/l10n/ru.json +++ b/apps/dashboard/l10n/ru.json @@ -22,9 +22,9 @@ "Hello" : "Здравствуйте", "Hello, {name}" : "Здравствуйте, {name}!", "Pick from Files" : "Выбрать из файлов", - "Default images" : "Изображения по умолчанию", "Plain background" : "Обычный фон", "Insert from {productName}" : "Вставить из {productName}", - "Show something" : "Показать" + "Show something" : "Показать", + "Default images" : "Изображения по умолчанию" },"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/sc.js b/apps/dashboard/l10n/sc.js index 55329074a42..3bd840b88a1 100644 --- a/apps/dashboard/l10n/sc.js +++ b/apps/dashboard/l10n/sc.js @@ -23,9 +23,9 @@ OC.L10N.register( "Hello" : "Salude", "Hello, {name}" : "Salude, {name}", "Pick from Files" : "Sèbera dae archìvios", - "Default images" : "Imàgines predefinidas", "Plain background" : "Isfundu simpre", "Insert from {productName}" : "Inserta dae {productName}", - "Show something" : "Mustra calicuna cosa" + "Show something" : "Mustra calicuna cosa", + "Default images" : "Imàgines predefinidas" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/dashboard/l10n/sc.json b/apps/dashboard/l10n/sc.json index e40b1dae991..82d12a8b664 100644 --- a/apps/dashboard/l10n/sc.json +++ b/apps/dashboard/l10n/sc.json @@ -21,9 +21,9 @@ "Hello" : "Salude", "Hello, {name}" : "Salude, {name}", "Pick from Files" : "Sèbera dae archìvios", - "Default images" : "Imàgines predefinidas", "Plain background" : "Isfundu simpre", "Insert from {productName}" : "Inserta dae {productName}", - "Show something" : "Mustra calicuna cosa" + "Show something" : "Mustra calicuna cosa", + "Default images" : "Imàgines predefinidas" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/sk.js b/apps/dashboard/l10n/sk.js index 204ad0c06ad..8b413f079ef 100644 --- a/apps/dashboard/l10n/sk.js +++ b/apps/dashboard/l10n/sk.js @@ -24,9 +24,9 @@ OC.L10N.register( "Hello" : "Ahoj", "Hello, {name}" : "Ahoj, {name}", "Pick from Files" : "Vybrať zo súborov", - "Default images" : "Predvolené obrázky", "Plain background" : "Obyčajné pozadie", "Insert from {productName}" : "Vložiť z {productName}", - "Show something" : "Ukáž niečo" + "Show something" : "Ukáž niečo", + "Default images" : "Predvolené obrázky" }, "nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);"); diff --git a/apps/dashboard/l10n/sk.json b/apps/dashboard/l10n/sk.json index 1763114c516..b8effa24bf0 100644 --- a/apps/dashboard/l10n/sk.json +++ b/apps/dashboard/l10n/sk.json @@ -22,9 +22,9 @@ "Hello" : "Ahoj", "Hello, {name}" : "Ahoj, {name}", "Pick from Files" : "Vybrať zo súborov", - "Default images" : "Predvolené obrázky", "Plain background" : "Obyčajné pozadie", "Insert from {productName}" : "Vložiť z {productName}", - "Show something" : "Ukáž niečo" + "Show something" : "Ukáž niečo", + "Default images" : "Predvolené obrázky" },"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/sl.js b/apps/dashboard/l10n/sl.js index 6fc3c88f16c..13e8c88b4f9 100644 --- a/apps/dashboard/l10n/sl.js +++ b/apps/dashboard/l10n/sl.js @@ -22,9 +22,9 @@ OC.L10N.register( "Hello" : "Pozdravljeni", "Hello, {name}" : "Pozdravljeni, {name}", "Pick from Files" : "Izbor iz datotek", - "Default images" : "Privzete slike", "Plain background" : "Enostavno ozadje", "Insert from {productName}" : "Vstavi iz {productName}", - "Show something" : "Pokaži karkoli" + "Show something" : "Pokaži karkoli", + "Default images" : "Privzete slike" }, "nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"); diff --git a/apps/dashboard/l10n/sl.json b/apps/dashboard/l10n/sl.json index 59af42f6408..f6cc62a791f 100644 --- a/apps/dashboard/l10n/sl.json +++ b/apps/dashboard/l10n/sl.json @@ -20,9 +20,9 @@ "Hello" : "Pozdravljeni", "Hello, {name}" : "Pozdravljeni, {name}", "Pick from Files" : "Izbor iz datotek", - "Default images" : "Privzete slike", "Plain background" : "Enostavno ozadje", "Insert from {productName}" : "Vstavi iz {productName}", - "Show something" : "Pokaži karkoli" + "Show something" : "Pokaži karkoli", + "Default images" : "Privzete slike" },"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/sv.js b/apps/dashboard/l10n/sv.js index 757f5b22e4e..6981d09de53 100644 --- a/apps/dashboard/l10n/sv.js +++ b/apps/dashboard/l10n/sv.js @@ -23,9 +23,9 @@ OC.L10N.register( "Hello" : "Hej", "Hello, {name}" : "Hej, {name}", "Pick from Files" : "Välj från filer", - "Default images" : "Standardbilder", "Plain background" : "Enkel bakgrund", "Insert from {productName}" : "Infoga från {productName}", - "Show something" : "Visa någonting" + "Show something" : "Visa någonting", + "Default images" : "Standardbilder" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/dashboard/l10n/sv.json b/apps/dashboard/l10n/sv.json index 463c9887a25..88b1f9c6c7a 100644 --- a/apps/dashboard/l10n/sv.json +++ b/apps/dashboard/l10n/sv.json @@ -21,9 +21,9 @@ "Hello" : "Hej", "Hello, {name}" : "Hej, {name}", "Pick from Files" : "Välj från filer", - "Default images" : "Standardbilder", "Plain background" : "Enkel bakgrund", "Insert from {productName}" : "Infoga från {productName}", - "Show something" : "Visa någonting" + "Show something" : "Visa någonting", + "Default images" : "Standardbilder" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/th.js b/apps/dashboard/l10n/th.js index 8df932fd230..d2e9d7e6013 100644 --- a/apps/dashboard/l10n/th.js +++ b/apps/dashboard/l10n/th.js @@ -23,9 +23,9 @@ OC.L10N.register( "Hello" : "สวัสดี", "Hello, {name}" : "สวัสดี {name}", "Pick from Files" : "เลือกจากไฟล์", - "Default images" : "รูปภาพเริ่มต้น", "Plain background" : "พื้นหลังเปล่า", "Insert from {productName}" : "แทรกจาก {productName}", - "Show something" : "แสดงบางอย่าง" + "Show something" : "แสดงบางอย่าง", + "Default images" : "รูปภาพเริ่มต้น" }, "nplurals=1; plural=0;"); diff --git a/apps/dashboard/l10n/th.json b/apps/dashboard/l10n/th.json index d61df56f77e..a7303b1b011 100644 --- a/apps/dashboard/l10n/th.json +++ b/apps/dashboard/l10n/th.json @@ -21,9 +21,9 @@ "Hello" : "สวัสดี", "Hello, {name}" : "สวัสดี {name}", "Pick from Files" : "เลือกจากไฟล์", - "Default images" : "รูปภาพเริ่มต้น", "Plain background" : "พื้นหลังเปล่า", "Insert from {productName}" : "แทรกจาก {productName}", - "Show something" : "แสดงบางอย่าง" + "Show something" : "แสดงบางอย่าง", + "Default images" : "รูปภาพเริ่มต้น" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/tr.js b/apps/dashboard/l10n/tr.js index c4dc25dad4c..e898b876e41 100644 --- a/apps/dashboard/l10n/tr.js +++ b/apps/dashboard/l10n/tr.js @@ -24,9 +24,9 @@ OC.L10N.register( "Hello" : "Merhaba", "Hello, {name}" : "Merhaba {name}", "Pick from Files" : "Dosyalardan seçin", - "Default images" : "Varsayılan görseller", "Plain background" : "Düz arka plan", "Insert from {productName}" : "{productName} üzerinden ekle", - "Show something" : "Bir şeyler görüntüle" + "Show something" : "Bir şeyler görüntüle", + "Default images" : "Varsayılan görseller" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/dashboard/l10n/tr.json b/apps/dashboard/l10n/tr.json index c53a63609bf..f8217e2e42c 100644 --- a/apps/dashboard/l10n/tr.json +++ b/apps/dashboard/l10n/tr.json @@ -22,9 +22,9 @@ "Hello" : "Merhaba", "Hello, {name}" : "Merhaba {name}", "Pick from Files" : "Dosyalardan seçin", - "Default images" : "Varsayılan görseller", "Plain background" : "Düz arka plan", "Insert from {productName}" : "{productName} üzerinden ekle", - "Show something" : "Bir şeyler görüntüle" + "Show something" : "Bir şeyler görüntüle", + "Default images" : "Varsayılan görseller" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/zh_CN.js b/apps/dashboard/l10n/zh_CN.js index b80315cf984..d208eb33d25 100644 --- a/apps/dashboard/l10n/zh_CN.js +++ b/apps/dashboard/l10n/zh_CN.js @@ -23,9 +23,9 @@ OC.L10N.register( "Hello" : "你好", "Hello, {name}" : "你好, {name}", "Pick from Files" : "从文件中挑选", - "Default images" : "默认图片", "Plain background" : "纯色背景", "Insert from {productName}" : "从 {productName} 插入", - "Show something" : "显示信息" + "Show something" : "显示信息", + "Default images" : "默认图片" }, "nplurals=1; plural=0;"); diff --git a/apps/dashboard/l10n/zh_CN.json b/apps/dashboard/l10n/zh_CN.json index 21474404d07..84c49c87e1e 100644 --- a/apps/dashboard/l10n/zh_CN.json +++ b/apps/dashboard/l10n/zh_CN.json @@ -21,9 +21,9 @@ "Hello" : "你好", "Hello, {name}" : "你好, {name}", "Pick from Files" : "从文件中挑选", - "Default images" : "默认图片", "Plain background" : "纯色背景", "Insert from {productName}" : "从 {productName} 插入", - "Show something" : "显示信息" + "Show something" : "显示信息", + "Default images" : "默认图片" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/zh_HK.js b/apps/dashboard/l10n/zh_HK.js index 9369ad746f7..5be60458c59 100644 --- a/apps/dashboard/l10n/zh_HK.js +++ b/apps/dashboard/l10n/zh_HK.js @@ -24,9 +24,10 @@ OC.L10N.register( "Hello" : "哈囉", "Hello, {name}" : "哈囉,{name}", "Pick from Files" : "從檔案選取", - "Default images" : "默認圖像", + "Default image" : "默認圖像", "Plain background" : "簡單背景", "Insert from {productName}" : "插入自 {productName}", - "Show something" : "顯示一些東西" + "Show something" : "顯示一些東西", + "Default images" : "默認圖像" }, "nplurals=1; plural=0;"); diff --git a/apps/dashboard/l10n/zh_HK.json b/apps/dashboard/l10n/zh_HK.json index df6bf1b3d8b..306f7fff1f4 100644 --- a/apps/dashboard/l10n/zh_HK.json +++ b/apps/dashboard/l10n/zh_HK.json @@ -22,9 +22,10 @@ "Hello" : "哈囉", "Hello, {name}" : "哈囉,{name}", "Pick from Files" : "從檔案選取", - "Default images" : "默認圖像", + "Default image" : "默認圖像", "Plain background" : "簡單背景", "Insert from {productName}" : "插入自 {productName}", - "Show something" : "顯示一些東西" + "Show something" : "顯示一些東西", + "Default images" : "默認圖像" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/zh_TW.js b/apps/dashboard/l10n/zh_TW.js index fc1d52625b1..07daf5fce48 100644 --- a/apps/dashboard/l10n/zh_TW.js +++ b/apps/dashboard/l10n/zh_TW.js @@ -24,9 +24,10 @@ OC.L10N.register( "Hello" : "嗨", "Hello, {name}" : "嗨,{name}", "Pick from Files" : "從檔案選取", - "Default images" : "預設圖片", + "Default image" : "預設影像", "Plain background" : "簡單背景", "Insert from {productName}" : "插入自 {productName}", - "Show something" : "顯示一些東西" + "Show something" : "顯示一些東西", + "Default images" : "預設圖片" }, "nplurals=1; plural=0;"); diff --git a/apps/dashboard/l10n/zh_TW.json b/apps/dashboard/l10n/zh_TW.json index 940d1c42857..eaeb0030f4c 100644 --- a/apps/dashboard/l10n/zh_TW.json +++ b/apps/dashboard/l10n/zh_TW.json @@ -22,9 +22,10 @@ "Hello" : "嗨", "Hello, {name}" : "嗨,{name}", "Pick from Files" : "從檔案選取", - "Default images" : "預設圖片", + "Default image" : "預設影像", "Plain background" : "簡單背景", "Insert from {productName}" : "插入自 {productName}", - "Show something" : "顯示一些東西" + "Show something" : "顯示一些東西", + "Default images" : "預設圖片" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/dashboard/src/components/BackgroundSettings.vue b/apps/dashboard/src/components/BackgroundSettings.vue index 3fd82768267..101ecaaa742 100644 --- a/apps/dashboard/src/components/BackgroundSettings.vue +++ b/apps/dashboard/src/components/BackgroundSettings.vue @@ -32,7 +32,7 @@ tabindex="0" :class="{ 'icon-loading': loading === 'default', active: background === 'default' }" @click="setDefault"> - {{ t('dashboard', 'Default images') }} + {{ t('dashboard', 'Default image') }} </button> <button class="background color" :class="{ active: background === 'custom' }" diff --git a/apps/dav/l10n/cs.js b/apps/dav/l10n/cs.js index f15065305a6..5bd83c3b256 100644 --- a/apps/dav/l10n/cs.js +++ b/apps/dav/l10n/cs.js @@ -84,7 +84,7 @@ OC.L10N.register( "Organizer:" : "Organizátor:", "Attendees:" : "Účastníci:", "Accept" : "Přijmout", - "Decline" : "Zamítnout", + "Decline" : "Odmítnout", "More options …" : "Další volby…", "More options at %s" : "Další volby viz %s", "Contacts" : "Kontakty", @@ -165,7 +165,7 @@ OC.L10N.register( "Saved availability" : "Uložena dostupnost", "Failed to save availability" : "Nepodařilo se uložit dostupnost", "Calendar server" : "Kalendářový server", - "Send invitations to attendees" : "Poslat pozvánky na adresy účastníků", + "Send invitations to attendees" : "Poslat účastníkům pozvánky", "Automatically generate a birthday calendar" : "Automaticky vytvořit kalendář s narozeninami", "Birthday calendars will be generated by a background job." : "Kalendáře s narozeninami budou vytvářeny úlohou na pozadí.", "Hence they will not be available immediately after enabling but will show up after some time." : "A tedy nebudou zpřístupněny ihned po povolení, ale objeví se až se zpožděním.", diff --git a/apps/dav/l10n/cs.json b/apps/dav/l10n/cs.json index 91635a5353f..a43434e59c9 100644 --- a/apps/dav/l10n/cs.json +++ b/apps/dav/l10n/cs.json @@ -82,7 +82,7 @@ "Organizer:" : "Organizátor:", "Attendees:" : "Účastníci:", "Accept" : "Přijmout", - "Decline" : "Zamítnout", + "Decline" : "Odmítnout", "More options …" : "Další volby…", "More options at %s" : "Další volby viz %s", "Contacts" : "Kontakty", @@ -163,7 +163,7 @@ "Saved availability" : "Uložena dostupnost", "Failed to save availability" : "Nepodařilo se uložit dostupnost", "Calendar server" : "Kalendářový server", - "Send invitations to attendees" : "Poslat pozvánky na adresy účastníků", + "Send invitations to attendees" : "Poslat účastníkům pozvánky", "Automatically generate a birthday calendar" : "Automaticky vytvořit kalendář s narozeninami", "Birthday calendars will be generated by a background job." : "Kalendáře s narozeninami budou vytvářeny úlohou na pozadí.", "Hence they will not be available immediately after enabling but will show up after some time." : "A tedy nebudou zpřístupněny ihned po povolení, ale objeví se až se zpožděním.", diff --git a/apps/dav/l10n/fi.js b/apps/dav/l10n/fi.js index ac1dc646a9b..a8a70f08b89 100644 --- a/apps/dav/l10n/fi.js +++ b/apps/dav/l10n/fi.js @@ -51,6 +51,7 @@ OC.L10N.register( "Date: %s" : "Päiväys: %s", "Description: %s" : "Kuvaus: %s", "Where: %s" : "Missä: %s", + "%1$s via %2$s" : "%1$s palvelun %2$s kautta", "Cancelled: %1$s" : "Peruutettu: %1$s", "Invitation canceled" : "Kutsu peruttu", "Invitation updated" : "Kutsu päivitetty", diff --git a/apps/dav/l10n/fi.json b/apps/dav/l10n/fi.json index 2f3691370ea..d8e6f00713b 100644 --- a/apps/dav/l10n/fi.json +++ b/apps/dav/l10n/fi.json @@ -49,6 +49,7 @@ "Date: %s" : "Päiväys: %s", "Description: %s" : "Kuvaus: %s", "Where: %s" : "Missä: %s", + "%1$s via %2$s" : "%1$s palvelun %2$s kautta", "Cancelled: %1$s" : "Peruutettu: %1$s", "Invitation canceled" : "Kutsu peruttu", "Invitation updated" : "Kutsu päivitetty", diff --git a/apps/dav/l10n/nb.js b/apps/dav/l10n/nb.js index c0a92521f9a..33f8ed18e2e 100644 --- a/apps/dav/l10n/nb.js +++ b/apps/dav/l10n/nb.js @@ -30,6 +30,7 @@ OC.L10N.register( "{actor} updated event {event} in calendar {calendar}" : "{actor} oppdaterte hendelsen {event} i kalenderen {calendar}", "You updated event {event} in calendar {calendar}" : "Du oppdaterte hendelsen {event} i kalenderen {calendar}", "Busy" : "Opptatt", + "Calendar, contacts and tasks" : "Kalender, kontakter og oppgaver", "A <strong>calendar</strong> was modified" : "En <strong>kalender</strong> ble endret", "A calendar <strong>event</strong> was modified" : "En kalender <strong>hendelse</strong> ble endret", "Contact birthdays" : "Kontakters fødelsdag", diff --git a/apps/dav/l10n/nb.json b/apps/dav/l10n/nb.json index d60fa424bd7..013228515ab 100644 --- a/apps/dav/l10n/nb.json +++ b/apps/dav/l10n/nb.json @@ -28,6 +28,7 @@ "{actor} updated event {event} in calendar {calendar}" : "{actor} oppdaterte hendelsen {event} i kalenderen {calendar}", "You updated event {event} in calendar {calendar}" : "Du oppdaterte hendelsen {event} i kalenderen {calendar}", "Busy" : "Opptatt", + "Calendar, contacts and tasks" : "Kalender, kontakter og oppgaver", "A <strong>calendar</strong> was modified" : "En <strong>kalender</strong> ble endret", "A calendar <strong>event</strong> was modified" : "En kalender <strong>hendelse</strong> ble endret", "Contact birthdays" : "Kontakters fødelsdag", diff --git a/apps/dav/lib/CardDAV/CardDavBackend.php b/apps/dav/lib/CardDAV/CardDavBackend.php index a9ca2eb30a3..6b60d6701d4 100644 --- a/apps/dav/lib/CardDAV/CardDavBackend.php +++ b/apps/dav/lib/CardDAV/CardDavBackend.php @@ -933,6 +933,12 @@ class CardDavBackend implements BackendInterface, SyncSupport { $cardData = stream_get_contents($cardData); } + // Micro optimisation + // don't loop through + if (strpos($cardData, 'PHOTO:data:') === 0) { + return $cardData; + } + $cardDataArray = explode("\r\n", $cardData); $cardDataFiltered = []; @@ -956,7 +962,6 @@ class CardDavBackend implements BackendInterface, SyncSupport { $cardDataFiltered[] = $line; } - return implode("\r\n", $cardDataFiltered); } diff --git a/apps/encryption/l10n/en_GB.js b/apps/encryption/l10n/en_GB.js index 2745d61b540..f741e77fd69 100644 --- a/apps/encryption/l10n/en_GB.js +++ b/apps/encryption/l10n/en_GB.js @@ -28,11 +28,15 @@ OC.L10N.register( "Bad Signature" : "Bad Signature", "Missing Signature" : "Missing Signature", "one-time password for server-side-encryption" : "one-time password for server-side-encryption", + "Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you.", + "Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you.", "Default encryption module" : "Default encryption module", "Default encryption module for server-side encryption" : "Default encryption module for server-side encryption", "In order to use this encryption module you need to enable server-side\n\t\tencryption in the admin settings. Once enabled this module will encrypt\n\t\tall your files transparently. The encryption is based on AES 256 keys.\n\t\tThe module won't touch existing files, only new files will be encrypted\n\t\tafter server-side encryption was enabled. It is also not possible to\n\t\tdisable the encryption again and switch back to a unencrypted system.\n\t\tPlease read the documentation to know all implications before you decide\n\t\tto enable server-side encryption." : "In order to use this encryption module you need to enable server-side\n\t\tencryption in the admin settings. Once enabled this module will encrypt\n\t\tall your files transparently. The encryption is based on AES 256 keys.\n\t\tThe module won't touch existing files, only new files will be encrypted\n\t\tafter server-side encryption was enabled. It is also not possible to\n\t\tdisable the encryption again and switch back to a unencrypted system.\n\t\tPlease read the documentation to know all implications before you decide\n\t\tto enable server-side encryption.", + "Hey there,\n\nThe administration enabled server-side-encryption. Your files were encrypted using the password \"%s\".\n\nPlease login to the web interface, go to the section \"Basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"Old log-in password\" field and your current login-password.\n\n" : "Hey there,\n\nThe administration enabled server-side-encryption. Your files were encrypted using the password \"%s\".\n\nPlease login to the web interface, go to the section \"Basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"Old log-in password\" field and your current login-password.\n\n", "The share will expire on %s." : "The share will expire on %s.", "Cheers!" : "Cheers!", + "Hey there,<br><br>The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"Basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"Old log-in password\" field and your current login-password.<br><br>" : "Hey there,<br><br>The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"Basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"Old log-in password\" field and your current login-password.<br><br>", "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Encryption app is enabled but your keys are not initialised, please log-out and log-in again", "Encrypt the home storage" : "Encrypt the home storage", "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted", @@ -57,6 +61,7 @@ OC.L10N.register( "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss", "Enabled" : "Enabled", "Disabled" : "Disabled", + "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password \"%s\".\n\nPlease login to the web interface, go to the section \"basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.\n\n" : "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password \"%s\".\n\nPlease login to the web interface, go to the section \"basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.\n\n", "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/encryption/l10n/en_GB.json b/apps/encryption/l10n/en_GB.json index 216ec6a8a14..d5c3f16b8b5 100644 --- a/apps/encryption/l10n/en_GB.json +++ b/apps/encryption/l10n/en_GB.json @@ -26,11 +26,15 @@ "Bad Signature" : "Bad Signature", "Missing Signature" : "Missing Signature", "one-time password for server-side-encryption" : "one-time password for server-side-encryption", + "Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you.", + "Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you.", "Default encryption module" : "Default encryption module", "Default encryption module for server-side encryption" : "Default encryption module for server-side encryption", "In order to use this encryption module you need to enable server-side\n\t\tencryption in the admin settings. Once enabled this module will encrypt\n\t\tall your files transparently. The encryption is based on AES 256 keys.\n\t\tThe module won't touch existing files, only new files will be encrypted\n\t\tafter server-side encryption was enabled. It is also not possible to\n\t\tdisable the encryption again and switch back to a unencrypted system.\n\t\tPlease read the documentation to know all implications before you decide\n\t\tto enable server-side encryption." : "In order to use this encryption module you need to enable server-side\n\t\tencryption in the admin settings. Once enabled this module will encrypt\n\t\tall your files transparently. The encryption is based on AES 256 keys.\n\t\tThe module won't touch existing files, only new files will be encrypted\n\t\tafter server-side encryption was enabled. It is also not possible to\n\t\tdisable the encryption again and switch back to a unencrypted system.\n\t\tPlease read the documentation to know all implications before you decide\n\t\tto enable server-side encryption.", + "Hey there,\n\nThe administration enabled server-side-encryption. Your files were encrypted using the password \"%s\".\n\nPlease login to the web interface, go to the section \"Basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"Old log-in password\" field and your current login-password.\n\n" : "Hey there,\n\nThe administration enabled server-side-encryption. Your files were encrypted using the password \"%s\".\n\nPlease login to the web interface, go to the section \"Basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"Old log-in password\" field and your current login-password.\n\n", "The share will expire on %s." : "The share will expire on %s.", "Cheers!" : "Cheers!", + "Hey there,<br><br>The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"Basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"Old log-in password\" field and your current login-password.<br><br>" : "Hey there,<br><br>The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"Basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"Old log-in password\" field and your current login-password.<br><br>", "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Encryption app is enabled but your keys are not initialised, please log-out and log-in again", "Encrypt the home storage" : "Encrypt the home storage", "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted", @@ -55,6 +59,7 @@ "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss", "Enabled" : "Enabled", "Disabled" : "Disabled", + "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password \"%s\".\n\nPlease login to the web interface, go to the section \"basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.\n\n" : "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password \"%s\".\n\nPlease login to the web interface, go to the section \"basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.\n\n", "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/encryption/l10n/tr.js b/apps/encryption/l10n/tr.js index 8e7492d76c3..6259955d22a 100644 --- a/apps/encryption/l10n/tr.js +++ b/apps/encryption/l10n/tr.js @@ -34,7 +34,7 @@ OC.L10N.register( "Default encryption module for server-side encryption" : "Sunucu tarafında şifreleme için varsayılan şifreleme modülü", "In order to use this encryption module you need to enable server-side\n\t\tencryption in the admin settings. Once enabled this module will encrypt\n\t\tall your files transparently. The encryption is based on AES 256 keys.\n\t\tThe module won't touch existing files, only new files will be encrypted\n\t\tafter server-side encryption was enabled. It is also not possible to\n\t\tdisable the encryption again and switch back to a unencrypted system.\n\t\tPlease read the documentation to know all implications before you decide\n\t\tto enable server-side encryption." : "Bu şifreleme modülünün kullanılması için sunucu tarafında yönetim bölümünden\n\t\tşifreleme seçeneği etkinleştirilmelidir. Bu modül etkinleştirildikten sonra \n\t\ttüm dosyalarınızı size farkettirmeden şifreler. Şifreleme AES 256 anahtarları\n\t\tile yapılır. Modül var olan dosyaları değiştirmez, yalnızca sunucu tarafında \n\t\tşifreleme etkinleştirildikten sonra eklenen yeni dosyalar şifrelenir. \n\t\tŞifreleme etkinleştirildikten sonra devre dışı bırakılamaz ve şifreleme olmayan\n\t\tsisteme geri dönülemez. Lütfen sunucu tarafı şifrelemeyi etkinleştirmeden önce\n\t\tbelgeleri okuyun ve uygulamadan doğacak tüm sonuçlarını öğrenin.", "Hey there,\n\nThe administration enabled server-side-encryption. Your files were encrypted using the password \"%s\".\n\nPlease login to the web interface, go to the section \"Basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"Old log-in password\" field and your current login-password.\n\n" : "Selam,\n\nSistem yöneticisi sunucu tarafında şifrelemeyi etkinleştirdi. Dosyalarınız \"%s\" parolası kullanılarak şifrelendi.\n\nLütfen web arayüzünde oturum açın ve kişisel ayarlarınızdan \"Temel şifreleme modülü\" bölümüne giderek \"Eski oturum açma parolası\" alanına bu parolayı ve geçerli oturum açma parolanızı yazarak şifreleme parolanızı güncelleyin.\n\n", - "The share will expire on %s." : "Bu paylaşım %s tarihinde sona erecek.", + "The share will expire on %s." : "Bu paylaşımın geçerlilik süresi %s tarihinde dolacak.", "Cheers!" : "Hoşçakalın!", "Hey there,<br><br>The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"Basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"Old log-in password\" field and your current login-password.<br><br>" : "Selam,<br><br>Sistem yöneticisi sunucu tarafında şifrelemeyi etkinleştirdi. Dosyalarınız <strong>%s</strong> parolası kullanılarak şifrelendi.<br><br>Lütfen web arayüzünde oturum açın ve kişisel ayarlarınızdan \"Temel şifreleme modülü\" bölümüne giderek \"Eski oturum açma parolası\" alanına bu parolayı ve geçerli oturum açma parolanızı yazarak şifreleme parolanızı güncelleyin.<br><br>", "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Şifreleme uygulaması etkin ancak anahtarlarınız hazırlanmamış. Lütfen oturumunuzu kapatıp yeniden açın.", diff --git a/apps/encryption/l10n/tr.json b/apps/encryption/l10n/tr.json index ac4cc3ffd37..4764b3405ee 100644 --- a/apps/encryption/l10n/tr.json +++ b/apps/encryption/l10n/tr.json @@ -32,7 +32,7 @@ "Default encryption module for server-side encryption" : "Sunucu tarafında şifreleme için varsayılan şifreleme modülü", "In order to use this encryption module you need to enable server-side\n\t\tencryption in the admin settings. Once enabled this module will encrypt\n\t\tall your files transparently. The encryption is based on AES 256 keys.\n\t\tThe module won't touch existing files, only new files will be encrypted\n\t\tafter server-side encryption was enabled. It is also not possible to\n\t\tdisable the encryption again and switch back to a unencrypted system.\n\t\tPlease read the documentation to know all implications before you decide\n\t\tto enable server-side encryption." : "Bu şifreleme modülünün kullanılması için sunucu tarafında yönetim bölümünden\n\t\tşifreleme seçeneği etkinleştirilmelidir. Bu modül etkinleştirildikten sonra \n\t\ttüm dosyalarınızı size farkettirmeden şifreler. Şifreleme AES 256 anahtarları\n\t\tile yapılır. Modül var olan dosyaları değiştirmez, yalnızca sunucu tarafında \n\t\tşifreleme etkinleştirildikten sonra eklenen yeni dosyalar şifrelenir. \n\t\tŞifreleme etkinleştirildikten sonra devre dışı bırakılamaz ve şifreleme olmayan\n\t\tsisteme geri dönülemez. Lütfen sunucu tarafı şifrelemeyi etkinleştirmeden önce\n\t\tbelgeleri okuyun ve uygulamadan doğacak tüm sonuçlarını öğrenin.", "Hey there,\n\nThe administration enabled server-side-encryption. Your files were encrypted using the password \"%s\".\n\nPlease login to the web interface, go to the section \"Basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"Old log-in password\" field and your current login-password.\n\n" : "Selam,\n\nSistem yöneticisi sunucu tarafında şifrelemeyi etkinleştirdi. Dosyalarınız \"%s\" parolası kullanılarak şifrelendi.\n\nLütfen web arayüzünde oturum açın ve kişisel ayarlarınızdan \"Temel şifreleme modülü\" bölümüne giderek \"Eski oturum açma parolası\" alanına bu parolayı ve geçerli oturum açma parolanızı yazarak şifreleme parolanızı güncelleyin.\n\n", - "The share will expire on %s." : "Bu paylaşım %s tarihinde sona erecek.", + "The share will expire on %s." : "Bu paylaşımın geçerlilik süresi %s tarihinde dolacak.", "Cheers!" : "Hoşçakalın!", "Hey there,<br><br>The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"Basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"Old log-in password\" field and your current login-password.<br><br>" : "Selam,<br><br>Sistem yöneticisi sunucu tarafında şifrelemeyi etkinleştirdi. Dosyalarınız <strong>%s</strong> parolası kullanılarak şifrelendi.<br><br>Lütfen web arayüzünde oturum açın ve kişisel ayarlarınızdan \"Temel şifreleme modülü\" bölümüne giderek \"Eski oturum açma parolası\" alanına bu parolayı ve geçerli oturum açma parolanızı yazarak şifreleme parolanızı güncelleyin.<br><br>", "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Şifreleme uygulaması etkin ancak anahtarlarınız hazırlanmamış. Lütfen oturumunuzu kapatıp yeniden açın.", diff --git a/apps/federatedfilesharing/l10n/fi.js b/apps/federatedfilesharing/l10n/fi.js index dc163068be2..0cdf732f3f9 100644 --- a/apps/federatedfilesharing/l10n/fi.js +++ b/apps/federatedfilesharing/l10n/fi.js @@ -13,6 +13,7 @@ OC.L10N.register( "Federated Share request sent, you will receive an invitation. Check your notifications." : "Federoidun jakamisen pyyntö lähetetty, saat kutsun. Tarkista ilmoitukset.", "Couldn't establish a federated share, it looks like the server to federate with is too old (Nextcloud <= 9)." : "Federoitua jakoa ei voitu muodostaa. Vaikuttaa siltä, että palvelin jonka kanssa federointia yritetään, on versioltaan liian vanha (Nextcloud <= 9).", "It is not allowed to send federated group shares from this server." : "Federoitujen ryhmäjakojen lähettäminen tältä palvelimelta ei ole sallittu.", + "Sharing %1$s failed, because this item is already shared with user %2$s" : "Kohteen %1$s jakaminen epäonnistui, koska tämä kohde on jo jaettu käyttäjän %2$s kanssa", "Not allowed to create a federated share with the same user" : "Saman käyttäjän kanssa ei ole sallittua luoda federoitua jakoa", "Federated shares require read permissions" : "Federoidut jaot vaativat lukuoikeuksia", "File is already shared with %s" : "Tiedosto on jo jaettu kohteen %s kanssa", diff --git a/apps/federatedfilesharing/l10n/fi.json b/apps/federatedfilesharing/l10n/fi.json index a627009b843..78f327dba5f 100644 --- a/apps/federatedfilesharing/l10n/fi.json +++ b/apps/federatedfilesharing/l10n/fi.json @@ -11,6 +11,7 @@ "Federated Share request sent, you will receive an invitation. Check your notifications." : "Federoidun jakamisen pyyntö lähetetty, saat kutsun. Tarkista ilmoitukset.", "Couldn't establish a federated share, it looks like the server to federate with is too old (Nextcloud <= 9)." : "Federoitua jakoa ei voitu muodostaa. Vaikuttaa siltä, että palvelin jonka kanssa federointia yritetään, on versioltaan liian vanha (Nextcloud <= 9).", "It is not allowed to send federated group shares from this server." : "Federoitujen ryhmäjakojen lähettäminen tältä palvelimelta ei ole sallittu.", + "Sharing %1$s failed, because this item is already shared with user %2$s" : "Kohteen %1$s jakaminen epäonnistui, koska tämä kohde on jo jaettu käyttäjän %2$s kanssa", "Not allowed to create a federated share with the same user" : "Saman käyttäjän kanssa ei ole sallittua luoda federoitua jakoa", "Federated shares require read permissions" : "Federoidut jaot vaativat lukuoikeuksia", "File is already shared with %s" : "Tiedosto on jo jaettu kohteen %s kanssa", diff --git a/apps/federatedfilesharing/l10n/mk.js b/apps/federatedfilesharing/l10n/mk.js index 735c4d3c947..ff1077f9d40 100644 --- a/apps/federatedfilesharing/l10n/mk.js +++ b/apps/federatedfilesharing/l10n/mk.js @@ -15,6 +15,7 @@ OC.L10N.register( "It is not allowed to send federated group shares from this server." : "Не е овозможено да испратите федерално групно споделување од овој сервер.", "Sharing %1$s failed, because this item is already shared with user %2$s" : "Споделувањето на %1$s е неуспешно, бидејќи истото веќе е споделено со корисникот %2$s", "Not allowed to create a federated share with the same user" : "Не е овозможено да креирате федерално споделување со ист корисник", + "Federated shares require read permissions" : "Федералното споделување бара дозволи за читање", "File is already shared with %s" : "Датотеката е веќе споделена со %s", "Sharing %1$s failed, could not find %2$s, maybe the server is currently unreachable or uses a self-signed certificate." : "Споделувањето на %1$s е неуспешно, неможе да се пронајде %2$s, можеби серверот моментално не е достапен или користи недоверлив сертификат.", "Could not find share" : "Неможе да се пронајде споделувањето", @@ -31,21 +32,28 @@ OC.L10N.register( "Sharing" : "Споделување", "Federated file sharing" : "Федерално споделување на датотеки", "Provide federated file sharing across servers" : "Обезбедете федерално споделување на датотеки помеѓу сервери", + "Adjust how people can share between servers. This includes shares between users on this server as well if they are using federated sharing." : "Прилагодете како луѓето можат да споделуваат помеѓу серверите. Ова ги вклучува споделувањата помеѓу корисниците на овој сервер, како и доколку користат федерално споделување.", "Allow users on this server to send shares to other servers (this option also allows WebDAV access to public shares)" : "Дозволи им на корисниците на овој сервер да испраќаат споделувања со други сервери (оваа можност истотака дозволува WebDAV пристап до јавни споделувања)", "Allow users on this server to receive shares from other servers" : "Дозволи им на корисниците на овој сервер да примаат споделувања од други сервери", "Allow users on this server to send shares to groups on other servers" : "Дозволи им на корисниците на овој сервер да испраќаат споделувања со групи на други сервери", "Allow users on this server to receive group shares from other servers" : "Дозволи им на корисниците на овој сервер да примаат споделувања од групи од други сервери", "Search global and public address book for users" : "Пребарајте го глобалниот и јавниот именик на корисници", "Allow users to publish their data to a global and public address book" : "Дозволи им на корисниците да објавуваат информации во глобалниот и јавниот именик ", + "Unable to update federated files sharing config" : "Неможе да се ажурираат параметрите за федерално споделување", "Federated Cloud" : "Федерален клауд", "You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Можете да споделувате со секој што користи Nextcloud сервер или друг вид на Open Cloud Mesh (OCM) компатибилен сервер или сервис! Само внесете го федералниот ID во полето за споделување. Треба да изгледа korisnik@cloud.primer.com", "Your Federated Cloud ID:" : "Вашиот федерален ID:", "Share it so your friends can share files with you:" : "Споделете и вашите пријатели ќе можат да споделуваат со вас:", + "Facebook" : "Facebook", "Twitter" : "Twitter", + "Diaspora" : "Diaspora", "Add to your website" : "Додади на твојот веб сајт", "Share with me via Nextcloud" : "Сподели со мене", "HTML Code:" : "HTML код:", + "Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Споделете со мене преку мојот Федерален Cloud ID, види {url}", + "Cloud ID copied to the clipboard" : "Cloud ID е копиран во клипборд", "Copy to clipboard" : "Копирај во клипборд", + "Clipboard is not available" : "Клипбордот не е достапен", "Copy" : "Копирај", "Copied!" : "Копирано!", "Not supported!" : "Не е поддржано!", diff --git a/apps/federatedfilesharing/l10n/mk.json b/apps/federatedfilesharing/l10n/mk.json index dd0ddd44957..6f142e328de 100644 --- a/apps/federatedfilesharing/l10n/mk.json +++ b/apps/federatedfilesharing/l10n/mk.json @@ -13,6 +13,7 @@ "It is not allowed to send federated group shares from this server." : "Не е овозможено да испратите федерално групно споделување од овој сервер.", "Sharing %1$s failed, because this item is already shared with user %2$s" : "Споделувањето на %1$s е неуспешно, бидејќи истото веќе е споделено со корисникот %2$s", "Not allowed to create a federated share with the same user" : "Не е овозможено да креирате федерално споделување со ист корисник", + "Federated shares require read permissions" : "Федералното споделување бара дозволи за читање", "File is already shared with %s" : "Датотеката е веќе споделена со %s", "Sharing %1$s failed, could not find %2$s, maybe the server is currently unreachable or uses a self-signed certificate." : "Споделувањето на %1$s е неуспешно, неможе да се пронајде %2$s, можеби серверот моментално не е достапен или користи недоверлив сертификат.", "Could not find share" : "Неможе да се пронајде споделувањето", @@ -29,21 +30,28 @@ "Sharing" : "Споделување", "Federated file sharing" : "Федерално споделување на датотеки", "Provide federated file sharing across servers" : "Обезбедете федерално споделување на датотеки помеѓу сервери", + "Adjust how people can share between servers. This includes shares between users on this server as well if they are using federated sharing." : "Прилагодете како луѓето можат да споделуваат помеѓу серверите. Ова ги вклучува споделувањата помеѓу корисниците на овој сервер, како и доколку користат федерално споделување.", "Allow users on this server to send shares to other servers (this option also allows WebDAV access to public shares)" : "Дозволи им на корисниците на овој сервер да испраќаат споделувања со други сервери (оваа можност истотака дозволува WebDAV пристап до јавни споделувања)", "Allow users on this server to receive shares from other servers" : "Дозволи им на корисниците на овој сервер да примаат споделувања од други сервери", "Allow users on this server to send shares to groups on other servers" : "Дозволи им на корисниците на овој сервер да испраќаат споделувања со групи на други сервери", "Allow users on this server to receive group shares from other servers" : "Дозволи им на корисниците на овој сервер да примаат споделувања од групи од други сервери", "Search global and public address book for users" : "Пребарајте го глобалниот и јавниот именик на корисници", "Allow users to publish their data to a global and public address book" : "Дозволи им на корисниците да објавуваат информации во глобалниот и јавниот именик ", + "Unable to update federated files sharing config" : "Неможе да се ажурираат параметрите за федерално споделување", "Federated Cloud" : "Федерален клауд", "You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Можете да споделувате со секој што користи Nextcloud сервер или друг вид на Open Cloud Mesh (OCM) компатибилен сервер или сервис! Само внесете го федералниот ID во полето за споделување. Треба да изгледа korisnik@cloud.primer.com", "Your Federated Cloud ID:" : "Вашиот федерален ID:", "Share it so your friends can share files with you:" : "Споделете и вашите пријатели ќе можат да споделуваат со вас:", + "Facebook" : "Facebook", "Twitter" : "Twitter", + "Diaspora" : "Diaspora", "Add to your website" : "Додади на твојот веб сајт", "Share with me via Nextcloud" : "Сподели со мене", "HTML Code:" : "HTML код:", + "Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Споделете со мене преку мојот Федерален Cloud ID, види {url}", + "Cloud ID copied to the clipboard" : "Cloud ID е копиран во клипборд", "Copy to clipboard" : "Копирај во клипборд", + "Clipboard is not available" : "Клипбордот не е достапен", "Copy" : "Копирај", "Copied!" : "Копирано!", "Not supported!" : "Не е поддржано!", diff --git a/apps/files/js/files.js b/apps/files/js/files.js index 1aa39eab523..8f456273f69 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -98,14 +98,15 @@ } if (response.data !== undefined && response.data.quota !== undefined + && response.data.total !== undefined && response.data.used !== undefined && response.data.usedSpacePercent !== undefined) { var humanUsed = OC.Util.humanFileSize(response.data.used, true); - var humanQuota = OC.Util.humanFileSize(response.data.quota, true); + var humanTotal = OC.Util.humanFileSize(response.data.total, true); if (response.data.quota > 0) { - $('#quota').attr('data-original-title', Math.floor(response.data.used/response.data.quota*1000)/10 + '%'); + $('#quota').attr('data-original-title', t('files', '{used}%', {used: Math.round(response.data.usedSpacePercent)})); $('#quota progress').val(response.data.usedSpacePercent); - $('#quotatext').html(t('files', '{used} of {quota} used', {used: humanUsed, quota: humanQuota})); + $('#quotatext').html(t('files', '{used} of {quota} used', {used: humanUsed, quota: humanTotal})); } else { $('#quotatext').html(t('files', '{used} used', {used: humanUsed})); } diff --git a/apps/files/l10n/ar.js b/apps/files/l10n/ar.js index 5582b3c5aa4..8ba8c5948be 100644 --- a/apps/files/l10n/ar.js +++ b/apps/files/l10n/ar.js @@ -181,7 +181,6 @@ OC.L10N.register( "Templates" : "القوالب", "Unable to initialize the templates directory" : "تعذر تهيئة دليل القوالب", "%s used" : "%s مُستخدَم", - "%s%% of %s used" : "%s%% من %s قيد الاستخدام", "%1$s of %2$s used" : "تم استخدام %1$s من %2$s", "Show hidden files" : "عرض الملفات المخفية", "Crop image previews" : "اقتصاص صورة العروض", @@ -210,6 +209,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "لا تملك الصلاحية لرفع او انشاء ملف هنا ", "New" : "جديد", "Cannot transfer ownership of a file or folder you don't own" : "لا يمكنك تحويل ملكية ملف أو مجلد ليس ملكك", + "%s%% of %s used" : "%s%% من %s قيد الاستخدام", "Settings" : "الإعدادات" }, "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"); diff --git a/apps/files/l10n/ar.json b/apps/files/l10n/ar.json index 0ccb3c3fa2e..3730af46f20 100644 --- a/apps/files/l10n/ar.json +++ b/apps/files/l10n/ar.json @@ -179,7 +179,6 @@ "Templates" : "القوالب", "Unable to initialize the templates directory" : "تعذر تهيئة دليل القوالب", "%s used" : "%s مُستخدَم", - "%s%% of %s used" : "%s%% من %s قيد الاستخدام", "%1$s of %2$s used" : "تم استخدام %1$s من %2$s", "Show hidden files" : "عرض الملفات المخفية", "Crop image previews" : "اقتصاص صورة العروض", @@ -208,6 +207,7 @@ "You don’t have permission to upload or create files here" : "لا تملك الصلاحية لرفع او انشاء ملف هنا ", "New" : "جديد", "Cannot transfer ownership of a file or folder you don't own" : "لا يمكنك تحويل ملكية ملف أو مجلد ليس ملكك", + "%s%% of %s used" : "%s%% من %s قيد الاستخدام", "Settings" : "الإعدادات" },"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" }
\ No newline at end of file diff --git a/apps/files/l10n/bg.js b/apps/files/l10n/bg.js index db892b8e9d2..35d78b4c345 100644 --- a/apps/files/l10n/bg.js +++ b/apps/files/l10n/bg.js @@ -77,6 +77,7 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["включително %n скрит","включително %n скрити"], "You do not have permission to upload or create files here" : "Нямате право да качвате или създавате файлове тук", "_Uploading %n file_::_Uploading %n files_" : ["Качване на %n файл","Качване на %n файла"], + "New file/folder menu" : "Ново меню за файл/папка", "Select file range" : "Избери от файловете", "{used} of {quota} used" : "{used} от {quota} използвани", "{used} used" : "{used} използвани", @@ -188,8 +189,8 @@ OC.L10N.register( "Templates" : "Шаблони", "Unable to initialize the templates directory" : "Неуспешно инициализиране на директорията с шаблони", "%s used" : "%s използвани", - "%s%% of %s used" : "%s%% от %s използвани", "%1$s of %2$s used" : "%1$s от %2$s използвани", + "Files settings" : "Настройки на файловете", "Show hidden files" : "Показвай и скрити файлове", "Crop image previews" : "Изрязване на визуализациите на изображение", "WebDAV" : "WebDAV", @@ -217,6 +218,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "Нямаш разрешение да създаваш или качваш файлове тук.", "New" : "Създай", "Cannot transfer ownership of a file or folder you don't own" : "Не можете да прехвърляте собственост върху файл или папка, които не притежавате", + "%s%% of %s used" : "%s%% от %s използвани", "Settings" : "Настройки" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/bg.json b/apps/files/l10n/bg.json index 2e09d87595b..a50ba6c3af5 100644 --- a/apps/files/l10n/bg.json +++ b/apps/files/l10n/bg.json @@ -75,6 +75,7 @@ "_including %n hidden_::_including %n hidden_" : ["включително %n скрит","включително %n скрити"], "You do not have permission to upload or create files here" : "Нямате право да качвате или създавате файлове тук", "_Uploading %n file_::_Uploading %n files_" : ["Качване на %n файл","Качване на %n файла"], + "New file/folder menu" : "Ново меню за файл/папка", "Select file range" : "Избери от файловете", "{used} of {quota} used" : "{used} от {quota} използвани", "{used} used" : "{used} използвани", @@ -186,8 +187,8 @@ "Templates" : "Шаблони", "Unable to initialize the templates directory" : "Неуспешно инициализиране на директорията с шаблони", "%s used" : "%s използвани", - "%s%% of %s used" : "%s%% от %s използвани", "%1$s of %2$s used" : "%1$s от %2$s използвани", + "Files settings" : "Настройки на файловете", "Show hidden files" : "Показвай и скрити файлове", "Crop image previews" : "Изрязване на визуализациите на изображение", "WebDAV" : "WebDAV", @@ -215,6 +216,7 @@ "You don’t have permission to upload or create files here" : "Нямаш разрешение да създаваш или качваш файлове тук.", "New" : "Създай", "Cannot transfer ownership of a file or folder you don't own" : "Не можете да прехвърляте собственост върху файл или папка, които не притежавате", + "%s%% of %s used" : "%s%% от %s използвани", "Settings" : "Настройки" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/br.js b/apps/files/l10n/br.js index 96ce8baf914..53ab9aad07b 100644 --- a/apps/files/l10n/br.js +++ b/apps/files/l10n/br.js @@ -157,7 +157,6 @@ OC.L10N.register( "Cancel" : "Arrest", "Create" : "Krouiñ", "%s used" : "%s implijet", - "%s%% of %s used" : "%s%% diwar %s implijet", "%1$s of %2$s used" : "%1$s diwar%2$s implijet", "Show hidden files" : "Diskouez ar restroù koachet", "WebDAV" : "WebDAV", @@ -184,6 +183,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "N'och ket aotreet kas pe krouiñ restroù amañ", "New" : "Nevez", "Cannot transfer ownership of a file or folder you don't own" : "N'hallit ket treuzkas perc'henniezh ur restr pe un teuliad ma n'oc'h ket e berc'henn", + "%s%% of %s used" : "%s%% diwar %s implijet", "Settings" : "Arventennoù" }, "nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > 19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 && n % 1000000 == 0) ? 3 : 4);"); diff --git a/apps/files/l10n/br.json b/apps/files/l10n/br.json index 5e2e26e4a9a..027510f207d 100644 --- a/apps/files/l10n/br.json +++ b/apps/files/l10n/br.json @@ -155,7 +155,6 @@ "Cancel" : "Arrest", "Create" : "Krouiñ", "%s used" : "%s implijet", - "%s%% of %s used" : "%s%% diwar %s implijet", "%1$s of %2$s used" : "%1$s diwar%2$s implijet", "Show hidden files" : "Diskouez ar restroù koachet", "WebDAV" : "WebDAV", @@ -182,6 +181,7 @@ "You don’t have permission to upload or create files here" : "N'och ket aotreet kas pe krouiñ restroù amañ", "New" : "Nevez", "Cannot transfer ownership of a file or folder you don't own" : "N'hallit ket treuzkas perc'henniezh ur restr pe un teuliad ma n'oc'h ket e berc'henn", + "%s%% of %s used" : "%s%% diwar %s implijet", "Settings" : "Arventennoù" },"pluralForm" :"nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > 19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 && n % 1000000 == 0) ? 3 : 4);" }
\ No newline at end of file diff --git a/apps/files/l10n/ca.js b/apps/files/l10n/ca.js index ede0a52f5ec..5eba7206698 100644 --- a/apps/files/l10n/ca.js +++ b/apps/files/l10n/ca.js @@ -187,7 +187,6 @@ OC.L10N.register( "Templates" : "Plantilles", "Unable to initialize the templates directory" : "No s'ha pogut inicialitzar la carpeta de plantilles", "%s used" : "%s en ús", - "%s%% of %s used" : "%s%% de %s en ús", "%1$s of %2$s used" : "%1$s de %2$s en ús", "Show hidden files" : "Mostra els fitxers ocults", "Crop image previews" : "Retalla les previsualitzacions de les imatges", @@ -216,6 +215,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "No teniu permís per a pujar o crear fitxers aquí", "New" : "Nou", "Cannot transfer ownership of a file or folder you don't own" : "No es pot transferir la propietat d'un fitxer o carpeta que no és vostre", + "%s%% of %s used" : "%s%% de %s en ús", "Settings" : "Paràmetres" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/ca.json b/apps/files/l10n/ca.json index 0b188ae2794..22398f75b8c 100644 --- a/apps/files/l10n/ca.json +++ b/apps/files/l10n/ca.json @@ -185,7 +185,6 @@ "Templates" : "Plantilles", "Unable to initialize the templates directory" : "No s'ha pogut inicialitzar la carpeta de plantilles", "%s used" : "%s en ús", - "%s%% of %s used" : "%s%% de %s en ús", "%1$s of %2$s used" : "%1$s de %2$s en ús", "Show hidden files" : "Mostra els fitxers ocults", "Crop image previews" : "Retalla les previsualitzacions de les imatges", @@ -214,6 +213,7 @@ "You don’t have permission to upload or create files here" : "No teniu permís per a pujar o crear fitxers aquí", "New" : "Nou", "Cannot transfer ownership of a file or folder you don't own" : "No es pot transferir la propietat d'un fitxer o carpeta que no és vostre", + "%s%% of %s used" : "%s%% de %s en ús", "Settings" : "Paràmetres" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/cs.js b/apps/files/l10n/cs.js index c1d53d6ac91..b1c43617130 100644 --- a/apps/files/l10n/cs.js +++ b/apps/files/l10n/cs.js @@ -189,7 +189,6 @@ OC.L10N.register( "Templates" : "Šablony", "Unable to initialize the templates directory" : "Nepodařilo se vytvořit složku pro šablony", "%s used" : "%s použito", - "%s%% of %s used" : "%s%% z %s použito", "%1$s of %2$s used" : "%1$s z %2$s použito", "Files settings" : "Nastavení pro Soubory", "Show hidden files" : "Zobrazit skryté soubory", @@ -219,6 +218,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "Nemáte oprávnění sem nahrávat nebo zde vytvářet soubory", "New" : "Nový", "Cannot transfer ownership of a file or folder you don't own" : "Není možné převést vlastnictví souboru či složky, které nejste vlastníky", + "%s%% of %s used" : "%s%% z %s použito", "Settings" : "Nastavení" }, "nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;"); diff --git a/apps/files/l10n/cs.json b/apps/files/l10n/cs.json index c7b6c551293..d2e99c4a7af 100644 --- a/apps/files/l10n/cs.json +++ b/apps/files/l10n/cs.json @@ -187,7 +187,6 @@ "Templates" : "Šablony", "Unable to initialize the templates directory" : "Nepodařilo se vytvořit složku pro šablony", "%s used" : "%s použito", - "%s%% of %s used" : "%s%% z %s použito", "%1$s of %2$s used" : "%1$s z %2$s použito", "Files settings" : "Nastavení pro Soubory", "Show hidden files" : "Zobrazit skryté soubory", @@ -217,6 +216,7 @@ "You don’t have permission to upload or create files here" : "Nemáte oprávnění sem nahrávat nebo zde vytvářet soubory", "New" : "Nový", "Cannot transfer ownership of a file or folder you don't own" : "Není možné převést vlastnictví souboru či složky, které nejste vlastníky", + "%s%% of %s used" : "%s%% z %s použito", "Settings" : "Nastavení" },"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;" }
\ No newline at end of file diff --git a/apps/files/l10n/da.js b/apps/files/l10n/da.js index b27617a3708..edfc696ff8d 100644 --- a/apps/files/l10n/da.js +++ b/apps/files/l10n/da.js @@ -188,7 +188,6 @@ OC.L10N.register( "Templates" : "Skabeloner", "Unable to initialize the templates directory" : "Kan ikke initialisere skabelonmappen", "%s used" : "%s brugt", - "%s%% of %s used" : "%s%% af %s brugt", "%1$s of %2$s used" : "%1$s af %2$s brugt", "Show hidden files" : "Vis skjulte filer", "Crop image previews" : "Beskær forhåndsvisninger af billeder", @@ -217,6 +216,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "Du har ikke tilladelse til at uploade eller oprette filer her", "New" : "Ny", "Cannot transfer ownership of a file or folder you don't own" : "Kan ikke overføre ejerskab af en fil eller mappe, du ikke ejer", + "%s%% of %s used" : "%s%% af %s brugt", "Settings" : "Indstillinger" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/da.json b/apps/files/l10n/da.json index b817a81e7c1..ba0b0d1ff0e 100644 --- a/apps/files/l10n/da.json +++ b/apps/files/l10n/da.json @@ -186,7 +186,6 @@ "Templates" : "Skabeloner", "Unable to initialize the templates directory" : "Kan ikke initialisere skabelonmappen", "%s used" : "%s brugt", - "%s%% of %s used" : "%s%% af %s brugt", "%1$s of %2$s used" : "%1$s af %2$s brugt", "Show hidden files" : "Vis skjulte filer", "Crop image previews" : "Beskær forhåndsvisninger af billeder", @@ -215,6 +214,7 @@ "You don’t have permission to upload or create files here" : "Du har ikke tilladelse til at uploade eller oprette filer her", "New" : "Ny", "Cannot transfer ownership of a file or folder you don't own" : "Kan ikke overføre ejerskab af en fil eller mappe, du ikke ejer", + "%s%% of %s used" : "%s%% af %s brugt", "Settings" : "Indstillinger" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/de.js b/apps/files/l10n/de.js index b7219502eb3..47ccddca591 100644 --- a/apps/files/l10n/de.js +++ b/apps/files/l10n/de.js @@ -188,7 +188,6 @@ OC.L10N.register( "Templates" : "Vorlagen", "Unable to initialize the templates directory" : "Der Vorlagenordner konnte nicht initialisiert werden", "%s used" : "%s verwendet", - "%s%% of %s used" : "%s%% von %s verwendet", "%1$s of %2$s used" : "%1$s von %2$s verwendet", "Show hidden files" : "Versteckte Dateien anzeigen", "Crop image previews" : "Bildvorschauen zuschneiden", @@ -217,6 +216,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "Du hast keine Berechtigung, hier Dateien hochzuladen oder zu erstellen", "New" : "Neu", "Cannot transfer ownership of a file or folder you don't own" : "Der Besitz einer Datei oder eines Ordners, den du nicht besitzt, kann nicht übertragen werden", + "%s%% of %s used" : "%s%% von %s verwendet", "Settings" : "Einstellungen" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/de.json b/apps/files/l10n/de.json index 04e7e303c7e..7236cca21d9 100644 --- a/apps/files/l10n/de.json +++ b/apps/files/l10n/de.json @@ -186,7 +186,6 @@ "Templates" : "Vorlagen", "Unable to initialize the templates directory" : "Der Vorlagenordner konnte nicht initialisiert werden", "%s used" : "%s verwendet", - "%s%% of %s used" : "%s%% von %s verwendet", "%1$s of %2$s used" : "%1$s von %2$s verwendet", "Show hidden files" : "Versteckte Dateien anzeigen", "Crop image previews" : "Bildvorschauen zuschneiden", @@ -215,6 +214,7 @@ "You don’t have permission to upload or create files here" : "Du hast keine Berechtigung, hier Dateien hochzuladen oder zu erstellen", "New" : "Neu", "Cannot transfer ownership of a file or folder you don't own" : "Der Besitz einer Datei oder eines Ordners, den du nicht besitzt, kann nicht übertragen werden", + "%s%% of %s used" : "%s%% von %s verwendet", "Settings" : "Einstellungen" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/de_DE.js b/apps/files/l10n/de_DE.js index 34c0c66e3ee..2e6eba6cefe 100644 --- a/apps/files/l10n/de_DE.js +++ b/apps/files/l10n/de_DE.js @@ -79,6 +79,7 @@ OC.L10N.register( "_Uploading %n file_::_Uploading %n files_" : ["%n Datei wird hoch geladen","%n Dateien werden hochgeladen"], "New file/folder menu" : "Menü für neue Datei/Ordner", "Select file range" : "Dateibereich auswählen", + "{used}%" : "{used}%", "{used} of {quota} used" : "{used} von {quota} verwendet", "{used} used" : "{used} verwendet", "\"{name}\" is an invalid file name." : "„{name}“ ist kein gültiger Dateiname.", @@ -189,7 +190,7 @@ OC.L10N.register( "Templates" : "Vorlagen", "Unable to initialize the templates directory" : "Der Vorlagenordner kann nicht initialisiert werden", "%s used" : "%s verwendet", - "%s%% of %s used" : "%s%% von %s verwendet", + "%s%%" : "%s%%", "%1$s of %2$s used" : "%1$s von %2$s verwendet", "Files settings" : "Dateien-Einstellungen", "Show hidden files" : "Versteckte Dateien anzeigen", @@ -219,6 +220,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "Sie haben keine Berechtigung, hier Dateien hochzuladen oder zu erstellen", "New" : "Neu", "Cannot transfer ownership of a file or folder you don't own" : "Der Besitz einer Datei oder eines Ordners, den Sie nicht besitzen, kann nicht übertragen werden", + "%s%% of %s used" : "%s%% von %s verwendet", "Settings" : "Einstellungen" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/de_DE.json b/apps/files/l10n/de_DE.json index b0422b12e10..2be92831370 100644 --- a/apps/files/l10n/de_DE.json +++ b/apps/files/l10n/de_DE.json @@ -77,6 +77,7 @@ "_Uploading %n file_::_Uploading %n files_" : ["%n Datei wird hoch geladen","%n Dateien werden hochgeladen"], "New file/folder menu" : "Menü für neue Datei/Ordner", "Select file range" : "Dateibereich auswählen", + "{used}%" : "{used}%", "{used} of {quota} used" : "{used} von {quota} verwendet", "{used} used" : "{used} verwendet", "\"{name}\" is an invalid file name." : "„{name}“ ist kein gültiger Dateiname.", @@ -187,7 +188,7 @@ "Templates" : "Vorlagen", "Unable to initialize the templates directory" : "Der Vorlagenordner kann nicht initialisiert werden", "%s used" : "%s verwendet", - "%s%% of %s used" : "%s%% von %s verwendet", + "%s%%" : "%s%%", "%1$s of %2$s used" : "%1$s von %2$s verwendet", "Files settings" : "Dateien-Einstellungen", "Show hidden files" : "Versteckte Dateien anzeigen", @@ -217,6 +218,7 @@ "You don’t have permission to upload or create files here" : "Sie haben keine Berechtigung, hier Dateien hochzuladen oder zu erstellen", "New" : "Neu", "Cannot transfer ownership of a file or folder you don't own" : "Der Besitz einer Datei oder eines Ordners, den Sie nicht besitzen, kann nicht übertragen werden", + "%s%% of %s used" : "%s%% von %s verwendet", "Settings" : "Einstellungen" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/el.js b/apps/files/l10n/el.js index 230ae9b6ff0..a21867c5fb8 100644 --- a/apps/files/l10n/el.js +++ b/apps/files/l10n/el.js @@ -186,7 +186,6 @@ OC.L10N.register( "Templates" : "Πρότυπα", "Unable to initialize the templates directory" : "Δεν είναι δυνατή η προετοιμασία του καταλόγου προτύπων", "%s used" : "%s σε χρήση", - "%s%% of %s used" : "%s%% από %s σε χρήση", "%1$s of %2$s used" : "χρησιμοποιούνται %1$s από %2$s", "Show hidden files" : "Εμφάνιση κρυφών αρχείων", "Crop image previews" : "Περικοπή προεπισκόπησης εικόνας", @@ -215,6 +214,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "Δεν έχετε δικαιώματα μεταφόρτωσης ή δημιουργίας αρχείων εδώ", "New" : "Νέο", "Cannot transfer ownership of a file or folder you don't own" : "Δεν μπορεί να μεταβιβαστεί η κυριότητα αρχείου ή φακέλου που δεν σας ανήκει", + "%s%% of %s used" : "%s%% από %s σε χρήση", "Settings" : "Ρυθμίσεις" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/el.json b/apps/files/l10n/el.json index 02130d5b321..c6c4c1f3fbb 100644 --- a/apps/files/l10n/el.json +++ b/apps/files/l10n/el.json @@ -184,7 +184,6 @@ "Templates" : "Πρότυπα", "Unable to initialize the templates directory" : "Δεν είναι δυνατή η προετοιμασία του καταλόγου προτύπων", "%s used" : "%s σε χρήση", - "%s%% of %s used" : "%s%% από %s σε χρήση", "%1$s of %2$s used" : "χρησιμοποιούνται %1$s από %2$s", "Show hidden files" : "Εμφάνιση κρυφών αρχείων", "Crop image previews" : "Περικοπή προεπισκόπησης εικόνας", @@ -213,6 +212,7 @@ "You don’t have permission to upload or create files here" : "Δεν έχετε δικαιώματα μεταφόρτωσης ή δημιουργίας αρχείων εδώ", "New" : "Νέο", "Cannot transfer ownership of a file or folder you don't own" : "Δεν μπορεί να μεταβιβαστεί η κυριότητα αρχείου ή φακέλου που δεν σας ανήκει", + "%s%% of %s used" : "%s%% από %s σε χρήση", "Settings" : "Ρυθμίσεις" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/eo.js b/apps/files/l10n/eo.js index fa1295d4c40..777d56fbd62 100644 --- a/apps/files/l10n/eo.js +++ b/apps/files/l10n/eo.js @@ -134,7 +134,6 @@ OC.L10N.register( "Cancel" : "Nuligi", "Create" : "Krei", "%s used" : "%s uzataj", - "%s%% of %s used" : "%s%% el %s uzataj", "%1$s of %2$s used" : "%1$s uzataj el %2$s", "Show hidden files" : "Montri kaŝitajn dosierojn", "WebDAV" : "WebDAV", @@ -158,6 +157,7 @@ OC.L10N.register( "Select" : "Elekti", "You don’t have permission to upload or create files here" : "Vi ne permesatas alŝuti aŭ krei dosierojn ĉi tie", "New" : "Nova", + "%s%% of %s used" : "%s%% el %s uzataj", "Settings" : "Agordo" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/eo.json b/apps/files/l10n/eo.json index 6412b0c265a..8be2f50b3ff 100644 --- a/apps/files/l10n/eo.json +++ b/apps/files/l10n/eo.json @@ -132,7 +132,6 @@ "Cancel" : "Nuligi", "Create" : "Krei", "%s used" : "%s uzataj", - "%s%% of %s used" : "%s%% el %s uzataj", "%1$s of %2$s used" : "%1$s uzataj el %2$s", "Show hidden files" : "Montri kaŝitajn dosierojn", "WebDAV" : "WebDAV", @@ -156,6 +155,7 @@ "Select" : "Elekti", "You don’t have permission to upload or create files here" : "Vi ne permesatas alŝuti aŭ krei dosierojn ĉi tie", "New" : "Nova", + "%s%% of %s used" : "%s%% el %s uzataj", "Settings" : "Agordo" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/es.js b/apps/files/l10n/es.js index e6ec7d73fd9..1ea07d7d2fc 100644 --- a/apps/files/l10n/es.js +++ b/apps/files/l10n/es.js @@ -188,7 +188,6 @@ OC.L10N.register( "Templates" : "Plantillas", "Unable to initialize the templates directory" : "No se ha podido iniciar la carpeta de plantillas", "%s used" : "usado %s", - "%s%% of %s used" : "%s%% de %s usado", "%1$s of %2$s used" : "%1$s de %2$s usados", "Show hidden files" : "Mostrar archivos ocultos", "Crop image previews" : "Recortar la previsualización de las imágenes", @@ -217,6 +216,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "No tiene permisos para subir o crear archivos aquí", "New" : "Nuevo", "Cannot transfer ownership of a file or folder you don't own" : "No se puede transferir la propiedad de un archivo o carpeta que no te pertenece", + "%s%% of %s used" : "%s%% de %s usado", "Settings" : "Ajustes" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/files/l10n/es.json b/apps/files/l10n/es.json index cc48cb86139..9954c892b88 100644 --- a/apps/files/l10n/es.json +++ b/apps/files/l10n/es.json @@ -186,7 +186,6 @@ "Templates" : "Plantillas", "Unable to initialize the templates directory" : "No se ha podido iniciar la carpeta de plantillas", "%s used" : "usado %s", - "%s%% of %s used" : "%s%% de %s usado", "%1$s of %2$s used" : "%1$s de %2$s usados", "Show hidden files" : "Mostrar archivos ocultos", "Crop image previews" : "Recortar la previsualización de las imágenes", @@ -215,6 +214,7 @@ "You don’t have permission to upload or create files here" : "No tiene permisos para subir o crear archivos aquí", "New" : "Nuevo", "Cannot transfer ownership of a file or folder you don't own" : "No se puede transferir la propiedad de un archivo o carpeta que no te pertenece", + "%s%% of %s used" : "%s%% de %s usado", "Settings" : "Ajustes" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/files/l10n/eu.js b/apps/files/l10n/eu.js index acca2a6c940..920da597cbb 100644 --- a/apps/files/l10n/eu.js +++ b/apps/files/l10n/eu.js @@ -13,7 +13,7 @@ OC.L10N.register( "Favorites" : "Gogokoak", "Could not create folder \"{dir}\"" : "Ezin izan da \"{dir}\" karpeta sortu", "This will stop your current uploads." : "Honek martxan dauzkazun igoerak geldituko ditu.", - "Upload cancelled." : "Igoera bertan behera utzi da.", + "Upload cancelled." : "Karga bertan behera utzi da.", "Processing files …" : "Fitxategiak prozesatzen...", "…" : "…", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ezin da {filename} kargatu karpeta bat delako edo 0 byte dituelako", @@ -189,7 +189,6 @@ OC.L10N.register( "Templates" : "Txantiloia", "Unable to initialize the templates directory" : "Ezin da txantiloien direktorioa hasieratu", "%s used" : "%s erabilita", - "%s%% of %s used" : "%s%% / %s erabilita", "%1$s of %2$s used" : "%1$s / %2$s erabilita", "Files settings" : "FItxategien ezarpenak", "Show hidden files" : "Erakutsi ezkutuko fitxategiak", @@ -219,6 +218,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "Ez duzu baimenik fitxategiak hona kargatu edo hemen sortzeko", "New" : "Berria", "Cannot transfer ownership of a file or folder you don't own" : "Ezin da zurea ez den fitxategi edo karpeta baten jabetza transferitu", + "%s%% of %s used" : "%s%% / %s erabilita", "Settings" : "Ezarpenak" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/eu.json b/apps/files/l10n/eu.json index cac0f378917..2038cbf9d9e 100644 --- a/apps/files/l10n/eu.json +++ b/apps/files/l10n/eu.json @@ -11,7 +11,7 @@ "Favorites" : "Gogokoak", "Could not create folder \"{dir}\"" : "Ezin izan da \"{dir}\" karpeta sortu", "This will stop your current uploads." : "Honek martxan dauzkazun igoerak geldituko ditu.", - "Upload cancelled." : "Igoera bertan behera utzi da.", + "Upload cancelled." : "Karga bertan behera utzi da.", "Processing files …" : "Fitxategiak prozesatzen...", "…" : "…", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ezin da {filename} kargatu karpeta bat delako edo 0 byte dituelako", @@ -187,7 +187,6 @@ "Templates" : "Txantiloia", "Unable to initialize the templates directory" : "Ezin da txantiloien direktorioa hasieratu", "%s used" : "%s erabilita", - "%s%% of %s used" : "%s%% / %s erabilita", "%1$s of %2$s used" : "%1$s / %2$s erabilita", "Files settings" : "FItxategien ezarpenak", "Show hidden files" : "Erakutsi ezkutuko fitxategiak", @@ -217,6 +216,7 @@ "You don’t have permission to upload or create files here" : "Ez duzu baimenik fitxategiak hona kargatu edo hemen sortzeko", "New" : "Berria", "Cannot transfer ownership of a file or folder you don't own" : "Ezin da zurea ez den fitxategi edo karpeta baten jabetza transferitu", + "%s%% of %s used" : "%s%% / %s erabilita", "Settings" : "Ezarpenak" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/fi.js b/apps/files/l10n/fi.js index 3556b2e4ebb..09c19528cc8 100644 --- a/apps/files/l10n/fi.js +++ b/apps/files/l10n/fi.js @@ -77,7 +77,9 @@ OC.L10N.register( "_including %n hidden_::_including %n hidden_" : ["Sisältäen %n piilotetun","Sisältäen %n piilotettua"], "You do not have permission to upload or create files here" : "Käyttöoikeutesi eivät riitä tiedostojen lähettämiseen tai luomiseen tähän sijaintiin", "_Uploading %n file_::_Uploading %n files_" : ["Lähetetään %n tiedosto","Lähetetään %n tiedostoa"], + "New file/folder menu" : "Uusi tiedosto/kansio -valikko", "Select file range" : "Valitse tiedostojoukko", + "{used}%" : "{used} %", "{used} of {quota} used" : "{used}/{quota} käytetty", "{used} used" : "{used} käytetty", "\"{name}\" is an invalid file name." : "\"{name}\" on virheellinen tiedostonimi.", @@ -188,8 +190,9 @@ OC.L10N.register( "Templates" : "Mallipohjat", "Unable to initialize the templates directory" : "Mallipohjien kansiota ei voitu alustaa", "%s used" : "%s käytetty", - "%s%% of %s used" : "%s%% / %s käytetty", + "%s%%" : "%s%%", "%1$s of %2$s used" : "%1$s/%2$s käytetty", + "Files settings" : "Tiedostojen asetukset", "Show hidden files" : "Näytä piilotetut tiedostot", "Crop image previews" : "Rajaa kuvien esikatseluja", "WebDAV" : "WebDAV", @@ -216,6 +219,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "Käyttöoikeutesi eivät riitä tiedostojen lähettämiseen tai kansioiden luomiseen tähän sijaintiin", "New" : "Uusi", "Cannot transfer ownership of a file or folder you don't own" : "Et voi siirtää sellaisen tiedoston tai kansion omistajuutta, jota et itse omista", + "%s%% of %s used" : "%s%% / %s käytetty", "Settings" : "Asetukset" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/fi.json b/apps/files/l10n/fi.json index 98e0a5994d0..73e01467522 100644 --- a/apps/files/l10n/fi.json +++ b/apps/files/l10n/fi.json @@ -75,7 +75,9 @@ "_including %n hidden_::_including %n hidden_" : ["Sisältäen %n piilotetun","Sisältäen %n piilotettua"], "You do not have permission to upload or create files here" : "Käyttöoikeutesi eivät riitä tiedostojen lähettämiseen tai luomiseen tähän sijaintiin", "_Uploading %n file_::_Uploading %n files_" : ["Lähetetään %n tiedosto","Lähetetään %n tiedostoa"], + "New file/folder menu" : "Uusi tiedosto/kansio -valikko", "Select file range" : "Valitse tiedostojoukko", + "{used}%" : "{used} %", "{used} of {quota} used" : "{used}/{quota} käytetty", "{used} used" : "{used} käytetty", "\"{name}\" is an invalid file name." : "\"{name}\" on virheellinen tiedostonimi.", @@ -186,8 +188,9 @@ "Templates" : "Mallipohjat", "Unable to initialize the templates directory" : "Mallipohjien kansiota ei voitu alustaa", "%s used" : "%s käytetty", - "%s%% of %s used" : "%s%% / %s käytetty", + "%s%%" : "%s%%", "%1$s of %2$s used" : "%1$s/%2$s käytetty", + "Files settings" : "Tiedostojen asetukset", "Show hidden files" : "Näytä piilotetut tiedostot", "Crop image previews" : "Rajaa kuvien esikatseluja", "WebDAV" : "WebDAV", @@ -214,6 +217,7 @@ "You don’t have permission to upload or create files here" : "Käyttöoikeutesi eivät riitä tiedostojen lähettämiseen tai kansioiden luomiseen tähän sijaintiin", "New" : "Uusi", "Cannot transfer ownership of a file or folder you don't own" : "Et voi siirtää sellaisen tiedoston tai kansion omistajuutta, jota et itse omista", + "%s%% of %s used" : "%s%% / %s käytetty", "Settings" : "Asetukset" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/fr.js b/apps/files/l10n/fr.js index f276ef20103..5728e87e955 100644 --- a/apps/files/l10n/fr.js +++ b/apps/files/l10n/fr.js @@ -21,6 +21,7 @@ OC.L10N.register( "Target folder \"{dir}\" does not exist any more" : "Le dossier cible \"{dir}\" n'existe plus", "Not enough free space" : "Espace disponible insuffisant", "An unknown error has occurred" : "Une erreur inconnue est survenue", + "File could not be uploaded" : "Le fichier n'a pas pu être téléversé", "Uploading …" : "Envoi en cours...", "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} sur {totalSize} ({bitrate})", "Uploading that item is not supported" : "L'envoi de cet élément n'est pas supporté", @@ -74,7 +75,9 @@ OC.L10N.register( "_%n file_::_%n files_" : ["%n fichier","%n fichiers","%n fichiers"], "{dirs} and {files}" : "{dirs} et {files}", "_including %n hidden_::_including %n hidden_" : ["inclus %n masqué","dont %n masqués","dont %n masqués"], + "You do not have permission to upload or create files here" : "Vous n'avez pas la permission de téléverser ou de créer des fichiers ici", "_Uploading %n file_::_Uploading %n files_" : ["Téléversement de %n fichier","Envoi de %n fichiers","Envoi de %n fichiers"], + "New file/folder menu" : "Menu nouveau fichier/dossier", "Select file range" : "Activer la sélection d'une plage de fichiers", "{used} of {quota} used" : "{used} utilisés sur {quota}", "{used} used" : "{used} utilisés", @@ -171,6 +174,7 @@ OC.L10N.register( "Transfer {path} to {userid}" : "Transférer {path} à {userid}", "Invalid path selected" : "Chemin sélectionné non valide", "Ownership transfer request sent" : "Requête de transfert de propriété envoyée", + "Cannot transfer ownership of a file or folder you do not own" : "Impossible de transférer la propriété d'un fichier ou d'un dossier que vous ne possédez pas", "Tags" : "Étiquettes", "Unable to change the favourite state of the file" : "Impossible de modifier l'état favori du fichier", "Error while loading the file data" : "Erreur lors du chargement du fichier de données", @@ -185,8 +189,8 @@ OC.L10N.register( "Templates" : "Modèles", "Unable to initialize the templates directory" : "Impossible d'initialiser le répertoire des modèles", "%s used" : "%s utilisés", - "%s%% of %s used" : "%s%% de %s utilisé", "%1$s of %2$s used" : "%1$s utilisés sur %2$s", + "Files settings" : "Paramètres des fichiers", "Show hidden files" : "Afficher les fichiers masqués", "Crop image previews" : "Activer l'affichage en miniatures carrées", "WebDAV" : "WebDAV", @@ -214,6 +218,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "Vous n'avez pas la permission d'envoyer ou de créer des fichiers ici", "New" : "Nouveau", "Cannot transfer ownership of a file or folder you don't own" : "Impossible de transférer la propriété d’un fichier ou d’un dossier dont vous n'êtes pas le propriétaire", + "%s%% of %s used" : "%s%% de %s utilisés", "Settings" : "Paramètres" }, "nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/files/l10n/fr.json b/apps/files/l10n/fr.json index 487e098d615..4f68b38fbb2 100644 --- a/apps/files/l10n/fr.json +++ b/apps/files/l10n/fr.json @@ -19,6 +19,7 @@ "Target folder \"{dir}\" does not exist any more" : "Le dossier cible \"{dir}\" n'existe plus", "Not enough free space" : "Espace disponible insuffisant", "An unknown error has occurred" : "Une erreur inconnue est survenue", + "File could not be uploaded" : "Le fichier n'a pas pu être téléversé", "Uploading …" : "Envoi en cours...", "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} sur {totalSize} ({bitrate})", "Uploading that item is not supported" : "L'envoi de cet élément n'est pas supporté", @@ -72,7 +73,9 @@ "_%n file_::_%n files_" : ["%n fichier","%n fichiers","%n fichiers"], "{dirs} and {files}" : "{dirs} et {files}", "_including %n hidden_::_including %n hidden_" : ["inclus %n masqué","dont %n masqués","dont %n masqués"], + "You do not have permission to upload or create files here" : "Vous n'avez pas la permission de téléverser ou de créer des fichiers ici", "_Uploading %n file_::_Uploading %n files_" : ["Téléversement de %n fichier","Envoi de %n fichiers","Envoi de %n fichiers"], + "New file/folder menu" : "Menu nouveau fichier/dossier", "Select file range" : "Activer la sélection d'une plage de fichiers", "{used} of {quota} used" : "{used} utilisés sur {quota}", "{used} used" : "{used} utilisés", @@ -169,6 +172,7 @@ "Transfer {path} to {userid}" : "Transférer {path} à {userid}", "Invalid path selected" : "Chemin sélectionné non valide", "Ownership transfer request sent" : "Requête de transfert de propriété envoyée", + "Cannot transfer ownership of a file or folder you do not own" : "Impossible de transférer la propriété d'un fichier ou d'un dossier que vous ne possédez pas", "Tags" : "Étiquettes", "Unable to change the favourite state of the file" : "Impossible de modifier l'état favori du fichier", "Error while loading the file data" : "Erreur lors du chargement du fichier de données", @@ -183,8 +187,8 @@ "Templates" : "Modèles", "Unable to initialize the templates directory" : "Impossible d'initialiser le répertoire des modèles", "%s used" : "%s utilisés", - "%s%% of %s used" : "%s%% de %s utilisé", "%1$s of %2$s used" : "%1$s utilisés sur %2$s", + "Files settings" : "Paramètres des fichiers", "Show hidden files" : "Afficher les fichiers masqués", "Crop image previews" : "Activer l'affichage en miniatures carrées", "WebDAV" : "WebDAV", @@ -212,6 +216,7 @@ "You don’t have permission to upload or create files here" : "Vous n'avez pas la permission d'envoyer ou de créer des fichiers ici", "New" : "Nouveau", "Cannot transfer ownership of a file or folder you don't own" : "Impossible de transférer la propriété d’un fichier ou d’un dossier dont vous n'êtes pas le propriétaire", + "%s%% of %s used" : "%s%% de %s utilisés", "Settings" : "Paramètres" },"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/files/l10n/gl.js b/apps/files/l10n/gl.js index 6d0da2de257..c3acf2f4d02 100644 --- a/apps/files/l10n/gl.js +++ b/apps/files/l10n/gl.js @@ -180,7 +180,6 @@ OC.L10N.register( "Templates" : "Modelos", "Unable to initialize the templates directory" : "Non é posíbel iniciar o directorio de modelos", "%s used" : "%s utilizado", - "%s%% of %s used" : "%s%% de %s utilizado", "%1$s of %2$s used" : "%s de %s utilizado", "Show hidden files" : "Amosar os ficheiros agochados", "Crop image previews" : "Recortar a vista previa das imaxes", @@ -208,6 +207,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "Non ten permiso para enviar ou crear ficheiros aquí.", "New" : "Novo", "Cannot transfer ownership of a file or folder you don't own" : "Non é posíbel transferir a propiedade dun ficheiro ou cartafol que non é de seu", + "%s%% of %s used" : "%s%% de %s utilizado", "Settings" : "Axustes" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/gl.json b/apps/files/l10n/gl.json index 8acdf1b7474..14f9739c94d 100644 --- a/apps/files/l10n/gl.json +++ b/apps/files/l10n/gl.json @@ -178,7 +178,6 @@ "Templates" : "Modelos", "Unable to initialize the templates directory" : "Non é posíbel iniciar o directorio de modelos", "%s used" : "%s utilizado", - "%s%% of %s used" : "%s%% de %s utilizado", "%1$s of %2$s used" : "%s de %s utilizado", "Show hidden files" : "Amosar os ficheiros agochados", "Crop image previews" : "Recortar a vista previa das imaxes", @@ -206,6 +205,7 @@ "You don’t have permission to upload or create files here" : "Non ten permiso para enviar ou crear ficheiros aquí.", "New" : "Novo", "Cannot transfer ownership of a file or folder you don't own" : "Non é posíbel transferir a propiedade dun ficheiro ou cartafol que non é de seu", + "%s%% of %s used" : "%s%% de %s utilizado", "Settings" : "Axustes" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/he.js b/apps/files/l10n/he.js index 4185647b920..df8ffe82fde 100644 --- a/apps/files/l10n/he.js +++ b/apps/files/l10n/he.js @@ -160,7 +160,6 @@ OC.L10N.register( "Cancel" : "ביטול", "Create" : "יצירה", "%s used" : "%s בשימוש", - "%s%% of %s used" : "%s%% מתוך %s בשימוש", "%1$s of %2$s used" : "%1$s מתוך %2$s בשימוש", "Show hidden files" : "הצגת קבצים נסתרים", "Crop image previews" : "חיתוך תצוגות מקדימות של תמונות", @@ -188,6 +187,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "אין לך הרשאות להעלות או ליצור קבצים כאן", "New" : "חדש", "Cannot transfer ownership of a file or folder you don't own" : "אין לך אפשרות להעביר בעלות על קובץ או תיקייה שאין לך בעלות עליהם", + "%s%% of %s used" : "%s%% מתוך %s בשימוש", "Settings" : "הגדרות" }, "nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;"); diff --git a/apps/files/l10n/he.json b/apps/files/l10n/he.json index 8b662d22106..f02e7fadc41 100644 --- a/apps/files/l10n/he.json +++ b/apps/files/l10n/he.json @@ -158,7 +158,6 @@ "Cancel" : "ביטול", "Create" : "יצירה", "%s used" : "%s בשימוש", - "%s%% of %s used" : "%s%% מתוך %s בשימוש", "%1$s of %2$s used" : "%1$s מתוך %2$s בשימוש", "Show hidden files" : "הצגת קבצים נסתרים", "Crop image previews" : "חיתוך תצוגות מקדימות של תמונות", @@ -186,6 +185,7 @@ "You don’t have permission to upload or create files here" : "אין לך הרשאות להעלות או ליצור קבצים כאן", "New" : "חדש", "Cannot transfer ownership of a file or folder you don't own" : "אין לך אפשרות להעביר בעלות על קובץ או תיקייה שאין לך בעלות עליהם", + "%s%% of %s used" : "%s%% מתוך %s בשימוש", "Settings" : "הגדרות" },"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;" }
\ No newline at end of file diff --git a/apps/files/l10n/hr.js b/apps/files/l10n/hr.js index 8049db8434f..e0e62276cc4 100644 --- a/apps/files/l10n/hr.js +++ b/apps/files/l10n/hr.js @@ -179,7 +179,6 @@ OC.L10N.register( "Templates" : "Predlošci", "Unable to initialize the templates directory" : "Nije moguće inicijalizirati direktorij predložaka", "%s used" : "Iskorišteno %s", - "%s%% of %s used" : "Iskorišteno %s%% od %s", "%1$s of %2$s used" : "Iskorišteno %1$s od %2$s", "Show hidden files" : "Prikaz skrivenih datoteka", "Crop image previews" : "Obreži pretpreglede slika", @@ -208,6 +207,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "Ovdje ne smijete otpremati ili stvarati datoteke", "New" : "Novo", "Cannot transfer ownership of a file or folder you don't own" : "Ne možete prenijeti vlasništvo nad datotekom ili mapom koja nije u vašem vlasništvu", + "%s%% of %s used" : "Iskorišteno %s%% od %s", "Settings" : "Postavke" }, "nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;"); diff --git a/apps/files/l10n/hr.json b/apps/files/l10n/hr.json index 900f8b9e398..f9e2b745e42 100644 --- a/apps/files/l10n/hr.json +++ b/apps/files/l10n/hr.json @@ -177,7 +177,6 @@ "Templates" : "Predlošci", "Unable to initialize the templates directory" : "Nije moguće inicijalizirati direktorij predložaka", "%s used" : "Iskorišteno %s", - "%s%% of %s used" : "Iskorišteno %s%% od %s", "%1$s of %2$s used" : "Iskorišteno %1$s od %2$s", "Show hidden files" : "Prikaz skrivenih datoteka", "Crop image previews" : "Obreži pretpreglede slika", @@ -206,6 +205,7 @@ "You don’t have permission to upload or create files here" : "Ovdje ne smijete otpremati ili stvarati datoteke", "New" : "Novo", "Cannot transfer ownership of a file or folder you don't own" : "Ne možete prenijeti vlasništvo nad datotekom ili mapom koja nije u vašem vlasništvu", + "%s%% of %s used" : "Iskorišteno %s%% od %s", "Settings" : "Postavke" },"pluralForm" :"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/files/l10n/hu.js b/apps/files/l10n/hu.js index f956da10e23..54bba845f19 100644 --- a/apps/files/l10n/hu.js +++ b/apps/files/l10n/hu.js @@ -189,7 +189,6 @@ OC.L10N.register( "Templates" : "Sablonok", "Unable to initialize the templates directory" : "A sablonkönyvtár előkészítése sikertelen", "%s used" : "%s használt", - "%s%% of %s used" : "%s %% / %s felhasználva", "%1$s of %2$s used" : "%1$s / %2$s felhasználva", "Files settings" : "Fájlok beállításai", "Show hidden files" : "Rejtett fájlok megjelenítése", @@ -219,6 +218,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "Nincs jogosultsága fájlok ide feltöltéséhez vagy létrehozásához", "New" : "Új", "Cannot transfer ownership of a file or folder you don't own" : "Nem ruházható át olyan fájl vagy mappa tulajdonjoga, amely nem Öné", + "%s%% of %s used" : "%s %% / %s felhasználva", "Settings" : "Beállítások" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/hu.json b/apps/files/l10n/hu.json index 8992691a25e..fa718eea7a0 100644 --- a/apps/files/l10n/hu.json +++ b/apps/files/l10n/hu.json @@ -187,7 +187,6 @@ "Templates" : "Sablonok", "Unable to initialize the templates directory" : "A sablonkönyvtár előkészítése sikertelen", "%s used" : "%s használt", - "%s%% of %s used" : "%s %% / %s felhasználva", "%1$s of %2$s used" : "%1$s / %2$s felhasználva", "Files settings" : "Fájlok beállításai", "Show hidden files" : "Rejtett fájlok megjelenítése", @@ -217,6 +216,7 @@ "You don’t have permission to upload or create files here" : "Nincs jogosultsága fájlok ide feltöltéséhez vagy létrehozásához", "New" : "Új", "Cannot transfer ownership of a file or folder you don't own" : "Nem ruházható át olyan fájl vagy mappa tulajdonjoga, amely nem Öné", + "%s%% of %s used" : "%s %% / %s felhasználva", "Settings" : "Beállítások" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/id.js b/apps/files/l10n/id.js index 9f93e2c51cc..20f211e5336 100644 --- a/apps/files/l10n/id.js +++ b/apps/files/l10n/id.js @@ -152,7 +152,6 @@ OC.L10N.register( "Cancel" : "Membatalkan", "Create" : "Buat", "%s used" : "%s digunakan", - "%s%% of %s used" : "%s%% dari %s terpakai", "%1$s of %2$s used" : "%1$s dari %2$s sudah digunakan", "Show hidden files" : "Lihat berkas tersembunyi", "Crop image previews" : "Pangkas pratinjau gambar", @@ -180,6 +179,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "Anda tidak memiliki akses untuk mengunggah atau membuat berkas disini", "New" : "Baru", "Cannot transfer ownership of a file or folder you don't own" : "Tidak dapat melakukan transfer kepemilikan dari berkas dan folder yang tidak Anda miliki", + "%s%% of %s used" : "%s%% dari %s terpakai", "Settings" : "Pengaturan" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/id.json b/apps/files/l10n/id.json index f6055e37a04..e265326b74f 100644 --- a/apps/files/l10n/id.json +++ b/apps/files/l10n/id.json @@ -150,7 +150,6 @@ "Cancel" : "Membatalkan", "Create" : "Buat", "%s used" : "%s digunakan", - "%s%% of %s used" : "%s%% dari %s terpakai", "%1$s of %2$s used" : "%1$s dari %2$s sudah digunakan", "Show hidden files" : "Lihat berkas tersembunyi", "Crop image previews" : "Pangkas pratinjau gambar", @@ -178,6 +177,7 @@ "You don’t have permission to upload or create files here" : "Anda tidak memiliki akses untuk mengunggah atau membuat berkas disini", "New" : "Baru", "Cannot transfer ownership of a file or folder you don't own" : "Tidak dapat melakukan transfer kepemilikan dari berkas dan folder yang tidak Anda miliki", + "%s%% of %s used" : "%s%% dari %s terpakai", "Settings" : "Pengaturan" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/l10n/is.js b/apps/files/l10n/is.js index 00744363070..fddbb7c3f5f 100644 --- a/apps/files/l10n/is.js +++ b/apps/files/l10n/is.js @@ -156,7 +156,6 @@ OC.L10N.register( "Templates" : "Sniðmát", "Unable to initialize the templates directory" : "Tókst ekki að frumstilla sniðmátamöppuna", "%s used" : "%s notað", - "%s%% of %s used" : "%s%% af %s notað", "%1$s of %2$s used" : "%1$s af %2$s notað", "Show hidden files" : "Sýna faldar skrár", "Crop image previews" : "Skera utan af forskoðun mynda", @@ -184,6 +183,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "Þú hefur ekki heimild til að hlaða inn eða búa til skjöl hér", "New" : "Nýtt", "Cannot transfer ownership of a file or folder you don't own" : "Ekki er hægt að millifæra eignarhald á skrá eða möppu sem þú átt ekki", + "%s%% of %s used" : "%s%% af %s notað", "Settings" : "Stillingar" }, "nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"); diff --git a/apps/files/l10n/is.json b/apps/files/l10n/is.json index 83411a1e39b..7c03875661a 100644 --- a/apps/files/l10n/is.json +++ b/apps/files/l10n/is.json @@ -154,7 +154,6 @@ "Templates" : "Sniðmát", "Unable to initialize the templates directory" : "Tókst ekki að frumstilla sniðmátamöppuna", "%s used" : "%s notað", - "%s%% of %s used" : "%s%% af %s notað", "%1$s of %2$s used" : "%1$s af %2$s notað", "Show hidden files" : "Sýna faldar skrár", "Crop image previews" : "Skera utan af forskoðun mynda", @@ -182,6 +181,7 @@ "You don’t have permission to upload or create files here" : "Þú hefur ekki heimild til að hlaða inn eða búa til skjöl hér", "New" : "Nýtt", "Cannot transfer ownership of a file or folder you don't own" : "Ekki er hægt að millifæra eignarhald á skrá eða möppu sem þú átt ekki", + "%s%% of %s used" : "%s%% af %s notað", "Settings" : "Stillingar" },"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);" }
\ No newline at end of file diff --git a/apps/files/l10n/it.js b/apps/files/l10n/it.js index 882f9c45a77..5eae3186e76 100644 --- a/apps/files/l10n/it.js +++ b/apps/files/l10n/it.js @@ -185,7 +185,6 @@ OC.L10N.register( "Templates" : "Modelli", "Unable to initialize the templates directory" : "Impossibile inizializzare la cartella dei modelli", "%s used" : "%s utilizzato", - "%s%% of %s used" : "%s%% di %s utilizzati", "%1$s of %2$s used" : "%1$s di %2$s utilizzati", "Show hidden files" : "Mostra i file nascosti", "Crop image previews" : "Ritaglia le anteprime delle immagini", @@ -214,6 +213,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "Qui non hai i permessi per caricare o creare file", "New" : "Nuovo", "Cannot transfer ownership of a file or folder you don't own" : "Impossibile trasferire la proprietà di un file o di una cartella di altri", + "%s%% of %s used" : "%s%% di %s utilizzati", "Settings" : "Impostazioni" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/files/l10n/it.json b/apps/files/l10n/it.json index 12013bb4fae..dd9c9935900 100644 --- a/apps/files/l10n/it.json +++ b/apps/files/l10n/it.json @@ -183,7 +183,6 @@ "Templates" : "Modelli", "Unable to initialize the templates directory" : "Impossibile inizializzare la cartella dei modelli", "%s used" : "%s utilizzato", - "%s%% of %s used" : "%s%% di %s utilizzati", "%1$s of %2$s used" : "%1$s di %2$s utilizzati", "Show hidden files" : "Mostra i file nascosti", "Crop image previews" : "Ritaglia le anteprime delle immagini", @@ -212,6 +211,7 @@ "You don’t have permission to upload or create files here" : "Qui non hai i permessi per caricare o creare file", "New" : "Nuovo", "Cannot transfer ownership of a file or folder you don't own" : "Impossibile trasferire la proprietà di un file o di una cartella di altri", + "%s%% of %s used" : "%s%% di %s utilizzati", "Settings" : "Impostazioni" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/files/l10n/ja.js b/apps/files/l10n/ja.js index 0e2e542d472..2d028217e65 100644 --- a/apps/files/l10n/ja.js +++ b/apps/files/l10n/ja.js @@ -188,7 +188,6 @@ OC.L10N.register( "Templates" : "テンプレート", "Unable to initialize the templates directory" : "テンプレートディレクトリを初期化できませんでした", "%s used" : "%s 使用中", - "%s%% of %s used" : "%s%% 使用中、全体は%s", "%1$s of %2$s used" : "%2$s 中%1$s 使用中", "Show hidden files" : "隠しファイルを表示", "Crop image previews" : "プレビュー画像を切り抜く", @@ -217,6 +216,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "ここにファイルをアップロードまたは作成する権限がありません", "New" : "新規作成", "Cannot transfer ownership of a file or folder you don't own" : "所有していないファイルまたはフォルダーの所有権を譲渡することはできません", + "%s%% of %s used" : "%s%% 使用中、全体は%s", "Settings" : "設定" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/ja.json b/apps/files/l10n/ja.json index d259d4c1774..65fc84d3bf0 100644 --- a/apps/files/l10n/ja.json +++ b/apps/files/l10n/ja.json @@ -186,7 +186,6 @@ "Templates" : "テンプレート", "Unable to initialize the templates directory" : "テンプレートディレクトリを初期化できませんでした", "%s used" : "%s 使用中", - "%s%% of %s used" : "%s%% 使用中、全体は%s", "%1$s of %2$s used" : "%2$s 中%1$s 使用中", "Show hidden files" : "隠しファイルを表示", "Crop image previews" : "プレビュー画像を切り抜く", @@ -215,6 +214,7 @@ "You don’t have permission to upload or create files here" : "ここにファイルをアップロードまたは作成する権限がありません", "New" : "新規作成", "Cannot transfer ownership of a file or folder you don't own" : "所有していないファイルまたはフォルダーの所有権を譲渡することはできません", + "%s%% of %s used" : "%s%% 使用中、全体は%s", "Settings" : "設定" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/l10n/lt_LT.js b/apps/files/l10n/lt_LT.js index ec4c6fb72cb..8d506421f76 100644 --- a/apps/files/l10n/lt_LT.js +++ b/apps/files/l10n/lt_LT.js @@ -170,7 +170,6 @@ OC.L10N.register( "Templates" : "Šablonai", "Unable to initialize the templates directory" : "Nepavyko inicijuoti šablonų katalogo", "%s used" : "%s panaudota", - "%s%% of %s used" : "naudojama %s%% iš %s", "%1$s of %2$s used" : "naudojama %1$s iš %2$s", "Show hidden files" : "Rodyti paslėptus failus", "Crop image previews" : "Apkirpti paveikslų peržiūras", @@ -198,6 +197,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "Jūs neturite leidimo čia įkelti arba kurti failus", "New" : "Naujas", "Cannot transfer ownership of a file or folder you don't own" : "Negalima perduoti, failo aplanko, kuris jums nepriklauso, nuosavybės", + "%s%% of %s used" : "naudojama %s%% iš %s", "Settings" : "Nustatymai" }, "nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);"); diff --git a/apps/files/l10n/lt_LT.json b/apps/files/l10n/lt_LT.json index 5e5e2e078f1..afa8178c45a 100644 --- a/apps/files/l10n/lt_LT.json +++ b/apps/files/l10n/lt_LT.json @@ -168,7 +168,6 @@ "Templates" : "Šablonai", "Unable to initialize the templates directory" : "Nepavyko inicijuoti šablonų katalogo", "%s used" : "%s panaudota", - "%s%% of %s used" : "naudojama %s%% iš %s", "%1$s of %2$s used" : "naudojama %1$s iš %2$s", "Show hidden files" : "Rodyti paslėptus failus", "Crop image previews" : "Apkirpti paveikslų peržiūras", @@ -196,6 +195,7 @@ "You don’t have permission to upload or create files here" : "Jūs neturite leidimo čia įkelti arba kurti failus", "New" : "Naujas", "Cannot transfer ownership of a file or folder you don't own" : "Negalima perduoti, failo aplanko, kuris jums nepriklauso, nuosavybės", + "%s%% of %s used" : "naudojama %s%% iš %s", "Settings" : "Nustatymai" },"pluralForm" :"nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);" }
\ No newline at end of file diff --git a/apps/files/l10n/mk.js b/apps/files/l10n/mk.js index 227d49d1c12..5ea848ec5a1 100644 --- a/apps/files/l10n/mk.js +++ b/apps/files/l10n/mk.js @@ -189,7 +189,6 @@ OC.L10N.register( "Templates" : "Шаблони", "Unable to initialize the templates directory" : "Не може да се иницијализира папка за шаблони", "%s used" : "Искористено %s", - "%s%% of %s used" : "Искорестено%s%% од %s ", "%1$s of %2$s used" : "Искористено %1$s од %2$s", "Files settings" : "Параметри за датотеки", "Show hidden files" : "Прикажи сокриени датотеки", @@ -219,6 +218,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "Немате дозвола да прикачувате или да креирате датотеки", "New" : "Ново", "Cannot transfer ownership of a file or folder you don't own" : "Неможете да направите трансвер на сопственот на папка која не е ваша", + "%s%% of %s used" : "Искорестено%s%% од %s ", "Settings" : "Параметри" }, "nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"); diff --git a/apps/files/l10n/mk.json b/apps/files/l10n/mk.json index cd1d384ca65..1d422eb77ba 100644 --- a/apps/files/l10n/mk.json +++ b/apps/files/l10n/mk.json @@ -187,7 +187,6 @@ "Templates" : "Шаблони", "Unable to initialize the templates directory" : "Не може да се иницијализира папка за шаблони", "%s used" : "Искористено %s", - "%s%% of %s used" : "Искорестено%s%% од %s ", "%1$s of %2$s used" : "Искористено %1$s од %2$s", "Files settings" : "Параметри за датотеки", "Show hidden files" : "Прикажи сокриени датотеки", @@ -217,6 +216,7 @@ "You don’t have permission to upload or create files here" : "Немате дозвола да прикачувате или да креирате датотеки", "New" : "Ново", "Cannot transfer ownership of a file or folder you don't own" : "Неможете да направите трансвер на сопственот на папка која не е ваша", + "%s%% of %s used" : "Искорестено%s%% од %s ", "Settings" : "Параметри" },"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;" }
\ No newline at end of file diff --git a/apps/files/l10n/nb.js b/apps/files/l10n/nb.js index db9d9768034..0ac83989a7e 100644 --- a/apps/files/l10n/nb.js +++ b/apps/files/l10n/nb.js @@ -174,7 +174,6 @@ OC.L10N.register( "Create" : "Opprett", "Creating file" : "Oppretter fil", "%s used" : "%s brukt", - "%s%% of %s used" : "%s%% av %s brukt", "%1$s of %2$s used" : "%1$s av %2$s brukt", "Files settings" : "Filinnstillinger", "Show hidden files" : "Vis skjulte filer", @@ -202,6 +201,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "Du har ikke tillatelse til å laste opp eller opprette filer her", "New" : "Ny", "Cannot transfer ownership of a file or folder you don't own" : "Kan ikke overføre eierskap til en fil eller mappe du ikke eier", + "%s%% of %s used" : "%s%% av %s brukt", "Settings" : "Innstillinger" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/nb.json b/apps/files/l10n/nb.json index 4ee2ee68f9a..b5e79e7c226 100644 --- a/apps/files/l10n/nb.json +++ b/apps/files/l10n/nb.json @@ -172,7 +172,6 @@ "Create" : "Opprett", "Creating file" : "Oppretter fil", "%s used" : "%s brukt", - "%s%% of %s used" : "%s%% av %s brukt", "%1$s of %2$s used" : "%1$s av %2$s brukt", "Files settings" : "Filinnstillinger", "Show hidden files" : "Vis skjulte filer", @@ -200,6 +199,7 @@ "You don’t have permission to upload or create files here" : "Du har ikke tillatelse til å laste opp eller opprette filer her", "New" : "Ny", "Cannot transfer ownership of a file or folder you don't own" : "Kan ikke overføre eierskap til en fil eller mappe du ikke eier", + "%s%% of %s used" : "%s%% av %s brukt", "Settings" : "Innstillinger" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/nl.js b/apps/files/l10n/nl.js index dd7627bf65b..af8a9735201 100644 --- a/apps/files/l10n/nl.js +++ b/apps/files/l10n/nl.js @@ -181,7 +181,6 @@ OC.L10N.register( "Templates" : "Sjablonen", "Unable to initialize the templates directory" : "Kon de sjablonenmap niet instellen", "%s used" : "%s gebruikt", - "%s%% of %s used" : "%s%% van %s gebruikt", "%1$s of %2$s used" : "%1$s van %2$s gebruikt", "Show hidden files" : "Toon verborgen bestanden", "Crop image previews" : "Snij afbeeldingvoorbeelden bij", @@ -210,6 +209,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "Je hebt geen toestemming om hier te uploaden of bestanden te maken", "New" : "Nieuw", "Cannot transfer ownership of a file or folder you don't own" : "Kan de eigendom van een bestand of map waarvan u niet de eigenaar bent, niet overdragen", + "%s%% of %s used" : "%s%% van %s gebruikt", "Settings" : "Instellingen" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/nl.json b/apps/files/l10n/nl.json index 12f0b820751..9c5e6780d12 100644 --- a/apps/files/l10n/nl.json +++ b/apps/files/l10n/nl.json @@ -179,7 +179,6 @@ "Templates" : "Sjablonen", "Unable to initialize the templates directory" : "Kon de sjablonenmap niet instellen", "%s used" : "%s gebruikt", - "%s%% of %s used" : "%s%% van %s gebruikt", "%1$s of %2$s used" : "%1$s van %2$s gebruikt", "Show hidden files" : "Toon verborgen bestanden", "Crop image previews" : "Snij afbeeldingvoorbeelden bij", @@ -208,6 +207,7 @@ "You don’t have permission to upload or create files here" : "Je hebt geen toestemming om hier te uploaden of bestanden te maken", "New" : "Nieuw", "Cannot transfer ownership of a file or folder you don't own" : "Kan de eigendom van een bestand of map waarvan u niet de eigenaar bent, niet overdragen", + "%s%% of %s used" : "%s%% van %s gebruikt", "Settings" : "Instellingen" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/pl.js b/apps/files/l10n/pl.js index f782ae5700e..c6d560d10a4 100644 --- a/apps/files/l10n/pl.js +++ b/apps/files/l10n/pl.js @@ -189,7 +189,6 @@ OC.L10N.register( "Templates" : "Szablony", "Unable to initialize the templates directory" : "Nie można zainicjować katalogu szablonów", "%s used" : "Wykorzystane: %s", - "%s%% of %s used" : "Wykorzystane: %s%% z %s", "%1$s of %2$s used" : "Wykorzystane: %1$s z %2$s", "Files settings" : "Ustawienia Plików", "Show hidden files" : "Pokaż ukryte pliki", @@ -219,6 +218,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "Nie masz uprawnień do wysyłania lub tworzenia plików w tym miejscu", "New" : "Nowy", "Cannot transfer ownership of a file or folder you don't own" : "Nie można przenieść prawa własności do pliku lub katalogu, którego nie jesteś właścicielem", + "%s%% of %s used" : "Wykorzystane: %s%% z %s", "Settings" : "Ustawienia" }, "nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);"); diff --git a/apps/files/l10n/pl.json b/apps/files/l10n/pl.json index 56ddb07cc23..8beb7a15223 100644 --- a/apps/files/l10n/pl.json +++ b/apps/files/l10n/pl.json @@ -187,7 +187,6 @@ "Templates" : "Szablony", "Unable to initialize the templates directory" : "Nie można zainicjować katalogu szablonów", "%s used" : "Wykorzystane: %s", - "%s%% of %s used" : "Wykorzystane: %s%% z %s", "%1$s of %2$s used" : "Wykorzystane: %1$s z %2$s", "Files settings" : "Ustawienia Plików", "Show hidden files" : "Pokaż ukryte pliki", @@ -217,6 +216,7 @@ "You don’t have permission to upload or create files here" : "Nie masz uprawnień do wysyłania lub tworzenia plików w tym miejscu", "New" : "Nowy", "Cannot transfer ownership of a file or folder you don't own" : "Nie można przenieść prawa własności do pliku lub katalogu, którego nie jesteś właścicielem", + "%s%% of %s used" : "Wykorzystane: %s%% z %s", "Settings" : "Ustawienia" },"pluralForm" :"nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);" }
\ No newline at end of file diff --git a/apps/files/l10n/pt_BR.js b/apps/files/l10n/pt_BR.js index 07bbb8a5cf6..5ac451632cc 100644 --- a/apps/files/l10n/pt_BR.js +++ b/apps/files/l10n/pt_BR.js @@ -189,7 +189,6 @@ OC.L10N.register( "Templates" : "Modelos ", "Unable to initialize the templates directory" : "Não foi possível inicializar o diretório de modelos ", "%s used" : "%s usado", - "%s%% of %s used" : "%s%% usados de %s", "%1$s of %2$s used" : "%1$s usados de %2$s", "Files settings" : "Configurações de arquivos", "Show hidden files" : "Mostrar arquivos ocultos", @@ -219,6 +218,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "Você não tem permissão para enviar ou criar arquivos aqui", "New" : "Novo", "Cannot transfer ownership of a file or folder you don't own" : "Não é possível transferir a propriedade de um arquivo ou pasta que você não possui", + "%s%% of %s used" : "%s%% usados de %s", "Settings" : "Configurações" }, "nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/files/l10n/pt_BR.json b/apps/files/l10n/pt_BR.json index d588fe33a46..50f46cf16bf 100644 --- a/apps/files/l10n/pt_BR.json +++ b/apps/files/l10n/pt_BR.json @@ -187,7 +187,6 @@ "Templates" : "Modelos ", "Unable to initialize the templates directory" : "Não foi possível inicializar o diretório de modelos ", "%s used" : "%s usado", - "%s%% of %s used" : "%s%% usados de %s", "%1$s of %2$s used" : "%1$s usados de %2$s", "Files settings" : "Configurações de arquivos", "Show hidden files" : "Mostrar arquivos ocultos", @@ -217,6 +216,7 @@ "You don’t have permission to upload or create files here" : "Você não tem permissão para enviar ou criar arquivos aqui", "New" : "Novo", "Cannot transfer ownership of a file or folder you don't own" : "Não é possível transferir a propriedade de um arquivo ou pasta que você não possui", + "%s%% of %s used" : "%s%% usados de %s", "Settings" : "Configurações" },"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/files/l10n/ro.js b/apps/files/l10n/ro.js index 4554cbe3e40..32bb7298d19 100644 --- a/apps/files/l10n/ro.js +++ b/apps/files/l10n/ro.js @@ -188,7 +188,6 @@ OC.L10N.register( "Templates" : "Șabloane", "Unable to initialize the templates directory" : "Nu s-a putut inițializa dosarul cu șabloane", "%s used" : "%s folosiți", - "%s%% of %s used" : "%s%%din %sfolosiți", "%1$s of %2$s used" : "%1$s din %2$s utilizat", "Show hidden files" : "Arată fișierele ascunse", "Crop image previews" : "Previzualizarea imaginii decupate", @@ -217,6 +216,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "Nu aveți permisiunea de a încărca sau crea fișiere aici", "New" : "Nou", "Cannot transfer ownership of a file or folder you don't own" : "Nu se poate transfera proprietatea unui fișier sau dosar ce nu le deții", + "%s%% of %s used" : "%s%%din %sfolosiți", "Settings" : "Setări" }, "nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"); diff --git a/apps/files/l10n/ro.json b/apps/files/l10n/ro.json index db7652905ed..535479473b5 100644 --- a/apps/files/l10n/ro.json +++ b/apps/files/l10n/ro.json @@ -186,7 +186,6 @@ "Templates" : "Șabloane", "Unable to initialize the templates directory" : "Nu s-a putut inițializa dosarul cu șabloane", "%s used" : "%s folosiți", - "%s%% of %s used" : "%s%%din %sfolosiți", "%1$s of %2$s used" : "%1$s din %2$s utilizat", "Show hidden files" : "Arată fișierele ascunse", "Crop image previews" : "Previzualizarea imaginii decupate", @@ -215,6 +214,7 @@ "You don’t have permission to upload or create files here" : "Nu aveți permisiunea de a încărca sau crea fișiere aici", "New" : "Nou", "Cannot transfer ownership of a file or folder you don't own" : "Nu se poate transfera proprietatea unui fișier sau dosar ce nu le deții", + "%s%% of %s used" : "%s%%din %sfolosiți", "Settings" : "Setări" },"pluralForm" :"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));" }
\ No newline at end of file diff --git a/apps/files/l10n/ru.js b/apps/files/l10n/ru.js index 8ec6d3f529b..60b69e1b82f 100644 --- a/apps/files/l10n/ru.js +++ b/apps/files/l10n/ru.js @@ -188,7 +188,6 @@ OC.L10N.register( "Templates" : "Шаблоны", "Unable to initialize the templates directory" : "Не удалось инициализировать каталог шаблонов", "%s used" : "%s использовано", - "%s%% of %s used" : "использовано %s%% из %s", "%1$s of %2$s used" : "использовано %1$s из %2$s ", "Show hidden files" : "Показывать скрытые файлы", "Crop image previews" : "Обрезать пред. просмотр", @@ -217,6 +216,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "У вас нет прав на создание или загрузку файлов в эту папку.", "New" : "Новый", "Cannot transfer ownership of a file or folder you don't own" : "Изменение владельца возможно только для своих файлов и папок", + "%s%% of %s used" : "использовано %s%% из %s", "Settings" : "Настройки" }, "nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"); diff --git a/apps/files/l10n/ru.json b/apps/files/l10n/ru.json index 934b7ee40b7..fa74f9035a4 100644 --- a/apps/files/l10n/ru.json +++ b/apps/files/l10n/ru.json @@ -186,7 +186,6 @@ "Templates" : "Шаблоны", "Unable to initialize the templates directory" : "Не удалось инициализировать каталог шаблонов", "%s used" : "%s использовано", - "%s%% of %s used" : "использовано %s%% из %s", "%1$s of %2$s used" : "использовано %1$s из %2$s ", "Show hidden files" : "Показывать скрытые файлы", "Crop image previews" : "Обрезать пред. просмотр", @@ -215,6 +214,7 @@ "You don’t have permission to upload or create files here" : "У вас нет прав на создание или загрузку файлов в эту папку.", "New" : "Новый", "Cannot transfer ownership of a file or folder you don't own" : "Изменение владельца возможно только для своих файлов и папок", + "%s%% of %s used" : "использовано %s%% из %s", "Settings" : "Настройки" },"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);" }
\ No newline at end of file diff --git a/apps/files/l10n/sc.js b/apps/files/l10n/sc.js index a1156779133..7ca4b9ca3e2 100644 --- a/apps/files/l10n/sc.js +++ b/apps/files/l10n/sc.js @@ -181,7 +181,6 @@ OC.L10N.register( "Templates" : "Modellos", "Unable to initialize the templates directory" : "Non faghet a initzializare sa cartella de is modellos", "%s used" : "%s impreadu", - "%s%% of %s used" : "%s%% de %s impreadu", "%1$s of %2$s used" : "%1$s de %2$s impreadu", "Show hidden files" : "Mustra archìvios cuados", "Crop image previews" : "Retàllia anteprimas de s'imàgine", @@ -210,6 +209,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "Non tenes su permissu pro carrigare o creare archìvios inoghe", "New" : "Nou", "Cannot transfer ownership of a file or folder you don't own" : "Non faghet a tramudare sa propriedade de un'archìviu o cartella de is chi non ses mere", + "%s%% of %s used" : "%s%% de %s impreadu", "Settings" : "Impostatziones" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/sc.json b/apps/files/l10n/sc.json index 378695dbe6a..3173a78a395 100644 --- a/apps/files/l10n/sc.json +++ b/apps/files/l10n/sc.json @@ -179,7 +179,6 @@ "Templates" : "Modellos", "Unable to initialize the templates directory" : "Non faghet a initzializare sa cartella de is modellos", "%s used" : "%s impreadu", - "%s%% of %s used" : "%s%% de %s impreadu", "%1$s of %2$s used" : "%1$s de %2$s impreadu", "Show hidden files" : "Mustra archìvios cuados", "Crop image previews" : "Retàllia anteprimas de s'imàgine", @@ -208,6 +207,7 @@ "You don’t have permission to upload or create files here" : "Non tenes su permissu pro carrigare o creare archìvios inoghe", "New" : "Nou", "Cannot transfer ownership of a file or folder you don't own" : "Non faghet a tramudare sa propriedade de un'archìviu o cartella de is chi non ses mere", + "%s%% of %s used" : "%s%% de %s impreadu", "Settings" : "Impostatziones" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/sk.js b/apps/files/l10n/sk.js index c3b77f05ac6..15d840c8c4a 100644 --- a/apps/files/l10n/sk.js +++ b/apps/files/l10n/sk.js @@ -187,7 +187,6 @@ OC.L10N.register( "Templates" : "Šablóny", "Unable to initialize the templates directory" : "Nemôžem inicializovať priečinok so šablónami", "%s used" : "%s použitých", - "%s%% of %s used" : "Využité %s%% z %s", "%1$s of %2$s used" : "Využité: %1$s z %2$s", "Show hidden files" : "Zobraziť skryté súbory", "Crop image previews" : "Orezať náhľady obrázkov", @@ -216,6 +215,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "Nemáte oprávnenie sem nahrávať alebo vytvoriť súbory", "New" : "Nový", "Cannot transfer ownership of a file or folder you don't own" : "Nie je možné preniesť vlastníctvo súboru alebo priečinka, ktorý nevlastníte", + "%s%% of %s used" : "Využité %s%% z %s", "Settings" : "Nastavenia" }, "nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);"); diff --git a/apps/files/l10n/sk.json b/apps/files/l10n/sk.json index 234e950182e..52d5bc2f4e4 100644 --- a/apps/files/l10n/sk.json +++ b/apps/files/l10n/sk.json @@ -185,7 +185,6 @@ "Templates" : "Šablóny", "Unable to initialize the templates directory" : "Nemôžem inicializovať priečinok so šablónami", "%s used" : "%s použitých", - "%s%% of %s used" : "Využité %s%% z %s", "%1$s of %2$s used" : "Využité: %1$s z %2$s", "Show hidden files" : "Zobraziť skryté súbory", "Crop image previews" : "Orezať náhľady obrázkov", @@ -214,6 +213,7 @@ "You don’t have permission to upload or create files here" : "Nemáte oprávnenie sem nahrávať alebo vytvoriť súbory", "New" : "Nový", "Cannot transfer ownership of a file or folder you don't own" : "Nie je možné preniesť vlastníctvo súboru alebo priečinka, ktorý nevlastníte", + "%s%% of %s used" : "Využité %s%% z %s", "Settings" : "Nastavenia" },"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);" }
\ No newline at end of file diff --git a/apps/files/l10n/sl.js b/apps/files/l10n/sl.js index 2462c86c629..8fd7d6d39a1 100644 --- a/apps/files/l10n/sl.js +++ b/apps/files/l10n/sl.js @@ -181,7 +181,6 @@ OC.L10N.register( "Templates" : "Predloge", "Unable to initialize the templates directory" : "Ni mogoče začeti mape predlog", "%s used" : "Uporabljeno %s", - "%s%% of %s used" : "Uporabljeno %s%% od %s", "%1$s of %2$s used" : "Uporabljeno %1$s od %2$s", "Show hidden files" : "Pokaži skrite datoteke", "Crop image previews" : "Obreži slike predogleda", @@ -210,6 +209,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "Ni ustreznih dovoljenj za pošiljanje in ustvarjanje datotek na tem mestu.", "New" : "Novo", "Cannot transfer ownership of a file or folder you don't own" : "Ni mogoče prenesti lastništva datotek in map, katerih niste lastnik", + "%s%% of %s used" : "Uporabljeno %s%% od %s", "Settings" : "Nastavitve" }, "nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"); diff --git a/apps/files/l10n/sl.json b/apps/files/l10n/sl.json index a35417cdbb0..c71ac6312d5 100644 --- a/apps/files/l10n/sl.json +++ b/apps/files/l10n/sl.json @@ -179,7 +179,6 @@ "Templates" : "Predloge", "Unable to initialize the templates directory" : "Ni mogoče začeti mape predlog", "%s used" : "Uporabljeno %s", - "%s%% of %s used" : "Uporabljeno %s%% od %s", "%1$s of %2$s used" : "Uporabljeno %1$s od %2$s", "Show hidden files" : "Pokaži skrite datoteke", "Crop image previews" : "Obreži slike predogleda", @@ -208,6 +207,7 @@ "You don’t have permission to upload or create files here" : "Ni ustreznih dovoljenj za pošiljanje in ustvarjanje datotek na tem mestu.", "New" : "Novo", "Cannot transfer ownership of a file or folder you don't own" : "Ni mogoče prenesti lastništva datotek in map, katerih niste lastnik", + "%s%% of %s used" : "Uporabljeno %s%% od %s", "Settings" : "Nastavitve" },"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);" }
\ No newline at end of file diff --git a/apps/files/l10n/sr.js b/apps/files/l10n/sr.js index 5fd58cd83eb..e15f9846c3f 100644 --- a/apps/files/l10n/sr.js +++ b/apps/files/l10n/sr.js @@ -162,7 +162,6 @@ OC.L10N.register( "Cancel" : "Поништи", "Create" : "Направи", "%s used" : "%s искоришћено", - "%s%% of %s used" : "%s%% од %s искоришћено", "%1$s of %2$s used" : "Заузето %1$s од %2$s", "Show hidden files" : "Прикажи скривене фајлове", "WebDAV" : "ВебДАВ", @@ -189,6 +188,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "Немате дозволе да овде отпремате или стварате фајлове", "New" : "Ново", "Cannot transfer ownership of a file or folder you don't own" : "Не можете пренети власништво фајла или фасцикле које нису Ваше", + "%s%% of %s used" : "%s%% од %s искоришћено", "Settings" : "Поставке" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/files/l10n/sr.json b/apps/files/l10n/sr.json index 47a46dab255..d7c377c802d 100644 --- a/apps/files/l10n/sr.json +++ b/apps/files/l10n/sr.json @@ -160,7 +160,6 @@ "Cancel" : "Поништи", "Create" : "Направи", "%s used" : "%s искоришћено", - "%s%% of %s used" : "%s%% од %s искоришћено", "%1$s of %2$s used" : "Заузето %1$s од %2$s", "Show hidden files" : "Прикажи скривене фајлове", "WebDAV" : "ВебДАВ", @@ -187,6 +186,7 @@ "You don’t have permission to upload or create files here" : "Немате дозволе да овде отпремате или стварате фајлове", "New" : "Ново", "Cannot transfer ownership of a file or folder you don't own" : "Не можете пренети власништво фајла или фасцикле које нису Ваше", + "%s%% of %s used" : "%s%% од %s искоришћено", "Settings" : "Поставке" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" }
\ No newline at end of file diff --git a/apps/files/l10n/sv.js b/apps/files/l10n/sv.js index c9951a7d894..143f6eddef1 100644 --- a/apps/files/l10n/sv.js +++ b/apps/files/l10n/sv.js @@ -181,7 +181,6 @@ OC.L10N.register( "Templates" : "Mallar", "Unable to initialize the templates directory" : "Kunde inte initialisera mall-mappen", "%s used" : "%s använt", - "%s%% of %s used" : "%s%% av %s använt", "%1$s of %2$s used" : "%1$s av %2$s använt", "Show hidden files" : "Visa dolda filer", "Crop image previews" : "Beskär förhandsgranskningar för bilder", @@ -210,6 +209,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "Du har inte tillåtelse att ladda upp eller skapa filer här", "New" : "Ny", "Cannot transfer ownership of a file or folder you don't own" : "Det går inte att överföra ägarskap av en fil eller mapp som du inte äger", + "%s%% of %s used" : "%s%% av %s använt", "Settings" : "Inställningar" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/sv.json b/apps/files/l10n/sv.json index 1d65272e94a..fc3bd29fd0d 100644 --- a/apps/files/l10n/sv.json +++ b/apps/files/l10n/sv.json @@ -179,7 +179,6 @@ "Templates" : "Mallar", "Unable to initialize the templates directory" : "Kunde inte initialisera mall-mappen", "%s used" : "%s använt", - "%s%% of %s used" : "%s%% av %s använt", "%1$s of %2$s used" : "%1$s av %2$s använt", "Show hidden files" : "Visa dolda filer", "Crop image previews" : "Beskär förhandsgranskningar för bilder", @@ -208,6 +207,7 @@ "You don’t have permission to upload or create files here" : "Du har inte tillåtelse att ladda upp eller skapa filer här", "New" : "Ny", "Cannot transfer ownership of a file or folder you don't own" : "Det går inte att överföra ägarskap av en fil eller mapp som du inte äger", + "%s%% of %s used" : "%s%% av %s använt", "Settings" : "Inställningar" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/th.js b/apps/files/l10n/th.js index 53fdeab8488..8a2a35654a6 100644 --- a/apps/files/l10n/th.js +++ b/apps/files/l10n/th.js @@ -188,7 +188,6 @@ OC.L10N.register( "Templates" : "เทมเพลต", "Unable to initialize the templates directory" : "ไม่สามารถเตรียมไดเรกทอรีเทมเพลต", "%s used" : "ใช้ไป %s", - "%s%% of %s used" : "ใช้ไป %s%% จาก %s", "%1$s of %2$s used" : "ใช้ไป %1$s จาก %2$s", "Files settings" : "การตั้งค่าไฟล์", "Show hidden files" : "แสดงไฟล์ที่ซ่อนอยู่", @@ -218,6 +217,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "คุณไม่ได้รับอนุญาตให้อัปโหลดหรือสร้างไฟล์ที่นี่", "New" : "สร้างใหม่", "Cannot transfer ownership of a file or folder you don't own" : "ไม่สามารถโอนย้ายความเป็นเจ้าของไฟล์หรือโฟลเดอร์ที่คุณไม่ได้เป็นเจ้าของ", + "%s%% of %s used" : "ใช้ไป %s%% จาก %s", "Settings" : "การตั้งค่า" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/th.json b/apps/files/l10n/th.json index 4fc08fdc75b..f4836a2d044 100644 --- a/apps/files/l10n/th.json +++ b/apps/files/l10n/th.json @@ -186,7 +186,6 @@ "Templates" : "เทมเพลต", "Unable to initialize the templates directory" : "ไม่สามารถเตรียมไดเรกทอรีเทมเพลต", "%s used" : "ใช้ไป %s", - "%s%% of %s used" : "ใช้ไป %s%% จาก %s", "%1$s of %2$s used" : "ใช้ไป %1$s จาก %2$s", "Files settings" : "การตั้งค่าไฟล์", "Show hidden files" : "แสดงไฟล์ที่ซ่อนอยู่", @@ -216,6 +215,7 @@ "You don’t have permission to upload or create files here" : "คุณไม่ได้รับอนุญาตให้อัปโหลดหรือสร้างไฟล์ที่นี่", "New" : "สร้างใหม่", "Cannot transfer ownership of a file or folder you don't own" : "ไม่สามารถโอนย้ายความเป็นเจ้าของไฟล์หรือโฟลเดอร์ที่คุณไม่ได้เป็นเจ้าของ", + "%s%% of %s used" : "ใช้ไป %s%% จาก %s", "Settings" : "การตั้งค่า" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/l10n/tr.js b/apps/files/l10n/tr.js index 018e99652f3..db4b2534bd4 100644 --- a/apps/files/l10n/tr.js +++ b/apps/files/l10n/tr.js @@ -189,7 +189,6 @@ OC.L10N.register( "Templates" : "Kalıplar", "Unable to initialize the templates directory" : "Kalıp klasörü hazırlanamadı", "%s used" : "%s kullanılıyor", - "%s%% of %s used" : "%s%%/%s kullanılmış", "%1$s of %2$s used" : "%1$s / %2$s kullanıldı", "Files settings" : "Dosyalar ayarları", "Show hidden files" : "Gizli dosyaları görüntüle", @@ -219,6 +218,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "Buraya dosya yükleme ya da ekleme izniniz yok", "New" : "Yeni", "Cannot transfer ownership of a file or folder you don't own" : "Sahibi olmadığınız bir dosya ya da klasörün sahipliğini aktaramazsınız", + "%s%% of %s used" : "%s%%/%s kullanılmış", "Settings" : "Ayarlar" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/files/l10n/tr.json b/apps/files/l10n/tr.json index abb3466b05d..914941797c7 100644 --- a/apps/files/l10n/tr.json +++ b/apps/files/l10n/tr.json @@ -187,7 +187,6 @@ "Templates" : "Kalıplar", "Unable to initialize the templates directory" : "Kalıp klasörü hazırlanamadı", "%s used" : "%s kullanılıyor", - "%s%% of %s used" : "%s%%/%s kullanılmış", "%1$s of %2$s used" : "%1$s / %2$s kullanıldı", "Files settings" : "Dosyalar ayarları", "Show hidden files" : "Gizli dosyaları görüntüle", @@ -217,6 +216,7 @@ "You don’t have permission to upload or create files here" : "Buraya dosya yükleme ya da ekleme izniniz yok", "New" : "Yeni", "Cannot transfer ownership of a file or folder you don't own" : "Sahibi olmadığınız bir dosya ya da klasörün sahipliğini aktaramazsınız", + "%s%% of %s used" : "%s%%/%s kullanılmış", "Settings" : "Ayarlar" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/uk.js b/apps/files/l10n/uk.js index 379c0f55e89..5b12aa12682 100644 --- a/apps/files/l10n/uk.js +++ b/apps/files/l10n/uk.js @@ -154,7 +154,6 @@ OC.L10N.register( "Cancel" : "Скасувати", "Create" : "Створити", "%s used" : "%s використано", - "%s%% of %s used" : "%s%% з %s використано", "%1$s of %2$s used" : "Використано %1$s з %2$s", "Show hidden files" : "Показувати приховані файли", "WebDAV" : "WebDAV", @@ -181,6 +180,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "У вас недостатньо прав для завантаження або створення тут файлів", "New" : "Створити", "Cannot transfer ownership of a file or folder you don't own" : "Неможливо передати права власності на файл або теку, що вам не належить", + "%s%% of %s used" : "%s%% з %s використано", "Settings" : "Налаштування" }, "nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);"); diff --git a/apps/files/l10n/uk.json b/apps/files/l10n/uk.json index d3f6704fbc1..41a14da8d70 100644 --- a/apps/files/l10n/uk.json +++ b/apps/files/l10n/uk.json @@ -152,7 +152,6 @@ "Cancel" : "Скасувати", "Create" : "Створити", "%s used" : "%s використано", - "%s%% of %s used" : "%s%% з %s використано", "%1$s of %2$s used" : "Використано %1$s з %2$s", "Show hidden files" : "Показувати приховані файли", "WebDAV" : "WebDAV", @@ -179,6 +178,7 @@ "You don’t have permission to upload or create files here" : "У вас недостатньо прав для завантаження або створення тут файлів", "New" : "Створити", "Cannot transfer ownership of a file or folder you don't own" : "Неможливо передати права власності на файл або теку, що вам не належить", + "%s%% of %s used" : "%s%% з %s використано", "Settings" : "Налаштування" },"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);" }
\ No newline at end of file diff --git a/apps/files/l10n/vi.js b/apps/files/l10n/vi.js index 58cb29bf2ef..981f6dffe83 100644 --- a/apps/files/l10n/vi.js +++ b/apps/files/l10n/vi.js @@ -181,7 +181,6 @@ OC.L10N.register( "Templates" : "Mẫu", "Unable to initialize the templates directory" : "Không thể khởi tạo thư mục mẫu", "%s used" : "%s đã sử dụng", - "%s%% of %s used" : "%s%% trong %s đã sử dụng", "%1$s of %2$s used" : "%1$s trên %2$s đã sử dụng", "Show hidden files" : "Hiển thị các file bị ẩn", "Crop image previews" : "Xén ảnh bản xem trước", @@ -209,6 +208,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "Bạn không có quyền upload hoặc tạo files ở đây", "New" : "Tạo mới", "Cannot transfer ownership of a file or folder you don't own" : "Không thể chuyển quyền sở hữu tệp hoặc thư mục bạn không sở hữu", + "%s%% of %s used" : "%s%% trong %s đã sử dụng", "Settings" : "Cài đặt" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/vi.json b/apps/files/l10n/vi.json index e1740c0b786..cd77d5a9fbc 100644 --- a/apps/files/l10n/vi.json +++ b/apps/files/l10n/vi.json @@ -179,7 +179,6 @@ "Templates" : "Mẫu", "Unable to initialize the templates directory" : "Không thể khởi tạo thư mục mẫu", "%s used" : "%s đã sử dụng", - "%s%% of %s used" : "%s%% trong %s đã sử dụng", "%1$s of %2$s used" : "%1$s trên %2$s đã sử dụng", "Show hidden files" : "Hiển thị các file bị ẩn", "Crop image previews" : "Xén ảnh bản xem trước", @@ -207,6 +206,7 @@ "You don’t have permission to upload or create files here" : "Bạn không có quyền upload hoặc tạo files ở đây", "New" : "Tạo mới", "Cannot transfer ownership of a file or folder you don't own" : "Không thể chuyển quyền sở hữu tệp hoặc thư mục bạn không sở hữu", + "%s%% of %s used" : "%s%% trong %s đã sử dụng", "Settings" : "Cài đặt" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/l10n/zh_CN.js b/apps/files/l10n/zh_CN.js index dd6cb686dd9..9e9d00658e3 100644 --- a/apps/files/l10n/zh_CN.js +++ b/apps/files/l10n/zh_CN.js @@ -185,7 +185,6 @@ OC.L10N.register( "Templates" : "模板", "Unable to initialize the templates directory" : "无法初始化模板目录", "%s used" : "已使用 %s", - "%s%% of %s used" : "%s 已使用 %s 中的 %%", "%1$s of %2$s used" : "已使用 %2$s 中的 %1$s", "Show hidden files" : "显示隐藏文件", "Crop image previews" : "裁剪图片预览", @@ -214,6 +213,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "您没有权限在此上传或创建文件", "New" : "新建", "Cannot transfer ownership of a file or folder you don't own" : "无法转让您未拥有的文件或文件夹的所有权", + "%s%% of %s used" : "%s 已使用 %s 中的 %%", "Settings" : "设置" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/zh_CN.json b/apps/files/l10n/zh_CN.json index aa69845ddd3..66794063055 100644 --- a/apps/files/l10n/zh_CN.json +++ b/apps/files/l10n/zh_CN.json @@ -183,7 +183,6 @@ "Templates" : "模板", "Unable to initialize the templates directory" : "无法初始化模板目录", "%s used" : "已使用 %s", - "%s%% of %s used" : "%s 已使用 %s 中的 %%", "%1$s of %2$s used" : "已使用 %2$s 中的 %1$s", "Show hidden files" : "显示隐藏文件", "Crop image previews" : "裁剪图片预览", @@ -212,6 +211,7 @@ "You don’t have permission to upload or create files here" : "您没有权限在此上传或创建文件", "New" : "新建", "Cannot transfer ownership of a file or folder you don't own" : "无法转让您未拥有的文件或文件夹的所有权", + "%s%% of %s used" : "%s 已使用 %s 中的 %%", "Settings" : "设置" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/l10n/zh_HK.js b/apps/files/l10n/zh_HK.js index 94277b9b3fb..c8dc7ec08c6 100644 --- a/apps/files/l10n/zh_HK.js +++ b/apps/files/l10n/zh_HK.js @@ -189,7 +189,6 @@ OC.L10N.register( "Templates" : "模板", "Unable to initialize the templates directory" : "無法初始化模板目錄", "%s used" : "使用了 %s 的存儲空間", - "%s%% of %s used" : "%s 在 %s 中使用了 %%", "%1$s of %2$s used" : "在 %2$s 中使用了 %1$s", "Files settings" : "檔案設定", "Show hidden files" : "顯示隱藏檔", @@ -219,6 +218,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "您無權限上傳或建立檔案", "New" : "新增", "Cannot transfer ownership of a file or folder you don't own" : "無法轉移您未擁有的檔案或是資料夾所有權。", + "%s%% of %s used" : "%s 在 %s 中使用了 %%", "Settings" : "設定" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/zh_HK.json b/apps/files/l10n/zh_HK.json index fd0ac3c2469..8b6756ee28f 100644 --- a/apps/files/l10n/zh_HK.json +++ b/apps/files/l10n/zh_HK.json @@ -187,7 +187,6 @@ "Templates" : "模板", "Unable to initialize the templates directory" : "無法初始化模板目錄", "%s used" : "使用了 %s 的存儲空間", - "%s%% of %s used" : "%s 在 %s 中使用了 %%", "%1$s of %2$s used" : "在 %2$s 中使用了 %1$s", "Files settings" : "檔案設定", "Show hidden files" : "顯示隱藏檔", @@ -217,6 +216,7 @@ "You don’t have permission to upload or create files here" : "您無權限上傳或建立檔案", "New" : "新增", "Cannot transfer ownership of a file or folder you don't own" : "無法轉移您未擁有的檔案或是資料夾所有權。", + "%s%% of %s used" : "%s 在 %s 中使用了 %%", "Settings" : "設定" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/l10n/zh_TW.js b/apps/files/l10n/zh_TW.js index 764ddfee398..cab6a8d102f 100644 --- a/apps/files/l10n/zh_TW.js +++ b/apps/files/l10n/zh_TW.js @@ -79,6 +79,7 @@ OC.L10N.register( "_Uploading %n file_::_Uploading %n files_" : ["正在上傳 %n 個檔案"], "New file/folder menu" : "新檔案/資料夾選單", "Select file range" : "選取多個檔案", + "{used}%" : "{used}%", "{used} of {quota} used" : "已使用 {quota} 當中的 {used}", "{used} used" : "已使用 {used}", "\"{name}\" is an invalid file name." : "{name} 是無效的檔名。", @@ -189,7 +190,7 @@ OC.L10N.register( "Templates" : "範本", "Unable to initialize the templates directory" : "無法初始化範本目錄", "%s used" : "%s 已使用", - "%s%% of %s used" : "%s 在 %s 中使用了 %%", + "%s%%" : "%s%%", "%1$s of %2$s used" : "在 %2$s 中使用了 %1$s ", "Files settings" : "檔案設定", "Show hidden files" : "顯示隱藏檔", @@ -219,6 +220,7 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "您沒有權限在這裡上傳或建立檔案", "New" : "新增", "Cannot transfer ownership of a file or folder you don't own" : "無法轉移您未擁有的檔案或是資料夾所有權", + "%s%% of %s used" : "%s 在 %s 中使用了 %%", "Settings" : "設定" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/zh_TW.json b/apps/files/l10n/zh_TW.json index 893c233e5be..f37917512fa 100644 --- a/apps/files/l10n/zh_TW.json +++ b/apps/files/l10n/zh_TW.json @@ -77,6 +77,7 @@ "_Uploading %n file_::_Uploading %n files_" : ["正在上傳 %n 個檔案"], "New file/folder menu" : "新檔案/資料夾選單", "Select file range" : "選取多個檔案", + "{used}%" : "{used}%", "{used} of {quota} used" : "已使用 {quota} 當中的 {used}", "{used} used" : "已使用 {used}", "\"{name}\" is an invalid file name." : "{name} 是無效的檔名。", @@ -187,7 +188,7 @@ "Templates" : "範本", "Unable to initialize the templates directory" : "無法初始化範本目錄", "%s used" : "%s 已使用", - "%s%% of %s used" : "%s 在 %s 中使用了 %%", + "%s%%" : "%s%%", "%1$s of %2$s used" : "在 %2$s 中使用了 %1$s ", "Files settings" : "檔案設定", "Show hidden files" : "顯示隱藏檔", @@ -217,6 +218,7 @@ "You don’t have permission to upload or create files here" : "您沒有權限在這裡上傳或建立檔案", "New" : "新增", "Cannot transfer ownership of a file or folder you don't own" : "無法轉移您未擁有的檔案或是資料夾所有權", + "%s%% of %s used" : "%s 在 %s 中使用了 %%", "Settings" : "設定" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/lib/Controller/ViewController.php b/apps/files/lib/Controller/ViewController.php index 587f75f3f02..82f56be9f18 100644 --- a/apps/files/lib/Controller/ViewController.php +++ b/apps/files/lib/Controller/ViewController.php @@ -46,6 +46,7 @@ use OCP\AppFramework\Http\RedirectResponse; use OCP\AppFramework\Http\Response; use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Services\IInitialState; +use OCP\Collaboration\Resources\LoadAdditionalScriptsEvent as ResourcesLoadAdditionalScriptsEvent; use OCP\EventDispatcher\IEventDispatcher; use OCP\Files\Folder; use OCP\Files\IRootFolder; @@ -294,6 +295,7 @@ class ViewController extends Controller { ]; } + $this->eventDispatcher->dispatchTyped(new ResourcesLoadAdditionalScriptsEvent()); $event = new LoadAdditionalScriptsEvent(); $this->eventDispatcher->dispatchTyped($event); $this->eventDispatcher->dispatchTyped(new LoadSidebar()); @@ -301,6 +303,7 @@ class ViewController extends Controller { if (class_exists(LoadViewer::class)) { $this->eventDispatcher->dispatchTyped(new LoadViewer()); } + $this->initialState->provideInitialState('templates_path', $this->templateManager->hasTemplateDirectory() ? $this->templateManager->getTemplatePath() : false); $this->initialState->provideInitialState('templates', $this->templateManager->listCreators()); diff --git a/apps/files/lib/Helper.php b/apps/files/lib/Helper.php index 18fea3aa2a1..1d9591cafe0 100644 --- a/apps/files/lib/Helper.php +++ b/apps/files/lib/Helper.php @@ -58,8 +58,9 @@ class Helper { 'maxHumanFilesize' => $maxHumanFileSize, 'freeSpace' => $storageInfo['free'], 'quota' => $storageInfo['quota'], + 'total' => $storageInfo['total'], 'used' => $storageInfo['used'], - 'usedSpacePercent' => (int)$storageInfo['relative'], + 'usedSpacePercent' => $storageInfo['relative'], 'owner' => $storageInfo['owner'], 'ownerDisplayName' => $storageInfo['ownerDisplayName'], 'mountType' => $storageInfo['mountType'], diff --git a/apps/files/templates/appnavigation.php b/apps/files/templates/appnavigation.php index 9c875d9530c..9ff680d6a8d 100644 --- a/apps/files/templates/appnavigation.php +++ b/apps/files/templates/appnavigation.php @@ -17,7 +17,7 @@ </li> <?php else: ?> <li id="quota" class="has-tooltip pinned <?php p($pinned === 0 ? 'first-pinned ' : '') ?>" - title="<?php p($l->t('%s%% of %s used', [$_['usage_relative'], $_['total_space']])); ?>"> + title="<?php p($l->t('%s%%', [round($_['usage_relative'])])); ?>"> <a href="#" class="icon-quota svg quota-navigation-item"> <p id="quotatext" class="quota-navigation-item__text"><?php p($l->t('%1$s of %2$s used', [$_['usage'], $_['total_space']])); ?></p> <div class="quota-navigation-item__container"> diff --git a/apps/files_external/l10n/nb.js b/apps/files_external/l10n/nb.js index f2fbd94aec8..7224682f7fa 100644 --- a/apps/files_external/l10n/nb.js +++ b/apps/files_external/l10n/nb.js @@ -11,6 +11,7 @@ OC.L10N.register( "Generate keys" : "Generer nøkler", "Error generating key pair" : "Feil ved nøkkelgenerering", "All users. Type to select user or group." : "Alle brukere. Tast for å velge bruker eller gruppe.", + "(Group)" : "(Gruppe)", "Compatibility with Mac NFD encoding (slow)" : "Kompatibelt med Mac NFD koding (treg)", "Enable encryption" : "Aktiver kryptering", "Enable previews" : "Skru på forhåndsvisninger", @@ -98,6 +99,7 @@ OC.L10N.register( "SFTP" : "SFTP", "Root" : "Rot", "SFTP with secret key login" : "SFTP med hemmelig nøkkel for pålogging", + "SMB/CIFS" : "SMB/CIFS", "Share" : "Delt ressurs", "Show hidden files" : "Vis skjulte filer", "Timeout" : "Tidsavbrudd", diff --git a/apps/files_external/l10n/nb.json b/apps/files_external/l10n/nb.json index 038965e0f5f..633021d0cae 100644 --- a/apps/files_external/l10n/nb.json +++ b/apps/files_external/l10n/nb.json @@ -9,6 +9,7 @@ "Generate keys" : "Generer nøkler", "Error generating key pair" : "Feil ved nøkkelgenerering", "All users. Type to select user or group." : "Alle brukere. Tast for å velge bruker eller gruppe.", + "(Group)" : "(Gruppe)", "Compatibility with Mac NFD encoding (slow)" : "Kompatibelt med Mac NFD koding (treg)", "Enable encryption" : "Aktiver kryptering", "Enable previews" : "Skru på forhåndsvisninger", @@ -96,6 +97,7 @@ "SFTP" : "SFTP", "Root" : "Rot", "SFTP with secret key login" : "SFTP med hemmelig nøkkel for pålogging", + "SMB/CIFS" : "SMB/CIFS", "Share" : "Delt ressurs", "Show hidden files" : "Vis skjulte filer", "Timeout" : "Tidsavbrudd", diff --git a/apps/files_sharing/l10n/bg.js b/apps/files_sharing/l10n/bg.js index eea722c7e1a..da9d7462897 100644 --- a/apps/files_sharing/l10n/bg.js +++ b/apps/files_sharing/l10n/bg.js @@ -123,6 +123,7 @@ OC.L10N.register( "Could not lock node" : "Възелът не можа да се заключи", "Could not lock path" : "Пътя не можа да се заключи", "Wrong or no update parameter given" : "Грешен или не е даден параметър за актуализация", + "Cannot increase permissions" : "Не могат да се увеличат права", "Share must at least have READ or CREATE permissions" : "Споделянето трябва да има права поне за ЧЕТЕНЕ или СЪЗДАВАНЕ", "Share must have READ permission if UPDATE or DELETE permission is set" : "Споделянето трябва да има право за ЧЕТЕНЕ ако е зададено право за ОБНОВЯВАНЕ или за ИЗТРИВАНЕ", "\"Sending the password by Nextcloud Talk\" for sharing a file or folder failed because Nextcloud Talk is not enabled." : "„Изпращането на паролата от Nextcloud Talk“ за споделяне на файл или папка не беше успешно, тъй като Nextcloud Talk не е активиран.", @@ -174,14 +175,17 @@ OC.L10N.register( "Shared with the group {user} by {owner}" : "Споделено с групата {user} от {owner}", "Shared with the conversation {user} by {owner}" : "Споделено с разговора {user} от {owner}", "Shared with {user} by {owner}" : "Споделено с {user} от {owner}", + "Allow download" : "Позволяване на изтегляне/сваляне/", "Added by {initiator}" : "Добавено от {initiator}", "Via “{folder}”" : "Чрез “{folder}”", "Internal link" : "Вътрешна връзка", + "Copy internal link to clipboard" : "Копиране на вътрешна връзката в клипборда", "Link copied" : "Връзката е копирана", "Cannot copy, please copy the link manually" : "Не може да се копира, моля, копирайте връзката ръчно", "Copy to clipboard" : "Копирай", "Only works for users with access to this folder" : "Работи само за потребители, които имат достъп до тази папка", "Only works for users with access to this file" : "Работи само за потребители, които имат достъп до този файл", + "Copy public link to clipboard" : "Копиране на публична връзка в клипборда", "Please enter the following required information before creating the share" : "Моля, въведете следната необходима информация, преди да създадете споделянето", "Password protection (enforced)" : "Защита с парола (приложена)", "Password protection" : "Password protection", diff --git a/apps/files_sharing/l10n/bg.json b/apps/files_sharing/l10n/bg.json index 51a2c5e6ab1..c7c79da78f3 100644 --- a/apps/files_sharing/l10n/bg.json +++ b/apps/files_sharing/l10n/bg.json @@ -121,6 +121,7 @@ "Could not lock node" : "Възелът не можа да се заключи", "Could not lock path" : "Пътя не можа да се заключи", "Wrong or no update parameter given" : "Грешен или не е даден параметър за актуализация", + "Cannot increase permissions" : "Не могат да се увеличат права", "Share must at least have READ or CREATE permissions" : "Споделянето трябва да има права поне за ЧЕТЕНЕ или СЪЗДАВАНЕ", "Share must have READ permission if UPDATE or DELETE permission is set" : "Споделянето трябва да има право за ЧЕТЕНЕ ако е зададено право за ОБНОВЯВАНЕ или за ИЗТРИВАНЕ", "\"Sending the password by Nextcloud Talk\" for sharing a file or folder failed because Nextcloud Talk is not enabled." : "„Изпращането на паролата от Nextcloud Talk“ за споделяне на файл или папка не беше успешно, тъй като Nextcloud Talk не е активиран.", @@ -172,14 +173,17 @@ "Shared with the group {user} by {owner}" : "Споделено с групата {user} от {owner}", "Shared with the conversation {user} by {owner}" : "Споделено с разговора {user} от {owner}", "Shared with {user} by {owner}" : "Споделено с {user} от {owner}", + "Allow download" : "Позволяване на изтегляне/сваляне/", "Added by {initiator}" : "Добавено от {initiator}", "Via “{folder}”" : "Чрез “{folder}”", "Internal link" : "Вътрешна връзка", + "Copy internal link to clipboard" : "Копиране на вътрешна връзката в клипборда", "Link copied" : "Връзката е копирана", "Cannot copy, please copy the link manually" : "Не може да се копира, моля, копирайте връзката ръчно", "Copy to clipboard" : "Копирай", "Only works for users with access to this folder" : "Работи само за потребители, които имат достъп до тази папка", "Only works for users with access to this file" : "Работи само за потребители, които имат достъп до този файл", + "Copy public link to clipboard" : "Копиране на публична връзка в клипборда", "Please enter the following required information before creating the share" : "Моля, въведете следната необходима информация, преди да създадете споделянето", "Password protection (enforced)" : "Защита с парола (приложена)", "Password protection" : "Password protection", diff --git a/apps/files_sharing/l10n/eu.js b/apps/files_sharing/l10n/eu.js index 4ece4a3c402..8a33c8e58b9 100644 --- a/apps/files_sharing/l10n/eu.js +++ b/apps/files_sharing/l10n/eu.js @@ -33,7 +33,7 @@ OC.L10N.register( "Move or copy" : "Mugitu edo kopiatu", "Download" : "Deskargatu", "Delete" : "Ezabatu", - "You can upload into this folder" : "Karpeta honetara igo dezakezu", + "You can upload into this folder" : "Karpeta honetara kargatu dezakezu", "Terms of service" : "Erabilera baldintzak", "No compatible server found at {remote}" : "Ez da zerbitzari bateragarririk aurkitu {remote} helbidean", "Invalid server URL" : "Zerbitzari URL baliogabea", @@ -254,7 +254,7 @@ OC.L10N.register( "Note" : "Oharra", "Select or drop files" : "Hautatu edo jaregin fitxategiak", "Uploading files" : "Fitxategiak kargatzen", - "Uploaded files:" : "Igotako fitxategiak:", + "Uploaded files:" : "Kargatutako fitxategiak:", "By uploading files, you agree to the %1$sterms of service%2$s." : "Fitxategiak kargatzean, %1$szerbitzu-baldintzak%2$s onartzen dituzu.", "Add to your Nextcloud" : "Gehitu zure Nextclouden", "Wrong share ID, share doesn't exist" : "Partekatze ID okerra, partekatzea ez da existitzen", diff --git a/apps/files_sharing/l10n/eu.json b/apps/files_sharing/l10n/eu.json index 1f49228c6b2..8678e7b67b9 100644 --- a/apps/files_sharing/l10n/eu.json +++ b/apps/files_sharing/l10n/eu.json @@ -31,7 +31,7 @@ "Move or copy" : "Mugitu edo kopiatu", "Download" : "Deskargatu", "Delete" : "Ezabatu", - "You can upload into this folder" : "Karpeta honetara igo dezakezu", + "You can upload into this folder" : "Karpeta honetara kargatu dezakezu", "Terms of service" : "Erabilera baldintzak", "No compatible server found at {remote}" : "Ez da zerbitzari bateragarririk aurkitu {remote} helbidean", "Invalid server URL" : "Zerbitzari URL baliogabea", @@ -252,7 +252,7 @@ "Note" : "Oharra", "Select or drop files" : "Hautatu edo jaregin fitxategiak", "Uploading files" : "Fitxategiak kargatzen", - "Uploaded files:" : "Igotako fitxategiak:", + "Uploaded files:" : "Kargatutako fitxategiak:", "By uploading files, you agree to the %1$sterms of service%2$s." : "Fitxategiak kargatzean, %1$szerbitzu-baldintzak%2$s onartzen dituzu.", "Add to your Nextcloud" : "Gehitu zure Nextclouden", "Wrong share ID, share doesn't exist" : "Partekatze ID okerra, partekatzea ez da existitzen", diff --git a/apps/files_sharing/l10n/ja.js b/apps/files_sharing/l10n/ja.js index 53c279f8777..d4f88eb1f8b 100644 --- a/apps/files_sharing/l10n/ja.js +++ b/apps/files_sharing/l10n/ja.js @@ -175,14 +175,17 @@ OC.L10N.register( "Shared with the group {user} by {owner}" : "{owner}によってグループ{user}と共有されました", "Shared with the conversation {user} by {owner}" : "{owner}が{user}との会話を共有しました", "Shared with {user} by {owner}" : "{owner}が{user}と共有", + "Allow download" : "ダウンロードを許可", "Added by {initiator}" : "{initiator}によって追加されました", "Via “{folder}”" : "“{folder}” 経由", "Internal link" : "内部リンク", + "Copy internal link to clipboard" : "内部リンクをクリップボードにコピー", "Link copied" : "リンクをコピーしました", "Cannot copy, please copy the link manually" : "コピーできませんでした。手動でリンクをコピーしてください。", "Copy to clipboard" : "クリップボードにコピー", "Only works for users with access to this folder" : "このフォルダーにアクセスできるユーザーにのみ機能します", "Only works for users with access to this file" : "このファイルへのアクセス権を持つユーザーに対してのみ機能します", + "Copy public link to clipboard" : "公開リンクをクリップボードにコピー", "Please enter the following required information before creating the share" : "共有を作成する前に、次の必要な情報を入力してください", "Password protection (enforced)" : "パスワード保護(強制)", "Password protection" : "パスワード保護", diff --git a/apps/files_sharing/l10n/ja.json b/apps/files_sharing/l10n/ja.json index 257787d5577..205c91469a8 100644 --- a/apps/files_sharing/l10n/ja.json +++ b/apps/files_sharing/l10n/ja.json @@ -173,14 +173,17 @@ "Shared with the group {user} by {owner}" : "{owner}によってグループ{user}と共有されました", "Shared with the conversation {user} by {owner}" : "{owner}が{user}との会話を共有しました", "Shared with {user} by {owner}" : "{owner}が{user}と共有", + "Allow download" : "ダウンロードを許可", "Added by {initiator}" : "{initiator}によって追加されました", "Via “{folder}”" : "“{folder}” 経由", "Internal link" : "内部リンク", + "Copy internal link to clipboard" : "内部リンクをクリップボードにコピー", "Link copied" : "リンクをコピーしました", "Cannot copy, please copy the link manually" : "コピーできませんでした。手動でリンクをコピーしてください。", "Copy to clipboard" : "クリップボードにコピー", "Only works for users with access to this folder" : "このフォルダーにアクセスできるユーザーにのみ機能します", "Only works for users with access to this file" : "このファイルへのアクセス権を持つユーザーに対してのみ機能します", + "Copy public link to clipboard" : "公開リンクをクリップボードにコピー", "Please enter the following required information before creating the share" : "共有を作成する前に、次の必要な情報を入力してください", "Password protection (enforced)" : "パスワード保護(強制)", "Password protection" : "パスワード保護", diff --git a/apps/files_sharing/l10n/mk.js b/apps/files_sharing/l10n/mk.js index 60eeff1956c..cc609b1fd33 100644 --- a/apps/files_sharing/l10n/mk.js +++ b/apps/files_sharing/l10n/mk.js @@ -98,8 +98,10 @@ OC.L10N.register( "Files" : "Датотеки", "A file or folder has been <strong>shared</strong>" : "Датотека или папка беше <strong>споделена</strong>", "Shared link" : "Споделен линк", + "Wrong share ID, share does not exist" : "Погрешно ID на споделување, споделувањето не постои", "Could not delete share" : "Неможе да се избрише споделувањето", "Please specify a file or folder path" : "Изберете датотека или патека до папка", + "Wrong path, file/folder does not exist" : "Погрешна патека, датотеката/папката не постои", "Could not create share" : "Неможе да се креира споделување", "Invalid permissions" : "Неважечки дозволи", "Please specify a valid user" : "Изберете корисник", @@ -111,6 +113,8 @@ OC.L10N.register( "Sharing %s sending the password by Nextcloud Talk failed because Nextcloud Talk is not enabled" : "Неуспешно испраќање на лозинка за споделувањето %s преку разговор бидејќи разговорот не е овозможен", "Invalid date, date format must be YYYY-MM-DD" : "Невалиден датум, форматот мора да биде ГГГГ-ММ-ДД", "Sharing %1$s failed because the back end does not allow shares from type %2$s" : "Споделувањето на %1$s е неуспешно бидејќи позадината не дозволува споделувања од видот %2$s", + "Please specify a valid federated user ID" : "Внесете валидно федерално корисничко ИД", + "Please specify a valid federated group ID" : "Внесете валидно федерално групно ИД", "You cannot share to a Circle if the app is not enabled" : "Неможете да споделите во круг ако апликацијата не е овозможена", "Please specify a valid circle" : "Изберете круг", "Sharing %s failed because the back end does not support room shares" : "Споделувањето на %s е неуспешно бидејќи позадината не дозволува споделувања во соби со разговори", @@ -119,6 +123,10 @@ OC.L10N.register( "Could not lock node" : "Не можам да го заклучам јазолот", "Could not lock path" : "Неможе да се заклучи патеката", "Wrong or no update parameter given" : "Погрешни или нема зададено параметри за ажурирање", + "Cannot increase permissions" : "Неможат да се зголемат дозволите на", + "Share must at least have READ or CREATE permissions" : "Споделувањето мора барем да има дозволи за ЧИТАЊЕ или СОДАВАЊЕ", + "Share must have READ permission if UPDATE or DELETE permission is set" : "Споделувањето мора да има дозвола за ЧИТАЊЕ ако е поставена дозвола за АЖУРИРАЊЕ или БРИШЕЊЕ", + "\"Sending the password by Nextcloud Talk\" for sharing a file or folder failed because Nextcloud Talk is not enabled." : "„Испраќањето на лозинката преку Talk“ за споделување датотека или папка не успеа бидејќи Talk не е овозможен.", "shared by %s" : "споделено од %s", "Download all files" : "Преземи ги сите датотеки", "Direct link" : "Директен линк", @@ -135,8 +143,10 @@ OC.L10N.register( "This application enables users to share files within Nextcloud. If enabled, the admin can choose which groups can share files. The applicable users can then share files and folders with other users and groups within Nextcloud. In addition, if the admin enables the share link feature, an external link can be used to share files with other users outside of Nextcloud. Admins can also enforce passwords, expirations dates, and enable server to server sharing via share links, as well as sharing from mobile devices.\nTurning the feature off removes shared files and folders on the server for all share recipients, and also on the sync clients and mobile apps. More information is available in the Nextcloud Documentation." : "Оваа апликација им овозможува на корисниците да споделуваат датотеки во рамките на Nextcloud. Доколку е овозможено, администраторот може да избере кои групи можат да споделуваат датотеки. Применливите корисници потоа можат да споделуваат датотеки и папки со други корисници и групи во рамките на Nextcloud. Покрај тоа, ако администраторот ја овозможи функцијата за далечно споделување, може да се користи надворешна врска за споделување датотеки со други корисници надвор од Nextcloud. Администраторот исто така може да овозможи поставување на лозинки, датуми на истекувања и да овозможи споделување од сервер на сервер преку линкови за споделување, како и споделување од мобилни уреди.\nИсклучувањето на функцијата ги отстранува споделените датотеки и папките на серверот за сите приматели на споделување, а исто така и на клиентите за синхронизација и апликациите за мобилни. Повеќе информации се достапни во Документацијата на Nextcloud.", "Sharing" : "Споделување", "Accept user and group shares by default" : "Стандардно прифаќај споделувања од корисници и групи", + "Error while toggling options" : "Грешка при префрлање опции", "Set default folder for accepted shares" : "Постави стандардна папка за прифатените споделувања", "Reset" : "Ресетирање", + "Reset folder to system default" : "Ресетирајте ја папката на стандардниот систем", "Choose a default folder for accepted shares" : "Избери стандардна папка за прифатените споделувања", "Invalid path selected" : "Избрана невалидна патека", "Unknown error" : "Непозната грешка", @@ -144,9 +154,11 @@ OC.L10N.register( "Read only" : "Само читај", "Allow upload and editing" : "Дозволи прикачување и уредување", "File drop (upload only)" : "Испуши датотека (само за прикачување)", + "Custom permissions" : "Прилагодени дозволи", "Read" : "Читај", "Upload" : "Прикачи", "Edit" : "Уреди", + "Bundled permissions" : "Пакет дозволи", "Allow creating" : "Дозволи креирање", "Allow deleting" : "Дозволи бришење", "Allow resharing" : "Дозволи повторно споделување", @@ -163,14 +175,17 @@ OC.L10N.register( "Shared with the group {user} by {owner}" : "Споделено со група на {user} од {owner}", "Shared with the conversation {user} by {owner}" : "Споделено со разговор на {user} од {owner}", "Shared with {user} by {owner}" : "Споделено со {user} од {owner}", + "Allow download" : "Дозволи преземање", "Added by {initiator}" : "Додадено од {initiator}", "Via “{folder}”" : "Преку “{folder}”", "Internal link" : "Внатрешен линк", + "Copy internal link to clipboard" : "Копирај внатрешен линк во клипборд", "Link copied" : "Линкот е копиран", "Cannot copy, please copy the link manually" : "Неможе да се копира, копирајте го линкот рачно", "Copy to clipboard" : "Копирај во клипборд", "Only works for users with access to this folder" : "Функционира само за корисници со пристап до оваа папка", "Only works for users with access to this file" : "Функционира само за корисници со пристап до оваа датотека", + "Copy public link to clipboard" : "Копирај јавен линк во клипборд", "Please enter the following required information before creating the share" : "Внесете ги следниве потребни податоци пред да го креирате споделувањето", "Password protection (enforced)" : "Заштитено со лозинка (enforced)", "Password protection" : "Заштитено со лозинка", @@ -181,6 +196,8 @@ OC.L10N.register( "Share label" : "Ознака на споделувањето", "Hide download" : "Сокриј преземање", "Password protect" : "Заштити со лозинка", + "Password expires {passwordExpirationTime}" : "Лозинката истекува на {passwordExpirationTime}", + "Password expired" : "Лозинката е истечена", "Video verification" : "Верификација со видео", "Enter a note for the share recipient" : "Внесете белешка до примачот на споделуваето", "Add another link" : "Додади линк", @@ -224,6 +241,7 @@ OC.L10N.register( "Name" : "Име", "Share time" : "Време на споделување", "Expiration date" : "Рок на траење", + "Sorry, this link does not seem to work anymore." : "Извенете, но овој линк повеќе не функционира.", "Reasons might be:" : "Причината може да е:", "the item was removed" : "предметот беше отстранет", "the link expired" : "рокот на линкот е истечен", diff --git a/apps/files_sharing/l10n/mk.json b/apps/files_sharing/l10n/mk.json index f01bef06363..075367b053e 100644 --- a/apps/files_sharing/l10n/mk.json +++ b/apps/files_sharing/l10n/mk.json @@ -96,8 +96,10 @@ "Files" : "Датотеки", "A file or folder has been <strong>shared</strong>" : "Датотека или папка беше <strong>споделена</strong>", "Shared link" : "Споделен линк", + "Wrong share ID, share does not exist" : "Погрешно ID на споделување, споделувањето не постои", "Could not delete share" : "Неможе да се избрише споделувањето", "Please specify a file or folder path" : "Изберете датотека или патека до папка", + "Wrong path, file/folder does not exist" : "Погрешна патека, датотеката/папката не постои", "Could not create share" : "Неможе да се креира споделување", "Invalid permissions" : "Неважечки дозволи", "Please specify a valid user" : "Изберете корисник", @@ -109,6 +111,8 @@ "Sharing %s sending the password by Nextcloud Talk failed because Nextcloud Talk is not enabled" : "Неуспешно испраќање на лозинка за споделувањето %s преку разговор бидејќи разговорот не е овозможен", "Invalid date, date format must be YYYY-MM-DD" : "Невалиден датум, форматот мора да биде ГГГГ-ММ-ДД", "Sharing %1$s failed because the back end does not allow shares from type %2$s" : "Споделувањето на %1$s е неуспешно бидејќи позадината не дозволува споделувања од видот %2$s", + "Please specify a valid federated user ID" : "Внесете валидно федерално корисничко ИД", + "Please specify a valid federated group ID" : "Внесете валидно федерално групно ИД", "You cannot share to a Circle if the app is not enabled" : "Неможете да споделите во круг ако апликацијата не е овозможена", "Please specify a valid circle" : "Изберете круг", "Sharing %s failed because the back end does not support room shares" : "Споделувањето на %s е неуспешно бидејќи позадината не дозволува споделувања во соби со разговори", @@ -117,6 +121,10 @@ "Could not lock node" : "Не можам да го заклучам јазолот", "Could not lock path" : "Неможе да се заклучи патеката", "Wrong or no update parameter given" : "Погрешни или нема зададено параметри за ажурирање", + "Cannot increase permissions" : "Неможат да се зголемат дозволите на", + "Share must at least have READ or CREATE permissions" : "Споделувањето мора барем да има дозволи за ЧИТАЊЕ или СОДАВАЊЕ", + "Share must have READ permission if UPDATE or DELETE permission is set" : "Споделувањето мора да има дозвола за ЧИТАЊЕ ако е поставена дозвола за АЖУРИРАЊЕ или БРИШЕЊЕ", + "\"Sending the password by Nextcloud Talk\" for sharing a file or folder failed because Nextcloud Talk is not enabled." : "„Испраќањето на лозинката преку Talk“ за споделување датотека или папка не успеа бидејќи Talk не е овозможен.", "shared by %s" : "споделено од %s", "Download all files" : "Преземи ги сите датотеки", "Direct link" : "Директен линк", @@ -133,8 +141,10 @@ "This application enables users to share files within Nextcloud. If enabled, the admin can choose which groups can share files. The applicable users can then share files and folders with other users and groups within Nextcloud. In addition, if the admin enables the share link feature, an external link can be used to share files with other users outside of Nextcloud. Admins can also enforce passwords, expirations dates, and enable server to server sharing via share links, as well as sharing from mobile devices.\nTurning the feature off removes shared files and folders on the server for all share recipients, and also on the sync clients and mobile apps. More information is available in the Nextcloud Documentation." : "Оваа апликација им овозможува на корисниците да споделуваат датотеки во рамките на Nextcloud. Доколку е овозможено, администраторот може да избере кои групи можат да споделуваат датотеки. Применливите корисници потоа можат да споделуваат датотеки и папки со други корисници и групи во рамките на Nextcloud. Покрај тоа, ако администраторот ја овозможи функцијата за далечно споделување, може да се користи надворешна врска за споделување датотеки со други корисници надвор од Nextcloud. Администраторот исто така може да овозможи поставување на лозинки, датуми на истекувања и да овозможи споделување од сервер на сервер преку линкови за споделување, како и споделување од мобилни уреди.\nИсклучувањето на функцијата ги отстранува споделените датотеки и папките на серверот за сите приматели на споделување, а исто така и на клиентите за синхронизација и апликациите за мобилни. Повеќе информации се достапни во Документацијата на Nextcloud.", "Sharing" : "Споделување", "Accept user and group shares by default" : "Стандардно прифаќај споделувања од корисници и групи", + "Error while toggling options" : "Грешка при префрлање опции", "Set default folder for accepted shares" : "Постави стандардна папка за прифатените споделувања", "Reset" : "Ресетирање", + "Reset folder to system default" : "Ресетирајте ја папката на стандардниот систем", "Choose a default folder for accepted shares" : "Избери стандардна папка за прифатените споделувања", "Invalid path selected" : "Избрана невалидна патека", "Unknown error" : "Непозната грешка", @@ -142,9 +152,11 @@ "Read only" : "Само читај", "Allow upload and editing" : "Дозволи прикачување и уредување", "File drop (upload only)" : "Испуши датотека (само за прикачување)", + "Custom permissions" : "Прилагодени дозволи", "Read" : "Читај", "Upload" : "Прикачи", "Edit" : "Уреди", + "Bundled permissions" : "Пакет дозволи", "Allow creating" : "Дозволи креирање", "Allow deleting" : "Дозволи бришење", "Allow resharing" : "Дозволи повторно споделување", @@ -161,14 +173,17 @@ "Shared with the group {user} by {owner}" : "Споделено со група на {user} од {owner}", "Shared with the conversation {user} by {owner}" : "Споделено со разговор на {user} од {owner}", "Shared with {user} by {owner}" : "Споделено со {user} од {owner}", + "Allow download" : "Дозволи преземање", "Added by {initiator}" : "Додадено од {initiator}", "Via “{folder}”" : "Преку “{folder}”", "Internal link" : "Внатрешен линк", + "Copy internal link to clipboard" : "Копирај внатрешен линк во клипборд", "Link copied" : "Линкот е копиран", "Cannot copy, please copy the link manually" : "Неможе да се копира, копирајте го линкот рачно", "Copy to clipboard" : "Копирај во клипборд", "Only works for users with access to this folder" : "Функционира само за корисници со пристап до оваа папка", "Only works for users with access to this file" : "Функционира само за корисници со пристап до оваа датотека", + "Copy public link to clipboard" : "Копирај јавен линк во клипборд", "Please enter the following required information before creating the share" : "Внесете ги следниве потребни податоци пред да го креирате споделувањето", "Password protection (enforced)" : "Заштитено со лозинка (enforced)", "Password protection" : "Заштитено со лозинка", @@ -179,6 +194,8 @@ "Share label" : "Ознака на споделувањето", "Hide download" : "Сокриј преземање", "Password protect" : "Заштити со лозинка", + "Password expires {passwordExpirationTime}" : "Лозинката истекува на {passwordExpirationTime}", + "Password expired" : "Лозинката е истечена", "Video verification" : "Верификација со видео", "Enter a note for the share recipient" : "Внесете белешка до примачот на споделуваето", "Add another link" : "Додади линк", @@ -222,6 +239,7 @@ "Name" : "Име", "Share time" : "Време на споделување", "Expiration date" : "Рок на траење", + "Sorry, this link does not seem to work anymore." : "Извенете, но овој линк повеќе не функционира.", "Reasons might be:" : "Причината може да е:", "the item was removed" : "предметот беше отстранет", "the link expired" : "рокот на линкот е истечен", diff --git a/apps/files_sharing/l10n/nb.js b/apps/files_sharing/l10n/nb.js index 04ff15a7b9d..217b5a57ca9 100644 --- a/apps/files_sharing/l10n/nb.js +++ b/apps/files_sharing/l10n/nb.js @@ -126,6 +126,7 @@ OC.L10N.register( "File sharing" : "Fildeling", "Share will expire tomorrow" : "Deling utløper i morgen", "One or more of your shares will expire tomorrow" : "En eller flere av delingene dine utløper i morgen", + "Your share of {node} will expire tomorrow" : "Din deling av {node} vil løpe ut i morgen", "You received {share} as a share by {user}" : "Du mottok {share} som en deling fra {user}", "You received {share} to group {group} as a share by {user}" : "Du mottok {share} til gruppen {group} som en deling fra {user}", "Accept" : "Aksepter", @@ -154,6 +155,9 @@ OC.L10N.register( "remote" : "ekstern", "remote group" : "ekstern gruppe", "guest" : "gjest", + "Allow download" : "Tillat nedlasting", + "Added by {initiator}" : "Lagt til av {initiator}", + "Via “{folder}”" : "Via “{folder}”", "Internal link" : "Intern lenke", "Link copied" : "Lenke kopiert", "Cannot copy, please copy the link manually" : "Kan ikke kopiere, kopier lenken manuelt", @@ -170,6 +174,8 @@ OC.L10N.register( "Enter a note for the share recipient" : "Skriv inn en beskjed til mottaker av deling", "Add another link" : "Legg til en lenke til", "Create a new share link" : "Opprett ny delingslenke", + "{shareWith} by {initiator}" : "{shareWith} av {initiator}", + "Shared via link by {initiator}" : "Delt via lenke av {initiator}", "Share link ({label})" : "Del lenke ({label})", "Share link" : "Share link", "No recommendations. Start typing." : "Ingen forslag. Start skriving.", @@ -184,6 +190,7 @@ OC.L10N.register( "No other users with access found" : "Ingen andre brukere med tilgang funnet", "Toggle list of others with access to this directory" : "Endre liste over andre brukere med tilgang til denne mappen", "Toggle list of others with access to this file" : "Endre liste over andre brukere med tilgang til denne filen", + "Expires {relativetime}" : "Utløper {relativetime}", "this share just expired." : "denne delingen utløp akkurat.", "Shared with you by {owner}" : "Delt med deg av {owner}", "Link to a file" : "Lenke til en fil", diff --git a/apps/files_sharing/l10n/nb.json b/apps/files_sharing/l10n/nb.json index 87bf44826b4..57fb7b7fa0c 100644 --- a/apps/files_sharing/l10n/nb.json +++ b/apps/files_sharing/l10n/nb.json @@ -124,6 +124,7 @@ "File sharing" : "Fildeling", "Share will expire tomorrow" : "Deling utløper i morgen", "One or more of your shares will expire tomorrow" : "En eller flere av delingene dine utløper i morgen", + "Your share of {node} will expire tomorrow" : "Din deling av {node} vil løpe ut i morgen", "You received {share} as a share by {user}" : "Du mottok {share} som en deling fra {user}", "You received {share} to group {group} as a share by {user}" : "Du mottok {share} til gruppen {group} som en deling fra {user}", "Accept" : "Aksepter", @@ -152,6 +153,9 @@ "remote" : "ekstern", "remote group" : "ekstern gruppe", "guest" : "gjest", + "Allow download" : "Tillat nedlasting", + "Added by {initiator}" : "Lagt til av {initiator}", + "Via “{folder}”" : "Via “{folder}”", "Internal link" : "Intern lenke", "Link copied" : "Lenke kopiert", "Cannot copy, please copy the link manually" : "Kan ikke kopiere, kopier lenken manuelt", @@ -168,6 +172,8 @@ "Enter a note for the share recipient" : "Skriv inn en beskjed til mottaker av deling", "Add another link" : "Legg til en lenke til", "Create a new share link" : "Opprett ny delingslenke", + "{shareWith} by {initiator}" : "{shareWith} av {initiator}", + "Shared via link by {initiator}" : "Delt via lenke av {initiator}", "Share link ({label})" : "Del lenke ({label})", "Share link" : "Share link", "No recommendations. Start typing." : "Ingen forslag. Start skriving.", @@ -182,6 +188,7 @@ "No other users with access found" : "Ingen andre brukere med tilgang funnet", "Toggle list of others with access to this directory" : "Endre liste over andre brukere med tilgang til denne mappen", "Toggle list of others with access to this file" : "Endre liste over andre brukere med tilgang til denne filen", + "Expires {relativetime}" : "Utløper {relativetime}", "this share just expired." : "denne delingen utløp akkurat.", "Shared with you by {owner}" : "Delt med deg av {owner}", "Link to a file" : "Lenke til en fil", diff --git a/apps/files_sharing/l10n/tr.js b/apps/files_sharing/l10n/tr.js index e2e737f2537..04de2198bbc 100644 --- a/apps/files_sharing/l10n/tr.js +++ b/apps/files_sharing/l10n/tr.js @@ -49,24 +49,24 @@ OC.L10N.register( "Removed share for group {group}" : "{group} grubunun paylaşımı kaldırıldı", "{actor} shared with group {group}" : "{actor} {group} grubuyla paylaştı", "{actor} removed share for group {group}" : "{actor} {group} grubunun paylaşımını kaldırdı", - "Share for group {group} expired" : "{group} grubuyla paylaşım süresi geçmiş", + "Share for group {group} expired" : "{group} grubuyla paylaşımın geçerlilik süresi dolmuş", "You shared {file} with group {group}" : "{file} dosyasını {group} grubuyla paylaştınız", "You removed group {group} from {file}" : "{file} dosyasının {group} grubuyla paylaşımını kaldırdınız", "{actor} shared {file} with group {group}" : "{actor} {file} dosyasını {group} grubuyla paylaştı", "{actor} removed group {group} from {file}" : "{actor} {file} dosyasının {group} grubuyla paylaşımını kaldırdı", - "Share for file {file} with group {group} expired" : "{file} dosyasının {group} grubuyla paylaşım süresi geçmiş", + "Share for file {file} with group {group} expired" : "{file} dosyasının {group} grubuyla paylaşımının geçerlilik süresi dolmuş", "Shared as public link" : "Herkese açık bağlantı olarak paylaşıldı", "Removed public link" : "Herkese açık bağlantı kaldırıldı", - "Public link expired" : "Herkese açık bağlantının süresi dolmuş", + "Public link expired" : "Herkese açık bağlantının geçerlilik süresi dolmuş", "{actor} shared as public link" : "{actor} herkese açık bağlantı olarak paylaştı", "{actor} removed public link" : "{actor} herkese açık paylaşım bağlantısını kaldırdı", - "Public link of {actor} expired" : "{actor} tarafından paylaşılan herkese açık bağlantının süresi dolmuş", + "Public link of {actor} expired" : "{actor} tarafından paylaşılan herkese açık bağlantının geçerlilik süresi dolmuş", "You shared {file} as public link" : "{file} dosyasını herkese açık bağlantı olarak paylaştınız", "You removed public link for {file}" : "{file} dosyasının herkese açık paylaşım bağlantısını kaldırdınız", - "Public link expired for {file}" : "{file} için herkese açık bağlantının süresi dolmuş", + "Public link expired for {file}" : "{file} için herkese açık bağlantının geçerlilik süresi dolmuş", "{actor} shared {file} as public link" : "{actor} {file} dosyasını herkese açık bağlantı olarak paylaştı", "{actor} removed public link for {file}" : "{actor} {file} dosyasının herkese açık paylaşım bağlantısını kaldırdı", - "Public link of {actor} for {file} expired" : "{actor} tarafından paylaşılan {file} dosyası bağlantısının süresi dolmuş", + "Public link of {actor} for {file} expired" : "{actor} tarafından paylaşılan {file} dosyası bağlantısının geçerlilik süresi dolmuş", "{user} accepted the remote share" : "{user} uzak paylaşımı kabul etti", "{user} declined the remote share" : "{user} uzak paylaşımı reddetti", "You received a new remote share {file} from {user}" : "{user} kullanıcısından yeni bir uzak {file} dosya paylaşımı aldınız", @@ -81,8 +81,8 @@ OC.L10N.register( "{actor} removed share for {user}" : "{actor} {user} kullanıcısının paylaşımını kaldırdı", "Shared by {actor}" : "{actor} tarafından paylaşıldı", "{actor} removed share" : "{actor} paylaşımı kaldırdı", - "Share for {user} expired" : "{user} kullanıcısı ile paylaşım süresi geçmiş", - "Share expired" : "Paylaşım süresi geçmiş", + "Share for {user} expired" : "{user} kullanıcısı ile paylaşımın geçerlilik süresi dolmuş", + "Share expired" : "Paylaşımın geçerlilik süresi dolmuş", "You shared {file} with {user}" : "{file} dosyasını {user} kullanıcısıyla paylaştınız", "You removed {user} from {file}" : "{file} dosyasının {user} kullanıcısıyla paylaşımını kaldırdınız", "You removed yourself from {file}" : "Kendinizi {file} dosyasından kaldırdınız", @@ -91,8 +91,8 @@ OC.L10N.register( "{actor} removed {user} from {file}" : "{actor} {file} dosyasının {user} kullanıcısıyla paylaşımını kaldırdı", "{actor} shared {file} with you" : "{actor} {file} dosyasını sizinle paylaştı", "{actor} removed you from the share named {file}" : "{actor} {file} dosyasının sizinle paylaşımını kaldırdı", - "Share for file {file} with {user} expired" : "{file} dosyasının {user} kullanıcısıyla paylaşım süresi geçmiş", - "Share for file {file} expired" : "{file} dosyasının paylaşım süresi geçmiş", + "Share for file {file} with {user} expired" : "{file} dosyasının {user} kullanıcısıyla paylaşımının geçerlilik süresi dolmuş", + "Share for file {file} expired" : "{file} dosyasının paylaşımının geçerlilik süresi dolmuş", "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "E-posta ya da herkese açık bağlantı ile paylaşılan bir dosya ya da klasör <strong>indirildi</strong>", "A file or folder was shared from <strong>another server</strong>" : "<strong>Başka bir sunucudan</strong> bir dosya ya da klasör paylaşıldı", "Files" : "Dosyalar", @@ -133,9 +133,9 @@ OC.L10N.register( "Add to your %s" : "%s uygulamanıza ekleyin", "Share API is disabled" : "Paylaşım API arayüzü devre dışı", "File sharing" : "Dosya paylaşımı", - "Share will expire tomorrow" : "Paylaşımın süresi yarın dolacak", - "One or more of your shares will expire tomorrow" : "Bir ya da daha çok paylaşımınızın süresi yarın dolacak", - "Your share of {node} will expire tomorrow" : "{node} paylaşımınızın süresi yarın dolacak", + "Share will expire tomorrow" : "Paylaşımın geçerlilik süresi yarın dolacak", + "One or more of your shares will expire tomorrow" : "Bir ya da daha çok paylaşımınızın geçerlilik süresi yarın dolacak", + "Your share of {node} will expire tomorrow" : "{node} paylaşımınızın geçerlilik süresi yarın dolacak", "You received {share} as a share by {user}" : "{user} kullanıcısından {share} paylaşımını aldınız", "You received {share} to group {group} as a share by {user}" : "{user} kullanıcısından {group} grubu için {share} paylaşımını aldınız", "Accept" : "Kabul et", @@ -196,7 +196,7 @@ OC.L10N.register( "Share label" : "Etiketi paylaş", "Hide download" : "İndirme gizlensin", "Password protect" : "Parola koruması", - "Password expires {passwordExpirationTime}" : "Parola geçerlilik sonu {passwordExpirationTime}", + "Password expires {passwordExpirationTime}" : "Parolanın geçerlilik süresi sonu {passwordExpirationTime}", "Password expired" : "Parolanın geçerlilik süresi dolmuş", "Video verification" : "Görüntü doğrulaması", "Enter a note for the share recipient" : "Paylaşım alıcısı için bir not yazın", @@ -222,8 +222,8 @@ OC.L10N.register( "Toggle list of others with access to this file" : "Bu dosyaya erişim izni olan diğer kişiler listesini aç/kapat", "Unable to fetch inherited shares" : "Devir alınan paylaşımlar alınamadı", "Unable to load the shares list" : "Paylaşımlar listesi yüklenemedi", - "Expires {relativetime}" : "Kullanma süresi sonu {relativetime}", - "this share just expired." : "bu paylaşımın kullanma süresi doldu.", + "Expires {relativetime}" : "Geçerlilik süresi sonu {relativetime}", + "this share just expired." : "bu paylaşımın geçerlilik süresi dolmuş.", "Shared with you by {owner}" : "{owner} tarafından sizinle paylaşılmış", "Link to a file" : "Bir dosya ile bağla", "Error creating the share: {errorMessage}" : "Paylaşım oluşturulurken sorun çıktı: {errorMessage}", @@ -244,7 +244,7 @@ OC.L10N.register( "Sorry, this link does not seem to work anymore." : "Ne yazık ki, bu bağlantı artık çalışmıyor gibi görünüyor.", "Reasons might be:" : "Nedenleri şunlar olabilir:", "the item was removed" : "öge silinmiş", - "the link expired" : "bağlantı süresi dolmuş", + "the link expired" : "bağlantının geçerlilik süresi dolmuş", "sharing is disabled" : "paylaşım devre dışı bırakılmış", "For more info, please ask the person who sent this link." : "Ayrıntılı bilgi almak için bu bağlantıyı aldığınız kişi ile görüşün.", "Share note" : "Notu paylaş", diff --git a/apps/files_sharing/l10n/tr.json b/apps/files_sharing/l10n/tr.json index 5b74600bcef..2bd2ae7b4f3 100644 --- a/apps/files_sharing/l10n/tr.json +++ b/apps/files_sharing/l10n/tr.json @@ -47,24 +47,24 @@ "Removed share for group {group}" : "{group} grubunun paylaşımı kaldırıldı", "{actor} shared with group {group}" : "{actor} {group} grubuyla paylaştı", "{actor} removed share for group {group}" : "{actor} {group} grubunun paylaşımını kaldırdı", - "Share for group {group} expired" : "{group} grubuyla paylaşım süresi geçmiş", + "Share for group {group} expired" : "{group} grubuyla paylaşımın geçerlilik süresi dolmuş", "You shared {file} with group {group}" : "{file} dosyasını {group} grubuyla paylaştınız", "You removed group {group} from {file}" : "{file} dosyasının {group} grubuyla paylaşımını kaldırdınız", "{actor} shared {file} with group {group}" : "{actor} {file} dosyasını {group} grubuyla paylaştı", "{actor} removed group {group} from {file}" : "{actor} {file} dosyasının {group} grubuyla paylaşımını kaldırdı", - "Share for file {file} with group {group} expired" : "{file} dosyasının {group} grubuyla paylaşım süresi geçmiş", + "Share for file {file} with group {group} expired" : "{file} dosyasının {group} grubuyla paylaşımının geçerlilik süresi dolmuş", "Shared as public link" : "Herkese açık bağlantı olarak paylaşıldı", "Removed public link" : "Herkese açık bağlantı kaldırıldı", - "Public link expired" : "Herkese açık bağlantının süresi dolmuş", + "Public link expired" : "Herkese açık bağlantının geçerlilik süresi dolmuş", "{actor} shared as public link" : "{actor} herkese açık bağlantı olarak paylaştı", "{actor} removed public link" : "{actor} herkese açık paylaşım bağlantısını kaldırdı", - "Public link of {actor} expired" : "{actor} tarafından paylaşılan herkese açık bağlantının süresi dolmuş", + "Public link of {actor} expired" : "{actor} tarafından paylaşılan herkese açık bağlantının geçerlilik süresi dolmuş", "You shared {file} as public link" : "{file} dosyasını herkese açık bağlantı olarak paylaştınız", "You removed public link for {file}" : "{file} dosyasının herkese açık paylaşım bağlantısını kaldırdınız", - "Public link expired for {file}" : "{file} için herkese açık bağlantının süresi dolmuş", + "Public link expired for {file}" : "{file} için herkese açık bağlantının geçerlilik süresi dolmuş", "{actor} shared {file} as public link" : "{actor} {file} dosyasını herkese açık bağlantı olarak paylaştı", "{actor} removed public link for {file}" : "{actor} {file} dosyasının herkese açık paylaşım bağlantısını kaldırdı", - "Public link of {actor} for {file} expired" : "{actor} tarafından paylaşılan {file} dosyası bağlantısının süresi dolmuş", + "Public link of {actor} for {file} expired" : "{actor} tarafından paylaşılan {file} dosyası bağlantısının geçerlilik süresi dolmuş", "{user} accepted the remote share" : "{user} uzak paylaşımı kabul etti", "{user} declined the remote share" : "{user} uzak paylaşımı reddetti", "You received a new remote share {file} from {user}" : "{user} kullanıcısından yeni bir uzak {file} dosya paylaşımı aldınız", @@ -79,8 +79,8 @@ "{actor} removed share for {user}" : "{actor} {user} kullanıcısının paylaşımını kaldırdı", "Shared by {actor}" : "{actor} tarafından paylaşıldı", "{actor} removed share" : "{actor} paylaşımı kaldırdı", - "Share for {user} expired" : "{user} kullanıcısı ile paylaşım süresi geçmiş", - "Share expired" : "Paylaşım süresi geçmiş", + "Share for {user} expired" : "{user} kullanıcısı ile paylaşımın geçerlilik süresi dolmuş", + "Share expired" : "Paylaşımın geçerlilik süresi dolmuş", "You shared {file} with {user}" : "{file} dosyasını {user} kullanıcısıyla paylaştınız", "You removed {user} from {file}" : "{file} dosyasının {user} kullanıcısıyla paylaşımını kaldırdınız", "You removed yourself from {file}" : "Kendinizi {file} dosyasından kaldırdınız", @@ -89,8 +89,8 @@ "{actor} removed {user} from {file}" : "{actor} {file} dosyasının {user} kullanıcısıyla paylaşımını kaldırdı", "{actor} shared {file} with you" : "{actor} {file} dosyasını sizinle paylaştı", "{actor} removed you from the share named {file}" : "{actor} {file} dosyasının sizinle paylaşımını kaldırdı", - "Share for file {file} with {user} expired" : "{file} dosyasının {user} kullanıcısıyla paylaşım süresi geçmiş", - "Share for file {file} expired" : "{file} dosyasının paylaşım süresi geçmiş", + "Share for file {file} with {user} expired" : "{file} dosyasının {user} kullanıcısıyla paylaşımının geçerlilik süresi dolmuş", + "Share for file {file} expired" : "{file} dosyasının paylaşımının geçerlilik süresi dolmuş", "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "E-posta ya da herkese açık bağlantı ile paylaşılan bir dosya ya da klasör <strong>indirildi</strong>", "A file or folder was shared from <strong>another server</strong>" : "<strong>Başka bir sunucudan</strong> bir dosya ya da klasör paylaşıldı", "Files" : "Dosyalar", @@ -131,9 +131,9 @@ "Add to your %s" : "%s uygulamanıza ekleyin", "Share API is disabled" : "Paylaşım API arayüzü devre dışı", "File sharing" : "Dosya paylaşımı", - "Share will expire tomorrow" : "Paylaşımın süresi yarın dolacak", - "One or more of your shares will expire tomorrow" : "Bir ya da daha çok paylaşımınızın süresi yarın dolacak", - "Your share of {node} will expire tomorrow" : "{node} paylaşımınızın süresi yarın dolacak", + "Share will expire tomorrow" : "Paylaşımın geçerlilik süresi yarın dolacak", + "One or more of your shares will expire tomorrow" : "Bir ya da daha çok paylaşımınızın geçerlilik süresi yarın dolacak", + "Your share of {node} will expire tomorrow" : "{node} paylaşımınızın geçerlilik süresi yarın dolacak", "You received {share} as a share by {user}" : "{user} kullanıcısından {share} paylaşımını aldınız", "You received {share} to group {group} as a share by {user}" : "{user} kullanıcısından {group} grubu için {share} paylaşımını aldınız", "Accept" : "Kabul et", @@ -194,7 +194,7 @@ "Share label" : "Etiketi paylaş", "Hide download" : "İndirme gizlensin", "Password protect" : "Parola koruması", - "Password expires {passwordExpirationTime}" : "Parola geçerlilik sonu {passwordExpirationTime}", + "Password expires {passwordExpirationTime}" : "Parolanın geçerlilik süresi sonu {passwordExpirationTime}", "Password expired" : "Parolanın geçerlilik süresi dolmuş", "Video verification" : "Görüntü doğrulaması", "Enter a note for the share recipient" : "Paylaşım alıcısı için bir not yazın", @@ -220,8 +220,8 @@ "Toggle list of others with access to this file" : "Bu dosyaya erişim izni olan diğer kişiler listesini aç/kapat", "Unable to fetch inherited shares" : "Devir alınan paylaşımlar alınamadı", "Unable to load the shares list" : "Paylaşımlar listesi yüklenemedi", - "Expires {relativetime}" : "Kullanma süresi sonu {relativetime}", - "this share just expired." : "bu paylaşımın kullanma süresi doldu.", + "Expires {relativetime}" : "Geçerlilik süresi sonu {relativetime}", + "this share just expired." : "bu paylaşımın geçerlilik süresi dolmuş.", "Shared with you by {owner}" : "{owner} tarafından sizinle paylaşılmış", "Link to a file" : "Bir dosya ile bağla", "Error creating the share: {errorMessage}" : "Paylaşım oluşturulurken sorun çıktı: {errorMessage}", @@ -242,7 +242,7 @@ "Sorry, this link does not seem to work anymore." : "Ne yazık ki, bu bağlantı artık çalışmıyor gibi görünüyor.", "Reasons might be:" : "Nedenleri şunlar olabilir:", "the item was removed" : "öge silinmiş", - "the link expired" : "bağlantı süresi dolmuş", + "the link expired" : "bağlantının geçerlilik süresi dolmuş", "sharing is disabled" : "paylaşım devre dışı bırakılmış", "For more info, please ask the person who sent this link." : "Ayrıntılı bilgi almak için bu bağlantıyı aldığınız kişi ile görüşün.", "Share note" : "Notu paylaş", diff --git a/apps/files_sharing/lib/Cache.php b/apps/files_sharing/lib/Cache.php index 9f11431008f..707b64b79d7 100644 --- a/apps/files_sharing/lib/Cache.php +++ b/apps/files_sharing/lib/Cache.php @@ -170,7 +170,7 @@ class Cache extends CacheJail { private function getOwnerDisplayName() { if (!$this->ownerDisplayName) { $uid = $this->storage->getOwner(''); - $this->ownerDisplayName = $this->displayNameCache->getDisplayName($uid); + $this->ownerDisplayName = $this->displayNameCache->getDisplayName($uid) ?? $uid; } return $this->ownerDisplayName; } diff --git a/apps/files_sharing/list.php b/apps/files_sharing/list.php index a4667ad17ad..f43aed21427 100644 --- a/apps/files_sharing/list.php +++ b/apps/files_sharing/list.php @@ -23,18 +23,12 @@ * along with this program. If not, see <http://www.gnu.org/licenses/> * */ -use OCA\Files\Event\LoadAdditionalScriptsEvent; -use OCA\Files\Event\LoadSidebar; -use OCA\Viewer\Event\LoadViewer; -use OCP\Collaboration\Resources\LoadAdditionalScriptsEvent as ResourcesLoadAdditionalScriptsEvent; -use OCP\EventDispatcher\IEventDispatcher; use OCP\IConfig; use OCP\IUserSession; use OCP\Server; $config = Server::get(IConfig::class); $userSession = Server::get(IUserSession::class); -$eventDispatcher = Server::get(IEventDispatcher::class); $showgridview = $config->getUserValue($userSession->getUser()->getUID(), 'files', 'show_grid', false); @@ -43,14 +37,4 @@ $tmpl = new OCP\Template('files_sharing', 'list', ''); // gridview not available for ie $tmpl->assign('showgridview', $showgridview); -// fire script events -$eventDispatcher->dispatchTyped(new ResourcesLoadAdditionalScriptsEvent()); -$eventDispatcher->dispatchTyped(new LoadAdditionalScriptsEvent()); -$eventDispatcher->dispatchTyped(new LoadSidebar()); - -// Load Viewer scripts -if (class_exists(LoadViewer::class)) { - $eventDispatcher->dispatchTyped(new LoadViewer()); -} - $tmpl->printPage(); diff --git a/apps/files_trashbin/l10n/mk.js b/apps/files_trashbin/l10n/mk.js index 6a942606754..daa44da00c4 100644 --- a/apps/files_trashbin/l10n/mk.js +++ b/apps/files_trashbin/l10n/mk.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Deleted files" : "Избришани датотеки", "restored" : "повратени", + "Deleted files and folders in the trash bin (may expire during export if you are low on storage space)" : "Избришани датотеки и папки во корпата за отпадоци (може да истечат за време на извозот ако немате доволно простор за складирање)", "This application enables users to restore files that were deleted from the system." : "Оваа апликација им овозможува на корисниците да ги вратат датотеките што се избришани од системот.", "This application enables users to restore files that were deleted from the system. It displays a list of deleted files in the web interface, and has options to restore those deleted files back to the users file directories or remove them permanently from the system. Restoring a file also restores related file versions, if the versions application is enabled. When a file is deleted from a share, it can be restored in the same manner, though it is no longer shared. By default, these files remain in the trash bin for 30 days.\nTo prevent a user from running out of disk space, the Deleted files app will not utilize more than 50% of the currently available free quota for deleted files. If the deleted files exceed this limit, the app deletes the oldest files until it gets below this limit. More information is available in the Deleted Files documentation." : "Оваа апликација им овозможува на корисниците да ги вратат датотеките што се избришани од системот. Прикажува листа на избришани датотеки во веб-интерфејсот и има можност да ги вратите тие избришани датотеки назад до директориумот од каде се избришани или да ги отстраните трајно од системот. Враќањето на датотека ги враќа и нејзините верзии, доколку е овозможена апликацијата за верзии. Кога избришаната датотеката била споделена, таа може да се врати на ист начин, но истата повеќе не е споделена. Стандардно, овие датотеки остануваат во корпата за отпадоци 30 дена.\nСо цел да се спречи да не се искористи просторот за складирање на корисникот, апликацијата Избришани датотеки нема да користи повеќе од 50% од тековно достапната квота за избришани датотеки. Ако избришаните датотеки ја надминат оваа граница, апликацијата ги брише најстарите датотеки сè додека не се дојде под ова ограничување. Повеќе информации се достапни во документацијата за избришани датотеки.", "Restore" : "Врати", diff --git a/apps/files_trashbin/l10n/mk.json b/apps/files_trashbin/l10n/mk.json index 545dde78b93..8187a5bdf06 100644 --- a/apps/files_trashbin/l10n/mk.json +++ b/apps/files_trashbin/l10n/mk.json @@ -1,6 +1,7 @@ { "translations": { "Deleted files" : "Избришани датотеки", "restored" : "повратени", + "Deleted files and folders in the trash bin (may expire during export if you are low on storage space)" : "Избришани датотеки и папки во корпата за отпадоци (може да истечат за време на извозот ако немате доволно простор за складирање)", "This application enables users to restore files that were deleted from the system." : "Оваа апликација им овозможува на корисниците да ги вратат датотеките што се избришани од системот.", "This application enables users to restore files that were deleted from the system. It displays a list of deleted files in the web interface, and has options to restore those deleted files back to the users file directories or remove them permanently from the system. Restoring a file also restores related file versions, if the versions application is enabled. When a file is deleted from a share, it can be restored in the same manner, though it is no longer shared. By default, these files remain in the trash bin for 30 days.\nTo prevent a user from running out of disk space, the Deleted files app will not utilize more than 50% of the currently available free quota for deleted files. If the deleted files exceed this limit, the app deletes the oldest files until it gets below this limit. More information is available in the Deleted Files documentation." : "Оваа апликација им овозможува на корисниците да ги вратат датотеките што се избришани од системот. Прикажува листа на избришани датотеки во веб-интерфејсот и има можност да ги вратите тие избришани датотеки назад до директориумот од каде се избришани или да ги отстраните трајно од системот. Враќањето на датотека ги враќа и нејзините верзии, доколку е овозможена апликацијата за верзии. Кога избришаната датотеката била споделена, таа може да се врати на ист начин, но истата повеќе не е споделена. Стандардно, овие датотеки остануваат во корпата за отпадоци 30 дена.\nСо цел да се спречи да не се искористи просторот за складирање на корисникот, апликацијата Избришани датотеки нема да користи повеќе од 50% од тековно достапната квота за избришани датотеки. Ако избришаните датотеки ја надминат оваа граница, апликацијата ги брише најстарите датотеки сè додека не се дојде под ова ограничување. Повеќе информации се достапни во документацијата за избришани датотеки.", "Restore" : "Врати", diff --git a/apps/provisioning_api/l10n/pt_PT.js b/apps/provisioning_api/l10n/pt_PT.js new file mode 100644 index 00000000000..514d4485053 --- /dev/null +++ b/apps/provisioning_api/l10n/pt_PT.js @@ -0,0 +1,18 @@ +OC.L10N.register( + "provisioning_api", + { + "Logged in user must be an administrator or have authorization to edit this setting." : "O usuário conectado deve ser um administrador ou ter autorização para editar esta configuração. ", + "Email confirmation" : "Verificação de correio eletrónico.", + "To enable the email address %s please click the button below." : "Para habilitar o endereço de correio eletrónico %s por favor pressione o botão abaixo.", + "Confirm" : "Confirmar", + "Email was already removed from account and cannot be confirmed anymore." : "O endereço já foi removido da conta e não pode mais ser confirmado.", + "Could not verify mail because the token is expired." : "Não foi possível verificar o endereço porque o marcador expirou.", + "Could not verify mail because the token is invalid." : "Não foi possível verificar o endereço porque o marcador é inválido.", + "An unexpected error occurred. Please contact your admin." : "Ocorreu um erro inesperado. Contacte o seu administrador de sistemas.", + "Email confirmation successful" : "Endereço confirmado com sucesso", + "Provisioning API" : "API de aprovisionamento", + "This application enables a set of APIs that external systems can use to manage users, groups and apps." : "Esta aplicação ativa um conjunto de API que sistemas externos podem usar para gerir utilizadores, grupos e aplicações.", + "This application enables a set of APIs that external systems can use to create, edit, delete and query user\n\t\tattributes, query, set and remove groups, set quota and query total storage used in Nextcloud. Group admin users\n\t\tcan also query Nextcloud and perform the same functions as an admin for groups they manage. The API also enables\n\t\tan admin to query for active Nextcloud applications, application info, and to enable or disable an app remotely.\n\t\tOnce the app is enabled, HTTP requests can be used via a Basic Auth header to perform any of the functions\n\t\tlisted above. More information is available in the Provisioning API documentation, including example calls\n\t\tand server responses." : "Esta aplicação ativa um conjunto de API que sistemas externos podem usar para gerir criar, editar, apagar ou pesquisar atributos de utilizadores,\n\t\tpesquisar, definir e remover grupos, definir cotas e consultar o armazenamento total usado em Nextcloud. Utilizadores administradores de grupos\n\t\ttambém podem pesquisar no Nextcloud e executar as mesmas funções que um administrador para os grupos que gerem. A API também permite\n\t\tque um administrador possa consultar aplicações ativas no Nextcloud, informações das mesmas e para ativar ou desativar uma aplicação remotamente.\n\t\tDepois de ativar uma aplicação, podem-se usar pedidos HTTP com um cabeçalho Basic Auth para executar qualquer uma das funções\n\t\tacima indicadas. Mais informações estão disponíveis na documentação da API de aprovisionamento, incluindo pedidos de exemplo\n\t\te respostas do servidor.", + "An unexpected error occurred. Please consult your sysadmin." : "Ocorreu um erro inesperado. Contacte o seu administrador de sistemas." +}, +"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/provisioning_api/l10n/pt_PT.json b/apps/provisioning_api/l10n/pt_PT.json new file mode 100644 index 00000000000..8b1f793cbc0 --- /dev/null +++ b/apps/provisioning_api/l10n/pt_PT.json @@ -0,0 +1,16 @@ +{ "translations": { + "Logged in user must be an administrator or have authorization to edit this setting." : "O usuário conectado deve ser um administrador ou ter autorização para editar esta configuração. ", + "Email confirmation" : "Verificação de correio eletrónico.", + "To enable the email address %s please click the button below." : "Para habilitar o endereço de correio eletrónico %s por favor pressione o botão abaixo.", + "Confirm" : "Confirmar", + "Email was already removed from account and cannot be confirmed anymore." : "O endereço já foi removido da conta e não pode mais ser confirmado.", + "Could not verify mail because the token is expired." : "Não foi possível verificar o endereço porque o marcador expirou.", + "Could not verify mail because the token is invalid." : "Não foi possível verificar o endereço porque o marcador é inválido.", + "An unexpected error occurred. Please contact your admin." : "Ocorreu um erro inesperado. Contacte o seu administrador de sistemas.", + "Email confirmation successful" : "Endereço confirmado com sucesso", + "Provisioning API" : "API de aprovisionamento", + "This application enables a set of APIs that external systems can use to manage users, groups and apps." : "Esta aplicação ativa um conjunto de API que sistemas externos podem usar para gerir utilizadores, grupos e aplicações.", + "This application enables a set of APIs that external systems can use to create, edit, delete and query user\n\t\tattributes, query, set and remove groups, set quota and query total storage used in Nextcloud. Group admin users\n\t\tcan also query Nextcloud and perform the same functions as an admin for groups they manage. The API also enables\n\t\tan admin to query for active Nextcloud applications, application info, and to enable or disable an app remotely.\n\t\tOnce the app is enabled, HTTP requests can be used via a Basic Auth header to perform any of the functions\n\t\tlisted above. More information is available in the Provisioning API documentation, including example calls\n\t\tand server responses." : "Esta aplicação ativa um conjunto de API que sistemas externos podem usar para gerir criar, editar, apagar ou pesquisar atributos de utilizadores,\n\t\tpesquisar, definir e remover grupos, definir cotas e consultar o armazenamento total usado em Nextcloud. Utilizadores administradores de grupos\n\t\ttambém podem pesquisar no Nextcloud e executar as mesmas funções que um administrador para os grupos que gerem. A API também permite\n\t\tque um administrador possa consultar aplicações ativas no Nextcloud, informações das mesmas e para ativar ou desativar uma aplicação remotamente.\n\t\tDepois de ativar uma aplicação, podem-se usar pedidos HTTP com um cabeçalho Basic Auth para executar qualquer uma das funções\n\t\tacima indicadas. Mais informações estão disponíveis na documentação da API de aprovisionamento, incluindo pedidos de exemplo\n\t\te respostas do servidor.", + "An unexpected error occurred. Please consult your sysadmin." : "Ocorreu um erro inesperado. Contacte o seu administrador de sistemas." +},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" +}
\ No newline at end of file diff --git a/apps/provisioning_api/l10n/tr.js b/apps/provisioning_api/l10n/tr.js index 5153712d52b..b8bcf83bf8d 100644 --- a/apps/provisioning_api/l10n/tr.js +++ b/apps/provisioning_api/l10n/tr.js @@ -6,7 +6,7 @@ OC.L10N.register( "To enable the email address %s please click the button below." : "%s e-posta adresini doğrulamak için aşağıdaki düğmeye tıklayın.", "Confirm" : "Onayla", "Email was already removed from account and cannot be confirmed anymore." : "E-posta hesaptan kaldırılmış olduğundan artık onaylanamaz.", - "Could not verify mail because the token is expired." : "Kodun süresi geçtiğinden e-posta doğrulanamadı.", + "Could not verify mail because the token is expired." : "Kodun geçerlilik süresi dolmuş olduğundan e-posta doğrulanamadı.", "Could not verify mail because the token is invalid." : "Kod geçersiz olduğundan e-posta doğrulanamadı.", "An unexpected error occurred. Please contact your admin." : "Beklenmeyen bir sorun çıktı. Lütfen BT yöneticiniz ile görüşün.", "Email confirmation successful" : "E-posta onaylandı", diff --git a/apps/provisioning_api/l10n/tr.json b/apps/provisioning_api/l10n/tr.json index d586d7d79d3..0b9745064e4 100644 --- a/apps/provisioning_api/l10n/tr.json +++ b/apps/provisioning_api/l10n/tr.json @@ -4,7 +4,7 @@ "To enable the email address %s please click the button below." : "%s e-posta adresini doğrulamak için aşağıdaki düğmeye tıklayın.", "Confirm" : "Onayla", "Email was already removed from account and cannot be confirmed anymore." : "E-posta hesaptan kaldırılmış olduğundan artık onaylanamaz.", - "Could not verify mail because the token is expired." : "Kodun süresi geçtiğinden e-posta doğrulanamadı.", + "Could not verify mail because the token is expired." : "Kodun geçerlilik süresi dolmuş olduğundan e-posta doğrulanamadı.", "Could not verify mail because the token is invalid." : "Kod geçersiz olduğundan e-posta doğrulanamadı.", "An unexpected error occurred. Please contact your admin." : "Beklenmeyen bir sorun çıktı. Lütfen BT yöneticiniz ile görüşün.", "Email confirmation successful" : "E-posta onaylandı", diff --git a/apps/settings/l10n/cs.js b/apps/settings/l10n/cs.js index e536a8b3296..be4f231f84a 100644 --- a/apps/settings/l10n/cs.js +++ b/apps/settings/l10n/cs.js @@ -307,7 +307,7 @@ OC.L10N.register( "Unable to update federation scope of additional {accountProperty}" : "Nedaří se aktualizovat rozsah federování dodatečné {accountProperty}", "Add additional email" : "Přidat další e-mail", "Add" : "Přidat", - "You do not have permissions to see the details of this user" : "Nemáte oprávnění k zobrazení podrobností o tomto uživateli", + "You do not have permissions to see the details of this user" : "Nemáte oprávnění zobrazit si podrobností o tomto uživateli", "Add new password" : "Přidat nové heslo", "Add new email address" : "Přidat novou e-mailovou adresu", "Add user to group" : "Přidat uživatele do skupiny", @@ -372,7 +372,7 @@ OC.L10N.register( "Add group" : "Přidat skupinu", "Active users" : "Aktivní uživatelé", "Admins" : "Správci", - "Disabled users" : "Zakázaní uživatelé", + "Disabled users" : "Znepřístupnění uživatelé", "Default quota:" : "Výchozí kvóta:", "Select default quota" : "Vybrat výchozí kvótu", "Show Languages" : "Zobrazit jazyky", @@ -406,7 +406,7 @@ OC.L10N.register( "This app is not marked as compatible with your Nextcloud version. If you continue you will still be able to install the app. Note that the app might not work as expected." : "Tato aplikace není označena jako kompatibilní s vámi používanou verzí Nexcloud. Pokud budete pokračovat, pořád budete moci aplikaci nainstalovat. Uvědomte si ale, že aplikace nemusí fungovat, jak je očekáváno.", "Never" : "Nikdy", "An error occured during the request. Unable to proceed." : "Během požadavku došlo k chybě. Nelze pokračovat.", - "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Aplikace byla povolena ale je třeba ji aktualizovat. Za 5 sekund budete přesměrování na stránku pro aktualizaci.", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Aplikace byla zapnuta ale je třeba ji ještě aktualizovat. Za 5 sekund budete přesměrování na stránku pro aktualizaci.", "Error: This app cannot be enabled because it makes the server unstable" : "Chyba: tuto aplikaci nelze zapnout, protože způsobuje nestabilitu serveru", "An error occurred during the request. Unable to proceed." : "Během požadavku došlo k chybě. Nelze pokračovat.", "User already exists." : "Uživatel už existuje.", @@ -487,7 +487,7 @@ OC.L10N.register( "Picture provided by original account" : "Obrázek poskytovaný původním účtem", "Please note that it can take up to 24 hours for the avatar to get updated everywhere." : "Mějte na paměti, že může trvat až 24 hodin, než bude avatar aktualizován všude.", "Choose as profile picture" : "Vybrat jako profilový obrázek", - "You are a member of the following groups:" : "Jste členem následujících skupin:", + "You are a member of the following groups:" : "Jste členy následujících skupin:", "You are using <strong>%s</strong>" : "Vaše data zabírají <strong>%s</strong>", "You are using <strong>%1$s</strong> of <strong>%2$s</strong> (<strong>%3$s %%</strong>)" : "Používáte <strong>%1$s</strong> z <strong>%2$s</strong> (<strong>%3$s %%</strong>)", "Change privacy level of phone number" : "Změnit úroveň soukromí telefonního čísla", diff --git a/apps/settings/l10n/cs.json b/apps/settings/l10n/cs.json index 819e319b906..34755cae979 100644 --- a/apps/settings/l10n/cs.json +++ b/apps/settings/l10n/cs.json @@ -305,7 +305,7 @@ "Unable to update federation scope of additional {accountProperty}" : "Nedaří se aktualizovat rozsah federování dodatečné {accountProperty}", "Add additional email" : "Přidat další e-mail", "Add" : "Přidat", - "You do not have permissions to see the details of this user" : "Nemáte oprávnění k zobrazení podrobností o tomto uživateli", + "You do not have permissions to see the details of this user" : "Nemáte oprávnění zobrazit si podrobností o tomto uživateli", "Add new password" : "Přidat nové heslo", "Add new email address" : "Přidat novou e-mailovou adresu", "Add user to group" : "Přidat uživatele do skupiny", @@ -370,7 +370,7 @@ "Add group" : "Přidat skupinu", "Active users" : "Aktivní uživatelé", "Admins" : "Správci", - "Disabled users" : "Zakázaní uživatelé", + "Disabled users" : "Znepřístupnění uživatelé", "Default quota:" : "Výchozí kvóta:", "Select default quota" : "Vybrat výchozí kvótu", "Show Languages" : "Zobrazit jazyky", @@ -404,7 +404,7 @@ "This app is not marked as compatible with your Nextcloud version. If you continue you will still be able to install the app. Note that the app might not work as expected." : "Tato aplikace není označena jako kompatibilní s vámi používanou verzí Nexcloud. Pokud budete pokračovat, pořád budete moci aplikaci nainstalovat. Uvědomte si ale, že aplikace nemusí fungovat, jak je očekáváno.", "Never" : "Nikdy", "An error occured during the request. Unable to proceed." : "Během požadavku došlo k chybě. Nelze pokračovat.", - "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Aplikace byla povolena ale je třeba ji aktualizovat. Za 5 sekund budete přesměrování na stránku pro aktualizaci.", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Aplikace byla zapnuta ale je třeba ji ještě aktualizovat. Za 5 sekund budete přesměrování na stránku pro aktualizaci.", "Error: This app cannot be enabled because it makes the server unstable" : "Chyba: tuto aplikaci nelze zapnout, protože způsobuje nestabilitu serveru", "An error occurred during the request. Unable to proceed." : "Během požadavku došlo k chybě. Nelze pokračovat.", "User already exists." : "Uživatel už existuje.", @@ -485,7 +485,7 @@ "Picture provided by original account" : "Obrázek poskytovaný původním účtem", "Please note that it can take up to 24 hours for the avatar to get updated everywhere." : "Mějte na paměti, že může trvat až 24 hodin, než bude avatar aktualizován všude.", "Choose as profile picture" : "Vybrat jako profilový obrázek", - "You are a member of the following groups:" : "Jste členem následujících skupin:", + "You are a member of the following groups:" : "Jste členy následujících skupin:", "You are using <strong>%s</strong>" : "Vaše data zabírají <strong>%s</strong>", "You are using <strong>%1$s</strong> of <strong>%2$s</strong> (<strong>%3$s %%</strong>)" : "Používáte <strong>%1$s</strong> z <strong>%2$s</strong> (<strong>%3$s %%</strong>)", "Change privacy level of phone number" : "Změnit úroveň soukromí telefonního čísla", diff --git a/apps/settings/l10n/eu.js b/apps/settings/l10n/eu.js index 0565e1006ea..fec710d382c 100644 --- a/apps/settings/l10n/eu.js +++ b/apps/settings/l10n/eu.js @@ -249,10 +249,10 @@ OC.L10N.register( "Enable" : "Gaitu", "Unable to update profile default setting" : "Ezin izan da eguneratu profilaren ezarpen lehenetsia", "Server-side encryption" : "Zerbitzariaren aldeko zifratzea", - "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "Zerbitzari-aldeko enkriptatzeak zerbitzarira igotzen diren fitxategiak enkriptatzea baimentzen du. Honek eraginkortasuna jaitsi dezake, beraz gaitu beharrezkoa bada soilik. ", + "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "Zerbitzari-aldeko enkriptatzeak zerbitzarira kargatzen diren fitxategiak enkriptatzea baimentzen du. Honek eraginkortasuna jaitsi dezake, beraz gaitu beharrezkoa bada soilik. ", "Enable server-side encryption" : "Gaitu zerbitzariaren aldeko zifratzea", "Please read carefully before activating server-side encryption:" : "Irakurri arretaz zerbitzariaren aldeko zifratzea gaitu aurretik mesedez:", - "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Zifratzea gaitu ondoren zerbitzarira igotako fitxategi guztiak zifratu egingo dira . Zifratzea geroago desgaitu daiteke zifratze-modulu aktiboak funtzio hori onartzen badu eta aurrebaldintza guztiak (adibidez, berreskuratze-gako bat ezartzea) betetzen badira.", + "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Zifratzea gaitu ondoren zerbitzarira kargatutako fitxategi guztiak zifratu egingo dira . Zifratzea geroago desgaitu daiteke zifratze-modulu aktiboak funtzio hori onartzen badu eta aurrebaldintza guztiak (adibidez, berreskuratze-gako bat ezartzea) betetzen badira.", "Encryption alone does not guarantee security of the system. Please see documentation for more information about how the encryption app works, and the supported use cases." : "Zifratze hutsak ez du sistemaren segurtasuna bermatzen. Begiratu dokumentazioa zifratze-aplikazioak nola funtzionatzen duen jakiteko eta zein erabiltzaile-kasu onartzen den ezagutzeko.", "Be aware that encryption always increases the file size." : "Kontuan izan zifratzeak beti fitxategiaren tamaina handitzen duela.", "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Zure datuen babeskopiak sortu beharko zenituzke aldizka, eta zifratuta badaude, ziurtatu zifratze-gakoen babeskopia ere egiten dela datuekin batera.", @@ -451,7 +451,7 @@ OC.L10N.register( "Enforce expiration date" : "Betearazi iraungitze-data", "Set default expiration date for shares to other servers" : "Ezarri beste zerbitzari batzuetarako partekatzeen iraungitze data lehenetsia", "Allow users to share via link and emails" : "Baimendu erabiltzaileak esteka eta e-postaren bidez partekatzea", - "Allow public uploads" : "Baimendu igoera publikoak", + "Allow public uploads" : "Baimendu karga publikoak", "Always ask for a password" : "Beti eskatu pasahitza", "Enforce password protection" : "Betearazi pasahitzaren babesa", "Exclude groups from password requirements:" : "Baztertu taldeak pasahitz eskakizunetatik:", @@ -480,7 +480,7 @@ OC.L10N.register( "This community release of Nextcloud is unsupported and instant notifications are unavailable." : "Nextcloud komunitate bertsio honek ez du laguntza-zerbitzurik eta berehalako jakinarazpenak ez daude eskuragarri.", "Profile picture" : "Zure irudia", "Change privacy level of profile picture" : "Aldatu profileko irudiaren pribatutasun maila", - "Upload new" : "Igo berria", + "Upload new" : "Kargatu berria", "Select from Files" : "Aukeratu fitxategien artean", "Remove image" : "Kendu irudia", "png or jpg, max. 20 MB" : "png edo jpg, gehienez 20MB", diff --git a/apps/settings/l10n/eu.json b/apps/settings/l10n/eu.json index 3f195e95b0a..e40afff358c 100644 --- a/apps/settings/l10n/eu.json +++ b/apps/settings/l10n/eu.json @@ -247,10 +247,10 @@ "Enable" : "Gaitu", "Unable to update profile default setting" : "Ezin izan da eguneratu profilaren ezarpen lehenetsia", "Server-side encryption" : "Zerbitzariaren aldeko zifratzea", - "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "Zerbitzari-aldeko enkriptatzeak zerbitzarira igotzen diren fitxategiak enkriptatzea baimentzen du. Honek eraginkortasuna jaitsi dezake, beraz gaitu beharrezkoa bada soilik. ", + "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "Zerbitzari-aldeko enkriptatzeak zerbitzarira kargatzen diren fitxategiak enkriptatzea baimentzen du. Honek eraginkortasuna jaitsi dezake, beraz gaitu beharrezkoa bada soilik. ", "Enable server-side encryption" : "Gaitu zerbitzariaren aldeko zifratzea", "Please read carefully before activating server-side encryption:" : "Irakurri arretaz zerbitzariaren aldeko zifratzea gaitu aurretik mesedez:", - "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Zifratzea gaitu ondoren zerbitzarira igotako fitxategi guztiak zifratu egingo dira . Zifratzea geroago desgaitu daiteke zifratze-modulu aktiboak funtzio hori onartzen badu eta aurrebaldintza guztiak (adibidez, berreskuratze-gako bat ezartzea) betetzen badira.", + "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Zifratzea gaitu ondoren zerbitzarira kargatutako fitxategi guztiak zifratu egingo dira . Zifratzea geroago desgaitu daiteke zifratze-modulu aktiboak funtzio hori onartzen badu eta aurrebaldintza guztiak (adibidez, berreskuratze-gako bat ezartzea) betetzen badira.", "Encryption alone does not guarantee security of the system. Please see documentation for more information about how the encryption app works, and the supported use cases." : "Zifratze hutsak ez du sistemaren segurtasuna bermatzen. Begiratu dokumentazioa zifratze-aplikazioak nola funtzionatzen duen jakiteko eta zein erabiltzaile-kasu onartzen den ezagutzeko.", "Be aware that encryption always increases the file size." : "Kontuan izan zifratzeak beti fitxategiaren tamaina handitzen duela.", "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Zure datuen babeskopiak sortu beharko zenituzke aldizka, eta zifratuta badaude, ziurtatu zifratze-gakoen babeskopia ere egiten dela datuekin batera.", @@ -449,7 +449,7 @@ "Enforce expiration date" : "Betearazi iraungitze-data", "Set default expiration date for shares to other servers" : "Ezarri beste zerbitzari batzuetarako partekatzeen iraungitze data lehenetsia", "Allow users to share via link and emails" : "Baimendu erabiltzaileak esteka eta e-postaren bidez partekatzea", - "Allow public uploads" : "Baimendu igoera publikoak", + "Allow public uploads" : "Baimendu karga publikoak", "Always ask for a password" : "Beti eskatu pasahitza", "Enforce password protection" : "Betearazi pasahitzaren babesa", "Exclude groups from password requirements:" : "Baztertu taldeak pasahitz eskakizunetatik:", @@ -478,7 +478,7 @@ "This community release of Nextcloud is unsupported and instant notifications are unavailable." : "Nextcloud komunitate bertsio honek ez du laguntza-zerbitzurik eta berehalako jakinarazpenak ez daude eskuragarri.", "Profile picture" : "Zure irudia", "Change privacy level of profile picture" : "Aldatu profileko irudiaren pribatutasun maila", - "Upload new" : "Igo berria", + "Upload new" : "Kargatu berria", "Select from Files" : "Aukeratu fitxategien artean", "Remove image" : "Kendu irudia", "png or jpg, max. 20 MB" : "png edo jpg, gehienez 20MB", diff --git a/apps/settings/l10n/fi.js b/apps/settings/l10n/fi.js index 6de23e0d397..3f96701d00b 100644 --- a/apps/settings/l10n/fi.js +++ b/apps/settings/l10n/fi.js @@ -58,6 +58,7 @@ OC.L10N.register( "Unable to change personal password" : "Henkilökohtaista salasanaa ei voitu vaihtaa", "Saved" : "Tallennettu", "No user supplied" : "Käyttäjää ei määritetty", + "Unable to change password. Password too long." : "Salasanaa ei voitu vaihtaa. Salasana on liian pitkä.", "Authentication error" : "Tunnistautumisvirhe", "Please provide an admin recovery password; otherwise, all user data will be lost." : "Anna ylläpitäjän palautussalasana; muuten kaikki käyttäjien data menetetään.", "Wrong admin recovery password. Please check the password and try again." : "Väärä ylläpitäjän salasana. Tarkista salasana ja yritä uudelleen.", @@ -214,6 +215,7 @@ OC.L10N.register( "Server-side encryption" : "Palvelinpään salaus", "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "Palvelimelle ladatut tiedostot voidaan salata. Salaus aiheuttaa muun muassa palvelimen suorituskyvyn laskua, joten ota salaus käyttöön vain tarvittaessa.", "Enable server-side encryption" : "Käytä palvelinpään salausta", + "Please read carefully before activating server-side encryption:" : "Lue tarkasti, ennen kuin otat palvelinpään salauksen käyttöön:", "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Kun salaus on otettu käyttöön, käyttöönoton jälkeen palvelimelle ladatut tiedostot salataan palvelimen ollessa lepotilassa. Salauksen ottaminen pois päältä myöhemmin on mahdollista vain, jos aktiivinen salausmoduuli tukee toiminta ja kaikki muut vaatimukset (kuten palautusavaimen asettaminen) täyttyvät.", "Encryption alone does not guarantee security of the system. Please see documentation for more information about how the encryption app works, and the supported use cases." : "Salaus sellaisenaan ei takaa järjestelmäsi turvallisuutta. Tutustu dokumentaation saadaksesi lisätietoja, miten salaussovellus toimii ja nähdäksesi tuettuja käyttötapauksia.", "Be aware that encryption always increases the file size." : "Ota huomioon, että salaus kasvattaa aina tiedostojen kokoa.", @@ -350,6 +352,7 @@ OC.L10N.register( "An error occured during the request. Unable to proceed." : "Pyynnön aikana tapahtui virhe. Jatkaminen ei onnistu.", "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Sovellus on käytössä, mutta se tulee päivittää. Sinut ohjataan sovelluksen päivityssivulle viiden sekunnin kuluttua.", "Error: This app cannot be enabled because it makes the server unstable" : "Virhe: Sovellusta ei voida ottaa käyttöön, koska se aiheuttaa palvelimen epävakauden", + "User already exists." : "Käyttäjä on jo olemassa.", "Administrator documentation" : "Ylläpidon dokumentaatio", "Documentation" : "Dokumentaatio", "Forum" : "Keskustelupalsta", diff --git a/apps/settings/l10n/fi.json b/apps/settings/l10n/fi.json index 12c0a92029e..94ae2043385 100644 --- a/apps/settings/l10n/fi.json +++ b/apps/settings/l10n/fi.json @@ -56,6 +56,7 @@ "Unable to change personal password" : "Henkilökohtaista salasanaa ei voitu vaihtaa", "Saved" : "Tallennettu", "No user supplied" : "Käyttäjää ei määritetty", + "Unable to change password. Password too long." : "Salasanaa ei voitu vaihtaa. Salasana on liian pitkä.", "Authentication error" : "Tunnistautumisvirhe", "Please provide an admin recovery password; otherwise, all user data will be lost." : "Anna ylläpitäjän palautussalasana; muuten kaikki käyttäjien data menetetään.", "Wrong admin recovery password. Please check the password and try again." : "Väärä ylläpitäjän salasana. Tarkista salasana ja yritä uudelleen.", @@ -212,6 +213,7 @@ "Server-side encryption" : "Palvelinpään salaus", "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "Palvelimelle ladatut tiedostot voidaan salata. Salaus aiheuttaa muun muassa palvelimen suorituskyvyn laskua, joten ota salaus käyttöön vain tarvittaessa.", "Enable server-side encryption" : "Käytä palvelinpään salausta", + "Please read carefully before activating server-side encryption:" : "Lue tarkasti, ennen kuin otat palvelinpään salauksen käyttöön:", "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Kun salaus on otettu käyttöön, käyttöönoton jälkeen palvelimelle ladatut tiedostot salataan palvelimen ollessa lepotilassa. Salauksen ottaminen pois päältä myöhemmin on mahdollista vain, jos aktiivinen salausmoduuli tukee toiminta ja kaikki muut vaatimukset (kuten palautusavaimen asettaminen) täyttyvät.", "Encryption alone does not guarantee security of the system. Please see documentation for more information about how the encryption app works, and the supported use cases." : "Salaus sellaisenaan ei takaa järjestelmäsi turvallisuutta. Tutustu dokumentaation saadaksesi lisätietoja, miten salaussovellus toimii ja nähdäksesi tuettuja käyttötapauksia.", "Be aware that encryption always increases the file size." : "Ota huomioon, että salaus kasvattaa aina tiedostojen kokoa.", @@ -348,6 +350,7 @@ "An error occured during the request. Unable to proceed." : "Pyynnön aikana tapahtui virhe. Jatkaminen ei onnistu.", "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Sovellus on käytössä, mutta se tulee päivittää. Sinut ohjataan sovelluksen päivityssivulle viiden sekunnin kuluttua.", "Error: This app cannot be enabled because it makes the server unstable" : "Virhe: Sovellusta ei voida ottaa käyttöön, koska se aiheuttaa palvelimen epävakauden", + "User already exists." : "Käyttäjä on jo olemassa.", "Administrator documentation" : "Ylläpidon dokumentaatio", "Documentation" : "Dokumentaatio", "Forum" : "Keskustelupalsta", diff --git a/apps/settings/l10n/fr.js b/apps/settings/l10n/fr.js index 962cd67ffd0..85944a4678f 100644 --- a/apps/settings/l10n/fr.js +++ b/apps/settings/l10n/fr.js @@ -54,9 +54,13 @@ OC.L10N.register( "Remote wipe was started on %1$s" : "Effaçage distant démarré pour%1$s", "Remote wipe has finished on %1$s" : "Effaçage distant terminé pour %1$s", "Your <strong>password</strong> or <strong>email</strong> was modified" : "Votre <strong>mot de passe</strong> ou <strong>adresse e-mail</strong> a été modifié", + "Could not remove app." : "Impossible de supprimer l'app.", + "Could not update app." : "Impossible de mettre à jour l'app.", "Wrong password" : "Mot de passe incorrect", + "Unable to change personal password" : "Impossible de changer le mot de passe personnel", "Saved" : "Sauvegardé", "No user supplied" : "Aucun utilisateur fourni", + "Unable to change password. Password too long." : "Impossible de modifier le mot de passe. Le mot de passe est trop long.", "Authentication error" : "Erreur d'authentification", "Please provide an admin recovery password; otherwise, all user data will be lost." : "Veuillez fournir un mot de passe administrateur de récupération de données, sinon toutes les données utilisateur seront perdues.", "Wrong admin recovery password. Please check the password and try again." : "Mot de passe administrateur de récupération de données non valable. Veuillez vérifier le mot de passe et essayer à nouveau.", @@ -125,6 +129,7 @@ OC.L10N.register( "A background job is pending that checks for user imported SSL certificates. Please check back later." : "Une tâche en arrière-plan qui vérifie les certificats SSL importés par l’utilisateur est en attente. Veuillez vérifier plus tard.", "There are some user imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Certains certificats SSL importés par les utilisateurs sont présents et ne sont plus utilisés avec Nextcloud 21. Ils peuvent être importés par l'interface en ligne de commande via la commande \"occ security:certificates:import\". Leurs chemins dans le dossier data sont affichés ci-dessous.", "The old server-side-encryption format is enabled. We recommend disabling this." : "L'ancien format de chiffrement côté serveur est activé. Nous recommandons de le désactiver.", + "Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Image du profil, nom complet, courriel, numéro de téléphone, adresse, site web, Twitter, organisation, rôle, titre, biographie, et si votre profil est activé", "Nextcloud settings" : "Paramètres Nextcloud", "Administration privileges" : "Privilèges d'administration", "Here you can decide which group can access certain sections of the administration settings." : "Ici, vous pouvez décider quel groupe peut accéder à certaines sections des paramètres d'administration.", @@ -211,13 +216,22 @@ OC.L10N.register( "Copied!" : "Copié !", "Copy" : "Copier", "Could not copy app password. Please copy it manually." : "Impossible de copier le mot de passe de l'application. Merci de le copier manuellement.", + "For the server to work properly, it's important to configure background jobs correctly. Cron is the recommended setting. Please see the documentation for more information." : "Pour que le serveur fonctionne correctement, il est important de configurer correctement les tâches d'arrière-plan. Cron est le paramètre recommandé. Veuillez consulter la documentation pour plus d'informations.", + "AJAX" : "AJAX", + "Execute one task with each page loaded. Use case: Single user instance." : "Exécuter une tâche à chaque chargement de page. Cas d'utilisation : Instance avec un seul utilisateur.", + "Webcron" : "Webcron", + "cron.php is registered at a webcron service to call cron.php every 5 minutes over HTTP. Use case: Very small instance (1–5 users depending on the usage)." : "cron.php est enregistré dans un service webcron pour appeler cron.php toutes les 5 minutes via HTTP. Cas d'utilisation : Très petite instance (1-5 utilisateurs selon l'utilisation).", + "Cron (Recommended)" : "Cron (Recommandé)", "To run this you need the PHP POSIX extension. See {linkstart}PHP documentation{linkend} for more details." : "Pour l'exécuter, vous devez avoir l'extension PHP POSIX. Regarder la {linkstart}documentation PHP{linkend} pour plus de détails.", "Use system cron service to call the cron.php file every 5 minutes. Recommended for all instances." : "Utiliser le service cron du système pour appeler le fichier 'cron.php' toutes les 5 minutes.", "Profile" : "Profil", + "Enable or disable profile by default for new users." : "Activer ou désactiver le profil par défaut pour les nouveaux utilisateurs.", "Enable" : "Activer", + "Unable to update profile default setting" : "Impossible de mettre à jour les paramètres par défaut du profil", "Server-side encryption" : "Chiffrement côté serveur", "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "Le chiffrement côté serveur permet de chiffrer les fichiers qui sont téléversés sur ce serveur. Cela implique des limitations comme une performance moindre, donc activez-le seulement si nécessaire.", "Enable server-side encryption" : "Activer le chiffrement côté serveur", + "Please read carefully before activating server-side encryption:" : "Veuillez lire attentivement avant d’activer le chiffrement côté serveur :", "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Une fois le chiffrement activé, les fichiers téléversés sur le serveur à partir de ce moment seront stockés sous forme chiffrée. Il n'est possible de désactiver le chiffrement que si le module utilisé le permet spécifiquement, et que toutes les conditions préalables sont réunies pour ce faire (par exemple la création d'une clef de récupération).", "Encryption alone does not guarantee security of the system. Please see documentation for more information about how the encryption app works, and the supported use cases." : "Le chiffrement seul ne garantit pas la sécurité du système. Veuillez consulter la documentation pour plus d'informations à propos du fonction de l'application de chiffrement, et des cas d'utilisations supportés.", "Be aware that encryption always increases the file size." : "Veuillez noter que le chiffrement augmente toujours la taille des fichiers.", @@ -225,6 +239,9 @@ OC.L10N.register( "This is the final warning: Do you really want to enable encryption?" : "Dernier avertissement : Voulez-vous vraiment activer le chiffrement ?", "No encryption module loaded, please enable an encryption module in the app menu." : "Aucun module de chiffrement n'est chargé. Merci d'activer un module de chiffrement dans le menu des applications.", "Select default encryption module:" : "Sélectionnez le module de chiffrement par défaut :", + "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the \"Default encryption module\" and run {command}" : "Vous devez migrer vos clés de cryptage de l’ancien cryptage (ownCloud <= 8.0) vers le nouveau. Veuillez activer le \"module de cryptage par défaut\" et exécuter {command}", + "Unable to update server side encryption config" : "Impossible de mettre à jour la configuration du chiffrement côté serveur", + "Rename group" : "Renommer le groupe", "Remove group" : "Supprimer le groupe", "You are about to remove the group {group}. The users will NOT be deleted." : "Vous êtes sur le point de supprimer le groupe {group}. Les utilisateurs ne seront PAS supprimés.", "Please confirm the group removal " : "Veuillez confirmer la suppression du groupe", @@ -257,7 +274,7 @@ OC.L10N.register( "No language set" : "Aucune langue définie", "Your organisation" : "Votre organisation", "Unable to update organisation" : "Impossible de modifier l'organisation", - "Edit your Profile visibility" : "Modifier la visibilité de votre profil", + "Edit your Profile visibility" : "Modifier la visibilité du profil", "Enable Profile" : "Activer le profil", "Unable to update profile enabled state" : "Impossible de mettre à jour l'état du profil", "The more restrictive setting of either visibility or scope is respected on your Profile. For example, if visibility is set to \"Show to everyone\" and scope is set to \"Private\", \"Private\" is respected." : "Le paramètre le plus restrictif entre la visibilité et la confidentialité est respecté. Par exemple, si la visibilité est définie à \"Montrer à tout le monde\" et que la confidentialité est \"Privée\", \"Privée\" est respecté.", @@ -267,6 +284,7 @@ OC.L10N.register( "Unable to update role" : "Impossible de modifier le rôle", "Unable to update federation scope of the primary {accountProperty}" : "Impossible de mettre à jour la confidentialité de fédération du {accountProperty} primaire", "Unable to update federation scope of additional {accountProperty}" : "Impossible de mettre à jour la confidentialité de fédération du {accountProperty} supplémentaire", + "Add additional email" : "Ajouter un e-mail supplémentaire", "Add" : "Ajouter", "You do not have permissions to see the details of this user" : "Vous n'avez pas les autorisations pour voir le détail de cet utilisateur", "Add new password" : "Ajouter un nouveau mot de passe", @@ -289,7 +307,7 @@ OC.L10N.register( "Welcome mail sent!" : "E-mail de bienvenue envoyé !", "Edit User" : "Modifier l'utilisateur", "Toggle user actions menu" : "Basculer le menu des actions de l'utilisateur", - "{size} used" : "{size} utilisé", + "{size} used" : "{size} utilisés", "New user" : "Nouvel utilisateur", "Will be autogenerated" : "Sera généré automatiquement", "Display name" : "Nom à afficher", @@ -298,7 +316,7 @@ OC.L10N.register( "Add a new user" : "Ajouter un nouvel utilisateur", "Group admin for" : "Administrateur de groupe pour", "Quota" : "Quota", - "User backend" : "Retour utilisateur", + "User backend" : "Origine du compte", "Storage location" : "Emplacement du stockage", "Last login" : "Dernière connexion", "No users in here" : "Aucun utilisateur", @@ -369,6 +387,7 @@ OC.L10N.register( "An error occured during the request. Unable to proceed." : "Une erreur est survenue durant la requête. Impossible de traiter la demande.", "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "L'application a été activée mais doit être mise à jour. Vous allez être redirigé vers la page des mises à jour dans 5 secondes.", "Error: This app cannot be enabled because it makes the server unstable" : "Erreur : cette application ne peut être activée car elle rend le serveur instable", + "User already exists." : "Cet utilisateur existe déjà.", "Administrator documentation" : "Documentation administrateur", "Documentation" : "Documentation", "Forum" : "Forum", diff --git a/apps/settings/l10n/fr.json b/apps/settings/l10n/fr.json index 54136097396..38d337117da 100644 --- a/apps/settings/l10n/fr.json +++ b/apps/settings/l10n/fr.json @@ -52,9 +52,13 @@ "Remote wipe was started on %1$s" : "Effaçage distant démarré pour%1$s", "Remote wipe has finished on %1$s" : "Effaçage distant terminé pour %1$s", "Your <strong>password</strong> or <strong>email</strong> was modified" : "Votre <strong>mot de passe</strong> ou <strong>adresse e-mail</strong> a été modifié", + "Could not remove app." : "Impossible de supprimer l'app.", + "Could not update app." : "Impossible de mettre à jour l'app.", "Wrong password" : "Mot de passe incorrect", + "Unable to change personal password" : "Impossible de changer le mot de passe personnel", "Saved" : "Sauvegardé", "No user supplied" : "Aucun utilisateur fourni", + "Unable to change password. Password too long." : "Impossible de modifier le mot de passe. Le mot de passe est trop long.", "Authentication error" : "Erreur d'authentification", "Please provide an admin recovery password; otherwise, all user data will be lost." : "Veuillez fournir un mot de passe administrateur de récupération de données, sinon toutes les données utilisateur seront perdues.", "Wrong admin recovery password. Please check the password and try again." : "Mot de passe administrateur de récupération de données non valable. Veuillez vérifier le mot de passe et essayer à nouveau.", @@ -123,6 +127,7 @@ "A background job is pending that checks for user imported SSL certificates. Please check back later." : "Une tâche en arrière-plan qui vérifie les certificats SSL importés par l’utilisateur est en attente. Veuillez vérifier plus tard.", "There are some user imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Certains certificats SSL importés par les utilisateurs sont présents et ne sont plus utilisés avec Nextcloud 21. Ils peuvent être importés par l'interface en ligne de commande via la commande \"occ security:certificates:import\". Leurs chemins dans le dossier data sont affichés ci-dessous.", "The old server-side-encryption format is enabled. We recommend disabling this." : "L'ancien format de chiffrement côté serveur est activé. Nous recommandons de le désactiver.", + "Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Image du profil, nom complet, courriel, numéro de téléphone, adresse, site web, Twitter, organisation, rôle, titre, biographie, et si votre profil est activé", "Nextcloud settings" : "Paramètres Nextcloud", "Administration privileges" : "Privilèges d'administration", "Here you can decide which group can access certain sections of the administration settings." : "Ici, vous pouvez décider quel groupe peut accéder à certaines sections des paramètres d'administration.", @@ -209,13 +214,22 @@ "Copied!" : "Copié !", "Copy" : "Copier", "Could not copy app password. Please copy it manually." : "Impossible de copier le mot de passe de l'application. Merci de le copier manuellement.", + "For the server to work properly, it's important to configure background jobs correctly. Cron is the recommended setting. Please see the documentation for more information." : "Pour que le serveur fonctionne correctement, il est important de configurer correctement les tâches d'arrière-plan. Cron est le paramètre recommandé. Veuillez consulter la documentation pour plus d'informations.", + "AJAX" : "AJAX", + "Execute one task with each page loaded. Use case: Single user instance." : "Exécuter une tâche à chaque chargement de page. Cas d'utilisation : Instance avec un seul utilisateur.", + "Webcron" : "Webcron", + "cron.php is registered at a webcron service to call cron.php every 5 minutes over HTTP. Use case: Very small instance (1–5 users depending on the usage)." : "cron.php est enregistré dans un service webcron pour appeler cron.php toutes les 5 minutes via HTTP. Cas d'utilisation : Très petite instance (1-5 utilisateurs selon l'utilisation).", + "Cron (Recommended)" : "Cron (Recommandé)", "To run this you need the PHP POSIX extension. See {linkstart}PHP documentation{linkend} for more details." : "Pour l'exécuter, vous devez avoir l'extension PHP POSIX. Regarder la {linkstart}documentation PHP{linkend} pour plus de détails.", "Use system cron service to call the cron.php file every 5 minutes. Recommended for all instances." : "Utiliser le service cron du système pour appeler le fichier 'cron.php' toutes les 5 minutes.", "Profile" : "Profil", + "Enable or disable profile by default for new users." : "Activer ou désactiver le profil par défaut pour les nouveaux utilisateurs.", "Enable" : "Activer", + "Unable to update profile default setting" : "Impossible de mettre à jour les paramètres par défaut du profil", "Server-side encryption" : "Chiffrement côté serveur", "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "Le chiffrement côté serveur permet de chiffrer les fichiers qui sont téléversés sur ce serveur. Cela implique des limitations comme une performance moindre, donc activez-le seulement si nécessaire.", "Enable server-side encryption" : "Activer le chiffrement côté serveur", + "Please read carefully before activating server-side encryption:" : "Veuillez lire attentivement avant d’activer le chiffrement côté serveur :", "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Une fois le chiffrement activé, les fichiers téléversés sur le serveur à partir de ce moment seront stockés sous forme chiffrée. Il n'est possible de désactiver le chiffrement que si le module utilisé le permet spécifiquement, et que toutes les conditions préalables sont réunies pour ce faire (par exemple la création d'une clef de récupération).", "Encryption alone does not guarantee security of the system. Please see documentation for more information about how the encryption app works, and the supported use cases." : "Le chiffrement seul ne garantit pas la sécurité du système. Veuillez consulter la documentation pour plus d'informations à propos du fonction de l'application de chiffrement, et des cas d'utilisations supportés.", "Be aware that encryption always increases the file size." : "Veuillez noter que le chiffrement augmente toujours la taille des fichiers.", @@ -223,6 +237,9 @@ "This is the final warning: Do you really want to enable encryption?" : "Dernier avertissement : Voulez-vous vraiment activer le chiffrement ?", "No encryption module loaded, please enable an encryption module in the app menu." : "Aucun module de chiffrement n'est chargé. Merci d'activer un module de chiffrement dans le menu des applications.", "Select default encryption module:" : "Sélectionnez le module de chiffrement par défaut :", + "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the \"Default encryption module\" and run {command}" : "Vous devez migrer vos clés de cryptage de l’ancien cryptage (ownCloud <= 8.0) vers le nouveau. Veuillez activer le \"module de cryptage par défaut\" et exécuter {command}", + "Unable to update server side encryption config" : "Impossible de mettre à jour la configuration du chiffrement côté serveur", + "Rename group" : "Renommer le groupe", "Remove group" : "Supprimer le groupe", "You are about to remove the group {group}. The users will NOT be deleted." : "Vous êtes sur le point de supprimer le groupe {group}. Les utilisateurs ne seront PAS supprimés.", "Please confirm the group removal " : "Veuillez confirmer la suppression du groupe", @@ -255,7 +272,7 @@ "No language set" : "Aucune langue définie", "Your organisation" : "Votre organisation", "Unable to update organisation" : "Impossible de modifier l'organisation", - "Edit your Profile visibility" : "Modifier la visibilité de votre profil", + "Edit your Profile visibility" : "Modifier la visibilité du profil", "Enable Profile" : "Activer le profil", "Unable to update profile enabled state" : "Impossible de mettre à jour l'état du profil", "The more restrictive setting of either visibility or scope is respected on your Profile. For example, if visibility is set to \"Show to everyone\" and scope is set to \"Private\", \"Private\" is respected." : "Le paramètre le plus restrictif entre la visibilité et la confidentialité est respecté. Par exemple, si la visibilité est définie à \"Montrer à tout le monde\" et que la confidentialité est \"Privée\", \"Privée\" est respecté.", @@ -265,6 +282,7 @@ "Unable to update role" : "Impossible de modifier le rôle", "Unable to update federation scope of the primary {accountProperty}" : "Impossible de mettre à jour la confidentialité de fédération du {accountProperty} primaire", "Unable to update federation scope of additional {accountProperty}" : "Impossible de mettre à jour la confidentialité de fédération du {accountProperty} supplémentaire", + "Add additional email" : "Ajouter un e-mail supplémentaire", "Add" : "Ajouter", "You do not have permissions to see the details of this user" : "Vous n'avez pas les autorisations pour voir le détail de cet utilisateur", "Add new password" : "Ajouter un nouveau mot de passe", @@ -287,7 +305,7 @@ "Welcome mail sent!" : "E-mail de bienvenue envoyé !", "Edit User" : "Modifier l'utilisateur", "Toggle user actions menu" : "Basculer le menu des actions de l'utilisateur", - "{size} used" : "{size} utilisé", + "{size} used" : "{size} utilisés", "New user" : "Nouvel utilisateur", "Will be autogenerated" : "Sera généré automatiquement", "Display name" : "Nom à afficher", @@ -296,7 +314,7 @@ "Add a new user" : "Ajouter un nouvel utilisateur", "Group admin for" : "Administrateur de groupe pour", "Quota" : "Quota", - "User backend" : "Retour utilisateur", + "User backend" : "Origine du compte", "Storage location" : "Emplacement du stockage", "Last login" : "Dernière connexion", "No users in here" : "Aucun utilisateur", @@ -367,6 +385,7 @@ "An error occured during the request. Unable to proceed." : "Une erreur est survenue durant la requête. Impossible de traiter la demande.", "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "L'application a été activée mais doit être mise à jour. Vous allez être redirigé vers la page des mises à jour dans 5 secondes.", "Error: This app cannot be enabled because it makes the server unstable" : "Erreur : cette application ne peut être activée car elle rend le serveur instable", + "User already exists." : "Cet utilisateur existe déjà.", "Administrator documentation" : "Documentation administrateur", "Documentation" : "Documentation", "Forum" : "Forum", diff --git a/apps/settings/l10n/ko.js b/apps/settings/l10n/ko.js index 8d6932fb565..7fe7c0e27d9 100644 --- a/apps/settings/l10n/ko.js +++ b/apps/settings/l10n/ko.js @@ -42,35 +42,61 @@ OC.L10N.register( "You changed your email address" : "내 이메일 주소를 변경함", "Your email address was changed by an administrator" : "관리자가 내 이메일 주소를 변경함", "You created app password \"{token}\"" : "앱 패스워드 \"{token}\"이 생성되었습니다.", + "An administrator created app password \"{token}\"" : "관리자가 앱 패스워드 \"{token}\"을(를) 생성함", "You deleted app password \"{token}\"" : "앱 패스워드 \"{token}\"이 제거되었습니다.", "You renamed app password \"{token}\" to \"{newToken}\"" : "앱 패스워드 \"{token}\"의 이름을 \"{newToken}\"으로 바꿨습니다.", + "You granted filesystem access to app password \"{token}\"" : "앱 패스워드 \"{token}\"에 대해 파일 시스템 접근을 허가함", + "You revoked filesystem access from app password \"{token}\"" : "앱 패스워드 \"{token}\"에 대해 파일 시스템 접근 권한을 철회함", "Security" : "보안", "You successfully logged in using two-factor authentication (%1$s)" : "2단계 인증으로 로그인함(%1$s)", "A login attempt using two-factor authentication failed (%1$s)" : "2단계 인증 시도가 실패함(%1$s)", + "Remote wipe was started on %1$s" : "원격 제거가 %1$s에 시작됨", + "Remote wipe has finished on %1$s" : "원격 제거가 %1$s에 완료됨", "Your <strong>password</strong> or <strong>email</strong> was modified" : "내 <strong>암호</strong> 및 <strong>이메일</strong>이 변경됨", + "Could not remove app." : "앱을 삭제할 수 없음", + "Could not update app." : "앱을 업데이트 할 수 없음", "Wrong password" : "잘못된 암호", + "Unable to change personal password" : "개인 패스워드를 변경할 수 없음", "Saved" : "저장됨", "No user supplied" : "사용자가 지정되지 않음", + "Unable to change password. Password too long." : "패스워드를 변경할 수 없음. 패스워드가 너무 긺.", "Authentication error" : "인증 오류", "Please provide an admin recovery password; otherwise, all user data will be lost." : "관리자 복구 암호를 입력하십시오. 그렇지 않으면 모든 사용자 데이이터가 초기화됩니다다.", "Wrong admin recovery password. Please check the password and try again." : "관리자 복구 암호가 잘못되었습니다. 암호를 다시 확인하십시오.", + "Backend does not support password change, but the user's encryption key was updated." : "백엔드에서 암호 변경을 지원하지 않지만 사용자의 암호화 키는 업데이트되었습니다.", + "installing and updating apps via the App Store or Federated Cloud Sharing" : "앱 스토어 및 연합 클라우드 공유로 앱 설치 및 업데이트", "Federated Cloud Sharing" : "클라우드 연합 공유", + "cURL is using an outdated %1$s version (%2$s). Please update your operating system or features such as %3$s will not work reliably." : "cURL이 오래된 %1$s 버전을 사용하고 있습니다(%2$s). 운영 체제나 기능을 업데이트하지 않으면 %3$s 등을 안정적으로 사용할 수 없습니다.", + "Could not determine if TLS version of cURL is outdated or not because an error happened during the HTTPS request against https://nextcloud.com. Please check the Nextcloud log file for more details." : "https://nextcloud.com에 대한 HTTPS 요청 중 오류가 발생하여 cURL의 TLS 버전이 오래되었는지 확인할 수 없습니다. 자세한 정보는 Nextcloud 로그 파일을 참조하여 주십시오.", + "The PHP OPcache module is not loaded. For better performance it is recommended to load it into your PHP installation." : "PHP OPcache 모듈이 로드되지 않았습니다. 더 나은 성능을 위해 이를 PHP에 로드하는 것이 권장됩니다.", + "OPcache is disabled. For better performance, it is recommended to apply <code>opcache.enable=1</code> to your PHP configuration." : "OPchache가 비활성화 되었습니다. PHP 설정에서 <code>opcahce.enable=1</code>을 적용하는 것을 권장합니다.", + "OPcache is configured to remove code comments. With OPcache enabled, <code>opcache.save_comments=1</code> must be set for Nextcloud to function." : "OPcache가 code comment를 삭제하도록 설정되어 있습니다. Nextcloud의 원활한 작동을 위해 OPcahce 활성화 시 <code>opcache.save_comments=1</code>을 설정해야 합니다.", + "Nextcloud is not allowed to use the OPcache API. With OPcache enabled, it is highly recommended to include all Nextcloud directories with <code>opcache.restrict_api</code> or unset this setting to disable OPcache API restrictions, to prevent errors during Nextcloud core or app upgrades." : "Nextcloud가 OPcache API를 사용하도록 허용되지 않았습니다. Nextcloud core나 앱 업그레이드 중 에러 발생을 방지하기 위해, OPcache 활성화 시 모든 Nextcloud 디렉토리를 <code>opcahce.restrict_api</code>에 포함하거나 해당 설정을 해제하여 OPcahce API 제한을 비활성화 하는 것을 권장합니다.", + "Nextcloud is not allowed to use the OPcache API. It is highly recommended to include all Nextcloud directories with <code>opcache.restrict_api</code> or unset this setting to disable OPcache API restrictions, to prevent errors during Nextcloud core or app upgrades." : "Nextcloud가 OPcache API를 사용하도록 허용되지 않았습니다. Nextcloud core나 앱 업그레이드 중 에러 발생을 방지하기 위해, OPcache 활성화 시 모든 Nextcloud 디렉토리를 <code>opcahce.restrict_api</code>에 포함하거나 해당 설정을 해제하여 OPcahce API 제한을 비활성화 하는 것을 권장합니다.", + "The maximum number of OPcache keys is nearly exceeded. To assure that all scripts can be kept in the cache, it is recommended to apply <code>opcache.max_accelerated_files</code> to your PHP configuration with a value higher than <code>%s</code>." : "곧 OPcache key가 최대치를 초과할 것으로 보입니다. 모든 스크립트가 캐시에 유지될 수 있도록, PHP 설정에서 <code>opcache.max_accelerated_files</code> 값을 <code>%s</code> 보다 크게 적용하시길 권장합니다. ", + "The OPcache buffer is nearly full. To assure that all scripts can be hold in cache, it is recommended to apply <code>opcache.memory_consumption</code> to your PHP configuration with a value higher than <code>%s</code>." : "곧 OPcache 버퍼가 가득 찰 것으로 보입니다. 모든 스크립트가 캐시에 보관될 수 있도록, PHP 설정에서 <code>opcache.memory_consumption</code> 값을 <code>%s</code> 보다 크게 적용하시길 권장합니다. ", + "The OPcache interned strings buffer is nearly full. To assure that repeating strings can be effectively cached, it is recommended to apply <code>opcache.interned_strings_buffer</code> to your PHP configuration with a value higher than <code>%s</code>." : "곧 OPcache interned buffer가 가득 찰 것으로 보입니다. 반복 문자열이 효율적으로 캐싱될 수 있도록, PHP 설정에서 <code>opcache.interned_strings_buffer</code> 값을 <code>%s</code> 보다 크게 적용하시길 권장합니다. ", "Invalid SMTP password." : "SMTP 암호가 잘못되었습니다.", "Email setting test" : "이메일 설정 시험", "Well done, %s!" : "%s 님, 잘 하셨습니다!", "If you received this email, the email configuration seems to be correct." : "이 이메일을 받으셨다면 이메일 설정이 올바릅니다.", "Email could not be sent. Check your mail server log" : "이메일을 보낼 수 없습니다. 메일 서버 로그를 확인하십시오.", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "이메일을 보내는 중 오류가 발생했습니다. 설정을 확인하십시오.(오류: %s)", + "You need to set your user email before being able to send test emails. Go to %s for that." : "이메일 발송 테스트를 진행하기 앞서 당신의 사용자 이메일을 설정해야 합니다. 설정을 위해 %s(으)로 가십시오.", "Invalid user" : "잘못된 사용자", "Invalid mail address" : "잘못된 이메일 주소", "Settings saved" : "설정 저장됨", "Unable to change full name" : "전체 이름을 변경할 수 없음", "Unable to change email address" : "이메일 주소를 변경할 수 없음", + "Unable to set invalid phone number" : "올바르지 않은 전화번호를 설정할 수 없음", + "Unable to set invalid website" : "올바르지 않은 웹사이트 주소를 설정할 수 없음", + "Some account data was invalid" : "몇 가지 계정 데이터가 올바르지 않음", "In order to verify your Twitter account, post the following tweet on Twitter (please make sure to post it without any line breaks):" : "내 트위터 계정을 확인하려면 다음 트윗을 타임라인에 게시하십시오(줄바꿈을 추가하지 마십시오):", "In order to verify your Website, store the following content in your web-root at '.well-known/CloudIdVerificationCode.txt' (please make sure that the complete text is in one line):" : "내 웹 사이트를 확인하려면 다음 내용을 웹 사이트 루트 디렉터리의 '.well-known/CloudIdVerificationCode.txt' 파일에 게시하십시오(전체 텍스트가 한 줄에 들어가야 함):", "%1$s changed your password on %2$s." : "%1$s 님이 내 암호를 %2$s에 변경했습니다.", "Your password on %s was changed." : "내 %s 암호를 변경했습니다.", "Your password on %s was reset by an administrator." : "관리자가 내 %s 암호를 초기화했습니다.", + "Your password on %s was reset." : "내 %s 암호를 변경했습니다.", "Password for %1$s changed on %2$s" : "%1$s의 암호를 %2$s에 변경함", "Password changed for %s" : "%s의 암호 변경됨", "If you did not request this, please contact an administrator." : "요청하지 않았다면 관리자에게 연락하십시오.", @@ -87,11 +113,13 @@ OC.L10N.register( "Set your password" : "내 암호 설정하기", "Go to %s" : "%s(으)로 이동", "Install Client" : "클라이언트 설치", + "Logged in user must be a subadmin" : "로그인한 사용자는 부관리자여야 합니다.", "Apps" : "앱", "Settings" : "설정", "Personal" : "개인", "Administration" : "관리", "Additional settings" : "고급 설정", + "Admin privileges" : "관리자용 권한", "Groupware" : "그룹웨어", "Overview" : "개요", "Basic settings" : "기본 설정", @@ -107,17 +135,33 @@ OC.L10N.register( "Reshare" : "재공유", "Unlimited" : "무제한", "Verifying" : "검사", + "A background job is pending that checks for user imported SSL certificates. Please check back later." : "사용자가 불러온 SSL 인증서를 확인하는 백그라운드 작업이 진행중입니다. 나중에 다시 확인하십시오.", + "There are some user imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "현재 사용자가 불러온 SSL 인증서 중 Nextcloud 21과 함께 사용할 수 없는 것이 있습니다. 이러한 인증서는 커맨드라인 명령어 \"occ security:certificates:import\"로 불러올 수 있습니다. 데이터 디렉토리 내부에 있는 해당 인증서의 경로가 아래에 표시됩니다.", + "Invalid UUIDs of LDAP users or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "잘못된 LDAP 사용자 또는 그룹 UUID를 발견했습니다. LDAP 설정의 '전문가' 부분에서 \"Override UUID detection\"을 재확인하시고, \"occ ldap:update-uuid\" 명령어를 통해 이를 갱신하십시오.", + "The old server-side-encryption format is enabled. We recommend disabling this." : "구형 포맷의 서버 측 암호화가 활성화된 상태입니다. 이를 비활성화 하는 것을 권장합니다.", + "MariaDB version \"%s\" is used. Nextcloud 21 and higher do not support this version and require MariaDB 10.2 or higher." : "현재 MariaDB \"%s\" 버전이 사용되고 있습니다. Nextcloud 21 및 그 이상의 버전은 이를 지원하지 않습니다. MariaDB 10.2 이상을 사용하십시오.", + "MySQL version \"%s\" is used. Nextcloud 21 and higher do not support this version and require MySQL 8.0 or MariaDB 10.2 or higher." : "현재 MySQL \"%s\" 버전이 사용되고 있습니다. Nextcloud 21 및 그 이상의 버전은 이를 지원하지 않습니다. MySQL 8.0 혹은 MariaDB 10.2 이상을 사용하십시오.", + "PostgreSQL version \"%s\" is used. Nextcloud 21 and higher do not support this version and require PostgreSQL 9.6 or higher." : "현재 PostgreSQL \"%s\" 버전이 사용되고 있습니다. Nextcloud 21 및 그 이상의 버전은 이를 지원하지 않습니다. PostgreSQL 9.6 이상을 사용하십시오.", + "Profile information" : "프로필 정보", + "Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "프로필 사진, 전체 이름, 이메일, 전화번호, 주소, 웹사이트, 트위터, 조직, 직책, 표제, 소개문구 및 프로필 활성화 여부", "Nextcloud settings" : "Nextcloud 환경설정", + "Administration privileges" : "관리 권한", + "Here you can decide which group can access certain sections of the administration settings." : "이곳에서 특정 그룹의 특정 관리자 설정 접근 여부를 설정할 수 있습니다.", "None" : "없음", + "Unable to modify setting" : "설정을 수정할 수 없습니다", "Two-Factor Authentication" : "2단계 인증", + "Two-factor authentication can be enforced for all users and specific groups. If they do not have a two-factor provider configured, they will be unable to log into the system." : "2단계 인증을 모든 유저 또는 특정 그룹에 강제할 수 있습니다. 만약 대상자가 2단계 인증 공급자를 설정하지 않았다면, 대상자는 시스템에 접근할 수 없게 될 것입니다.", "Enforce two-factor authentication" : "2단계 인증 강제하기", "Limit to groups" : "그룹으로 제한", "Enforcement of two-factor authentication can be set for certain groups only." : "2단계 인증 강제는 특정 그룹에게만 적용됩니다.", + "Two-factor authentication is enforced for all members of the following groups." : "2단계 인증이 모든 멤버에게 강제된 그룹은 다음과 같습니다.", "Enforced groups" : "강제된 그룹", + "Two-factor authentication is not enforced for members of the following groups." : "2단계 인증이 강제되지 않은 그룹은 다음과 같습니다.", "Excluded groups" : "제외된 그룹", "When groups are selected/excluded, they use the following logic to determine if a user has 2FA enforced: If no groups are selected, 2FA is enabled for everyone except members of the excluded groups. If groups are selected, 2FA is enabled for all members of these. If a user is both in a selected and excluded group, the selected takes precedence and 2FA is enforced." : "그룹이 선택되거나 제외되었을 때, 다음과 같은 상황을 고려할 수 있습니다. 만약 2단계 인증이 강제되었고, 아무런 그룹이 선택되지 않았다면 제외된 그룹의 멤버를 제외하고 모든 유저에게 2단계 인증이 강제됩니다. 만약 그룹이 선택되었다면 그룹 안의 모든 멤버에게 2단계 인증이 강제됩니다. 만약 유저가 선택된 그룹과 제외된 그룹에 동시에 속해있다면, 선택된 그룹이 우선되며 2단계 인증이 강제됩니다.", "Save changes" : "변경 사항 저장", "All" : "모두", + "Limit app usage to groups" : "앱 사용을 그룹으로 제한합니다.", "No results" : "결과 없음", "Update to {version}" : "{version}(으)로 업데이트", "Remove" : "삭제", @@ -131,16 +175,23 @@ OC.L10N.register( "User documentation" : "사용자 문서", "Admin documentation" : "관리 문서", "Developer documentation" : "개발자 문서", + "This app is supported via your current Nextcloud subscription." : "이 앱은 당신의 현재 Nextcloud 구독을 통해 지원됩니다.", + "Supported" : "지원됨", "Featured" : "추천", + "Update to {update}" : "{update}(으)로 업데이트", + "All apps are up-to-date." : "모든 앱이 최신 버전입니다.", "No apps found for your version" : "설치된 버전에 대한 앱 없음", "Disable all" : "전체 비활성화", "Enable all" : "모두 활성화", "_%n app has an update available_::_%n apps have an update available_" : ["%n앱을 업데이트 할 수 있습니다."], + "_Update_::_Update all_" : ["모두 업데이트"], + "Marked for remote wipe" : "원격 제거를 위해 지정됨", "Device settings" : "디바이스 설정", "Allow filesystem access" : "파일시스템 접근 허용", "Rename" : "이름 바꾸기", "Revoke" : "취소", "Wipe device" : "디바이스 지우기", + "Revoking this token might prevent the wiping of your device if it has not started the wipe yet." : "기기 제거가 아직 시작되지 않았다면, 이 토큰을 취소하여 기기의 제거를 방지할 수 있습니다.", "Internet Explorer" : "Internet Explorer", "Edge" : "Edge", "Firefox" : "Firefox", @@ -159,6 +210,7 @@ OC.L10N.register( "Confirm wipe" : "삭제 완료", "Error while creating device token" : "장치 토큰을 만드는 중 오류가 발생했습니다", "Error while deleting the token" : "토큰을 삭제하는 중 오류가 발생했습니다", + "Error while wiping the device with the token" : "토큰으로 기기를 제거하는 도중 오류 발생", "App name" : "앱 이름", "Create new app password" : "새로운 앱 암호 만들기", "Use the credentials below to configure your app or device." : "앱 또는 장치를 구성하는 아래의 자격 증명을 사용합니다.", @@ -170,12 +222,25 @@ OC.L10N.register( "Copied!" : "복사 성공!", "Copy" : "복사", "Could not copy app password. Please copy it manually." : "앱 비밀번호를 복사할 수 없습니다. 직접 옮겨 적으십시오.", + "For the server to work properly, it's important to configure background jobs correctly. Cron is the recommended setting. Please see the documentation for more information." : "서버가 적절하게 동작하기 위해 백그라운드 작업을 올바르게 설정하는 것이 중요합니다. Cron으로 설정하는 것을 권장합니다. 더 많은 정보는 문서를 참조하십시오.", + "Last job execution ran {time}. Something seems wrong." : "마지막 작업이 {time}에 실행되었습니다. 무언가 잘못된 것 같습니다.", + "Last job ran {relativeTime}." : "마지막 작업이 {relativeTime}에 실행되었음", + "Background job did not run yet!" : "백그라운드 작업이 아직 실행되지 않았습니다!", + "Execute one task with each page loaded. Use case: Single user instance." : "각 페이지를 로드할 때 마다 하나의 작업을 시행. 사용례: 1인 사용자 인스턴스", + "cron.php is registered at a webcron service to call cron.php every 5 minutes over HTTP. Use case: Very small instance (1–5 users depending on the usage)." : "cron.php를 webcron 서비스에 등록하여 cron.php를 매 5분마다 HTTP 상에서 호출. 사용례: 아주 작은 인스턴스 (사용자가 1~5명인 규모 - 사용량에 따라 다름)", + "Cron (Recommended)" : "Cron (권장됨)", "To run this you need the PHP POSIX extension. See {linkstart}PHP documentation{linkend} for more details." : "이 항목을 실행하려면 PHP POSIX 확장이 필요합니다. 자세한 사항은 {linkstart}PHP 문서{linkend}를 참조하십시오.", + "Use system cron service to call the cron.php file every 5 minutes. Recommended for all instances." : "시스템 Cron 서비스를 사용하여 cron.php를 매 5분마다 호출. 모든 인스턴스에 권장.", + "The cron.php needs to be executed by the system user \"{user}\"." : "시스템 사용자 \"{user}\"(으)로 cron.php를 실행해야 합니다.", + "Unable to update background job mode" : "백그라운드 작업 모드를 업데이트 할 수 없음", "Profile" : "프로필", + "Enable or disable profile by default for new users." : "신규 사용자에 대한 프로필 기본 사용 여부를 설정하십시오.", "Enable" : "사용함", + "Unable to update profile default setting" : "프로필 기본 설정을 업데이트 할 수 없음", "Server-side encryption" : "서버 측 암호화", "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "서버 측 암호화를 사용하면 이 서버에 업로드되는 파일을 암호화할 수 있습니다. 성능 감소 등 제약 사항이 있으므로 필요한 경우에만 사용하십시오.", "Enable server-side encryption" : "서버 측 암호화 사용", + "Please read carefully before activating server-side encryption:" : "서버 측 암호화를 활성화하기 전에 읽어 보십시오:", "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "암호화를 사용하면, 사용하기 시작한 시간 이후에 서버에 업로드된 모든 파일이 암호화됩니다. 나중에 암호화를 사용하지 않으려면 사용하고 있는 암호화 모듈에서 비활성화를 지원해야 하고 모든 사전 조건(예: 복구 키 설정)을 만족해야 합니다.", "Encryption alone does not guarantee security of the system. Please see documentation for more information about how the encryption app works, and the supported use cases." : "암호화만으로 시스템의 보안을 보장할 수 없습니다. 암호화 응용 프로그램 작동 방식 및 지원되는 사용 사례에 대한 자세한 내용은 설명서를 참조하십시오.", "Be aware that encryption always increases the file size." : "암호화된 파일의 크기는 항상 커집니다.", @@ -183,28 +248,72 @@ OC.L10N.register( "This is the final warning: Do you really want to enable encryption?" : "마지막 경고입니다. 암호화를 활성화하시겠습니까?", "No encryption module loaded, please enable an encryption module in the app menu." : "암호화 모듈을 불러오지 않았습니다. 앱 메뉴에서 암호화 모듈을 활성화하십시오.", "Select default encryption module:" : "기본 암호화 모듈 선택:", + "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the \"Default encryption module\" and run {command}" : "과거에 사용하였던(ownCloud <= 8.0) 암호화된 데이터에서 키를 이전해야 합니다. \"기본 암호화 모듈\"을 활성화한 다음 {command}(을)를 실행하십시오", + "Unable to update server side encryption config" : "서버 측 암호화 설정을 갱신할 수 없음", + "Rename group" : "그룹 이름 바꾸기", "Remove group" : "그룹 지우기", "You are about to remove the group {group}. The users will NOT be deleted." : "당신은 {group} 그룹을 지우려고 합니다. 그룹의 사용자들은 삭제되지 않습니다.", "Please confirm the group removal " : "그룹 지우기를 확인해주세요.", + "Your biography" : "내 소개문구", + "Unable to update biography" : "소개문구를 갱신할 수 없음", + "Your full name" : "내 전체 이름", + "Unable to update full name" : "전체 이름을 갱신할 수 없음", + "No full name set" : "전체 이름이 설정되지 않음", + "Email options" : "이메일 옵션", + "Primary email for password reset and notifications" : "암호 초기화 및 알림 수신용 주 이메일 주소", + "Remove primary email" : "주 이메일 삭제", + "Delete email" : "이메일 삭제", + "Unset as primary email" : "주 이메일 지정 해제", + "This address is not confirmed" : "이 주소는 확인되지 않음", + "Set as primary email" : "주 이메일로 지정", "Your email address" : "이메일 주소", + "Additional email address {index}" : "추가 이메일 주소 {index}", + "Unable to delete primary email address" : "주 이메일 주소를 삭제할 수 없음", + "Unable to update primary email address" : "주 이메일 주소를 갱신할 수 없음", + "Unable to add additional email address" : "추가 이메일 주소를 추가할 수 없음", + "Unable to update additional email address" : "추가 이메일 주소를 갱신할 수 없음", + "Unable to delete additional email address" : "추가 이메일 주소를 삭제할 수 없음", "No email address set" : "이메일 주소가 설정되지 않음", + "Additional emails" : "추가 이메일", + "Your headline" : "내 표제", + "Unable to update headline" : "표제를 갱신할 수 없음", "Language" : "언어", "Help translate" : "번역 돕기", + "Unable to update language" : "언어를 갱신할 수 없음", + "No language set" : "언어가 설정되지 않음", + "Your organisation" : "내 조직", + "Unable to update organisation" : "조직을 갱신할 수 없음", + "Edit your Profile visibility" : "프로필 표시 여부 편집", + "Enable Profile" : "프로필 활성화", + "Unable to update profile enabled state" : "프로필 활성화 여부를 갱신할 수 없음", + "Unable to update visibility of {displayId}" : "{displayId}의 표시 여부를 갱신할 수 없음", + "Your role" : "내 직책", + "Unable to update role" : "직책을 갱신할 수 없음", + "Add additional email" : "추가 이메일 추가", "Add" : "추가", "You do not have permissions to see the details of this user" : "사용자의 상세정보를 볼 권한이 없습니다", "Add new password" : "새로운 비밀번호를 입력하시오", "Add new email address" : "새로운 이메일 추가하기", + "Add user to group" : "사용자를 그룹에 추가", + "Set user as admin for" : "사용자를 다음에 대한 관리자로 설정", + "Select user quota" : "사용자 할당량 선택", "Delete user" : "유저 지우기", + "Wipe all devices" : "모든 기기 지우기", "Disable user" : "유저 비활성화하기", "Enable user" : "유저 활성화하기", "Resend welcome email" : "환영 메일 다시 보내기", + "In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet." : "기기를 분실했거나 조직에서 이탈할 경우, 이를 통해 모든 기기에 있는 {userid} 관련 Nextcloud 데이터를 원격으로 삭제할 수 있습니다. 해당 기기들이 인터넷에 연결된 경우에 한하여 작동합니다.", + "Remote wipe of devices" : "기기 원격 제거", + "Wipe {userid}'s devices" : "{userid}의 기기 제거", "Cancel" : "취소", "Fully delete {userid}'s account including all their personal files, app data, etc." : "모든 개인 파일, 앱, 데이터 등을 포함한 {userid}계정을 완전히 삭제하기", "Account deletion" : "계정 삭제", "Delete {userid}'s account" : "{userid}의 계정 삭제", "Welcome mail sent!" : "환영 메일을 보냈습니다!", + "Edit User" : "사용자 편집", "{size} used" : "{size} 사용됨", "New user" : "새 사용자", + "Will be autogenerated" : "자동으로 생성될 것임", "Display name" : "표시 이름", "Email" : "이메일", "Default language" : "기본 언어", @@ -216,18 +325,32 @@ OC.L10N.register( "Last login" : "마지막 로그인", "No users in here" : "사용자가 이곳에 없습니다.", "Default quota" : "기본 할당량", + "Common languages" : "공통 언어", + "Other languages" : "다른 언어", + "Password change is disabled because the master key is disabled" : "마스터 키가 비활성화 되어 암호 변경이 비활성화 됨", + "Passwordless authentication requires a secure connection." : "무암호 인증을 위해 보안 연결이 필요합니다.", + "Add WebAuthn device" : "WebAuthn 기기 추가", + "Please authorize your WebAuthn device." : "내 WebAuthn 기기를 인증하십시오.", "Name your device" : "장치 이름 설정", "Adding your device …" : "장치 추가 중 …", + "Server error while trying to add WebAuthn device" : "WebAuthn 기기 추가 시도 중 서버 오류 발생", + "Server error while trying to complete WebAuthn device registration" : "WebAuthn 기기 등록을 마치는 중 오류 발생", "Unnamed device" : "이름 없는 장치", + "Passwordless Authentication" : "무암호 인증", + "Set up your account for passwordless authentication following the FIDO2 standard." : "FIDO2 기준을 준수하여 계정에 무암호 인증을 설정하십시오", + "No devices configured." : "설정된 기기가 없습니다.", + "The following devices are configured for your account:" : "다음의 기기가 계정에 설정되었습니다:", "Your browser does not support WebAuthn." : "WebAuthn이 현재 브라우저를 지원하지 않습니다.", "Your apps" : "내 앱", "Active apps" : "활성화된 앱", "Disabled apps" : "비활성화된 앱", "Updates" : "업데이트", "App bundles" : "앱 번들", + "Featured apps" : "추천 앱 - ", "{license}-licensed" : "{license} 라이선스", "Details" : "자세히", "Changelog" : "변경 기록", + "Enter group name" : "그룹 이름 입력", "Add group" : "그룹 추가", "Active users" : "활성 사용자", "Admins" : "관리자", @@ -246,21 +369,27 @@ OC.L10N.register( "Avatar" : "아바타", "About" : "정보", "Full name" : "전체 이름", + "Additional email" : "추가 이메일", "Headline" : "표제", + "Organisation" : "조직", "Phone number" : "휴대폰 번호", "Role" : "직책", "Twitter" : "트위터", "Website" : "웹사이트", + "Profile visibility" : "프로필 표시 여부", "Show to everyone" : "전체 공개", "Show to logged in users only" : "로그인된 사용자에게 공개", "Hide" : "비공개", "Download and enable" : "다운로드 및 활성화", + "Enable untested app" : "미시험 앱 활성화", "The app will be downloaded from the App Store" : "이 앱이 앱 스토어에서 다운로드됩니다", "This app is not marked as compatible with your Nextcloud version. If you continue you will still be able to install the app. Note that the app might not work as expected." : "이 앱은 현재 Nextcloud 버젼과 호환되지 않습니다. 이 앱을 설치하면, 제대로 작동하지 않을 수 있습니다.", "Never" : "하지 않음", "An error occured during the request. Unable to proceed." : "요청을 보내는 도중 에러가 발생하였습니다. 더 이상 진행할 수 없습니다.", "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "앱이 활성화되었지만, 앱을 업데이트해야 합니다. 5초 후 앱 업데이트 페이지로 넘어갑니다.", "Error: This app cannot be enabled because it makes the server unstable" : "오류: 이 앱은 서버를 불안정하게 만들 수 있어서 활성화할 수 없습니다", + "An error occurred during the request. Unable to proceed." : "요청을 보내는 도중 에러가 발생하였습니다. 더 이상 진행할 수 없습니다.", + "User already exists." : "사용자가 이미 있습니다.", "Administrator documentation" : "관리자 문서", "Documentation" : "문서", "Forum" : "포럼", @@ -283,18 +412,25 @@ OC.L10N.register( "SMTP Username" : "SMTP 사용자 이름", "SMTP Password" : "SMTP 암호", "Save" : "저장", + "Test and verify email settings" : "이메일 설정 테스트 및 검증", "Send email" : "이메일 보내기", - "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the linked documentation for more information." : "당신의 인스턴스의 보안과 성능을 위해서는 모든 것이 정확하게 설정되어야 합니다. 그러기 위해서 자동적으로 몇 가지를 확인하겠습니다. 더 자세한 정보를 위해서 링크된 문서를 참고하세요.", + "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the linked documentation for more information." : "이 인스턴스의 보안과 성능을 위해서 모든 것이 정확하게 설정되어야 합니다. 그러기 위해서 자동적으로 몇 가지를 확인하겠습니다. 더 자세한 정보를 위해서 링크된 문서를 참고하세요.", "All checks passed." : "모든 검사를 통과했습니다.", "There are some errors regarding your setup." : "설정을 살펴본 결과 몇 가지 에러가 있습니다.", "There are some warnings regarding your setup." : "설정을 살펴본 결과 몇 가지 경고할 것이 있습니다.", "Checking for system and security issues." : "시스템과 보안에 대한 문제를 확인하는 중", "Please double check the <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%1$s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"%2$s\">log</a>." : "<a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%1$s\">설치 가이드 ↗</a>를 다시 한 번 확인한 다음 <a href=\"%2$s\">로그</a>의 경고나 에러를 확인하세요.", - "Check the security of your Nextcloud over <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">our security scan ↗</a>." : "<a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">우리의 보안 검사 ↗</a>에서 당신의 Nextcloud의 보안을 점검하세요.", + "Check the security of your Nextcloud over <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">our security scan ↗</a>." : "<a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">우리의 보안 검사 ↗</a>에서 이 Nextcloud의 보안을 점검하세요.", "Version" : "버전", + "You need to enable the File sharing App." : "파일 공유 앱을 활성화해야 합니다.", "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "관리자로 공유 행동을 미세 조정할 수 있습니다. 더 많은 정보를 보려면 문서를 참조하십시오.", "Allow apps to use the Share API" : "앱에서 공유 API를 사용할 수 있도록 허용", + "Set default expiration date for shares" : "공유에 대한 기본 만료 날짜 설정", + "Expire after" : "다음 날짜 후 만료", + "day(s)" : "일", "Enforce expiration date" : "만료 날짜 강제", + "Set default expiration date for shares to other servers" : "다른 서버와의 공유에 대한 기본 만료 날짜 설정", + "Allow users to share via link and emails" : "사용자가 링크와 이메일을 통해 공유하는 것 허용", "Allow public uploads" : "공개 업로드 허용", "Always ask for a password" : "항상 암호 묻기", "Enforce password protection" : "암호 보호 강제", @@ -306,37 +442,49 @@ OC.L10N.register( "These groups will still be able to receive shares, but not to initiate them." : "이 그룹의 사용자들은 다른 사용자가 공유한 파일을 받을 수는 있지만, 자기 파일을 공유할 수는 없습니다.", "This text will be shown on the public link upload page when the file list is hidden." : "파일 목록이 숨겨져 있으면 이 텍스트는 공개 링크 업로드 페이지에 표시됩니다.", "Default share permissions" : "기본 공유 권한", + "Reasons to use Nextcloud in your organization" : "당신의 조직에서 Nextcloud를 사용해야 할 이유", "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "{communityopen}Nextcloud 커뮤니티{linkclose}에서 개발, {githubopen}소스 코드{linkclose}는 {licenseopen}<abbr title=\"Affero General Public License\">AGPL</abbr>{linkclose} 라이선스를 따릅니다.", "Like our Facebook page" : "Facebook 페이지에서 좋아요 누르기", "Follow us on Twitter" : "트위터에서 팔로하기", "Check out our blog" : "블로그 확인하기", "Subscribe to our newsletter" : "뉴스레터 구독하기", + "This community release of Nextcloud is unsupported and instant notifications are unavailable." : "이 Nextcloud 커뮤니티 릴리즈는 지원되지 않으며 즉각적인 알림을 사용할 수 없습니다.", "Profile picture" : "프로필 사진", + "Change privacy level of profile picture" : "프로필 사진에 대한 공개 단계 변경", "Upload new" : "새로 업로드", "Select from Files" : "파일에서 선택", "Remove image" : "그림 삭제", "png or jpg, max. 20 MB" : "PNG, JPG, 최대 20MB", "Picture provided by original account" : "원래 계정에서 제공하는 사진", + "Please note that it can take up to 24 hours for the avatar to get updated everywhere." : "아바타가 모든 곳에 갱신될 때 까지 최대 24시간이 걸릴 수 있습니다.", "Choose as profile picture" : "프로필 사진으로 선택", "You are a member of the following groups:" : "당신은 다음 그룹의 멤버입니다:", "You are using <strong>%s</strong>" : "현재 <strong>%s</strong>를 사용하고 있습니다.", "You are using <strong>%1$s</strong> of <strong>%2$s</strong> (<strong>%3$s %%</strong>)" : "현재 <strong>%2$s</strong> /%1$s</strong>(<strong>%3$s%%</strong>)를 사용하고 있습니다", + "Change privacy level of phone number" : "전화번호에 대한 공개 단계 변경", "Your phone number" : "내 휴대폰 번호", + "Change privacy level of address" : "주소에 대한 공개 단계 변경", "Your postal address" : "내 우편 주소", + "Change privacy level of website" : "웹사이트에 대한 공개 단계 변경", "It can take up to 24 hours before the account is displayed as verified." : "계정이 확인된 것으로 표시될 때까지 최대 24시간이 걸릴 수 있습니다", "Link https://…" : "링크 https://…", + "Change privacy level of Twitter profile" : "트위터 프로필에 대한 공개 단계 변경", "Twitter handle @…" : "트위터 핸들 @…", "Locale" : "지역", "Current password" : "현재 암호", "New password" : "새 암호", "Change password" : "암호 변경", "Use a second factor besides your password to increase security for your account." : "사용자의 계정을 더욱 안전하게 보호하기 위해 암호와 함께 2단계 인증을 사용하세요.", + "If you use third party applications to connect to Nextcloud, please make sure to create and configure an app password for each before enabling second factor authentication." : "Nextcloud에 연결하기 위해 서드파티 애플리케이션을 사용할 경우 2차 인증을 활성화하기 앞서 각 애플리케이션에 대한 앱 암호를 생성, 설정하십시오.", "Migration in progress. Please wait until the migration is finished" : "이전 작업 중입니다. 작업이 완료될 때까지 기다려 주십시오", "Migration started …" : "이전 시작됨...", "Couldn't remove app." : "앱을 삭제할 수 없습니다.", "Couldn't update app." : "앱을 업데이트할 수 없습니다.", "Backend doesn't support password change, but the user's encryption key was updated." : "백엔드에서 암호 변경을 지원하지 않지만 사용자의 암호화 키는 업데이트되었습니다.", + "Could not determine if TLS version of cURL is outdated or not because an error happened during the HTTPS request against https://nextcloud.com. Please check the nextcloud log file for more details." : "https://nextcloud.com에 대한 HTTPS 요청 중 오류가 발생하여 cURL의 TLS 버전이 오래되었는지 확인할 수 없습니다. 자세한 정보는 Nextcloud 로그 파일을 참조하여 주십시오.", "You need to set your user email before being able to send test emails." : "테스트 이메일을 보내기 전 내 주소를 설정해야 합니다.", + "Set as primary mail" : "주 이메일로 지정", + "Change privacy level of email" : "이메일에 대한 공개 단계 변경", "All languages" : "모든 언어", "Everyone" : "모두", "Test email settings" : "이메일 설정 시험", @@ -346,11 +494,17 @@ OC.L10N.register( "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "ownCloud 8.0 이하에서 사용한 이전 암호화 키를 새 키로 이전해야 합니다.", "Start migration" : "이전 시작", "Last job execution ran %s. Something seems wrong." : "마지막 작업이 %s에 실행되었습니다. 무언가 잘못된 것 같습니다.", + "Some jobs haven’t been executed since %s. Please consider increasing the execution frequency." : "%s 이래 몇 가지 작업이 실행되지 않았습니다. 실행 빈도의 증가를 고려하십시오. ", + "Some jobs didn’t execute since %s. Please consider switching to system cron." : "%s 이래 몇 가지 작업이 실행되지 않았습니다. 시스템의 cron으로 변경하는 것을 고려하십시오.", "Last job ran %s." : "마지막 작업이 %s에 실행되었습니다.", "Background job didn’t run yet!" : "배경 작업이 아직 실행되지 않았습니다!", + "For the server to work properly, it's important to configure background jobs correctly. \"Cron\" is the recommended setting. Please see the documentation for more information." : "서버가 적절하게 동작하기 위해 백그라운드 작업을 올바르게 설정하는 것이 중요합니다. \"Cron\"으로 설정하는 것을 권장합니다. 더 많은 정보는 문서를 참조하십시오.", + "Pick background job setting" : "백그라운드 작업 설정 선택", "Recommended" : "추천", "The cron.php needs to be executed by the system user \"%s\"." : "시스템 사용자 \"%s\"(으)로 cron.php를 실행해야 합니다.", "days" : "일", - "No display name set" : "표시 이름이 설정되지 않음" + "Change privacy level of full name" : "전체 이름에 대한 공개 단계 변경", + "No display name set" : "표시 이름이 설정되지 않음", + "The maximum number of OPcache keys is nearly exceeded. To assure that all scripts can be hold in cache, it is recommended to apply <code>opcache.max_accelerated_files</code> to your PHP configuration with a value higher than <code>%s</code>." : "곧 OPcache key가 최대치를 초과할 것으로 보입니다. 모든 스크립트가 캐시에 보관될 수 있도록, PHP 설정에서 <code>opcache.max_accelerated_files</code> 값을 <code>%s</code> 보다 크게 적용하시길 권장합니다. " }, "nplurals=1; plural=0;"); diff --git a/apps/settings/l10n/ko.json b/apps/settings/l10n/ko.json index 9e5d27ccd34..d4c47fac73f 100644 --- a/apps/settings/l10n/ko.json +++ b/apps/settings/l10n/ko.json @@ -40,35 +40,61 @@ "You changed your email address" : "내 이메일 주소를 변경함", "Your email address was changed by an administrator" : "관리자가 내 이메일 주소를 변경함", "You created app password \"{token}\"" : "앱 패스워드 \"{token}\"이 생성되었습니다.", + "An administrator created app password \"{token}\"" : "관리자가 앱 패스워드 \"{token}\"을(를) 생성함", "You deleted app password \"{token}\"" : "앱 패스워드 \"{token}\"이 제거되었습니다.", "You renamed app password \"{token}\" to \"{newToken}\"" : "앱 패스워드 \"{token}\"의 이름을 \"{newToken}\"으로 바꿨습니다.", + "You granted filesystem access to app password \"{token}\"" : "앱 패스워드 \"{token}\"에 대해 파일 시스템 접근을 허가함", + "You revoked filesystem access from app password \"{token}\"" : "앱 패스워드 \"{token}\"에 대해 파일 시스템 접근 권한을 철회함", "Security" : "보안", "You successfully logged in using two-factor authentication (%1$s)" : "2단계 인증으로 로그인함(%1$s)", "A login attempt using two-factor authentication failed (%1$s)" : "2단계 인증 시도가 실패함(%1$s)", + "Remote wipe was started on %1$s" : "원격 제거가 %1$s에 시작됨", + "Remote wipe has finished on %1$s" : "원격 제거가 %1$s에 완료됨", "Your <strong>password</strong> or <strong>email</strong> was modified" : "내 <strong>암호</strong> 및 <strong>이메일</strong>이 변경됨", + "Could not remove app." : "앱을 삭제할 수 없음", + "Could not update app." : "앱을 업데이트 할 수 없음", "Wrong password" : "잘못된 암호", + "Unable to change personal password" : "개인 패스워드를 변경할 수 없음", "Saved" : "저장됨", "No user supplied" : "사용자가 지정되지 않음", + "Unable to change password. Password too long." : "패스워드를 변경할 수 없음. 패스워드가 너무 긺.", "Authentication error" : "인증 오류", "Please provide an admin recovery password; otherwise, all user data will be lost." : "관리자 복구 암호를 입력하십시오. 그렇지 않으면 모든 사용자 데이이터가 초기화됩니다다.", "Wrong admin recovery password. Please check the password and try again." : "관리자 복구 암호가 잘못되었습니다. 암호를 다시 확인하십시오.", + "Backend does not support password change, but the user's encryption key was updated." : "백엔드에서 암호 변경을 지원하지 않지만 사용자의 암호화 키는 업데이트되었습니다.", + "installing and updating apps via the App Store or Federated Cloud Sharing" : "앱 스토어 및 연합 클라우드 공유로 앱 설치 및 업데이트", "Federated Cloud Sharing" : "클라우드 연합 공유", + "cURL is using an outdated %1$s version (%2$s). Please update your operating system or features such as %3$s will not work reliably." : "cURL이 오래된 %1$s 버전을 사용하고 있습니다(%2$s). 운영 체제나 기능을 업데이트하지 않으면 %3$s 등을 안정적으로 사용할 수 없습니다.", + "Could not determine if TLS version of cURL is outdated or not because an error happened during the HTTPS request against https://nextcloud.com. Please check the Nextcloud log file for more details." : "https://nextcloud.com에 대한 HTTPS 요청 중 오류가 발생하여 cURL의 TLS 버전이 오래되었는지 확인할 수 없습니다. 자세한 정보는 Nextcloud 로그 파일을 참조하여 주십시오.", + "The PHP OPcache module is not loaded. For better performance it is recommended to load it into your PHP installation." : "PHP OPcache 모듈이 로드되지 않았습니다. 더 나은 성능을 위해 이를 PHP에 로드하는 것이 권장됩니다.", + "OPcache is disabled. For better performance, it is recommended to apply <code>opcache.enable=1</code> to your PHP configuration." : "OPchache가 비활성화 되었습니다. PHP 설정에서 <code>opcahce.enable=1</code>을 적용하는 것을 권장합니다.", + "OPcache is configured to remove code comments. With OPcache enabled, <code>opcache.save_comments=1</code> must be set for Nextcloud to function." : "OPcache가 code comment를 삭제하도록 설정되어 있습니다. Nextcloud의 원활한 작동을 위해 OPcahce 활성화 시 <code>opcache.save_comments=1</code>을 설정해야 합니다.", + "Nextcloud is not allowed to use the OPcache API. With OPcache enabled, it is highly recommended to include all Nextcloud directories with <code>opcache.restrict_api</code> or unset this setting to disable OPcache API restrictions, to prevent errors during Nextcloud core or app upgrades." : "Nextcloud가 OPcache API를 사용하도록 허용되지 않았습니다. Nextcloud core나 앱 업그레이드 중 에러 발생을 방지하기 위해, OPcache 활성화 시 모든 Nextcloud 디렉토리를 <code>opcahce.restrict_api</code>에 포함하거나 해당 설정을 해제하여 OPcahce API 제한을 비활성화 하는 것을 권장합니다.", + "Nextcloud is not allowed to use the OPcache API. It is highly recommended to include all Nextcloud directories with <code>opcache.restrict_api</code> or unset this setting to disable OPcache API restrictions, to prevent errors during Nextcloud core or app upgrades." : "Nextcloud가 OPcache API를 사용하도록 허용되지 않았습니다. Nextcloud core나 앱 업그레이드 중 에러 발생을 방지하기 위해, OPcache 활성화 시 모든 Nextcloud 디렉토리를 <code>opcahce.restrict_api</code>에 포함하거나 해당 설정을 해제하여 OPcahce API 제한을 비활성화 하는 것을 권장합니다.", + "The maximum number of OPcache keys is nearly exceeded. To assure that all scripts can be kept in the cache, it is recommended to apply <code>opcache.max_accelerated_files</code> to your PHP configuration with a value higher than <code>%s</code>." : "곧 OPcache key가 최대치를 초과할 것으로 보입니다. 모든 스크립트가 캐시에 유지될 수 있도록, PHP 설정에서 <code>opcache.max_accelerated_files</code> 값을 <code>%s</code> 보다 크게 적용하시길 권장합니다. ", + "The OPcache buffer is nearly full. To assure that all scripts can be hold in cache, it is recommended to apply <code>opcache.memory_consumption</code> to your PHP configuration with a value higher than <code>%s</code>." : "곧 OPcache 버퍼가 가득 찰 것으로 보입니다. 모든 스크립트가 캐시에 보관될 수 있도록, PHP 설정에서 <code>opcache.memory_consumption</code> 값을 <code>%s</code> 보다 크게 적용하시길 권장합니다. ", + "The OPcache interned strings buffer is nearly full. To assure that repeating strings can be effectively cached, it is recommended to apply <code>opcache.interned_strings_buffer</code> to your PHP configuration with a value higher than <code>%s</code>." : "곧 OPcache interned buffer가 가득 찰 것으로 보입니다. 반복 문자열이 효율적으로 캐싱될 수 있도록, PHP 설정에서 <code>opcache.interned_strings_buffer</code> 값을 <code>%s</code> 보다 크게 적용하시길 권장합니다. ", "Invalid SMTP password." : "SMTP 암호가 잘못되었습니다.", "Email setting test" : "이메일 설정 시험", "Well done, %s!" : "%s 님, 잘 하셨습니다!", "If you received this email, the email configuration seems to be correct." : "이 이메일을 받으셨다면 이메일 설정이 올바릅니다.", "Email could not be sent. Check your mail server log" : "이메일을 보낼 수 없습니다. 메일 서버 로그를 확인하십시오.", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "이메일을 보내는 중 오류가 발생했습니다. 설정을 확인하십시오.(오류: %s)", + "You need to set your user email before being able to send test emails. Go to %s for that." : "이메일 발송 테스트를 진행하기 앞서 당신의 사용자 이메일을 설정해야 합니다. 설정을 위해 %s(으)로 가십시오.", "Invalid user" : "잘못된 사용자", "Invalid mail address" : "잘못된 이메일 주소", "Settings saved" : "설정 저장됨", "Unable to change full name" : "전체 이름을 변경할 수 없음", "Unable to change email address" : "이메일 주소를 변경할 수 없음", + "Unable to set invalid phone number" : "올바르지 않은 전화번호를 설정할 수 없음", + "Unable to set invalid website" : "올바르지 않은 웹사이트 주소를 설정할 수 없음", + "Some account data was invalid" : "몇 가지 계정 데이터가 올바르지 않음", "In order to verify your Twitter account, post the following tweet on Twitter (please make sure to post it without any line breaks):" : "내 트위터 계정을 확인하려면 다음 트윗을 타임라인에 게시하십시오(줄바꿈을 추가하지 마십시오):", "In order to verify your Website, store the following content in your web-root at '.well-known/CloudIdVerificationCode.txt' (please make sure that the complete text is in one line):" : "내 웹 사이트를 확인하려면 다음 내용을 웹 사이트 루트 디렉터리의 '.well-known/CloudIdVerificationCode.txt' 파일에 게시하십시오(전체 텍스트가 한 줄에 들어가야 함):", "%1$s changed your password on %2$s." : "%1$s 님이 내 암호를 %2$s에 변경했습니다.", "Your password on %s was changed." : "내 %s 암호를 변경했습니다.", "Your password on %s was reset by an administrator." : "관리자가 내 %s 암호를 초기화했습니다.", + "Your password on %s was reset." : "내 %s 암호를 변경했습니다.", "Password for %1$s changed on %2$s" : "%1$s의 암호를 %2$s에 변경함", "Password changed for %s" : "%s의 암호 변경됨", "If you did not request this, please contact an administrator." : "요청하지 않았다면 관리자에게 연락하십시오.", @@ -85,11 +111,13 @@ "Set your password" : "내 암호 설정하기", "Go to %s" : "%s(으)로 이동", "Install Client" : "클라이언트 설치", + "Logged in user must be a subadmin" : "로그인한 사용자는 부관리자여야 합니다.", "Apps" : "앱", "Settings" : "설정", "Personal" : "개인", "Administration" : "관리", "Additional settings" : "고급 설정", + "Admin privileges" : "관리자용 권한", "Groupware" : "그룹웨어", "Overview" : "개요", "Basic settings" : "기본 설정", @@ -105,17 +133,33 @@ "Reshare" : "재공유", "Unlimited" : "무제한", "Verifying" : "검사", + "A background job is pending that checks for user imported SSL certificates. Please check back later." : "사용자가 불러온 SSL 인증서를 확인하는 백그라운드 작업이 진행중입니다. 나중에 다시 확인하십시오.", + "There are some user imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "현재 사용자가 불러온 SSL 인증서 중 Nextcloud 21과 함께 사용할 수 없는 것이 있습니다. 이러한 인증서는 커맨드라인 명령어 \"occ security:certificates:import\"로 불러올 수 있습니다. 데이터 디렉토리 내부에 있는 해당 인증서의 경로가 아래에 표시됩니다.", + "Invalid UUIDs of LDAP users or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "잘못된 LDAP 사용자 또는 그룹 UUID를 발견했습니다. LDAP 설정의 '전문가' 부분에서 \"Override UUID detection\"을 재확인하시고, \"occ ldap:update-uuid\" 명령어를 통해 이를 갱신하십시오.", + "The old server-side-encryption format is enabled. We recommend disabling this." : "구형 포맷의 서버 측 암호화가 활성화된 상태입니다. 이를 비활성화 하는 것을 권장합니다.", + "MariaDB version \"%s\" is used. Nextcloud 21 and higher do not support this version and require MariaDB 10.2 or higher." : "현재 MariaDB \"%s\" 버전이 사용되고 있습니다. Nextcloud 21 및 그 이상의 버전은 이를 지원하지 않습니다. MariaDB 10.2 이상을 사용하십시오.", + "MySQL version \"%s\" is used. Nextcloud 21 and higher do not support this version and require MySQL 8.0 or MariaDB 10.2 or higher." : "현재 MySQL \"%s\" 버전이 사용되고 있습니다. Nextcloud 21 및 그 이상의 버전은 이를 지원하지 않습니다. MySQL 8.0 혹은 MariaDB 10.2 이상을 사용하십시오.", + "PostgreSQL version \"%s\" is used. Nextcloud 21 and higher do not support this version and require PostgreSQL 9.6 or higher." : "현재 PostgreSQL \"%s\" 버전이 사용되고 있습니다. Nextcloud 21 및 그 이상의 버전은 이를 지원하지 않습니다. PostgreSQL 9.6 이상을 사용하십시오.", + "Profile information" : "프로필 정보", + "Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "프로필 사진, 전체 이름, 이메일, 전화번호, 주소, 웹사이트, 트위터, 조직, 직책, 표제, 소개문구 및 프로필 활성화 여부", "Nextcloud settings" : "Nextcloud 환경설정", + "Administration privileges" : "관리 권한", + "Here you can decide which group can access certain sections of the administration settings." : "이곳에서 특정 그룹의 특정 관리자 설정 접근 여부를 설정할 수 있습니다.", "None" : "없음", + "Unable to modify setting" : "설정을 수정할 수 없습니다", "Two-Factor Authentication" : "2단계 인증", + "Two-factor authentication can be enforced for all users and specific groups. If they do not have a two-factor provider configured, they will be unable to log into the system." : "2단계 인증을 모든 유저 또는 특정 그룹에 강제할 수 있습니다. 만약 대상자가 2단계 인증 공급자를 설정하지 않았다면, 대상자는 시스템에 접근할 수 없게 될 것입니다.", "Enforce two-factor authentication" : "2단계 인증 강제하기", "Limit to groups" : "그룹으로 제한", "Enforcement of two-factor authentication can be set for certain groups only." : "2단계 인증 강제는 특정 그룹에게만 적용됩니다.", + "Two-factor authentication is enforced for all members of the following groups." : "2단계 인증이 모든 멤버에게 강제된 그룹은 다음과 같습니다.", "Enforced groups" : "강제된 그룹", + "Two-factor authentication is not enforced for members of the following groups." : "2단계 인증이 강제되지 않은 그룹은 다음과 같습니다.", "Excluded groups" : "제외된 그룹", "When groups are selected/excluded, they use the following logic to determine if a user has 2FA enforced: If no groups are selected, 2FA is enabled for everyone except members of the excluded groups. If groups are selected, 2FA is enabled for all members of these. If a user is both in a selected and excluded group, the selected takes precedence and 2FA is enforced." : "그룹이 선택되거나 제외되었을 때, 다음과 같은 상황을 고려할 수 있습니다. 만약 2단계 인증이 강제되었고, 아무런 그룹이 선택되지 않았다면 제외된 그룹의 멤버를 제외하고 모든 유저에게 2단계 인증이 강제됩니다. 만약 그룹이 선택되었다면 그룹 안의 모든 멤버에게 2단계 인증이 강제됩니다. 만약 유저가 선택된 그룹과 제외된 그룹에 동시에 속해있다면, 선택된 그룹이 우선되며 2단계 인증이 강제됩니다.", "Save changes" : "변경 사항 저장", "All" : "모두", + "Limit app usage to groups" : "앱 사용을 그룹으로 제한합니다.", "No results" : "결과 없음", "Update to {version}" : "{version}(으)로 업데이트", "Remove" : "삭제", @@ -129,16 +173,23 @@ "User documentation" : "사용자 문서", "Admin documentation" : "관리 문서", "Developer documentation" : "개발자 문서", + "This app is supported via your current Nextcloud subscription." : "이 앱은 당신의 현재 Nextcloud 구독을 통해 지원됩니다.", + "Supported" : "지원됨", "Featured" : "추천", + "Update to {update}" : "{update}(으)로 업데이트", + "All apps are up-to-date." : "모든 앱이 최신 버전입니다.", "No apps found for your version" : "설치된 버전에 대한 앱 없음", "Disable all" : "전체 비활성화", "Enable all" : "모두 활성화", "_%n app has an update available_::_%n apps have an update available_" : ["%n앱을 업데이트 할 수 있습니다."], + "_Update_::_Update all_" : ["모두 업데이트"], + "Marked for remote wipe" : "원격 제거를 위해 지정됨", "Device settings" : "디바이스 설정", "Allow filesystem access" : "파일시스템 접근 허용", "Rename" : "이름 바꾸기", "Revoke" : "취소", "Wipe device" : "디바이스 지우기", + "Revoking this token might prevent the wiping of your device if it has not started the wipe yet." : "기기 제거가 아직 시작되지 않았다면, 이 토큰을 취소하여 기기의 제거를 방지할 수 있습니다.", "Internet Explorer" : "Internet Explorer", "Edge" : "Edge", "Firefox" : "Firefox", @@ -157,6 +208,7 @@ "Confirm wipe" : "삭제 완료", "Error while creating device token" : "장치 토큰을 만드는 중 오류가 발생했습니다", "Error while deleting the token" : "토큰을 삭제하는 중 오류가 발생했습니다", + "Error while wiping the device with the token" : "토큰으로 기기를 제거하는 도중 오류 발생", "App name" : "앱 이름", "Create new app password" : "새로운 앱 암호 만들기", "Use the credentials below to configure your app or device." : "앱 또는 장치를 구성하는 아래의 자격 증명을 사용합니다.", @@ -168,12 +220,25 @@ "Copied!" : "복사 성공!", "Copy" : "복사", "Could not copy app password. Please copy it manually." : "앱 비밀번호를 복사할 수 없습니다. 직접 옮겨 적으십시오.", + "For the server to work properly, it's important to configure background jobs correctly. Cron is the recommended setting. Please see the documentation for more information." : "서버가 적절하게 동작하기 위해 백그라운드 작업을 올바르게 설정하는 것이 중요합니다. Cron으로 설정하는 것을 권장합니다. 더 많은 정보는 문서를 참조하십시오.", + "Last job execution ran {time}. Something seems wrong." : "마지막 작업이 {time}에 실행되었습니다. 무언가 잘못된 것 같습니다.", + "Last job ran {relativeTime}." : "마지막 작업이 {relativeTime}에 실행되었음", + "Background job did not run yet!" : "백그라운드 작업이 아직 실행되지 않았습니다!", + "Execute one task with each page loaded. Use case: Single user instance." : "각 페이지를 로드할 때 마다 하나의 작업을 시행. 사용례: 1인 사용자 인스턴스", + "cron.php is registered at a webcron service to call cron.php every 5 minutes over HTTP. Use case: Very small instance (1–5 users depending on the usage)." : "cron.php를 webcron 서비스에 등록하여 cron.php를 매 5분마다 HTTP 상에서 호출. 사용례: 아주 작은 인스턴스 (사용자가 1~5명인 규모 - 사용량에 따라 다름)", + "Cron (Recommended)" : "Cron (권장됨)", "To run this you need the PHP POSIX extension. See {linkstart}PHP documentation{linkend} for more details." : "이 항목을 실행하려면 PHP POSIX 확장이 필요합니다. 자세한 사항은 {linkstart}PHP 문서{linkend}를 참조하십시오.", + "Use system cron service to call the cron.php file every 5 minutes. Recommended for all instances." : "시스템 Cron 서비스를 사용하여 cron.php를 매 5분마다 호출. 모든 인스턴스에 권장.", + "The cron.php needs to be executed by the system user \"{user}\"." : "시스템 사용자 \"{user}\"(으)로 cron.php를 실행해야 합니다.", + "Unable to update background job mode" : "백그라운드 작업 모드를 업데이트 할 수 없음", "Profile" : "프로필", + "Enable or disable profile by default for new users." : "신규 사용자에 대한 프로필 기본 사용 여부를 설정하십시오.", "Enable" : "사용함", + "Unable to update profile default setting" : "프로필 기본 설정을 업데이트 할 수 없음", "Server-side encryption" : "서버 측 암호화", "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "서버 측 암호화를 사용하면 이 서버에 업로드되는 파일을 암호화할 수 있습니다. 성능 감소 등 제약 사항이 있으므로 필요한 경우에만 사용하십시오.", "Enable server-side encryption" : "서버 측 암호화 사용", + "Please read carefully before activating server-side encryption:" : "서버 측 암호화를 활성화하기 전에 읽어 보십시오:", "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "암호화를 사용하면, 사용하기 시작한 시간 이후에 서버에 업로드된 모든 파일이 암호화됩니다. 나중에 암호화를 사용하지 않으려면 사용하고 있는 암호화 모듈에서 비활성화를 지원해야 하고 모든 사전 조건(예: 복구 키 설정)을 만족해야 합니다.", "Encryption alone does not guarantee security of the system. Please see documentation for more information about how the encryption app works, and the supported use cases." : "암호화만으로 시스템의 보안을 보장할 수 없습니다. 암호화 응용 프로그램 작동 방식 및 지원되는 사용 사례에 대한 자세한 내용은 설명서를 참조하십시오.", "Be aware that encryption always increases the file size." : "암호화된 파일의 크기는 항상 커집니다.", @@ -181,28 +246,72 @@ "This is the final warning: Do you really want to enable encryption?" : "마지막 경고입니다. 암호화를 활성화하시겠습니까?", "No encryption module loaded, please enable an encryption module in the app menu." : "암호화 모듈을 불러오지 않았습니다. 앱 메뉴에서 암호화 모듈을 활성화하십시오.", "Select default encryption module:" : "기본 암호화 모듈 선택:", + "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the \"Default encryption module\" and run {command}" : "과거에 사용하였던(ownCloud <= 8.0) 암호화된 데이터에서 키를 이전해야 합니다. \"기본 암호화 모듈\"을 활성화한 다음 {command}(을)를 실행하십시오", + "Unable to update server side encryption config" : "서버 측 암호화 설정을 갱신할 수 없음", + "Rename group" : "그룹 이름 바꾸기", "Remove group" : "그룹 지우기", "You are about to remove the group {group}. The users will NOT be deleted." : "당신은 {group} 그룹을 지우려고 합니다. 그룹의 사용자들은 삭제되지 않습니다.", "Please confirm the group removal " : "그룹 지우기를 확인해주세요.", + "Your biography" : "내 소개문구", + "Unable to update biography" : "소개문구를 갱신할 수 없음", + "Your full name" : "내 전체 이름", + "Unable to update full name" : "전체 이름을 갱신할 수 없음", + "No full name set" : "전체 이름이 설정되지 않음", + "Email options" : "이메일 옵션", + "Primary email for password reset and notifications" : "암호 초기화 및 알림 수신용 주 이메일 주소", + "Remove primary email" : "주 이메일 삭제", + "Delete email" : "이메일 삭제", + "Unset as primary email" : "주 이메일 지정 해제", + "This address is not confirmed" : "이 주소는 확인되지 않음", + "Set as primary email" : "주 이메일로 지정", "Your email address" : "이메일 주소", + "Additional email address {index}" : "추가 이메일 주소 {index}", + "Unable to delete primary email address" : "주 이메일 주소를 삭제할 수 없음", + "Unable to update primary email address" : "주 이메일 주소를 갱신할 수 없음", + "Unable to add additional email address" : "추가 이메일 주소를 추가할 수 없음", + "Unable to update additional email address" : "추가 이메일 주소를 갱신할 수 없음", + "Unable to delete additional email address" : "추가 이메일 주소를 삭제할 수 없음", "No email address set" : "이메일 주소가 설정되지 않음", + "Additional emails" : "추가 이메일", + "Your headline" : "내 표제", + "Unable to update headline" : "표제를 갱신할 수 없음", "Language" : "언어", "Help translate" : "번역 돕기", + "Unable to update language" : "언어를 갱신할 수 없음", + "No language set" : "언어가 설정되지 않음", + "Your organisation" : "내 조직", + "Unable to update organisation" : "조직을 갱신할 수 없음", + "Edit your Profile visibility" : "프로필 표시 여부 편집", + "Enable Profile" : "프로필 활성화", + "Unable to update profile enabled state" : "프로필 활성화 여부를 갱신할 수 없음", + "Unable to update visibility of {displayId}" : "{displayId}의 표시 여부를 갱신할 수 없음", + "Your role" : "내 직책", + "Unable to update role" : "직책을 갱신할 수 없음", + "Add additional email" : "추가 이메일 추가", "Add" : "추가", "You do not have permissions to see the details of this user" : "사용자의 상세정보를 볼 권한이 없습니다", "Add new password" : "새로운 비밀번호를 입력하시오", "Add new email address" : "새로운 이메일 추가하기", + "Add user to group" : "사용자를 그룹에 추가", + "Set user as admin for" : "사용자를 다음에 대한 관리자로 설정", + "Select user quota" : "사용자 할당량 선택", "Delete user" : "유저 지우기", + "Wipe all devices" : "모든 기기 지우기", "Disable user" : "유저 비활성화하기", "Enable user" : "유저 활성화하기", "Resend welcome email" : "환영 메일 다시 보내기", + "In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet." : "기기를 분실했거나 조직에서 이탈할 경우, 이를 통해 모든 기기에 있는 {userid} 관련 Nextcloud 데이터를 원격으로 삭제할 수 있습니다. 해당 기기들이 인터넷에 연결된 경우에 한하여 작동합니다.", + "Remote wipe of devices" : "기기 원격 제거", + "Wipe {userid}'s devices" : "{userid}의 기기 제거", "Cancel" : "취소", "Fully delete {userid}'s account including all their personal files, app data, etc." : "모든 개인 파일, 앱, 데이터 등을 포함한 {userid}계정을 완전히 삭제하기", "Account deletion" : "계정 삭제", "Delete {userid}'s account" : "{userid}의 계정 삭제", "Welcome mail sent!" : "환영 메일을 보냈습니다!", + "Edit User" : "사용자 편집", "{size} used" : "{size} 사용됨", "New user" : "새 사용자", + "Will be autogenerated" : "자동으로 생성될 것임", "Display name" : "표시 이름", "Email" : "이메일", "Default language" : "기본 언어", @@ -214,18 +323,32 @@ "Last login" : "마지막 로그인", "No users in here" : "사용자가 이곳에 없습니다.", "Default quota" : "기본 할당량", + "Common languages" : "공통 언어", + "Other languages" : "다른 언어", + "Password change is disabled because the master key is disabled" : "마스터 키가 비활성화 되어 암호 변경이 비활성화 됨", + "Passwordless authentication requires a secure connection." : "무암호 인증을 위해 보안 연결이 필요합니다.", + "Add WebAuthn device" : "WebAuthn 기기 추가", + "Please authorize your WebAuthn device." : "내 WebAuthn 기기를 인증하십시오.", "Name your device" : "장치 이름 설정", "Adding your device …" : "장치 추가 중 …", + "Server error while trying to add WebAuthn device" : "WebAuthn 기기 추가 시도 중 서버 오류 발생", + "Server error while trying to complete WebAuthn device registration" : "WebAuthn 기기 등록을 마치는 중 오류 발생", "Unnamed device" : "이름 없는 장치", + "Passwordless Authentication" : "무암호 인증", + "Set up your account for passwordless authentication following the FIDO2 standard." : "FIDO2 기준을 준수하여 계정에 무암호 인증을 설정하십시오", + "No devices configured." : "설정된 기기가 없습니다.", + "The following devices are configured for your account:" : "다음의 기기가 계정에 설정되었습니다:", "Your browser does not support WebAuthn." : "WebAuthn이 현재 브라우저를 지원하지 않습니다.", "Your apps" : "내 앱", "Active apps" : "활성화된 앱", "Disabled apps" : "비활성화된 앱", "Updates" : "업데이트", "App bundles" : "앱 번들", + "Featured apps" : "추천 앱 - ", "{license}-licensed" : "{license} 라이선스", "Details" : "자세히", "Changelog" : "변경 기록", + "Enter group name" : "그룹 이름 입력", "Add group" : "그룹 추가", "Active users" : "활성 사용자", "Admins" : "관리자", @@ -244,21 +367,27 @@ "Avatar" : "아바타", "About" : "정보", "Full name" : "전체 이름", + "Additional email" : "추가 이메일", "Headline" : "표제", + "Organisation" : "조직", "Phone number" : "휴대폰 번호", "Role" : "직책", "Twitter" : "트위터", "Website" : "웹사이트", + "Profile visibility" : "프로필 표시 여부", "Show to everyone" : "전체 공개", "Show to logged in users only" : "로그인된 사용자에게 공개", "Hide" : "비공개", "Download and enable" : "다운로드 및 활성화", + "Enable untested app" : "미시험 앱 활성화", "The app will be downloaded from the App Store" : "이 앱이 앱 스토어에서 다운로드됩니다", "This app is not marked as compatible with your Nextcloud version. If you continue you will still be able to install the app. Note that the app might not work as expected." : "이 앱은 현재 Nextcloud 버젼과 호환되지 않습니다. 이 앱을 설치하면, 제대로 작동하지 않을 수 있습니다.", "Never" : "하지 않음", "An error occured during the request. Unable to proceed." : "요청을 보내는 도중 에러가 발생하였습니다. 더 이상 진행할 수 없습니다.", "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "앱이 활성화되었지만, 앱을 업데이트해야 합니다. 5초 후 앱 업데이트 페이지로 넘어갑니다.", "Error: This app cannot be enabled because it makes the server unstable" : "오류: 이 앱은 서버를 불안정하게 만들 수 있어서 활성화할 수 없습니다", + "An error occurred during the request. Unable to proceed." : "요청을 보내는 도중 에러가 발생하였습니다. 더 이상 진행할 수 없습니다.", + "User already exists." : "사용자가 이미 있습니다.", "Administrator documentation" : "관리자 문서", "Documentation" : "문서", "Forum" : "포럼", @@ -281,18 +410,25 @@ "SMTP Username" : "SMTP 사용자 이름", "SMTP Password" : "SMTP 암호", "Save" : "저장", + "Test and verify email settings" : "이메일 설정 테스트 및 검증", "Send email" : "이메일 보내기", - "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the linked documentation for more information." : "당신의 인스턴스의 보안과 성능을 위해서는 모든 것이 정확하게 설정되어야 합니다. 그러기 위해서 자동적으로 몇 가지를 확인하겠습니다. 더 자세한 정보를 위해서 링크된 문서를 참고하세요.", + "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the linked documentation for more information." : "이 인스턴스의 보안과 성능을 위해서 모든 것이 정확하게 설정되어야 합니다. 그러기 위해서 자동적으로 몇 가지를 확인하겠습니다. 더 자세한 정보를 위해서 링크된 문서를 참고하세요.", "All checks passed." : "모든 검사를 통과했습니다.", "There are some errors regarding your setup." : "설정을 살펴본 결과 몇 가지 에러가 있습니다.", "There are some warnings regarding your setup." : "설정을 살펴본 결과 몇 가지 경고할 것이 있습니다.", "Checking for system and security issues." : "시스템과 보안에 대한 문제를 확인하는 중", "Please double check the <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%1$s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"%2$s\">log</a>." : "<a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%1$s\">설치 가이드 ↗</a>를 다시 한 번 확인한 다음 <a href=\"%2$s\">로그</a>의 경고나 에러를 확인하세요.", - "Check the security of your Nextcloud over <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">our security scan ↗</a>." : "<a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">우리의 보안 검사 ↗</a>에서 당신의 Nextcloud의 보안을 점검하세요.", + "Check the security of your Nextcloud over <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">our security scan ↗</a>." : "<a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">우리의 보안 검사 ↗</a>에서 이 Nextcloud의 보안을 점검하세요.", "Version" : "버전", + "You need to enable the File sharing App." : "파일 공유 앱을 활성화해야 합니다.", "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "관리자로 공유 행동을 미세 조정할 수 있습니다. 더 많은 정보를 보려면 문서를 참조하십시오.", "Allow apps to use the Share API" : "앱에서 공유 API를 사용할 수 있도록 허용", + "Set default expiration date for shares" : "공유에 대한 기본 만료 날짜 설정", + "Expire after" : "다음 날짜 후 만료", + "day(s)" : "일", "Enforce expiration date" : "만료 날짜 강제", + "Set default expiration date for shares to other servers" : "다른 서버와의 공유에 대한 기본 만료 날짜 설정", + "Allow users to share via link and emails" : "사용자가 링크와 이메일을 통해 공유하는 것 허용", "Allow public uploads" : "공개 업로드 허용", "Always ask for a password" : "항상 암호 묻기", "Enforce password protection" : "암호 보호 강제", @@ -304,37 +440,49 @@ "These groups will still be able to receive shares, but not to initiate them." : "이 그룹의 사용자들은 다른 사용자가 공유한 파일을 받을 수는 있지만, 자기 파일을 공유할 수는 없습니다.", "This text will be shown on the public link upload page when the file list is hidden." : "파일 목록이 숨겨져 있으면 이 텍스트는 공개 링크 업로드 페이지에 표시됩니다.", "Default share permissions" : "기본 공유 권한", + "Reasons to use Nextcloud in your organization" : "당신의 조직에서 Nextcloud를 사용해야 할 이유", "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "{communityopen}Nextcloud 커뮤니티{linkclose}에서 개발, {githubopen}소스 코드{linkclose}는 {licenseopen}<abbr title=\"Affero General Public License\">AGPL</abbr>{linkclose} 라이선스를 따릅니다.", "Like our Facebook page" : "Facebook 페이지에서 좋아요 누르기", "Follow us on Twitter" : "트위터에서 팔로하기", "Check out our blog" : "블로그 확인하기", "Subscribe to our newsletter" : "뉴스레터 구독하기", + "This community release of Nextcloud is unsupported and instant notifications are unavailable." : "이 Nextcloud 커뮤니티 릴리즈는 지원되지 않으며 즉각적인 알림을 사용할 수 없습니다.", "Profile picture" : "프로필 사진", + "Change privacy level of profile picture" : "프로필 사진에 대한 공개 단계 변경", "Upload new" : "새로 업로드", "Select from Files" : "파일에서 선택", "Remove image" : "그림 삭제", "png or jpg, max. 20 MB" : "PNG, JPG, 최대 20MB", "Picture provided by original account" : "원래 계정에서 제공하는 사진", + "Please note that it can take up to 24 hours for the avatar to get updated everywhere." : "아바타가 모든 곳에 갱신될 때 까지 최대 24시간이 걸릴 수 있습니다.", "Choose as profile picture" : "프로필 사진으로 선택", "You are a member of the following groups:" : "당신은 다음 그룹의 멤버입니다:", "You are using <strong>%s</strong>" : "현재 <strong>%s</strong>를 사용하고 있습니다.", "You are using <strong>%1$s</strong> of <strong>%2$s</strong> (<strong>%3$s %%</strong>)" : "현재 <strong>%2$s</strong> /%1$s</strong>(<strong>%3$s%%</strong>)를 사용하고 있습니다", + "Change privacy level of phone number" : "전화번호에 대한 공개 단계 변경", "Your phone number" : "내 휴대폰 번호", + "Change privacy level of address" : "주소에 대한 공개 단계 변경", "Your postal address" : "내 우편 주소", + "Change privacy level of website" : "웹사이트에 대한 공개 단계 변경", "It can take up to 24 hours before the account is displayed as verified." : "계정이 확인된 것으로 표시될 때까지 최대 24시간이 걸릴 수 있습니다", "Link https://…" : "링크 https://…", + "Change privacy level of Twitter profile" : "트위터 프로필에 대한 공개 단계 변경", "Twitter handle @…" : "트위터 핸들 @…", "Locale" : "지역", "Current password" : "현재 암호", "New password" : "새 암호", "Change password" : "암호 변경", "Use a second factor besides your password to increase security for your account." : "사용자의 계정을 더욱 안전하게 보호하기 위해 암호와 함께 2단계 인증을 사용하세요.", + "If you use third party applications to connect to Nextcloud, please make sure to create and configure an app password for each before enabling second factor authentication." : "Nextcloud에 연결하기 위해 서드파티 애플리케이션을 사용할 경우 2차 인증을 활성화하기 앞서 각 애플리케이션에 대한 앱 암호를 생성, 설정하십시오.", "Migration in progress. Please wait until the migration is finished" : "이전 작업 중입니다. 작업이 완료될 때까지 기다려 주십시오", "Migration started …" : "이전 시작됨...", "Couldn't remove app." : "앱을 삭제할 수 없습니다.", "Couldn't update app." : "앱을 업데이트할 수 없습니다.", "Backend doesn't support password change, but the user's encryption key was updated." : "백엔드에서 암호 변경을 지원하지 않지만 사용자의 암호화 키는 업데이트되었습니다.", + "Could not determine if TLS version of cURL is outdated or not because an error happened during the HTTPS request against https://nextcloud.com. Please check the nextcloud log file for more details." : "https://nextcloud.com에 대한 HTTPS 요청 중 오류가 발생하여 cURL의 TLS 버전이 오래되었는지 확인할 수 없습니다. 자세한 정보는 Nextcloud 로그 파일을 참조하여 주십시오.", "You need to set your user email before being able to send test emails." : "테스트 이메일을 보내기 전 내 주소를 설정해야 합니다.", + "Set as primary mail" : "주 이메일로 지정", + "Change privacy level of email" : "이메일에 대한 공개 단계 변경", "All languages" : "모든 언어", "Everyone" : "모두", "Test email settings" : "이메일 설정 시험", @@ -344,11 +492,17 @@ "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "ownCloud 8.0 이하에서 사용한 이전 암호화 키를 새 키로 이전해야 합니다.", "Start migration" : "이전 시작", "Last job execution ran %s. Something seems wrong." : "마지막 작업이 %s에 실행되었습니다. 무언가 잘못된 것 같습니다.", + "Some jobs haven’t been executed since %s. Please consider increasing the execution frequency." : "%s 이래 몇 가지 작업이 실행되지 않았습니다. 실행 빈도의 증가를 고려하십시오. ", + "Some jobs didn’t execute since %s. Please consider switching to system cron." : "%s 이래 몇 가지 작업이 실행되지 않았습니다. 시스템의 cron으로 변경하는 것을 고려하십시오.", "Last job ran %s." : "마지막 작업이 %s에 실행되었습니다.", "Background job didn’t run yet!" : "배경 작업이 아직 실행되지 않았습니다!", + "For the server to work properly, it's important to configure background jobs correctly. \"Cron\" is the recommended setting. Please see the documentation for more information." : "서버가 적절하게 동작하기 위해 백그라운드 작업을 올바르게 설정하는 것이 중요합니다. \"Cron\"으로 설정하는 것을 권장합니다. 더 많은 정보는 문서를 참조하십시오.", + "Pick background job setting" : "백그라운드 작업 설정 선택", "Recommended" : "추천", "The cron.php needs to be executed by the system user \"%s\"." : "시스템 사용자 \"%s\"(으)로 cron.php를 실행해야 합니다.", "days" : "일", - "No display name set" : "표시 이름이 설정되지 않음" + "Change privacy level of full name" : "전체 이름에 대한 공개 단계 변경", + "No display name set" : "표시 이름이 설정되지 않음", + "The maximum number of OPcache keys is nearly exceeded. To assure that all scripts can be hold in cache, it is recommended to apply <code>opcache.max_accelerated_files</code> to your PHP configuration with a value higher than <code>%s</code>." : "곧 OPcache key가 최대치를 초과할 것으로 보입니다. 모든 스크립트가 캐시에 보관될 수 있도록, PHP 설정에서 <code>opcache.max_accelerated_files</code> 값을 <code>%s</code> 보다 크게 적용하시길 권장합니다. " },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/settings/l10n/mk.js b/apps/settings/l10n/mk.js index dc2ab54391d..9a21e6f948e 100644 --- a/apps/settings/l10n/mk.js +++ b/apps/settings/l10n/mk.js @@ -43,6 +43,7 @@ OC.L10N.register( "You changed your email address" : "Ја променивте вашата адреса на е-пошта", "Your email address was changed by an administrator" : "Вашата адреса на е-пошта е променета од страна на администраторот", "You created app password \"{token}\"" : "Креиравте лозинка за апликација \"{token}\"", + "An administrator created app password \"{token}\"" : "Администраторот креираше лозинка за апликација \"{token}\"", "You deleted app password \"{token}\"" : "Избришавте лозинка за апликација \"{token}\"", "You renamed app password \"{token}\" to \"{newToken}\"" : "Ја променивте лозинката за апликација \"{token}\" во \"{newToken}\"", "You granted filesystem access to app password \"{token}\"" : "Издадовте дозвола за пристап со лозинка на апликација до вашите датотеки \"{token}\"", @@ -53,21 +54,31 @@ OC.L10N.register( "Remote wipe was started on %1$s" : "Далечинското бришење е започна на %1$s", "Remote wipe has finished on %1$s" : "Далечинското бришење заврши на %1$s", "Your <strong>password</strong> or <strong>email</strong> was modified" : "Вашата <strong>лозинка</strong> или <strong>е-пошта</strong> е променета", + "Could not remove app." : "Не може да ја се избрише апликацијата.", + "Could not update app." : "Не може да ја се ажурира апликацијата.", "Wrong password" : "Погрешна лозинка", + "Unable to change personal password" : "Неможе да се промени сопствената лозинката", "Saved" : "Зачувано", "No user supplied" : "Нема корисничко име", + "Unable to change password. Password too long." : "Неможе да се промени лозинката. Лозинката е премногу долга.", "Authentication error" : "Грешка во автентикација", "Please provide an admin recovery password; otherwise, all user data will be lost." : "Ве молам дадете лозинка за поврат на администраторот; во спротивно, сите кориснички податоци ќе бидат изгубени.", "Wrong admin recovery password. Please check the password and try again." : "Погрешна лозинка за поврат на администраторот. Ве молам проверете ја лозинката и пробајте повторно.", + "Backend does not support password change, but the user's encryption key was updated." : "Позадината не подржува промена на лозинката, но корисничкиот клуч за енкрипција е ажуриран.", "installing and updating apps via the App Store or Federated Cloud Sharing" : "инсталирање и ажурирање на апликации преку продавницата за апликации или Федерално споделување", "Federated Cloud Sharing" : "Федеретивно споделување", "cURL is using an outdated %1$s version (%2$s). Please update your operating system or features such as %3$s will not work reliably." : "cURL користи застарена %1$s верзија (%2$s). Ве молиме ажурирајте го вашиот оперативен систем или можностите како %3$s нема да работат безбедно.", + "Could not determine if TLS version of cURL is outdated or not because an error happened during the HTTPS request against https://nextcloud.com. Please check the Nextcloud log file for more details." : "Неможе да се одреди TLS верзијата на cURL или не е ажурирана и затоа настанува грешка при HTTPS барањето до https://nextcloud.com. Проверете ги записите во nextcloud за повеќе детали.", + "The PHP OPcache module is not loaded. For better performance it is recommended to load it into your PHP installation." : "PHP модулот OPcache не е вчитан. За да имате подобри перформанси е препорачливо да го вчитате во вашата PHP инсталација.", + "OPcache is disabled. For better performance, it is recommended to apply <code>opcache.enable=1</code> to your PHP configuration." : "OPcache модулот е оневозможен. За подобри перформанси препорачливо е да го овозможите <code>opcache.enable=1</code> во вашата PHP конфигурација.", + "OPcache is configured to remove code comments. With OPcache enabled, <code>opcache.save_comments=1</code> must be set for Nextcloud to function." : "OPcache е конфигуриран за да ги брише коментарите во кодовите. Со овозможен OPcache, <code>opcache.save_comments=1</code> мора да се постави за да функционира Nextcloud.", "Invalid SMTP password." : "Грешна SMTP лозинка.", "Email setting test" : "Тест за параметри на е-пошта", "Well done, %s!" : "Добро сторено, %s!", "If you received this email, the email configuration seems to be correct." : "Ако ја примивте оваа порака, тоа значи дека конфигурацијата за е-пошта е правилно поставена.", "Email could not be sent. Check your mail server log" : "Порака преку Е-пошта неможе да се испрати. Проверете го записот во е-пошта серверот", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Се случи грешка при праќање на порака. Ве молам проверете ги вашите параметри. (Error: %s)", + "You need to set your user email before being able to send test emails. Go to %s for that." : "Треба да ја поставите вашата е-пошта адреса пред да можете да испратите тест пораки. Одете во %s за тоа.", "Invalid user" : "Неправилен корисник", "Invalid mail address" : "Неправилна електронска адреса/пошта", "Settings saved" : "Параматрите се зачувани", @@ -123,8 +134,14 @@ OC.L10N.register( "A background job is pending that checks for user imported SSL certificates. Please check back later." : "Позадинското извржување на работите се на чекање бидејќи се проверуваат некој SSL сертификати што се увезени од корисник. Вратете се подоцна.", "There are some user imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Постојат некој увезени SSL сертификати, во наредната верзија на Nextcloud 21 нема да се користи. Истите можат да се увезат преку командната линија со внесување на командата \"occ security:certificates:import\". Нивните патеки во директориумот со податоци се прикажани подолу. ", "The old server-side-encryption format is enabled. We recommend disabling this." : "Овозможен е стар формат за криптирање од страна на серверот. Препорачуваме да го оневозможите ова.", + "MariaDB version \"%s\" is used. Nextcloud 21 and higher do not support this version and require MariaDB 10.2 or higher." : "Се користи MariaDB верзија\"%s\". Nextcloud 21 и поголемите верзии, повеќе нема да ја поддржува оваа верзија и потебно е да ја ажурирате на верзија 10.2 или понова.", + "MySQL version \"%s\" is used. Nextcloud 21 and higher do not support this version and require MySQL 8.0 or MariaDB 10.2 or higher." : "Се користи MySQL верзија\"%s\". Nextcloud 21 и поголемите верзии, повеќе нема да ја поддржува оваа верзија и потебно е да ја ажурирате на верзија 8.0 или MariaDB 10.2 или понова.", + "PostgreSQL version \"%s\" is used. Nextcloud 21 and higher do not support this version and require PostgreSQL 9.6 or higher." : "Се користи PostgreSQL верзија\"%s\". Nextcloud 21 и поголемите верзии, повеќе нема да ја поддржува оваа верзија и потебно е да ја ажурирате на верзија 9.6 или понова.", + "Profile information" : "Информации за профилот", + "Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Слика на профил, име и презиме, е-пошта, телефонски број, адреса, њеб страна, Twitter, организација, улога, наслов, биографиј и дали вашиот профил е овозможен", "Nextcloud settings" : "Nextcloud параметри", "Administration privileges" : "Административни привилегии", + "Here you can decide which group can access certain sections of the administration settings." : "Овде можете да одлучите која група може да пристапи до одредени делови од параметрите за администрација.", "None" : "Ништо", "Unable to modify setting" : "Неможе да се ажурираат параметрите", "Two-Factor Authentication" : "Двофакторна автентикација", @@ -158,17 +175,20 @@ OC.L10N.register( "Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "Истакнати апликации се развиени од и во рамките на заедницата. Тие нудат централизирана функционалност и се спремни за користење.", "Featured" : "Истакнати", "Update to {update}" : "Надгради на {update}", + "All apps are up-to-date." : "Сите апликации се ажурирани.", "Results from other categories" : "Резултати од други категории", "No apps found for your version" : "За вашата верзија не се пронајдени апликации", "Disable all" : "Оневозможи ги сите", "Enable all" : "Овозможи ги сите", "_%n app has an update available_::_%n apps have an update available_" : ["За %n апликација има достапно ажурирање","За %n апликации има достапно ажурирање"], + "_Update_::_Update all_" : ["Ажурирај","Ажурирај ги сите"], "Marked for remote wipe" : "Означи за далечинско бришење", "Device settings" : "Параметри за уреди", "Allow filesystem access" : "Дозвола за пристап до податоци", "Rename" : "Преименувај", "Revoke" : "Одземи", "Wipe device" : "Избриши уред", + "Revoking this token might prevent the wiping of your device if it has not started the wipe yet." : "Одземањето на овој токен може да спречи бришење на вашиот уред ако сè уште не е избришано.", "Internet Explorer" : "Internet Explorer", "Edge" : "Edge", "Firefox" : "Firefox", @@ -205,12 +225,27 @@ OC.L10N.register( "Copied!" : "Копирано!", "Copy" : "Копирај", "Could not copy app password. Please copy it manually." : "Неможе да се копира лозинката за апликација. Ве молиме копирајте ја рачно.", + "For the server to work properly, it's important to configure background jobs correctly. Cron is the recommended setting. Please see the documentation for more information." : "За серверот да работи правилно, важно е да ги конфигурирате задачите кој се извршуваат во позадина. За големи истанци 'Cron' е препорачаната поставка. Погледнете ја документацијата за повеќе информации.", + "Last job execution ran {time}. Something seems wrong." : "Последно извршување на задачите: {time}. Нешто не е во ред.", + "Last job ran {relativeTime}." : "Последната процедура се извршуваше {relativeTime}.", + "Background job did not run yet!" : "Сеуште нема извршено ниедна задача!", + "AJAX" : "AJAX", + "Execute one task with each page loaded. Use case: Single user instance." : "Извржува по една задача со секоја вчитака страница. Се користи за инстанца со еден корисник.", + "Webcron" : "Webcron", + "cron.php is registered at a webcron service to call cron.php every 5 minutes over HTTP. Use case: Very small instance (1–5 users depending on the usage)." : "cron.php треба да се регистрира на webcron сервис за да ја повикува процедурата секој 5 минути преку HTTP. Се користи за помали истанци (1-5 корисника во зависност на искористувањето).", + "Cron (Recommended)" : "Cron (Препорачано)", "To run this you need the PHP POSIX extension. See {linkstart}PHP documentation{linkend} for more details." : "За да го извршите ова, треба PHP POSIX додаток. Погледни во {linkstart}PHP документацијата{linkend} за повеќе детали.", + "Use system cron service to call the cron.php file every 5 minutes. Recommended for all instances." : "Го користи системскиот Cron сервис и го повикува cron.php секој 5 минути. Препорачано за сите истанци.", + "The cron.php needs to be executed by the system user \"{user}\"." : "cron.php е потребно да биде извршен од системски корисник \"{user}\".", + "Unable to update background job mode" : "Не може да се ажурира режимот на работа во позадина", "Profile" : "Профил", + "Enable or disable profile by default for new users." : "Стандардно овозможи или оневозможи профил за нови корисници.", "Enable" : "Овозможи", + "Unable to update profile default setting" : "Неможе да се ажурираат стандардните параметри за профилот", "Server-side encryption" : "Енкрипција на страна на серверот", "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "Енкрипцијата на страна на серверот овозможува да ги криптирате датотеките што се поставени на овој сервер. Ова доаѓа со ограничувања како намалување на перформансите, па овозможете го ова само доколку е потребно.", "Enable server-side encryption" : "Овозможи енкрипција на страна на серверот", + "Please read carefully before activating server-side encryption:" : "Ве молиме внимателно прочитајте пред да активирате енкрипција од страна на серверот:", "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Откако ќе биде овозможено енкрипција, сите датотеки што се поставени на серверот од таа точка натаму ќе бидат шифрирани на серверот. Ќе може да се оневозможи енкрипција подоцна ако активниот модул за шифрирање ја поддржува таа функција и сите предуслови (на пример, поставување на копче за враќање) се исполнети.", "Encryption alone does not guarantee security of the system. Please see documentation for more information about how the encryption app works, and the supported use cases." : "Самата енкрипција не гарантира безбедност на системот. Ве молиме погледнете ја документацијата за повеќе информации за тоа како функционира апликацијата за шифрирање и за поддржаните случаи на употреба.", "Be aware that encryption always increases the file size." : "Бидете свесни дека енкрипцијата секогаш ја зголемува големината на датотеката.", @@ -218,6 +253,9 @@ OC.L10N.register( "This is the final warning: Do you really want to enable encryption?" : "Ова е последно предупредување: Дали навистина сакате да овозможите енкрипција?", "No encryption module loaded, please enable an encryption module in the app menu." : "Нема вчитано модул за енкрипција, ве молиме овозможете модул за енкрипција во менито со апликации.", "Select default encryption module:" : "Изберете стандарден модул за шифрирање:", + "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the \"Default encryption module\" and run {command}" : "Треба да ги мигрирате клучевите за криптирање од стариот систем (ownCloud <= 8.0) за енкрипција во нови. Овозможете \"Стандарден додаток за енкрипција\" и стартувајте ја командата {command}", + "Unable to update server side encryption config" : "Неможе да се ажурираат параметрите за енкрипција од страна на серверот", + "Rename group" : "Преименувај група", "Remove group" : "Отстрани група", "You are about to remove the group {group}. The users will NOT be deleted." : "Ќе ја отстраните групата {group}. Корисниците во неа НЕМА да бидат избришани.", "Please confirm the group removal " : "Потврди отстранување на група", @@ -243,6 +281,7 @@ OC.L10N.register( "No email address set" : "Нема поставено адреса за е-пошта ", "Additional emails" : "Дополнителни е-пошти", "Your headline" : "Вашиот наслов", + "Unable to update headline" : "Неможе да се ажурира насловот", "Language" : "Јазик", "Help translate" : "Помогни во преводот", "Unable to update language" : "Не може да се ажурира јазикот", @@ -257,6 +296,7 @@ OC.L10N.register( "Unable to update visibility of {displayId}" : "Неможе да се ажурира видливоста на {displayId}", "Your role" : "Ваша улога", "Unable to update role" : "Неможе да се ажурира улогата", + "Add additional email" : "Додади дополнителна е-пошта", "Add" : "Додади", "You do not have permissions to see the details of this user" : "Немате дозвола за да ги гледате деталите на овој корисник", "Add new password" : "Додади нова лозинка", @@ -346,6 +386,8 @@ OC.L10N.register( "Twitter" : "Twitter", "Website" : "ВЕБ страна", "Profile visibility" : "Видливост на профилот", + "Not available as this property is required for core functionality including file sharing and calendar invitations" : "Не е достапно бидејќи ова својство е потребно за основна функционалност, вклучувајќи споделување датотеки и покани од календар", + "Not available as publishing user specific data to the lookup server is not allowed, contact your system administrator if you have any questions" : "Не е достапно бидејќи не е дозволено објавување специфични податоци за корисникот на серверот за пребарување, контактирајте со вашиот системски администратор ако имате какви било прашања", "Show to everyone" : "Прикажи на сите", "Show to logged in users only" : "Прикажи само на најавени корисници", "Hide" : "Сокриј", @@ -357,6 +399,8 @@ OC.L10N.register( "An error occured during the request. Unable to proceed." : "Настана грешка во процесот. Не може да продолжи.", "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Оваа апликација е овозможена но треба да биде надоградена. Ќе бидете пренасочени кон страната за надоградување за 5 секунди.", "Error: This app cannot be enabled because it makes the server unstable" : "Грешка: Оваа апликација неможе да се овозможи бидејќи ќе го направи серверот нестабилен", + "An error occurred during the request. Unable to proceed." : "Настана грешка во процесот. Не може да продолжи.", + "User already exists." : "Корисникот веќе постои", "Administrator documentation" : "Документација за администратор", "Documentation" : "Документација", "Forum" : "Форум", @@ -379,6 +423,7 @@ OC.L10N.register( "SMTP Username" : "SMTP корисничко име", "SMTP Password" : "SMTP лозинка", "Save" : "Зачувај", + "Test and verify email settings" : "Тестирај и потврди ги параметрите за електронска пошта", "Send email" : "Испрати пошта", "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the linked documentation for more information." : "Важно е за безбедноста и перформансите на вашата истанца дека сè е правилно конфигурирано. Да ви помогнеме во тоа, правиме неколку автоматски проверки. Погледнете ја документација за повеќе информации.", "All checks passed." : "Сите проверки се поминати.", @@ -400,7 +445,9 @@ OC.L10N.register( "Allow public uploads" : "Дозволи јавен аплоуд", "Always ask for a password" : "Секогаш прашувај за лозинка", "Enforce password protection" : "Наметни заштита на лозинка", + "Exclude groups from password requirements:" : "Исклучи групи од барање за лозинка:", "Set default expiration date" : "Постави стандарден рок на траење", + "Exclude groups from creating link shares:" : "Исклучи групи од креирање линк за споделување:", "Allow resharing" : "Дозволи повторно споделување", "Allow sharing with groups" : "Дозволи споделување со групи", "Restrict users to only share with users in their groups" : "Ограничи корисниците да споделуваат со корисници во своите групи", @@ -409,6 +456,8 @@ OC.L10N.register( "Allow username autocompletion in share dialog" : "Дозволи автоматско комплетирање на корисници за споделување", "Allow username autocompletion to users within the same groups" : "Овозможи автоматско комплетирање за корисници од исти групи ", "Allow username autocompletion to users based on phone number integration" : "Овозможи автоматско комплетирање на корисниците од интеграцијата со телефонски број", + "If autocompletion \"same group\" and \"phone number integration\" are enabled a match in either is enough to show the user." : "Ако се овозможени автоматско пополнување \"иста група\" и \"интеграција на телефонски број\", доволно е да се совпадне или да се прикаже на корисникот.", + "Allow autocompletion when entering the full name or email address (ignoring missing phonebook match and being in the same group)" : "озволете автоматско пополнување кога го внесувате целосното име или адресата на е-пошта (игнорирање што недостасува совпаѓање со именикот и сте во иста група)", "Show disclaimer text on the public link upload page (only shown when the file list is hidden)" : "Покажете го текстот за одрекување од одговорност на страницата за поставување јавен линк. (Се прикажува само кога листата со датотеки е скриена)", "This text will be shown on the public link upload page when the file list is hidden." : "Овој текст ќе биде прикажан на страната со јавниот линк кога листата на датотеки е сокриена.", "Default share permissions" : "Стандардни дозволи за споделување", @@ -420,19 +469,25 @@ OC.L10N.register( "Check out our blog" : "Проверете го нашиот блог", "Subscribe to our newsletter" : "Претплатете се на нашиот билтен", "Profile picture" : "Фотографија за профил", + "Change privacy level of profile picture" : "Променете го нивото на приватност за сликата на профилот", "Upload new" : "Прикачи нова", "Select from Files" : "Избри од датотеките", "Remove image" : "Отстрани ја фотографијата", "png or jpg, max. 20 MB" : "png или jpg, максимум 20 MB", "Picture provided by original account" : "Слика обезбедена од оригинална сметка", + "Please note that it can take up to 24 hours for the avatar to get updated everywhere." : "Имајте предвид дека може да потрае до 24 часа за да се ажурира аватарот насекаде.", "Choose as profile picture" : "Избери фотографија за профилот", "You are a member of the following groups:" : "Член сте на следниве групи", "You are using <strong>%s</strong>" : "Користите <strong>%s</strong>", "You are using <strong>%1$s</strong> of <strong>%2$s</strong> (<strong>%3$s %%</strong>)" : "Користите <strong>%1$s</strong> од <strong>%2$s</strong> (<strong>%3$s %%</strong>)", + "Change privacy level of phone number" : "Променете го нивото на приватност за телефонскиот број", "Your phone number" : "Вашиот телефонски број", + "Change privacy level of address" : "Променете го нивото на приватност за адресата", "Your postal address" : "Вашата поштенска адреса", + "Change privacy level of website" : "Променете го нивото на приватност за вебстраната", "It can take up to 24 hours before the account is displayed as verified." : "Може да треба до 24 часа додека сметката почне да се прикажува како верификувана.", "Link https://…" : "Линк https://....", + "Change privacy level of Twitter profile" : "Променете го нивото на приватност за Twitter профилот", "Twitter handle @…" : "Twitter @…", "Locale" : "Локација", "Current password" : "Моментална лозинка", @@ -449,6 +504,7 @@ OC.L10N.register( "You need to set your user email before being able to send test emails." : "Треба да ја поставите вашата е-пошта адреса пред да можете да испратите тест пораки.", "Revoking this token might prevent the wiping of your device if it hasn't started the wipe yet." : "Одземањето на овој токен може да спречи бришење на вашиот уред ако сè уште не е избришано.", "Set as primary mail" : "Постави како примарна е-пошта", + "Change privacy level of email" : "Променете го нивото на приватност за е-пошта адресата", "All languages" : "Сите јазици", "Everyone" : "Сите", "Test email settings" : "Провери ги нагодувањата за електронска пошта", @@ -462,9 +518,12 @@ OC.L10N.register( "Some jobs didn’t execute since %s. Please consider switching to system cron." : "Некој позадински работи не се извршени од %s. Размислете за промена во системски Cron сервис.", "Last job ran %s." : "Последно извршување на задачите: %s.", "Background job didn’t run yet!" : "Сеуште нема извршено ниедна задача!", + "For the server to work properly, it's important to configure background jobs correctly. \"Cron\" is the recommended setting. Please see the documentation for more information." : "За серверот да работи правилно, важно е да ги конфигурирате задачите кој се извршуваат во позадина. За големи истанци 'Cron' е препорачаната поставка. Погледнете ја документацијата за повеќе информации.", "Pick background job setting" : "Избери го начинот на извршување на задачите во позадина", + "Recommended" : "Препорачано", "The cron.php needs to be executed by the system user \"%s\"." : "cron.php е потребно да биде извршен од системски корисник\" %s\".", "days" : "денови", + "Change privacy level of full name" : "Променете го нивото на приватност за името и презимето", "No display name set" : "Нема поставено име за прикажување" }, "nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"); diff --git a/apps/settings/l10n/mk.json b/apps/settings/l10n/mk.json index 902111d66b4..3bcca15811a 100644 --- a/apps/settings/l10n/mk.json +++ b/apps/settings/l10n/mk.json @@ -41,6 +41,7 @@ "You changed your email address" : "Ја променивте вашата адреса на е-пошта", "Your email address was changed by an administrator" : "Вашата адреса на е-пошта е променета од страна на администраторот", "You created app password \"{token}\"" : "Креиравте лозинка за апликација \"{token}\"", + "An administrator created app password \"{token}\"" : "Администраторот креираше лозинка за апликација \"{token}\"", "You deleted app password \"{token}\"" : "Избришавте лозинка за апликација \"{token}\"", "You renamed app password \"{token}\" to \"{newToken}\"" : "Ја променивте лозинката за апликација \"{token}\" во \"{newToken}\"", "You granted filesystem access to app password \"{token}\"" : "Издадовте дозвола за пристап со лозинка на апликација до вашите датотеки \"{token}\"", @@ -51,21 +52,31 @@ "Remote wipe was started on %1$s" : "Далечинското бришење е започна на %1$s", "Remote wipe has finished on %1$s" : "Далечинското бришење заврши на %1$s", "Your <strong>password</strong> or <strong>email</strong> was modified" : "Вашата <strong>лозинка</strong> или <strong>е-пошта</strong> е променета", + "Could not remove app." : "Не може да ја се избрише апликацијата.", + "Could not update app." : "Не може да ја се ажурира апликацијата.", "Wrong password" : "Погрешна лозинка", + "Unable to change personal password" : "Неможе да се промени сопствената лозинката", "Saved" : "Зачувано", "No user supplied" : "Нема корисничко име", + "Unable to change password. Password too long." : "Неможе да се промени лозинката. Лозинката е премногу долга.", "Authentication error" : "Грешка во автентикација", "Please provide an admin recovery password; otherwise, all user data will be lost." : "Ве молам дадете лозинка за поврат на администраторот; во спротивно, сите кориснички податоци ќе бидат изгубени.", "Wrong admin recovery password. Please check the password and try again." : "Погрешна лозинка за поврат на администраторот. Ве молам проверете ја лозинката и пробајте повторно.", + "Backend does not support password change, but the user's encryption key was updated." : "Позадината не подржува промена на лозинката, но корисничкиот клуч за енкрипција е ажуриран.", "installing and updating apps via the App Store or Federated Cloud Sharing" : "инсталирање и ажурирање на апликации преку продавницата за апликации или Федерално споделување", "Federated Cloud Sharing" : "Федеретивно споделување", "cURL is using an outdated %1$s version (%2$s). Please update your operating system or features such as %3$s will not work reliably." : "cURL користи застарена %1$s верзија (%2$s). Ве молиме ажурирајте го вашиот оперативен систем или можностите како %3$s нема да работат безбедно.", + "Could not determine if TLS version of cURL is outdated or not because an error happened during the HTTPS request against https://nextcloud.com. Please check the Nextcloud log file for more details." : "Неможе да се одреди TLS верзијата на cURL или не е ажурирана и затоа настанува грешка при HTTPS барањето до https://nextcloud.com. Проверете ги записите во nextcloud за повеќе детали.", + "The PHP OPcache module is not loaded. For better performance it is recommended to load it into your PHP installation." : "PHP модулот OPcache не е вчитан. За да имате подобри перформанси е препорачливо да го вчитате во вашата PHP инсталација.", + "OPcache is disabled. For better performance, it is recommended to apply <code>opcache.enable=1</code> to your PHP configuration." : "OPcache модулот е оневозможен. За подобри перформанси препорачливо е да го овозможите <code>opcache.enable=1</code> во вашата PHP конфигурација.", + "OPcache is configured to remove code comments. With OPcache enabled, <code>opcache.save_comments=1</code> must be set for Nextcloud to function." : "OPcache е конфигуриран за да ги брише коментарите во кодовите. Со овозможен OPcache, <code>opcache.save_comments=1</code> мора да се постави за да функционира Nextcloud.", "Invalid SMTP password." : "Грешна SMTP лозинка.", "Email setting test" : "Тест за параметри на е-пошта", "Well done, %s!" : "Добро сторено, %s!", "If you received this email, the email configuration seems to be correct." : "Ако ја примивте оваа порака, тоа значи дека конфигурацијата за е-пошта е правилно поставена.", "Email could not be sent. Check your mail server log" : "Порака преку Е-пошта неможе да се испрати. Проверете го записот во е-пошта серверот", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Се случи грешка при праќање на порака. Ве молам проверете ги вашите параметри. (Error: %s)", + "You need to set your user email before being able to send test emails. Go to %s for that." : "Треба да ја поставите вашата е-пошта адреса пред да можете да испратите тест пораки. Одете во %s за тоа.", "Invalid user" : "Неправилен корисник", "Invalid mail address" : "Неправилна електронска адреса/пошта", "Settings saved" : "Параматрите се зачувани", @@ -121,8 +132,14 @@ "A background job is pending that checks for user imported SSL certificates. Please check back later." : "Позадинското извржување на работите се на чекање бидејќи се проверуваат некој SSL сертификати што се увезени од корисник. Вратете се подоцна.", "There are some user imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Постојат некој увезени SSL сертификати, во наредната верзија на Nextcloud 21 нема да се користи. Истите можат да се увезат преку командната линија со внесување на командата \"occ security:certificates:import\". Нивните патеки во директориумот со податоци се прикажани подолу. ", "The old server-side-encryption format is enabled. We recommend disabling this." : "Овозможен е стар формат за криптирање од страна на серверот. Препорачуваме да го оневозможите ова.", + "MariaDB version \"%s\" is used. Nextcloud 21 and higher do not support this version and require MariaDB 10.2 or higher." : "Се користи MariaDB верзија\"%s\". Nextcloud 21 и поголемите верзии, повеќе нема да ја поддржува оваа верзија и потебно е да ја ажурирате на верзија 10.2 или понова.", + "MySQL version \"%s\" is used. Nextcloud 21 and higher do not support this version and require MySQL 8.0 or MariaDB 10.2 or higher." : "Се користи MySQL верзија\"%s\". Nextcloud 21 и поголемите верзии, повеќе нема да ја поддржува оваа верзија и потебно е да ја ажурирате на верзија 8.0 или MariaDB 10.2 или понова.", + "PostgreSQL version \"%s\" is used. Nextcloud 21 and higher do not support this version and require PostgreSQL 9.6 or higher." : "Се користи PostgreSQL верзија\"%s\". Nextcloud 21 и поголемите верзии, повеќе нема да ја поддржува оваа верзија и потебно е да ја ажурирате на верзија 9.6 или понова.", + "Profile information" : "Информации за профилот", + "Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Слика на профил, име и презиме, е-пошта, телефонски број, адреса, њеб страна, Twitter, организација, улога, наслов, биографиј и дали вашиот профил е овозможен", "Nextcloud settings" : "Nextcloud параметри", "Administration privileges" : "Административни привилегии", + "Here you can decide which group can access certain sections of the administration settings." : "Овде можете да одлучите која група може да пристапи до одредени делови од параметрите за администрација.", "None" : "Ништо", "Unable to modify setting" : "Неможе да се ажурираат параметрите", "Two-Factor Authentication" : "Двофакторна автентикација", @@ -156,17 +173,20 @@ "Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "Истакнати апликации се развиени од и во рамките на заедницата. Тие нудат централизирана функционалност и се спремни за користење.", "Featured" : "Истакнати", "Update to {update}" : "Надгради на {update}", + "All apps are up-to-date." : "Сите апликации се ажурирани.", "Results from other categories" : "Резултати од други категории", "No apps found for your version" : "За вашата верзија не се пронајдени апликации", "Disable all" : "Оневозможи ги сите", "Enable all" : "Овозможи ги сите", "_%n app has an update available_::_%n apps have an update available_" : ["За %n апликација има достапно ажурирање","За %n апликации има достапно ажурирање"], + "_Update_::_Update all_" : ["Ажурирај","Ажурирај ги сите"], "Marked for remote wipe" : "Означи за далечинско бришење", "Device settings" : "Параметри за уреди", "Allow filesystem access" : "Дозвола за пристап до податоци", "Rename" : "Преименувај", "Revoke" : "Одземи", "Wipe device" : "Избриши уред", + "Revoking this token might prevent the wiping of your device if it has not started the wipe yet." : "Одземањето на овој токен може да спречи бришење на вашиот уред ако сè уште не е избришано.", "Internet Explorer" : "Internet Explorer", "Edge" : "Edge", "Firefox" : "Firefox", @@ -203,12 +223,27 @@ "Copied!" : "Копирано!", "Copy" : "Копирај", "Could not copy app password. Please copy it manually." : "Неможе да се копира лозинката за апликација. Ве молиме копирајте ја рачно.", + "For the server to work properly, it's important to configure background jobs correctly. Cron is the recommended setting. Please see the documentation for more information." : "За серверот да работи правилно, важно е да ги конфигурирате задачите кој се извршуваат во позадина. За големи истанци 'Cron' е препорачаната поставка. Погледнете ја документацијата за повеќе информации.", + "Last job execution ran {time}. Something seems wrong." : "Последно извршување на задачите: {time}. Нешто не е во ред.", + "Last job ran {relativeTime}." : "Последната процедура се извршуваше {relativeTime}.", + "Background job did not run yet!" : "Сеуште нема извршено ниедна задача!", + "AJAX" : "AJAX", + "Execute one task with each page loaded. Use case: Single user instance." : "Извржува по една задача со секоја вчитака страница. Се користи за инстанца со еден корисник.", + "Webcron" : "Webcron", + "cron.php is registered at a webcron service to call cron.php every 5 minutes over HTTP. Use case: Very small instance (1–5 users depending on the usage)." : "cron.php треба да се регистрира на webcron сервис за да ја повикува процедурата секој 5 минути преку HTTP. Се користи за помали истанци (1-5 корисника во зависност на искористувањето).", + "Cron (Recommended)" : "Cron (Препорачано)", "To run this you need the PHP POSIX extension. See {linkstart}PHP documentation{linkend} for more details." : "За да го извршите ова, треба PHP POSIX додаток. Погледни во {linkstart}PHP документацијата{linkend} за повеќе детали.", + "Use system cron service to call the cron.php file every 5 minutes. Recommended for all instances." : "Го користи системскиот Cron сервис и го повикува cron.php секој 5 минути. Препорачано за сите истанци.", + "The cron.php needs to be executed by the system user \"{user}\"." : "cron.php е потребно да биде извршен од системски корисник \"{user}\".", + "Unable to update background job mode" : "Не може да се ажурира режимот на работа во позадина", "Profile" : "Профил", + "Enable or disable profile by default for new users." : "Стандардно овозможи или оневозможи профил за нови корисници.", "Enable" : "Овозможи", + "Unable to update profile default setting" : "Неможе да се ажурираат стандардните параметри за профилот", "Server-side encryption" : "Енкрипција на страна на серверот", "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "Енкрипцијата на страна на серверот овозможува да ги криптирате датотеките што се поставени на овој сервер. Ова доаѓа со ограничувања како намалување на перформансите, па овозможете го ова само доколку е потребно.", "Enable server-side encryption" : "Овозможи енкрипција на страна на серверот", + "Please read carefully before activating server-side encryption:" : "Ве молиме внимателно прочитајте пред да активирате енкрипција од страна на серверот:", "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Откако ќе биде овозможено енкрипција, сите датотеки што се поставени на серверот од таа точка натаму ќе бидат шифрирани на серверот. Ќе може да се оневозможи енкрипција подоцна ако активниот модул за шифрирање ја поддржува таа функција и сите предуслови (на пример, поставување на копче за враќање) се исполнети.", "Encryption alone does not guarantee security of the system. Please see documentation for more information about how the encryption app works, and the supported use cases." : "Самата енкрипција не гарантира безбедност на системот. Ве молиме погледнете ја документацијата за повеќе информации за тоа како функционира апликацијата за шифрирање и за поддржаните случаи на употреба.", "Be aware that encryption always increases the file size." : "Бидете свесни дека енкрипцијата секогаш ја зголемува големината на датотеката.", @@ -216,6 +251,9 @@ "This is the final warning: Do you really want to enable encryption?" : "Ова е последно предупредување: Дали навистина сакате да овозможите енкрипција?", "No encryption module loaded, please enable an encryption module in the app menu." : "Нема вчитано модул за енкрипција, ве молиме овозможете модул за енкрипција во менито со апликации.", "Select default encryption module:" : "Изберете стандарден модул за шифрирање:", + "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the \"Default encryption module\" and run {command}" : "Треба да ги мигрирате клучевите за криптирање од стариот систем (ownCloud <= 8.0) за енкрипција во нови. Овозможете \"Стандарден додаток за енкрипција\" и стартувајте ја командата {command}", + "Unable to update server side encryption config" : "Неможе да се ажурираат параметрите за енкрипција од страна на серверот", + "Rename group" : "Преименувај група", "Remove group" : "Отстрани група", "You are about to remove the group {group}. The users will NOT be deleted." : "Ќе ја отстраните групата {group}. Корисниците во неа НЕМА да бидат избришани.", "Please confirm the group removal " : "Потврди отстранување на група", @@ -241,6 +279,7 @@ "No email address set" : "Нема поставено адреса за е-пошта ", "Additional emails" : "Дополнителни е-пошти", "Your headline" : "Вашиот наслов", + "Unable to update headline" : "Неможе да се ажурира насловот", "Language" : "Јазик", "Help translate" : "Помогни во преводот", "Unable to update language" : "Не може да се ажурира јазикот", @@ -255,6 +294,7 @@ "Unable to update visibility of {displayId}" : "Неможе да се ажурира видливоста на {displayId}", "Your role" : "Ваша улога", "Unable to update role" : "Неможе да се ажурира улогата", + "Add additional email" : "Додади дополнителна е-пошта", "Add" : "Додади", "You do not have permissions to see the details of this user" : "Немате дозвола за да ги гледате деталите на овој корисник", "Add new password" : "Додади нова лозинка", @@ -344,6 +384,8 @@ "Twitter" : "Twitter", "Website" : "ВЕБ страна", "Profile visibility" : "Видливост на профилот", + "Not available as this property is required for core functionality including file sharing and calendar invitations" : "Не е достапно бидејќи ова својство е потребно за основна функционалност, вклучувајќи споделување датотеки и покани од календар", + "Not available as publishing user specific data to the lookup server is not allowed, contact your system administrator if you have any questions" : "Не е достапно бидејќи не е дозволено објавување специфични податоци за корисникот на серверот за пребарување, контактирајте со вашиот системски администратор ако имате какви било прашања", "Show to everyone" : "Прикажи на сите", "Show to logged in users only" : "Прикажи само на најавени корисници", "Hide" : "Сокриј", @@ -355,6 +397,8 @@ "An error occured during the request. Unable to proceed." : "Настана грешка во процесот. Не може да продолжи.", "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Оваа апликација е овозможена но треба да биде надоградена. Ќе бидете пренасочени кон страната за надоградување за 5 секунди.", "Error: This app cannot be enabled because it makes the server unstable" : "Грешка: Оваа апликација неможе да се овозможи бидејќи ќе го направи серверот нестабилен", + "An error occurred during the request. Unable to proceed." : "Настана грешка во процесот. Не може да продолжи.", + "User already exists." : "Корисникот веќе постои", "Administrator documentation" : "Документација за администратор", "Documentation" : "Документација", "Forum" : "Форум", @@ -377,6 +421,7 @@ "SMTP Username" : "SMTP корисничко име", "SMTP Password" : "SMTP лозинка", "Save" : "Зачувај", + "Test and verify email settings" : "Тестирај и потврди ги параметрите за електронска пошта", "Send email" : "Испрати пошта", "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the linked documentation for more information." : "Важно е за безбедноста и перформансите на вашата истанца дека сè е правилно конфигурирано. Да ви помогнеме во тоа, правиме неколку автоматски проверки. Погледнете ја документација за повеќе информации.", "All checks passed." : "Сите проверки се поминати.", @@ -398,7 +443,9 @@ "Allow public uploads" : "Дозволи јавен аплоуд", "Always ask for a password" : "Секогаш прашувај за лозинка", "Enforce password protection" : "Наметни заштита на лозинка", + "Exclude groups from password requirements:" : "Исклучи групи од барање за лозинка:", "Set default expiration date" : "Постави стандарден рок на траење", + "Exclude groups from creating link shares:" : "Исклучи групи од креирање линк за споделување:", "Allow resharing" : "Дозволи повторно споделување", "Allow sharing with groups" : "Дозволи споделување со групи", "Restrict users to only share with users in their groups" : "Ограничи корисниците да споделуваат со корисници во своите групи", @@ -407,6 +454,8 @@ "Allow username autocompletion in share dialog" : "Дозволи автоматско комплетирање на корисници за споделување", "Allow username autocompletion to users within the same groups" : "Овозможи автоматско комплетирање за корисници од исти групи ", "Allow username autocompletion to users based on phone number integration" : "Овозможи автоматско комплетирање на корисниците од интеграцијата со телефонски број", + "If autocompletion \"same group\" and \"phone number integration\" are enabled a match in either is enough to show the user." : "Ако се овозможени автоматско пополнување \"иста група\" и \"интеграција на телефонски број\", доволно е да се совпадне или да се прикаже на корисникот.", + "Allow autocompletion when entering the full name or email address (ignoring missing phonebook match and being in the same group)" : "озволете автоматско пополнување кога го внесувате целосното име или адресата на е-пошта (игнорирање што недостасува совпаѓање со именикот и сте во иста група)", "Show disclaimer text on the public link upload page (only shown when the file list is hidden)" : "Покажете го текстот за одрекување од одговорност на страницата за поставување јавен линк. (Се прикажува само кога листата со датотеки е скриена)", "This text will be shown on the public link upload page when the file list is hidden." : "Овој текст ќе биде прикажан на страната со јавниот линк кога листата на датотеки е сокриена.", "Default share permissions" : "Стандардни дозволи за споделување", @@ -418,19 +467,25 @@ "Check out our blog" : "Проверете го нашиот блог", "Subscribe to our newsletter" : "Претплатете се на нашиот билтен", "Profile picture" : "Фотографија за профил", + "Change privacy level of profile picture" : "Променете го нивото на приватност за сликата на профилот", "Upload new" : "Прикачи нова", "Select from Files" : "Избри од датотеките", "Remove image" : "Отстрани ја фотографијата", "png or jpg, max. 20 MB" : "png или jpg, максимум 20 MB", "Picture provided by original account" : "Слика обезбедена од оригинална сметка", + "Please note that it can take up to 24 hours for the avatar to get updated everywhere." : "Имајте предвид дека може да потрае до 24 часа за да се ажурира аватарот насекаде.", "Choose as profile picture" : "Избери фотографија за профилот", "You are a member of the following groups:" : "Член сте на следниве групи", "You are using <strong>%s</strong>" : "Користите <strong>%s</strong>", "You are using <strong>%1$s</strong> of <strong>%2$s</strong> (<strong>%3$s %%</strong>)" : "Користите <strong>%1$s</strong> од <strong>%2$s</strong> (<strong>%3$s %%</strong>)", + "Change privacy level of phone number" : "Променете го нивото на приватност за телефонскиот број", "Your phone number" : "Вашиот телефонски број", + "Change privacy level of address" : "Променете го нивото на приватност за адресата", "Your postal address" : "Вашата поштенска адреса", + "Change privacy level of website" : "Променете го нивото на приватност за вебстраната", "It can take up to 24 hours before the account is displayed as verified." : "Може да треба до 24 часа додека сметката почне да се прикажува како верификувана.", "Link https://…" : "Линк https://....", + "Change privacy level of Twitter profile" : "Променете го нивото на приватност за Twitter профилот", "Twitter handle @…" : "Twitter @…", "Locale" : "Локација", "Current password" : "Моментална лозинка", @@ -447,6 +502,7 @@ "You need to set your user email before being able to send test emails." : "Треба да ја поставите вашата е-пошта адреса пред да можете да испратите тест пораки.", "Revoking this token might prevent the wiping of your device if it hasn't started the wipe yet." : "Одземањето на овој токен може да спречи бришење на вашиот уред ако сè уште не е избришано.", "Set as primary mail" : "Постави како примарна е-пошта", + "Change privacy level of email" : "Променете го нивото на приватност за е-пошта адресата", "All languages" : "Сите јазици", "Everyone" : "Сите", "Test email settings" : "Провери ги нагодувањата за електронска пошта", @@ -460,9 +516,12 @@ "Some jobs didn’t execute since %s. Please consider switching to system cron." : "Некој позадински работи не се извршени од %s. Размислете за промена во системски Cron сервис.", "Last job ran %s." : "Последно извршување на задачите: %s.", "Background job didn’t run yet!" : "Сеуште нема извршено ниедна задача!", + "For the server to work properly, it's important to configure background jobs correctly. \"Cron\" is the recommended setting. Please see the documentation for more information." : "За серверот да работи правилно, важно е да ги конфигурирате задачите кој се извршуваат во позадина. За големи истанци 'Cron' е препорачаната поставка. Погледнете ја документацијата за повеќе информации.", "Pick background job setting" : "Избери го начинот на извршување на задачите во позадина", + "Recommended" : "Препорачано", "The cron.php needs to be executed by the system user \"%s\"." : "cron.php е потребно да биде извршен од системски корисник\" %s\".", "days" : "денови", + "Change privacy level of full name" : "Променете го нивото на приватност за името и презимето", "No display name set" : "Нема поставено име за прикажување" },"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;" }
\ No newline at end of file diff --git a/apps/settings/l10n/nb.js b/apps/settings/l10n/nb.js index 8d34f29406b..d841ce6397c 100644 --- a/apps/settings/l10n/nb.js +++ b/apps/settings/l10n/nb.js @@ -263,7 +263,10 @@ OC.L10N.register( "Avatar" : "Avatar", "About" : "Om", "Full name" : "Fullt navn", + "Headline" : "Overskrift", + "Organisation" : "Organisasion", "Phone number" : "Telefonnummer", + "Role" : "Rolle", "Twitter" : "Twitter", "Website" : "Nettsted", "Hide" : "Skjul", diff --git a/apps/settings/l10n/nb.json b/apps/settings/l10n/nb.json index 15f0e87d87d..3b787ec216a 100644 --- a/apps/settings/l10n/nb.json +++ b/apps/settings/l10n/nb.json @@ -261,7 +261,10 @@ "Avatar" : "Avatar", "About" : "Om", "Full name" : "Fullt navn", + "Headline" : "Overskrift", + "Organisation" : "Organisasion", "Phone number" : "Telefonnummer", + "Role" : "Rolle", "Twitter" : "Twitter", "Website" : "Nettsted", "Hide" : "Skjul", diff --git a/apps/settings/l10n/tr.js b/apps/settings/l10n/tr.js index 4a731cee4a5..3d90519d47e 100644 --- a/apps/settings/l10n/tr.js +++ b/apps/settings/l10n/tr.js @@ -446,7 +446,7 @@ OC.L10N.register( "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Yönetici olarak paylaşma davranışı ile ilgili ince ayarları yapabilirsiniz. Ayrıntılı bilgi almak için belgelere bakabilirsiniz.", "Allow apps to use the Share API" : "Uygulamalar Paylaşım API kullanabilsin", "Set default expiration date for shares" : "Paylaşımların varsayılan kullanma süresi sonu", - "Expire after" : "Kullanım süresi", + "Expire after" : "Geçerlilik süresi sonu", "day(s)" : "gün", "Enforce expiration date" : "Son kullanma tarihi dayatılsın", "Set default expiration date for shares to other servers" : "Diğer sunuculara yapılan paylaşımların varsayılan kullanma süresi sonu", diff --git a/apps/settings/l10n/tr.json b/apps/settings/l10n/tr.json index 533cda88625..2dfdbe26ab5 100644 --- a/apps/settings/l10n/tr.json +++ b/apps/settings/l10n/tr.json @@ -444,7 +444,7 @@ "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Yönetici olarak paylaşma davranışı ile ilgili ince ayarları yapabilirsiniz. Ayrıntılı bilgi almak için belgelere bakabilirsiniz.", "Allow apps to use the Share API" : "Uygulamalar Paylaşım API kullanabilsin", "Set default expiration date for shares" : "Paylaşımların varsayılan kullanma süresi sonu", - "Expire after" : "Kullanım süresi", + "Expire after" : "Geçerlilik süresi sonu", "day(s)" : "gün", "Enforce expiration date" : "Son kullanma tarihi dayatılsın", "Set default expiration date for shares to other servers" : "Diğer sunuculara yapılan paylaşımların varsayılan kullanma süresi sonu", diff --git a/apps/settings/src/components/SvgFilterMixin.vue b/apps/settings/src/components/SvgFilterMixin.vue index 228b574f3c4..15713514436 100644 --- a/apps/settings/src/components/SvgFilterMixin.vue +++ b/apps/settings/src/components/SvgFilterMixin.vue @@ -34,7 +34,7 @@ export default { }, }, mounted() { - this.filterId = 'invertIconApps' + Math.floor((Math.random() * 100)) + new Date().getSeconds() + new Date().getMilliseconds() + this.filterId = 'invertIconApps-' + Math.random().toString(36).substring(2) }, } </script> diff --git a/apps/sharebymail/l10n/fi.js b/apps/sharebymail/l10n/fi.js index 4afbd8169d9..614dc830268 100644 --- a/apps/sharebymail/l10n/fi.js +++ b/apps/sharebymail/l10n/fi.js @@ -1,31 +1,46 @@ OC.L10N.register( "sharebymail", { - "Shared with %1$s" : "Jaettu käyttäjälle %1$s", + "Shared with %1$s" : "Jaettu käyttäjälle %1$s", "Shared with {email}" : "Jaettu käyttäjälle {email}", - "Shared with %1$s by %2$s" : "Jaettu käyttäjälle %1$s käyttäjältä %2$s", - "Shared with {email} by {actor}" : "Jaettu käyttäjälle {email} käyttäjältä {actor}", + "Shared with %1$s by %2$s" : "Jaettu käyttäjälle %1$s käyttäjän %2$s toimesta", + "Shared with {email} by {actor}" : "Jaettu käyttäjälle {email} käyttäjän {actor} toimesta", + "Unshared from {email}" : "Jako käyttäjälle {email} lopetettu", + "Unshared from {email} by {actor}" : "Jako käyttäjälle {email} lopetettiin käyttäjän {actor} toimesta", + "Password for mail share sent to %1$s" : "Salasana sähköpostijakoon lähetettiin osoitteeseen %1$s", + "Password for mail share sent to {email}" : "Salasana sähköpostijakoon lähetettiin osoitteeseen {email}", + "Password for mail share sent to you" : "Salasana sähköpostijakoon lähetettiin sinulle", "You shared %1$s with %2$s by mail" : "Jaoit tiedoston %1$s sähköpostitse osoitteeseen %2$s", "You shared {file} with {email} by mail" : "Jaoit tiedoston {file} sähköpostitse osoitteeseen {email}", "%3$s shared %1$s with %2$s by mail" : "%3$s jakoi tiedoston %1$s sähköpostitse osoitteeseen %2$s", "{actor} shared {file} with {email} by mail" : "{actor} jakoi tiedoston {file} sähköpostitse osoitteeseen {email}", + "You unshared %1$s from %2$s by mail" : "Lopetit kohteen %1$s jaon käyttäjältä %2$s sähköpostitse", + "You unshared {file} from {email} by mail" : "Lopetit kohteen {file} jaon käyttäjältä {email} sähköpostitse", + "Password to access %1$s was sent to %2s" : "Salasana kohteen %1$s käyttämiseksi lähetettiin käyttäjälle %2s", + "Password to access {file} was sent to {email}" : "Salasana kohteen {file} käyttämiseksi lähetettiin osoitteeseen {email}", + "Password to access %1$s was sent to you" : "Salasana kohteen %1$s käyttämiseksi lähetettiin sinulle", "Password to access {file} was sent to you" : "Salasana tiedoston {file} käyttämiseksi lähetettiin sinulle", + "Share by mail" : "Jaa sähköpostitse", + "Sharing %1$s failed, because this item is already shared with user %2$s" : "Kohteen %1$s jakaminen epäonnistui, koska tämä kohde on jo jaettu käyttäjän %2$s kanssa", + "We cannot send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Automaattisesti muodostettua salasanaa ei voi lähettää sinulle. Aseta kelvollinen sähköpostiosoite henkilökohtaisiin asetuksiisi ja yritä uudelleen.", + "Failed to send share by email. Got an invalid email address" : "Jaon lähettäminen sähköpostitse epäonnistui. Virheellinen sähköpostiosoite", "Failed to send share by email" : "Jaon lähettäminen sähköpostitse epäonnistui", - "Click the button below to open it." : "Klikkaa alla olevaa linkkiä avataksesi sen.", + "%1$s shared »%2$s« with you" : "%1$s jakoi kohteen »%2$s« kanssasi", + "%1$s shared »%2$s« with you." : "%1$s jakoi kohteen »%2$s« kanssasi.", + "Click the button below to open it." : "Napsauta alla olevaa linkkiä avataksesi sen.", "Open »%s«" : "Avaa »%s«", + "%1$s via %2$s" : "%1$s palvelun %2$s kautta", + "Password to access »%s«" : "Salasana kohteen »%s« käyttöön", "It is protected with the following password:" : "Se on suojattu seuraavalla salasanalla:", + "This password will expire at %s" : "Tämä salasana vanhenee %s", + "%1$s shared »%2$s« with you and wants to add:" : "%1$s jakoi kohteen »%2$s« kanssasi ja haluaa lisätä:", + "%1$s shared »%2$s« with you and wants to add" : "%1$s jakoi kohteen »%2$s« kanssasi ja haluaa lisätä", + "»%s« added a note to a file shared with you" : "»%s« lisäsi huomion jakamaasi tiedostoon", "This is the password:" : "Tämä on salasana:", "You can choose a different password at any time in the share dialog." : "Voit valita muun salasanan koska tahansa jakovalikossa.", "Could not find share" : "Jakoa ei löytynyt", - "Share by mail" : "Jaa sähköpostitse", "Allows users to share a personalized link to a file or folder by putting in an email address." : "Salli käyttäjien jakaa personoitu linkki tiedostoon tai kansioon syöttämällä sähköpostiosoitteen.", "Send password by mail" : "Lähetä salasana sähköpostitse", - "Enforce password protection" : "Pakota salasanasuojaus", - "Sharing %s failed, this item is already shared with %s" : "Kohteen %s jakaminen epäonnistui, koska se on jo jaettu käyttäjälle %s", - "%s shared »%s« with you" : "%s jakoi kohteen »%s« kanssasi", - "%s shared »%s« with you." : "%s jakoi kohteen »%s« kanssasi.", - "%s via %s" : "%s (palvelun %s kautta)", - "It is protected with the following password: %s" : "Se on suojattu seuraavalla salasanalla: %s", - "This is the password: %s" : "Tämä on salasana: %s" + "Reply to initiator" : "Vastaa aloitteentekijälle" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/sharebymail/l10n/fi.json b/apps/sharebymail/l10n/fi.json index c653bdf4396..39407ab0019 100644 --- a/apps/sharebymail/l10n/fi.json +++ b/apps/sharebymail/l10n/fi.json @@ -1,29 +1,44 @@ { "translations": { - "Shared with %1$s" : "Jaettu käyttäjälle %1$s", + "Shared with %1$s" : "Jaettu käyttäjälle %1$s", "Shared with {email}" : "Jaettu käyttäjälle {email}", - "Shared with %1$s by %2$s" : "Jaettu käyttäjälle %1$s käyttäjältä %2$s", - "Shared with {email} by {actor}" : "Jaettu käyttäjälle {email} käyttäjältä {actor}", + "Shared with %1$s by %2$s" : "Jaettu käyttäjälle %1$s käyttäjän %2$s toimesta", + "Shared with {email} by {actor}" : "Jaettu käyttäjälle {email} käyttäjän {actor} toimesta", + "Unshared from {email}" : "Jako käyttäjälle {email} lopetettu", + "Unshared from {email} by {actor}" : "Jako käyttäjälle {email} lopetettiin käyttäjän {actor} toimesta", + "Password for mail share sent to %1$s" : "Salasana sähköpostijakoon lähetettiin osoitteeseen %1$s", + "Password for mail share sent to {email}" : "Salasana sähköpostijakoon lähetettiin osoitteeseen {email}", + "Password for mail share sent to you" : "Salasana sähköpostijakoon lähetettiin sinulle", "You shared %1$s with %2$s by mail" : "Jaoit tiedoston %1$s sähköpostitse osoitteeseen %2$s", "You shared {file} with {email} by mail" : "Jaoit tiedoston {file} sähköpostitse osoitteeseen {email}", "%3$s shared %1$s with %2$s by mail" : "%3$s jakoi tiedoston %1$s sähköpostitse osoitteeseen %2$s", "{actor} shared {file} with {email} by mail" : "{actor} jakoi tiedoston {file} sähköpostitse osoitteeseen {email}", + "You unshared %1$s from %2$s by mail" : "Lopetit kohteen %1$s jaon käyttäjältä %2$s sähköpostitse", + "You unshared {file} from {email} by mail" : "Lopetit kohteen {file} jaon käyttäjältä {email} sähköpostitse", + "Password to access %1$s was sent to %2s" : "Salasana kohteen %1$s käyttämiseksi lähetettiin käyttäjälle %2s", + "Password to access {file} was sent to {email}" : "Salasana kohteen {file} käyttämiseksi lähetettiin osoitteeseen {email}", + "Password to access %1$s was sent to you" : "Salasana kohteen %1$s käyttämiseksi lähetettiin sinulle", "Password to access {file} was sent to you" : "Salasana tiedoston {file} käyttämiseksi lähetettiin sinulle", + "Share by mail" : "Jaa sähköpostitse", + "Sharing %1$s failed, because this item is already shared with user %2$s" : "Kohteen %1$s jakaminen epäonnistui, koska tämä kohde on jo jaettu käyttäjän %2$s kanssa", + "We cannot send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Automaattisesti muodostettua salasanaa ei voi lähettää sinulle. Aseta kelvollinen sähköpostiosoite henkilökohtaisiin asetuksiisi ja yritä uudelleen.", + "Failed to send share by email. Got an invalid email address" : "Jaon lähettäminen sähköpostitse epäonnistui. Virheellinen sähköpostiosoite", "Failed to send share by email" : "Jaon lähettäminen sähköpostitse epäonnistui", - "Click the button below to open it." : "Klikkaa alla olevaa linkkiä avataksesi sen.", + "%1$s shared »%2$s« with you" : "%1$s jakoi kohteen »%2$s« kanssasi", + "%1$s shared »%2$s« with you." : "%1$s jakoi kohteen »%2$s« kanssasi.", + "Click the button below to open it." : "Napsauta alla olevaa linkkiä avataksesi sen.", "Open »%s«" : "Avaa »%s«", + "%1$s via %2$s" : "%1$s palvelun %2$s kautta", + "Password to access »%s«" : "Salasana kohteen »%s« käyttöön", "It is protected with the following password:" : "Se on suojattu seuraavalla salasanalla:", + "This password will expire at %s" : "Tämä salasana vanhenee %s", + "%1$s shared »%2$s« with you and wants to add:" : "%1$s jakoi kohteen »%2$s« kanssasi ja haluaa lisätä:", + "%1$s shared »%2$s« with you and wants to add" : "%1$s jakoi kohteen »%2$s« kanssasi ja haluaa lisätä", + "»%s« added a note to a file shared with you" : "»%s« lisäsi huomion jakamaasi tiedostoon", "This is the password:" : "Tämä on salasana:", "You can choose a different password at any time in the share dialog." : "Voit valita muun salasanan koska tahansa jakovalikossa.", "Could not find share" : "Jakoa ei löytynyt", - "Share by mail" : "Jaa sähköpostitse", "Allows users to share a personalized link to a file or folder by putting in an email address." : "Salli käyttäjien jakaa personoitu linkki tiedostoon tai kansioon syöttämällä sähköpostiosoitteen.", "Send password by mail" : "Lähetä salasana sähköpostitse", - "Enforce password protection" : "Pakota salasanasuojaus", - "Sharing %s failed, this item is already shared with %s" : "Kohteen %s jakaminen epäonnistui, koska se on jo jaettu käyttäjälle %s", - "%s shared »%s« with you" : "%s jakoi kohteen »%s« kanssasi", - "%s shared »%s« with you." : "%s jakoi kohteen »%s« kanssasi.", - "%s via %s" : "%s (palvelun %s kautta)", - "It is protected with the following password: %s" : "Se on suojattu seuraavalla salasanalla: %s", - "This is the password: %s" : "Tämä on salasana: %s" + "Reply to initiator" : "Vastaa aloitteentekijälle" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/sharebymail/l10n/tr.js b/apps/sharebymail/l10n/tr.js index 29e9ccefb81..2cba19d4a64 100644 --- a/apps/sharebymail/l10n/tr.js +++ b/apps/sharebymail/l10n/tr.js @@ -39,7 +39,7 @@ OC.L10N.register( "Password to access »%1$s« shared to you by %2$s" : "»%1$s« için sizin tarafınızdan %2$s üzerinden paylaşılan erişim parolası", "Password to access »%s«" : "»%s« erişim parolası", "It is protected with the following password:" : "Şu parola ile korunuyor:", - "This password will expire at %s" : "Bu parola %s tarihinde geçersiz olacak", + "This password will expire at %s" : "Bu parolanın geçerlilik süresi %s tarihinde dolacak", "%1$s shared »%2$s« with you and wants to add:" : "%1$s sizinle »%2$s« ögesini paylaştı ve eklemenizi istiyor:", "%1$s shared »%2$s« with you and wants to add" : "%1$s sizinle »%2$s« ögesini paylaştı ve eklemenizi istiyor", "»%s« added a note to a file shared with you" : "»%s« sizinle paylaştığı bir dosyaya bir not ekledi", diff --git a/apps/sharebymail/l10n/tr.json b/apps/sharebymail/l10n/tr.json index b21ada04447..5d959f0219b 100644 --- a/apps/sharebymail/l10n/tr.json +++ b/apps/sharebymail/l10n/tr.json @@ -37,7 +37,7 @@ "Password to access »%1$s« shared to you by %2$s" : "»%1$s« için sizin tarafınızdan %2$s üzerinden paylaşılan erişim parolası", "Password to access »%s«" : "»%s« erişim parolası", "It is protected with the following password:" : "Şu parola ile korunuyor:", - "This password will expire at %s" : "Bu parola %s tarihinde geçersiz olacak", + "This password will expire at %s" : "Bu parolanın geçerlilik süresi %s tarihinde dolacak", "%1$s shared »%2$s« with you and wants to add:" : "%1$s sizinle »%2$s« ögesini paylaştı ve eklemenizi istiyor:", "%1$s shared »%2$s« with you and wants to add" : "%1$s sizinle »%2$s« ögesini paylaştı ve eklemenizi istiyor", "»%s« added a note to a file shared with you" : "»%s« sizinle paylaştığı bir dosyaya bir not ekledi", diff --git a/apps/systemtags/l10n/bg.js b/apps/systemtags/l10n/bg.js index 71926d0a155..8ad75a457e5 100644 --- a/apps/systemtags/l10n/bg.js +++ b/apps/systemtags/l10n/bg.js @@ -46,7 +46,7 @@ OC.L10N.register( "All tagged %s …" : "Всички маркирани %s ...", "tagged %s" : "маркиран %s", "Collaborative tags" : "Съвместни етикети", - "Collaborative tagging functionality which shares tags among users." : "Функция за съвместно етикетиране, която споделя етикети между потребителите.", + "Collaborative tagging functionality which shares tags among users." : "Функция за съвместно етикетиране/маркиране/, която споделя етикети между потребителите.", "Collaborative tagging functionality which shares tags among users. Great for teams.\n\t(If you are a provider with a multi-tenancy installation, it is advised to deactivate this app as tags are shared.)" : "Функция за съвместно етикетиране, която споделя етикети между потребителите. Чудесно е за екипи.\n\t(Ако сте доставчик с инсталация с множество клиенти, препоръчваме ви да деактивирате това приложение, тъй като етикетите се споделят.)", "Tagged files" : "Отбелязани файлове", "Select tags to filter by" : "Филтриране по етикет", diff --git a/apps/systemtags/l10n/bg.json b/apps/systemtags/l10n/bg.json index b0cfe42d3ee..eeaf03ec22b 100644 --- a/apps/systemtags/l10n/bg.json +++ b/apps/systemtags/l10n/bg.json @@ -44,7 +44,7 @@ "All tagged %s …" : "Всички маркирани %s ...", "tagged %s" : "маркиран %s", "Collaborative tags" : "Съвместни етикети", - "Collaborative tagging functionality which shares tags among users." : "Функция за съвместно етикетиране, която споделя етикети между потребителите.", + "Collaborative tagging functionality which shares tags among users." : "Функция за съвместно етикетиране/маркиране/, която споделя етикети между потребителите.", "Collaborative tagging functionality which shares tags among users. Great for teams.\n\t(If you are a provider with a multi-tenancy installation, it is advised to deactivate this app as tags are shared.)" : "Функция за съвместно етикетиране, която споделя етикети между потребителите. Чудесно е за екипи.\n\t(Ако сте доставчик с инсталация с множество клиенти, препоръчваме ви да деактивирате това приложение, тъй като етикетите се споделят.)", "Tagged files" : "Отбелязани файлове", "Select tags to filter by" : "Филтриране по етикет", diff --git a/apps/theming/l10n/cs.js b/apps/theming/l10n/cs.js index 80fdc39e33b..73e32e2aa94 100644 --- a/apps/theming/l10n/cs.js +++ b/apps/theming/l10n/cs.js @@ -10,14 +10,14 @@ OC.L10N.register( "The given web address is too long" : "Zadaná webová adresa je příliš dlouhá", "The given web address is not a valid URL" : "Zadaná webová adresa není platné URL", "The given legal notice address is too long" : "Daná adresa právního upozornění je příliš dlouhá", - "The given legal notice address is not a valid URL" : "Daná adresa právního upozornění není platnou URL adresou", + "The given legal notice address is not a valid URL" : "Daná adresa právního upozornění není platné URL", "The given privacy policy address is too long" : "Daná adresa zásad ochrany osobních údajů je příliš dlouhá", - "The given privacy policy address is not a valid URL" : "Daná adresa prohlášení o ochraně soukromí není platná URL adresa", - "The given slogan is too long" : "Zadaný slogan je příliš dlouhý", - "The given color is invalid" : "Zadaná barva není platná", + "The given privacy policy address is not a valid URL" : "Daná adresa prohlášení o ochraně soukromí není platné URL", + "The given slogan is too long" : "Daný slogan je příliš dlouhý", + "The given color is invalid" : "Daná barva není platná", "The file was uploaded" : "Soubor byl nahrán", "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Velikost nahrávaného souboru překračuje limit nastavení direktivou upload_max_filesize v php.ini", - "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Nahraný soubor překračuje nastavení MAX_FILE_SIZE, která byla zadána ve HTML formuláři", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Velikost nahrávaného souboru překračuje nastavení MAX_FILE_SIZE, která byla zadána v HTML formuláři", "The file was only partially uploaded" : "Soubor byl nahrán pouze z části", "No file was uploaded" : "Nebyl nahrán žádný soubor", "Missing a temporary folder" : "Chybí složka pro dočasné soubory", @@ -28,7 +28,7 @@ OC.L10N.register( "Theming" : "Motiv vzhledu", "Appearance and accessibility" : "Vzhled a zpřístupnění", "Dark theme with high contrast mode" : "Tmavý motiv vzhledu s režimem vysokého kontrastu", - "Enable dark high contrast mode" : "Zapnout tmavý režim s vysokým kontrastem", + "Enable dark high contrast mode" : "Používat tmavý režim s vysokým kontrastem", "Similar to the high contrast mode, but with dark colours." : "Podobné režimu s vysokým kontrastem, ale s tmavými barvami.", "Dark theme" : "Tmavý motiv vzhledu", "Enable dark theme" : "Používat tmavý motiv vzhledu", @@ -62,13 +62,13 @@ OC.L10N.register( "Logo" : "Logo", "Upload new logo" : "Nahrát nové logo", "Login image" : "Přihlašovací obrázek", - "Upload new login background" : "Nahrát nové přihlašovací pozadí", + "Upload new login background" : "Nahrát nové pozadí pro přihlašovací obrazovku", "Remove background image" : "Odebrat obrázek z pozadí", "Advanced options" : "Pokročilé předvolby", "Legal notice link" : "Odkaz na právní upozornění", "Privacy policy link" : "Odkaz na zásady ochrany osobních údajů", - "Header logo" : "Logo v záhlaví", - "Upload new header logo" : "Nahrát nové logo do záhlaví", + "Header logo" : "Logo pro záhlaví", + "Upload new header logo" : "Nahrát nové logo pro záhlaví", "Favicon" : "ikona webu", "Upload new favicon" : "Nahrát novou ikonu webu", "Install the Imagemagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Nainstalujte rozšíření Imagemagick PHP s podporou obrázků SVG, které automaticky vytváří favicon na základě nahraného loga a barvy." diff --git a/apps/theming/l10n/cs.json b/apps/theming/l10n/cs.json index 12b27d9be6e..90104ddb347 100644 --- a/apps/theming/l10n/cs.json +++ b/apps/theming/l10n/cs.json @@ -8,14 +8,14 @@ "The given web address is too long" : "Zadaná webová adresa je příliš dlouhá", "The given web address is not a valid URL" : "Zadaná webová adresa není platné URL", "The given legal notice address is too long" : "Daná adresa právního upozornění je příliš dlouhá", - "The given legal notice address is not a valid URL" : "Daná adresa právního upozornění není platnou URL adresou", + "The given legal notice address is not a valid URL" : "Daná adresa právního upozornění není platné URL", "The given privacy policy address is too long" : "Daná adresa zásad ochrany osobních údajů je příliš dlouhá", - "The given privacy policy address is not a valid URL" : "Daná adresa prohlášení o ochraně soukromí není platná URL adresa", - "The given slogan is too long" : "Zadaný slogan je příliš dlouhý", - "The given color is invalid" : "Zadaná barva není platná", + "The given privacy policy address is not a valid URL" : "Daná adresa prohlášení o ochraně soukromí není platné URL", + "The given slogan is too long" : "Daný slogan je příliš dlouhý", + "The given color is invalid" : "Daná barva není platná", "The file was uploaded" : "Soubor byl nahrán", "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Velikost nahrávaného souboru překračuje limit nastavení direktivou upload_max_filesize v php.ini", - "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Nahraný soubor překračuje nastavení MAX_FILE_SIZE, která byla zadána ve HTML formuláři", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Velikost nahrávaného souboru překračuje nastavení MAX_FILE_SIZE, která byla zadána v HTML formuláři", "The file was only partially uploaded" : "Soubor byl nahrán pouze z části", "No file was uploaded" : "Nebyl nahrán žádný soubor", "Missing a temporary folder" : "Chybí složka pro dočasné soubory", @@ -26,7 +26,7 @@ "Theming" : "Motiv vzhledu", "Appearance and accessibility" : "Vzhled a zpřístupnění", "Dark theme with high contrast mode" : "Tmavý motiv vzhledu s režimem vysokého kontrastu", - "Enable dark high contrast mode" : "Zapnout tmavý režim s vysokým kontrastem", + "Enable dark high contrast mode" : "Používat tmavý režim s vysokým kontrastem", "Similar to the high contrast mode, but with dark colours." : "Podobné režimu s vysokým kontrastem, ale s tmavými barvami.", "Dark theme" : "Tmavý motiv vzhledu", "Enable dark theme" : "Používat tmavý motiv vzhledu", @@ -60,13 +60,13 @@ "Logo" : "Logo", "Upload new logo" : "Nahrát nové logo", "Login image" : "Přihlašovací obrázek", - "Upload new login background" : "Nahrát nové přihlašovací pozadí", + "Upload new login background" : "Nahrát nové pozadí pro přihlašovací obrazovku", "Remove background image" : "Odebrat obrázek z pozadí", "Advanced options" : "Pokročilé předvolby", "Legal notice link" : "Odkaz na právní upozornění", "Privacy policy link" : "Odkaz na zásady ochrany osobních údajů", - "Header logo" : "Logo v záhlaví", - "Upload new header logo" : "Nahrát nové logo do záhlaví", + "Header logo" : "Logo pro záhlaví", + "Upload new header logo" : "Nahrát nové logo pro záhlaví", "Favicon" : "ikona webu", "Upload new favicon" : "Nahrát novou ikonu webu", "Install the Imagemagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Nainstalujte rozšíření Imagemagick PHP s podporou obrázků SVG, které automaticky vytváří favicon na základě nahraného loga a barvy." diff --git a/apps/theming/l10n/eu.js b/apps/theming/l10n/eu.js index ea7e42de27c..85b08fc8da1 100644 --- a/apps/theming/l10n/eu.js +++ b/apps/theming/l10n/eu.js @@ -23,7 +23,7 @@ OC.L10N.register( "Missing a temporary folder" : "Aldi baterako karpeta bat falta da", "Could not write file to disk" : "Ezin izan da fitxategia diskoan idatzi", "A PHP extension stopped the file upload" : "PHP hedapen batek fitxategiaren karga gelditu du", - "No file uploaded" : "Ez da fitxategirik igo", + "No file uploaded" : "Ez da fitxategirik kargatu", "You are already using a custom theme. Theming app settings might be overwritten by that." : "Gai pertsonalizatua erabiltzen ari zara dagoeneko. Gaiaren aplikazioaren ezarpenak gainidatzi ditzake.", "Theming" : "Itxura", "Appearance and accessibility" : "Itxura eta irisgarritasuna", diff --git a/apps/theming/l10n/eu.json b/apps/theming/l10n/eu.json index cc4a0d9706a..70f85feda37 100644 --- a/apps/theming/l10n/eu.json +++ b/apps/theming/l10n/eu.json @@ -21,7 +21,7 @@ "Missing a temporary folder" : "Aldi baterako karpeta bat falta da", "Could not write file to disk" : "Ezin izan da fitxategia diskoan idatzi", "A PHP extension stopped the file upload" : "PHP hedapen batek fitxategiaren karga gelditu du", - "No file uploaded" : "Ez da fitxategirik igo", + "No file uploaded" : "Ez da fitxategirik kargatu", "You are already using a custom theme. Theming app settings might be overwritten by that." : "Gai pertsonalizatua erabiltzen ari zara dagoeneko. Gaiaren aplikazioaren ezarpenak gainidatzi ditzake.", "Theming" : "Itxura", "Appearance and accessibility" : "Itxura eta irisgarritasuna", diff --git a/apps/theming/lib/Controller/ThemingController.php b/apps/theming/lib/Controller/ThemingController.php index 94deb2e7376..e671c2d53e8 100644 --- a/apps/theming/lib/Controller/ThemingController.php +++ b/apps/theming/lib/Controller/ThemingController.php @@ -331,7 +331,7 @@ class ThemingController extends Controller { } else { // If not set, we'll rely on the body class $compiler = new Compiler(); - $compiledCss = $compiler->compileString("body[data-theme-$themeId] { $variables $customCss }"); + $compiledCss = $compiler->compileString("[data-theme-$themeId] { $variables $customCss }"); $css = $compiledCss->getCss();; } diff --git a/apps/theming/lib/Themes/DefaultTheme.php b/apps/theming/lib/Themes/DefaultTheme.php index df444ebe2d2..d141a5d3241 100644 --- a/apps/theming/lib/Themes/DefaultTheme.php +++ b/apps/theming/lib/Themes/DefaultTheme.php @@ -91,6 +91,7 @@ class DefaultTheme implements ITheme { $colorPrimaryLight = $this->util->mix($this->primaryColor, $colorMainBackground, -80); $hasCustomLogoHeader = $this->imageManager->hasImage('logo') || $this->imageManager->hasImage('logoheader'); + $hasCustomPrimaryColour = !empty($this->config->getAppValue('theming', 'color')); $variables = [ '--color-main-background' => $colorMainBackground, @@ -191,19 +192,26 @@ class DefaultTheme implements ITheme { '--background-invert-if-bright' => 'invert(100%)', ]; - // Register image variables only if custom-defined $backgroundDeleted = $this->config->getAppValue('theming', 'backgroundMime', '') === 'backgroundColor'; + // If primary as background has been request or if we have a custom primary colour + // let's not define the background image + if ($backgroundDeleted || $hasCustomPrimaryColour) { + $variables["--image-background-plain"] = 'true'; + } + + // Register image variables only if custom-defined foreach(['logo', 'logoheader', 'favicon', 'background'] as $image) { - // If primary as background has been request, let's not define the background image - if ($image === 'background' && $backgroundDeleted) { - $variables["--image-background-plain"] = 'true'; - continue; - } else if ($image === 'background') { - $variables['--image-background-size'] = 'cover'; + if ($this->imageManager->hasImage($image)) { + if ($image === 'background') { + // If background deleted is set, ignoring variable + if ($backgroundDeleted) { + continue; + } + $variables['--image-background-size'] = 'cover'; + } + $variables["--image-$image"] = "url('".$this->imageManager->getImageUrl($image)."')"; } - $variables["--image-$image"] = "url('".$this->imageManager->getImageUrl($image)."')"; } - $variables["--image-login-background"] = $variables["--image-background"]; if ($hasCustomLogoHeader) { $variables["--image-logoheader-custom"] = 'true'; diff --git a/apps/theming/tests/ImageManagerTest.php b/apps/theming/tests/ImageManagerTest.php index 6a9b77234bb..ead9ca113e6 100644 --- a/apps/theming/tests/ImageManagerTest.php +++ b/apps/theming/tests/ImageManagerTest.php @@ -307,7 +307,7 @@ class ImageManagerTest extends TestCase { foreach ($folders as $index => $folder) { $folder->expects($this->any()) ->method('getName') - ->willReturn($index); + ->willReturn("$index"); } $folders[0]->expects($this->once())->method('delete'); $folders[1]->expects($this->once())->method('delete'); diff --git a/apps/updatenotification/l10n/cs.js b/apps/updatenotification/l10n/cs.js index a5429bcee64..f5db017c6e4 100644 --- a/apps/updatenotification/l10n/cs.js +++ b/apps/updatenotification/l10n/cs.js @@ -31,7 +31,7 @@ OC.L10N.register( "Only notifications for app updates are available." : "K dispozici jsou upozornění pouze na aktualizace aplikací.", "The selected update channel makes dedicated notifications for the server obsolete." : "Pro zvolený kanál aktualizací se už vyhrazená upozorňování pro server nepoužívají.", "The selected update channel does not support updates of the server." : "Vybraný kanál aktualizací nepodporuje aktualizace serveru.", - "A new version is available: <strong>{newVersionString}</strong>" : "K dispozici je nová verze: <strong>{newVersionString}</strong>", + "A new version is available: <strong>{newVersionString}</strong>" : "Je k dispozici nová verze: <strong>{newVersionString}</strong>", "Note that after a new release the update only shows up after the first minor release or later. We roll out new versions spread out over time to our users and sometimes skip a version when issues are found. Learn more about updates and release channels at {link}" : "Můžete si všimnout, že po vydání nové verze se aktualizace objeví až po vydání první opravné aktualizace. Nové verze totiž distribuujeme mezi uživatele postupně a občas, pokud jsou nalezeny chyby, danou verzi i přeskočíme. Zjištěte více o aktualizacích a kanálech aktualizací kliknutím na {link}", "Checked on {lastCheckedDate}" : "Zkontrolováno {lastCheckedDate}", "Checking apps for compatible versions" : "Kontrola kompatibilních verzí aplikací", diff --git a/apps/updatenotification/l10n/cs.json b/apps/updatenotification/l10n/cs.json index 23179c436a5..2f01aa38a1a 100644 --- a/apps/updatenotification/l10n/cs.json +++ b/apps/updatenotification/l10n/cs.json @@ -29,7 +29,7 @@ "Only notifications for app updates are available." : "K dispozici jsou upozornění pouze na aktualizace aplikací.", "The selected update channel makes dedicated notifications for the server obsolete." : "Pro zvolený kanál aktualizací se už vyhrazená upozorňování pro server nepoužívají.", "The selected update channel does not support updates of the server." : "Vybraný kanál aktualizací nepodporuje aktualizace serveru.", - "A new version is available: <strong>{newVersionString}</strong>" : "K dispozici je nová verze: <strong>{newVersionString}</strong>", + "A new version is available: <strong>{newVersionString}</strong>" : "Je k dispozici nová verze: <strong>{newVersionString}</strong>", "Note that after a new release the update only shows up after the first minor release or later. We roll out new versions spread out over time to our users and sometimes skip a version when issues are found. Learn more about updates and release channels at {link}" : "Můžete si všimnout, že po vydání nové verze se aktualizace objeví až po vydání první opravné aktualizace. Nové verze totiž distribuujeme mezi uživatele postupně a občas, pokud jsou nalezeny chyby, danou verzi i přeskočíme. Zjištěte více o aktualizacích a kanálech aktualizací kliknutím na {link}", "Checked on {lastCheckedDate}" : "Zkontrolováno {lastCheckedDate}", "Checking apps for compatible versions" : "Kontrola kompatibilních verzí aplikací", diff --git a/apps/updatenotification/l10n/fr.js b/apps/updatenotification/l10n/fr.js index b425d5d7a19..17b5d8b778a 100644 --- a/apps/updatenotification/l10n/fr.js +++ b/apps/updatenotification/l10n/fr.js @@ -45,6 +45,7 @@ OC.L10N.register( "The most recent stable version. It is suited for regular use and will always update to the latest major version." : "La version stable la plus récente. Elle est adaptée pour une utilisation régulière et sera toujours mise à jour vers la dernière version majeure.", "Beta" : "Beta", "A pre-release version only for testing new features, not for production environments." : "Une version préliminaire utilisée seulement pour tester les nouvelles fonctionnalités, n'est pas adaptée dans un environnement de production.", + "_<strong>%n</strong> app has no compatible version for this Nextcloud version available._::_<strong>%n</strong> apps have no compatible version for this Nextcloud version available._" : ["<strong>%n</strong> application n'a pas de version compatible pour cette version de Nextcloud disponible.","<strong>%n</strong> applications n'ont pas de version compatible pour cette version de Nextcloud disponible.","<strong>%n</strong> applications n'ont pas de version compatible pour cette version de Nextcloud disponible."], "<strong>All</strong> apps have a compatible version for this Nextcloud version available" : "<strong></strong>Applications compatibles pour cette version de Nexctloud", "_<strong>%n</strong> app has no compatible version for this Nextcloud version available_::_<strong>%n</strong> apps have no compatible version for this Nextcloud version available_" : ["<strong>%n</strong> application n'a pas de version compatible avec cette version disponible de Nextcloud","<strong>%n</strong> applications n'ont pas de version compatible avec cette version disponible de Nextcloud","<strong>%n</strong> applications n'ont pas de version compatible avec cette version disponible de Nextcloud"] }, diff --git a/apps/updatenotification/l10n/fr.json b/apps/updatenotification/l10n/fr.json index eb1754b4584..77190da4319 100644 --- a/apps/updatenotification/l10n/fr.json +++ b/apps/updatenotification/l10n/fr.json @@ -43,6 +43,7 @@ "The most recent stable version. It is suited for regular use and will always update to the latest major version." : "La version stable la plus récente. Elle est adaptée pour une utilisation régulière et sera toujours mise à jour vers la dernière version majeure.", "Beta" : "Beta", "A pre-release version only for testing new features, not for production environments." : "Une version préliminaire utilisée seulement pour tester les nouvelles fonctionnalités, n'est pas adaptée dans un environnement de production.", + "_<strong>%n</strong> app has no compatible version for this Nextcloud version available._::_<strong>%n</strong> apps have no compatible version for this Nextcloud version available._" : ["<strong>%n</strong> application n'a pas de version compatible pour cette version de Nextcloud disponible.","<strong>%n</strong> applications n'ont pas de version compatible pour cette version de Nextcloud disponible.","<strong>%n</strong> applications n'ont pas de version compatible pour cette version de Nextcloud disponible."], "<strong>All</strong> apps have a compatible version for this Nextcloud version available" : "<strong></strong>Applications compatibles pour cette version de Nexctloud", "_<strong>%n</strong> app has no compatible version for this Nextcloud version available_::_<strong>%n</strong> apps have no compatible version for this Nextcloud version available_" : ["<strong>%n</strong> application n'a pas de version compatible avec cette version disponible de Nextcloud","<strong>%n</strong> applications n'ont pas de version compatible avec cette version disponible de Nextcloud","<strong>%n</strong> applications n'ont pas de version compatible avec cette version disponible de Nextcloud"] },"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" diff --git a/apps/updatenotification/l10n/mk.js b/apps/updatenotification/l10n/mk.js index 1e0b6a2ab8a..fe6d2b65ef2 100644 --- a/apps/updatenotification/l10n/mk.js +++ b/apps/updatenotification/l10n/mk.js @@ -16,6 +16,7 @@ OC.L10N.register( "Apps missing compatible version" : "Апликации на кој им недостасува компатибилност", "View in store" : "Преглед во продавницата за апликации", "Apps with compatible version" : "Апликации со компатибилни верзии", + "Please note that the web updater is not recommended with more than 100 users! Please use the command line updater instead!" : "Имајте на ум дека веб ажурирачот не го препорачуваат повеќе од 100 корисници! Наместо тоа, користете го ажурирачот на командната линија!", "Open updater" : "Стартувај го надградувачот", "Download now" : "Преземи", "Please use the command line updater to update." : "Користете ја командната линија за ажурирање.", @@ -23,6 +24,7 @@ OC.L10N.register( "The update check is not yet finished. Please refresh the page." : "Сеуште нема извшено проверка за ажурирање, Ве молиме рефреширајте ја страната.", "Your version is up to date." : "Вашата верзија е ажурирана.", "A non-default update server is in use to be checked for updates:" : "Нестандарден сервер е поставен за проверка за ажурирање:", + "You can change the update channel below which also affects the apps management page. E.g. after switching to the beta channel, beta app updates will be offered to you in the apps management page." : "Може да го промените каналот за ажурирање подолу, што исто така влијае на страницата за управување со апликации. На пр. откако ќе се префрлите на бета каналот, ќе ви бидат понудени ажурирања на бета апликации на страницата за управување со апликации.", "Update channel:" : "Канал за ажурирање:", "You can always update to a newer version. But you can never downgrade to a more stable version." : "Секогаш можете да ажурирате на нова верзија. Но никогаш нема да можете да се вратите на постара верзија.", "Notify members of the following groups about available updates:" : "Извести ги членовите на овие групи за достапните ажурирања:", @@ -34,6 +36,8 @@ OC.L10N.register( "Checked on {lastCheckedDate}" : "Проверено на {lastCheckedDate}", "Checking apps for compatible versions" : "Проверка за компатибилност на апликациите со новата верзија", "Please make sure your config.php does not set <samp>appstoreenabled</samp> to false." : "Бидете сигурни дека во config.php датотеката параматарот <samp>appstoreenabled</samp> е поставен на false.", + "Could not connect to the App Store or no updates have been returned at all. Search manually for updates or make sure your server has access to the internet and can connect to the App Store." : "Неможе да се поврзе со appstore или одговорот е дека нема ажурирање. Пребарајте рачно за ажурирање или бидете сигурни дека серверот има пристап до интернет и може да се поврзе со продавницата.", + "<strong>All</strong> apps have a compatible version for this Nextcloud version available." : "<strong>Сите</strong> апликации се компатибилни за оваа верзија", "View changelog" : "Видете ги проммените", "Enterprise" : "Професионален", "For enterprise use. Provides always the latest patch level, but will not update to the next major release immediately. That update happens once Nextcloud GmbH has done additional hardening and testing for large-scale and mission-critical deployments. This channel is only available to customers and provides the Nextcloud Enterprise package." : "За професионална употреба. Овозможува секогаш најново ниво на ажурирање, но нема веднаш да се ажурира на следното големо издание. Ова ажурирање се случува откако Nextcloud GmbH ќе направи дополнително тестирање за големи и критични сервери. Овој канал е достапен само за клиентите и го имаат пакетот Nextcloud Enterprise.", @@ -41,6 +45,7 @@ OC.L10N.register( "The most recent stable version. It is suited for regular use and will always update to the latest major version." : "Најнова стабилна верзија. Корисно за редовна употреба и секогаш ќе се ажурира до последната најнова верзија.", "Beta" : "Бета", "A pre-release version only for testing new features, not for production environments." : "Неиздадена верзија само за тестирање на новите можности, не е за редовна употреба.", + "_<strong>%n</strong> app has no compatible version for this Nextcloud version available._::_<strong>%n</strong> apps have no compatible version for this Nextcloud version available._" : ["1 апликација нема компатибилност со оваа веријза","<strong>%n</strong> апликации немаат компатибилност со оваа веријза"], "<strong>All</strong> apps have a compatible version for this Nextcloud version available" : "<strong>Сите</strong> апликации се компатибилни за оваа верзија", "_<strong>%n</strong> app has no compatible version for this Nextcloud version available_::_<strong>%n</strong> apps have no compatible version for this Nextcloud version available_" : ["<strong>%n</strong> апликација нема компатибилност со оваа веријза","<strong>%n</strong> апликации немаат компатибилност со оваа веријза"] }, diff --git a/apps/updatenotification/l10n/mk.json b/apps/updatenotification/l10n/mk.json index 0bbbbf835bc..55accc5c380 100644 --- a/apps/updatenotification/l10n/mk.json +++ b/apps/updatenotification/l10n/mk.json @@ -14,6 +14,7 @@ "Apps missing compatible version" : "Апликации на кој им недостасува компатибилност", "View in store" : "Преглед во продавницата за апликации", "Apps with compatible version" : "Апликации со компатибилни верзии", + "Please note that the web updater is not recommended with more than 100 users! Please use the command line updater instead!" : "Имајте на ум дека веб ажурирачот не го препорачуваат повеќе од 100 корисници! Наместо тоа, користете го ажурирачот на командната линија!", "Open updater" : "Стартувај го надградувачот", "Download now" : "Преземи", "Please use the command line updater to update." : "Користете ја командната линија за ажурирање.", @@ -21,6 +22,7 @@ "The update check is not yet finished. Please refresh the page." : "Сеуште нема извшено проверка за ажурирање, Ве молиме рефреширајте ја страната.", "Your version is up to date." : "Вашата верзија е ажурирана.", "A non-default update server is in use to be checked for updates:" : "Нестандарден сервер е поставен за проверка за ажурирање:", + "You can change the update channel below which also affects the apps management page. E.g. after switching to the beta channel, beta app updates will be offered to you in the apps management page." : "Може да го промените каналот за ажурирање подолу, што исто така влијае на страницата за управување со апликации. На пр. откако ќе се префрлите на бета каналот, ќе ви бидат понудени ажурирања на бета апликации на страницата за управување со апликации.", "Update channel:" : "Канал за ажурирање:", "You can always update to a newer version. But you can never downgrade to a more stable version." : "Секогаш можете да ажурирате на нова верзија. Но никогаш нема да можете да се вратите на постара верзија.", "Notify members of the following groups about available updates:" : "Извести ги членовите на овие групи за достапните ажурирања:", @@ -32,6 +34,8 @@ "Checked on {lastCheckedDate}" : "Проверено на {lastCheckedDate}", "Checking apps for compatible versions" : "Проверка за компатибилност на апликациите со новата верзија", "Please make sure your config.php does not set <samp>appstoreenabled</samp> to false." : "Бидете сигурни дека во config.php датотеката параматарот <samp>appstoreenabled</samp> е поставен на false.", + "Could not connect to the App Store or no updates have been returned at all. Search manually for updates or make sure your server has access to the internet and can connect to the App Store." : "Неможе да се поврзе со appstore или одговорот е дека нема ажурирање. Пребарајте рачно за ажурирање или бидете сигурни дека серверот има пристап до интернет и може да се поврзе со продавницата.", + "<strong>All</strong> apps have a compatible version for this Nextcloud version available." : "<strong>Сите</strong> апликации се компатибилни за оваа верзија", "View changelog" : "Видете ги проммените", "Enterprise" : "Професионален", "For enterprise use. Provides always the latest patch level, but will not update to the next major release immediately. That update happens once Nextcloud GmbH has done additional hardening and testing for large-scale and mission-critical deployments. This channel is only available to customers and provides the Nextcloud Enterprise package." : "За професионална употреба. Овозможува секогаш најново ниво на ажурирање, но нема веднаш да се ажурира на следното големо издание. Ова ажурирање се случува откако Nextcloud GmbH ќе направи дополнително тестирање за големи и критични сервери. Овој канал е достапен само за клиентите и го имаат пакетот Nextcloud Enterprise.", @@ -39,6 +43,7 @@ "The most recent stable version. It is suited for regular use and will always update to the latest major version." : "Најнова стабилна верзија. Корисно за редовна употреба и секогаш ќе се ажурира до последната најнова верзија.", "Beta" : "Бета", "A pre-release version only for testing new features, not for production environments." : "Неиздадена верзија само за тестирање на новите можности, не е за редовна употреба.", + "_<strong>%n</strong> app has no compatible version for this Nextcloud version available._::_<strong>%n</strong> apps have no compatible version for this Nextcloud version available._" : ["1 апликација нема компатибилност со оваа веријза","<strong>%n</strong> апликации немаат компатибилност со оваа веријза"], "<strong>All</strong> apps have a compatible version for this Nextcloud version available" : "<strong>Сите</strong> апликации се компатибилни за оваа верзија", "_<strong>%n</strong> app has no compatible version for this Nextcloud version available_::_<strong>%n</strong> apps have no compatible version for this Nextcloud version available_" : ["<strong>%n</strong> апликација нема компатибилност со оваа веријза","<strong>%n</strong> апликации немаат компатибилност со оваа веријза"] },"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;" diff --git a/apps/user_ldap/l10n/de.js b/apps/user_ldap/l10n/de.js index 1afe50501ca..9e606c6ae1d 100644 --- a/apps/user_ldap/l10n/de.js +++ b/apps/user_ldap/l10n/de.js @@ -33,7 +33,7 @@ OC.L10N.register( "No object found in the given Base DN. Please revise." : "Keine Objekte in der Base-DN gefunden, bitte überprüfen.", "More than 1,000 directory entries available." : "Mehr als 1.000 Einträge stehen zur Verfügung.", "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} Eintrag in der angegebenen Base DN verfügbar","{objectsFound} Einträge in der angegebenen Base DN verfügbar"], - "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Ein Fehler ist aufgetreten. Bitte die Base DN sowie die Verbindungs- und Anmeldeeinstellungen überprüfen.", + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Es ist ein Fehler aufgetreten. Bitte überprüfe die Base DN sowie die Verbindungs- und Anmeldeeinstellungen.", "Do you really want to delete the current Server Configuration?" : "Möchtest du die aktuelle Serverkonfiguration wirklich löschen?", "Confirm Deletion" : "Löschen bestätigen", "Mappings cleared successfully!" : "Zuordnungen erfolgreich gelöscht!", diff --git a/apps/user_ldap/l10n/de.json b/apps/user_ldap/l10n/de.json index 9cf433ef772..5387bb1932e 100644 --- a/apps/user_ldap/l10n/de.json +++ b/apps/user_ldap/l10n/de.json @@ -31,7 +31,7 @@ "No object found in the given Base DN. Please revise." : "Keine Objekte in der Base-DN gefunden, bitte überprüfen.", "More than 1,000 directory entries available." : "Mehr als 1.000 Einträge stehen zur Verfügung.", "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} Eintrag in der angegebenen Base DN verfügbar","{objectsFound} Einträge in der angegebenen Base DN verfügbar"], - "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Ein Fehler ist aufgetreten. Bitte die Base DN sowie die Verbindungs- und Anmeldeeinstellungen überprüfen.", + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Es ist ein Fehler aufgetreten. Bitte überprüfe die Base DN sowie die Verbindungs- und Anmeldeeinstellungen.", "Do you really want to delete the current Server Configuration?" : "Möchtest du die aktuelle Serverkonfiguration wirklich löschen?", "Confirm Deletion" : "Löschen bestätigen", "Mappings cleared successfully!" : "Zuordnungen erfolgreich gelöscht!", diff --git a/apps/user_ldap/l10n/tr.js b/apps/user_ldap/l10n/tr.js index 2fff2b537ce..dc928305bd8 100644 --- a/apps/user_ldap/l10n/tr.js +++ b/apps/user_ldap/l10n/tr.js @@ -56,8 +56,8 @@ OC.L10N.register( "Password change rejected. Hint: " : "Parola değişimi reddedildi. İpucu:", "Please login with the new password" : "Lütfen yeni parolanız ile oturum açın", "LDAP User backend" : "LDAP kullanıcı arka yüzü", - "Your password will expire tomorrow." : "Parolanızın süresi yarın dolacak.", - "Your password will expire today." : "Parolanızın süresi bugün dolacak.", + "Your password will expire tomorrow." : "Parolanızın geçerlilik süresi yarın dolacak.", + "Your password will expire today." : "Parolanızın geçerlilik süresi bugün dolacak.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Parolanızın süresi %n gün içinde dolacak.","Parolanızın süresi %n gün içinde dolacak."], "LDAP/AD integration" : "LDAP/AD bütünleştirmesi", "_%s group found_::_%s groups found_" : ["%s grup bulundu","%s grup bulundu"], diff --git a/apps/user_ldap/l10n/tr.json b/apps/user_ldap/l10n/tr.json index c7e9d1a55d1..de877f1921c 100644 --- a/apps/user_ldap/l10n/tr.json +++ b/apps/user_ldap/l10n/tr.json @@ -54,8 +54,8 @@ "Password change rejected. Hint: " : "Parola değişimi reddedildi. İpucu:", "Please login with the new password" : "Lütfen yeni parolanız ile oturum açın", "LDAP User backend" : "LDAP kullanıcı arka yüzü", - "Your password will expire tomorrow." : "Parolanızın süresi yarın dolacak.", - "Your password will expire today." : "Parolanızın süresi bugün dolacak.", + "Your password will expire tomorrow." : "Parolanızın geçerlilik süresi yarın dolacak.", + "Your password will expire today." : "Parolanızın geçerlilik süresi bugün dolacak.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Parolanızın süresi %n gün içinde dolacak.","Parolanızın süresi %n gün içinde dolacak."], "LDAP/AD integration" : "LDAP/AD bütünleştirmesi", "_%s group found_::_%s groups found_" : ["%s grup bulundu","%s grup bulundu"], diff --git a/apps/user_status/l10n/cs.js b/apps/user_status/l10n/cs.js index 4b058fbc720..773acd2da3e 100644 --- a/apps/user_status/l10n/cs.js +++ b/apps/user_status/l10n/cs.js @@ -23,11 +23,11 @@ OC.L10N.register( "Away" : "Pryč", "Do not disturb" : "Nerušit", "{status}, {timestamp}" : "{status}, {timestamp}", - "Don't clear" : "Nikdy", + "Don't clear" : "Do odvolání", "Today" : "Dnes", "This week" : "Tento týden", "Online" : "Online", - "Invisible" : "Neviditelný", + "Invisible" : "Není vidět", "Offline" : "Offline", "There was an error saving the new status" : "Při ukládání nového stavu došlo k chybě", "30 minutes" : "30 minut", diff --git a/apps/user_status/l10n/cs.json b/apps/user_status/l10n/cs.json index bcec96ec7a7..d82faeea05d 100644 --- a/apps/user_status/l10n/cs.json +++ b/apps/user_status/l10n/cs.json @@ -21,11 +21,11 @@ "Away" : "Pryč", "Do not disturb" : "Nerušit", "{status}, {timestamp}" : "{status}, {timestamp}", - "Don't clear" : "Nikdy", + "Don't clear" : "Do odvolání", "Today" : "Dnes", "This week" : "Tento týden", "Online" : "Online", - "Invisible" : "Neviditelný", + "Invisible" : "Není vidět", "Offline" : "Offline", "There was an error saving the new status" : "Při ukládání nového stavu došlo k chybě", "30 minutes" : "30 minut", diff --git a/apps/weather_status/l10n/cs.js b/apps/weather_status/l10n/cs.js index e83018187d8..f4bf4ce706e 100644 --- a/apps/weather_status/l10n/cs.js +++ b/apps/weather_status/l10n/cs.js @@ -6,57 +6,57 @@ OC.L10N.register( "Malformed JSON data." : "Nesprávně formátovaná JSON data.", "Error" : "Chyba", "Weather status" : "Stav počasí", - "Weather status in your dashboard" : "Stav počasí ve vašem přehledu", - "Weather status integrated in the Dashboard app.\n User's position can be automatically determined or manually defined. A 6 hours forecast is then displayed.\n This status can also be integrated in other places like the Calendar app." : "Napojení stavu počasí pro aplikaci Přehled.\n Polohu uživatele je možné zjistit automaticky nebo zadat ručně. Poté je zobrazována předpověď na příštích 6 hodin.\n Tento stav je také možné začlenit do ostatních míst, jako například Kalendář.", + "Weather status in your dashboard" : "Stav počasí na vaší nástěnce", + "Weather status integrated in the Dashboard app.\n User's position can be automatically determined or manually defined. A 6 hours forecast is then displayed.\n This status can also be integrated in other places like the Calendar app." : "Napojení ohledně stavu počasí pro aplikaci Nástěnka.\n Polohu uživatele je možné zjistit automaticky nebo zadat ručně. Poté je zobrazována předpověď na příštích 6 hodin.\n Tento stav je také možné začlenit do ostatních míst, jako například Kalendář.", "Detect location" : "Zjistit polohu", - "Set custom address" : "Nastavit uživatelsky určenou adresu", + "Set custom address" : "Nastavit vlastní adresu", "Favorites" : "Oblíbené", - "{temperature} {unit} clear sky later today" : "{temperature} {unit} jasná obloha dnes", + "{temperature} {unit} clear sky later today" : "{temperature} {unit} bude jasná obloha", "{temperature} {unit} clear sky" : "{temperature} {unit} jasná obloha", - "{temperature} {unit} cloudy later today" : "{temperature} {unit} zataženo dnes později", + "{temperature} {unit} cloudy later today" : "{temperature} {unit} bude zataženo", "{temperature} {unit} cloudy" : "{temperature} {unit} zataženo", - "{temperature} {unit} fair weather later today" : "{temperature} {unit} krásný den dnes později", - "{temperature} {unit} fair weather" : "{temperature} {unit} krásný den", - "{temperature} {unit} partly cloudy later today" : "{temperature} {unit} Polojasno dnes později", + "{temperature} {unit} fair weather later today" : "{temperature} {unit} bude hezky", + "{temperature} {unit} fair weather" : "{temperature} {unit} krásné počasí", + "{temperature} {unit} partly cloudy later today" : "{temperature} {unit} bude polojasno", "{temperature} {unit} partly cloudy" : "{temperature} {unit} polojasno", - "{temperature} {unit} foggy later today" : "{temperature} {unit} mlhavo dnes později", + "{temperature} {unit} foggy later today" : "{temperature} {unit} bude mlhavo", "{temperature} {unit} foggy" : "{temperature} {unit} mlhavo", - "{temperature} {unit} light rainfall later today" : "{temperature} {unit} drobný déšť dnes později", + "{temperature} {unit} light rainfall later today" : "{temperature} {unit} bude drobně pršet", "{temperature} {unit} light rainfall" : "{temperature} {unit} drobný déšť", - "{temperature} {unit} rainfall later today" : "{temperature} {unit} drobný déšť dnes později", + "{temperature} {unit} rainfall later today" : "{temperature} {unit} bude pršet", "{temperature} {unit} rainfall" : "{temperature} {unit} déšť", - "{temperature} {unit} heavy rainfall later today" : "{temperature} {unit} hustý déšť dnes později", + "{temperature} {unit} heavy rainfall later today" : "{temperature} {unit} bude vydatně pršet", "{temperature} {unit} heavy rainfall" : "{temperature} {unit} hustý déšť", - "{temperature} {unit} rainfall showers later today" : "{temperature} {unit} přeháňky dnes později", + "{temperature} {unit} rainfall showers later today" : "{temperature} {unit} budou přeháňky", "{temperature} {unit} rainfall showers" : "{temperature} {unit} přeháňky", - "{temperature} {unit} light rainfall showers later today" : "{temperature} {unit} drobné přeháňky dnes později", + "{temperature} {unit} light rainfall showers later today" : "{temperature} {unit} budou drobné přeháňky", "{temperature} {unit} light rainfall showers" : "{temperature} {unit} drobné přeháňky", - "{temperature} {unit} heavy rainfall showers later today" : "{temperature} {unit} intenzivní přeháňky dnes později", + "{temperature} {unit} heavy rainfall showers later today" : "{temperature} {unit} budou vydatné přeháňky", "{temperature} {unit} heavy rainfall showers" : "{temperature} {unit} intenzivní přeháňky", "More weather for {adr}" : "Více o počasí pro {adr}", - "Loading weather" : "Načítá se počasí", + "Loading weather" : "Načítání údajů o počasí", "Remove from favorites" : "Odebrat z oblíbených", - "Add as favorite" : "Přidat jako oblíbené", + "Add as favorite" : "Přidat do oblíbených", "You are not logged in." : "Nejste přihlášení.", "There was an error getting the weather status information." : "Při získávání informací o stavu počasí došlo k chybě.", - "No weather information found" : "Nenalezeny žádné informace o počasí", + "No weather information found" : "Nenalezeny žádné údaje o počasí", "Location not found" : "Umístění nenalezeno", - "There was an error setting the location address." : "Došlo k chybě při nastavování adresy umístění.", + "There was an error setting the location address." : "Při nastavování adresy umístění došlo k chybě.", "There was an error setting the location." : "Při nastavování umístění došlo k chybě.", "There was an error saving the mode." : "Při ukládání režimu došlo k chybě.", - "There was an error using personal address." : "Při použití osobní adresy došlo k chybě.", + "There was an error using personal address." : "Při použití vaší osobní adresy došlo k chybě.", "Set location for weather" : "Nastavit místo pro které předpovídat počasí", - "{temperature} {unit} Clear sky at {time}" : "{temperature} {unit} Jasná obloha v {time}", - "{temperature} {unit} Cloudy at {time}" : "{temperature} {unit} Zataženo v {time}", - "{temperature} {unit} Fair day at {time}" : "{temperature} {unit} Krásný den v {time}", - "{temperature} {unit} Fair night at {time}" : "{temperature} {unit} Bezmračná noc v {time}", - "{temperature} {unit} Partly cloudy at {time}" : "{temperature} {unit} Polojasno v {time}", - "{temperature} {unit} Foggy at {time}" : "{temperature} {unit} Mlhavo v {time}", - "{temperature} {unit} Light rain at {time}" : "{temperature} {unit} Drobný déšť v {time}", - "{temperature} {unit} Rain at {time}" : "{temperature} {unit} Désť v {time}", - "{temperature} {unit} Heavy rain at {time}" : "{temperature} {unit} Hustý déšť {time}", - "{temperature} {unit} Rain showers at {time}" : "{temperature} {unit} Přeháňky v {time}", - "{temperature} {unit} Light rain showers at {time}" : "{temperature} {unit} Lehké přeháňky v {time}", - "{temperature} {unit} Heavy rain showers at {time}" : "{temperature} {unit} Vydatné deště v {time}" + "{temperature} {unit} Clear sky at {time}" : "{temperature} {unit} jasná obloha v {time}", + "{temperature} {unit} Cloudy at {time}" : "{temperature} {unit} zataženo v {time}", + "{temperature} {unit} Fair day at {time}" : "{temperature} {unit} krásné počasí v {time}", + "{temperature} {unit} Fair night at {time}" : "{temperature} {unit} bezmračná noc v {time}", + "{temperature} {unit} Partly cloudy at {time}" : "{temperature} {unit} polojasno v {time}", + "{temperature} {unit} Foggy at {time}" : "{temperature} {unit} mlhavo v {time}", + "{temperature} {unit} Light rain at {time}" : "{temperature} {unit} drobný déšť v {time}", + "{temperature} {unit} Rain at {time}" : "{temperature} {unit} déšť v {time}", + "{temperature} {unit} Heavy rain at {time}" : "{temperature} {unit} hustý déšť {time}", + "{temperature} {unit} Rain showers at {time}" : "{temperature} {unit} přeháňky v {time}", + "{temperature} {unit} Light rain showers at {time}" : "{temperature} {unit} lehké přeháňky v {time}", + "{temperature} {unit} Heavy rain showers at {time}" : "{temperature} {unit} intenzivní přeháňky v {time}" }, "nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;"); diff --git a/apps/weather_status/l10n/cs.json b/apps/weather_status/l10n/cs.json index 1a90e43161d..8dde4b45692 100644 --- a/apps/weather_status/l10n/cs.json +++ b/apps/weather_status/l10n/cs.json @@ -4,57 +4,57 @@ "Malformed JSON data." : "Nesprávně formátovaná JSON data.", "Error" : "Chyba", "Weather status" : "Stav počasí", - "Weather status in your dashboard" : "Stav počasí ve vašem přehledu", - "Weather status integrated in the Dashboard app.\n User's position can be automatically determined or manually defined. A 6 hours forecast is then displayed.\n This status can also be integrated in other places like the Calendar app." : "Napojení stavu počasí pro aplikaci Přehled.\n Polohu uživatele je možné zjistit automaticky nebo zadat ručně. Poté je zobrazována předpověď na příštích 6 hodin.\n Tento stav je také možné začlenit do ostatních míst, jako například Kalendář.", + "Weather status in your dashboard" : "Stav počasí na vaší nástěnce", + "Weather status integrated in the Dashboard app.\n User's position can be automatically determined or manually defined. A 6 hours forecast is then displayed.\n This status can also be integrated in other places like the Calendar app." : "Napojení ohledně stavu počasí pro aplikaci Nástěnka.\n Polohu uživatele je možné zjistit automaticky nebo zadat ručně. Poté je zobrazována předpověď na příštích 6 hodin.\n Tento stav je také možné začlenit do ostatních míst, jako například Kalendář.", "Detect location" : "Zjistit polohu", - "Set custom address" : "Nastavit uživatelsky určenou adresu", + "Set custom address" : "Nastavit vlastní adresu", "Favorites" : "Oblíbené", - "{temperature} {unit} clear sky later today" : "{temperature} {unit} jasná obloha dnes", + "{temperature} {unit} clear sky later today" : "{temperature} {unit} bude jasná obloha", "{temperature} {unit} clear sky" : "{temperature} {unit} jasná obloha", - "{temperature} {unit} cloudy later today" : "{temperature} {unit} zataženo dnes později", + "{temperature} {unit} cloudy later today" : "{temperature} {unit} bude zataženo", "{temperature} {unit} cloudy" : "{temperature} {unit} zataženo", - "{temperature} {unit} fair weather later today" : "{temperature} {unit} krásný den dnes později", - "{temperature} {unit} fair weather" : "{temperature} {unit} krásný den", - "{temperature} {unit} partly cloudy later today" : "{temperature} {unit} Polojasno dnes později", + "{temperature} {unit} fair weather later today" : "{temperature} {unit} bude hezky", + "{temperature} {unit} fair weather" : "{temperature} {unit} krásné počasí", + "{temperature} {unit} partly cloudy later today" : "{temperature} {unit} bude polojasno", "{temperature} {unit} partly cloudy" : "{temperature} {unit} polojasno", - "{temperature} {unit} foggy later today" : "{temperature} {unit} mlhavo dnes později", + "{temperature} {unit} foggy later today" : "{temperature} {unit} bude mlhavo", "{temperature} {unit} foggy" : "{temperature} {unit} mlhavo", - "{temperature} {unit} light rainfall later today" : "{temperature} {unit} drobný déšť dnes později", + "{temperature} {unit} light rainfall later today" : "{temperature} {unit} bude drobně pršet", "{temperature} {unit} light rainfall" : "{temperature} {unit} drobný déšť", - "{temperature} {unit} rainfall later today" : "{temperature} {unit} drobný déšť dnes později", + "{temperature} {unit} rainfall later today" : "{temperature} {unit} bude pršet", "{temperature} {unit} rainfall" : "{temperature} {unit} déšť", - "{temperature} {unit} heavy rainfall later today" : "{temperature} {unit} hustý déšť dnes později", + "{temperature} {unit} heavy rainfall later today" : "{temperature} {unit} bude vydatně pršet", "{temperature} {unit} heavy rainfall" : "{temperature} {unit} hustý déšť", - "{temperature} {unit} rainfall showers later today" : "{temperature} {unit} přeháňky dnes později", + "{temperature} {unit} rainfall showers later today" : "{temperature} {unit} budou přeháňky", "{temperature} {unit} rainfall showers" : "{temperature} {unit} přeháňky", - "{temperature} {unit} light rainfall showers later today" : "{temperature} {unit} drobné přeháňky dnes později", + "{temperature} {unit} light rainfall showers later today" : "{temperature} {unit} budou drobné přeháňky", "{temperature} {unit} light rainfall showers" : "{temperature} {unit} drobné přeháňky", - "{temperature} {unit} heavy rainfall showers later today" : "{temperature} {unit} intenzivní přeháňky dnes později", + "{temperature} {unit} heavy rainfall showers later today" : "{temperature} {unit} budou vydatné přeháňky", "{temperature} {unit} heavy rainfall showers" : "{temperature} {unit} intenzivní přeháňky", "More weather for {adr}" : "Více o počasí pro {adr}", - "Loading weather" : "Načítá se počasí", + "Loading weather" : "Načítání údajů o počasí", "Remove from favorites" : "Odebrat z oblíbených", - "Add as favorite" : "Přidat jako oblíbené", + "Add as favorite" : "Přidat do oblíbených", "You are not logged in." : "Nejste přihlášení.", "There was an error getting the weather status information." : "Při získávání informací o stavu počasí došlo k chybě.", - "No weather information found" : "Nenalezeny žádné informace o počasí", + "No weather information found" : "Nenalezeny žádné údaje o počasí", "Location not found" : "Umístění nenalezeno", - "There was an error setting the location address." : "Došlo k chybě při nastavování adresy umístění.", + "There was an error setting the location address." : "Při nastavování adresy umístění došlo k chybě.", "There was an error setting the location." : "Při nastavování umístění došlo k chybě.", "There was an error saving the mode." : "Při ukládání režimu došlo k chybě.", - "There was an error using personal address." : "Při použití osobní adresy došlo k chybě.", + "There was an error using personal address." : "Při použití vaší osobní adresy došlo k chybě.", "Set location for weather" : "Nastavit místo pro které předpovídat počasí", - "{temperature} {unit} Clear sky at {time}" : "{temperature} {unit} Jasná obloha v {time}", - "{temperature} {unit} Cloudy at {time}" : "{temperature} {unit} Zataženo v {time}", - "{temperature} {unit} Fair day at {time}" : "{temperature} {unit} Krásný den v {time}", - "{temperature} {unit} Fair night at {time}" : "{temperature} {unit} Bezmračná noc v {time}", - "{temperature} {unit} Partly cloudy at {time}" : "{temperature} {unit} Polojasno v {time}", - "{temperature} {unit} Foggy at {time}" : "{temperature} {unit} Mlhavo v {time}", - "{temperature} {unit} Light rain at {time}" : "{temperature} {unit} Drobný déšť v {time}", - "{temperature} {unit} Rain at {time}" : "{temperature} {unit} Désť v {time}", - "{temperature} {unit} Heavy rain at {time}" : "{temperature} {unit} Hustý déšť {time}", - "{temperature} {unit} Rain showers at {time}" : "{temperature} {unit} Přeháňky v {time}", - "{temperature} {unit} Light rain showers at {time}" : "{temperature} {unit} Lehké přeháňky v {time}", - "{temperature} {unit} Heavy rain showers at {time}" : "{temperature} {unit} Vydatné deště v {time}" + "{temperature} {unit} Clear sky at {time}" : "{temperature} {unit} jasná obloha v {time}", + "{temperature} {unit} Cloudy at {time}" : "{temperature} {unit} zataženo v {time}", + "{temperature} {unit} Fair day at {time}" : "{temperature} {unit} krásné počasí v {time}", + "{temperature} {unit} Fair night at {time}" : "{temperature} {unit} bezmračná noc v {time}", + "{temperature} {unit} Partly cloudy at {time}" : "{temperature} {unit} polojasno v {time}", + "{temperature} {unit} Foggy at {time}" : "{temperature} {unit} mlhavo v {time}", + "{temperature} {unit} Light rain at {time}" : "{temperature} {unit} drobný déšť v {time}", + "{temperature} {unit} Rain at {time}" : "{temperature} {unit} déšť v {time}", + "{temperature} {unit} Heavy rain at {time}" : "{temperature} {unit} hustý déšť {time}", + "{temperature} {unit} Rain showers at {time}" : "{temperature} {unit} přeháňky v {time}", + "{temperature} {unit} Light rain showers at {time}" : "{temperature} {unit} lehké přeháňky v {time}", + "{temperature} {unit} Heavy rain showers at {time}" : "{temperature} {unit} intenzivní přeháňky v {time}" },"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;" }
\ No newline at end of file diff --git a/apps/workflowengine/l10n/fr.js b/apps/workflowengine/l10n/fr.js index aa6eddbe531..b4ad395766e 100644 --- a/apps/workflowengine/l10n/fr.js +++ b/apps/workflowengine/l10n/fr.js @@ -54,6 +54,7 @@ OC.L10N.register( "Images" : "Images", "Office documents" : "Documents Office", "PDF documents" : "Documents PDF", + "Custom MIME type" : "Type MIME personnalisé", "Custom mimetype" : "mimetype personnalisé", "Select a tag" : "Choisir une étiquette", "No results" : "Aucun résultat", diff --git a/apps/workflowengine/l10n/fr.json b/apps/workflowengine/l10n/fr.json index 45cafd242e2..d314995394c 100644 --- a/apps/workflowengine/l10n/fr.json +++ b/apps/workflowengine/l10n/fr.json @@ -52,6 +52,7 @@ "Images" : "Images", "Office documents" : "Documents Office", "PDF documents" : "Documents PDF", + "Custom MIME type" : "Type MIME personnalisé", "Custom mimetype" : "mimetype personnalisé", "Select a tag" : "Choisir une étiquette", "No results" : "Aucun résultat", diff --git a/composer.lock b/composer.lock index 0176e90bcf5..46cdcd56358 100644 --- a/composer.lock +++ b/composer.lock @@ -9,16 +9,16 @@ "packages-dev": [ { "name": "bamarni/composer-bin-plugin", - "version": "1.8.0", + "version": "1.8.1", "source": { "type": "git", "url": "https://github.com/bamarni/composer-bin-plugin.git", - "reference": "24764700027bcd3cb072e5f8005d4a150fe714fe" + "reference": "e12e9769c8ee97d036f7f98abf66b96cf3862346" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bamarni/composer-bin-plugin/zipball/24764700027bcd3cb072e5f8005d4a150fe714fe", - "reference": "24764700027bcd3cb072e5f8005d4a150fe714fe", + "url": "https://api.github.com/repos/bamarni/composer-bin-plugin/zipball/e12e9769c8ee97d036f7f98abf66b96cf3862346", + "reference": "e12e9769c8ee97d036f7f98abf66b96cf3862346", "shasum": "" }, "require": { @@ -32,9 +32,9 @@ "phpstan/phpstan": "^1.8", "phpstan/phpstan-phpunit": "^1.1", "phpunit/phpunit": "^8.5 || ^9.5", - "symfony/console": "^5.4.7 || ^6.0.7", - "symfony/finder": "^5.4.7 || ^6.0.7", - "symfony/process": "^5.4.7 || ^6.0.7" + "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0" }, "type": "composer-plugin", "extra": { @@ -60,9 +60,9 @@ ], "support": { "issues": "https://github.com/bamarni/composer-bin-plugin/issues", - "source": "https://github.com/bamarni/composer-bin-plugin/tree/1.8.0" + "source": "https://github.com/bamarni/composer-bin-plugin/tree/1.8.1" }, - "time": "2022-07-14T10:29:51+00:00" + "time": "2022-08-03T19:58:11+00:00" } ], "aliases": [], diff --git a/core/l10n/cs.js b/core/l10n/cs.js index a1da59169b5..ddf3140159a 100644 --- a/core/l10n/cs.js +++ b/core/l10n/cs.js @@ -122,10 +122,10 @@ OC.L10N.register( "The \"Strict-Transport-Security\" HTTP header is not set to at least \"{seconds}\" seconds. For enhanced security, it is recommended to enable HSTS as described in the {linkstart}security tips ↗{linkend}." : "HTTP hlavička „Strict-Transport-Security“ není nastavena na přinejmenším „{seconds}“ sekund. Pro lepší zabezpečení je doporučeno zapnout HSTS, jak je popsáno v {linkstart}tipech pro zabezpečení ↗{linkend}.", "Accessing site insecurely via HTTP. You are strongly advised to set up your server to require HTTPS instead, as described in the {linkstart}security tips ↗{linkend}." : "Přistupujete přes přes nezabezpečený HTTP protokol. Důrazně doporučujeme nastavit svůj server tak, aby namísto toho vyžadoval HTTPS, jak je popsáno v {linkstart}tipech ohledně zabezpečení ↗{linkend}.", "unknown text" : "neznámý text", - "Hello world!" : "Zdravíme, světe!", + "Hello world!" : "Dobrý den světe!", "sunny" : "slunečno", - "Hello {name}, the weather is {weather}" : "Zdravíme {name}, počasí je {weather}", - "Hello {name}" : "Zdravíme, {name}", + "Hello {name}, the weather is {weather}" : "Dobrý den {name}, počasí je {weather}", + "Hello {name}" : "Dobrý den {name}", "<strong>These are your search results<script>alert(1)</script></strong>" : "<strong>Toto výsledky pro vaše hledání<script>alert(1)</script></strong>", "new" : "nový", "_download %n file_::_download %n files_" : ["stáhnout %n soubor","stáhnout %n soubory","stáhnout %n souborů","stáhnout %n souborů"], @@ -203,7 +203,7 @@ OC.L10N.register( "Search {types} …" : "Hledat {types}…", "Settings" : "Nastavení", "Could not load your contacts" : "Nedaří se načíst vaše kontakty", - "Search contacts …" : "Prohledat kontakty…", + "Search contacts …" : "Hledat v kontaktech…", "No contacts found" : "Nenalezeny žádné kontakty", "Show all contacts …" : "Zobrazit všechny kontakty…", "Install the Contacts app" : "Nainstalovat aplikaci Kontakty", diff --git a/core/l10n/cs.json b/core/l10n/cs.json index 8d29e64e623..28d6d256386 100644 --- a/core/l10n/cs.json +++ b/core/l10n/cs.json @@ -120,10 +120,10 @@ "The \"Strict-Transport-Security\" HTTP header is not set to at least \"{seconds}\" seconds. For enhanced security, it is recommended to enable HSTS as described in the {linkstart}security tips ↗{linkend}." : "HTTP hlavička „Strict-Transport-Security“ není nastavena na přinejmenším „{seconds}“ sekund. Pro lepší zabezpečení je doporučeno zapnout HSTS, jak je popsáno v {linkstart}tipech pro zabezpečení ↗{linkend}.", "Accessing site insecurely via HTTP. You are strongly advised to set up your server to require HTTPS instead, as described in the {linkstart}security tips ↗{linkend}." : "Přistupujete přes přes nezabezpečený HTTP protokol. Důrazně doporučujeme nastavit svůj server tak, aby namísto toho vyžadoval HTTPS, jak je popsáno v {linkstart}tipech ohledně zabezpečení ↗{linkend}.", "unknown text" : "neznámý text", - "Hello world!" : "Zdravíme, světe!", + "Hello world!" : "Dobrý den světe!", "sunny" : "slunečno", - "Hello {name}, the weather is {weather}" : "Zdravíme {name}, počasí je {weather}", - "Hello {name}" : "Zdravíme, {name}", + "Hello {name}, the weather is {weather}" : "Dobrý den {name}, počasí je {weather}", + "Hello {name}" : "Dobrý den {name}", "<strong>These are your search results<script>alert(1)</script></strong>" : "<strong>Toto výsledky pro vaše hledání<script>alert(1)</script></strong>", "new" : "nový", "_download %n file_::_download %n files_" : ["stáhnout %n soubor","stáhnout %n soubory","stáhnout %n souborů","stáhnout %n souborů"], @@ -201,7 +201,7 @@ "Search {types} …" : "Hledat {types}…", "Settings" : "Nastavení", "Could not load your contacts" : "Nedaří se načíst vaše kontakty", - "Search contacts …" : "Prohledat kontakty…", + "Search contacts …" : "Hledat v kontaktech…", "No contacts found" : "Nenalezeny žádné kontakty", "Show all contacts …" : "Zobrazit všechny kontakty…", "Install the Contacts app" : "Nainstalovat aplikaci Kontakty", diff --git a/core/l10n/de.js b/core/l10n/de.js index e2c8d5a96a9..9b1c209f27b 100644 --- a/core/l10n/de.js +++ b/core/l10n/de.js @@ -17,7 +17,7 @@ OC.L10N.register( "No image or file provided" : "Es wurde weder ein Bild noch eine Datei zur Verfügung gestellt", "Unknown filetype" : "Unbekannter Dateityp", "Invalid image" : "Ungültiges Bild", - "An error occurred. Please contact your admin." : "Ein Fehler ist aufgetreten. Bitte einen Administrator kontaktieren.", + "An error occurred. Please contact your admin." : "Es ist ein Fehler aufgetreten. Bitte kontaktiere deinen Administrator.", "No temporary profile picture available, try again" : "Kein temporäres Profilbild verfügbar, bitte versuche es noch einmal", "No crop data provided" : "Keine Beschnittdaten zur Verfügung gestellt", "No valid crop data provided" : "Keine gültigen Zuschnittdaten zur Verfügung gestellt", diff --git a/core/l10n/de.json b/core/l10n/de.json index e6858c3d215..7925d9ce033 100644 --- a/core/l10n/de.json +++ b/core/l10n/de.json @@ -15,7 +15,7 @@ "No image or file provided" : "Es wurde weder ein Bild noch eine Datei zur Verfügung gestellt", "Unknown filetype" : "Unbekannter Dateityp", "Invalid image" : "Ungültiges Bild", - "An error occurred. Please contact your admin." : "Ein Fehler ist aufgetreten. Bitte einen Administrator kontaktieren.", + "An error occurred. Please contact your admin." : "Es ist ein Fehler aufgetreten. Bitte kontaktiere deinen Administrator.", "No temporary profile picture available, try again" : "Kein temporäres Profilbild verfügbar, bitte versuche es noch einmal", "No crop data provided" : "Keine Beschnittdaten zur Verfügung gestellt", "No valid crop data provided" : "Keine gültigen Zuschnittdaten zur Verfügung gestellt", diff --git a/core/l10n/fr.js b/core/l10n/fr.js index b63ae1526a9..ab44e3cf87c 100644 --- a/core/l10n/fr.js +++ b/core/l10n/fr.js @@ -343,6 +343,7 @@ OC.L10N.register( "More apps menu" : "Menu des autres applications", "Contacts" : "Contacts", "Contacts menu" : "Menu des contacts", + "Open settings menu" : "Ouvrir le menu des paramètres", "Confirm your password" : "Confirmer votre mot de passe", "Connect to your account" : "Connectez vous à votre compte", "Please log in before granting %1$s access to your %2$s account." : "Veuillez vous connecter avant d'autoriser %1$s à accéder à votre compte %2$s.", diff --git a/core/l10n/fr.json b/core/l10n/fr.json index b0c3d5a7af3..a880f408057 100644 --- a/core/l10n/fr.json +++ b/core/l10n/fr.json @@ -341,6 +341,7 @@ "More apps menu" : "Menu des autres applications", "Contacts" : "Contacts", "Contacts menu" : "Menu des contacts", + "Open settings menu" : "Ouvrir le menu des paramètres", "Confirm your password" : "Confirmer votre mot de passe", "Connect to your account" : "Connectez vous à votre compte", "Please log in before granting %1$s access to your %2$s account." : "Veuillez vous connecter avant d'autoriser %1$s à accéder à votre compte %2$s.", diff --git a/core/l10n/ja.js b/core/l10n/ja.js index 87a9158fd21..3b632c1c0e3 100644 --- a/core/l10n/ja.js +++ b/core/l10n/ja.js @@ -344,6 +344,7 @@ OC.L10N.register( "More apps menu" : "その他のアプリメニュー", "Contacts" : "連絡先", "Contacts menu" : "連絡先メニュー", + "Open settings menu" : "設定メニューを開く", "Confirm your password" : "パスワードを確認", "Connect to your account" : "あなたのアカウントに接続する", "Please log in before granting %1$s access to your %2$s account." : "あなたの %2$s アカウントに %1$s アクセスを許可する前にログインしてください。", diff --git a/core/l10n/ja.json b/core/l10n/ja.json index 5c39694cc33..f2bacd0d6f6 100644 --- a/core/l10n/ja.json +++ b/core/l10n/ja.json @@ -342,6 +342,7 @@ "More apps menu" : "その他のアプリメニュー", "Contacts" : "連絡先", "Contacts menu" : "連絡先メニュー", + "Open settings menu" : "設定メニューを開く", "Confirm your password" : "パスワードを確認", "Connect to your account" : "あなたのアカウントに接続する", "Please log in before granting %1$s access to your %2$s account." : "あなたの %2$s アカウントに %1$s アクセスを許可する前にログインしてください。", diff --git a/core/l10n/ko.js b/core/l10n/ko.js index 35c5eb521ff..1a2ffda948e 100644 --- a/core/l10n/ko.js +++ b/core/l10n/ko.js @@ -26,6 +26,7 @@ OC.L10N.register( "Invalid app password" : "무효한 앱 비밀번호", "Could not complete login" : "로그인을 할 수 없음", "Your login token is invalid or has expired" : "로그인 토큰이 잘못되었거나 만료되었습니다", + "This community release of Nextcloud is unsupported and instant notifications are unavailable." : "이 Nextcloud 커뮤니티 릴리즈는 지원되지 않으며 즉각적인 알림을 사용할 수 없습니다.", "Login" : "로그인", "Password reset is disabled" : "암호 재설정이 비활성화됨", "Could not reset password because the token is expired" : "토큰이 만료되어 암호를 초기화할 수 없습니다", diff --git a/core/l10n/ko.json b/core/l10n/ko.json index ed189ca70aa..202bd46a66f 100644 --- a/core/l10n/ko.json +++ b/core/l10n/ko.json @@ -24,6 +24,7 @@ "Invalid app password" : "무효한 앱 비밀번호", "Could not complete login" : "로그인을 할 수 없음", "Your login token is invalid or has expired" : "로그인 토큰이 잘못되었거나 만료되었습니다", + "This community release of Nextcloud is unsupported and instant notifications are unavailable." : "이 Nextcloud 커뮤니티 릴리즈는 지원되지 않으며 즉각적인 알림을 사용할 수 없습니다.", "Login" : "로그인", "Password reset is disabled" : "암호 재설정이 비활성화됨", "Could not reset password because the token is expired" : "토큰이 만료되어 암호를 초기화할 수 없습니다", diff --git a/core/l10n/tr.js b/core/l10n/tr.js index a37b010f2c0..52afc64efe9 100644 --- a/core/l10n/tr.js +++ b/core/l10n/tr.js @@ -25,11 +25,11 @@ OC.L10N.register( "State token does not match" : "Durum kodu eşleşmiyor", "Invalid app password" : "Uygulama parolası geçersiz", "Could not complete login" : "Oturum açılamadı", - "Your login token is invalid or has expired" : "Oturum açma kodunuz geçersiz ya da süresi geçmiş", + "Your login token is invalid or has expired" : "Oturum açma kodunuz geçersiz ya da geçerlilik süresi dolmuş", "This community release of Nextcloud is unsupported and instant notifications are unavailable." : "Bu Nextcloud topluluk sürümü desteklenmiyor ve anlık bildirimler kullanılamıyor.", "Login" : "Oturum aç", "Password reset is disabled" : "Parola sıfırlama devre dışı bırakılmış", - "Could not reset password because the token is expired" : "Kodun süresi geçtiğinden parola sıfırlanamadı", + "Could not reset password because the token is expired" : "Kodun geçerlilik süresi dolmuş olduğundan parola sıfırlanamadı", "Could not reset password because the token is invalid" : "Kod geçersiz olduğundan parola sıfırlanamadı", "%s password reset" : "%s parola sıfırlama", "Password reset" : "Parolamı sıfırla", @@ -288,7 +288,7 @@ OC.L10N.register( "The profile does not exist." : "Profil bulunamadı.", "Back to %s" : "%s sayfasına dön", "File not found" : "Dosya bulunamadı", - "The document could not be found on the server. Maybe the share was deleted or has expired?" : "Belge sunucu üzerinde bulunamadı. Paylaşım silinmiş ya da süresi geçmiş olabilir mi?", + "The document could not be found on the server. Maybe the share was deleted or has expired?" : "Belge sunucu üzerinde bulunamadı. Paylaşım silinmiş ya da geçerlilik süresi dolmuş olabilir mi?", "Too many requests" : "Çok fazla istekte bulunuldu", "There were too many requests from your network. Retry later or contact your administrator if this is an error." : "Ağınızdan çok fazla istekte bulunuldu. Bir süre sonra yeniden deneyin ya da bir sorun olduğunu düşünüyorsanız BT yöneticiniz ile görüşün.", "Error" : "Hata", @@ -359,7 +359,7 @@ OC.L10N.register( "Your client should now be connected!" : "İstemciniz şimdi bağlantı kurmuş olmalı!", "You can close this window." : "Bu pencereyi kapatabilirsiniz.", "This share is password-protected" : "Bu paylaşım parola korumalı", - "The password is wrong or expired. Please try again or request a new one." : "Parola hatalı ya da süresi geçmiş. Lütfen yeniden deneyin ya da parolanızı değiştirin. ", + "The password is wrong or expired. Please try again or request a new one." : "Parola hatalı ya da geçerlilik süresi dolmuş. Lütfen yeniden deneyin ya da parolanızı değiştirin. ", "Please type in your email address to request a temporary password" : "Lütfen geçici parola isteğinde bulunmak için e-posta adresinizi yazın", "Email address" : "E-posta adresi", "Password sent!" : "Parola gönderildi!", diff --git a/core/l10n/tr.json b/core/l10n/tr.json index 1d0581f586a..90f5dc7b299 100644 --- a/core/l10n/tr.json +++ b/core/l10n/tr.json @@ -23,11 +23,11 @@ "State token does not match" : "Durum kodu eşleşmiyor", "Invalid app password" : "Uygulama parolası geçersiz", "Could not complete login" : "Oturum açılamadı", - "Your login token is invalid or has expired" : "Oturum açma kodunuz geçersiz ya da süresi geçmiş", + "Your login token is invalid or has expired" : "Oturum açma kodunuz geçersiz ya da geçerlilik süresi dolmuş", "This community release of Nextcloud is unsupported and instant notifications are unavailable." : "Bu Nextcloud topluluk sürümü desteklenmiyor ve anlık bildirimler kullanılamıyor.", "Login" : "Oturum aç", "Password reset is disabled" : "Parola sıfırlama devre dışı bırakılmış", - "Could not reset password because the token is expired" : "Kodun süresi geçtiğinden parola sıfırlanamadı", + "Could not reset password because the token is expired" : "Kodun geçerlilik süresi dolmuş olduğundan parola sıfırlanamadı", "Could not reset password because the token is invalid" : "Kod geçersiz olduğundan parola sıfırlanamadı", "%s password reset" : "%s parola sıfırlama", "Password reset" : "Parolamı sıfırla", @@ -286,7 +286,7 @@ "The profile does not exist." : "Profil bulunamadı.", "Back to %s" : "%s sayfasına dön", "File not found" : "Dosya bulunamadı", - "The document could not be found on the server. Maybe the share was deleted or has expired?" : "Belge sunucu üzerinde bulunamadı. Paylaşım silinmiş ya da süresi geçmiş olabilir mi?", + "The document could not be found on the server. Maybe the share was deleted or has expired?" : "Belge sunucu üzerinde bulunamadı. Paylaşım silinmiş ya da geçerlilik süresi dolmuş olabilir mi?", "Too many requests" : "Çok fazla istekte bulunuldu", "There were too many requests from your network. Retry later or contact your administrator if this is an error." : "Ağınızdan çok fazla istekte bulunuldu. Bir süre sonra yeniden deneyin ya da bir sorun olduğunu düşünüyorsanız BT yöneticiniz ile görüşün.", "Error" : "Hata", @@ -357,7 +357,7 @@ "Your client should now be connected!" : "İstemciniz şimdi bağlantı kurmuş olmalı!", "You can close this window." : "Bu pencereyi kapatabilirsiniz.", "This share is password-protected" : "Bu paylaşım parola korumalı", - "The password is wrong or expired. Please try again or request a new one." : "Parola hatalı ya da süresi geçmiş. Lütfen yeniden deneyin ya da parolanızı değiştirin. ", + "The password is wrong or expired. Please try again or request a new one." : "Parola hatalı ya da geçerlilik süresi dolmuş. Lütfen yeniden deneyin ya da parolanızı değiştirin. ", "Please type in your email address to request a temporary password" : "Lütfen geçici parola isteğinde bulunmak için e-posta adresinizi yazın", "Email address" : "E-posta adresi", "Password sent!" : "Parola gönderildi!", diff --git a/core/src/icons.js b/core/src/icons.js index 6ea8070c912..33ca22cae77 100644 --- a/core/src/icons.js +++ b/core/src/icons.js @@ -322,12 +322,12 @@ css += generateVariablesAliases(true) css += '}}' // DARK THEME -css += 'body[data-themes*=light] {' +css += '[data-themes*=light] {' css += generateVariablesAliases() css += '}' // DARK THEME -css += 'body[data-themes*=dark] {' +css += '[data-themes*=dark] {' css += generateVariablesAliases(true) css += '}' diff --git a/core/templates/untrustedDomain.php b/core/templates/untrustedDomain.php index 75054106ab2..1ae8b73d9b8 100644 --- a/core/templates/untrustedDomain.php +++ b/core/templates/untrustedDomain.php @@ -1,6 +1,6 @@ <?php /** @var array $_ */ ?> -<div class="error"> +<div class="guest-box"> <h2><?php p($l->t('Access through untrusted domain')); ?></h2> <p> diff --git a/dist/dashboard-main.js b/dist/dashboard-main.js index f37206f3b5c..82e68e184ab 100644 --- a/dist/dashboard-main.js +++ b/dist/dashboard-main.js @@ -1,3 +1,3 @@ /*! For license information please see dashboard-main.js.LICENSE.txt */ -!function(){"use strict";var n,e={31136:function(n,e,a){var o=a(20144),r=a(79753),i=a(22200),s=a(16453),d=a(4820),l=a(1412),c=a.n(l),A=a(9980),u=a.n(A),b=a(47450),p=a.n(b),g=a(59466),C={data:function(){return{isMobile:this._isMobile()}},beforeMount:function(){window.addEventListener("resize",this._onResize)},beforeDestroy:function(){window.removeEventListener("resize",this._onResize)},methods:{_onResize:function(){this.isMobile=this._isMobile()},_isMobile:function(){return document.documentElement.clientWidth<768}}},h=function(t){return(0,r.generateFilePath)("dashboard","","img/")+t},v=function(t){var n,e,a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",i=(null===(n=window.OCA)||void 0===n||null===(e=n.Theming)||void 0===e?void 0:e.enabledThemes)||[],s=0===i.length||"default"===i[0]?window.matchMedia("(prefers-color-scheme: dark)").matches:-1!==i.join("").indexOf("dark");return"default"===t?o&&"backgroundColor"!==o?(0,r.generateUrl)("/apps/theming/image/background")+"?v="+window.OCA.Theming.cacheBuster:h(s?"eduardo-neves-pedra-azul.jpg":"kamil-porembinski-clouds.jpg"):"custom"===t?(0,r.generateUrl)("/apps/dashboard/background")+"?v="+a:h(t)};function f(t,n,e,a,o,r,i){try{var s=t[r](i),d=s.value}catch(t){return void e(t)}s.done?n(d):Promise.resolve(d).then(a,o)}function m(t){return function(){var n=this,e=arguments;return new Promise((function(a,o){var r=t.apply(n,e);function i(t){f(r,a,o,i,s,"next",t)}function s(t){f(r,a,o,i,s,"throw",t)}i(void 0)}))}}var k=(0,s.loadState)("dashboard","shippedBackgrounds"),x={name:"BackgroundSettings",props:{background:{type:String,default:"default"},themingDefaultBackground:{type:String,default:""}},data:function(){return{backgroundImage:(0,r.generateUrl)("/apps/dashboard/background")+"?v="+Date.now(),loading:!1}},computed:{shippedBackgrounds:function(){return Object.keys(k).map((function(t){return{name:t,url:h(t),preview:h("previews/"+t),details:k[t]}}))}},methods:{update:function(t){var n=this;return m(regeneratorRuntime.mark((function e(){var a,o;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a="custom"===t.type||"default"===t.type?t.type:t.value,n.backgroundImage=v(a,t.version,n.themingDefaultBackground),"color"!==t.type&&("default"!==t.type||"backgroundColor"!==n.themingDefaultBackground)){e.next=6;break}return n.$emit("update:background",t),n.loading=!1,e.abrupt("return");case 6:(o=new Image).onload=function(){n.$emit("update:background",t),n.loading=!1},o.src=n.backgroundImage;case 9:case"end":return e.stop()}}),e)})))()},setDefault:function(){var t=this;return m(regeneratorRuntime.mark((function n(){var e;return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return t.loading="default",n.next=3,d.default.post((0,r.generateUrl)("/apps/dashboard/background/default"));case 3:e=n.sent,t.update(e.data);case 5:case"end":return n.stop()}}),n)})))()},setShipped:function(t){var n=this;return m(regeneratorRuntime.mark((function e(){var a;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n.loading=t,e.next=3,d.default.post((0,r.generateUrl)("/apps/dashboard/background/shipped"),{value:t});case 3:a=e.sent,n.update(a.data);case 5:case"end":return e.stop()}}),e)})))()},setFile:function(t){var n=this;return m(regeneratorRuntime.mark((function e(){var a;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n.loading="custom",e.next=3,d.default.post((0,r.generateUrl)("/apps/dashboard/background/custom"),{value:t});case 3:a=e.sent,n.update(a.data);case 5:case"end":return e.stop()}}),e)})))()},pickColor:function(){var t=this;return m(regeneratorRuntime.mark((function n(){var e,a;return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return t.loading="color",e=OCA&&OCA.Theming?OCA.Theming.color:"#0082c9",n.next=4,d.default.post((0,r.generateUrl)("/apps/dashboard/background/color"),{value:e});case 4:a=n.sent,t.update(a.data);case 6:case"end":return n.stop()}}),n)})))()},pickFile:function(){var n=this;window.OC.dialogs.filepicker(t("dashboard","Insert from {productName}",{productName:OC.theme.name}),(function(t,e){e===OC.dialogs.FILEPICKER_TYPE_CHOOSE&&n.setFile(t)}),!1,["image/png","image/gif","image/jpeg","image/svg"],!0,OC.dialogs.FILEPICKER_TYPE_CHOOSE)}}},w=x,y=a(93379),_=a.n(y),S=a(7795),B=a.n(S),D=a(90569),O=a.n(D),E=a(3565),F=a.n(E),G=a(19216),P=a.n(G),j=a(44589),T=a.n(j),I=a(61223),z={};z.styleTagTransform=T(),z.setAttributes=F(),z.insert=O().bind(null,"head"),z.domAPI=B(),z.insertStyleElement=P(),_()(I.Z,z),I.Z&&I.Z.locals&&I.Z.locals;var R=a(51900),U=(0,R.Z)(w,(function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("div",{staticClass:"background-selector"},[e("button",{staticClass:"background filepicker",class:{active:"custom"===t.background},attrs:{tabindex:"0"},on:{click:t.pickFile}},[t._v("\n\t\t"+t._s(t.t("dashboard","Pick from Files"))+"\n\t")]),t._v(" "),e("button",{staticClass:"background default",class:{"icon-loading":"default"===t.loading,active:"default"===t.background},attrs:{tabindex:"0"},on:{click:t.setDefault}},[t._v("\n\t\t"+t._s(t.t("dashboard","Default images"))+"\n\t")]),t._v(" "),e("button",{staticClass:"background color",class:{active:"custom"===t.background},attrs:{tabindex:"0"},on:{click:t.pickColor}},[t._v("\n\t\t"+t._s(t.t("dashboard","Plain background"))+"\n\t")]),t._v(" "),t._l(t.shippedBackgrounds,(function(n){return e("button",{directives:[{name:"tooltip",rawName:"v-tooltip",value:n.details.attribution,expression:"shippedBackground.details.attribution"}],key:n.name,staticClass:"background",class:{"icon-loading":t.loading===n.name,active:t.background===n.name},style:{"background-image":"url("+n.preview+")"},attrs:{tabindex:"0"},on:{click:function(e){return t.setShipped(n.name)}}})}))],2)}),[],!1,null,"16994ae8",null).exports,N=(0,s.loadState)("dashboard","panels"),W=(0,s.loadState)("dashboard","firstRun"),L=(0,s.loadState)("dashboard","background"),M=(0,s.loadState)("dashboard","themingDefaultBackground"),q=(0,s.loadState)("dashboard","version"),H=(0,s.loadState)("dashboard","shippedBackgrounds"),Z={weather:{text:t("dashboard","Weather"),icon:"icon-weather-status"},status:{text:t("dashboard","Status"),icon:"icon-user-status-online"}},K={name:"DashboardApp",components:{BackgroundSettings:U,Button:c(),Draggable:u(),Modal:p(),Pencil:g.default},mixins:[C],data:function(){var t,n;return{isAdmin:(0,i.getCurrentUser)().isAdmin,timer:new Date,registeredStatus:[],callbacks:{},callbacksStatus:{},allCallbacksStatus:{},statusInfo:Z,enabledStatuses:(0,s.loadState)("dashboard","statuses"),panels:N,firstRun:W,displayName:null===(t=(0,i.getCurrentUser)())||void 0===t?void 0:t.displayName,uid:null===(n=(0,i.getCurrentUser)())||void 0===n?void 0:n.uid,layout:(0,s.loadState)("dashboard","layout").filter((function(t){return N[t]})),modal:!1,appStoreUrl:(0,r.generateUrl)("/settings/apps/dashboard"),statuses:{},background:L,themingDefaultBackground:M,version:q}},computed:{backgroundImage:function(){return v(this.background,this.version,this.themingDefaultBackground)},backgroundStyle:function(){return"default"===this.background&&"backgroundColor"===this.themingDefaultBackground||this.background.match(/#[0-9A-Fa-f]{6}/g)?null:{backgroundImage:"url(".concat(this.backgroundImage,")")}},greeting:function(){var n,e=this.timer.getHours();n=e>=22||e<5?"night":e>=18?"evening":e>=12?"afternoon":"morning";var a={morning:{generic:t("dashboard","Good morning"),withName:t("dashboard","Good morning, {name}",{name:this.displayName},void 0,{escape:!1})},afternoon:{generic:t("dashboard","Good afternoon"),withName:t("dashboard","Good afternoon, {name}",{name:this.displayName},void 0,{escape:!1})},evening:{generic:t("dashboard","Good evening"),withName:t("dashboard","Good evening, {name}",{name:this.displayName},void 0,{escape:!1})},night:{generic:t("dashboard","Hello"),withName:t("dashboard","Hello, {name}",{name:this.displayName},void 0,{escape:!1})}};return{text:this.displayName&&this.uid!==this.displayName?a[n].withName:a[n].generic}},isActive:function(){var t=this;return function(n){return t.layout.indexOf(n.id)>-1}},isStatusActive:function(){var t=this;return function(n){return!(n in t.enabledStatuses)||t.enabledStatuses[n]}},sortedAllStatuses:function(){return Object.keys(this.allCallbacksStatus).slice().sort(this.sortStatuses)},sortedPanels:function(){var t=this;return Object.values(this.panels).sort((function(n,e){var a=t.layout.indexOf(n.id),o=t.layout.indexOf(e.id);return-1===a||-1===o?o-a||n.id-e.id:a-o||n.id-e.id}))},sortedRegisteredStatus:function(){return this.registeredStatus.slice().sort(this.sortStatuses)}},watch:{callbacks:function(){this.rerenderPanels()},callbacksStatus:function(){for(var t in this.callbacksStatus){var n=this.$refs["status-"+t];this.statuses[t]&&this.statuses[t].mounted||(n?(this.callbacksStatus[t](n[0]),o.default.set(this.statuses,t,{mounted:!0})):console.error("Failed to register panel in the frontend as no backend data was provided for "+t))}}},mounted:function(){var t=this;this.updateGlobalStyles(),this.updateSkipLink(),window.addEventListener("scroll",this.handleScroll),setInterval((function(){t.timer=new Date}),3e4),this.firstRun&&window.addEventListener("scroll",this.disableFirstrunHint)},destroyed:function(){window.removeEventListener("scroll",this.handleScroll)},methods:{register:function(t,n){o.default.set(this.callbacks,t,n)},registerStatus:function(t,n){var e=this;o.default.set(this.allCallbacksStatus,t,n),this.isStatusActive(t)&&(this.registeredStatus.push(t),this.$nextTick((function(){o.default.set(e.callbacksStatus,t,n)})))},rerenderPanels:function(){for(var t in this.callbacks){var n=this.$refs[t];-1!==this.layout.indexOf(t)&&(this.panels[t]&&this.panels[t].mounted||(n?(this.callbacks[t](n[0],{widget:this.panels[t]}),o.default.set(this.panels[t],"mounted",!0)):console.error("Failed to register panel in the frontend as no backend data was provided for "+t)))}},saveLayout:function(){d.default.post((0,r.generateUrl)("/apps/dashboard/layout"),{layout:this.layout.join(",")})},saveStatuses:function(){d.default.post((0,r.generateUrl)("/apps/dashboard/statuses"),{statuses:JSON.stringify(this.enabledStatuses)})},showModal:function(){this.modal=!0,this.firstRun=!1},closeModal:function(){this.modal=!1},updateCheckbox:function(t,n){var e=this,a=this.layout.indexOf(t.id);!n&&a>-1?this.layout.splice(a,1):this.layout.push(t.id),o.default.set(this.panels[t.id],"mounted",!1),this.saveLayout(),this.$nextTick((function(){return e.rerenderPanels()}))},disableFirstrunHint:function(){var t=this;window.removeEventListener("scroll",this.disableFirstrunHint),setTimeout((function(){t.firstRun=!1}),1e3)},updateBackground:function(t){this.background="custom"===t.type||"default"===t.type?t.type:t.value,this.version=t.version,this.updateGlobalStyles()},updateGlobalStyles:function(){var t;"dark"===(null===(t=H[this.background])||void 0===t?void 0:t.theming)?(document.querySelector("#header").style.setProperty("--primary-invert-if-bright","invert(100%)"),document.querySelector("#header").style.setProperty("--color-primary-text","#000000")):(document.querySelector("#header").style.removeProperty("--primary-invert-if-bright"),document.querySelector("#header").style.removeProperty("--color-primary-text"))},updateSkipLink:function(){document.getElementsByClassName("skip-navigation")[0].setAttribute("href","#app-dashboard")},updateStatusCheckbox:function(t,n){n?this.enableStatus(t):this.disableStatus(t)},enableStatus:function(t){this.enabledStatuses[t]=!0,this.registerStatus(t,this.allCallbacksStatus[t]),this.saveStatuses()},disableStatus:function(t){var n=this;this.enabledStatuses[t]=!1;var e=this.registeredStatus.findIndex((function(n){return n===t}));-1!==e&&(this.registeredStatus.splice(e,1),o.default.set(this.statuses,t,{mounted:!1}),this.$nextTick((function(){o.default.delete(n.callbacksStatus,t)}))),this.saveStatuses()},sortStatuses:function(t,n){var e=t.toLowerCase(),a=n.toLowerCase();return e>a?1:e<a?-1:0},handleScroll:function(){window.scrollY>70?document.body.classList.add("dashboard--scrolled"):document.body.classList.remove("dashboard--scrolled")}}},Y=a(372),$={};$.styleTagTransform=T(),$.setAttributes=F(),$.insert=O().bind(null,"head"),$.domAPI=B(),$.insertStyleElement=P(),_()(Y.Z,$),Y.Z&&Y.Z.locals&&Y.Z.locals;var Q=(0,R.Z)(K,(function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("div",{style:t.backgroundStyle,attrs:{id:"app-dashboard"}},[e("h2",[t._v(t._s(t.greeting.text))]),t._v(" "),e("ul",{staticClass:"statuses"},t._l(t.sortedRegisteredStatus,(function(t){return e("div",{key:t,attrs:{id:"status-"+t}},[e("div",{ref:"status-"+t,refInFor:!0})])})),0),t._v(" "),e("Draggable",t._b({staticClass:"panels",attrs:{handle:".panel--header"},on:{end:t.saveLayout},model:{value:t.layout,callback:function(n){t.layout=n},expression:"layout"}},"Draggable",{swapThreshold:.3,delay:500,delayOnTouchOnly:!0,touchStartThreshold:3},!1),t._l(t.layout,(function(n){return e("div",{key:t.panels[n].id,staticClass:"panel"},[e("div",{staticClass:"panel--header"},[e("h2",[e("div",{class:t.panels[n].iconClass,attrs:{role:"img"}}),t._v("\n\t\t\t\t\t"+t._s(t.panels[n].title)+"\n\t\t\t\t")])]),t._v(" "),e("div",{staticClass:"panel--content",class:{loading:!t.panels[n].mounted}},[e("div",{ref:t.panels[n].id,refInFor:!0,attrs:{"data-id":t.panels[n].id}})])])})),0),t._v(" "),e("div",{staticClass:"footer"},[e("Button",{on:{click:t.showModal},scopedSlots:t._u([{key:"icon",fn:function(){return[e("Pencil",{attrs:{size:20}})]},proxy:!0}])},[t._v("\n\t\t\t"+t._s(t.t("dashboard","Customize"))+"\n\t\t")])],1),t._v(" "),t.modal?e("Modal",{attrs:{size:"large"},on:{close:t.closeModal}},[e("div",{staticClass:"modal__content"},[e("h3",[t._v(t._s(t.t("dashboard","Edit widgets")))]),t._v(" "),e("ol",{staticClass:"panels"},t._l(t.sortedAllStatuses,(function(n){return e("li",{key:n,class:"panel-"+n},[e("input",{staticClass:"checkbox",attrs:{id:"status-checkbox-"+n,type:"checkbox"},domProps:{checked:t.isStatusActive(n)},on:{input:function(e){return t.updateStatusCheckbox(n,e.target.checked)}}}),t._v(" "),e("label",{attrs:{for:"status-checkbox-"+n}},[e("div",{class:t.statusInfo[n].icon,attrs:{role:"img"}}),t._v("\n\t\t\t\t\t\t"+t._s(t.statusInfo[n].text)+"\n\t\t\t\t\t")])])})),0),t._v(" "),e("Draggable",t._b({staticClass:"panels",attrs:{tag:"ol",handle:".draggable"},on:{end:t.saveLayout},model:{value:t.layout,callback:function(n){t.layout=n},expression:"layout"}},"Draggable",{swapThreshold:.3,delay:500,delayOnTouchOnly:!0,touchStartThreshold:3},!1),t._l(t.sortedPanels,(function(n){return e("li",{key:n.id,class:"panel-"+n.id},[e("input",{staticClass:"checkbox",attrs:{id:"panel-checkbox-"+n.id,type:"checkbox"},domProps:{checked:t.isActive(n)},on:{input:function(e){return t.updateCheckbox(n,e.target.checked)}}}),t._v(" "),e("label",{class:{draggable:t.isActive(n)},attrs:{for:"panel-checkbox-"+n.id}},[e("div",{class:n.iconClass,attrs:{role:"img"}}),t._v("\n\t\t\t\t\t\t"+t._s(n.title)+"\n\t\t\t\t\t")])])})),0),t._v(" "),t.isAdmin?e("a",{staticClass:"button",attrs:{href:t.appStoreUrl}},[t._v(t._s(t.t("dashboard","Get more widgets from the App Store")))]):t._e(),t._v(" "),e("h3",[t._v(t._s(t.t("dashboard","Change background image")))]),t._v(" "),e("BackgroundSettings",{attrs:{background:t.background,"theming-default-background":t.themingDefaultBackground},on:{"update:background":t.updateBackground}}),t._v(" "),e("h3",[t._v(t._s(t.t("dashboard","Weather service")))]),t._v(" "),e("p",[t._v("\n\t\t\t\t"+t._s(t.t("dashboard","For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information."))+"\n\t\t\t")]),t._v(" "),e("p",{staticClass:"credits--end"},[e("a",{attrs:{href:"https://api.met.no/doc/TermsOfService",target:"_blank",rel:"noopener"}},[t._v(t._s(t.t("dashboard","Weather data from Met.no")))]),t._v(",\n\t\t\t\t"),e("a",{attrs:{href:"https://wiki.osmfoundation.org/wiki/Privacy_Policy",target:"_blank",rel:"noopener"}},[t._v(t._s(t.t("dashboard","geocoding with Nominatim")))]),t._v(",\n\t\t\t\t"),e("a",{attrs:{href:"https://www.opentopodata.org/#public-api",target:"_blank",rel:"noopener"}},[t._v(t._s(t.t("dashboard","elevation data from OpenTopoData")))]),t._v(".\n\t\t\t")])],1)]):t._e()],1)}),[],!1,null,"5d4b2fb6",null).exports,J=a(9944),V=a(15168),X=a.n(V);a.nc=btoa((0,i.getRequestToken)()),o.default.directive("Tooltip",X()),o.default.prototype.t=J.translate,window.OCA.Files||(window.OCA.Files={}),Object.assign(window.OCA.Files,{App:{fileList:{filesClient:OC.Files.getClient()}}},window.OCA.Files);var tt=new(o.default.extend(Q))({}).$mount("#app-content-vue");window.OCA.Dashboard={register:function(t,n){return tt.register(t,n)},registerStatus:function(t,n){return tt.registerStatus(t,n)}}},372:function(t,n,e){var a=e(87537),o=e.n(a),r=e(23645),i=e.n(r)()(o());i.push([t.id,"#app-dashboard[data-v-5d4b2fb6]{width:100%;min-height:100vh;background-size:cover;background-position:center center;background-repeat:no-repeat;background-attachment:fixed;background-color:var(--color-primary);--color-background-translucent: rgba(var(--color-main-background-rgb), 0.8);--background-blur: blur(10px)}#app-dashboard>h2[data-v-5d4b2fb6]{color:var(--color-primary-text);text-align:center;font-size:32px;line-height:130%;padding:10vh 16px 0px}.panels[data-v-5d4b2fb6]{width:auto;margin:auto;max-width:1500px;display:flex;justify-content:center;flex-direction:row;align-items:flex-start;flex-wrap:wrap}.panel[data-v-5d4b2fb6],.panels>div[data-v-5d4b2fb6]{width:320px;max-width:100%;margin:16px;background-color:var(--color-background-translucent);-webkit-backdrop-filter:var(--background-blur);backdrop-filter:var(--background-blur);border-radius:var(--border-radius-large)}#body-user.theme--highcontrast .panel[data-v-5d4b2fb6],#body-user.theme--highcontrast .panels>div[data-v-5d4b2fb6]{border:2px solid var(--color-border)}.panel.sortable-ghost[data-v-5d4b2fb6],.panels>div.sortable-ghost[data-v-5d4b2fb6]{opacity:.1}.panel>.panel--header[data-v-5d4b2fb6],.panels>div>.panel--header[data-v-5d4b2fb6]{display:flex;z-index:1;top:50px;padding:16px;cursor:grab}.panel>.panel--header[data-v-5d4b2fb6],.panel>.panel--header[data-v-5d4b2fb6] *,.panels>div>.panel--header[data-v-5d4b2fb6],.panels>div>.panel--header[data-v-5d4b2fb6] *{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.panel>.panel--header[data-v-5d4b2fb6]:active,.panels>div>.panel--header[data-v-5d4b2fb6]:active{cursor:grabbing}.panel>.panel--header a[data-v-5d4b2fb6],.panels>div>.panel--header a[data-v-5d4b2fb6]{flex-grow:1}.panel>.panel--header>h2[data-v-5d4b2fb6],.panels>div>.panel--header>h2[data-v-5d4b2fb6]{display:block;align-items:center;flex-grow:1;margin:0;font-size:20px;line-height:24px;font-weight:bold;padding:16px 8px;height:56px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:grab}.panel>.panel--header>h2 div[data-v-5d4b2fb6],.panels>div>.panel--header>h2 div[data-v-5d4b2fb6]{background-size:32px;width:32px;height:32px;margin-right:16px;background-position:center;float:left;filter:var(--background-invert-if-dark)}.panel>.panel--content[data-v-5d4b2fb6],.panels>div>.panel--content[data-v-5d4b2fb6]{margin:0 16px 16px 16px;height:424px;overflow:visible}@media only screen and (max-width: 709px){.panel>.panel--content[data-v-5d4b2fb6],.panels>div>.panel--content[data-v-5d4b2fb6]{height:auto}}.footer[data-v-5d4b2fb6]{display:flex;justify-content:center;transition:bottom var(--animation-slow) ease-in-out;bottom:0;padding:44px 0}.edit-panels[data-v-5d4b2fb6]{display:inline-block;margin:auto;background-position:16px center;padding:12px 16px;padding-left:36px;border-radius:var(--border-radius-pill);max-width:200px;opacity:1;text-align:center}.button[data-v-5d4b2fb6],.button-vue .edit-panels[data-v-5d4b2fb6],.statuses[data-v-5d4b2fb6] .action-item .action-item__menutoggle,.statuses[data-v-5d4b2fb6] .action-item.action-item--open .action-item__menutoggle{background-color:var(--color-background-translucent);-webkit-backdrop-filter:var(--background-blur);backdrop-filter:var(--background-blur);opacity:1 !important}.button[data-v-5d4b2fb6]:hover,.button[data-v-5d4b2fb6]:focus,.button[data-v-5d4b2fb6]:active,.button-vue .edit-panels[data-v-5d4b2fb6]:hover,.button-vue .edit-panels[data-v-5d4b2fb6]:focus,.button-vue .edit-panels[data-v-5d4b2fb6]:active,.statuses[data-v-5d4b2fb6] .action-item .action-item__menutoggle:hover,.statuses[data-v-5d4b2fb6] .action-item .action-item__menutoggle:focus,.statuses[data-v-5d4b2fb6] .action-item .action-item__menutoggle:active,.statuses[data-v-5d4b2fb6] .action-item.action-item--open .action-item__menutoggle:hover,.statuses[data-v-5d4b2fb6] .action-item.action-item--open .action-item__menutoggle:focus,.statuses[data-v-5d4b2fb6] .action-item.action-item--open .action-item__menutoggle:active{background-color:var(--color-background-hover) !important}.button[data-v-5d4b2fb6]:focus-visible,.button-vue .edit-panels[data-v-5d4b2fb6]:focus-visible,.statuses[data-v-5d4b2fb6] .action-item .action-item__menutoggle:focus-visible,.statuses[data-v-5d4b2fb6] .action-item.action-item--open .action-item__menutoggle:focus-visible{box-shadow:0 0 0 2px var(--color-main-text) !important}.modal__content[data-v-5d4b2fb6]{padding:32px 16px;text-align:center}.modal__content ol[data-v-5d4b2fb6]{display:flex;flex-direction:row;justify-content:center;list-style-type:none;padding-bottom:16px}.modal__content li label[data-v-5d4b2fb6]{position:relative;display:block;padding:48px 16px 14px 16px;margin:8px;width:140px;background-color:var(--color-background-hover);border:2px solid var(--color-main-background);border-radius:var(--border-radius-large);text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.modal__content li label div[data-v-5d4b2fb6]{position:absolute;top:16px;width:24px;height:24px;background-size:24px}.modal__content li label[data-v-5d4b2fb6]:hover{border-color:var(--color-primary)}.modal__content li:not(.panel-status) label div[data-v-5d4b2fb6]{filter:var(--background-invert-if-dark)}.modal__content li input[type=checkbox].checkbox+label[data-v-5d4b2fb6]:before{position:absolute;right:12px;top:16px}.modal__content li input:focus+label[data-v-5d4b2fb6]{border-color:var(--color-primary)}.modal__content h3[data-v-5d4b2fb6]{font-weight:bold}.modal__content h3[data-v-5d4b2fb6]:not(:first-of-type){margin-top:64px}.modal__content .button[data-v-5d4b2fb6]{display:inline-block;padding:10px 16px;margin:0}.modal__content p[data-v-5d4b2fb6]{max-width:650px;margin:0 auto}.modal__content p a[data-v-5d4b2fb6]:hover,.modal__content p a[data-v-5d4b2fb6]:focus{border-bottom:2px solid var(--color-border)}.modal__content .credits--end[data-v-5d4b2fb6]{padding-bottom:32px;color:var(--color-text-maxcontrast)}.modal__content .credits--end a[data-v-5d4b2fb6]{color:var(--color-text-maxcontrast)}.flip-list-move[data-v-5d4b2fb6]{transition:transform var(--animation-slow)}.statuses[data-v-5d4b2fb6]{display:flex;flex-direction:row;justify-content:center;flex-wrap:wrap;margin-bottom:36px}.statuses>div[data-v-5d4b2fb6]{margin:8px}","",{version:3,sources:["webpack://./apps/dashboard/src/DashboardApp.vue"],names:[],mappings:"AAoaA,gCACC,UAAA,CACA,gBAAA,CACA,qBAAA,CACA,iCAAA,CACA,2BAAA,CACA,2BAAA,CACA,qCAAA,CACA,2EAAA,CACA,6BAAA,CAEA,mCACC,+BAAA,CACA,iBAAA,CACA,cAAA,CACA,gBAAA,CACA,qBAAA,CAIF,yBACC,UAAA,CACA,WAAA,CACA,gBAAA,CACA,YAAA,CACA,sBAAA,CACA,kBAAA,CACA,sBAAA,CACA,cAAA,CAGD,qDACC,WAAA,CACA,cAAA,CACA,WAAA,CACA,oDAAA,CACA,8CAAA,CACA,sCAAA,CACA,wCAAA,CAEA,mHACC,oCAAA,CAGD,mFACE,UAAA,CAGF,mFACC,YAAA,CACA,SAAA,CACA,QAAA,CACA,YAAA,CACA,WAAA,CAEA,4KACC,0BAAA,CACA,wBAAA,CACA,uBAAA,CACA,qBAAA,CACA,oBAAA,CACA,gBAAA,CAGD,iGACC,eAAA,CAGD,uFACC,WAAA,CAGD,yFACC,aAAA,CACA,kBAAA,CACA,WAAA,CACA,QAAA,CACA,cAAA,CACA,gBAAA,CACA,gBAAA,CACA,gBAAA,CACA,WAAA,CACA,kBAAA,CACA,eAAA,CACA,sBAAA,CACA,WAAA,CACA,iGACC,oBAAA,CACA,UAAA,CACA,WAAA,CACA,iBAAA,CACA,0BAAA,CACA,UAAA,CACA,uCAAA,CAKH,qFACC,uBAAA,CACA,YAAA,CAEA,gBAAA,CAID,0CACC,qFACC,WAAA,CAAA,CAKH,yBACC,YAAA,CACA,sBAAA,CACA,mDAAA,CACA,QAAA,CACA,cAAA,CAGD,8BACC,oBAAA,CACA,WAAA,CACA,+BAAA,CACA,iBAAA,CACA,iBAAA,CACA,uCAAA,CACA,eAAA,CACA,SAAA,CACA,iBAAA,CAGD,yNAKC,oDAAA,CACA,8CAAA,CACA,sCAAA,CACA,oBAAA,CAEA,utBAGC,yDAAA,CAED,iRACC,sDAAA,CAIF,iCACC,iBAAA,CACA,iBAAA,CAEA,oCACC,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,oBAAA,CACA,mBAAA,CAGA,0CACC,iBAAA,CACA,aAAA,CACA,2BAAA,CACA,UAAA,CACA,WAAA,CACA,8CAAA,CACA,6CAAA,CACA,wCAAA,CACA,eAAA,CACA,eAAA,CACA,sBAAA,CACA,kBAAA,CAEA,8CACC,iBAAA,CACA,QAAA,CACA,UAAA,CACA,WAAA,CACA,oBAAA,CAGD,gDACC,iCAAA,CAKF,iEACC,uCAAA,CAGD,+EACC,iBAAA,CACA,UAAA,CACA,QAAA,CAGD,sDACC,iCAAA,CAIF,oCACC,gBAAA,CAEA,wDACC,eAAA,CAKF,yCACC,oBAAA,CACA,iBAAA,CACA,QAAA,CAGD,mCACC,eAAA,CACA,aAAA,CAEA,sFAEC,2CAAA,CAIF,+CACC,mBAAA,CACA,mCAAA,CAEA,iDACC,mCAAA,CAKH,iCACC,0CAAA,CAGD,2BACC,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,cAAA,CACA,kBAAA,CAEA,+BACC,UAAA",sourcesContent:["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n#app-dashboard {\n\twidth: 100%;\n\tmin-height: 100vh;\n\tbackground-size: cover;\n\tbackground-position: center center;\n\tbackground-repeat: no-repeat;\n\tbackground-attachment: fixed;\n\tbackground-color: var(--color-primary);\n\t--color-background-translucent: rgba(var(--color-main-background-rgb), 0.8);\n\t--background-blur: blur(10px);\n\n\t> h2 {\n\t\tcolor: var(--color-primary-text);\n\t\ttext-align: center;\n\t\tfont-size: 32px;\n\t\tline-height: 130%;\n\t\tpadding: 10vh 16px 0px;\n\t}\n}\n\n.panels {\n\twidth: auto;\n\tmargin: auto;\n\tmax-width: 1500px;\n\tdisplay: flex;\n\tjustify-content: center;\n\tflex-direction: row;\n\talign-items: flex-start;\n\tflex-wrap: wrap;\n}\n\n.panel, .panels > div {\n\twidth: 320px;\n\tmax-width: 100%;\n\tmargin: 16px;\n\tbackground-color: var(--color-background-translucent);\n\t-webkit-backdrop-filter: var(--background-blur);\n\tbackdrop-filter: var(--background-blur);\n\tborder-radius: var(--border-radius-large);\n\n\t#body-user.theme--highcontrast & {\n\t\tborder: 2px solid var(--color-border);\n\t}\n\n\t&.sortable-ghost {\n\t\t opacity: 0.1;\n\t}\n\n\t& > .panel--header {\n\t\tdisplay: flex;\n\t\tz-index: 1;\n\t\ttop: 50px;\n\t\tpadding: 16px;\n\t\tcursor: grab;\n\n\t\t&, ::v-deep * {\n\t\t\t-webkit-touch-callout: none;\n\t\t\t-webkit-user-select: none;\n\t\t\t-khtml-user-select: none;\n\t\t\t-moz-user-select: none;\n\t\t\t-ms-user-select: none;\n\t\t\tuser-select: none;\n\t\t}\n\n\t\t&:active {\n\t\t\tcursor: grabbing;\n\t\t}\n\n\t\ta {\n\t\t\tflex-grow: 1;\n\t\t}\n\n\t\t> h2 {\n\t\t\tdisplay: block;\n\t\t\talign-items: center;\n\t\t\tflex-grow: 1;\n\t\t\tmargin: 0;\n\t\t\tfont-size: 20px;\n\t\t\tline-height: 24px;\n\t\t\tfont-weight: bold;\n\t\t\tpadding: 16px 8px;\n\t\t\theight: 56px;\n\t\t\twhite-space: nowrap;\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t\tcursor: grab;\n\t\t\tdiv {\n\t\t\t\tbackground-size: 32px;\n\t\t\t\twidth: 32px;\n\t\t\t\theight: 32px;\n\t\t\t\tmargin-right: 16px;\n\t\t\t\tbackground-position: center;\n\t\t\t\tfloat: left;\n\t\t\t\tfilter: var(--background-invert-if-dark);\n\t\t\t}\n\t\t}\n\t}\n\n\t& > .panel--content {\n\t\tmargin: 0 16px 16px 16px;\n\t\theight: 424px;\n\t\t// We specifically do not want scrollbars inside widgets\n\t\toverflow: visible;\n\t}\n\n\t// No need to extend height of widgets if only one column is shown\n\t@media only screen and (max-width: 709px) {\n\t\t& > .panel--content {\n\t\t\theight: auto;\n\t\t}\n\t}\n}\n\n.footer {\n\tdisplay: flex;\n\tjustify-content: center;\n\ttransition: bottom var(--animation-slow) ease-in-out;\n\tbottom: 0;\n\tpadding: 44px 0;\n}\n\n.edit-panels {\n\tdisplay: inline-block;\n\tmargin:auto;\n\tbackground-position: 16px center;\n\tpadding: 12px 16px;\n\tpadding-left: 36px;\n\tborder-radius: var(--border-radius-pill);\n\tmax-width: 200px;\n\topacity: 1;\n\ttext-align: center;\n}\n\n.button,\n.button-vue\n.edit-panels,\n.statuses ::v-deep .action-item .action-item__menutoggle,\n.statuses ::v-deep .action-item.action-item--open .action-item__menutoggle {\n\tbackground-color: var(--color-background-translucent);\n\t-webkit-backdrop-filter: var(--background-blur);\n\tbackdrop-filter: var(--background-blur);\n\topacity: 1 !important;\n\n\t&:hover,\n\t&:focus,\n\t&:active {\n\t\tbackground-color: var(--color-background-hover)!important;\n\t}\n\t&:focus-visible {\n\t\tbox-shadow: 0 0 0 2px var(--color-main-text) !important;\n\t}\n}\n\n.modal__content {\n\tpadding: 32px 16px;\n\ttext-align: center;\n\n\tol {\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t\tjustify-content: center;\n\t\tlist-style-type: none;\n\t\tpadding-bottom: 16px;\n\t}\n\tli {\n\t\tlabel {\n\t\t\tposition: relative;\n\t\t\tdisplay: block;\n\t\t\tpadding: 48px 16px 14px 16px;\n\t\t\tmargin: 8px;\n\t\t\twidth: 140px;\n\t\t\tbackground-color: var(--color-background-hover);\n\t\t\tborder: 2px solid var(--color-main-background);\n\t\t\tborder-radius: var(--border-radius-large);\n\t\t\ttext-align: left;\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t\twhite-space: nowrap;\n\n\t\t\tdiv {\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 16px;\n\t\t\t\twidth: 24px;\n\t\t\t\theight: 24px;\n\t\t\t\tbackground-size: 24px;\n\t\t\t}\n\n\t\t\t&:hover {\n\t\t\t\tborder-color: var(--color-primary);\n\t\t\t}\n\t\t}\n\n\t\t// Do not invert status icons\n\t\t&:not(.panel-status) label div {\n\t\t\tfilter: var(--background-invert-if-dark);\n\t\t}\n\n\t\tinput[type='checkbox'].checkbox + label:before {\n\t\t\tposition: absolute;\n\t\t\tright: 12px;\n\t\t\ttop: 16px;\n\t\t}\n\n\t\tinput:focus + label {\n\t\t\tborder-color: var(--color-primary);\n\t\t}\n\t}\n\n\th3 {\n\t\tfont-weight: bold;\n\n\t\t&:not(:first-of-type) {\n\t\t\tmargin-top: 64px;\n\t\t}\n\t}\n\n\t// Adjust design of 'Get more widgets' button\n\t.button {\n\t\tdisplay: inline-block;\n\t\tpadding: 10px 16px;\n\t\tmargin: 0;\n\t}\n\n\tp {\n\t\tmax-width: 650px;\n\t\tmargin: 0 auto;\n\n\t\ta:hover,\n\t\ta:focus {\n\t\t\tborder-bottom: 2px solid var(--color-border);\n\t\t}\n\t}\n\n\t.credits--end {\n\t\tpadding-bottom: 32px;\n\t\tcolor: var(--color-text-maxcontrast);\n\n\t\ta {\n\t\t\tcolor: var(--color-text-maxcontrast);\n\t\t}\n\t}\n}\n\n.flip-list-move {\n\ttransition: transform var(--animation-slow);\n}\n\n.statuses {\n\tdisplay: flex;\n\tflex-direction: row;\n\tjustify-content: center;\n\tflex-wrap: wrap;\n\tmargin-bottom: 36px;\n\n\t& > div {\n\t\tmargin: 8px;\n\t}\n}\n"],sourceRoot:""}]),n.Z=i},61223:function(t,n,e){var a=e(87537),o=e.n(a),r=e(23645),i=e.n(r)()(o());i.push([t.id,'.background-selector[data-v-16994ae8]{display:flex;flex-wrap:wrap;justify-content:center}.background-selector .background[data-v-16994ae8]{width:176px;height:96px;margin:8px;background-size:cover;background-position:center center;text-align:center;border-radius:var(--border-radius-large);border:2px solid var(--color-main-background);overflow:hidden}.background-selector .background.current[data-v-16994ae8]{background-image:var(--color-background-dark)}.background-selector .background.filepicker[data-v-16994ae8],.background-selector .background.default[data-v-16994ae8],.background-selector .background.color[data-v-16994ae8]{border-color:var(--color-border)}.background-selector .background.color[data-v-16994ae8]{background-color:var(--color-primary);color:var(--color-primary-text)}.background-selector .background.active[data-v-16994ae8],.background-selector .background[data-v-16994ae8]:hover,.background-selector .background[data-v-16994ae8]:focus{border:2px solid var(--color-primary)}.background-selector .background.active[data-v-16994ae8]:not(.icon-loading):after{background-image:var(--icon-checkmark-white);background-repeat:no-repeat;background-position:center;background-size:44px;content:"";display:block;height:100%}',"",{version:3,sources:["webpack://./apps/dashboard/src/components/BackgroundSettings.vue"],names:[],mappings:"AA4IA,sCACC,YAAA,CACA,cAAA,CACA,sBAAA,CAEA,kDACC,WAAA,CACA,WAAA,CACA,UAAA,CACA,qBAAA,CACA,iCAAA,CACA,iBAAA,CACA,wCAAA,CACA,6CAAA,CACA,eAAA,CAEA,0DACC,6CAAA,CAGD,+KACC,gCAAA,CAGD,wDACC,qCAAA,CACA,+BAAA,CAGD,yKAGC,qCAAA,CAGD,kFACC,4CAAA,CACA,2BAAA,CACA,0BAAA,CACA,oBAAA,CACA,UAAA,CACA,aAAA,CACA,WAAA",sourcesContent:["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.background-selector {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tjustify-content: center;\n\n\t.background {\n\t\twidth: 176px;\n\t\theight: 96px;\n\t\tmargin: 8px;\n\t\tbackground-size: cover;\n\t\tbackground-position: center center;\n\t\ttext-align: center;\n\t\tborder-radius: var(--border-radius-large);\n\t\tborder: 2px solid var(--color-main-background);\n\t\toverflow: hidden;\n\n\t\t&.current {\n\t\t\tbackground-image: var(--color-background-dark);\n\t\t}\n\n\t\t&.filepicker, &.default, &.color {\n\t\t\tborder-color: var(--color-border);\n\t\t}\n\n\t\t&.color {\n\t\t\tbackground-color: var(--color-primary);\n\t\t\tcolor: var(--color-primary-text);\n\t\t}\n\n\t\t&.active,\n\t\t&:hover,\n\t\t&:focus {\n\t\t\tborder: 2px solid var(--color-primary);\n\t\t}\n\n\t\t&.active:not(.icon-loading):after {\n\t\t\tbackground-image: var(--icon-checkmark-white);\n\t\t\tbackground-repeat: no-repeat;\n\t\t\tbackground-position: center;\n\t\t\tbackground-size: 44px;\n\t\t\tcontent: '';\n\t\t\tdisplay: block;\n\t\t\theight: 100%;\n\t\t}\n\t}\n}\n"],sourceRoot:""}]),n.Z=i}},a={};function o(t){var n=a[t];if(void 0!==n)return n.exports;var r=a[t]={id:t,loaded:!1,exports:{}};return e[t].call(r.exports,r,r.exports,o),r.loaded=!0,r.exports}o.m=e,o.amdD=function(){throw new Error("define cannot be used indirect")},o.amdO={},n=[],o.O=function(t,e,a,r){if(!e){var i=1/0;for(c=0;c<n.length;c++){e=n[c][0],a=n[c][1],r=n[c][2];for(var s=!0,d=0;d<e.length;d++)(!1&r||i>=r)&&Object.keys(o.O).every((function(t){return o.O[t](e[d])}))?e.splice(d--,1):(s=!1,r<i&&(i=r));if(s){n.splice(c--,1);var l=a();void 0!==l&&(t=l)}}return t}r=r||0;for(var c=n.length;c>0&&n[c-1][2]>r;c--)n[c]=n[c-1];n[c]=[e,a,r]},o.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return o.d(n,{a:n}),n},o.d=function(t,n){for(var e in n)o.o(n,e)&&!o.o(t,e)&&Object.defineProperty(t,e,{enumerable:!0,get:n[e]})},o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),o.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},o.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},o.nmd=function(t){return t.paths=[],t.children||(t.children=[]),t},o.j=4773,function(){o.b=document.baseURI||self.location.href;var t={4773:0};o.O.j=function(n){return 0===t[n]};var n=function(n,e){var a,r,i=e[0],s=e[1],d=e[2],l=0;if(i.some((function(n){return 0!==t[n]}))){for(a in s)o.o(s,a)&&(o.m[a]=s[a]);if(d)var c=d(o)}for(n&&n(e);l<i.length;l++)r=i[l],o.o(t,r)&&t[r]&&t[r][0](),t[r]=0;return o.O(c)},e=self.webpackChunknextcloud=self.webpackChunknextcloud||[];e.forEach(n.bind(null,0)),e.push=n.bind(null,e.push.bind(e))}(),o.nc=void 0;var r=o.O(void 0,[7874],(function(){return o(31136)}));r=o.O(r)}(); -//# sourceMappingURL=dashboard-main.js.map?v=f1359e4266dad203a595
\ No newline at end of file +!function(){"use strict";var n,e={90422:function(n,e,a){var o=a(20144),r=a(79753),i=a(22200),s=a(16453),d=a(4820),l=a(1412),c=a.n(l),A=a(9980),u=a.n(A),b=a(47450),p=a.n(b),g=a(59466),C={data:function(){return{isMobile:this._isMobile()}},beforeMount:function(){window.addEventListener("resize",this._onResize)},beforeDestroy:function(){window.removeEventListener("resize",this._onResize)},methods:{_onResize:function(){this.isMobile=this._isMobile()},_isMobile:function(){return document.documentElement.clientWidth<768}}},h=function(t){return(0,r.generateFilePath)("dashboard","","img/")+t},v=function(t){var n,e,a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",i=(null===(n=window.OCA)||void 0===n||null===(e=n.Theming)||void 0===e?void 0:e.enabledThemes)||[],s=0===i.length||"default"===i[0]?window.matchMedia("(prefers-color-scheme: dark)").matches:-1!==i.join("").indexOf("dark");return"default"===t?o&&"backgroundColor"!==o?(0,r.generateUrl)("/apps/theming/image/background")+"?v="+window.OCA.Theming.cacheBuster:h(s?"eduardo-neves-pedra-azul.jpg":"kamil-porembinski-clouds.jpg"):"custom"===t?(0,r.generateUrl)("/apps/dashboard/background")+"?v="+a:h(t)};function f(t,n,e,a,o,r,i){try{var s=t[r](i),d=s.value}catch(t){return void e(t)}s.done?n(d):Promise.resolve(d).then(a,o)}function m(t){return function(){var n=this,e=arguments;return new Promise((function(a,o){var r=t.apply(n,e);function i(t){f(r,a,o,i,s,"next",t)}function s(t){f(r,a,o,i,s,"throw",t)}i(void 0)}))}}var k=(0,s.loadState)("dashboard","shippedBackgrounds"),x={name:"BackgroundSettings",props:{background:{type:String,default:"default"},themingDefaultBackground:{type:String,default:""}},data:function(){return{backgroundImage:(0,r.generateUrl)("/apps/dashboard/background")+"?v="+Date.now(),loading:!1}},computed:{shippedBackgrounds:function(){return Object.keys(k).map((function(t){return{name:t,url:h(t),preview:h("previews/"+t),details:k[t]}}))}},methods:{update:function(t){var n=this;return m(regeneratorRuntime.mark((function e(){var a,o;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a="custom"===t.type||"default"===t.type?t.type:t.value,n.backgroundImage=v(a,t.version,n.themingDefaultBackground),"color"!==t.type&&("default"!==t.type||"backgroundColor"!==n.themingDefaultBackground)){e.next=6;break}return n.$emit("update:background",t),n.loading=!1,e.abrupt("return");case 6:(o=new Image).onload=function(){n.$emit("update:background",t),n.loading=!1},o.src=n.backgroundImage;case 9:case"end":return e.stop()}}),e)})))()},setDefault:function(){var t=this;return m(regeneratorRuntime.mark((function n(){var e;return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return t.loading="default",n.next=3,d.default.post((0,r.generateUrl)("/apps/dashboard/background/default"));case 3:e=n.sent,t.update(e.data);case 5:case"end":return n.stop()}}),n)})))()},setShipped:function(t){var n=this;return m(regeneratorRuntime.mark((function e(){var a;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n.loading=t,e.next=3,d.default.post((0,r.generateUrl)("/apps/dashboard/background/shipped"),{value:t});case 3:a=e.sent,n.update(a.data);case 5:case"end":return e.stop()}}),e)})))()},setFile:function(t){var n=this;return m(regeneratorRuntime.mark((function e(){var a;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n.loading="custom",e.next=3,d.default.post((0,r.generateUrl)("/apps/dashboard/background/custom"),{value:t});case 3:a=e.sent,n.update(a.data);case 5:case"end":return e.stop()}}),e)})))()},pickColor:function(){var t=this;return m(regeneratorRuntime.mark((function n(){var e,a;return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return t.loading="color",e=OCA&&OCA.Theming?OCA.Theming.color:"#0082c9",n.next=4,d.default.post((0,r.generateUrl)("/apps/dashboard/background/color"),{value:e});case 4:a=n.sent,t.update(a.data);case 6:case"end":return n.stop()}}),n)})))()},pickFile:function(){var n=this;window.OC.dialogs.filepicker(t("dashboard","Insert from {productName}",{productName:OC.theme.name}),(function(t,e){e===OC.dialogs.FILEPICKER_TYPE_CHOOSE&&n.setFile(t)}),!1,["image/png","image/gif","image/jpeg","image/svg"],!0,OC.dialogs.FILEPICKER_TYPE_CHOOSE)}}},w=x,y=a(93379),_=a.n(y),S=a(7795),B=a.n(S),D=a(90569),O=a.n(D),E=a(3565),F=a.n(E),G=a(19216),P=a.n(G),j=a(44589),T=a.n(j),I=a(32238),z={};z.styleTagTransform=T(),z.setAttributes=F(),z.insert=O().bind(null,"head"),z.domAPI=B(),z.insertStyleElement=P(),_()(I.Z,z),I.Z&&I.Z.locals&&I.Z.locals;var R=a(51900),U=(0,R.Z)(w,(function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("div",{staticClass:"background-selector"},[e("button",{staticClass:"background filepicker",class:{active:"custom"===t.background},attrs:{tabindex:"0"},on:{click:t.pickFile}},[t._v("\n\t\t"+t._s(t.t("dashboard","Pick from Files"))+"\n\t")]),t._v(" "),e("button",{staticClass:"background default",class:{"icon-loading":"default"===t.loading,active:"default"===t.background},attrs:{tabindex:"0"},on:{click:t.setDefault}},[t._v("\n\t\t"+t._s(t.t("dashboard","Default image"))+"\n\t")]),t._v(" "),e("button",{staticClass:"background color",class:{active:"custom"===t.background},attrs:{tabindex:"0"},on:{click:t.pickColor}},[t._v("\n\t\t"+t._s(t.t("dashboard","Plain background"))+"\n\t")]),t._v(" "),t._l(t.shippedBackgrounds,(function(n){return e("button",{directives:[{name:"tooltip",rawName:"v-tooltip",value:n.details.attribution,expression:"shippedBackground.details.attribution"}],key:n.name,staticClass:"background",class:{"icon-loading":t.loading===n.name,active:t.background===n.name},style:{"background-image":"url("+n.preview+")"},attrs:{tabindex:"0"},on:{click:function(e){return t.setShipped(n.name)}}})}))],2)}),[],!1,null,"77b70ba2",null).exports,N=(0,s.loadState)("dashboard","panels"),W=(0,s.loadState)("dashboard","firstRun"),L=(0,s.loadState)("dashboard","background"),M=(0,s.loadState)("dashboard","themingDefaultBackground"),q=(0,s.loadState)("dashboard","version"),H=(0,s.loadState)("dashboard","shippedBackgrounds"),Z={weather:{text:t("dashboard","Weather"),icon:"icon-weather-status"},status:{text:t("dashboard","Status"),icon:"icon-user-status-online"}},K={name:"DashboardApp",components:{BackgroundSettings:U,Button:c(),Draggable:u(),Modal:p(),Pencil:g.default},mixins:[C],data:function(){var t,n;return{isAdmin:(0,i.getCurrentUser)().isAdmin,timer:new Date,registeredStatus:[],callbacks:{},callbacksStatus:{},allCallbacksStatus:{},statusInfo:Z,enabledStatuses:(0,s.loadState)("dashboard","statuses"),panels:N,firstRun:W,displayName:null===(t=(0,i.getCurrentUser)())||void 0===t?void 0:t.displayName,uid:null===(n=(0,i.getCurrentUser)())||void 0===n?void 0:n.uid,layout:(0,s.loadState)("dashboard","layout").filter((function(t){return N[t]})),modal:!1,appStoreUrl:(0,r.generateUrl)("/settings/apps/dashboard"),statuses:{},background:L,themingDefaultBackground:M,version:q}},computed:{backgroundImage:function(){return v(this.background,this.version,this.themingDefaultBackground)},backgroundStyle:function(){return"default"===this.background&&"backgroundColor"===this.themingDefaultBackground||this.background.match(/#[0-9A-Fa-f]{6}/g)?null:{backgroundImage:"url(".concat(this.backgroundImage,")")}},greeting:function(){var n,e=this.timer.getHours();n=e>=22||e<5?"night":e>=18?"evening":e>=12?"afternoon":"morning";var a={morning:{generic:t("dashboard","Good morning"),withName:t("dashboard","Good morning, {name}",{name:this.displayName},void 0,{escape:!1})},afternoon:{generic:t("dashboard","Good afternoon"),withName:t("dashboard","Good afternoon, {name}",{name:this.displayName},void 0,{escape:!1})},evening:{generic:t("dashboard","Good evening"),withName:t("dashboard","Good evening, {name}",{name:this.displayName},void 0,{escape:!1})},night:{generic:t("dashboard","Hello"),withName:t("dashboard","Hello, {name}",{name:this.displayName},void 0,{escape:!1})}};return{text:this.displayName&&this.uid!==this.displayName?a[n].withName:a[n].generic}},isActive:function(){var t=this;return function(n){return t.layout.indexOf(n.id)>-1}},isStatusActive:function(){var t=this;return function(n){return!(n in t.enabledStatuses)||t.enabledStatuses[n]}},sortedAllStatuses:function(){return Object.keys(this.allCallbacksStatus).slice().sort(this.sortStatuses)},sortedPanels:function(){var t=this;return Object.values(this.panels).sort((function(n,e){var a=t.layout.indexOf(n.id),o=t.layout.indexOf(e.id);return-1===a||-1===o?o-a||n.id-e.id:a-o||n.id-e.id}))},sortedRegisteredStatus:function(){return this.registeredStatus.slice().sort(this.sortStatuses)}},watch:{callbacks:function(){this.rerenderPanels()},callbacksStatus:function(){for(var t in this.callbacksStatus){var n=this.$refs["status-"+t];this.statuses[t]&&this.statuses[t].mounted||(n?(this.callbacksStatus[t](n[0]),o.default.set(this.statuses,t,{mounted:!0})):console.error("Failed to register panel in the frontend as no backend data was provided for "+t))}}},mounted:function(){var t=this;this.updateGlobalStyles(),this.updateSkipLink(),window.addEventListener("scroll",this.handleScroll),setInterval((function(){t.timer=new Date}),3e4),this.firstRun&&window.addEventListener("scroll",this.disableFirstrunHint)},destroyed:function(){window.removeEventListener("scroll",this.handleScroll)},methods:{register:function(t,n){o.default.set(this.callbacks,t,n)},registerStatus:function(t,n){var e=this;o.default.set(this.allCallbacksStatus,t,n),this.isStatusActive(t)&&(this.registeredStatus.push(t),this.$nextTick((function(){o.default.set(e.callbacksStatus,t,n)})))},rerenderPanels:function(){for(var t in this.callbacks){var n=this.$refs[t];-1!==this.layout.indexOf(t)&&(this.panels[t]&&this.panels[t].mounted||(n?(this.callbacks[t](n[0],{widget:this.panels[t]}),o.default.set(this.panels[t],"mounted",!0)):console.error("Failed to register panel in the frontend as no backend data was provided for "+t)))}},saveLayout:function(){d.default.post((0,r.generateUrl)("/apps/dashboard/layout"),{layout:this.layout.join(",")})},saveStatuses:function(){d.default.post((0,r.generateUrl)("/apps/dashboard/statuses"),{statuses:JSON.stringify(this.enabledStatuses)})},showModal:function(){this.modal=!0,this.firstRun=!1},closeModal:function(){this.modal=!1},updateCheckbox:function(t,n){var e=this,a=this.layout.indexOf(t.id);!n&&a>-1?this.layout.splice(a,1):this.layout.push(t.id),o.default.set(this.panels[t.id],"mounted",!1),this.saveLayout(),this.$nextTick((function(){return e.rerenderPanels()}))},disableFirstrunHint:function(){var t=this;window.removeEventListener("scroll",this.disableFirstrunHint),setTimeout((function(){t.firstRun=!1}),1e3)},updateBackground:function(t){this.background="custom"===t.type||"default"===t.type?t.type:t.value,this.version=t.version,this.updateGlobalStyles()},updateGlobalStyles:function(){var t;"dark"===(null===(t=H[this.background])||void 0===t?void 0:t.theming)?(document.querySelector("#header").style.setProperty("--primary-invert-if-bright","invert(100%)"),document.querySelector("#header").style.setProperty("--color-primary-text","#000000")):(document.querySelector("#header").style.removeProperty("--primary-invert-if-bright"),document.querySelector("#header").style.removeProperty("--color-primary-text"))},updateSkipLink:function(){document.getElementsByClassName("skip-navigation")[0].setAttribute("href","#app-dashboard")},updateStatusCheckbox:function(t,n){n?this.enableStatus(t):this.disableStatus(t)},enableStatus:function(t){this.enabledStatuses[t]=!0,this.registerStatus(t,this.allCallbacksStatus[t]),this.saveStatuses()},disableStatus:function(t){var n=this;this.enabledStatuses[t]=!1;var e=this.registeredStatus.findIndex((function(n){return n===t}));-1!==e&&(this.registeredStatus.splice(e,1),o.default.set(this.statuses,t,{mounted:!1}),this.$nextTick((function(){o.default.delete(n.callbacksStatus,t)}))),this.saveStatuses()},sortStatuses:function(t,n){var e=t.toLowerCase(),a=n.toLowerCase();return e>a?1:e<a?-1:0},handleScroll:function(){window.scrollY>70?document.body.classList.add("dashboard--scrolled"):document.body.classList.remove("dashboard--scrolled")}}},Y=a(372),$={};$.styleTagTransform=T(),$.setAttributes=F(),$.insert=O().bind(null,"head"),$.domAPI=B(),$.insertStyleElement=P(),_()(Y.Z,$),Y.Z&&Y.Z.locals&&Y.Z.locals;var Q=(0,R.Z)(K,(function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("div",{style:t.backgroundStyle,attrs:{id:"app-dashboard"}},[e("h2",[t._v(t._s(t.greeting.text))]),t._v(" "),e("ul",{staticClass:"statuses"},t._l(t.sortedRegisteredStatus,(function(t){return e("div",{key:t,attrs:{id:"status-"+t}},[e("div",{ref:"status-"+t,refInFor:!0})])})),0),t._v(" "),e("Draggable",t._b({staticClass:"panels",attrs:{handle:".panel--header"},on:{end:t.saveLayout},model:{value:t.layout,callback:function(n){t.layout=n},expression:"layout"}},"Draggable",{swapThreshold:.3,delay:500,delayOnTouchOnly:!0,touchStartThreshold:3},!1),t._l(t.layout,(function(n){return e("div",{key:t.panels[n].id,staticClass:"panel"},[e("div",{staticClass:"panel--header"},[e("h2",[e("div",{class:t.panels[n].iconClass,attrs:{role:"img"}}),t._v("\n\t\t\t\t\t"+t._s(t.panels[n].title)+"\n\t\t\t\t")])]),t._v(" "),e("div",{staticClass:"panel--content",class:{loading:!t.panels[n].mounted}},[e("div",{ref:t.panels[n].id,refInFor:!0,attrs:{"data-id":t.panels[n].id}})])])})),0),t._v(" "),e("div",{staticClass:"footer"},[e("Button",{on:{click:t.showModal},scopedSlots:t._u([{key:"icon",fn:function(){return[e("Pencil",{attrs:{size:20}})]},proxy:!0}])},[t._v("\n\t\t\t"+t._s(t.t("dashboard","Customize"))+"\n\t\t")])],1),t._v(" "),t.modal?e("Modal",{attrs:{size:"large"},on:{close:t.closeModal}},[e("div",{staticClass:"modal__content"},[e("h3",[t._v(t._s(t.t("dashboard","Edit widgets")))]),t._v(" "),e("ol",{staticClass:"panels"},t._l(t.sortedAllStatuses,(function(n){return e("li",{key:n,class:"panel-"+n},[e("input",{staticClass:"checkbox",attrs:{id:"status-checkbox-"+n,type:"checkbox"},domProps:{checked:t.isStatusActive(n)},on:{input:function(e){return t.updateStatusCheckbox(n,e.target.checked)}}}),t._v(" "),e("label",{attrs:{for:"status-checkbox-"+n}},[e("div",{class:t.statusInfo[n].icon,attrs:{role:"img"}}),t._v("\n\t\t\t\t\t\t"+t._s(t.statusInfo[n].text)+"\n\t\t\t\t\t")])])})),0),t._v(" "),e("Draggable",t._b({staticClass:"panels",attrs:{tag:"ol",handle:".draggable"},on:{end:t.saveLayout},model:{value:t.layout,callback:function(n){t.layout=n},expression:"layout"}},"Draggable",{swapThreshold:.3,delay:500,delayOnTouchOnly:!0,touchStartThreshold:3},!1),t._l(t.sortedPanels,(function(n){return e("li",{key:n.id,class:"panel-"+n.id},[e("input",{staticClass:"checkbox",attrs:{id:"panel-checkbox-"+n.id,type:"checkbox"},domProps:{checked:t.isActive(n)},on:{input:function(e){return t.updateCheckbox(n,e.target.checked)}}}),t._v(" "),e("label",{class:{draggable:t.isActive(n)},attrs:{for:"panel-checkbox-"+n.id}},[e("div",{class:n.iconClass,attrs:{role:"img"}}),t._v("\n\t\t\t\t\t\t"+t._s(n.title)+"\n\t\t\t\t\t")])])})),0),t._v(" "),t.isAdmin?e("a",{staticClass:"button",attrs:{href:t.appStoreUrl}},[t._v(t._s(t.t("dashboard","Get more widgets from the App Store")))]):t._e(),t._v(" "),e("h3",[t._v(t._s(t.t("dashboard","Change background image")))]),t._v(" "),e("BackgroundSettings",{attrs:{background:t.background,"theming-default-background":t.themingDefaultBackground},on:{"update:background":t.updateBackground}}),t._v(" "),e("h3",[t._v(t._s(t.t("dashboard","Weather service")))]),t._v(" "),e("p",[t._v("\n\t\t\t\t"+t._s(t.t("dashboard","For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information."))+"\n\t\t\t")]),t._v(" "),e("p",{staticClass:"credits--end"},[e("a",{attrs:{href:"https://api.met.no/doc/TermsOfService",target:"_blank",rel:"noopener"}},[t._v(t._s(t.t("dashboard","Weather data from Met.no")))]),t._v(",\n\t\t\t\t"),e("a",{attrs:{href:"https://wiki.osmfoundation.org/wiki/Privacy_Policy",target:"_blank",rel:"noopener"}},[t._v(t._s(t.t("dashboard","geocoding with Nominatim")))]),t._v(",\n\t\t\t\t"),e("a",{attrs:{href:"https://www.opentopodata.org/#public-api",target:"_blank",rel:"noopener"}},[t._v(t._s(t.t("dashboard","elevation data from OpenTopoData")))]),t._v(".\n\t\t\t")])],1)]):t._e()],1)}),[],!1,null,"5d4b2fb6",null).exports,J=a(9944),V=a(15168),X=a.n(V);a.nc=btoa((0,i.getRequestToken)()),o.default.directive("Tooltip",X()),o.default.prototype.t=J.translate,window.OCA.Files||(window.OCA.Files={}),Object.assign(window.OCA.Files,{App:{fileList:{filesClient:OC.Files.getClient()}}},window.OCA.Files);var tt=new(o.default.extend(Q))({}).$mount("#app-content-vue");window.OCA.Dashboard={register:function(t,n){return tt.register(t,n)},registerStatus:function(t,n){return tt.registerStatus(t,n)}}},372:function(t,n,e){var a=e(87537),o=e.n(a),r=e(23645),i=e.n(r)()(o());i.push([t.id,"#app-dashboard[data-v-5d4b2fb6]{width:100%;min-height:100vh;background-size:cover;background-position:center center;background-repeat:no-repeat;background-attachment:fixed;background-color:var(--color-primary);--color-background-translucent: rgba(var(--color-main-background-rgb), 0.8);--background-blur: blur(10px)}#app-dashboard>h2[data-v-5d4b2fb6]{color:var(--color-primary-text);text-align:center;font-size:32px;line-height:130%;padding:10vh 16px 0px}.panels[data-v-5d4b2fb6]{width:auto;margin:auto;max-width:1500px;display:flex;justify-content:center;flex-direction:row;align-items:flex-start;flex-wrap:wrap}.panel[data-v-5d4b2fb6],.panels>div[data-v-5d4b2fb6]{width:320px;max-width:100%;margin:16px;background-color:var(--color-background-translucent);-webkit-backdrop-filter:var(--background-blur);backdrop-filter:var(--background-blur);border-radius:var(--border-radius-large)}#body-user.theme--highcontrast .panel[data-v-5d4b2fb6],#body-user.theme--highcontrast .panels>div[data-v-5d4b2fb6]{border:2px solid var(--color-border)}.panel.sortable-ghost[data-v-5d4b2fb6],.panels>div.sortable-ghost[data-v-5d4b2fb6]{opacity:.1}.panel>.panel--header[data-v-5d4b2fb6],.panels>div>.panel--header[data-v-5d4b2fb6]{display:flex;z-index:1;top:50px;padding:16px;cursor:grab}.panel>.panel--header[data-v-5d4b2fb6],.panel>.panel--header[data-v-5d4b2fb6] *,.panels>div>.panel--header[data-v-5d4b2fb6],.panels>div>.panel--header[data-v-5d4b2fb6] *{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.panel>.panel--header[data-v-5d4b2fb6]:active,.panels>div>.panel--header[data-v-5d4b2fb6]:active{cursor:grabbing}.panel>.panel--header a[data-v-5d4b2fb6],.panels>div>.panel--header a[data-v-5d4b2fb6]{flex-grow:1}.panel>.panel--header>h2[data-v-5d4b2fb6],.panels>div>.panel--header>h2[data-v-5d4b2fb6]{display:block;align-items:center;flex-grow:1;margin:0;font-size:20px;line-height:24px;font-weight:bold;padding:16px 8px;height:56px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:grab}.panel>.panel--header>h2 div[data-v-5d4b2fb6],.panels>div>.panel--header>h2 div[data-v-5d4b2fb6]{background-size:32px;width:32px;height:32px;margin-right:16px;background-position:center;float:left;filter:var(--background-invert-if-dark)}.panel>.panel--content[data-v-5d4b2fb6],.panels>div>.panel--content[data-v-5d4b2fb6]{margin:0 16px 16px 16px;height:424px;overflow:visible}@media only screen and (max-width: 709px){.panel>.panel--content[data-v-5d4b2fb6],.panels>div>.panel--content[data-v-5d4b2fb6]{height:auto}}.footer[data-v-5d4b2fb6]{display:flex;justify-content:center;transition:bottom var(--animation-slow) ease-in-out;bottom:0;padding:44px 0}.edit-panels[data-v-5d4b2fb6]{display:inline-block;margin:auto;background-position:16px center;padding:12px 16px;padding-left:36px;border-radius:var(--border-radius-pill);max-width:200px;opacity:1;text-align:center}.button[data-v-5d4b2fb6],.button-vue .edit-panels[data-v-5d4b2fb6],.statuses[data-v-5d4b2fb6] .action-item .action-item__menutoggle,.statuses[data-v-5d4b2fb6] .action-item.action-item--open .action-item__menutoggle{background-color:var(--color-background-translucent);-webkit-backdrop-filter:var(--background-blur);backdrop-filter:var(--background-blur);opacity:1 !important}.button[data-v-5d4b2fb6]:hover,.button[data-v-5d4b2fb6]:focus,.button[data-v-5d4b2fb6]:active,.button-vue .edit-panels[data-v-5d4b2fb6]:hover,.button-vue .edit-panels[data-v-5d4b2fb6]:focus,.button-vue .edit-panels[data-v-5d4b2fb6]:active,.statuses[data-v-5d4b2fb6] .action-item .action-item__menutoggle:hover,.statuses[data-v-5d4b2fb6] .action-item .action-item__menutoggle:focus,.statuses[data-v-5d4b2fb6] .action-item .action-item__menutoggle:active,.statuses[data-v-5d4b2fb6] .action-item.action-item--open .action-item__menutoggle:hover,.statuses[data-v-5d4b2fb6] .action-item.action-item--open .action-item__menutoggle:focus,.statuses[data-v-5d4b2fb6] .action-item.action-item--open .action-item__menutoggle:active{background-color:var(--color-background-hover) !important}.button[data-v-5d4b2fb6]:focus-visible,.button-vue .edit-panels[data-v-5d4b2fb6]:focus-visible,.statuses[data-v-5d4b2fb6] .action-item .action-item__menutoggle:focus-visible,.statuses[data-v-5d4b2fb6] .action-item.action-item--open .action-item__menutoggle:focus-visible{box-shadow:0 0 0 2px var(--color-main-text) !important}.modal__content[data-v-5d4b2fb6]{padding:32px 16px;text-align:center}.modal__content ol[data-v-5d4b2fb6]{display:flex;flex-direction:row;justify-content:center;list-style-type:none;padding-bottom:16px}.modal__content li label[data-v-5d4b2fb6]{position:relative;display:block;padding:48px 16px 14px 16px;margin:8px;width:140px;background-color:var(--color-background-hover);border:2px solid var(--color-main-background);border-radius:var(--border-radius-large);text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.modal__content li label div[data-v-5d4b2fb6]{position:absolute;top:16px;width:24px;height:24px;background-size:24px}.modal__content li label[data-v-5d4b2fb6]:hover{border-color:var(--color-primary)}.modal__content li:not(.panel-status) label div[data-v-5d4b2fb6]{filter:var(--background-invert-if-dark)}.modal__content li input[type=checkbox].checkbox+label[data-v-5d4b2fb6]:before{position:absolute;right:12px;top:16px}.modal__content li input:focus+label[data-v-5d4b2fb6]{border-color:var(--color-primary)}.modal__content h3[data-v-5d4b2fb6]{font-weight:bold}.modal__content h3[data-v-5d4b2fb6]:not(:first-of-type){margin-top:64px}.modal__content .button[data-v-5d4b2fb6]{display:inline-block;padding:10px 16px;margin:0}.modal__content p[data-v-5d4b2fb6]{max-width:650px;margin:0 auto}.modal__content p a[data-v-5d4b2fb6]:hover,.modal__content p a[data-v-5d4b2fb6]:focus{border-bottom:2px solid var(--color-border)}.modal__content .credits--end[data-v-5d4b2fb6]{padding-bottom:32px;color:var(--color-text-maxcontrast)}.modal__content .credits--end a[data-v-5d4b2fb6]{color:var(--color-text-maxcontrast)}.flip-list-move[data-v-5d4b2fb6]{transition:transform var(--animation-slow)}.statuses[data-v-5d4b2fb6]{display:flex;flex-direction:row;justify-content:center;flex-wrap:wrap;margin-bottom:36px}.statuses>div[data-v-5d4b2fb6]{margin:8px}","",{version:3,sources:["webpack://./apps/dashboard/src/DashboardApp.vue"],names:[],mappings:"AAoaA,gCACC,UAAA,CACA,gBAAA,CACA,qBAAA,CACA,iCAAA,CACA,2BAAA,CACA,2BAAA,CACA,qCAAA,CACA,2EAAA,CACA,6BAAA,CAEA,mCACC,+BAAA,CACA,iBAAA,CACA,cAAA,CACA,gBAAA,CACA,qBAAA,CAIF,yBACC,UAAA,CACA,WAAA,CACA,gBAAA,CACA,YAAA,CACA,sBAAA,CACA,kBAAA,CACA,sBAAA,CACA,cAAA,CAGD,qDACC,WAAA,CACA,cAAA,CACA,WAAA,CACA,oDAAA,CACA,8CAAA,CACA,sCAAA,CACA,wCAAA,CAEA,mHACC,oCAAA,CAGD,mFACE,UAAA,CAGF,mFACC,YAAA,CACA,SAAA,CACA,QAAA,CACA,YAAA,CACA,WAAA,CAEA,4KACC,0BAAA,CACA,wBAAA,CACA,uBAAA,CACA,qBAAA,CACA,oBAAA,CACA,gBAAA,CAGD,iGACC,eAAA,CAGD,uFACC,WAAA,CAGD,yFACC,aAAA,CACA,kBAAA,CACA,WAAA,CACA,QAAA,CACA,cAAA,CACA,gBAAA,CACA,gBAAA,CACA,gBAAA,CACA,WAAA,CACA,kBAAA,CACA,eAAA,CACA,sBAAA,CACA,WAAA,CACA,iGACC,oBAAA,CACA,UAAA,CACA,WAAA,CACA,iBAAA,CACA,0BAAA,CACA,UAAA,CACA,uCAAA,CAKH,qFACC,uBAAA,CACA,YAAA,CAEA,gBAAA,CAID,0CACC,qFACC,WAAA,CAAA,CAKH,yBACC,YAAA,CACA,sBAAA,CACA,mDAAA,CACA,QAAA,CACA,cAAA,CAGD,8BACC,oBAAA,CACA,WAAA,CACA,+BAAA,CACA,iBAAA,CACA,iBAAA,CACA,uCAAA,CACA,eAAA,CACA,SAAA,CACA,iBAAA,CAGD,yNAKC,oDAAA,CACA,8CAAA,CACA,sCAAA,CACA,oBAAA,CAEA,utBAGC,yDAAA,CAED,iRACC,sDAAA,CAIF,iCACC,iBAAA,CACA,iBAAA,CAEA,oCACC,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,oBAAA,CACA,mBAAA,CAGA,0CACC,iBAAA,CACA,aAAA,CACA,2BAAA,CACA,UAAA,CACA,WAAA,CACA,8CAAA,CACA,6CAAA,CACA,wCAAA,CACA,eAAA,CACA,eAAA,CACA,sBAAA,CACA,kBAAA,CAEA,8CACC,iBAAA,CACA,QAAA,CACA,UAAA,CACA,WAAA,CACA,oBAAA,CAGD,gDACC,iCAAA,CAKF,iEACC,uCAAA,CAGD,+EACC,iBAAA,CACA,UAAA,CACA,QAAA,CAGD,sDACC,iCAAA,CAIF,oCACC,gBAAA,CAEA,wDACC,eAAA,CAKF,yCACC,oBAAA,CACA,iBAAA,CACA,QAAA,CAGD,mCACC,eAAA,CACA,aAAA,CAEA,sFAEC,2CAAA,CAIF,+CACC,mBAAA,CACA,mCAAA,CAEA,iDACC,mCAAA,CAKH,iCACC,0CAAA,CAGD,2BACC,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,cAAA,CACA,kBAAA,CAEA,+BACC,UAAA",sourcesContent:["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n#app-dashboard {\n\twidth: 100%;\n\tmin-height: 100vh;\n\tbackground-size: cover;\n\tbackground-position: center center;\n\tbackground-repeat: no-repeat;\n\tbackground-attachment: fixed;\n\tbackground-color: var(--color-primary);\n\t--color-background-translucent: rgba(var(--color-main-background-rgb), 0.8);\n\t--background-blur: blur(10px);\n\n\t> h2 {\n\t\tcolor: var(--color-primary-text);\n\t\ttext-align: center;\n\t\tfont-size: 32px;\n\t\tline-height: 130%;\n\t\tpadding: 10vh 16px 0px;\n\t}\n}\n\n.panels {\n\twidth: auto;\n\tmargin: auto;\n\tmax-width: 1500px;\n\tdisplay: flex;\n\tjustify-content: center;\n\tflex-direction: row;\n\talign-items: flex-start;\n\tflex-wrap: wrap;\n}\n\n.panel, .panels > div {\n\twidth: 320px;\n\tmax-width: 100%;\n\tmargin: 16px;\n\tbackground-color: var(--color-background-translucent);\n\t-webkit-backdrop-filter: var(--background-blur);\n\tbackdrop-filter: var(--background-blur);\n\tborder-radius: var(--border-radius-large);\n\n\t#body-user.theme--highcontrast & {\n\t\tborder: 2px solid var(--color-border);\n\t}\n\n\t&.sortable-ghost {\n\t\t opacity: 0.1;\n\t}\n\n\t& > .panel--header {\n\t\tdisplay: flex;\n\t\tz-index: 1;\n\t\ttop: 50px;\n\t\tpadding: 16px;\n\t\tcursor: grab;\n\n\t\t&, ::v-deep * {\n\t\t\t-webkit-touch-callout: none;\n\t\t\t-webkit-user-select: none;\n\t\t\t-khtml-user-select: none;\n\t\t\t-moz-user-select: none;\n\t\t\t-ms-user-select: none;\n\t\t\tuser-select: none;\n\t\t}\n\n\t\t&:active {\n\t\t\tcursor: grabbing;\n\t\t}\n\n\t\ta {\n\t\t\tflex-grow: 1;\n\t\t}\n\n\t\t> h2 {\n\t\t\tdisplay: block;\n\t\t\talign-items: center;\n\t\t\tflex-grow: 1;\n\t\t\tmargin: 0;\n\t\t\tfont-size: 20px;\n\t\t\tline-height: 24px;\n\t\t\tfont-weight: bold;\n\t\t\tpadding: 16px 8px;\n\t\t\theight: 56px;\n\t\t\twhite-space: nowrap;\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t\tcursor: grab;\n\t\t\tdiv {\n\t\t\t\tbackground-size: 32px;\n\t\t\t\twidth: 32px;\n\t\t\t\theight: 32px;\n\t\t\t\tmargin-right: 16px;\n\t\t\t\tbackground-position: center;\n\t\t\t\tfloat: left;\n\t\t\t\tfilter: var(--background-invert-if-dark);\n\t\t\t}\n\t\t}\n\t}\n\n\t& > .panel--content {\n\t\tmargin: 0 16px 16px 16px;\n\t\theight: 424px;\n\t\t// We specifically do not want scrollbars inside widgets\n\t\toverflow: visible;\n\t}\n\n\t// No need to extend height of widgets if only one column is shown\n\t@media only screen and (max-width: 709px) {\n\t\t& > .panel--content {\n\t\t\theight: auto;\n\t\t}\n\t}\n}\n\n.footer {\n\tdisplay: flex;\n\tjustify-content: center;\n\ttransition: bottom var(--animation-slow) ease-in-out;\n\tbottom: 0;\n\tpadding: 44px 0;\n}\n\n.edit-panels {\n\tdisplay: inline-block;\n\tmargin:auto;\n\tbackground-position: 16px center;\n\tpadding: 12px 16px;\n\tpadding-left: 36px;\n\tborder-radius: var(--border-radius-pill);\n\tmax-width: 200px;\n\topacity: 1;\n\ttext-align: center;\n}\n\n.button,\n.button-vue\n.edit-panels,\n.statuses ::v-deep .action-item .action-item__menutoggle,\n.statuses ::v-deep .action-item.action-item--open .action-item__menutoggle {\n\tbackground-color: var(--color-background-translucent);\n\t-webkit-backdrop-filter: var(--background-blur);\n\tbackdrop-filter: var(--background-blur);\n\topacity: 1 !important;\n\n\t&:hover,\n\t&:focus,\n\t&:active {\n\t\tbackground-color: var(--color-background-hover)!important;\n\t}\n\t&:focus-visible {\n\t\tbox-shadow: 0 0 0 2px var(--color-main-text) !important;\n\t}\n}\n\n.modal__content {\n\tpadding: 32px 16px;\n\ttext-align: center;\n\n\tol {\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t\tjustify-content: center;\n\t\tlist-style-type: none;\n\t\tpadding-bottom: 16px;\n\t}\n\tli {\n\t\tlabel {\n\t\t\tposition: relative;\n\t\t\tdisplay: block;\n\t\t\tpadding: 48px 16px 14px 16px;\n\t\t\tmargin: 8px;\n\t\t\twidth: 140px;\n\t\t\tbackground-color: var(--color-background-hover);\n\t\t\tborder: 2px solid var(--color-main-background);\n\t\t\tborder-radius: var(--border-radius-large);\n\t\t\ttext-align: left;\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t\twhite-space: nowrap;\n\n\t\t\tdiv {\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 16px;\n\t\t\t\twidth: 24px;\n\t\t\t\theight: 24px;\n\t\t\t\tbackground-size: 24px;\n\t\t\t}\n\n\t\t\t&:hover {\n\t\t\t\tborder-color: var(--color-primary);\n\t\t\t}\n\t\t}\n\n\t\t// Do not invert status icons\n\t\t&:not(.panel-status) label div {\n\t\t\tfilter: var(--background-invert-if-dark);\n\t\t}\n\n\t\tinput[type='checkbox'].checkbox + label:before {\n\t\t\tposition: absolute;\n\t\t\tright: 12px;\n\t\t\ttop: 16px;\n\t\t}\n\n\t\tinput:focus + label {\n\t\t\tborder-color: var(--color-primary);\n\t\t}\n\t}\n\n\th3 {\n\t\tfont-weight: bold;\n\n\t\t&:not(:first-of-type) {\n\t\t\tmargin-top: 64px;\n\t\t}\n\t}\n\n\t// Adjust design of 'Get more widgets' button\n\t.button {\n\t\tdisplay: inline-block;\n\t\tpadding: 10px 16px;\n\t\tmargin: 0;\n\t}\n\n\tp {\n\t\tmax-width: 650px;\n\t\tmargin: 0 auto;\n\n\t\ta:hover,\n\t\ta:focus {\n\t\t\tborder-bottom: 2px solid var(--color-border);\n\t\t}\n\t}\n\n\t.credits--end {\n\t\tpadding-bottom: 32px;\n\t\tcolor: var(--color-text-maxcontrast);\n\n\t\ta {\n\t\t\tcolor: var(--color-text-maxcontrast);\n\t\t}\n\t}\n}\n\n.flip-list-move {\n\ttransition: transform var(--animation-slow);\n}\n\n.statuses {\n\tdisplay: flex;\n\tflex-direction: row;\n\tjustify-content: center;\n\tflex-wrap: wrap;\n\tmargin-bottom: 36px;\n\n\t& > div {\n\t\tmargin: 8px;\n\t}\n}\n"],sourceRoot:""}]),n.Z=i},32238:function(t,n,e){var a=e(87537),o=e.n(a),r=e(23645),i=e.n(r)()(o());i.push([t.id,'.background-selector[data-v-77b70ba2]{display:flex;flex-wrap:wrap;justify-content:center}.background-selector .background[data-v-77b70ba2]{width:176px;height:96px;margin:8px;background-size:cover;background-position:center center;text-align:center;border-radius:var(--border-radius-large);border:2px solid var(--color-main-background);overflow:hidden}.background-selector .background.current[data-v-77b70ba2]{background-image:var(--color-background-dark)}.background-selector .background.filepicker[data-v-77b70ba2],.background-selector .background.default[data-v-77b70ba2],.background-selector .background.color[data-v-77b70ba2]{border-color:var(--color-border)}.background-selector .background.color[data-v-77b70ba2]{background-color:var(--color-primary);color:var(--color-primary-text)}.background-selector .background.active[data-v-77b70ba2],.background-selector .background[data-v-77b70ba2]:hover,.background-selector .background[data-v-77b70ba2]:focus{border:2px solid var(--color-primary)}.background-selector .background.active[data-v-77b70ba2]:not(.icon-loading):after{background-image:var(--icon-checkmark-white);background-repeat:no-repeat;background-position:center;background-size:44px;content:"";display:block;height:100%}',"",{version:3,sources:["webpack://./apps/dashboard/src/components/BackgroundSettings.vue"],names:[],mappings:"AA4IA,sCACC,YAAA,CACA,cAAA,CACA,sBAAA,CAEA,kDACC,WAAA,CACA,WAAA,CACA,UAAA,CACA,qBAAA,CACA,iCAAA,CACA,iBAAA,CACA,wCAAA,CACA,6CAAA,CACA,eAAA,CAEA,0DACC,6CAAA,CAGD,+KACC,gCAAA,CAGD,wDACC,qCAAA,CACA,+BAAA,CAGD,yKAGC,qCAAA,CAGD,kFACC,4CAAA,CACA,2BAAA,CACA,0BAAA,CACA,oBAAA,CACA,UAAA,CACA,aAAA,CACA,WAAA",sourcesContent:["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.background-selector {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tjustify-content: center;\n\n\t.background {\n\t\twidth: 176px;\n\t\theight: 96px;\n\t\tmargin: 8px;\n\t\tbackground-size: cover;\n\t\tbackground-position: center center;\n\t\ttext-align: center;\n\t\tborder-radius: var(--border-radius-large);\n\t\tborder: 2px solid var(--color-main-background);\n\t\toverflow: hidden;\n\n\t\t&.current {\n\t\t\tbackground-image: var(--color-background-dark);\n\t\t}\n\n\t\t&.filepicker, &.default, &.color {\n\t\t\tborder-color: var(--color-border);\n\t\t}\n\n\t\t&.color {\n\t\t\tbackground-color: var(--color-primary);\n\t\t\tcolor: var(--color-primary-text);\n\t\t}\n\n\t\t&.active,\n\t\t&:hover,\n\t\t&:focus {\n\t\t\tborder: 2px solid var(--color-primary);\n\t\t}\n\n\t\t&.active:not(.icon-loading):after {\n\t\t\tbackground-image: var(--icon-checkmark-white);\n\t\t\tbackground-repeat: no-repeat;\n\t\t\tbackground-position: center;\n\t\t\tbackground-size: 44px;\n\t\t\tcontent: '';\n\t\t\tdisplay: block;\n\t\t\theight: 100%;\n\t\t}\n\t}\n}\n"],sourceRoot:""}]),n.Z=i}},a={};function o(t){var n=a[t];if(void 0!==n)return n.exports;var r=a[t]={id:t,loaded:!1,exports:{}};return e[t].call(r.exports,r,r.exports,o),r.loaded=!0,r.exports}o.m=e,o.amdD=function(){throw new Error("define cannot be used indirect")},o.amdO={},n=[],o.O=function(t,e,a,r){if(!e){var i=1/0;for(c=0;c<n.length;c++){e=n[c][0],a=n[c][1],r=n[c][2];for(var s=!0,d=0;d<e.length;d++)(!1&r||i>=r)&&Object.keys(o.O).every((function(t){return o.O[t](e[d])}))?e.splice(d--,1):(s=!1,r<i&&(i=r));if(s){n.splice(c--,1);var l=a();void 0!==l&&(t=l)}}return t}r=r||0;for(var c=n.length;c>0&&n[c-1][2]>r;c--)n[c]=n[c-1];n[c]=[e,a,r]},o.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return o.d(n,{a:n}),n},o.d=function(t,n){for(var e in n)o.o(n,e)&&!o.o(t,e)&&Object.defineProperty(t,e,{enumerable:!0,get:n[e]})},o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),o.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},o.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},o.nmd=function(t){return t.paths=[],t.children||(t.children=[]),t},o.j=4773,function(){o.b=document.baseURI||self.location.href;var t={4773:0};o.O.j=function(n){return 0===t[n]};var n=function(n,e){var a,r,i=e[0],s=e[1],d=e[2],l=0;if(i.some((function(n){return 0!==t[n]}))){for(a in s)o.o(s,a)&&(o.m[a]=s[a]);if(d)var c=d(o)}for(n&&n(e);l<i.length;l++)r=i[l],o.o(t,r)&&t[r]&&t[r][0](),t[r]=0;return o.O(c)},e=self.webpackChunknextcloud=self.webpackChunknextcloud||[];e.forEach(n.bind(null,0)),e.push=n.bind(null,e.push.bind(e))}(),o.nc=void 0;var r=o.O(void 0,[7874],(function(){return o(90422)}));r=o.O(r)}(); +//# sourceMappingURL=dashboard-main.js.map?v=2deb8af26f6266f4cb2d
\ No newline at end of file diff --git a/dist/dashboard-main.js.map b/dist/dashboard-main.js.map index 2c6bc40869b..2cc5972bd90 100644 --- a/dist/dashboard-main.js.map +++ b/dist/dashboard-main.js.map @@ -1 +1 @@ -{"version":3,"file":"dashboard-main.js?v=f1359e4266dad203a595","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/apps/dashboard/src/mixins/isMobile.js","webpack:///nextcloud/apps/dashboard/src/helpers/prefixWithBaseUrl.js","webpack:///nextcloud/apps/dashboard/src/helpers/getBackgroundUrl.js","webpack:///nextcloud/apps/dashboard/src/components/BackgroundSettings.vue","webpack:///nextcloud/apps/dashboard/src/components/BackgroundSettings.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/dashboard/src/components/BackgroundSettings.vue?abc9","webpack://nextcloud/./apps/dashboard/src/components/BackgroundSettings.vue?20a7","webpack:///nextcloud/apps/dashboard/src/components/BackgroundSettings.vue?vue&type=template&id=16994ae8&scoped=true&","webpack:///nextcloud/apps/dashboard/src/DashboardApp.vue","webpack:///nextcloud/apps/dashboard/src/DashboardApp.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/dashboard/src/DashboardApp.vue?4c5f","webpack://nextcloud/./apps/dashboard/src/DashboardApp.vue?5685","webpack:///nextcloud/apps/dashboard/src/DashboardApp.vue?vue&type=template&id=5d4b2fb6&scoped=true&","webpack:///nextcloud/apps/dashboard/src/main.js","webpack:///nextcloud/apps/dashboard/src/DashboardApp.vue?vue&type=style&index=0&id=5d4b2fb6&lang=scss&scoped=true&","webpack:///nextcloud/apps/dashboard/src/components/BackgroundSettings.vue?vue&type=style&index=0&id=16994ae8&scoped=true&lang=scss&","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/amd define","webpack:///nextcloud/webpack/runtime/amd options","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/global","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","/**\n * @copyright Copyright (c) 2020 Julius Härtl <jus@bitgrid.net>\n *\n * @author Julius Härtl <jus@bitgrid.net>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nexport default {\n\tdata() {\n\t\treturn {\n\t\t\tisMobile: this._isMobile(),\n\t\t}\n\t},\n\tbeforeMount() {\n\t\twindow.addEventListener('resize', this._onResize)\n\t},\n\tbeforeDestroy() {\n\t\twindow.removeEventListener('resize', this._onResize)\n\t},\n\tmethods: {\n\t\t_onResize() {\n\t\t\t// Update mobile mode\n\t\t\tthis.isMobile = this._isMobile()\n\t\t},\n\t\t_isMobile() {\n\t\t\t// check if content width is under 768px\n\t\t\treturn document.documentElement.clientWidth < 768\n\t\t},\n\t},\n}\n","/**\n * @copyright Copyright (c) 2020 Julius Härtl <jus@bitgrid.net>\n *\n * @author Julius Härtl <jus@bitgrid.net>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { generateFilePath } from '@nextcloud/router'\n\nexport default (url) => generateFilePath('dashboard', '', 'img/') + url\n","/**\n * @copyright Copyright (c) 2020 Julius Härtl <jus@bitgrid.net>\n *\n * @author Avior <florian.bouillon@delta-wings.net>\n * @author Julien Veyssier <eneiluj@posteo.net>\n * @author Julius Härtl <jus@bitgrid.net>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { generateUrl } from '@nextcloud/router'\nimport prefixWithBaseUrl from './prefixWithBaseUrl'\n\nexport default (background, time = 0, themingDefaultBackground = '') => {\n\tconst enabledThemes = window.OCA?.Theming?.enabledThemes || []\n\tconst isDarkTheme = (enabledThemes.length === 0 || enabledThemes[0] === 'default')\n\t\t? window.matchMedia('(prefers-color-scheme: dark)').matches\n\t\t: enabledThemes.join('').indexOf('dark') !== -1\n\n\tif (background === 'default') {\n\t\tif (themingDefaultBackground && themingDefaultBackground !== 'backgroundColor') {\n\t\t\treturn generateUrl('/apps/theming/image/background') + '?v=' + window.OCA.Theming.cacheBuster\n\t\t}\n\n\t\tif (isDarkTheme) {\n\t\t\treturn prefixWithBaseUrl('eduardo-neves-pedra-azul.jpg')\n\t\t}\n\n\t\treturn prefixWithBaseUrl('kamil-porembinski-clouds.jpg')\n\t} else if (background === 'custom') {\n\t\treturn generateUrl('/apps/dashboard/background') + '?v=' + time\n\t}\n\n\treturn prefixWithBaseUrl(background)\n}\n","<!--\n - @copyright Copyright (c) 2020 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<div class=\"background-selector\">\n\t\t<button class=\"background filepicker\"\n\t\t\t:class=\"{ active: background === 'custom' }\"\n\t\t\ttabindex=\"0\"\n\t\t\t@click=\"pickFile\">\n\t\t\t{{ t('dashboard', 'Pick from Files') }}\n\t\t</button>\n\t\t<button class=\"background default\"\n\t\t\ttabindex=\"0\"\n\t\t\t:class=\"{ 'icon-loading': loading === 'default', active: background === 'default' }\"\n\t\t\t@click=\"setDefault\">\n\t\t\t{{ t('dashboard', 'Default images') }}\n\t\t</button>\n\t\t<button class=\"background color\"\n\t\t\t:class=\"{ active: background === 'custom' }\"\n\t\t\ttabindex=\"0\"\n\t\t\t@click=\"pickColor\">\n\t\t\t{{ t('dashboard', 'Plain background') }}\n\t\t</button>\n\t\t<button v-for=\"shippedBackground in shippedBackgrounds\"\n\t\t\t:key=\"shippedBackground.name\"\n\t\t\tv-tooltip=\"shippedBackground.details.attribution\"\n\t\t\t:class=\"{ 'icon-loading': loading === shippedBackground.name, active: background === shippedBackground.name }\"\n\t\t\ttabindex=\"0\"\n\t\t\tclass=\"background\"\n\t\t\t:style=\"{ 'background-image': 'url(' + shippedBackground.preview + ')' }\"\n\t\t\t@click=\"setShipped(shippedBackground.name)\" />\n\t</div>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport { generateUrl } from '@nextcloud/router'\nimport { loadState } from '@nextcloud/initial-state'\nimport getBackgroundUrl from './../helpers/getBackgroundUrl'\nimport prefixWithBaseUrl from './../helpers/prefixWithBaseUrl'\nconst shippedBackgroundList = loadState('dashboard', 'shippedBackgrounds')\n\nexport default {\n\tname: 'BackgroundSettings',\n\tprops: {\n\t\tbackground: {\n\t\t\ttype: String,\n\t\t\tdefault: 'default',\n\t\t},\n\t\tthemingDefaultBackground: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tbackgroundImage: generateUrl('/apps/dashboard/background') + '?v=' + Date.now(),\n\t\t\tloading: false,\n\t\t}\n\t},\n\tcomputed: {\n\t\tshippedBackgrounds() {\n\t\t\treturn Object.keys(shippedBackgroundList).map((item) => {\n\t\t\t\treturn {\n\t\t\t\t\tname: item,\n\t\t\t\t\turl: prefixWithBaseUrl(item),\n\t\t\t\t\tpreview: prefixWithBaseUrl('previews/' + item),\n\t\t\t\t\tdetails: shippedBackgroundList[item],\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t},\n\tmethods: {\n\t\tasync update(data) {\n\t\t\tconst background = data.type === 'custom' || data.type === 'default' ? data.type : data.value\n\t\t\tthis.backgroundImage = getBackgroundUrl(background, data.version, this.themingDefaultBackground)\n\t\t\tif (data.type === 'color' || (data.type === 'default' && this.themingDefaultBackground === 'backgroundColor')) {\n\t\t\t\tthis.$emit('update:background', data)\n\t\t\t\tthis.loading = false\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst image = new Image()\n\t\t\timage.onload = () => {\n\t\t\t\tthis.$emit('update:background', data)\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t\timage.src = this.backgroundImage\n\t\t},\n\t\tasync setDefault() {\n\t\t\tthis.loading = 'default'\n\t\t\tconst result = await axios.post(generateUrl('/apps/dashboard/background/default'))\n\t\t\tthis.update(result.data)\n\t\t},\n\t\tasync setShipped(shipped) {\n\t\t\tthis.loading = shipped\n\t\t\tconst result = await axios.post(generateUrl('/apps/dashboard/background/shipped'), { value: shipped })\n\t\t\tthis.update(result.data)\n\t\t},\n\t\tasync setFile(path) {\n\t\t\tthis.loading = 'custom'\n\t\t\tconst result = await axios.post(generateUrl('/apps/dashboard/background/custom'), { value: path })\n\t\t\tthis.update(result.data)\n\t\t},\n\t\tasync pickColor() {\n\t\t\tthis.loading = 'color'\n\t\t\tconst color = OCA && OCA.Theming ? OCA.Theming.color : '#0082c9'\n\t\t\tconst result = await axios.post(generateUrl('/apps/dashboard/background/color'), { value: color })\n\t\t\tthis.update(result.data)\n\t\t},\n\t\tpickFile() {\n\t\t\twindow.OC.dialogs.filepicker(t('dashboard', 'Insert from {productName}', { productName: OC.theme.name }), (path, type) => {\n\t\t\t\tif (type === OC.dialogs.FILEPICKER_TYPE_CHOOSE) {\n\t\t\t\t\tthis.setFile(path)\n\t\t\t\t}\n\t\t\t}, false, ['image/png', 'image/gif', 'image/jpeg', 'image/svg'], true, OC.dialogs.FILEPICKER_TYPE_CHOOSE)\n\t\t},\n\t},\n}\n</script>\n\n<style scoped lang=\"scss\">\n.background-selector {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tjustify-content: center;\n\n\t.background {\n\t\twidth: 176px;\n\t\theight: 96px;\n\t\tmargin: 8px;\n\t\tbackground-size: cover;\n\t\tbackground-position: center center;\n\t\ttext-align: center;\n\t\tborder-radius: var(--border-radius-large);\n\t\tborder: 2px solid var(--color-main-background);\n\t\toverflow: hidden;\n\n\t\t&.current {\n\t\t\tbackground-image: var(--color-background-dark);\n\t\t}\n\n\t\t&.filepicker, &.default, &.color {\n\t\t\tborder-color: var(--color-border);\n\t\t}\n\n\t\t&.color {\n\t\t\tbackground-color: var(--color-primary);\n\t\t\tcolor: var(--color-primary-text);\n\t\t}\n\n\t\t&.active,\n\t\t&:hover,\n\t\t&:focus {\n\t\t\tborder: 2px solid var(--color-primary);\n\t\t}\n\n\t\t&.active:not(.icon-loading):after {\n\t\t\tbackground-image: var(--icon-checkmark-white);\n\t\t\tbackground-repeat: no-repeat;\n\t\t\tbackground-position: center;\n\t\t\tbackground-size: 44px;\n\t\t\tcontent: '';\n\t\t\tdisplay: block;\n\t\t\theight: 100%;\n\t\t}\n\t}\n}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BackgroundSettings.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BackgroundSettings.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BackgroundSettings.vue?vue&type=style&index=0&id=16994ae8&scoped=true&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BackgroundSettings.vue?vue&type=style&index=0&id=16994ae8&scoped=true&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./BackgroundSettings.vue?vue&type=template&id=16994ae8&scoped=true&\"\nimport script from \"./BackgroundSettings.vue?vue&type=script&lang=js&\"\nexport * from \"./BackgroundSettings.vue?vue&type=script&lang=js&\"\nimport style0 from \"./BackgroundSettings.vue?vue&type=style&index=0&id=16994ae8&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"16994ae8\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"background-selector\"},[_c('button',{staticClass:\"background filepicker\",class:{ active: _vm.background === 'custom' },attrs:{\"tabindex\":\"0\"},on:{\"click\":_vm.pickFile}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('dashboard', 'Pick from Files'))+\"\\n\\t\")]),_vm._v(\" \"),_c('button',{staticClass:\"background default\",class:{ 'icon-loading': _vm.loading === 'default', active: _vm.background === 'default' },attrs:{\"tabindex\":\"0\"},on:{\"click\":_vm.setDefault}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('dashboard', 'Default images'))+\"\\n\\t\")]),_vm._v(\" \"),_c('button',{staticClass:\"background color\",class:{ active: _vm.background === 'custom' },attrs:{\"tabindex\":\"0\"},on:{\"click\":_vm.pickColor}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('dashboard', 'Plain background'))+\"\\n\\t\")]),_vm._v(\" \"),_vm._l((_vm.shippedBackgrounds),function(shippedBackground){return _c('button',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(shippedBackground.details.attribution),expression:\"shippedBackground.details.attribution\"}],key:shippedBackground.name,staticClass:\"background\",class:{ 'icon-loading': _vm.loading === shippedBackground.name, active: _vm.background === shippedBackground.name },style:({ 'background-image': 'url(' + shippedBackground.preview + ')' }),attrs:{\"tabindex\":\"0\"},on:{\"click\":function($event){return _vm.setShipped(shippedBackground.name)}}})})],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n\t<div id=\"app-dashboard\" :style=\"backgroundStyle\">\n\t\t<h2>{{ greeting.text }}</h2>\n\t\t<ul class=\"statuses\">\n\t\t\t<div v-for=\"status in sortedRegisteredStatus\"\n\t\t\t\t:id=\"'status-' + status\"\n\t\t\t\t:key=\"status\">\n\t\t\t\t<div :ref=\"'status-' + status\" />\n\t\t\t</div>\n\t\t</ul>\n\n\t\t<Draggable v-model=\"layout\"\n\t\t\tclass=\"panels\"\n\t\t\tv-bind=\"{swapThreshold: 0.30, delay: 500, delayOnTouchOnly: true, touchStartThreshold: 3}\"\n\t\t\thandle=\".panel--header\"\n\t\t\t@end=\"saveLayout\">\n\t\t\t<div v-for=\"panelId in layout\" :key=\"panels[panelId].id\" class=\"panel\">\n\t\t\t\t<div class=\"panel--header\">\n\t\t\t\t\t<h2>\n\t\t\t\t\t\t<div :class=\"panels[panelId].iconClass\" role=\"img\" />\n\t\t\t\t\t\t{{ panels[panelId].title }}\n\t\t\t\t\t</h2>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"panel--content\" :class=\"{ loading: !panels[panelId].mounted }\">\n\t\t\t\t\t<div :ref=\"panels[panelId].id\" :data-id=\"panels[panelId].id\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</Draggable>\n\n\t\t<div class=\"footer\">\n\t\t\t<Button @click=\"showModal\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Pencil :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('dashboard', 'Customize') }}\n\t\t\t</Button>\n\t\t</div>\n\n\t\t<Modal v-if=\"modal\" size=\"large\" @close=\"closeModal\">\n\t\t\t<div class=\"modal__content\">\n\t\t\t\t<h3>{{ t('dashboard', 'Edit widgets') }}</h3>\n\t\t\t\t<ol class=\"panels\">\n\t\t\t\t\t<li v-for=\"status in sortedAllStatuses\" :key=\"status\" :class=\"'panel-' + status\">\n\t\t\t\t\t\t<input :id=\"'status-checkbox-' + status\"\n\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\tclass=\"checkbox\"\n\t\t\t\t\t\t\t:checked=\"isStatusActive(status)\"\n\t\t\t\t\t\t\t@input=\"updateStatusCheckbox(status, $event.target.checked)\">\n\t\t\t\t\t\t<label :for=\"'status-checkbox-' + status\">\n\t\t\t\t\t\t\t<div :class=\"statusInfo[status].icon\" role=\"img\" />\n\t\t\t\t\t\t\t{{ statusInfo[status].text }}\n\t\t\t\t\t\t</label>\n\t\t\t\t\t</li>\n\t\t\t\t</ol>\n\t\t\t\t<Draggable v-model=\"layout\"\n\t\t\t\t\tclass=\"panels\"\n\t\t\t\t\ttag=\"ol\"\n\t\t\t\t\tv-bind=\"{swapThreshold: 0.30, delay: 500, delayOnTouchOnly: true, touchStartThreshold: 3}\"\n\t\t\t\t\thandle=\".draggable\"\n\t\t\t\t\t@end=\"saveLayout\">\n\t\t\t\t\t<li v-for=\"panel in sortedPanels\" :key=\"panel.id\" :class=\"'panel-' + panel.id\">\n\t\t\t\t\t\t<input :id=\"'panel-checkbox-' + panel.id\"\n\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\tclass=\"checkbox\"\n\t\t\t\t\t\t\t:checked=\"isActive(panel)\"\n\t\t\t\t\t\t\t@input=\"updateCheckbox(panel, $event.target.checked)\">\n\t\t\t\t\t\t<label :for=\"'panel-checkbox-' + panel.id\" :class=\"{ draggable: isActive(panel) }\">\n\t\t\t\t\t\t\t<div :class=\"panel.iconClass\" role=\"img\" />\n\t\t\t\t\t\t\t{{ panel.title }}\n\t\t\t\t\t\t</label>\n\t\t\t\t\t</li>\n\t\t\t\t</Draggable>\n\n\t\t\t\t<a v-if=\"isAdmin\" :href=\"appStoreUrl\" class=\"button\">{{ t('dashboard', 'Get more widgets from the App Store') }}</a>\n\n\t\t\t\t<h3>{{ t('dashboard', 'Change background image') }}</h3>\n\t\t\t\t<BackgroundSettings :background=\"background\"\n\t\t\t\t\t:theming-default-background=\"themingDefaultBackground\"\n\t\t\t\t\t@update:background=\"updateBackground\" />\n\n\t\t\t\t<h3>{{ t('dashboard', 'Weather service') }}</h3>\n\t\t\t\t<p>\n\t\t\t\t\t{{ t('dashboard', 'For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information.') }}\n\t\t\t\t</p>\n\t\t\t\t<p class=\"credits--end\">\n\t\t\t\t\t<a href=\"https://api.met.no/doc/TermsOfService\" target=\"_blank\" rel=\"noopener\">{{ t('dashboard', 'Weather data from Met.no') }}</a>,\n\t\t\t\t\t<a href=\"https://wiki.osmfoundation.org/wiki/Privacy_Policy\" target=\"_blank\" rel=\"noopener\">{{ t('dashboard', 'geocoding with Nominatim') }}</a>,\n\t\t\t\t\t<a href=\"https://www.opentopodata.org/#public-api\" target=\"_blank\" rel=\"noopener\">{{ t('dashboard', 'elevation data from OpenTopoData') }}</a>.\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t</Modal>\n\t</div>\n</template>\n\n<script>\nimport { generateUrl } from '@nextcloud/router'\nimport { getCurrentUser } from '@nextcloud/auth'\nimport { loadState } from '@nextcloud/initial-state'\nimport axios from '@nextcloud/axios'\nimport Button from '@nextcloud/vue/dist/Components/Button'\nimport Draggable from 'vuedraggable'\nimport Modal from '@nextcloud/vue/dist/Components/Modal'\nimport Pencil from 'vue-material-design-icons/Pencil.vue'\nimport Vue from 'vue'\n\nimport isMobile from './mixins/isMobile'\nimport BackgroundSettings from './components/BackgroundSettings'\nimport getBackgroundUrl from './helpers/getBackgroundUrl'\n\nconst panels = loadState('dashboard', 'panels')\nconst firstRun = loadState('dashboard', 'firstRun')\nconst background = loadState('dashboard', 'background')\nconst themingDefaultBackground = loadState('dashboard', 'themingDefaultBackground')\nconst version = loadState('dashboard', 'version')\nconst shippedBackgroundList = loadState('dashboard', 'shippedBackgrounds')\n\nconst statusInfo = {\n\tweather: {\n\t\ttext: t('dashboard', 'Weather'),\n\t\ticon: 'icon-weather-status',\n\t},\n\tstatus: {\n\t\ttext: t('dashboard', 'Status'),\n\t\ticon: 'icon-user-status-online',\n\t},\n}\n\nexport default {\n\tname: 'DashboardApp',\n\tcomponents: {\n\t\tBackgroundSettings,\n\t\tButton,\n\t\tDraggable,\n\t\tModal,\n\t\tPencil,\n\t},\n\tmixins: [\n\t\tisMobile,\n\t],\n\n\tdata() {\n\t\treturn {\n\t\t\tisAdmin: getCurrentUser().isAdmin,\n\t\t\ttimer: new Date(),\n\t\t\tregisteredStatus: [],\n\t\t\tcallbacks: {},\n\t\t\tcallbacksStatus: {},\n\t\t\tallCallbacksStatus: {},\n\t\t\tstatusInfo,\n\t\t\tenabledStatuses: loadState('dashboard', 'statuses'),\n\t\t\tpanels,\n\t\t\tfirstRun,\n\t\t\tdisplayName: getCurrentUser()?.displayName,\n\t\t\tuid: getCurrentUser()?.uid,\n\t\t\tlayout: loadState('dashboard', 'layout').filter((panelId) => panels[panelId]),\n\t\t\tmodal: false,\n\t\t\tappStoreUrl: generateUrl('/settings/apps/dashboard'),\n\t\t\tstatuses: {},\n\t\t\tbackground,\n\t\t\tthemingDefaultBackground,\n\t\t\tversion,\n\t\t}\n\t},\n\tcomputed: {\n\t\tbackgroundImage() {\n\t\t\treturn getBackgroundUrl(this.background, this.version, this.themingDefaultBackground)\n\t\t},\n\t\tbackgroundStyle() {\n\t\t\tif ((this.background === 'default' && this.themingDefaultBackground === 'backgroundColor')\n\t\t\t\t|| this.background.match(/#[0-9A-Fa-f]{6}/g)) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tbackgroundImage: `url(${this.backgroundImage})`,\n\t\t\t}\n\t\t},\n\n\t\tgreeting() {\n\t\t\tconst time = this.timer.getHours()\n\n\t\t\t// Determine part of the day\n\t\t\tlet partOfDay\n\t\t\tif (time >= 22 || time < 5) {\n\t\t\t\tpartOfDay = 'night'\n\t\t\t} else if (time >= 18) {\n\t\t\t\tpartOfDay = 'evening'\n\t\t\t} else if (time >= 12) {\n\t\t\t\tpartOfDay = 'afternoon'\n\t\t\t} else {\n\t\t\t\tpartOfDay = 'morning'\n\t\t\t}\n\n\t\t\t// Define the greetings\n\t\t\tconst good = {\n\t\t\t\tmorning: {\n\t\t\t\t\tgeneric: t('dashboard', 'Good morning'),\n\t\t\t\t\twithName: t('dashboard', 'Good morning, {name}', { name: this.displayName }, undefined, { escape: false }),\n\t\t\t\t},\n\t\t\t\tafternoon: {\n\t\t\t\t\tgeneric: t('dashboard', 'Good afternoon'),\n\t\t\t\t\twithName: t('dashboard', 'Good afternoon, {name}', { name: this.displayName }, undefined, { escape: false }),\n\t\t\t\t},\n\t\t\t\tevening: {\n\t\t\t\t\tgeneric: t('dashboard', 'Good evening'),\n\t\t\t\t\twithName: t('dashboard', 'Good evening, {name}', { name: this.displayName }, undefined, { escape: false }),\n\t\t\t\t},\n\t\t\t\tnight: {\n\t\t\t\t\t// Don't use \"Good night\" as it's not a greeting\n\t\t\t\t\tgeneric: t('dashboard', 'Hello'),\n\t\t\t\t\twithName: t('dashboard', 'Hello, {name}', { name: this.displayName }, undefined, { escape: false }),\n\t\t\t\t},\n\t\t\t}\n\n\t\t\t// Figure out which greeting to show\n\t\t\tconst shouldShowName = this.displayName && this.uid !== this.displayName\n\t\t\treturn { text: shouldShowName ? good[partOfDay].withName : good[partOfDay].generic }\n\t\t},\n\n\t\tisActive() {\n\t\t\treturn (panel) => this.layout.indexOf(panel.id) > -1\n\t\t},\n\t\tisStatusActive() {\n\t\t\treturn (status) => !(status in this.enabledStatuses) || this.enabledStatuses[status]\n\t\t},\n\n\t\tsortedAllStatuses() {\n\t\t\treturn Object.keys(this.allCallbacksStatus).slice().sort(this.sortStatuses)\n\t\t},\n\t\tsortedPanels() {\n\t\t\treturn Object.values(this.panels).sort((a, b) => {\n\t\t\t\tconst indexA = this.layout.indexOf(a.id)\n\t\t\t\tconst indexB = this.layout.indexOf(b.id)\n\t\t\t\tif (indexA === -1 || indexB === -1) {\n\t\t\t\t\treturn indexB - indexA || a.id - b.id\n\t\t\t\t}\n\t\t\t\treturn indexA - indexB || a.id - b.id\n\t\t\t})\n\t\t},\n\t\tsortedRegisteredStatus() {\n\t\t\treturn this.registeredStatus.slice().sort(this.sortStatuses)\n\t\t},\n\t},\n\n\twatch: {\n\t\tcallbacks() {\n\t\t\tthis.rerenderPanels()\n\t\t},\n\t\tcallbacksStatus() {\n\t\t\tfor (const app in this.callbacksStatus) {\n\t\t\t\tconst element = this.$refs['status-' + app]\n\t\t\t\tif (this.statuses[app] && this.statuses[app].mounted) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (element) {\n\t\t\t\t\tthis.callbacksStatus[app](element[0])\n\t\t\t\t\tVue.set(this.statuses, app, { mounted: true })\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error('Failed to register panel in the frontend as no backend data was provided for ' + app)\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.updateGlobalStyles()\n\t\tthis.updateSkipLink()\n\t\twindow.addEventListener('scroll', this.handleScroll)\n\n\t\tsetInterval(() => {\n\t\t\tthis.timer = new Date()\n\t\t}, 30000)\n\n\t\tif (this.firstRun) {\n\t\t\twindow.addEventListener('scroll', this.disableFirstrunHint)\n\t\t}\n\t},\n\tdestroyed() {\n\t\twindow.removeEventListener('scroll', this.handleScroll)\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Method to register panels that will be called by the integrating apps\n\t\t *\n\t\t * @param {string} app The unique app id for the widget\n\t\t * @param {Function} callback The callback function to register a panel which gets the DOM element passed as parameter\n\t\t */\n\t\tregister(app, callback) {\n\t\t\tVue.set(this.callbacks, app, callback)\n\t\t},\n\t\tregisterStatus(app, callback) {\n\t\t\t// always save callbacks in case user enables the status later\n\t\t\tVue.set(this.allCallbacksStatus, app, callback)\n\t\t\t// register only if status is enabled or missing from config\n\t\t\tif (this.isStatusActive(app)) {\n\t\t\t\tthis.registeredStatus.push(app)\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\tVue.set(this.callbacksStatus, app, callback)\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\trerenderPanels() {\n\t\t\tfor (const app in this.callbacks) {\n\t\t\t\tconst element = this.$refs[app]\n\t\t\t\tif (this.layout.indexOf(app) === -1) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (this.panels[app] && this.panels[app].mounted) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (element) {\n\t\t\t\t\tthis.callbacks[app](element[0], {\n\t\t\t\t\t\twidget: this.panels[app],\n\t\t\t\t\t})\n\t\t\t\t\tVue.set(this.panels[app], 'mounted', true)\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error('Failed to register panel in the frontend as no backend data was provided for ' + app)\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tsaveLayout() {\n\t\t\taxios.post(generateUrl('/apps/dashboard/layout'), {\n\t\t\t\tlayout: this.layout.join(','),\n\t\t\t})\n\t\t},\n\t\tsaveStatuses() {\n\t\t\taxios.post(generateUrl('/apps/dashboard/statuses'), {\n\t\t\t\tstatuses: JSON.stringify(this.enabledStatuses),\n\t\t\t})\n\t\t},\n\t\tshowModal() {\n\t\t\tthis.modal = true\n\t\t\tthis.firstRun = false\n\t\t},\n\t\tcloseModal() {\n\t\t\tthis.modal = false\n\t\t},\n\t\tupdateCheckbox(panel, currentValue) {\n\t\t\tconst index = this.layout.indexOf(panel.id)\n\t\t\tif (!currentValue && index > -1) {\n\t\t\t\tthis.layout.splice(index, 1)\n\n\t\t\t} else {\n\t\t\t\tthis.layout.push(panel.id)\n\t\t\t}\n\t\t\tVue.set(this.panels[panel.id], 'mounted', false)\n\t\t\tthis.saveLayout()\n\t\t\tthis.$nextTick(() => this.rerenderPanels())\n\t\t},\n\t\tdisableFirstrunHint() {\n\t\t\twindow.removeEventListener('scroll', this.disableFirstrunHint)\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.firstRun = false\n\t\t\t}, 1000)\n\t\t},\n\t\tupdateBackground(data) {\n\t\t\tthis.background = data.type === 'custom' || data.type === 'default' ? data.type : data.value\n\t\t\tthis.version = data.version\n\t\t\tthis.updateGlobalStyles()\n\t\t},\n\t\tupdateGlobalStyles() {\n\t\t\t// Override primary-invert-if-bright and color-primary-text if background is set\n\t\t\tconst isBackgroundBright = shippedBackgroundList[this.background]?.theming === 'dark'\n\t\t\tif (isBackgroundBright) {\n\t\t\t\tdocument.querySelector('#header').style.setProperty('--primary-invert-if-bright', 'invert(100%)')\n\t\t\t\tdocument.querySelector('#header').style.setProperty('--color-primary-text', '#000000')\n\t\t\t} else {\n\t\t\t\tdocument.querySelector('#header').style.removeProperty('--primary-invert-if-bright')\n\t\t\t\tdocument.querySelector('#header').style.removeProperty('--color-primary-text')\n\t\t\t}\n\t\t},\n\t\tupdateSkipLink() {\n\t\t\t// Make sure \"Skip to main content\" link points to the app content\n\t\t\tdocument.getElementsByClassName('skip-navigation')[0].setAttribute('href', '#app-dashboard')\n\t\t},\n\t\tupdateStatusCheckbox(app, checked) {\n\t\t\tif (checked) {\n\t\t\t\tthis.enableStatus(app)\n\t\t\t} else {\n\t\t\t\tthis.disableStatus(app)\n\t\t\t}\n\t\t},\n\t\tenableStatus(app) {\n\t\t\tthis.enabledStatuses[app] = true\n\t\t\tthis.registerStatus(app, this.allCallbacksStatus[app])\n\t\t\tthis.saveStatuses()\n\t\t},\n\t\tdisableStatus(app) {\n\t\t\tthis.enabledStatuses[app] = false\n\t\t\tconst i = this.registeredStatus.findIndex((s) => s === app)\n\t\t\tif (i !== -1) {\n\t\t\t\tthis.registeredStatus.splice(i, 1)\n\t\t\t\tVue.set(this.statuses, app, { mounted: false })\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\tVue.delete(this.callbacksStatus, app)\n\t\t\t\t})\n\t\t\t}\n\t\t\tthis.saveStatuses()\n\t\t},\n\t\tsortStatuses(a, b) {\n\t\t\tconst al = a.toLowerCase()\n\t\t\tconst bl = b.toLowerCase()\n\t\t\treturn al > bl\n\t\t\t\t? 1\n\t\t\t\t: al < bl\n\t\t\t\t\t? -1\n\t\t\t\t\t: 0\n\t\t},\n\t\thandleScroll() {\n\t\t\tif (window.scrollY > 70) {\n\t\t\t\tdocument.body.classList.add('dashboard--scrolled')\n\t\t\t} else {\n\t\t\t\tdocument.body.classList.remove('dashboard--scrolled')\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n#app-dashboard {\n\twidth: 100%;\n\tmin-height: 100vh;\n\tbackground-size: cover;\n\tbackground-position: center center;\n\tbackground-repeat: no-repeat;\n\tbackground-attachment: fixed;\n\tbackground-color: var(--color-primary);\n\t--color-background-translucent: rgba(var(--color-main-background-rgb), 0.8);\n\t--background-blur: blur(10px);\n\n\t> h2 {\n\t\tcolor: var(--color-primary-text);\n\t\ttext-align: center;\n\t\tfont-size: 32px;\n\t\tline-height: 130%;\n\t\tpadding: 10vh 16px 0px;\n\t}\n}\n\n.panels {\n\twidth: auto;\n\tmargin: auto;\n\tmax-width: 1500px;\n\tdisplay: flex;\n\tjustify-content: center;\n\tflex-direction: row;\n\talign-items: flex-start;\n\tflex-wrap: wrap;\n}\n\n.panel, .panels > div {\n\twidth: 320px;\n\tmax-width: 100%;\n\tmargin: 16px;\n\tbackground-color: var(--color-background-translucent);\n\t-webkit-backdrop-filter: var(--background-blur);\n\tbackdrop-filter: var(--background-blur);\n\tborder-radius: var(--border-radius-large);\n\n\t#body-user.theme--highcontrast & {\n\t\tborder: 2px solid var(--color-border);\n\t}\n\n\t&.sortable-ghost {\n\t\t opacity: 0.1;\n\t}\n\n\t& > .panel--header {\n\t\tdisplay: flex;\n\t\tz-index: 1;\n\t\ttop: 50px;\n\t\tpadding: 16px;\n\t\tcursor: grab;\n\n\t\t&, ::v-deep * {\n\t\t\t-webkit-touch-callout: none;\n\t\t\t-webkit-user-select: none;\n\t\t\t-khtml-user-select: none;\n\t\t\t-moz-user-select: none;\n\t\t\t-ms-user-select: none;\n\t\t\tuser-select: none;\n\t\t}\n\n\t\t&:active {\n\t\t\tcursor: grabbing;\n\t\t}\n\n\t\ta {\n\t\t\tflex-grow: 1;\n\t\t}\n\n\t\t> h2 {\n\t\t\tdisplay: block;\n\t\t\talign-items: center;\n\t\t\tflex-grow: 1;\n\t\t\tmargin: 0;\n\t\t\tfont-size: 20px;\n\t\t\tline-height: 24px;\n\t\t\tfont-weight: bold;\n\t\t\tpadding: 16px 8px;\n\t\t\theight: 56px;\n\t\t\twhite-space: nowrap;\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t\tcursor: grab;\n\t\t\tdiv {\n\t\t\t\tbackground-size: 32px;\n\t\t\t\twidth: 32px;\n\t\t\t\theight: 32px;\n\t\t\t\tmargin-right: 16px;\n\t\t\t\tbackground-position: center;\n\t\t\t\tfloat: left;\n\t\t\t\tfilter: var(--background-invert-if-dark);\n\t\t\t}\n\t\t}\n\t}\n\n\t& > .panel--content {\n\t\tmargin: 0 16px 16px 16px;\n\t\theight: 424px;\n\t\t// We specifically do not want scrollbars inside widgets\n\t\toverflow: visible;\n\t}\n\n\t// No need to extend height of widgets if only one column is shown\n\t@media only screen and (max-width: 709px) {\n\t\t& > .panel--content {\n\t\t\theight: auto;\n\t\t}\n\t}\n}\n\n.footer {\n\tdisplay: flex;\n\tjustify-content: center;\n\ttransition: bottom var(--animation-slow) ease-in-out;\n\tbottom: 0;\n\tpadding: 44px 0;\n}\n\n.edit-panels {\n\tdisplay: inline-block;\n\tmargin:auto;\n\tbackground-position: 16px center;\n\tpadding: 12px 16px;\n\tpadding-left: 36px;\n\tborder-radius: var(--border-radius-pill);\n\tmax-width: 200px;\n\topacity: 1;\n\ttext-align: center;\n}\n\n.button,\n.button-vue\n.edit-panels,\n.statuses ::v-deep .action-item .action-item__menutoggle,\n.statuses ::v-deep .action-item.action-item--open .action-item__menutoggle {\n\tbackground-color: var(--color-background-translucent);\n\t-webkit-backdrop-filter: var(--background-blur);\n\tbackdrop-filter: var(--background-blur);\n\topacity: 1 !important;\n\n\t&:hover,\n\t&:focus,\n\t&:active {\n\t\tbackground-color: var(--color-background-hover)!important;\n\t}\n\t&:focus-visible {\n\t\tbox-shadow: 0 0 0 2px var(--color-main-text) !important;\n\t}\n}\n\n.modal__content {\n\tpadding: 32px 16px;\n\ttext-align: center;\n\n\tol {\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t\tjustify-content: center;\n\t\tlist-style-type: none;\n\t\tpadding-bottom: 16px;\n\t}\n\tli {\n\t\tlabel {\n\t\t\tposition: relative;\n\t\t\tdisplay: block;\n\t\t\tpadding: 48px 16px 14px 16px;\n\t\t\tmargin: 8px;\n\t\t\twidth: 140px;\n\t\t\tbackground-color: var(--color-background-hover);\n\t\t\tborder: 2px solid var(--color-main-background);\n\t\t\tborder-radius: var(--border-radius-large);\n\t\t\ttext-align: left;\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t\twhite-space: nowrap;\n\n\t\t\tdiv {\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 16px;\n\t\t\t\twidth: 24px;\n\t\t\t\theight: 24px;\n\t\t\t\tbackground-size: 24px;\n\t\t\t}\n\n\t\t\t&:hover {\n\t\t\t\tborder-color: var(--color-primary);\n\t\t\t}\n\t\t}\n\n\t\t// Do not invert status icons\n\t\t&:not(.panel-status) label div {\n\t\t\tfilter: var(--background-invert-if-dark);\n\t\t}\n\n\t\tinput[type='checkbox'].checkbox + label:before {\n\t\t\tposition: absolute;\n\t\t\tright: 12px;\n\t\t\ttop: 16px;\n\t\t}\n\n\t\tinput:focus + label {\n\t\t\tborder-color: var(--color-primary);\n\t\t}\n\t}\n\n\th3 {\n\t\tfont-weight: bold;\n\n\t\t&:not(:first-of-type) {\n\t\t\tmargin-top: 64px;\n\t\t}\n\t}\n\n\t// Adjust design of 'Get more widgets' button\n\t.button {\n\t\tdisplay: inline-block;\n\t\tpadding: 10px 16px;\n\t\tmargin: 0;\n\t}\n\n\tp {\n\t\tmax-width: 650px;\n\t\tmargin: 0 auto;\n\n\t\ta:hover,\n\t\ta:focus {\n\t\t\tborder-bottom: 2px solid var(--color-border);\n\t\t}\n\t}\n\n\t.credits--end {\n\t\tpadding-bottom: 32px;\n\t\tcolor: var(--color-text-maxcontrast);\n\n\t\ta {\n\t\t\tcolor: var(--color-text-maxcontrast);\n\t\t}\n\t}\n}\n\n.flip-list-move {\n\ttransition: transform var(--animation-slow);\n}\n\n.statuses {\n\tdisplay: flex;\n\tflex-direction: row;\n\tjustify-content: center;\n\tflex-wrap: wrap;\n\tmargin-bottom: 36px;\n\n\t& > div {\n\t\tmargin: 8px;\n\t}\n}\n</style>\n","import mod from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DashboardApp.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DashboardApp.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/sass-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DashboardApp.vue?vue&type=style&index=0&id=5d4b2fb6&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/sass-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DashboardApp.vue?vue&type=style&index=0&id=5d4b2fb6&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./DashboardApp.vue?vue&type=template&id=5d4b2fb6&scoped=true&\"\nimport script from \"./DashboardApp.vue?vue&type=script&lang=js&\"\nexport * from \"./DashboardApp.vue?vue&type=script&lang=js&\"\nimport style0 from \"./DashboardApp.vue?vue&type=style&index=0&id=5d4b2fb6&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5d4b2fb6\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{style:(_vm.backgroundStyle),attrs:{\"id\":\"app-dashboard\"}},[_c('h2',[_vm._v(_vm._s(_vm.greeting.text))]),_vm._v(\" \"),_c('ul',{staticClass:\"statuses\"},_vm._l((_vm.sortedRegisteredStatus),function(status){return _c('div',{key:status,attrs:{\"id\":'status-' + status}},[_c('div',{ref:'status-' + status,refInFor:true})])}),0),_vm._v(\" \"),_c('Draggable',_vm._b({staticClass:\"panels\",attrs:{\"handle\":\".panel--header\"},on:{\"end\":_vm.saveLayout},model:{value:(_vm.layout),callback:function ($$v) {_vm.layout=$$v},expression:\"layout\"}},'Draggable',{swapThreshold: 0.30, delay: 500, delayOnTouchOnly: true, touchStartThreshold: 3},false),_vm._l((_vm.layout),function(panelId){return _c('div',{key:_vm.panels[panelId].id,staticClass:\"panel\"},[_c('div',{staticClass:\"panel--header\"},[_c('h2',[_c('div',{class:_vm.panels[panelId].iconClass,attrs:{\"role\":\"img\"}}),_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.panels[panelId].title)+\"\\n\\t\\t\\t\\t\")])]),_vm._v(\" \"),_c('div',{staticClass:\"panel--content\",class:{ loading: !_vm.panels[panelId].mounted }},[_c('div',{ref:_vm.panels[panelId].id,refInFor:true,attrs:{\"data-id\":_vm.panels[panelId].id}})])])}),0),_vm._v(\" \"),_c('div',{staticClass:\"footer\"},[_c('Button',{on:{\"click\":_vm.showModal},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('Pencil',{attrs:{\"size\":20}})]},proxy:true}])},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('dashboard', 'Customize'))+\"\\n\\t\\t\")])],1),_vm._v(\" \"),(_vm.modal)?_c('Modal',{attrs:{\"size\":\"large\"},on:{\"close\":_vm.closeModal}},[_c('div',{staticClass:\"modal__content\"},[_c('h3',[_vm._v(_vm._s(_vm.t('dashboard', 'Edit widgets')))]),_vm._v(\" \"),_c('ol',{staticClass:\"panels\"},_vm._l((_vm.sortedAllStatuses),function(status){return _c('li',{key:status,class:'panel-' + status},[_c('input',{staticClass:\"checkbox\",attrs:{\"id\":'status-checkbox-' + status,\"type\":\"checkbox\"},domProps:{\"checked\":_vm.isStatusActive(status)},on:{\"input\":function($event){return _vm.updateStatusCheckbox(status, $event.target.checked)}}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":'status-checkbox-' + status}},[_c('div',{class:_vm.statusInfo[status].icon,attrs:{\"role\":\"img\"}}),_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(_vm.statusInfo[status].text)+\"\\n\\t\\t\\t\\t\\t\")])])}),0),_vm._v(\" \"),_c('Draggable',_vm._b({staticClass:\"panels\",attrs:{\"tag\":\"ol\",\"handle\":\".draggable\"},on:{\"end\":_vm.saveLayout},model:{value:(_vm.layout),callback:function ($$v) {_vm.layout=$$v},expression:\"layout\"}},'Draggable',{swapThreshold: 0.30, delay: 500, delayOnTouchOnly: true, touchStartThreshold: 3},false),_vm._l((_vm.sortedPanels),function(panel){return _c('li',{key:panel.id,class:'panel-' + panel.id},[_c('input',{staticClass:\"checkbox\",attrs:{\"id\":'panel-checkbox-' + panel.id,\"type\":\"checkbox\"},domProps:{\"checked\":_vm.isActive(panel)},on:{\"input\":function($event){return _vm.updateCheckbox(panel, $event.target.checked)}}}),_vm._v(\" \"),_c('label',{class:{ draggable: _vm.isActive(panel) },attrs:{\"for\":'panel-checkbox-' + panel.id}},[_c('div',{class:panel.iconClass,attrs:{\"role\":\"img\"}}),_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(panel.title)+\"\\n\\t\\t\\t\\t\\t\")])])}),0),_vm._v(\" \"),(_vm.isAdmin)?_c('a',{staticClass:\"button\",attrs:{\"href\":_vm.appStoreUrl}},[_vm._v(_vm._s(_vm.t('dashboard', 'Get more widgets from the App Store')))]):_vm._e(),_vm._v(\" \"),_c('h3',[_vm._v(_vm._s(_vm.t('dashboard', 'Change background image')))]),_vm._v(\" \"),_c('BackgroundSettings',{attrs:{\"background\":_vm.background,\"theming-default-background\":_vm.themingDefaultBackground},on:{\"update:background\":_vm.updateBackground}}),_vm._v(\" \"),_c('h3',[_vm._v(_vm._s(_vm.t('dashboard', 'Weather service')))]),_vm._v(\" \"),_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('dashboard', 'For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information.'))+\"\\n\\t\\t\\t\")]),_vm._v(\" \"),_c('p',{staticClass:\"credits--end\"},[_c('a',{attrs:{\"href\":\"https://api.met.no/doc/TermsOfService\",\"target\":\"_blank\",\"rel\":\"noopener\"}},[_vm._v(_vm._s(_vm.t('dashboard', 'Weather data from Met.no')))]),_vm._v(\",\\n\\t\\t\\t\\t\"),_c('a',{attrs:{\"href\":\"https://wiki.osmfoundation.org/wiki/Privacy_Policy\",\"target\":\"_blank\",\"rel\":\"noopener\"}},[_vm._v(_vm._s(_vm.t('dashboard', 'geocoding with Nominatim')))]),_vm._v(\",\\n\\t\\t\\t\\t\"),_c('a',{attrs:{\"href\":\"https://www.opentopodata.org/#public-api\",\"target\":\"_blank\",\"rel\":\"noopener\"}},[_vm._v(_vm._s(_vm.t('dashboard', 'elevation data from OpenTopoData')))]),_vm._v(\".\\n\\t\\t\\t\")])],1)]):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2016 Julius Härtl <jus@bitgrid.net>\n *\n * @author Julius Härtl <jus@bitgrid.net>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport Vue from 'vue'\nimport DashboardApp from './DashboardApp.vue'\nimport { translate as t } from '@nextcloud/l10n'\nimport VTooltip from '@nextcloud/vue/dist/Directives/Tooltip'\nimport { getRequestToken } from '@nextcloud/auth'\n\n// eslint-disable-next-line camelcase\n__webpack_nonce__ = btoa(getRequestToken())\n\nVue.directive('Tooltip', VTooltip)\n\nVue.prototype.t = t\n\n// FIXME workaround to make the sidebar work\nif (!window.OCA.Files) {\n\twindow.OCA.Files = {}\n}\n\nObject.assign(window.OCA.Files, { App: { fileList: { filesClient: OC.Files.getClient() } } }, window.OCA.Files)\n\nconst Dashboard = Vue.extend(DashboardApp)\nconst Instance = new Dashboard({}).$mount('#app-content-vue')\n\nwindow.OCA.Dashboard = {\n\tregister: (app, callback) => Instance.register(app, callback),\n\tregisterStatus: (app, callback) => Instance.registerStatus(app, callback),\n}\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"#app-dashboard[data-v-5d4b2fb6]{width:100%;min-height:100vh;background-size:cover;background-position:center center;background-repeat:no-repeat;background-attachment:fixed;background-color:var(--color-primary);--color-background-translucent: rgba(var(--color-main-background-rgb), 0.8);--background-blur: blur(10px)}#app-dashboard>h2[data-v-5d4b2fb6]{color:var(--color-primary-text);text-align:center;font-size:32px;line-height:130%;padding:10vh 16px 0px}.panels[data-v-5d4b2fb6]{width:auto;margin:auto;max-width:1500px;display:flex;justify-content:center;flex-direction:row;align-items:flex-start;flex-wrap:wrap}.panel[data-v-5d4b2fb6],.panels>div[data-v-5d4b2fb6]{width:320px;max-width:100%;margin:16px;background-color:var(--color-background-translucent);-webkit-backdrop-filter:var(--background-blur);backdrop-filter:var(--background-blur);border-radius:var(--border-radius-large)}#body-user.theme--highcontrast .panel[data-v-5d4b2fb6],#body-user.theme--highcontrast .panels>div[data-v-5d4b2fb6]{border:2px solid var(--color-border)}.panel.sortable-ghost[data-v-5d4b2fb6],.panels>div.sortable-ghost[data-v-5d4b2fb6]{opacity:.1}.panel>.panel--header[data-v-5d4b2fb6],.panels>div>.panel--header[data-v-5d4b2fb6]{display:flex;z-index:1;top:50px;padding:16px;cursor:grab}.panel>.panel--header[data-v-5d4b2fb6],.panel>.panel--header[data-v-5d4b2fb6] *,.panels>div>.panel--header[data-v-5d4b2fb6],.panels>div>.panel--header[data-v-5d4b2fb6] *{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.panel>.panel--header[data-v-5d4b2fb6]:active,.panels>div>.panel--header[data-v-5d4b2fb6]:active{cursor:grabbing}.panel>.panel--header a[data-v-5d4b2fb6],.panels>div>.panel--header a[data-v-5d4b2fb6]{flex-grow:1}.panel>.panel--header>h2[data-v-5d4b2fb6],.panels>div>.panel--header>h2[data-v-5d4b2fb6]{display:block;align-items:center;flex-grow:1;margin:0;font-size:20px;line-height:24px;font-weight:bold;padding:16px 8px;height:56px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:grab}.panel>.panel--header>h2 div[data-v-5d4b2fb6],.panels>div>.panel--header>h2 div[data-v-5d4b2fb6]{background-size:32px;width:32px;height:32px;margin-right:16px;background-position:center;float:left;filter:var(--background-invert-if-dark)}.panel>.panel--content[data-v-5d4b2fb6],.panels>div>.panel--content[data-v-5d4b2fb6]{margin:0 16px 16px 16px;height:424px;overflow:visible}@media only screen and (max-width: 709px){.panel>.panel--content[data-v-5d4b2fb6],.panels>div>.panel--content[data-v-5d4b2fb6]{height:auto}}.footer[data-v-5d4b2fb6]{display:flex;justify-content:center;transition:bottom var(--animation-slow) ease-in-out;bottom:0;padding:44px 0}.edit-panels[data-v-5d4b2fb6]{display:inline-block;margin:auto;background-position:16px center;padding:12px 16px;padding-left:36px;border-radius:var(--border-radius-pill);max-width:200px;opacity:1;text-align:center}.button[data-v-5d4b2fb6],.button-vue .edit-panels[data-v-5d4b2fb6],.statuses[data-v-5d4b2fb6] .action-item .action-item__menutoggle,.statuses[data-v-5d4b2fb6] .action-item.action-item--open .action-item__menutoggle{background-color:var(--color-background-translucent);-webkit-backdrop-filter:var(--background-blur);backdrop-filter:var(--background-blur);opacity:1 !important}.button[data-v-5d4b2fb6]:hover,.button[data-v-5d4b2fb6]:focus,.button[data-v-5d4b2fb6]:active,.button-vue .edit-panels[data-v-5d4b2fb6]:hover,.button-vue .edit-panels[data-v-5d4b2fb6]:focus,.button-vue .edit-panels[data-v-5d4b2fb6]:active,.statuses[data-v-5d4b2fb6] .action-item .action-item__menutoggle:hover,.statuses[data-v-5d4b2fb6] .action-item .action-item__menutoggle:focus,.statuses[data-v-5d4b2fb6] .action-item .action-item__menutoggle:active,.statuses[data-v-5d4b2fb6] .action-item.action-item--open .action-item__menutoggle:hover,.statuses[data-v-5d4b2fb6] .action-item.action-item--open .action-item__menutoggle:focus,.statuses[data-v-5d4b2fb6] .action-item.action-item--open .action-item__menutoggle:active{background-color:var(--color-background-hover) !important}.button[data-v-5d4b2fb6]:focus-visible,.button-vue .edit-panels[data-v-5d4b2fb6]:focus-visible,.statuses[data-v-5d4b2fb6] .action-item .action-item__menutoggle:focus-visible,.statuses[data-v-5d4b2fb6] .action-item.action-item--open .action-item__menutoggle:focus-visible{box-shadow:0 0 0 2px var(--color-main-text) !important}.modal__content[data-v-5d4b2fb6]{padding:32px 16px;text-align:center}.modal__content ol[data-v-5d4b2fb6]{display:flex;flex-direction:row;justify-content:center;list-style-type:none;padding-bottom:16px}.modal__content li label[data-v-5d4b2fb6]{position:relative;display:block;padding:48px 16px 14px 16px;margin:8px;width:140px;background-color:var(--color-background-hover);border:2px solid var(--color-main-background);border-radius:var(--border-radius-large);text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.modal__content li label div[data-v-5d4b2fb6]{position:absolute;top:16px;width:24px;height:24px;background-size:24px}.modal__content li label[data-v-5d4b2fb6]:hover{border-color:var(--color-primary)}.modal__content li:not(.panel-status) label div[data-v-5d4b2fb6]{filter:var(--background-invert-if-dark)}.modal__content li input[type=checkbox].checkbox+label[data-v-5d4b2fb6]:before{position:absolute;right:12px;top:16px}.modal__content li input:focus+label[data-v-5d4b2fb6]{border-color:var(--color-primary)}.modal__content h3[data-v-5d4b2fb6]{font-weight:bold}.modal__content h3[data-v-5d4b2fb6]:not(:first-of-type){margin-top:64px}.modal__content .button[data-v-5d4b2fb6]{display:inline-block;padding:10px 16px;margin:0}.modal__content p[data-v-5d4b2fb6]{max-width:650px;margin:0 auto}.modal__content p a[data-v-5d4b2fb6]:hover,.modal__content p a[data-v-5d4b2fb6]:focus{border-bottom:2px solid var(--color-border)}.modal__content .credits--end[data-v-5d4b2fb6]{padding-bottom:32px;color:var(--color-text-maxcontrast)}.modal__content .credits--end a[data-v-5d4b2fb6]{color:var(--color-text-maxcontrast)}.flip-list-move[data-v-5d4b2fb6]{transition:transform var(--animation-slow)}.statuses[data-v-5d4b2fb6]{display:flex;flex-direction:row;justify-content:center;flex-wrap:wrap;margin-bottom:36px}.statuses>div[data-v-5d4b2fb6]{margin:8px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/dashboard/src/DashboardApp.vue\"],\"names\":[],\"mappings\":\"AAoaA,gCACC,UAAA,CACA,gBAAA,CACA,qBAAA,CACA,iCAAA,CACA,2BAAA,CACA,2BAAA,CACA,qCAAA,CACA,2EAAA,CACA,6BAAA,CAEA,mCACC,+BAAA,CACA,iBAAA,CACA,cAAA,CACA,gBAAA,CACA,qBAAA,CAIF,yBACC,UAAA,CACA,WAAA,CACA,gBAAA,CACA,YAAA,CACA,sBAAA,CACA,kBAAA,CACA,sBAAA,CACA,cAAA,CAGD,qDACC,WAAA,CACA,cAAA,CACA,WAAA,CACA,oDAAA,CACA,8CAAA,CACA,sCAAA,CACA,wCAAA,CAEA,mHACC,oCAAA,CAGD,mFACE,UAAA,CAGF,mFACC,YAAA,CACA,SAAA,CACA,QAAA,CACA,YAAA,CACA,WAAA,CAEA,4KACC,0BAAA,CACA,wBAAA,CACA,uBAAA,CACA,qBAAA,CACA,oBAAA,CACA,gBAAA,CAGD,iGACC,eAAA,CAGD,uFACC,WAAA,CAGD,yFACC,aAAA,CACA,kBAAA,CACA,WAAA,CACA,QAAA,CACA,cAAA,CACA,gBAAA,CACA,gBAAA,CACA,gBAAA,CACA,WAAA,CACA,kBAAA,CACA,eAAA,CACA,sBAAA,CACA,WAAA,CACA,iGACC,oBAAA,CACA,UAAA,CACA,WAAA,CACA,iBAAA,CACA,0BAAA,CACA,UAAA,CACA,uCAAA,CAKH,qFACC,uBAAA,CACA,YAAA,CAEA,gBAAA,CAID,0CACC,qFACC,WAAA,CAAA,CAKH,yBACC,YAAA,CACA,sBAAA,CACA,mDAAA,CACA,QAAA,CACA,cAAA,CAGD,8BACC,oBAAA,CACA,WAAA,CACA,+BAAA,CACA,iBAAA,CACA,iBAAA,CACA,uCAAA,CACA,eAAA,CACA,SAAA,CACA,iBAAA,CAGD,yNAKC,oDAAA,CACA,8CAAA,CACA,sCAAA,CACA,oBAAA,CAEA,utBAGC,yDAAA,CAED,iRACC,sDAAA,CAIF,iCACC,iBAAA,CACA,iBAAA,CAEA,oCACC,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,oBAAA,CACA,mBAAA,CAGA,0CACC,iBAAA,CACA,aAAA,CACA,2BAAA,CACA,UAAA,CACA,WAAA,CACA,8CAAA,CACA,6CAAA,CACA,wCAAA,CACA,eAAA,CACA,eAAA,CACA,sBAAA,CACA,kBAAA,CAEA,8CACC,iBAAA,CACA,QAAA,CACA,UAAA,CACA,WAAA,CACA,oBAAA,CAGD,gDACC,iCAAA,CAKF,iEACC,uCAAA,CAGD,+EACC,iBAAA,CACA,UAAA,CACA,QAAA,CAGD,sDACC,iCAAA,CAIF,oCACC,gBAAA,CAEA,wDACC,eAAA,CAKF,yCACC,oBAAA,CACA,iBAAA,CACA,QAAA,CAGD,mCACC,eAAA,CACA,aAAA,CAEA,sFAEC,2CAAA,CAIF,+CACC,mBAAA,CACA,mCAAA,CAEA,iDACC,mCAAA,CAKH,iCACC,0CAAA,CAGD,2BACC,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,cAAA,CACA,kBAAA,CAEA,+BACC,UAAA\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n#app-dashboard {\\n\\twidth: 100%;\\n\\tmin-height: 100vh;\\n\\tbackground-size: cover;\\n\\tbackground-position: center center;\\n\\tbackground-repeat: no-repeat;\\n\\tbackground-attachment: fixed;\\n\\tbackground-color: var(--color-primary);\\n\\t--color-background-translucent: rgba(var(--color-main-background-rgb), 0.8);\\n\\t--background-blur: blur(10px);\\n\\n\\t> h2 {\\n\\t\\tcolor: var(--color-primary-text);\\n\\t\\ttext-align: center;\\n\\t\\tfont-size: 32px;\\n\\t\\tline-height: 130%;\\n\\t\\tpadding: 10vh 16px 0px;\\n\\t}\\n}\\n\\n.panels {\\n\\twidth: auto;\\n\\tmargin: auto;\\n\\tmax-width: 1500px;\\n\\tdisplay: flex;\\n\\tjustify-content: center;\\n\\tflex-direction: row;\\n\\talign-items: flex-start;\\n\\tflex-wrap: wrap;\\n}\\n\\n.panel, .panels > div {\\n\\twidth: 320px;\\n\\tmax-width: 100%;\\n\\tmargin: 16px;\\n\\tbackground-color: var(--color-background-translucent);\\n\\t-webkit-backdrop-filter: var(--background-blur);\\n\\tbackdrop-filter: var(--background-blur);\\n\\tborder-radius: var(--border-radius-large);\\n\\n\\t#body-user.theme--highcontrast & {\\n\\t\\tborder: 2px solid var(--color-border);\\n\\t}\\n\\n\\t&.sortable-ghost {\\n\\t\\t opacity: 0.1;\\n\\t}\\n\\n\\t& > .panel--header {\\n\\t\\tdisplay: flex;\\n\\t\\tz-index: 1;\\n\\t\\ttop: 50px;\\n\\t\\tpadding: 16px;\\n\\t\\tcursor: grab;\\n\\n\\t\\t&, ::v-deep * {\\n\\t\\t\\t-webkit-touch-callout: none;\\n\\t\\t\\t-webkit-user-select: none;\\n\\t\\t\\t-khtml-user-select: none;\\n\\t\\t\\t-moz-user-select: none;\\n\\t\\t\\t-ms-user-select: none;\\n\\t\\t\\tuser-select: none;\\n\\t\\t}\\n\\n\\t\\t&:active {\\n\\t\\t\\tcursor: grabbing;\\n\\t\\t}\\n\\n\\t\\ta {\\n\\t\\t\\tflex-grow: 1;\\n\\t\\t}\\n\\n\\t\\t> h2 {\\n\\t\\t\\tdisplay: block;\\n\\t\\t\\talign-items: center;\\n\\t\\t\\tflex-grow: 1;\\n\\t\\t\\tmargin: 0;\\n\\t\\t\\tfont-size: 20px;\\n\\t\\t\\tline-height: 24px;\\n\\t\\t\\tfont-weight: bold;\\n\\t\\t\\tpadding: 16px 8px;\\n\\t\\t\\theight: 56px;\\n\\t\\t\\twhite-space: nowrap;\\n\\t\\t\\toverflow: hidden;\\n\\t\\t\\ttext-overflow: ellipsis;\\n\\t\\t\\tcursor: grab;\\n\\t\\t\\tdiv {\\n\\t\\t\\t\\tbackground-size: 32px;\\n\\t\\t\\t\\twidth: 32px;\\n\\t\\t\\t\\theight: 32px;\\n\\t\\t\\t\\tmargin-right: 16px;\\n\\t\\t\\t\\tbackground-position: center;\\n\\t\\t\\t\\tfloat: left;\\n\\t\\t\\t\\tfilter: var(--background-invert-if-dark);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t& > .panel--content {\\n\\t\\tmargin: 0 16px 16px 16px;\\n\\t\\theight: 424px;\\n\\t\\t// We specifically do not want scrollbars inside widgets\\n\\t\\toverflow: visible;\\n\\t}\\n\\n\\t// No need to extend height of widgets if only one column is shown\\n\\t@media only screen and (max-width: 709px) {\\n\\t\\t& > .panel--content {\\n\\t\\t\\theight: auto;\\n\\t\\t}\\n\\t}\\n}\\n\\n.footer {\\n\\tdisplay: flex;\\n\\tjustify-content: center;\\n\\ttransition: bottom var(--animation-slow) ease-in-out;\\n\\tbottom: 0;\\n\\tpadding: 44px 0;\\n}\\n\\n.edit-panels {\\n\\tdisplay: inline-block;\\n\\tmargin:auto;\\n\\tbackground-position: 16px center;\\n\\tpadding: 12px 16px;\\n\\tpadding-left: 36px;\\n\\tborder-radius: var(--border-radius-pill);\\n\\tmax-width: 200px;\\n\\topacity: 1;\\n\\ttext-align: center;\\n}\\n\\n.button,\\n.button-vue\\n.edit-panels,\\n.statuses ::v-deep .action-item .action-item__menutoggle,\\n.statuses ::v-deep .action-item.action-item--open .action-item__menutoggle {\\n\\tbackground-color: var(--color-background-translucent);\\n\\t-webkit-backdrop-filter: var(--background-blur);\\n\\tbackdrop-filter: var(--background-blur);\\n\\topacity: 1 !important;\\n\\n\\t&:hover,\\n\\t&:focus,\\n\\t&:active {\\n\\t\\tbackground-color: var(--color-background-hover)!important;\\n\\t}\\n\\t&:focus-visible {\\n\\t\\tbox-shadow: 0 0 0 2px var(--color-main-text) !important;\\n\\t}\\n}\\n\\n.modal__content {\\n\\tpadding: 32px 16px;\\n\\ttext-align: center;\\n\\n\\tol {\\n\\t\\tdisplay: flex;\\n\\t\\tflex-direction: row;\\n\\t\\tjustify-content: center;\\n\\t\\tlist-style-type: none;\\n\\t\\tpadding-bottom: 16px;\\n\\t}\\n\\tli {\\n\\t\\tlabel {\\n\\t\\t\\tposition: relative;\\n\\t\\t\\tdisplay: block;\\n\\t\\t\\tpadding: 48px 16px 14px 16px;\\n\\t\\t\\tmargin: 8px;\\n\\t\\t\\twidth: 140px;\\n\\t\\t\\tbackground-color: var(--color-background-hover);\\n\\t\\t\\tborder: 2px solid var(--color-main-background);\\n\\t\\t\\tborder-radius: var(--border-radius-large);\\n\\t\\t\\ttext-align: left;\\n\\t\\t\\toverflow: hidden;\\n\\t\\t\\ttext-overflow: ellipsis;\\n\\t\\t\\twhite-space: nowrap;\\n\\n\\t\\t\\tdiv {\\n\\t\\t\\t\\tposition: absolute;\\n\\t\\t\\t\\ttop: 16px;\\n\\t\\t\\t\\twidth: 24px;\\n\\t\\t\\t\\theight: 24px;\\n\\t\\t\\t\\tbackground-size: 24px;\\n\\t\\t\\t}\\n\\n\\t\\t\\t&:hover {\\n\\t\\t\\t\\tborder-color: var(--color-primary);\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Do not invert status icons\\n\\t\\t&:not(.panel-status) label div {\\n\\t\\t\\tfilter: var(--background-invert-if-dark);\\n\\t\\t}\\n\\n\\t\\tinput[type='checkbox'].checkbox + label:before {\\n\\t\\t\\tposition: absolute;\\n\\t\\t\\tright: 12px;\\n\\t\\t\\ttop: 16px;\\n\\t\\t}\\n\\n\\t\\tinput:focus + label {\\n\\t\\t\\tborder-color: var(--color-primary);\\n\\t\\t}\\n\\t}\\n\\n\\th3 {\\n\\t\\tfont-weight: bold;\\n\\n\\t\\t&:not(:first-of-type) {\\n\\t\\t\\tmargin-top: 64px;\\n\\t\\t}\\n\\t}\\n\\n\\t// Adjust design of 'Get more widgets' button\\n\\t.button {\\n\\t\\tdisplay: inline-block;\\n\\t\\tpadding: 10px 16px;\\n\\t\\tmargin: 0;\\n\\t}\\n\\n\\tp {\\n\\t\\tmax-width: 650px;\\n\\t\\tmargin: 0 auto;\\n\\n\\t\\ta:hover,\\n\\t\\ta:focus {\\n\\t\\t\\tborder-bottom: 2px solid var(--color-border);\\n\\t\\t}\\n\\t}\\n\\n\\t.credits--end {\\n\\t\\tpadding-bottom: 32px;\\n\\t\\tcolor: var(--color-text-maxcontrast);\\n\\n\\t\\ta {\\n\\t\\t\\tcolor: var(--color-text-maxcontrast);\\n\\t\\t}\\n\\t}\\n}\\n\\n.flip-list-move {\\n\\ttransition: transform var(--animation-slow);\\n}\\n\\n.statuses {\\n\\tdisplay: flex;\\n\\tflex-direction: row;\\n\\tjustify-content: center;\\n\\tflex-wrap: wrap;\\n\\tmargin-bottom: 36px;\\n\\n\\t& > div {\\n\\t\\tmargin: 8px;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".background-selector[data-v-16994ae8]{display:flex;flex-wrap:wrap;justify-content:center}.background-selector .background[data-v-16994ae8]{width:176px;height:96px;margin:8px;background-size:cover;background-position:center center;text-align:center;border-radius:var(--border-radius-large);border:2px solid var(--color-main-background);overflow:hidden}.background-selector .background.current[data-v-16994ae8]{background-image:var(--color-background-dark)}.background-selector .background.filepicker[data-v-16994ae8],.background-selector .background.default[data-v-16994ae8],.background-selector .background.color[data-v-16994ae8]{border-color:var(--color-border)}.background-selector .background.color[data-v-16994ae8]{background-color:var(--color-primary);color:var(--color-primary-text)}.background-selector .background.active[data-v-16994ae8],.background-selector .background[data-v-16994ae8]:hover,.background-selector .background[data-v-16994ae8]:focus{border:2px solid var(--color-primary)}.background-selector .background.active[data-v-16994ae8]:not(.icon-loading):after{background-image:var(--icon-checkmark-white);background-repeat:no-repeat;background-position:center;background-size:44px;content:\\\"\\\";display:block;height:100%}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/dashboard/src/components/BackgroundSettings.vue\"],\"names\":[],\"mappings\":\"AA4IA,sCACC,YAAA,CACA,cAAA,CACA,sBAAA,CAEA,kDACC,WAAA,CACA,WAAA,CACA,UAAA,CACA,qBAAA,CACA,iCAAA,CACA,iBAAA,CACA,wCAAA,CACA,6CAAA,CACA,eAAA,CAEA,0DACC,6CAAA,CAGD,+KACC,gCAAA,CAGD,wDACC,qCAAA,CACA,+BAAA,CAGD,yKAGC,qCAAA,CAGD,kFACC,4CAAA,CACA,2BAAA,CACA,0BAAA,CACA,oBAAA,CACA,UAAA,CACA,aAAA,CACA,WAAA\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n.background-selector {\\n\\tdisplay: flex;\\n\\tflex-wrap: wrap;\\n\\tjustify-content: center;\\n\\n\\t.background {\\n\\t\\twidth: 176px;\\n\\t\\theight: 96px;\\n\\t\\tmargin: 8px;\\n\\t\\tbackground-size: cover;\\n\\t\\tbackground-position: center center;\\n\\t\\ttext-align: center;\\n\\t\\tborder-radius: var(--border-radius-large);\\n\\t\\tborder: 2px solid var(--color-main-background);\\n\\t\\toverflow: hidden;\\n\\n\\t\\t&.current {\\n\\t\\t\\tbackground-image: var(--color-background-dark);\\n\\t\\t}\\n\\n\\t\\t&.filepicker, &.default, &.color {\\n\\t\\t\\tborder-color: var(--color-border);\\n\\t\\t}\\n\\n\\t\\t&.color {\\n\\t\\t\\tbackground-color: var(--color-primary);\\n\\t\\t\\tcolor: var(--color-primary-text);\\n\\t\\t}\\n\\n\\t\\t&.active,\\n\\t\\t&:hover,\\n\\t\\t&:focus {\\n\\t\\t\\tborder: 2px solid var(--color-primary);\\n\\t\\t}\\n\\n\\t\\t&.active:not(.icon-loading):after {\\n\\t\\t\\tbackground-image: var(--icon-checkmark-white);\\n\\t\\t\\tbackground-repeat: no-repeat;\\n\\t\\t\\tbackground-position: center;\\n\\t\\t\\tbackground-size: 44px;\\n\\t\\t\\tcontent: '';\\n\\t\\t\\tdisplay: block;\\n\\t\\t\\theight: 100%;\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","__webpack_require__.amdD = function () {\n\tthrow new Error('define cannot be used indirect');\n};","__webpack_require__.amdO = {};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 4773;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t4773: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [7874], function() { return __webpack_require__(31136); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","data","isMobile","this","_isMobile","beforeMount","window","addEventListener","_onResize","beforeDestroy","removeEventListener","methods","document","documentElement","clientWidth","url","generateFilePath","background","time","themingDefaultBackground","enabledThemes","OCA","Theming","isDarkTheme","length","matchMedia","matches","join","indexOf","generateUrl","cacheBuster","prefixWithBaseUrl","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","_vm","_h","$createElement","_c","_self","staticClass","class","active","attrs","on","pickFile","_v","_s","t","loading","setDefault","pickColor","_l","shippedBackground","directives","name","rawName","value","details","expression","key","style","preview","$event","setShipped","greeting","text","status","ref","refInFor","_b","saveLayout","model","callback","$$v","layout","swapThreshold","delay","delayOnTouchOnly","touchStartThreshold","panelId","panels","id","iconClass","title","mounted","showModal","scopedSlots","_u","fn","proxy","closeModal","domProps","isStatusActive","updateStatusCheckbox","target","checked","statusInfo","icon","panel","isActive","updateCheckbox","draggable","appStoreUrl","_e","updateBackground","__webpack_nonce__","btoa","getRequestToken","Vue","VTooltip","Files","Object","assign","App","fileList","filesClient","OC","getClient","Instance","DashboardApp","$mount","Dashboard","register","app","registerStatus","___CSS_LOADER_EXPORT___","push","module","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","loaded","__webpack_modules__","call","m","amdD","Error","amdO","O","result","chunkIds","priority","notFulfilled","Infinity","i","fulfilled","j","keys","every","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","g","globalThis","Function","e","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","nmd","paths","children","b","baseURI","self","location","href","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","forEach","bind","nc","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file +{"version":3,"file":"dashboard-main.js?v=2deb8af26f6266f4cb2d","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/apps/dashboard/src/mixins/isMobile.js","webpack:///nextcloud/apps/dashboard/src/helpers/prefixWithBaseUrl.js","webpack:///nextcloud/apps/dashboard/src/helpers/getBackgroundUrl.js","webpack:///nextcloud/apps/dashboard/src/components/BackgroundSettings.vue","webpack:///nextcloud/apps/dashboard/src/components/BackgroundSettings.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/dashboard/src/components/BackgroundSettings.vue?fc0a","webpack://nextcloud/./apps/dashboard/src/components/BackgroundSettings.vue?20a7","webpack:///nextcloud/apps/dashboard/src/components/BackgroundSettings.vue?vue&type=template&id=77b70ba2&scoped=true&","webpack:///nextcloud/apps/dashboard/src/DashboardApp.vue","webpack:///nextcloud/apps/dashboard/src/DashboardApp.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/dashboard/src/DashboardApp.vue?4c5f","webpack://nextcloud/./apps/dashboard/src/DashboardApp.vue?5685","webpack:///nextcloud/apps/dashboard/src/DashboardApp.vue?vue&type=template&id=5d4b2fb6&scoped=true&","webpack:///nextcloud/apps/dashboard/src/main.js","webpack:///nextcloud/apps/dashboard/src/DashboardApp.vue?vue&type=style&index=0&id=5d4b2fb6&lang=scss&scoped=true&","webpack:///nextcloud/apps/dashboard/src/components/BackgroundSettings.vue?vue&type=style&index=0&id=77b70ba2&scoped=true&lang=scss&","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/amd define","webpack:///nextcloud/webpack/runtime/amd options","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/global","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","/**\n * @copyright Copyright (c) 2020 Julius Härtl <jus@bitgrid.net>\n *\n * @author Julius Härtl <jus@bitgrid.net>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nexport default {\n\tdata() {\n\t\treturn {\n\t\t\tisMobile: this._isMobile(),\n\t\t}\n\t},\n\tbeforeMount() {\n\t\twindow.addEventListener('resize', this._onResize)\n\t},\n\tbeforeDestroy() {\n\t\twindow.removeEventListener('resize', this._onResize)\n\t},\n\tmethods: {\n\t\t_onResize() {\n\t\t\t// Update mobile mode\n\t\t\tthis.isMobile = this._isMobile()\n\t\t},\n\t\t_isMobile() {\n\t\t\t// check if content width is under 768px\n\t\t\treturn document.documentElement.clientWidth < 768\n\t\t},\n\t},\n}\n","/**\n * @copyright Copyright (c) 2020 Julius Härtl <jus@bitgrid.net>\n *\n * @author Julius Härtl <jus@bitgrid.net>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { generateFilePath } from '@nextcloud/router'\n\nexport default (url) => generateFilePath('dashboard', '', 'img/') + url\n","/**\n * @copyright Copyright (c) 2020 Julius Härtl <jus@bitgrid.net>\n *\n * @author Avior <florian.bouillon@delta-wings.net>\n * @author Julien Veyssier <eneiluj@posteo.net>\n * @author Julius Härtl <jus@bitgrid.net>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { generateUrl } from '@nextcloud/router'\nimport prefixWithBaseUrl from './prefixWithBaseUrl'\n\nexport default (background, time = 0, themingDefaultBackground = '') => {\n\tconst enabledThemes = window.OCA?.Theming?.enabledThemes || []\n\tconst isDarkTheme = (enabledThemes.length === 0 || enabledThemes[0] === 'default')\n\t\t? window.matchMedia('(prefers-color-scheme: dark)').matches\n\t\t: enabledThemes.join('').indexOf('dark') !== -1\n\n\tif (background === 'default') {\n\t\tif (themingDefaultBackground && themingDefaultBackground !== 'backgroundColor') {\n\t\t\treturn generateUrl('/apps/theming/image/background') + '?v=' + window.OCA.Theming.cacheBuster\n\t\t}\n\n\t\tif (isDarkTheme) {\n\t\t\treturn prefixWithBaseUrl('eduardo-neves-pedra-azul.jpg')\n\t\t}\n\n\t\treturn prefixWithBaseUrl('kamil-porembinski-clouds.jpg')\n\t} else if (background === 'custom') {\n\t\treturn generateUrl('/apps/dashboard/background') + '?v=' + time\n\t}\n\n\treturn prefixWithBaseUrl(background)\n}\n","<!--\n - @copyright Copyright (c) 2020 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<div class=\"background-selector\">\n\t\t<button class=\"background filepicker\"\n\t\t\t:class=\"{ active: background === 'custom' }\"\n\t\t\ttabindex=\"0\"\n\t\t\t@click=\"pickFile\">\n\t\t\t{{ t('dashboard', 'Pick from Files') }}\n\t\t</button>\n\t\t<button class=\"background default\"\n\t\t\ttabindex=\"0\"\n\t\t\t:class=\"{ 'icon-loading': loading === 'default', active: background === 'default' }\"\n\t\t\t@click=\"setDefault\">\n\t\t\t{{ t('dashboard', 'Default image') }}\n\t\t</button>\n\t\t<button class=\"background color\"\n\t\t\t:class=\"{ active: background === 'custom' }\"\n\t\t\ttabindex=\"0\"\n\t\t\t@click=\"pickColor\">\n\t\t\t{{ t('dashboard', 'Plain background') }}\n\t\t</button>\n\t\t<button v-for=\"shippedBackground in shippedBackgrounds\"\n\t\t\t:key=\"shippedBackground.name\"\n\t\t\tv-tooltip=\"shippedBackground.details.attribution\"\n\t\t\t:class=\"{ 'icon-loading': loading === shippedBackground.name, active: background === shippedBackground.name }\"\n\t\t\ttabindex=\"0\"\n\t\t\tclass=\"background\"\n\t\t\t:style=\"{ 'background-image': 'url(' + shippedBackground.preview + ')' }\"\n\t\t\t@click=\"setShipped(shippedBackground.name)\" />\n\t</div>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport { generateUrl } from '@nextcloud/router'\nimport { loadState } from '@nextcloud/initial-state'\nimport getBackgroundUrl from './../helpers/getBackgroundUrl'\nimport prefixWithBaseUrl from './../helpers/prefixWithBaseUrl'\nconst shippedBackgroundList = loadState('dashboard', 'shippedBackgrounds')\n\nexport default {\n\tname: 'BackgroundSettings',\n\tprops: {\n\t\tbackground: {\n\t\t\ttype: String,\n\t\t\tdefault: 'default',\n\t\t},\n\t\tthemingDefaultBackground: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tbackgroundImage: generateUrl('/apps/dashboard/background') + '?v=' + Date.now(),\n\t\t\tloading: false,\n\t\t}\n\t},\n\tcomputed: {\n\t\tshippedBackgrounds() {\n\t\t\treturn Object.keys(shippedBackgroundList).map((item) => {\n\t\t\t\treturn {\n\t\t\t\t\tname: item,\n\t\t\t\t\turl: prefixWithBaseUrl(item),\n\t\t\t\t\tpreview: prefixWithBaseUrl('previews/' + item),\n\t\t\t\t\tdetails: shippedBackgroundList[item],\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t},\n\tmethods: {\n\t\tasync update(data) {\n\t\t\tconst background = data.type === 'custom' || data.type === 'default' ? data.type : data.value\n\t\t\tthis.backgroundImage = getBackgroundUrl(background, data.version, this.themingDefaultBackground)\n\t\t\tif (data.type === 'color' || (data.type === 'default' && this.themingDefaultBackground === 'backgroundColor')) {\n\t\t\t\tthis.$emit('update:background', data)\n\t\t\t\tthis.loading = false\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst image = new Image()\n\t\t\timage.onload = () => {\n\t\t\t\tthis.$emit('update:background', data)\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t\timage.src = this.backgroundImage\n\t\t},\n\t\tasync setDefault() {\n\t\t\tthis.loading = 'default'\n\t\t\tconst result = await axios.post(generateUrl('/apps/dashboard/background/default'))\n\t\t\tthis.update(result.data)\n\t\t},\n\t\tasync setShipped(shipped) {\n\t\t\tthis.loading = shipped\n\t\t\tconst result = await axios.post(generateUrl('/apps/dashboard/background/shipped'), { value: shipped })\n\t\t\tthis.update(result.data)\n\t\t},\n\t\tasync setFile(path) {\n\t\t\tthis.loading = 'custom'\n\t\t\tconst result = await axios.post(generateUrl('/apps/dashboard/background/custom'), { value: path })\n\t\t\tthis.update(result.data)\n\t\t},\n\t\tasync pickColor() {\n\t\t\tthis.loading = 'color'\n\t\t\tconst color = OCA && OCA.Theming ? OCA.Theming.color : '#0082c9'\n\t\t\tconst result = await axios.post(generateUrl('/apps/dashboard/background/color'), { value: color })\n\t\t\tthis.update(result.data)\n\t\t},\n\t\tpickFile() {\n\t\t\twindow.OC.dialogs.filepicker(t('dashboard', 'Insert from {productName}', { productName: OC.theme.name }), (path, type) => {\n\t\t\t\tif (type === OC.dialogs.FILEPICKER_TYPE_CHOOSE) {\n\t\t\t\t\tthis.setFile(path)\n\t\t\t\t}\n\t\t\t}, false, ['image/png', 'image/gif', 'image/jpeg', 'image/svg'], true, OC.dialogs.FILEPICKER_TYPE_CHOOSE)\n\t\t},\n\t},\n}\n</script>\n\n<style scoped lang=\"scss\">\n.background-selector {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tjustify-content: center;\n\n\t.background {\n\t\twidth: 176px;\n\t\theight: 96px;\n\t\tmargin: 8px;\n\t\tbackground-size: cover;\n\t\tbackground-position: center center;\n\t\ttext-align: center;\n\t\tborder-radius: var(--border-radius-large);\n\t\tborder: 2px solid var(--color-main-background);\n\t\toverflow: hidden;\n\n\t\t&.current {\n\t\t\tbackground-image: var(--color-background-dark);\n\t\t}\n\n\t\t&.filepicker, &.default, &.color {\n\t\t\tborder-color: var(--color-border);\n\t\t}\n\n\t\t&.color {\n\t\t\tbackground-color: var(--color-primary);\n\t\t\tcolor: var(--color-primary-text);\n\t\t}\n\n\t\t&.active,\n\t\t&:hover,\n\t\t&:focus {\n\t\t\tborder: 2px solid var(--color-primary);\n\t\t}\n\n\t\t&.active:not(.icon-loading):after {\n\t\t\tbackground-image: var(--icon-checkmark-white);\n\t\t\tbackground-repeat: no-repeat;\n\t\t\tbackground-position: center;\n\t\t\tbackground-size: 44px;\n\t\t\tcontent: '';\n\t\t\tdisplay: block;\n\t\t\theight: 100%;\n\t\t}\n\t}\n}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BackgroundSettings.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BackgroundSettings.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BackgroundSettings.vue?vue&type=style&index=0&id=77b70ba2&scoped=true&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BackgroundSettings.vue?vue&type=style&index=0&id=77b70ba2&scoped=true&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./BackgroundSettings.vue?vue&type=template&id=77b70ba2&scoped=true&\"\nimport script from \"./BackgroundSettings.vue?vue&type=script&lang=js&\"\nexport * from \"./BackgroundSettings.vue?vue&type=script&lang=js&\"\nimport style0 from \"./BackgroundSettings.vue?vue&type=style&index=0&id=77b70ba2&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"77b70ba2\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"background-selector\"},[_c('button',{staticClass:\"background filepicker\",class:{ active: _vm.background === 'custom' },attrs:{\"tabindex\":\"0\"},on:{\"click\":_vm.pickFile}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('dashboard', 'Pick from Files'))+\"\\n\\t\")]),_vm._v(\" \"),_c('button',{staticClass:\"background default\",class:{ 'icon-loading': _vm.loading === 'default', active: _vm.background === 'default' },attrs:{\"tabindex\":\"0\"},on:{\"click\":_vm.setDefault}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('dashboard', 'Default image'))+\"\\n\\t\")]),_vm._v(\" \"),_c('button',{staticClass:\"background color\",class:{ active: _vm.background === 'custom' },attrs:{\"tabindex\":\"0\"},on:{\"click\":_vm.pickColor}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('dashboard', 'Plain background'))+\"\\n\\t\")]),_vm._v(\" \"),_vm._l((_vm.shippedBackgrounds),function(shippedBackground){return _c('button',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(shippedBackground.details.attribution),expression:\"shippedBackground.details.attribution\"}],key:shippedBackground.name,staticClass:\"background\",class:{ 'icon-loading': _vm.loading === shippedBackground.name, active: _vm.background === shippedBackground.name },style:({ 'background-image': 'url(' + shippedBackground.preview + ')' }),attrs:{\"tabindex\":\"0\"},on:{\"click\":function($event){return _vm.setShipped(shippedBackground.name)}}})})],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n\t<div id=\"app-dashboard\" :style=\"backgroundStyle\">\n\t\t<h2>{{ greeting.text }}</h2>\n\t\t<ul class=\"statuses\">\n\t\t\t<div v-for=\"status in sortedRegisteredStatus\"\n\t\t\t\t:id=\"'status-' + status\"\n\t\t\t\t:key=\"status\">\n\t\t\t\t<div :ref=\"'status-' + status\" />\n\t\t\t</div>\n\t\t</ul>\n\n\t\t<Draggable v-model=\"layout\"\n\t\t\tclass=\"panels\"\n\t\t\tv-bind=\"{swapThreshold: 0.30, delay: 500, delayOnTouchOnly: true, touchStartThreshold: 3}\"\n\t\t\thandle=\".panel--header\"\n\t\t\t@end=\"saveLayout\">\n\t\t\t<div v-for=\"panelId in layout\" :key=\"panels[panelId].id\" class=\"panel\">\n\t\t\t\t<div class=\"panel--header\">\n\t\t\t\t\t<h2>\n\t\t\t\t\t\t<div :class=\"panels[panelId].iconClass\" role=\"img\" />\n\t\t\t\t\t\t{{ panels[panelId].title }}\n\t\t\t\t\t</h2>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"panel--content\" :class=\"{ loading: !panels[panelId].mounted }\">\n\t\t\t\t\t<div :ref=\"panels[panelId].id\" :data-id=\"panels[panelId].id\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</Draggable>\n\n\t\t<div class=\"footer\">\n\t\t\t<Button @click=\"showModal\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Pencil :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('dashboard', 'Customize') }}\n\t\t\t</Button>\n\t\t</div>\n\n\t\t<Modal v-if=\"modal\" size=\"large\" @close=\"closeModal\">\n\t\t\t<div class=\"modal__content\">\n\t\t\t\t<h3>{{ t('dashboard', 'Edit widgets') }}</h3>\n\t\t\t\t<ol class=\"panels\">\n\t\t\t\t\t<li v-for=\"status in sortedAllStatuses\" :key=\"status\" :class=\"'panel-' + status\">\n\t\t\t\t\t\t<input :id=\"'status-checkbox-' + status\"\n\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\tclass=\"checkbox\"\n\t\t\t\t\t\t\t:checked=\"isStatusActive(status)\"\n\t\t\t\t\t\t\t@input=\"updateStatusCheckbox(status, $event.target.checked)\">\n\t\t\t\t\t\t<label :for=\"'status-checkbox-' + status\">\n\t\t\t\t\t\t\t<div :class=\"statusInfo[status].icon\" role=\"img\" />\n\t\t\t\t\t\t\t{{ statusInfo[status].text }}\n\t\t\t\t\t\t</label>\n\t\t\t\t\t</li>\n\t\t\t\t</ol>\n\t\t\t\t<Draggable v-model=\"layout\"\n\t\t\t\t\tclass=\"panels\"\n\t\t\t\t\ttag=\"ol\"\n\t\t\t\t\tv-bind=\"{swapThreshold: 0.30, delay: 500, delayOnTouchOnly: true, touchStartThreshold: 3}\"\n\t\t\t\t\thandle=\".draggable\"\n\t\t\t\t\t@end=\"saveLayout\">\n\t\t\t\t\t<li v-for=\"panel in sortedPanels\" :key=\"panel.id\" :class=\"'panel-' + panel.id\">\n\t\t\t\t\t\t<input :id=\"'panel-checkbox-' + panel.id\"\n\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\tclass=\"checkbox\"\n\t\t\t\t\t\t\t:checked=\"isActive(panel)\"\n\t\t\t\t\t\t\t@input=\"updateCheckbox(panel, $event.target.checked)\">\n\t\t\t\t\t\t<label :for=\"'panel-checkbox-' + panel.id\" :class=\"{ draggable: isActive(panel) }\">\n\t\t\t\t\t\t\t<div :class=\"panel.iconClass\" role=\"img\" />\n\t\t\t\t\t\t\t{{ panel.title }}\n\t\t\t\t\t\t</label>\n\t\t\t\t\t</li>\n\t\t\t\t</Draggable>\n\n\t\t\t\t<a v-if=\"isAdmin\" :href=\"appStoreUrl\" class=\"button\">{{ t('dashboard', 'Get more widgets from the App Store') }}</a>\n\n\t\t\t\t<h3>{{ t('dashboard', 'Change background image') }}</h3>\n\t\t\t\t<BackgroundSettings :background=\"background\"\n\t\t\t\t\t:theming-default-background=\"themingDefaultBackground\"\n\t\t\t\t\t@update:background=\"updateBackground\" />\n\n\t\t\t\t<h3>{{ t('dashboard', 'Weather service') }}</h3>\n\t\t\t\t<p>\n\t\t\t\t\t{{ t('dashboard', 'For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information.') }}\n\t\t\t\t</p>\n\t\t\t\t<p class=\"credits--end\">\n\t\t\t\t\t<a href=\"https://api.met.no/doc/TermsOfService\" target=\"_blank\" rel=\"noopener\">{{ t('dashboard', 'Weather data from Met.no') }}</a>,\n\t\t\t\t\t<a href=\"https://wiki.osmfoundation.org/wiki/Privacy_Policy\" target=\"_blank\" rel=\"noopener\">{{ t('dashboard', 'geocoding with Nominatim') }}</a>,\n\t\t\t\t\t<a href=\"https://www.opentopodata.org/#public-api\" target=\"_blank\" rel=\"noopener\">{{ t('dashboard', 'elevation data from OpenTopoData') }}</a>.\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t</Modal>\n\t</div>\n</template>\n\n<script>\nimport { generateUrl } from '@nextcloud/router'\nimport { getCurrentUser } from '@nextcloud/auth'\nimport { loadState } from '@nextcloud/initial-state'\nimport axios from '@nextcloud/axios'\nimport Button from '@nextcloud/vue/dist/Components/Button'\nimport Draggable from 'vuedraggable'\nimport Modal from '@nextcloud/vue/dist/Components/Modal'\nimport Pencil from 'vue-material-design-icons/Pencil.vue'\nimport Vue from 'vue'\n\nimport isMobile from './mixins/isMobile'\nimport BackgroundSettings from './components/BackgroundSettings'\nimport getBackgroundUrl from './helpers/getBackgroundUrl'\n\nconst panels = loadState('dashboard', 'panels')\nconst firstRun = loadState('dashboard', 'firstRun')\nconst background = loadState('dashboard', 'background')\nconst themingDefaultBackground = loadState('dashboard', 'themingDefaultBackground')\nconst version = loadState('dashboard', 'version')\nconst shippedBackgroundList = loadState('dashboard', 'shippedBackgrounds')\n\nconst statusInfo = {\n\tweather: {\n\t\ttext: t('dashboard', 'Weather'),\n\t\ticon: 'icon-weather-status',\n\t},\n\tstatus: {\n\t\ttext: t('dashboard', 'Status'),\n\t\ticon: 'icon-user-status-online',\n\t},\n}\n\nexport default {\n\tname: 'DashboardApp',\n\tcomponents: {\n\t\tBackgroundSettings,\n\t\tButton,\n\t\tDraggable,\n\t\tModal,\n\t\tPencil,\n\t},\n\tmixins: [\n\t\tisMobile,\n\t],\n\n\tdata() {\n\t\treturn {\n\t\t\tisAdmin: getCurrentUser().isAdmin,\n\t\t\ttimer: new Date(),\n\t\t\tregisteredStatus: [],\n\t\t\tcallbacks: {},\n\t\t\tcallbacksStatus: {},\n\t\t\tallCallbacksStatus: {},\n\t\t\tstatusInfo,\n\t\t\tenabledStatuses: loadState('dashboard', 'statuses'),\n\t\t\tpanels,\n\t\t\tfirstRun,\n\t\t\tdisplayName: getCurrentUser()?.displayName,\n\t\t\tuid: getCurrentUser()?.uid,\n\t\t\tlayout: loadState('dashboard', 'layout').filter((panelId) => panels[panelId]),\n\t\t\tmodal: false,\n\t\t\tappStoreUrl: generateUrl('/settings/apps/dashboard'),\n\t\t\tstatuses: {},\n\t\t\tbackground,\n\t\t\tthemingDefaultBackground,\n\t\t\tversion,\n\t\t}\n\t},\n\tcomputed: {\n\t\tbackgroundImage() {\n\t\t\treturn getBackgroundUrl(this.background, this.version, this.themingDefaultBackground)\n\t\t},\n\t\tbackgroundStyle() {\n\t\t\tif ((this.background === 'default' && this.themingDefaultBackground === 'backgroundColor')\n\t\t\t\t|| this.background.match(/#[0-9A-Fa-f]{6}/g)) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tbackgroundImage: `url(${this.backgroundImage})`,\n\t\t\t}\n\t\t},\n\n\t\tgreeting() {\n\t\t\tconst time = this.timer.getHours()\n\n\t\t\t// Determine part of the day\n\t\t\tlet partOfDay\n\t\t\tif (time >= 22 || time < 5) {\n\t\t\t\tpartOfDay = 'night'\n\t\t\t} else if (time >= 18) {\n\t\t\t\tpartOfDay = 'evening'\n\t\t\t} else if (time >= 12) {\n\t\t\t\tpartOfDay = 'afternoon'\n\t\t\t} else {\n\t\t\t\tpartOfDay = 'morning'\n\t\t\t}\n\n\t\t\t// Define the greetings\n\t\t\tconst good = {\n\t\t\t\tmorning: {\n\t\t\t\t\tgeneric: t('dashboard', 'Good morning'),\n\t\t\t\t\twithName: t('dashboard', 'Good morning, {name}', { name: this.displayName }, undefined, { escape: false }),\n\t\t\t\t},\n\t\t\t\tafternoon: {\n\t\t\t\t\tgeneric: t('dashboard', 'Good afternoon'),\n\t\t\t\t\twithName: t('dashboard', 'Good afternoon, {name}', { name: this.displayName }, undefined, { escape: false }),\n\t\t\t\t},\n\t\t\t\tevening: {\n\t\t\t\t\tgeneric: t('dashboard', 'Good evening'),\n\t\t\t\t\twithName: t('dashboard', 'Good evening, {name}', { name: this.displayName }, undefined, { escape: false }),\n\t\t\t\t},\n\t\t\t\tnight: {\n\t\t\t\t\t// Don't use \"Good night\" as it's not a greeting\n\t\t\t\t\tgeneric: t('dashboard', 'Hello'),\n\t\t\t\t\twithName: t('dashboard', 'Hello, {name}', { name: this.displayName }, undefined, { escape: false }),\n\t\t\t\t},\n\t\t\t}\n\n\t\t\t// Figure out which greeting to show\n\t\t\tconst shouldShowName = this.displayName && this.uid !== this.displayName\n\t\t\treturn { text: shouldShowName ? good[partOfDay].withName : good[partOfDay].generic }\n\t\t},\n\n\t\tisActive() {\n\t\t\treturn (panel) => this.layout.indexOf(panel.id) > -1\n\t\t},\n\t\tisStatusActive() {\n\t\t\treturn (status) => !(status in this.enabledStatuses) || this.enabledStatuses[status]\n\t\t},\n\n\t\tsortedAllStatuses() {\n\t\t\treturn Object.keys(this.allCallbacksStatus).slice().sort(this.sortStatuses)\n\t\t},\n\t\tsortedPanels() {\n\t\t\treturn Object.values(this.panels).sort((a, b) => {\n\t\t\t\tconst indexA = this.layout.indexOf(a.id)\n\t\t\t\tconst indexB = this.layout.indexOf(b.id)\n\t\t\t\tif (indexA === -1 || indexB === -1) {\n\t\t\t\t\treturn indexB - indexA || a.id - b.id\n\t\t\t\t}\n\t\t\t\treturn indexA - indexB || a.id - b.id\n\t\t\t})\n\t\t},\n\t\tsortedRegisteredStatus() {\n\t\t\treturn this.registeredStatus.slice().sort(this.sortStatuses)\n\t\t},\n\t},\n\n\twatch: {\n\t\tcallbacks() {\n\t\t\tthis.rerenderPanels()\n\t\t},\n\t\tcallbacksStatus() {\n\t\t\tfor (const app in this.callbacksStatus) {\n\t\t\t\tconst element = this.$refs['status-' + app]\n\t\t\t\tif (this.statuses[app] && this.statuses[app].mounted) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (element) {\n\t\t\t\t\tthis.callbacksStatus[app](element[0])\n\t\t\t\t\tVue.set(this.statuses, app, { mounted: true })\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error('Failed to register panel in the frontend as no backend data was provided for ' + app)\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.updateGlobalStyles()\n\t\tthis.updateSkipLink()\n\t\twindow.addEventListener('scroll', this.handleScroll)\n\n\t\tsetInterval(() => {\n\t\t\tthis.timer = new Date()\n\t\t}, 30000)\n\n\t\tif (this.firstRun) {\n\t\t\twindow.addEventListener('scroll', this.disableFirstrunHint)\n\t\t}\n\t},\n\tdestroyed() {\n\t\twindow.removeEventListener('scroll', this.handleScroll)\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Method to register panels that will be called by the integrating apps\n\t\t *\n\t\t * @param {string} app The unique app id for the widget\n\t\t * @param {Function} callback The callback function to register a panel which gets the DOM element passed as parameter\n\t\t */\n\t\tregister(app, callback) {\n\t\t\tVue.set(this.callbacks, app, callback)\n\t\t},\n\t\tregisterStatus(app, callback) {\n\t\t\t// always save callbacks in case user enables the status later\n\t\t\tVue.set(this.allCallbacksStatus, app, callback)\n\t\t\t// register only if status is enabled or missing from config\n\t\t\tif (this.isStatusActive(app)) {\n\t\t\t\tthis.registeredStatus.push(app)\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\tVue.set(this.callbacksStatus, app, callback)\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\trerenderPanels() {\n\t\t\tfor (const app in this.callbacks) {\n\t\t\t\tconst element = this.$refs[app]\n\t\t\t\tif (this.layout.indexOf(app) === -1) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (this.panels[app] && this.panels[app].mounted) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (element) {\n\t\t\t\t\tthis.callbacks[app](element[0], {\n\t\t\t\t\t\twidget: this.panels[app],\n\t\t\t\t\t})\n\t\t\t\t\tVue.set(this.panels[app], 'mounted', true)\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error('Failed to register panel in the frontend as no backend data was provided for ' + app)\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tsaveLayout() {\n\t\t\taxios.post(generateUrl('/apps/dashboard/layout'), {\n\t\t\t\tlayout: this.layout.join(','),\n\t\t\t})\n\t\t},\n\t\tsaveStatuses() {\n\t\t\taxios.post(generateUrl('/apps/dashboard/statuses'), {\n\t\t\t\tstatuses: JSON.stringify(this.enabledStatuses),\n\t\t\t})\n\t\t},\n\t\tshowModal() {\n\t\t\tthis.modal = true\n\t\t\tthis.firstRun = false\n\t\t},\n\t\tcloseModal() {\n\t\t\tthis.modal = false\n\t\t},\n\t\tupdateCheckbox(panel, currentValue) {\n\t\t\tconst index = this.layout.indexOf(panel.id)\n\t\t\tif (!currentValue && index > -1) {\n\t\t\t\tthis.layout.splice(index, 1)\n\n\t\t\t} else {\n\t\t\t\tthis.layout.push(panel.id)\n\t\t\t}\n\t\t\tVue.set(this.panels[panel.id], 'mounted', false)\n\t\t\tthis.saveLayout()\n\t\t\tthis.$nextTick(() => this.rerenderPanels())\n\t\t},\n\t\tdisableFirstrunHint() {\n\t\t\twindow.removeEventListener('scroll', this.disableFirstrunHint)\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.firstRun = false\n\t\t\t}, 1000)\n\t\t},\n\t\tupdateBackground(data) {\n\t\t\tthis.background = data.type === 'custom' || data.type === 'default' ? data.type : data.value\n\t\t\tthis.version = data.version\n\t\t\tthis.updateGlobalStyles()\n\t\t},\n\t\tupdateGlobalStyles() {\n\t\t\t// Override primary-invert-if-bright and color-primary-text if background is set\n\t\t\tconst isBackgroundBright = shippedBackgroundList[this.background]?.theming === 'dark'\n\t\t\tif (isBackgroundBright) {\n\t\t\t\tdocument.querySelector('#header').style.setProperty('--primary-invert-if-bright', 'invert(100%)')\n\t\t\t\tdocument.querySelector('#header').style.setProperty('--color-primary-text', '#000000')\n\t\t\t} else {\n\t\t\t\tdocument.querySelector('#header').style.removeProperty('--primary-invert-if-bright')\n\t\t\t\tdocument.querySelector('#header').style.removeProperty('--color-primary-text')\n\t\t\t}\n\t\t},\n\t\tupdateSkipLink() {\n\t\t\t// Make sure \"Skip to main content\" link points to the app content\n\t\t\tdocument.getElementsByClassName('skip-navigation')[0].setAttribute('href', '#app-dashboard')\n\t\t},\n\t\tupdateStatusCheckbox(app, checked) {\n\t\t\tif (checked) {\n\t\t\t\tthis.enableStatus(app)\n\t\t\t} else {\n\t\t\t\tthis.disableStatus(app)\n\t\t\t}\n\t\t},\n\t\tenableStatus(app) {\n\t\t\tthis.enabledStatuses[app] = true\n\t\t\tthis.registerStatus(app, this.allCallbacksStatus[app])\n\t\t\tthis.saveStatuses()\n\t\t},\n\t\tdisableStatus(app) {\n\t\t\tthis.enabledStatuses[app] = false\n\t\t\tconst i = this.registeredStatus.findIndex((s) => s === app)\n\t\t\tif (i !== -1) {\n\t\t\t\tthis.registeredStatus.splice(i, 1)\n\t\t\t\tVue.set(this.statuses, app, { mounted: false })\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\tVue.delete(this.callbacksStatus, app)\n\t\t\t\t})\n\t\t\t}\n\t\t\tthis.saveStatuses()\n\t\t},\n\t\tsortStatuses(a, b) {\n\t\t\tconst al = a.toLowerCase()\n\t\t\tconst bl = b.toLowerCase()\n\t\t\treturn al > bl\n\t\t\t\t? 1\n\t\t\t\t: al < bl\n\t\t\t\t\t? -1\n\t\t\t\t\t: 0\n\t\t},\n\t\thandleScroll() {\n\t\t\tif (window.scrollY > 70) {\n\t\t\t\tdocument.body.classList.add('dashboard--scrolled')\n\t\t\t} else {\n\t\t\t\tdocument.body.classList.remove('dashboard--scrolled')\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n#app-dashboard {\n\twidth: 100%;\n\tmin-height: 100vh;\n\tbackground-size: cover;\n\tbackground-position: center center;\n\tbackground-repeat: no-repeat;\n\tbackground-attachment: fixed;\n\tbackground-color: var(--color-primary);\n\t--color-background-translucent: rgba(var(--color-main-background-rgb), 0.8);\n\t--background-blur: blur(10px);\n\n\t> h2 {\n\t\tcolor: var(--color-primary-text);\n\t\ttext-align: center;\n\t\tfont-size: 32px;\n\t\tline-height: 130%;\n\t\tpadding: 10vh 16px 0px;\n\t}\n}\n\n.panels {\n\twidth: auto;\n\tmargin: auto;\n\tmax-width: 1500px;\n\tdisplay: flex;\n\tjustify-content: center;\n\tflex-direction: row;\n\talign-items: flex-start;\n\tflex-wrap: wrap;\n}\n\n.panel, .panels > div {\n\twidth: 320px;\n\tmax-width: 100%;\n\tmargin: 16px;\n\tbackground-color: var(--color-background-translucent);\n\t-webkit-backdrop-filter: var(--background-blur);\n\tbackdrop-filter: var(--background-blur);\n\tborder-radius: var(--border-radius-large);\n\n\t#body-user.theme--highcontrast & {\n\t\tborder: 2px solid var(--color-border);\n\t}\n\n\t&.sortable-ghost {\n\t\t opacity: 0.1;\n\t}\n\n\t& > .panel--header {\n\t\tdisplay: flex;\n\t\tz-index: 1;\n\t\ttop: 50px;\n\t\tpadding: 16px;\n\t\tcursor: grab;\n\n\t\t&, ::v-deep * {\n\t\t\t-webkit-touch-callout: none;\n\t\t\t-webkit-user-select: none;\n\t\t\t-khtml-user-select: none;\n\t\t\t-moz-user-select: none;\n\t\t\t-ms-user-select: none;\n\t\t\tuser-select: none;\n\t\t}\n\n\t\t&:active {\n\t\t\tcursor: grabbing;\n\t\t}\n\n\t\ta {\n\t\t\tflex-grow: 1;\n\t\t}\n\n\t\t> h2 {\n\t\t\tdisplay: block;\n\t\t\talign-items: center;\n\t\t\tflex-grow: 1;\n\t\t\tmargin: 0;\n\t\t\tfont-size: 20px;\n\t\t\tline-height: 24px;\n\t\t\tfont-weight: bold;\n\t\t\tpadding: 16px 8px;\n\t\t\theight: 56px;\n\t\t\twhite-space: nowrap;\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t\tcursor: grab;\n\t\t\tdiv {\n\t\t\t\tbackground-size: 32px;\n\t\t\t\twidth: 32px;\n\t\t\t\theight: 32px;\n\t\t\t\tmargin-right: 16px;\n\t\t\t\tbackground-position: center;\n\t\t\t\tfloat: left;\n\t\t\t\tfilter: var(--background-invert-if-dark);\n\t\t\t}\n\t\t}\n\t}\n\n\t& > .panel--content {\n\t\tmargin: 0 16px 16px 16px;\n\t\theight: 424px;\n\t\t// We specifically do not want scrollbars inside widgets\n\t\toverflow: visible;\n\t}\n\n\t// No need to extend height of widgets if only one column is shown\n\t@media only screen and (max-width: 709px) {\n\t\t& > .panel--content {\n\t\t\theight: auto;\n\t\t}\n\t}\n}\n\n.footer {\n\tdisplay: flex;\n\tjustify-content: center;\n\ttransition: bottom var(--animation-slow) ease-in-out;\n\tbottom: 0;\n\tpadding: 44px 0;\n}\n\n.edit-panels {\n\tdisplay: inline-block;\n\tmargin:auto;\n\tbackground-position: 16px center;\n\tpadding: 12px 16px;\n\tpadding-left: 36px;\n\tborder-radius: var(--border-radius-pill);\n\tmax-width: 200px;\n\topacity: 1;\n\ttext-align: center;\n}\n\n.button,\n.button-vue\n.edit-panels,\n.statuses ::v-deep .action-item .action-item__menutoggle,\n.statuses ::v-deep .action-item.action-item--open .action-item__menutoggle {\n\tbackground-color: var(--color-background-translucent);\n\t-webkit-backdrop-filter: var(--background-blur);\n\tbackdrop-filter: var(--background-blur);\n\topacity: 1 !important;\n\n\t&:hover,\n\t&:focus,\n\t&:active {\n\t\tbackground-color: var(--color-background-hover)!important;\n\t}\n\t&:focus-visible {\n\t\tbox-shadow: 0 0 0 2px var(--color-main-text) !important;\n\t}\n}\n\n.modal__content {\n\tpadding: 32px 16px;\n\ttext-align: center;\n\n\tol {\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t\tjustify-content: center;\n\t\tlist-style-type: none;\n\t\tpadding-bottom: 16px;\n\t}\n\tli {\n\t\tlabel {\n\t\t\tposition: relative;\n\t\t\tdisplay: block;\n\t\t\tpadding: 48px 16px 14px 16px;\n\t\t\tmargin: 8px;\n\t\t\twidth: 140px;\n\t\t\tbackground-color: var(--color-background-hover);\n\t\t\tborder: 2px solid var(--color-main-background);\n\t\t\tborder-radius: var(--border-radius-large);\n\t\t\ttext-align: left;\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t\twhite-space: nowrap;\n\n\t\t\tdiv {\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 16px;\n\t\t\t\twidth: 24px;\n\t\t\t\theight: 24px;\n\t\t\t\tbackground-size: 24px;\n\t\t\t}\n\n\t\t\t&:hover {\n\t\t\t\tborder-color: var(--color-primary);\n\t\t\t}\n\t\t}\n\n\t\t// Do not invert status icons\n\t\t&:not(.panel-status) label div {\n\t\t\tfilter: var(--background-invert-if-dark);\n\t\t}\n\n\t\tinput[type='checkbox'].checkbox + label:before {\n\t\t\tposition: absolute;\n\t\t\tright: 12px;\n\t\t\ttop: 16px;\n\t\t}\n\n\t\tinput:focus + label {\n\t\t\tborder-color: var(--color-primary);\n\t\t}\n\t}\n\n\th3 {\n\t\tfont-weight: bold;\n\n\t\t&:not(:first-of-type) {\n\t\t\tmargin-top: 64px;\n\t\t}\n\t}\n\n\t// Adjust design of 'Get more widgets' button\n\t.button {\n\t\tdisplay: inline-block;\n\t\tpadding: 10px 16px;\n\t\tmargin: 0;\n\t}\n\n\tp {\n\t\tmax-width: 650px;\n\t\tmargin: 0 auto;\n\n\t\ta:hover,\n\t\ta:focus {\n\t\t\tborder-bottom: 2px solid var(--color-border);\n\t\t}\n\t}\n\n\t.credits--end {\n\t\tpadding-bottom: 32px;\n\t\tcolor: var(--color-text-maxcontrast);\n\n\t\ta {\n\t\t\tcolor: var(--color-text-maxcontrast);\n\t\t}\n\t}\n}\n\n.flip-list-move {\n\ttransition: transform var(--animation-slow);\n}\n\n.statuses {\n\tdisplay: flex;\n\tflex-direction: row;\n\tjustify-content: center;\n\tflex-wrap: wrap;\n\tmargin-bottom: 36px;\n\n\t& > div {\n\t\tmargin: 8px;\n\t}\n}\n</style>\n","import mod from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DashboardApp.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DashboardApp.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/sass-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DashboardApp.vue?vue&type=style&index=0&id=5d4b2fb6&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/sass-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DashboardApp.vue?vue&type=style&index=0&id=5d4b2fb6&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./DashboardApp.vue?vue&type=template&id=5d4b2fb6&scoped=true&\"\nimport script from \"./DashboardApp.vue?vue&type=script&lang=js&\"\nexport * from \"./DashboardApp.vue?vue&type=script&lang=js&\"\nimport style0 from \"./DashboardApp.vue?vue&type=style&index=0&id=5d4b2fb6&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5d4b2fb6\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{style:(_vm.backgroundStyle),attrs:{\"id\":\"app-dashboard\"}},[_c('h2',[_vm._v(_vm._s(_vm.greeting.text))]),_vm._v(\" \"),_c('ul',{staticClass:\"statuses\"},_vm._l((_vm.sortedRegisteredStatus),function(status){return _c('div',{key:status,attrs:{\"id\":'status-' + status}},[_c('div',{ref:'status-' + status,refInFor:true})])}),0),_vm._v(\" \"),_c('Draggable',_vm._b({staticClass:\"panels\",attrs:{\"handle\":\".panel--header\"},on:{\"end\":_vm.saveLayout},model:{value:(_vm.layout),callback:function ($$v) {_vm.layout=$$v},expression:\"layout\"}},'Draggable',{swapThreshold: 0.30, delay: 500, delayOnTouchOnly: true, touchStartThreshold: 3},false),_vm._l((_vm.layout),function(panelId){return _c('div',{key:_vm.panels[panelId].id,staticClass:\"panel\"},[_c('div',{staticClass:\"panel--header\"},[_c('h2',[_c('div',{class:_vm.panels[panelId].iconClass,attrs:{\"role\":\"img\"}}),_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.panels[panelId].title)+\"\\n\\t\\t\\t\\t\")])]),_vm._v(\" \"),_c('div',{staticClass:\"panel--content\",class:{ loading: !_vm.panels[panelId].mounted }},[_c('div',{ref:_vm.panels[panelId].id,refInFor:true,attrs:{\"data-id\":_vm.panels[panelId].id}})])])}),0),_vm._v(\" \"),_c('div',{staticClass:\"footer\"},[_c('Button',{on:{\"click\":_vm.showModal},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('Pencil',{attrs:{\"size\":20}})]},proxy:true}])},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('dashboard', 'Customize'))+\"\\n\\t\\t\")])],1),_vm._v(\" \"),(_vm.modal)?_c('Modal',{attrs:{\"size\":\"large\"},on:{\"close\":_vm.closeModal}},[_c('div',{staticClass:\"modal__content\"},[_c('h3',[_vm._v(_vm._s(_vm.t('dashboard', 'Edit widgets')))]),_vm._v(\" \"),_c('ol',{staticClass:\"panels\"},_vm._l((_vm.sortedAllStatuses),function(status){return _c('li',{key:status,class:'panel-' + status},[_c('input',{staticClass:\"checkbox\",attrs:{\"id\":'status-checkbox-' + status,\"type\":\"checkbox\"},domProps:{\"checked\":_vm.isStatusActive(status)},on:{\"input\":function($event){return _vm.updateStatusCheckbox(status, $event.target.checked)}}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":'status-checkbox-' + status}},[_c('div',{class:_vm.statusInfo[status].icon,attrs:{\"role\":\"img\"}}),_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(_vm.statusInfo[status].text)+\"\\n\\t\\t\\t\\t\\t\")])])}),0),_vm._v(\" \"),_c('Draggable',_vm._b({staticClass:\"panels\",attrs:{\"tag\":\"ol\",\"handle\":\".draggable\"},on:{\"end\":_vm.saveLayout},model:{value:(_vm.layout),callback:function ($$v) {_vm.layout=$$v},expression:\"layout\"}},'Draggable',{swapThreshold: 0.30, delay: 500, delayOnTouchOnly: true, touchStartThreshold: 3},false),_vm._l((_vm.sortedPanels),function(panel){return _c('li',{key:panel.id,class:'panel-' + panel.id},[_c('input',{staticClass:\"checkbox\",attrs:{\"id\":'panel-checkbox-' + panel.id,\"type\":\"checkbox\"},domProps:{\"checked\":_vm.isActive(panel)},on:{\"input\":function($event){return _vm.updateCheckbox(panel, $event.target.checked)}}}),_vm._v(\" \"),_c('label',{class:{ draggable: _vm.isActive(panel) },attrs:{\"for\":'panel-checkbox-' + panel.id}},[_c('div',{class:panel.iconClass,attrs:{\"role\":\"img\"}}),_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(panel.title)+\"\\n\\t\\t\\t\\t\\t\")])])}),0),_vm._v(\" \"),(_vm.isAdmin)?_c('a',{staticClass:\"button\",attrs:{\"href\":_vm.appStoreUrl}},[_vm._v(_vm._s(_vm.t('dashboard', 'Get more widgets from the App Store')))]):_vm._e(),_vm._v(\" \"),_c('h3',[_vm._v(_vm._s(_vm.t('dashboard', 'Change background image')))]),_vm._v(\" \"),_c('BackgroundSettings',{attrs:{\"background\":_vm.background,\"theming-default-background\":_vm.themingDefaultBackground},on:{\"update:background\":_vm.updateBackground}}),_vm._v(\" \"),_c('h3',[_vm._v(_vm._s(_vm.t('dashboard', 'Weather service')))]),_vm._v(\" \"),_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('dashboard', 'For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information.'))+\"\\n\\t\\t\\t\")]),_vm._v(\" \"),_c('p',{staticClass:\"credits--end\"},[_c('a',{attrs:{\"href\":\"https://api.met.no/doc/TermsOfService\",\"target\":\"_blank\",\"rel\":\"noopener\"}},[_vm._v(_vm._s(_vm.t('dashboard', 'Weather data from Met.no')))]),_vm._v(\",\\n\\t\\t\\t\\t\"),_c('a',{attrs:{\"href\":\"https://wiki.osmfoundation.org/wiki/Privacy_Policy\",\"target\":\"_blank\",\"rel\":\"noopener\"}},[_vm._v(_vm._s(_vm.t('dashboard', 'geocoding with Nominatim')))]),_vm._v(\",\\n\\t\\t\\t\\t\"),_c('a',{attrs:{\"href\":\"https://www.opentopodata.org/#public-api\",\"target\":\"_blank\",\"rel\":\"noopener\"}},[_vm._v(_vm._s(_vm.t('dashboard', 'elevation data from OpenTopoData')))]),_vm._v(\".\\n\\t\\t\\t\")])],1)]):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2016 Julius Härtl <jus@bitgrid.net>\n *\n * @author Julius Härtl <jus@bitgrid.net>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport Vue from 'vue'\nimport DashboardApp from './DashboardApp.vue'\nimport { translate as t } from '@nextcloud/l10n'\nimport VTooltip from '@nextcloud/vue/dist/Directives/Tooltip'\nimport { getRequestToken } from '@nextcloud/auth'\n\n// eslint-disable-next-line camelcase\n__webpack_nonce__ = btoa(getRequestToken())\n\nVue.directive('Tooltip', VTooltip)\n\nVue.prototype.t = t\n\n// FIXME workaround to make the sidebar work\nif (!window.OCA.Files) {\n\twindow.OCA.Files = {}\n}\n\nObject.assign(window.OCA.Files, { App: { fileList: { filesClient: OC.Files.getClient() } } }, window.OCA.Files)\n\nconst Dashboard = Vue.extend(DashboardApp)\nconst Instance = new Dashboard({}).$mount('#app-content-vue')\n\nwindow.OCA.Dashboard = {\n\tregister: (app, callback) => Instance.register(app, callback),\n\tregisterStatus: (app, callback) => Instance.registerStatus(app, callback),\n}\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"#app-dashboard[data-v-5d4b2fb6]{width:100%;min-height:100vh;background-size:cover;background-position:center center;background-repeat:no-repeat;background-attachment:fixed;background-color:var(--color-primary);--color-background-translucent: rgba(var(--color-main-background-rgb), 0.8);--background-blur: blur(10px)}#app-dashboard>h2[data-v-5d4b2fb6]{color:var(--color-primary-text);text-align:center;font-size:32px;line-height:130%;padding:10vh 16px 0px}.panels[data-v-5d4b2fb6]{width:auto;margin:auto;max-width:1500px;display:flex;justify-content:center;flex-direction:row;align-items:flex-start;flex-wrap:wrap}.panel[data-v-5d4b2fb6],.panels>div[data-v-5d4b2fb6]{width:320px;max-width:100%;margin:16px;background-color:var(--color-background-translucent);-webkit-backdrop-filter:var(--background-blur);backdrop-filter:var(--background-blur);border-radius:var(--border-radius-large)}#body-user.theme--highcontrast .panel[data-v-5d4b2fb6],#body-user.theme--highcontrast .panels>div[data-v-5d4b2fb6]{border:2px solid var(--color-border)}.panel.sortable-ghost[data-v-5d4b2fb6],.panels>div.sortable-ghost[data-v-5d4b2fb6]{opacity:.1}.panel>.panel--header[data-v-5d4b2fb6],.panels>div>.panel--header[data-v-5d4b2fb6]{display:flex;z-index:1;top:50px;padding:16px;cursor:grab}.panel>.panel--header[data-v-5d4b2fb6],.panel>.panel--header[data-v-5d4b2fb6] *,.panels>div>.panel--header[data-v-5d4b2fb6],.panels>div>.panel--header[data-v-5d4b2fb6] *{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.panel>.panel--header[data-v-5d4b2fb6]:active,.panels>div>.panel--header[data-v-5d4b2fb6]:active{cursor:grabbing}.panel>.panel--header a[data-v-5d4b2fb6],.panels>div>.panel--header a[data-v-5d4b2fb6]{flex-grow:1}.panel>.panel--header>h2[data-v-5d4b2fb6],.panels>div>.panel--header>h2[data-v-5d4b2fb6]{display:block;align-items:center;flex-grow:1;margin:0;font-size:20px;line-height:24px;font-weight:bold;padding:16px 8px;height:56px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:grab}.panel>.panel--header>h2 div[data-v-5d4b2fb6],.panels>div>.panel--header>h2 div[data-v-5d4b2fb6]{background-size:32px;width:32px;height:32px;margin-right:16px;background-position:center;float:left;filter:var(--background-invert-if-dark)}.panel>.panel--content[data-v-5d4b2fb6],.panels>div>.panel--content[data-v-5d4b2fb6]{margin:0 16px 16px 16px;height:424px;overflow:visible}@media only screen and (max-width: 709px){.panel>.panel--content[data-v-5d4b2fb6],.panels>div>.panel--content[data-v-5d4b2fb6]{height:auto}}.footer[data-v-5d4b2fb6]{display:flex;justify-content:center;transition:bottom var(--animation-slow) ease-in-out;bottom:0;padding:44px 0}.edit-panels[data-v-5d4b2fb6]{display:inline-block;margin:auto;background-position:16px center;padding:12px 16px;padding-left:36px;border-radius:var(--border-radius-pill);max-width:200px;opacity:1;text-align:center}.button[data-v-5d4b2fb6],.button-vue .edit-panels[data-v-5d4b2fb6],.statuses[data-v-5d4b2fb6] .action-item .action-item__menutoggle,.statuses[data-v-5d4b2fb6] .action-item.action-item--open .action-item__menutoggle{background-color:var(--color-background-translucent);-webkit-backdrop-filter:var(--background-blur);backdrop-filter:var(--background-blur);opacity:1 !important}.button[data-v-5d4b2fb6]:hover,.button[data-v-5d4b2fb6]:focus,.button[data-v-5d4b2fb6]:active,.button-vue .edit-panels[data-v-5d4b2fb6]:hover,.button-vue .edit-panels[data-v-5d4b2fb6]:focus,.button-vue .edit-panels[data-v-5d4b2fb6]:active,.statuses[data-v-5d4b2fb6] .action-item .action-item__menutoggle:hover,.statuses[data-v-5d4b2fb6] .action-item .action-item__menutoggle:focus,.statuses[data-v-5d4b2fb6] .action-item .action-item__menutoggle:active,.statuses[data-v-5d4b2fb6] .action-item.action-item--open .action-item__menutoggle:hover,.statuses[data-v-5d4b2fb6] .action-item.action-item--open .action-item__menutoggle:focus,.statuses[data-v-5d4b2fb6] .action-item.action-item--open .action-item__menutoggle:active{background-color:var(--color-background-hover) !important}.button[data-v-5d4b2fb6]:focus-visible,.button-vue .edit-panels[data-v-5d4b2fb6]:focus-visible,.statuses[data-v-5d4b2fb6] .action-item .action-item__menutoggle:focus-visible,.statuses[data-v-5d4b2fb6] .action-item.action-item--open .action-item__menutoggle:focus-visible{box-shadow:0 0 0 2px var(--color-main-text) !important}.modal__content[data-v-5d4b2fb6]{padding:32px 16px;text-align:center}.modal__content ol[data-v-5d4b2fb6]{display:flex;flex-direction:row;justify-content:center;list-style-type:none;padding-bottom:16px}.modal__content li label[data-v-5d4b2fb6]{position:relative;display:block;padding:48px 16px 14px 16px;margin:8px;width:140px;background-color:var(--color-background-hover);border:2px solid var(--color-main-background);border-radius:var(--border-radius-large);text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.modal__content li label div[data-v-5d4b2fb6]{position:absolute;top:16px;width:24px;height:24px;background-size:24px}.modal__content li label[data-v-5d4b2fb6]:hover{border-color:var(--color-primary)}.modal__content li:not(.panel-status) label div[data-v-5d4b2fb6]{filter:var(--background-invert-if-dark)}.modal__content li input[type=checkbox].checkbox+label[data-v-5d4b2fb6]:before{position:absolute;right:12px;top:16px}.modal__content li input:focus+label[data-v-5d4b2fb6]{border-color:var(--color-primary)}.modal__content h3[data-v-5d4b2fb6]{font-weight:bold}.modal__content h3[data-v-5d4b2fb6]:not(:first-of-type){margin-top:64px}.modal__content .button[data-v-5d4b2fb6]{display:inline-block;padding:10px 16px;margin:0}.modal__content p[data-v-5d4b2fb6]{max-width:650px;margin:0 auto}.modal__content p a[data-v-5d4b2fb6]:hover,.modal__content p a[data-v-5d4b2fb6]:focus{border-bottom:2px solid var(--color-border)}.modal__content .credits--end[data-v-5d4b2fb6]{padding-bottom:32px;color:var(--color-text-maxcontrast)}.modal__content .credits--end a[data-v-5d4b2fb6]{color:var(--color-text-maxcontrast)}.flip-list-move[data-v-5d4b2fb6]{transition:transform var(--animation-slow)}.statuses[data-v-5d4b2fb6]{display:flex;flex-direction:row;justify-content:center;flex-wrap:wrap;margin-bottom:36px}.statuses>div[data-v-5d4b2fb6]{margin:8px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/dashboard/src/DashboardApp.vue\"],\"names\":[],\"mappings\":\"AAoaA,gCACC,UAAA,CACA,gBAAA,CACA,qBAAA,CACA,iCAAA,CACA,2BAAA,CACA,2BAAA,CACA,qCAAA,CACA,2EAAA,CACA,6BAAA,CAEA,mCACC,+BAAA,CACA,iBAAA,CACA,cAAA,CACA,gBAAA,CACA,qBAAA,CAIF,yBACC,UAAA,CACA,WAAA,CACA,gBAAA,CACA,YAAA,CACA,sBAAA,CACA,kBAAA,CACA,sBAAA,CACA,cAAA,CAGD,qDACC,WAAA,CACA,cAAA,CACA,WAAA,CACA,oDAAA,CACA,8CAAA,CACA,sCAAA,CACA,wCAAA,CAEA,mHACC,oCAAA,CAGD,mFACE,UAAA,CAGF,mFACC,YAAA,CACA,SAAA,CACA,QAAA,CACA,YAAA,CACA,WAAA,CAEA,4KACC,0BAAA,CACA,wBAAA,CACA,uBAAA,CACA,qBAAA,CACA,oBAAA,CACA,gBAAA,CAGD,iGACC,eAAA,CAGD,uFACC,WAAA,CAGD,yFACC,aAAA,CACA,kBAAA,CACA,WAAA,CACA,QAAA,CACA,cAAA,CACA,gBAAA,CACA,gBAAA,CACA,gBAAA,CACA,WAAA,CACA,kBAAA,CACA,eAAA,CACA,sBAAA,CACA,WAAA,CACA,iGACC,oBAAA,CACA,UAAA,CACA,WAAA,CACA,iBAAA,CACA,0BAAA,CACA,UAAA,CACA,uCAAA,CAKH,qFACC,uBAAA,CACA,YAAA,CAEA,gBAAA,CAID,0CACC,qFACC,WAAA,CAAA,CAKH,yBACC,YAAA,CACA,sBAAA,CACA,mDAAA,CACA,QAAA,CACA,cAAA,CAGD,8BACC,oBAAA,CACA,WAAA,CACA,+BAAA,CACA,iBAAA,CACA,iBAAA,CACA,uCAAA,CACA,eAAA,CACA,SAAA,CACA,iBAAA,CAGD,yNAKC,oDAAA,CACA,8CAAA,CACA,sCAAA,CACA,oBAAA,CAEA,utBAGC,yDAAA,CAED,iRACC,sDAAA,CAIF,iCACC,iBAAA,CACA,iBAAA,CAEA,oCACC,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,oBAAA,CACA,mBAAA,CAGA,0CACC,iBAAA,CACA,aAAA,CACA,2BAAA,CACA,UAAA,CACA,WAAA,CACA,8CAAA,CACA,6CAAA,CACA,wCAAA,CACA,eAAA,CACA,eAAA,CACA,sBAAA,CACA,kBAAA,CAEA,8CACC,iBAAA,CACA,QAAA,CACA,UAAA,CACA,WAAA,CACA,oBAAA,CAGD,gDACC,iCAAA,CAKF,iEACC,uCAAA,CAGD,+EACC,iBAAA,CACA,UAAA,CACA,QAAA,CAGD,sDACC,iCAAA,CAIF,oCACC,gBAAA,CAEA,wDACC,eAAA,CAKF,yCACC,oBAAA,CACA,iBAAA,CACA,QAAA,CAGD,mCACC,eAAA,CACA,aAAA,CAEA,sFAEC,2CAAA,CAIF,+CACC,mBAAA,CACA,mCAAA,CAEA,iDACC,mCAAA,CAKH,iCACC,0CAAA,CAGD,2BACC,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,cAAA,CACA,kBAAA,CAEA,+BACC,UAAA\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n#app-dashboard {\\n\\twidth: 100%;\\n\\tmin-height: 100vh;\\n\\tbackground-size: cover;\\n\\tbackground-position: center center;\\n\\tbackground-repeat: no-repeat;\\n\\tbackground-attachment: fixed;\\n\\tbackground-color: var(--color-primary);\\n\\t--color-background-translucent: rgba(var(--color-main-background-rgb), 0.8);\\n\\t--background-blur: blur(10px);\\n\\n\\t> h2 {\\n\\t\\tcolor: var(--color-primary-text);\\n\\t\\ttext-align: center;\\n\\t\\tfont-size: 32px;\\n\\t\\tline-height: 130%;\\n\\t\\tpadding: 10vh 16px 0px;\\n\\t}\\n}\\n\\n.panels {\\n\\twidth: auto;\\n\\tmargin: auto;\\n\\tmax-width: 1500px;\\n\\tdisplay: flex;\\n\\tjustify-content: center;\\n\\tflex-direction: row;\\n\\talign-items: flex-start;\\n\\tflex-wrap: wrap;\\n}\\n\\n.panel, .panels > div {\\n\\twidth: 320px;\\n\\tmax-width: 100%;\\n\\tmargin: 16px;\\n\\tbackground-color: var(--color-background-translucent);\\n\\t-webkit-backdrop-filter: var(--background-blur);\\n\\tbackdrop-filter: var(--background-blur);\\n\\tborder-radius: var(--border-radius-large);\\n\\n\\t#body-user.theme--highcontrast & {\\n\\t\\tborder: 2px solid var(--color-border);\\n\\t}\\n\\n\\t&.sortable-ghost {\\n\\t\\t opacity: 0.1;\\n\\t}\\n\\n\\t& > .panel--header {\\n\\t\\tdisplay: flex;\\n\\t\\tz-index: 1;\\n\\t\\ttop: 50px;\\n\\t\\tpadding: 16px;\\n\\t\\tcursor: grab;\\n\\n\\t\\t&, ::v-deep * {\\n\\t\\t\\t-webkit-touch-callout: none;\\n\\t\\t\\t-webkit-user-select: none;\\n\\t\\t\\t-khtml-user-select: none;\\n\\t\\t\\t-moz-user-select: none;\\n\\t\\t\\t-ms-user-select: none;\\n\\t\\t\\tuser-select: none;\\n\\t\\t}\\n\\n\\t\\t&:active {\\n\\t\\t\\tcursor: grabbing;\\n\\t\\t}\\n\\n\\t\\ta {\\n\\t\\t\\tflex-grow: 1;\\n\\t\\t}\\n\\n\\t\\t> h2 {\\n\\t\\t\\tdisplay: block;\\n\\t\\t\\talign-items: center;\\n\\t\\t\\tflex-grow: 1;\\n\\t\\t\\tmargin: 0;\\n\\t\\t\\tfont-size: 20px;\\n\\t\\t\\tline-height: 24px;\\n\\t\\t\\tfont-weight: bold;\\n\\t\\t\\tpadding: 16px 8px;\\n\\t\\t\\theight: 56px;\\n\\t\\t\\twhite-space: nowrap;\\n\\t\\t\\toverflow: hidden;\\n\\t\\t\\ttext-overflow: ellipsis;\\n\\t\\t\\tcursor: grab;\\n\\t\\t\\tdiv {\\n\\t\\t\\t\\tbackground-size: 32px;\\n\\t\\t\\t\\twidth: 32px;\\n\\t\\t\\t\\theight: 32px;\\n\\t\\t\\t\\tmargin-right: 16px;\\n\\t\\t\\t\\tbackground-position: center;\\n\\t\\t\\t\\tfloat: left;\\n\\t\\t\\t\\tfilter: var(--background-invert-if-dark);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t& > .panel--content {\\n\\t\\tmargin: 0 16px 16px 16px;\\n\\t\\theight: 424px;\\n\\t\\t// We specifically do not want scrollbars inside widgets\\n\\t\\toverflow: visible;\\n\\t}\\n\\n\\t// No need to extend height of widgets if only one column is shown\\n\\t@media only screen and (max-width: 709px) {\\n\\t\\t& > .panel--content {\\n\\t\\t\\theight: auto;\\n\\t\\t}\\n\\t}\\n}\\n\\n.footer {\\n\\tdisplay: flex;\\n\\tjustify-content: center;\\n\\ttransition: bottom var(--animation-slow) ease-in-out;\\n\\tbottom: 0;\\n\\tpadding: 44px 0;\\n}\\n\\n.edit-panels {\\n\\tdisplay: inline-block;\\n\\tmargin:auto;\\n\\tbackground-position: 16px center;\\n\\tpadding: 12px 16px;\\n\\tpadding-left: 36px;\\n\\tborder-radius: var(--border-radius-pill);\\n\\tmax-width: 200px;\\n\\topacity: 1;\\n\\ttext-align: center;\\n}\\n\\n.button,\\n.button-vue\\n.edit-panels,\\n.statuses ::v-deep .action-item .action-item__menutoggle,\\n.statuses ::v-deep .action-item.action-item--open .action-item__menutoggle {\\n\\tbackground-color: var(--color-background-translucent);\\n\\t-webkit-backdrop-filter: var(--background-blur);\\n\\tbackdrop-filter: var(--background-blur);\\n\\topacity: 1 !important;\\n\\n\\t&:hover,\\n\\t&:focus,\\n\\t&:active {\\n\\t\\tbackground-color: var(--color-background-hover)!important;\\n\\t}\\n\\t&:focus-visible {\\n\\t\\tbox-shadow: 0 0 0 2px var(--color-main-text) !important;\\n\\t}\\n}\\n\\n.modal__content {\\n\\tpadding: 32px 16px;\\n\\ttext-align: center;\\n\\n\\tol {\\n\\t\\tdisplay: flex;\\n\\t\\tflex-direction: row;\\n\\t\\tjustify-content: center;\\n\\t\\tlist-style-type: none;\\n\\t\\tpadding-bottom: 16px;\\n\\t}\\n\\tli {\\n\\t\\tlabel {\\n\\t\\t\\tposition: relative;\\n\\t\\t\\tdisplay: block;\\n\\t\\t\\tpadding: 48px 16px 14px 16px;\\n\\t\\t\\tmargin: 8px;\\n\\t\\t\\twidth: 140px;\\n\\t\\t\\tbackground-color: var(--color-background-hover);\\n\\t\\t\\tborder: 2px solid var(--color-main-background);\\n\\t\\t\\tborder-radius: var(--border-radius-large);\\n\\t\\t\\ttext-align: left;\\n\\t\\t\\toverflow: hidden;\\n\\t\\t\\ttext-overflow: ellipsis;\\n\\t\\t\\twhite-space: nowrap;\\n\\n\\t\\t\\tdiv {\\n\\t\\t\\t\\tposition: absolute;\\n\\t\\t\\t\\ttop: 16px;\\n\\t\\t\\t\\twidth: 24px;\\n\\t\\t\\t\\theight: 24px;\\n\\t\\t\\t\\tbackground-size: 24px;\\n\\t\\t\\t}\\n\\n\\t\\t\\t&:hover {\\n\\t\\t\\t\\tborder-color: var(--color-primary);\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Do not invert status icons\\n\\t\\t&:not(.panel-status) label div {\\n\\t\\t\\tfilter: var(--background-invert-if-dark);\\n\\t\\t}\\n\\n\\t\\tinput[type='checkbox'].checkbox + label:before {\\n\\t\\t\\tposition: absolute;\\n\\t\\t\\tright: 12px;\\n\\t\\t\\ttop: 16px;\\n\\t\\t}\\n\\n\\t\\tinput:focus + label {\\n\\t\\t\\tborder-color: var(--color-primary);\\n\\t\\t}\\n\\t}\\n\\n\\th3 {\\n\\t\\tfont-weight: bold;\\n\\n\\t\\t&:not(:first-of-type) {\\n\\t\\t\\tmargin-top: 64px;\\n\\t\\t}\\n\\t}\\n\\n\\t// Adjust design of 'Get more widgets' button\\n\\t.button {\\n\\t\\tdisplay: inline-block;\\n\\t\\tpadding: 10px 16px;\\n\\t\\tmargin: 0;\\n\\t}\\n\\n\\tp {\\n\\t\\tmax-width: 650px;\\n\\t\\tmargin: 0 auto;\\n\\n\\t\\ta:hover,\\n\\t\\ta:focus {\\n\\t\\t\\tborder-bottom: 2px solid var(--color-border);\\n\\t\\t}\\n\\t}\\n\\n\\t.credits--end {\\n\\t\\tpadding-bottom: 32px;\\n\\t\\tcolor: var(--color-text-maxcontrast);\\n\\n\\t\\ta {\\n\\t\\t\\tcolor: var(--color-text-maxcontrast);\\n\\t\\t}\\n\\t}\\n}\\n\\n.flip-list-move {\\n\\ttransition: transform var(--animation-slow);\\n}\\n\\n.statuses {\\n\\tdisplay: flex;\\n\\tflex-direction: row;\\n\\tjustify-content: center;\\n\\tflex-wrap: wrap;\\n\\tmargin-bottom: 36px;\\n\\n\\t& > div {\\n\\t\\tmargin: 8px;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".background-selector[data-v-77b70ba2]{display:flex;flex-wrap:wrap;justify-content:center}.background-selector .background[data-v-77b70ba2]{width:176px;height:96px;margin:8px;background-size:cover;background-position:center center;text-align:center;border-radius:var(--border-radius-large);border:2px solid var(--color-main-background);overflow:hidden}.background-selector .background.current[data-v-77b70ba2]{background-image:var(--color-background-dark)}.background-selector .background.filepicker[data-v-77b70ba2],.background-selector .background.default[data-v-77b70ba2],.background-selector .background.color[data-v-77b70ba2]{border-color:var(--color-border)}.background-selector .background.color[data-v-77b70ba2]{background-color:var(--color-primary);color:var(--color-primary-text)}.background-selector .background.active[data-v-77b70ba2],.background-selector .background[data-v-77b70ba2]:hover,.background-selector .background[data-v-77b70ba2]:focus{border:2px solid var(--color-primary)}.background-selector .background.active[data-v-77b70ba2]:not(.icon-loading):after{background-image:var(--icon-checkmark-white);background-repeat:no-repeat;background-position:center;background-size:44px;content:\\\"\\\";display:block;height:100%}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/dashboard/src/components/BackgroundSettings.vue\"],\"names\":[],\"mappings\":\"AA4IA,sCACC,YAAA,CACA,cAAA,CACA,sBAAA,CAEA,kDACC,WAAA,CACA,WAAA,CACA,UAAA,CACA,qBAAA,CACA,iCAAA,CACA,iBAAA,CACA,wCAAA,CACA,6CAAA,CACA,eAAA,CAEA,0DACC,6CAAA,CAGD,+KACC,gCAAA,CAGD,wDACC,qCAAA,CACA,+BAAA,CAGD,yKAGC,qCAAA,CAGD,kFACC,4CAAA,CACA,2BAAA,CACA,0BAAA,CACA,oBAAA,CACA,UAAA,CACA,aAAA,CACA,WAAA\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n.background-selector {\\n\\tdisplay: flex;\\n\\tflex-wrap: wrap;\\n\\tjustify-content: center;\\n\\n\\t.background {\\n\\t\\twidth: 176px;\\n\\t\\theight: 96px;\\n\\t\\tmargin: 8px;\\n\\t\\tbackground-size: cover;\\n\\t\\tbackground-position: center center;\\n\\t\\ttext-align: center;\\n\\t\\tborder-radius: var(--border-radius-large);\\n\\t\\tborder: 2px solid var(--color-main-background);\\n\\t\\toverflow: hidden;\\n\\n\\t\\t&.current {\\n\\t\\t\\tbackground-image: var(--color-background-dark);\\n\\t\\t}\\n\\n\\t\\t&.filepicker, &.default, &.color {\\n\\t\\t\\tborder-color: var(--color-border);\\n\\t\\t}\\n\\n\\t\\t&.color {\\n\\t\\t\\tbackground-color: var(--color-primary);\\n\\t\\t\\tcolor: var(--color-primary-text);\\n\\t\\t}\\n\\n\\t\\t&.active,\\n\\t\\t&:hover,\\n\\t\\t&:focus {\\n\\t\\t\\tborder: 2px solid var(--color-primary);\\n\\t\\t}\\n\\n\\t\\t&.active:not(.icon-loading):after {\\n\\t\\t\\tbackground-image: var(--icon-checkmark-white);\\n\\t\\t\\tbackground-repeat: no-repeat;\\n\\t\\t\\tbackground-position: center;\\n\\t\\t\\tbackground-size: 44px;\\n\\t\\t\\tcontent: '';\\n\\t\\t\\tdisplay: block;\\n\\t\\t\\theight: 100%;\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","__webpack_require__.amdD = function () {\n\tthrow new Error('define cannot be used indirect');\n};","__webpack_require__.amdO = {};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 4773;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t4773: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [7874], function() { return __webpack_require__(90422); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","data","isMobile","this","_isMobile","beforeMount","window","addEventListener","_onResize","beforeDestroy","removeEventListener","methods","document","documentElement","clientWidth","url","generateFilePath","background","time","themingDefaultBackground","enabledThemes","OCA","Theming","isDarkTheme","length","matchMedia","matches","join","indexOf","generateUrl","cacheBuster","prefixWithBaseUrl","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","_vm","_h","$createElement","_c","_self","staticClass","class","active","attrs","on","pickFile","_v","_s","t","loading","setDefault","pickColor","_l","shippedBackground","directives","name","rawName","value","details","expression","key","style","preview","$event","setShipped","greeting","text","status","ref","refInFor","_b","saveLayout","model","callback","$$v","layout","swapThreshold","delay","delayOnTouchOnly","touchStartThreshold","panelId","panels","id","iconClass","title","mounted","showModal","scopedSlots","_u","fn","proxy","closeModal","domProps","isStatusActive","updateStatusCheckbox","target","checked","statusInfo","icon","panel","isActive","updateCheckbox","draggable","appStoreUrl","_e","updateBackground","__webpack_nonce__","btoa","getRequestToken","Vue","VTooltip","Files","Object","assign","App","fileList","filesClient","OC","getClient","Instance","DashboardApp","$mount","Dashboard","register","app","registerStatus","___CSS_LOADER_EXPORT___","push","module","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","loaded","__webpack_modules__","call","m","amdD","Error","amdO","O","result","chunkIds","priority","notFulfilled","Infinity","i","fulfilled","j","keys","every","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","g","globalThis","Function","e","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","nmd","paths","children","b","baseURI","self","location","href","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","forEach","bind","nc","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file diff --git a/dist/icons.css b/dist/icons.css index 5f200a1046e..a53b457626f 100644 --- a/dist/icons.css +++ b/dist/icons.css @@ -1585,7 +1585,7 @@ body .nav-icon-systemtagsfilter { --icon-view-previous-dark: var(--original-icon-view-previous-white); } } -body[data-themes*=light] { +[data-themes*=light] { --icon-add-dark: var(--original-icon-add-dark); --icon-add-white: var(--original-icon-add-white); --icon-address-dark: var(--original-icon-address-dark); @@ -1794,7 +1794,7 @@ body[data-themes*=light] { --icon-view-previous-white: var(--original-icon-view-previous-white); } -body[data-themes*=dark] { +[data-themes*=dark] { --icon-add-white: var(--original-icon-add-dark); --icon-add-dark: var(--original-icon-add-white); --icon-address-white: var(--original-icon-address-dark); diff --git a/dist/settings-apps-view-7418.js b/dist/settings-apps-view-7418.js index 512c1a3ee22..7edc3a83819 100644 --- a/dist/settings-apps-view-7418.js +++ b/dist/settings-apps-view-7418.js @@ -1,2 +1,2 @@ -"use strict";(self.webpackChunknextcloud=self.webpackChunknextcloud||[]).push([[7418],{56934:function(t,n,e){var a=e(87537),i=e.n(a),s=e(23645),r=e.n(s)()(i());r.push([t.id,".app-details[data-v-8ea5f476]{padding:20px}.app-details__actions-manage[data-v-8ea5f476]{display:flex}.app-details__actions-manage input[data-v-8ea5f476]{flex:0 1 auto;min-width:0;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.app-details__dependencies[data-v-8ea5f476]{opacity:.7}.app-details__documentation[data-v-8ea5f476]{padding-top:20px}.app-details__description[data-v-8ea5f476]{padding-top:20px}.force[data-v-8ea5f476]{color:var(--color-error);border-color:var(--color-error);background:var(--color-main-background)}.force[data-v-8ea5f476]:hover,.force[data-v-8ea5f476]:active{color:var(--color-main-background);border-color:var(--color-error) !important;background:var(--color-error)}","",{version:3,sources:["webpack://./apps/settings/src/components/AppDetails.vue"],names:[],mappings:"AAuNA,8BACC,YAAA,CAIC,8CAEC,YAAA,CACA,oDACC,aAAA,CACA,WAAA,CACA,sBAAA,CACA,kBAAA,CACA,eAAA,CAIH,4CACC,UAAA,CAED,6CACC,gBAAA,CAED,2CACC,gBAAA,CAIF,wBACC,wBAAA,CACA,+BAAA,CACA,uCAAA,CAED,6DAEC,kCAAA,CACA,0CAAA,CACA,6BAAA",sourcesContent:["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.app-details {\n\tpadding: 20px;\n\n\t&__actions {\n\t\t// app management\n\t\t&-manage {\n\t\t\t// if too many, shrink them and ellipsis\n\t\t\tdisplay: flex;\n\t\t\tinput {\n\t\t\t\tflex: 0 1 auto;\n\t\t\t\tmin-width: 0;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\t\t}\n\t}\n\t&__dependencies {\n\t\topacity: .7;\n\t}\n\t&__documentation {\n\t\tpadding-top: 20px;\n\t}\n\t&__description {\n\t\tpadding-top: 20px;\n\t}\n}\n\n.force {\n\tcolor: var(--color-error);\n\tborder-color: var(--color-error);\n\tbackground: var(--color-main-background);\n}\n.force:hover,\n.force:active {\n\tcolor: var(--color-main-background);\n\tborder-color: var(--color-error) !important;\n\tbackground: var(--color-error);\n}\n\n"],sourceRoot:""}]),n.Z=r},6578:function(t,n,e){var a=e(87537),i=e.n(a),s=e(23645),r=e.n(s)()(i());r.push([t.id,".settings-markdown[data-v-652eb552] h1,.settings-markdown[data-v-652eb552] h2,.settings-markdown[data-v-652eb552] h3,.settings-markdown[data-v-652eb552] h4,.settings-markdown[data-v-652eb552] h5,.settings-markdown[data-v-652eb552] h6{font-weight:600;line-height:120%;margin-top:24px;margin-bottom:12px;color:var(--color-main-text)}.settings-markdown[data-v-652eb552] h1{font-size:36px;margin-top:48px}.settings-markdown[data-v-652eb552] h2{font-size:28px;margin-top:48px}.settings-markdown[data-v-652eb552] h3{font-size:24px}.settings-markdown[data-v-652eb552] h4{font-size:21px}.settings-markdown[data-v-652eb552] h5{font-size:17px}.settings-markdown[data-v-652eb552] h6{font-size:var(--default-font-size)}.settings-markdown[data-v-652eb552] pre{white-space:pre;overflow-x:auto;background-color:var(--color-background-dark);border-radius:var(--border-radius);padding:1em 1.3em;margin-bottom:1em}.settings-markdown[data-v-652eb552] p code{background-color:var(--color-background-dark);border-radius:var(--border-radius);padding:.1em .3em}.settings-markdown[data-v-652eb552] li{position:relative}.settings-markdown[data-v-652eb552] ul,.settings-markdown[data-v-652eb552] ol{padding-left:10px;margin-left:10px}.settings-markdown[data-v-652eb552] ul li{list-style-type:disc}.settings-markdown[data-v-652eb552] ul>li>ul>li{list-style-type:circle}.settings-markdown[data-v-652eb552] ul>li>ul>li ul li{list-style-type:square}.settings-markdown[data-v-652eb552] blockquote{padding-left:1em;border-left:4px solid var(--color-primary-element);color:var(--color-text-maxcontrast);margin-left:0;margin-right:0}","",{version:3,sources:["webpack://./apps/settings/src/components/Markdown.vue"],names:[],mappings:"AAgHA,0OAMC,eAAA,CACA,gBAAA,CACA,eAAA,CACA,kBAAA,CACA,4BAAA,CAGD,uCACC,cAAA,CACA,eAAA,CAGD,uCACC,cAAA,CACA,eAAA,CAGD,uCACC,cAAA,CAGD,uCACC,cAAA,CAGD,uCACC,cAAA,CAGD,uCACC,kCAAA,CAGD,wCACC,eAAA,CACA,eAAA,CACA,6CAAA,CACA,kCAAA,CACA,iBAAA,CACA,iBAAA,CAGD,2CACC,6CAAA,CACA,kCAAA,CACA,iBAAA,CAGD,uCACC,iBAAA,CAGD,8EACC,iBAAA,CACA,gBAAA,CAGD,0CACC,oBAAA,CAGD,gDACC,sBAAA,CAGD,sDACC,sBAAA,CAGD,+CACC,gBAAA,CACA,kDAAA,CACA,mCAAA,CACA,aAAA,CACA,cAAA",sourcesContent:["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.settings-markdown::v-deep {\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n\tfont-weight: 600;\n\tline-height: 120%;\n\tmargin-top: 24px;\n\tmargin-bottom: 12px;\n\tcolor: var(--color-main-text);\n}\n\nh1 {\n\tfont-size: 36px;\n\tmargin-top: 48px;\n}\n\nh2 {\n\tfont-size: 28px;\n\tmargin-top: 48px;\n}\n\nh3 {\n\tfont-size: 24px;\n}\n\nh4 {\n\tfont-size: 21px;\n}\n\nh5 {\n\tfont-size: 17px;\n}\n\nh6 {\n\tfont-size: var(--default-font-size);\n}\n\npre {\n\twhite-space: pre;\n\toverflow-x: auto;\n\tbackground-color: var(--color-background-dark);\n\tborder-radius: var(--border-radius);\n\tpadding: 1em 1.3em;\n\tmargin-bottom: 1em;\n}\n\np code {\n\tbackground-color: var(--color-background-dark);\n\tborder-radius: var(--border-radius);\n\tpadding: .1em .3em;\n}\n\nli {\n\tposition: relative;\n}\n\nul, ol {\n\tpadding-left: 10px;\n\tmargin-left: 10px;\n}\n\nul li {\n\tlist-style-type: disc;\n}\n\nul > li > ul > li {\n\tlist-style-type: circle;\n}\n\nul > li > ul > li ul li {\n\tlist-style-type: square;\n}\n\nblockquote {\n\tpadding-left: 1em;\n\tborder-left: 4px solid var(--color-primary-element);\n\tcolor: var(--color-text-maxcontrast);\n\tmargin-left: 0;\n\tmargin-right: 0;\n}\n\n}\n"],sourceRoot:""}]),n.Z=r},57163:function(t,n,e){var a=e(87537),i=e.n(a),s=e(23645),r=e.n(s)()(i());r.push([t.id,".app-sidebar[data-v-d3244798]:not(.app-sidebar--without-background) :not(.app-sidebar-header--compact) .app-sidebar-header__figure{background-size:cover}.app-sidebar[data-v-d3244798]:not(.app-sidebar--without-background) .app-sidebar-header--compact .app-sidebar-header__figure{background-size:32px;filter:invert(1)}.app-sidebar[data-v-d3244798] .app-sidebar-header__description .app-version{padding-left:10px}.app-sidebar[data-v-d3244798].app-sidebar--without-background .app-sidebar-header__figure{display:flex;align-items:center;justify-content:center}.app-sidebar[data-v-d3244798].app-sidebar--without-background .app-sidebar-header__figure--default-app-icon{width:32px;height:32px;background-size:32px}.app-sidebar[data-v-d3244798] .app-sidebar-header__desc .app-sidebar-header__subtitle{overflow:visible !important;height:auto;white-space:normal !important;line-height:16px}.app-sidebar[data-v-d3244798] .app-sidebar-header__action{margin:0 20px}.app-sidebar[data-v-d3244798] .app-sidebar-header__action input{margin:3px}.app-navigation[data-v-d3244798] button.app-navigation-toggle{top:8px;right:-8px}.app-sidebar-tabs__release h2[data-v-d3244798]{border-bottom:1px solid var(--color-border)}.app-sidebar-tabs__release[data-v-d3244798] h3{font-size:20px}.app-sidebar-tabs__release[data-v-d3244798] h4{font-size:17px}","",{version:3,sources:["webpack://./apps/settings/src/views/Apps.vue"],names:[],mappings:"AA2TE,mIACC,qBAAA,CAGD,6HACC,oBAAA,CAEA,gBAAA,CAKD,4EACC,iBAAA,CAMD,0FACC,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,4GACC,UAAA,CACA,WAAA,CACA,oBAAA,CAQF,sFACC,2BAAA,CACA,WAAA,CACA,6BAAA,CACA,gBAAA,CAIF,0DAEC,aAAA,CACA,gEACC,UAAA,CAMH,8DACC,OAAA,CACA,UAAA,CAIA,+CACC,2CAAA,CAKA,gDACC,cAAA,CAED,gDACC,cAAA",sourcesContent:["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.app-sidebar::v-deep {\n\t&:not(.app-sidebar--without-background) {\n\t\t// with full screenshot, let's fill the figure\n\t\t:not(.app-sidebar-header--compact) .app-sidebar-header__figure {\n\t\t\tbackground-size: cover;\n\t\t}\n\t\t// revert sidebar app icon so it is black\n\t\t.app-sidebar-header--compact .app-sidebar-header__figure {\n\t\t\tbackground-size: 32px;\n\n\t\t\tfilter: invert(1);\n\t\t}\n\t}\n\n\t.app-sidebar-header__description {\n\t\t.app-version {\n\t\t\tpadding-left: 10px;\n\t\t}\n\t}\n\n\t// default icon slot styling\n\t&.app-sidebar--without-background {\n\t\t.app-sidebar-header__figure {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\t&--default-app-icon {\n\t\t\t\twidth: 32px;\n\t\t\t\theight: 32px;\n\t\t\t\tbackground-size: 32px;\n\t\t\t}\n\t\t}\n\t}\n\n\t// TODO: migrate to components\n\t.app-sidebar-header__desc {\n\t\t// allow multi line subtitle for the license\n\t\t.app-sidebar-header__subtitle {\n\t\t\toverflow: visible !important;\n\t\t\theight: auto;\n\t\t\twhite-space: normal !important;\n\t\t\tline-height: 16px;\n\t\t}\n\t}\n\n\t.app-sidebar-header__action {\n\t\t// align with tab content\n\t\tmargin: 0 20px;\n\t\tinput {\n\t\t\tmargin: 3px;\n\t\t}\n\t}\n}\n\n// Align the appNavigation toggle with the apps header toolbar\n.app-navigation::v-deep button.app-navigation-toggle {\n\ttop: 8px;\n\tright: -8px;\n}\n\n.app-sidebar-tabs__release {\n\th2 {\n\t\tborder-bottom: 1px solid var(--color-border);\n\t}\n\n\t// Overwrite changelog heading styles\n\t::v-deep {\n\t\th3 {\n\t\t\tfont-size: 20px;\n\t\t}\n\t\th4 {\n\t\t\tfont-size: 17px;\n\t\t}\n\t}\n}\n"],sourceRoot:""}]),n.Z=r},12635:function(t,n,e){var a=e(87537),i=e.n(a),s=e(23645),r=e.n(s)()(i());r.push([t.id,"\n.force[data-v-06bcd5b6] {\n\tbackground: var(--color-main-background);\n\tborder-color: var(--color-error);\n\tcolor: var(--color-error);\n}\n.force[data-v-06bcd5b6]:hover,\n.force[data-v-06bcd5b6]:active {\n\tbackground: var(--color-error);\n\tborder-color: var(--color-error) !important;\n\tcolor: var(--color-main-background);\n}\n","",{version:3,sources:["webpack://./apps/settings/src/components/AppList/AppItem.vue"],names:[],mappings:";AAmLA;CACA,wCAAA;CACA,gCAAA;CACA,yBAAA;AACA;AACA;;CAEA,8BAAA;CACA,2CAAA;CACA,mCAAA;AACA",sourcesContent:['\x3c!--\n - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n --\x3e\n\n<template>\n\t<div class="section" :class="{ selected: isSelected }" @click="showAppDetails">\n\t\t<div class="app-image app-image-icon" @click="showAppDetails">\n\t\t\t<div v-if="(listView && !app.preview) || (!listView && !screenshotLoaded)" class="icon-settings-dark" />\n\n\t\t\t<svg v-else-if="listView && app.preview"\n\t\t\t\twidth="32"\n\t\t\t\theight="32"\n\t\t\t\tviewBox="0 0 32 32">\n\t\t\t\t<defs><filter :id="filterId"><feColorMatrix in="SourceGraphic" type="matrix" values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0" /></filter></defs>\n\t\t\t\t<image x="0"\n\t\t\t\t\ty="0"\n\t\t\t\t\twidth="32"\n\t\t\t\t\theight="32"\n\t\t\t\t\tpreserveAspectRatio="xMinYMin meet"\n\t\t\t\t\t:filter="filterUrl"\n\t\t\t\t\t:xlink:href="app.preview"\n\t\t\t\t\tclass="app-icon" />\n\t\t\t</svg>\n\n\t\t\t<img v-if="!listView && app.screenshot && screenshotLoaded" :src="app.screenshot" width="100%">\n\t\t</div>\n\t\t<div class="app-name" @click="showAppDetails">\n\t\t\t{{ app.name }}\n\t\t</div>\n\t\t<div v-if="!listView" class="app-summary">\n\t\t\t{{ app.summary }}\n\t\t</div>\n\t\t<div v-if="listView" class="app-version">\n\t\t\t<span v-if="app.version">{{ app.version }}</span>\n\t\t\t<span v-else-if="app.appstoreData.releases[0].version">{{ app.appstoreData.releases[0].version }}</span>\n\t\t</div>\n\n\t\t<div class="app-level">\n\t\t\t<span v-if="app.level === 300"\n\t\t\t\tv-tooltip.auto="t(\'settings\', \'This app is supported via your current Nextcloud subscription.\')"\n\t\t\t\tclass="supported icon-checkmark-color">\n\t\t\t\t{{ t(\'settings\', \'Supported\') }}</span>\n\t\t\t<span v-if="app.level === 200"\n\t\t\t\tv-tooltip.auto="t(\'settings\', \'Featured apps are developed by and within the community. They offer central functionality and are ready for production use.\')"\n\t\t\t\tclass="official icon-checkmark">\n\t\t\t\t{{ t(\'settings\', \'Featured\') }}</span>\n\t\t\t<AppScore v-if="hasRating && !listView" :score="app.score" />\n\t\t</div>\n\n\t\t<div class="actions">\n\t\t\t<div v-if="app.error" class="warning">\n\t\t\t\t{{ app.error }}\n\t\t\t</div>\n\t\t\t<div v-if="isLoading" class="icon icon-loading-small" />\n\t\t\t<input v-if="app.update"\n\t\t\t\tclass="update primary"\n\t\t\t\ttype="button"\n\t\t\t\t:value="t(\'settings\', \'Update to {update}\', {update:app.update})"\n\t\t\t\t:disabled="installing || isLoading"\n\t\t\t\t@click.stop="update(app.id)">\n\t\t\t<input v-if="app.canUnInstall"\n\t\t\t\tclass="uninstall"\n\t\t\t\ttype="button"\n\t\t\t\t:value="t(\'settings\', \'Remove\')"\n\t\t\t\t:disabled="installing || isLoading"\n\t\t\t\t@click.stop="remove(app.id)">\n\t\t\t<input v-if="app.active"\n\t\t\t\tclass="enable"\n\t\t\t\ttype="button"\n\t\t\t\t:value="t(\'settings\',\'Disable\')"\n\t\t\t\t:disabled="installing || isLoading"\n\t\t\t\t@click.stop="disable(app.id)">\n\t\t\t<input v-if="!app.active && (app.canInstall || app.isCompatible)"\n\t\t\t\tv-tooltip.auto="enableButtonTooltip"\n\t\t\t\tclass="enable"\n\t\t\t\ttype="button"\n\t\t\t\t:value="enableButtonText"\n\t\t\t\t:disabled="!app.canInstall || installing || isLoading"\n\t\t\t\t@click.stop="enable(app.id)">\n\t\t\t<input v-else-if="!app.active"\n\t\t\t\tv-tooltip.auto="forceEnableButtonTooltip"\n\t\t\t\tclass="enable force"\n\t\t\t\ttype="button"\n\t\t\t\t:value="forceEnableButtonText"\n\t\t\t\t:disabled="installing || isLoading"\n\t\t\t\t@click.stop="forceEnable(app.id)">\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport AppScore from \'./AppScore\'\nimport AppManagement from \'../../mixins/AppManagement\'\nimport SvgFilterMixin from \'../SvgFilterMixin\'\n\nexport default {\n\tname: \'AppItem\',\n\tcomponents: {\n\t\tAppScore,\n\t},\n\tmixins: [AppManagement, SvgFilterMixin],\n\tprops: {\n\t\tapp: {},\n\t\tcategory: {},\n\t\tlistView: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisSelected: false,\n\t\t\tscrolled: false,\n\t\t\tscreenshotLoaded: false,\n\t\t}\n\t},\n\tcomputed: {\n\t\thasRating() {\n\t\t\treturn this.app.appstoreData && this.app.appstoreData.ratingNumOverall > 5\n\t\t},\n\t},\n\twatch: {\n\t\t\'$route.params.id\'(id) {\n\t\t\tthis.isSelected = (this.app.id === id)\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.isSelected = (this.app.id === this.$route.params.id)\n\t\tif (this.app.releases && this.app.screenshot) {\n\t\t\tconst image = new Image()\n\t\t\timage.onload = (e) => {\n\t\t\t\tthis.screenshotLoaded = true\n\t\t\t}\n\t\t\timage.src = this.app.screenshot\n\t\t}\n\t},\n\twatchers: {\n\n\t},\n\tmethods: {\n\t\tasync showAppDetails(event) {\n\t\t\tif (event.currentTarget.tagName === \'INPUT\' || event.currentTarget.tagName === \'A\') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait this.$router.push({\n\t\t\t\t\tname: \'apps-details\',\n\t\t\t\t\tparams: { category: this.category, id: this.app.id },\n\t\t\t\t})\n\t\t\t} catch (e) {\n\t\t\t\t// we already view this app\n\t\t\t}\n\t\t},\n\t\tprefix(prefix, content) {\n\t\t\treturn prefix + \'_\' + content\n\t\t},\n\t},\n}\n<\/script>\n\n<style scoped>\n\t.force {\n\t\tbackground: var(--color-main-background);\n\t\tborder-color: var(--color-error);\n\t\tcolor: var(--color-error);\n\t}\n\t.force:hover,\n\t.force:active {\n\t\tbackground: var(--color-error);\n\t\tborder-color: var(--color-error) !important;\n\t\tcolor: var(--color-main-background);\n\t}\n</style>\n'],sourceRoot:""}]),n.Z=r},77538:function(n,e,a){a.r(e),a.d(e,{default:function(){return mt}});var i=a(74854),s=a(20144),r=a(87369),o=a.n(r),p=a(23068),l=a.n(p),c=a(58908),d=a.n(c),u=a(50753),h=a.n(u),g=a(7612),v=a.n(g),A=a(6862),f=a.n(A),m=a(27801),b=a.n(m),C=a(47092),_=a.n(C),y=a(9597),w=a.n(y),k=a(79753),x={name:"AppScore",props:["score"],computed:{scoreImage:function(){var t="rating/s"+Math.round(10*this.score)+".svg";return(0,k.imagePath)("core",t)}}},D=a(51900),T=(0,D.Z)(x,(function(){var t=this,n=t.$createElement;return(t._self._c||n)("img",{staticClass:"app-score-image",attrs:{src:t.scoreImage}})}),[],!1,null,null,null).exports,S=a(26932),B=a(4820),L=function(){return B.default.get((0,k.generateOcsUrl)("core/navigation",2)+"/apps?format=json").then((function(t){var n=t.data;if(200===n.ocs.meta.statuscode){var e={},a=n.ocs.data,i=document.querySelector("#navigation #apps ul");a.forEach((function(t){i.querySelector('li[data-id="'+t.id+'"]')||(e[t.id]=!0)})),i.querySelectorAll("li[data-id]").forEach((function(t,n){var e=t.dataset.id;(!a[n]||a[n]&&a[n].id!==e)&&(t.remove(),document.querySelector("#appmenu li[data-id=".concat(e,"]")).remove())}));var s={};a.forEach((function(t){if(null===i.querySelector('li[data-id="'.concat(t.id,'"]'))){var n=document.createElement("li");n.dataset.id=t.id;var a='<svg width="20" height="20" viewBox="0 0 20 20" alt="">\n\t\t\t\t\t <defs>\n\t\t\t\t\t <filter id="invertMenuMore-'.concat(t.id,'"><feColorMatrix in="SourceGraphic" type="matrix" values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"></feColorMatrix></filter>\n\t\t\t\t\t <mask id="hole">\n\t\t\t\t\t <rect width="100%" height="100%" fill="white"></rect>\n\t\t\t\t\t\t<circle r="4.5" cx="17" cy="3" fill="black"></circle>\n\t\t\t\t\t </mask>\n\t\t\t\t\t </defs>\n\t\t\t\t\t <image x="0" y="0" width="16" height="16" filter="url(#invertMenuMore-').concat(t.id,')" preserveAspectRatio="xMinYMin meet" xlink:href="').concat(t.icon,'" class="app-icon" />\n\t\t\t\t\t</svg>'),r=document.createElement("template");r.innerHTML=a;var o=document.createElement("a");o.setAttribute("href",t.href);var p=document.createElement("span");p.appendChild(document.createTextNode(t.name));var l=document.createElement("div");l.setAttribute("class","unread-counter"),l.style.display="none",e[t.id]&&o.classList.add("animated"),o.prepend(r.content.firstChild,l,p),n.append(o);var c=document.querySelector("#navigation li[data-id=".concat(s.id,"]"));c?c.insertAdjacentElement("afterend",n):document.querySelector("#navigation #apps ul").prepend(n)}if(null===document.getElementById("appmenu").querySelector('li[data-id="'.concat(t.id,'"]'))){var d,u=document.createElement("li");u.dataset.id=t.id,d=OCA.Theming&&OCA.Theming.inverted?'<svg width="20" height="20" viewBox="0 0 20 20" alt="">\n\t\t\t\t\t\t <defs>\n\t\t\t\t\t\t <filter id="invert"><feColorMatrix in="SourceGraphic" type="matrix" values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0" /></filter>\n\t\t\t\t\t\t </defs>\n\t\t\t\t\t\t <image x="0" y="0" width="20" height="20" preserveAspectRatio="xMinYMin meet" filter="url(#invert)" xlink:href="'.concat(t.icon,'" class="app-icon" />\n\t\t\t\t\t\t</svg>'):'<svg width="20" height="20" viewBox="0 0 20 20" alt="">\n\t\t\t\t\t\t <image x="0" y="0" width="20" height="20" preserveAspectRatio="xMinYMin meet" xlink:href="'.concat(t.icon,'" class="app-icon" />\n\t\t\t\t\t\t</svg>');var h=document.createElement("template");h.innerHTML=d;var g=document.createElement("a");g.setAttribute("href",t.href);var v=document.createElement("span");v.appendChild(document.createTextNode(t.name));var A=document.createElement("div");A.setAttribute("class","icon-loading-dark"),A.style.display="none",e[t.id]&&g.classList.add("animated"),g.prepend(A,v,h.content.firstChild),u.append(g);var f=document.querySelector("#appmenu li[data-id="+s.id+"]");f?f.insertAdjacentElement("afterend",u):document.queryElementById("appmenu").prepend(u)}s=t})),window.dispatchEvent(new Event("resize"))}}))},I={computed:{appGroups:function(){return this.app.groups.map((function(t){return{id:t,name:t}}))},installing:function(){return this.$store.getters.loading("install")},isLoading:function(){return this.app&&this.$store.getters.loading(this.app.id)},enableButtonText:function(){return this.app.needsDownload?t("settings","Download and enable"):t("settings","Enable")},forceEnableButtonText:function(){return this.app.needsDownload,t("settings","Enable untested app")},enableButtonTooltip:function(){return!!this.app.needsDownload&&t("settings","The app will be downloaded from the App Store")},forceEnableButtonTooltip:function(){var n=t("settings","This app is not marked as compatible with your Nextcloud version. If you continue you will still be able to install the app. Note that the app might not work as expected.");return this.app.needsDownload?n+" "+t("settings","The app will be downloaded from the App Store"):n}},data:function(){return{groupCheckedAppsData:!1}},mounted:function(){this.app&&this.app.groups&&this.app.groups.length>0&&(this.groupCheckedAppsData=!0)},methods:{asyncFindGroup:function(t){return this.$store.dispatch("getGroups",{search:t,limit:5,offset:0})},isLimitedToGroups:function(t){return!(!this.app.groups.length&&!this.groupCheckedAppsData)},setGroupLimit:function(){this.groupCheckedAppsData||this.$store.dispatch("enableApp",{appId:this.app.id,groups:[]})},canLimitToGroups:function(t){return!(t.types&&t.types.includes("filesystem")||t.types.includes("prelogin")||t.types.includes("authentication")||t.types.includes("logging")||t.types.includes("prevent_group_restriction"))},addGroupLimitation:function(t){var n=this.app.groups.concat([]).concat([t.id]);this.$store.dispatch("enableApp",{appId:this.app.id,groups:n})},removeGroupLimitation:function(t){var n=this.app.groups.concat([]),e=n.indexOf(t.id);e>-1&&n.splice(e,1),this.$store.dispatch("enableApp",{appId:this.app.id,groups:n})},forceEnable:function(t){this.$store.dispatch("forceEnableApp",{appId:t,groups:[]}).then((function(t){L()})).catch((function(t){(0,S.x2)(t)}))},enable:function(t){this.$store.dispatch("enableApp",{appId:t,groups:[]}).then((function(t){L()})).catch((function(t){(0,S.x2)(t)}))},disable:function(t){this.$store.dispatch("disableApp",{appId:t}).then((function(t){L()})).catch((function(t){(0,S.x2)(t)}))},remove:function(t){this.$store.dispatch("uninstallApp",{appId:t}).then((function(t){L()})).catch((function(t){(0,S.x2)(t)}))},install:function(t){this.$store.dispatch("enableApp",{appId:t}).then((function(t){L()})).catch((function(t){(0,S.x2)(t)}))},update:function(t){this.$store.dispatch("updateApp",{appId:t}).then((function(t){L()})).catch((function(t){(0,S.x2)(t)}))}}},E={name:"SvgFilterMixin",data:function(){return{filterId:""}},computed:{filterUrl:function(){return"url(#".concat(this.filterId,")")}},mounted:function(){this.filterId="invertIconApps"+Math.floor(100*Math.random())+(new Date).getSeconds()+(new Date).getMilliseconds()}};function N(t,n,e,a,i,s,r){try{var o=t[s](r),p=o.value}catch(t){return void e(t)}o.done?n(p):Promise.resolve(p).then(a,i)}var M={name:"AppItem",components:{AppScore:T},mixins:[I,(0,D.Z)(E,void 0,void 0,!1,null,null,null).exports],props:{app:{},category:{},listView:{type:Boolean,default:!0}},data:function(){return{isSelected:!1,scrolled:!1,screenshotLoaded:!1}},computed:{hasRating:function(){return this.app.appstoreData&&this.app.appstoreData.ratingNumOverall>5}},watch:{"$route.params.id":function(t){this.isSelected=this.app.id===t}},mounted:function(){var t=this;if(this.isSelected=this.app.id===this.$route.params.id,this.app.releases&&this.app.screenshot){var n=new Image;n.onload=function(n){t.screenshotLoaded=!0},n.src=this.app.screenshot}},watchers:{},methods:{showAppDetails:function(t){var n,e=this;return(n=regeneratorRuntime.mark((function n(){return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if("INPUT"!==t.currentTarget.tagName&&"A"!==t.currentTarget.tagName){n.next=2;break}return n.abrupt("return");case 2:return n.prev=2,n.next=5,e.$router.push({name:"apps-details",params:{category:e.category,id:e.app.id}});case 5:n.next=9;break;case 7:n.prev=7,n.t0=n.catch(2);case 9:case"end":return n.stop()}}),n,null,[[2,7]])})),function(){var t=this,e=arguments;return new Promise((function(a,i){var s=n.apply(t,e);function r(t){N(s,a,i,r,o,"next",t)}function o(t){N(s,a,i,r,o,"throw",t)}r(void 0)}))})()},prefix:function(t,n){return t+"_"+n}}},G=M,$=a(93379),U=a.n($),R=a(7795),V=a.n(R),Z=a(90569),z=a.n(Z),O=a(3565),F=a.n(O),P=a(19216),q=a.n(P),Y=a(44589),H=a.n(Y),j=a(12635),Q={};Q.styleTagTransform=H(),Q.setAttributes=F(),Q.insert=z().bind(null,"head"),Q.domAPI=V(),Q.insertStyleElement=q(),U()(j.Z,Q),j.Z&&j.Z.locals&&j.Z.locals;var W=(0,D.Z)(G,(function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("div",{staticClass:"section",class:{selected:t.isSelected},on:{click:t.showAppDetails}},[e("div",{staticClass:"app-image app-image-icon",on:{click:t.showAppDetails}},[t.listView&&!t.app.preview||!t.listView&&!t.screenshotLoaded?e("div",{staticClass:"icon-settings-dark"}):t.listView&&t.app.preview?e("svg",{attrs:{width:"32",height:"32",viewBox:"0 0 32 32"}},[e("defs",[e("filter",{attrs:{id:t.filterId}},[e("feColorMatrix",{attrs:{in:"SourceGraphic",type:"matrix",values:"-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"}})],1)]),t._v(" "),e("image",{staticClass:"app-icon",attrs:{x:"0",y:"0",width:"32",height:"32",preserveAspectRatio:"xMinYMin meet",filter:t.filterUrl,"xlink:href":t.app.preview}})]):t._e(),t._v(" "),!t.listView&&t.app.screenshot&&t.screenshotLoaded?e("img",{attrs:{src:t.app.screenshot,width:"100%"}}):t._e()]),t._v(" "),e("div",{staticClass:"app-name",on:{click:t.showAppDetails}},[t._v("\n\t\t"+t._s(t.app.name)+"\n\t")]),t._v(" "),t.listView?t._e():e("div",{staticClass:"app-summary"},[t._v("\n\t\t"+t._s(t.app.summary)+"\n\t")]),t._v(" "),t.listView?e("div",{staticClass:"app-version"},[t.app.version?e("span",[t._v(t._s(t.app.version))]):t.app.appstoreData.releases[0].version?e("span",[t._v(t._s(t.app.appstoreData.releases[0].version))]):t._e()]):t._e(),t._v(" "),e("div",{staticClass:"app-level"},[300===t.app.level?e("span",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.t("settings","This app is supported via your current Nextcloud subscription."),expression:"t('settings', 'This app is supported via your current Nextcloud subscription.')",modifiers:{auto:!0}}],staticClass:"supported icon-checkmark-color"},[t._v("\n\t\t\t"+t._s(t.t("settings","Supported")))]):t._e(),t._v(" "),200===t.app.level?e("span",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.t("settings","Featured apps are developed by and within the community. They offer central functionality and are ready for production use."),expression:"t('settings', 'Featured apps are developed by and within the community. They offer central functionality and are ready for production use.')",modifiers:{auto:!0}}],staticClass:"official icon-checkmark"},[t._v("\n\t\t\t"+t._s(t.t("settings","Featured")))]):t._e(),t._v(" "),t.hasRating&&!t.listView?e("AppScore",{attrs:{score:t.app.score}}):t._e()],1),t._v(" "),e("div",{staticClass:"actions"},[t.app.error?e("div",{staticClass:"warning"},[t._v("\n\t\t\t"+t._s(t.app.error)+"\n\t\t")]):t._e(),t._v(" "),t.isLoading?e("div",{staticClass:"icon icon-loading-small"}):t._e(),t._v(" "),t.app.update?e("input",{staticClass:"update primary",attrs:{type:"button",value:t.t("settings","Update to {update}",{update:t.app.update}),disabled:t.installing||t.isLoading},on:{click:function(n){return n.stopPropagation(),t.update(t.app.id)}}}):t._e(),t._v(" "),t.app.canUnInstall?e("input",{staticClass:"uninstall",attrs:{type:"button",value:t.t("settings","Remove"),disabled:t.installing||t.isLoading},on:{click:function(n){return n.stopPropagation(),t.remove(t.app.id)}}}):t._e(),t._v(" "),t.app.active?e("input",{staticClass:"enable",attrs:{type:"button",value:t.t("settings","Disable"),disabled:t.installing||t.isLoading},on:{click:function(n){return n.stopPropagation(),t.disable(t.app.id)}}}):t._e(),t._v(" "),t.app.active||!t.app.canInstall&&!t.app.isCompatible?t.app.active?t._e():e("input",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.forceEnableButtonTooltip,expression:"forceEnableButtonTooltip",modifiers:{auto:!0}}],staticClass:"enable force",attrs:{type:"button",value:t.forceEnableButtonText,disabled:t.installing||t.isLoading},on:{click:function(n){return n.stopPropagation(),t.forceEnable(t.app.id)}}}):e("input",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.enableButtonTooltip,expression:"enableButtonTooltip",modifiers:{auto:!0}}],staticClass:"enable",attrs:{type:"button",value:t.enableButtonText,disabled:!t.app.canInstall||t.installing||t.isLoading},on:{click:function(n){return n.stopPropagation(),t.enable(t.app.id)}}})])])}),[],!1,null,"06bcd5b6",null).exports,J=(0,D.Z)({name:"PrefixMixin",methods:{prefix:function(t,n){return t+"_"+n}}},void 0,void 0,!1,null,null,null).exports,K=a(63560),X=a(1412),tt={name:"AppList",components:{AppItem:W,Button:a.n(X)()},mixins:[J],props:["category","app","search"],computed:{counter:function(){return this.apps.filter((function(t){return t.update})).length},loading:function(){return this.$store.getters.loading("list")},hasPendingUpdate:function(){return this.apps.filter((function(t){return t.update})).length>0},showUpdateAll:function(){return this.hasPendingUpdate&&this.useListView},apps:function(){var t=this,n=this.$store.getters.getAllApps.filter((function(n){return-1!==n.name.toLowerCase().search(t.search.toLowerCase())})).sort((function(t,n){var e=""+(t.active?0:1)+(t.update?0:1)+t.name,a=""+(n.active?0:1)+(n.update?0:1)+n.name;return OC.Util.naturalSortCompare(e,a)}));return"installed"===this.category?n.filter((function(t){return t.installed})):"enabled"===this.category?n.filter((function(t){return t.active&&t.installed})):"disabled"===this.category?n.filter((function(t){return!t.active&&t.installed})):"app-bundles"===this.category?n.filter((function(t){return t.bundles})):"updates"===this.category?n.filter((function(t){return t.update})):"featured"===this.category?n.filter((function(t){return 200===t.level})):n.filter((function(n){return n.appstore&&void 0!==n.category&&(n.category===t.category||n.category.indexOf(t.category)>-1)}))},bundles:function(){var t=this;return this.$store.getters.getServerData.bundles.filter((function(n){return t.bundleApps(n.id).length>0}))},bundleApps:function(){return function(t){return this.$store.getters.getAllApps.filter((function(n){return void 0!==n.bundleIds&&n.bundleIds.includes(t)}))}},searchApps:function(){var t=this;return""===this.search?[]:this.$store.getters.getAllApps.filter((function(n){return-1!==n.name.toLowerCase().search(t.search.toLowerCase())&&!t.apps.find((function(t){return t.id===n.id}))}))},useAppStoreView:function(){return!this.useListView&&!this.useBundleView},useListView:function(){return"installed"===this.category||"enabled"===this.category||"disabled"===this.category||"updates"===this.category||"featured"===this.category},useBundleView:function(){return"app-bundles"===this.category},allBundlesEnabled:function(){var t=this;return function(n){return 0===t.bundleApps(n).filter((function(t){return!t.active})).length}},bundleToggleText:function(){var n=this;return function(e){return n.allBundlesEnabled(e)?t("settings","Disable all"):t("settings","Enable all")}}},methods:{toggleBundle:function(t){return this.allBundlesEnabled(t)?this.disableBundle(t):this.enableBundle(t)},enableBundle:function(t){var n=this.bundleApps(t).map((function(t){return t.id}));this.$store.dispatch("enableApp",{appId:n,groups:[]}).catch((function(t){console.error(t),OC.Notification.show(t)}))},disableBundle:function(t){var n=this.bundleApps(t).map((function(t){return t.id}));this.$store.dispatch("disableApp",{appId:n,groups:[]}).catch((function(t){OC.Notification.show(t)}))},updateAll:function(){var t=this,n=(0,K.Z)(1);this.apps.filter((function(t){return t.update})).map((function(e){return n((function(){return t.$store.dispatch("updateApp",{appId:e.id})}))}))}}},nt=(0,D.Z)(tt,(function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("div",{attrs:{id:"app-content-inner"}},[e("div",{staticClass:"apps-list",class:{installed:t.useBundleView||t.useListView,store:t.useAppStoreView},attrs:{id:"apps-list"}},[t.useListView?[t.showUpdateAll?e("div",{staticClass:"toolbar"},[t._v("\n\t\t\t\t"+t._s(t.n("settings","%n app has an update available","%n apps have an update available",t.counter))+"\n\t\t\t\t"),t.showUpdateAll?e("Button",{attrs:{id:"app-list-update-all",type:"primary"},on:{click:t.updateAll}},[t._v("\n\t\t\t\t\t"+t._s(t.n("settings","Update","Update all",t.counter))+"\n\t\t\t\t")]):t._e()],1):t._e(),t._v(" "),t.showUpdateAll?t._e():e("div",{staticClass:"toolbar"},[t._v("\n\t\t\t\t"+t._s(t.t("settings","All apps are up-to-date."))+"\n\t\t\t")]),t._v(" "),e("transition-group",{staticClass:"apps-list-container",attrs:{name:"app-list",tag:"div"}},t._l(t.apps,(function(n){return e("AppItem",{key:n.id,attrs:{app:n,category:t.category}})})),1)]:t._e(),t._v(" "),t.useBundleView?e("transition-group",{staticClass:"apps-list-container",attrs:{name:"app-list",tag:"div"}},[t._l(t.bundles,(function(n){return[e("div",{key:n.id,staticClass:"apps-header"},[e("div",{staticClass:"app-image"}),t._v(" "),e("h2",[t._v(t._s(n.name)+" "),e("input",{attrs:{type:"button",value:t.bundleToggleText(n.id)},on:{click:function(e){return t.toggleBundle(n.id)}}})]),t._v(" "),e("div",{staticClass:"app-version"}),t._v(" "),e("div",{staticClass:"app-level"}),t._v(" "),e("div",{staticClass:"app-groups"}),t._v(" "),e("div",{staticClass:"actions"},[t._v("\n\t\t\t\t\t\t \n\t\t\t\t\t")])]),t._v(" "),t._l(t.bundleApps(n.id),(function(a){return e("AppItem",{key:n.id+a.id,attrs:{app:a,category:t.category}})}))]}))],2):t._e(),t._v(" "),t.useAppStoreView?t._l(t.apps,(function(n){return e("AppItem",{key:n.id,attrs:{app:n,category:t.category,"list-view":!1}})})):t._e()],2),t._v(" "),e("div",{staticClass:"apps-list installed",attrs:{id:"apps-list-search"}},[e("div",{staticClass:"apps-list-container"},[""!==t.search&&t.searchApps.length>0?[e("div",{staticClass:"section"},[e("div"),t._v(" "),e("td",{attrs:{colspan:"5"}},[e("h2",[t._v(t._s(t.t("settings","Results from other categories")))])])]),t._v(" "),t._l(t.searchApps,(function(n){return e("AppItem",{key:n.id,attrs:{app:n,category:t.category,"list-view":!0}})}))]:t._e()],2)]),t._v(" "),""===t.search||t.loading||0!==t.searchApps.length||0!==t.apps.length?t._e():e("div",{staticClass:"emptycontent emptycontent-search",attrs:{id:"apps-list-empty"}},[e("div",{staticClass:"icon-settings-dark",attrs:{id:"app-list-empty-icon"}}),t._v(" "),e("h2",[t._v(t._s(t.t("settings","No apps found for your version")))])]),t._v(" "),e("div",{attrs:{id:"searchresults"}})])}),[],!1,null,null,null).exports,et=a(7811),at=a.n(et),it=a(87441),st=a(27856),rt=a.n(st),ot={name:"Markdown",props:{text:{type:String,default:""}},computed:{renderMarkdown:function(){var t=new it.TU.Renderer;return t.link=function(t,n,e){var a;try{a=decodeURIComponent(unescape(t)).replace(/[^\w:]/g,"").toLowerCase()}catch(t){return""}if(0!==a.indexOf("http:")&&0!==a.indexOf("https:"))return"";var i='<a href="'+t+'" rel="noreferrer noopener"';return n&&(i+=' title="'+n+'"'),i+">"+e+"</a>"},t.image=function(t,n,e){return e||n},t.blockquote=function(t){return t},rt().sanitize((0,it.TU)(this.text.trim(),{renderer:t,gfm:!1,highlight:!1,tables:!1,breaks:!1,pedantic:!1,sanitize:!0,smartLists:!0,smartypants:!1}),{SAFE_FOR_JQUERY:!0,ALLOWED_TAGS:["h1","h2","h3","h4","h5","h6","strong","p","a","ul","ol","li","em","del","blockquote"]})}}},pt=a(6578),lt={};lt.styleTagTransform=H(),lt.setAttributes=F(),lt.insert=z().bind(null,"head"),lt.domAPI=V(),lt.insertStyleElement=q(),U()(pt.Z,lt),pt.Z&&pt.Z.locals&&pt.Z.locals;var ct=(0,D.Z)(ot,(function(){var t=this,n=t.$createElement;return(t._self._c||n)("div",{staticClass:"settings-markdown",domProps:{innerHTML:t._s(t.renderMarkdown)}})}),[],!1,null,"652eb552",null).exports,dt={name:"AppDetails",components:{Multiselect:at(),Markdown:ct},mixins:[I,J],props:{app:{type:Object,required:!0}},data:function(){return{groupCheckedAppsData:!1}},computed:{appstoreUrl:function(){return"https://apps.nextcloud.com/apps/".concat(this.app.id)},licence:function(){return this.app.licence?t("settings","{license}-licensed",{license:(""+this.app.licence).toUpperCase()}):null},author:function(){return"string"==typeof this.app.author?[{"@value":this.app.author}]:this.app.author["@value"]?[this.app.author]:this.app.author},appGroups:function(){return this.app.groups.map((function(t){return{id:t,name:t}}))},groups:function(){return this.$store.getters.getGroups.filter((function(t){return"disabled"!==t.id})).sort((function(t,n){return t.name.localeCompare(n.name)}))}},mounted:function(){this.app.groups.length>0&&(this.groupCheckedAppsData=!0)}},ut=a(56934),ht={};ht.styleTagTransform=H(),ht.setAttributes=F(),ht.insert=z().bind(null,"head"),ht.domAPI=V(),ht.insertStyleElement=q(),U()(ut.Z,ht),ut.Z&&ut.Z.locals&&ut.Z.locals;var gt=(0,D.Z)(dt,(function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("div",{staticClass:"app-details"},[e("div",{staticClass:"app-details__actions"},[t.app.active&&t.canLimitToGroups(t.app)?e("div",{staticClass:"app-details__actions-groups"},[e("input",{directives:[{name:"model",rawName:"v-model",value:t.groupCheckedAppsData,expression:"groupCheckedAppsData"}],staticClass:"groups-enable__checkbox checkbox",attrs:{id:t.prefix("groups_enable",t.app.id),type:"checkbox"},domProps:{value:t.app.id,checked:Array.isArray(t.groupCheckedAppsData)?t._i(t.groupCheckedAppsData,t.app.id)>-1:t.groupCheckedAppsData},on:{change:[function(n){var e=t.groupCheckedAppsData,a=n.target,i=!!a.checked;if(Array.isArray(e)){var s=t.app.id,r=t._i(e,s);a.checked?r<0&&(t.groupCheckedAppsData=e.concat([s])):r>-1&&(t.groupCheckedAppsData=e.slice(0,r).concat(e.slice(r+1)))}else t.groupCheckedAppsData=i},t.setGroupLimit]}}),t._v(" "),e("label",{attrs:{for:t.prefix("groups_enable",t.app.id)}},[t._v(t._s(t.t("settings","Limit to groups")))]),t._v(" "),e("input",{staticClass:"group_select",attrs:{type:"hidden",title:t.t("settings","All"),value:""}}),t._v(" "),t.isLimitedToGroups(t.app)?e("Multiselect",{staticClass:"multiselect-vue",attrs:{options:t.groups,value:t.appGroups,"options-limit":5,placeholder:t.t("settings","Limit app usage to groups"),label:"name","track-by":"id",multiple:!0,"close-on-select":!1,"tag-width":60},on:{select:t.addGroupLimitation,remove:t.removeGroupLimitation,"search-change":t.asyncFindGroup}},[e("span",{attrs:{slot:"noResult"},slot:"noResult"},[t._v(t._s(t.t("settings","No results")))])]):t._e()],1):t._e(),t._v(" "),e("div",{staticClass:"app-details__actions-manage"},[t.app.update?e("input",{staticClass:"update primary",attrs:{type:"button",value:t.t("settings","Update to {version}",{version:t.app.update}),disabled:t.installing||t.isLoading},on:{click:function(n){return t.update(t.app.id)}}}):t._e(),t._v(" "),t.app.canUnInstall?e("input",{staticClass:"uninstall",attrs:{type:"button",value:t.t("settings","Remove"),disabled:t.installing||t.isLoading},on:{click:function(n){return t.remove(t.app.id)}}}):t._e(),t._v(" "),t.app.active?e("input",{staticClass:"enable",attrs:{type:"button",value:t.t("settings","Disable"),disabled:t.installing||t.isLoading},on:{click:function(n){return t.disable(t.app.id)}}}):t._e(),t._v(" "),t.app.active||!t.app.canInstall&&!t.app.isCompatible?t.app.active||t.app.canInstall?t._e():e("input",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.forceEnableButtonTooltip,expression:"forceEnableButtonTooltip",modifiers:{auto:!0}}],staticClass:"enable force",attrs:{type:"button",value:t.forceEnableButtonText,disabled:t.installing||t.isLoading},on:{click:function(n){return t.forceEnable(t.app.id)}}}):e("input",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.enableButtonTooltip,expression:"enableButtonTooltip",modifiers:{auto:!0}}],staticClass:"enable primary",attrs:{type:"button",value:t.enableButtonText,disabled:!t.app.canInstall||t.installing||t.isLoading},on:{click:function(n){return t.enable(t.app.id)}}})])]),t._v(" "),e("ul",{staticClass:"app-details__dependencies"},[t.app.missingMinOwnCloudVersion?e("li",[t._v("\n\t\t\t"+t._s(t.t("settings","This app has no minimum Nextcloud version assigned. This will be an error in the future."))+"\n\t\t")]):t._e(),t._v(" "),t.app.missingMaxOwnCloudVersion?e("li",[t._v("\n\t\t\t"+t._s(t.t("settings","This app has no maximum Nextcloud version assigned. This will be an error in the future."))+"\n\t\t")]):t._e(),t._v(" "),t.app.canInstall?t._e():e("li",[t._v("\n\t\t\t"+t._s(t.t("settings","This app cannot be installed because the following dependencies are not fulfilled:"))+"\n\t\t\t"),e("ul",{staticClass:"missing-dependencies"},t._l(t.app.missingDependencies,(function(n,a){return e("li",{key:a},[t._v("\n\t\t\t\t\t"+t._s(n)+"\n\t\t\t\t")])})),0)])]),t._v(" "),e("p",{staticClass:"app-details__documentation"},[t.app.internal?t._e():e("a",{staticClass:"appslink",attrs:{href:t.appstoreUrl,target:"_blank",rel:"noreferrer noopener"}},[t._v(t._s(t.t("settings","View in store"))+" ↗")]),t._v(" "),t.app.website?e("a",{staticClass:"appslink",attrs:{href:t.app.website,target:"_blank",rel:"noreferrer noopener"}},[t._v(t._s(t.t("settings","Visit website"))+" ↗")]):t._e(),t._v(" "),t.app.bugs?e("a",{staticClass:"appslink",attrs:{href:t.app.bugs,target:"_blank",rel:"noreferrer noopener"}},[t._v(t._s(t.t("settings","Report a bug"))+" ↗")]):t._e(),t._v(" "),t.app.documentation&&t.app.documentation.user?e("a",{staticClass:"appslink",attrs:{href:t.app.documentation.user,target:"_blank",rel:"noreferrer noopener"}},[t._v(t._s(t.t("settings","User documentation"))+" ↗")]):t._e(),t._v(" "),t.app.documentation&&t.app.documentation.admin?e("a",{staticClass:"appslink",attrs:{href:t.app.documentation.admin,target:"_blank",rel:"noreferrer noopener"}},[t._v(t._s(t.t("settings","Admin documentation"))+" ↗")]):t._e(),t._v(" "),t.app.documentation&&t.app.documentation.developer?e("a",{staticClass:"appslink",attrs:{href:t.app.documentation.developer,target:"_blank",rel:"noreferrer noopener"}},[t._v(t._s(t.t("settings","Developer documentation"))+" ↗")]):t._e()]),t._v(" "),e("Markdown",{staticClass:"app-details__description",attrs:{text:t.app.description}})],1)}),[],!1,null,"8ea5f476",null).exports;s.default.use(o());var vt={name:"Apps",components:{AppContent:l(),AppDetails:gt,AppList:nt,AppNavigation:d(),AppNavigationCounter:h(),AppNavigationItem:v(),AppNavigationSpacer:f(),AppScore:T,AppSidebar:b(),AppSidebarTab:_(),Content:w(),Markdown:ct},mixins:[I],props:{category:{type:String,default:"installed"},id:{type:String,default:""}},data:function(){return{searchQuery:"",screenshotLoaded:!1}},computed:{loading:function(){return this.$store.getters.loading("categories")},loadingList:function(){return this.$store.getters.loading("list")},app:function(){var t=this;return this.apps.find((function(n){return n.id===t.id}))},categories:function(){return this.$store.getters.getCategories},apps:function(){return this.$store.getters.getAllApps},updateCount:function(){return this.$store.getters.getUpdateCount},settings:function(){return this.$store.getters.getServerData},hasRating:function(){return this.app.appstoreData&&this.app.appstoreData.ratingNumOverall>5},appSidebar:function(){var n=function(t){return t["@value"]?t["@value"]:t},e=Array.isArray(this.app.author)?this.app.author.map(n).join(", "):n(this.app.author),a=t("settings","{license}-licensed",{license:(""+this.app.licence).toUpperCase()});return{subtitle:t("settings","by {author}\n{license}",{author:e,license:a}),background:this.app.screenshot&&this.screenshotLoaded?this.app.screenshot:this.app.preview,compact:!(this.app.screenshot&&this.screenshotLoaded),title:this.app.name}},changelog:function(){return function(t){return t.translations.en.changelog}}},watch:{category:function(){this.searchQuery=""},app:function(){var t,n,e=this;if(this.screenshotLoaded=!1,null!==(t=this.app)&&void 0!==t&&t.releases&&null!==(n=this.app)&&void 0!==n&&n.screenshot){var a=new Image;a.onload=function(t){e.screenshotLoaded=!0},a.src=this.app.screenshot}}},beforeMount:function(){this.$store.dispatch("getCategories"),this.$store.dispatch("getAllApps"),this.$store.dispatch("getGroups",{offset:0,limit:5}),this.$store.commit("setUpdateCount",this.$store.getters.getServerData.updateCount)},mounted:function(){(0,i.subscribe)("nextcloud:unified-search.search",this.setSearch),(0,i.subscribe)("nextcloud:unified-search.reset",this.resetSearch)},beforeDestroy:function(){(0,i.unsubscribe)("nextcloud:unified-search.search",this.setSearch),(0,i.unsubscribe)("nextcloud:unified-search.reset",this.resetSearch)},methods:{setSearch:function(t){var n=t.query;this.searchQuery=n},resetSearch:function(){this.searchQuery=""},hideAppDetails:function(){this.$router.push({name:"apps-category",params:{category:this.category}})},openDeveloperDocumentation:function(){window.open(this.settings.developerDocumentation)}}},At=a(57163),ft={};ft.styleTagTransform=H(),ft.setAttributes=F(),ft.insert=z().bind(null,"head"),ft.domAPI=V(),ft.insertStyleElement=q(),U()(At.Z,ft),At.Z&&At.Z.locals&&At.Z.locals;var mt=(0,D.Z)(vt,(function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("Content",{class:{"with-app-sidebar":t.app},attrs:{"app-name":"settings","content-class":{"icon-loading":t.loadingList},"navigation-class":{"icon-loading":t.loading}}},[e("AppNavigation",{scopedSlots:t._u([{key:"list",fn:function(){return[e("AppNavigationItem",{attrs:{id:"app-category-your-apps",to:{name:"apps"},exact:!0,icon:"icon-category-installed",title:t.t("settings","Your apps")}}),t._v(" "),e("AppNavigationItem",{attrs:{id:"app-category-enabled",to:{name:"apps-category",params:{category:"enabled"}},icon:"icon-category-enabled",title:t.t("settings","Active apps")}}),t._v(" "),e("AppNavigationItem",{attrs:{id:"app-category-disabled",to:{name:"apps-category",params:{category:"disabled"}},icon:"icon-category-disabled",title:t.t("settings","Disabled apps")}}),t._v(" "),t.updateCount>0?e("AppNavigationItem",{attrs:{id:"app-category-updates",to:{name:"apps-category",params:{category:"updates"}},icon:"icon-download",title:t.t("settings","Updates")}},[e("AppNavigationCounter",{attrs:{slot:"counter"},slot:"counter"},[t._v("\n\t\t\t\t\t"+t._s(t.updateCount)+"\n\t\t\t\t")])],1):t._e(),t._v(" "),e("AppNavigationItem",{attrs:{id:"app-category-your-bundles",to:{name:"apps-category",params:{category:"app-bundles"}},icon:"icon-category-app-bundles",title:t.t("settings","App bundles")}}),t._v(" "),e("AppNavigationSpacer"),t._v(" "),t.settings.appstoreEnabled?[e("AppNavigationItem",{attrs:{id:"app-category-featured",to:{name:"apps-category",params:{category:"featured"}},icon:"icon-favorite",title:t.t("settings","Featured apps")}}),t._v(" "),t._l(t.categories,(function(t){return e("AppNavigationItem",{key:"icon-category-"+t.ident,attrs:{icon:"icon-category-"+t.ident,to:{name:"apps-category",params:{category:t.ident}},title:t.displayName}})}))]:t._e(),t._v(" "),e("AppNavigationItem",{attrs:{id:"app-developer-docs",title:t.t("settings","Developer documentation")+" ↗"},on:{click:t.openDeveloperDocumentation}})]},proxy:!0}])}),t._v(" "),e("AppContent",{staticClass:"app-settings-content",class:{"icon-loading":t.loadingList}},[e("AppList",{attrs:{category:t.category,app:t.app,search:t.searchQuery}})],1),t._v(" "),t.id&&t.app?e("AppSidebar",t._b({class:{"app-sidebar--without-background":!t.appSidebar.background},on:{close:t.hideAppDetails},scopedSlots:t._u([t.appSidebar.background?null:{key:"header",fn:function(){return[e("div",{staticClass:"app-sidebar-header__figure--default-app-icon icon-settings-dark"})]},proxy:!0},{key:"description",fn:function(){return[300===t.app.level||200===t.app.level||t.hasRating?e("div",{staticClass:"app-level"},[300===t.app.level?e("span",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.t("settings","This app is supported via your current Nextcloud subscription."),expression:"t('settings', 'This app is supported via your current Nextcloud subscription.')",modifiers:{auto:!0}}],staticClass:"supported icon-checkmark-color"},[t._v("\n\t\t\t\t\t"+t._s(t.t("settings","Supported")))]):t._e(),t._v(" "),200===t.app.level?e("span",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.t("settings","Featured apps are developed by and within the community. They offer central functionality and are ready for production use."),expression:"t('settings', 'Featured apps are developed by and within the community. They offer central functionality and are ready for production use.')",modifiers:{auto:!0}}],staticClass:"official icon-checkmark"},[t._v("\n\t\t\t\t\t"+t._s(t.t("settings","Featured")))]):t._e(),t._v(" "),t.hasRating?e("AppScore",{attrs:{score:t.app.appstoreData.ratingOverall}}):t._e()],1):t._e(),t._v(" "),e("div",{staticClass:"app-version"},[e("p",[t._v(t._s(t.app.version))])])]},proxy:!0}],null,!0)},"AppSidebar",t.appSidebar,!1),[t._v(" "),t._v(" "),e("AppSidebarTab",{attrs:{id:"desc",icon:"icon-category-office",name:t.t("settings","Details"),order:0}},[e("AppDetails",{attrs:{app:t.app}})],1),t._v(" "),t.app.appstoreData&&t.app.releases[0].translations.en.changelog?e("AppSidebarTab",{attrs:{id:"desca",icon:"icon-category-organization",name:t.t("settings","Changelog"),order:1}},t._l(t.app.releases,(function(n){return e("div",{key:n.version,staticClass:"app-sidebar-tabs__release"},[e("h2",[t._v(t._s(n.version))]),t._v(" "),t.changelog(n)?e("Markdown",{attrs:{text:t.changelog(n)}}):t._e()],1)})),0):t._e()],1):t._e()],1)}),[],!1,null,"d3244798",null).exports}}]); -//# sourceMappingURL=settings-apps-view-7418.js.map?v=79a434bb85984935c596
\ No newline at end of file +"use strict";(self.webpackChunknextcloud=self.webpackChunknextcloud||[]).push([[7418],{56934:function(t,n,e){var a=e(87537),i=e.n(a),s=e(23645),r=e.n(s)()(i());r.push([t.id,".app-details[data-v-8ea5f476]{padding:20px}.app-details__actions-manage[data-v-8ea5f476]{display:flex}.app-details__actions-manage input[data-v-8ea5f476]{flex:0 1 auto;min-width:0;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.app-details__dependencies[data-v-8ea5f476]{opacity:.7}.app-details__documentation[data-v-8ea5f476]{padding-top:20px}.app-details__description[data-v-8ea5f476]{padding-top:20px}.force[data-v-8ea5f476]{color:var(--color-error);border-color:var(--color-error);background:var(--color-main-background)}.force[data-v-8ea5f476]:hover,.force[data-v-8ea5f476]:active{color:var(--color-main-background);border-color:var(--color-error) !important;background:var(--color-error)}","",{version:3,sources:["webpack://./apps/settings/src/components/AppDetails.vue"],names:[],mappings:"AAuNA,8BACC,YAAA,CAIC,8CAEC,YAAA,CACA,oDACC,aAAA,CACA,WAAA,CACA,sBAAA,CACA,kBAAA,CACA,eAAA,CAIH,4CACC,UAAA,CAED,6CACC,gBAAA,CAED,2CACC,gBAAA,CAIF,wBACC,wBAAA,CACA,+BAAA,CACA,uCAAA,CAED,6DAEC,kCAAA,CACA,0CAAA,CACA,6BAAA",sourcesContent:["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.app-details {\n\tpadding: 20px;\n\n\t&__actions {\n\t\t// app management\n\t\t&-manage {\n\t\t\t// if too many, shrink them and ellipsis\n\t\t\tdisplay: flex;\n\t\t\tinput {\n\t\t\t\tflex: 0 1 auto;\n\t\t\t\tmin-width: 0;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\t\t}\n\t}\n\t&__dependencies {\n\t\topacity: .7;\n\t}\n\t&__documentation {\n\t\tpadding-top: 20px;\n\t}\n\t&__description {\n\t\tpadding-top: 20px;\n\t}\n}\n\n.force {\n\tcolor: var(--color-error);\n\tborder-color: var(--color-error);\n\tbackground: var(--color-main-background);\n}\n.force:hover,\n.force:active {\n\tcolor: var(--color-main-background);\n\tborder-color: var(--color-error) !important;\n\tbackground: var(--color-error);\n}\n\n"],sourceRoot:""}]),n.Z=r},6578:function(t,n,e){var a=e(87537),i=e.n(a),s=e(23645),r=e.n(s)()(i());r.push([t.id,".settings-markdown[data-v-652eb552] h1,.settings-markdown[data-v-652eb552] h2,.settings-markdown[data-v-652eb552] h3,.settings-markdown[data-v-652eb552] h4,.settings-markdown[data-v-652eb552] h5,.settings-markdown[data-v-652eb552] h6{font-weight:600;line-height:120%;margin-top:24px;margin-bottom:12px;color:var(--color-main-text)}.settings-markdown[data-v-652eb552] h1{font-size:36px;margin-top:48px}.settings-markdown[data-v-652eb552] h2{font-size:28px;margin-top:48px}.settings-markdown[data-v-652eb552] h3{font-size:24px}.settings-markdown[data-v-652eb552] h4{font-size:21px}.settings-markdown[data-v-652eb552] h5{font-size:17px}.settings-markdown[data-v-652eb552] h6{font-size:var(--default-font-size)}.settings-markdown[data-v-652eb552] pre{white-space:pre;overflow-x:auto;background-color:var(--color-background-dark);border-radius:var(--border-radius);padding:1em 1.3em;margin-bottom:1em}.settings-markdown[data-v-652eb552] p code{background-color:var(--color-background-dark);border-radius:var(--border-radius);padding:.1em .3em}.settings-markdown[data-v-652eb552] li{position:relative}.settings-markdown[data-v-652eb552] ul,.settings-markdown[data-v-652eb552] ol{padding-left:10px;margin-left:10px}.settings-markdown[data-v-652eb552] ul li{list-style-type:disc}.settings-markdown[data-v-652eb552] ul>li>ul>li{list-style-type:circle}.settings-markdown[data-v-652eb552] ul>li>ul>li ul li{list-style-type:square}.settings-markdown[data-v-652eb552] blockquote{padding-left:1em;border-left:4px solid var(--color-primary-element);color:var(--color-text-maxcontrast);margin-left:0;margin-right:0}","",{version:3,sources:["webpack://./apps/settings/src/components/Markdown.vue"],names:[],mappings:"AAgHA,0OAMC,eAAA,CACA,gBAAA,CACA,eAAA,CACA,kBAAA,CACA,4BAAA,CAGD,uCACC,cAAA,CACA,eAAA,CAGD,uCACC,cAAA,CACA,eAAA,CAGD,uCACC,cAAA,CAGD,uCACC,cAAA,CAGD,uCACC,cAAA,CAGD,uCACC,kCAAA,CAGD,wCACC,eAAA,CACA,eAAA,CACA,6CAAA,CACA,kCAAA,CACA,iBAAA,CACA,iBAAA,CAGD,2CACC,6CAAA,CACA,kCAAA,CACA,iBAAA,CAGD,uCACC,iBAAA,CAGD,8EACC,iBAAA,CACA,gBAAA,CAGD,0CACC,oBAAA,CAGD,gDACC,sBAAA,CAGD,sDACC,sBAAA,CAGD,+CACC,gBAAA,CACA,kDAAA,CACA,mCAAA,CACA,aAAA,CACA,cAAA",sourcesContent:["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.settings-markdown::v-deep {\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n\tfont-weight: 600;\n\tline-height: 120%;\n\tmargin-top: 24px;\n\tmargin-bottom: 12px;\n\tcolor: var(--color-main-text);\n}\n\nh1 {\n\tfont-size: 36px;\n\tmargin-top: 48px;\n}\n\nh2 {\n\tfont-size: 28px;\n\tmargin-top: 48px;\n}\n\nh3 {\n\tfont-size: 24px;\n}\n\nh4 {\n\tfont-size: 21px;\n}\n\nh5 {\n\tfont-size: 17px;\n}\n\nh6 {\n\tfont-size: var(--default-font-size);\n}\n\npre {\n\twhite-space: pre;\n\toverflow-x: auto;\n\tbackground-color: var(--color-background-dark);\n\tborder-radius: var(--border-radius);\n\tpadding: 1em 1.3em;\n\tmargin-bottom: 1em;\n}\n\np code {\n\tbackground-color: var(--color-background-dark);\n\tborder-radius: var(--border-radius);\n\tpadding: .1em .3em;\n}\n\nli {\n\tposition: relative;\n}\n\nul, ol {\n\tpadding-left: 10px;\n\tmargin-left: 10px;\n}\n\nul li {\n\tlist-style-type: disc;\n}\n\nul > li > ul > li {\n\tlist-style-type: circle;\n}\n\nul > li > ul > li ul li {\n\tlist-style-type: square;\n}\n\nblockquote {\n\tpadding-left: 1em;\n\tborder-left: 4px solid var(--color-primary-element);\n\tcolor: var(--color-text-maxcontrast);\n\tmargin-left: 0;\n\tmargin-right: 0;\n}\n\n}\n"],sourceRoot:""}]),n.Z=r},57163:function(t,n,e){var a=e(87537),i=e.n(a),s=e(23645),r=e.n(s)()(i());r.push([t.id,".app-sidebar[data-v-d3244798]:not(.app-sidebar--without-background) :not(.app-sidebar-header--compact) .app-sidebar-header__figure{background-size:cover}.app-sidebar[data-v-d3244798]:not(.app-sidebar--without-background) .app-sidebar-header--compact .app-sidebar-header__figure{background-size:32px;filter:invert(1)}.app-sidebar[data-v-d3244798] .app-sidebar-header__description .app-version{padding-left:10px}.app-sidebar[data-v-d3244798].app-sidebar--without-background .app-sidebar-header__figure{display:flex;align-items:center;justify-content:center}.app-sidebar[data-v-d3244798].app-sidebar--without-background .app-sidebar-header__figure--default-app-icon{width:32px;height:32px;background-size:32px}.app-sidebar[data-v-d3244798] .app-sidebar-header__desc .app-sidebar-header__subtitle{overflow:visible !important;height:auto;white-space:normal !important;line-height:16px}.app-sidebar[data-v-d3244798] .app-sidebar-header__action{margin:0 20px}.app-sidebar[data-v-d3244798] .app-sidebar-header__action input{margin:3px}.app-navigation[data-v-d3244798] button.app-navigation-toggle{top:8px;right:-8px}.app-sidebar-tabs__release h2[data-v-d3244798]{border-bottom:1px solid var(--color-border)}.app-sidebar-tabs__release[data-v-d3244798] h3{font-size:20px}.app-sidebar-tabs__release[data-v-d3244798] h4{font-size:17px}","",{version:3,sources:["webpack://./apps/settings/src/views/Apps.vue"],names:[],mappings:"AA2TE,mIACC,qBAAA,CAGD,6HACC,oBAAA,CAEA,gBAAA,CAKD,4EACC,iBAAA,CAMD,0FACC,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,4GACC,UAAA,CACA,WAAA,CACA,oBAAA,CAQF,sFACC,2BAAA,CACA,WAAA,CACA,6BAAA,CACA,gBAAA,CAIF,0DAEC,aAAA,CACA,gEACC,UAAA,CAMH,8DACC,OAAA,CACA,UAAA,CAIA,+CACC,2CAAA,CAKA,gDACC,cAAA,CAED,gDACC,cAAA",sourcesContent:["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.app-sidebar::v-deep {\n\t&:not(.app-sidebar--without-background) {\n\t\t// with full screenshot, let's fill the figure\n\t\t:not(.app-sidebar-header--compact) .app-sidebar-header__figure {\n\t\t\tbackground-size: cover;\n\t\t}\n\t\t// revert sidebar app icon so it is black\n\t\t.app-sidebar-header--compact .app-sidebar-header__figure {\n\t\t\tbackground-size: 32px;\n\n\t\t\tfilter: invert(1);\n\t\t}\n\t}\n\n\t.app-sidebar-header__description {\n\t\t.app-version {\n\t\t\tpadding-left: 10px;\n\t\t}\n\t}\n\n\t// default icon slot styling\n\t&.app-sidebar--without-background {\n\t\t.app-sidebar-header__figure {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\t&--default-app-icon {\n\t\t\t\twidth: 32px;\n\t\t\t\theight: 32px;\n\t\t\t\tbackground-size: 32px;\n\t\t\t}\n\t\t}\n\t}\n\n\t// TODO: migrate to components\n\t.app-sidebar-header__desc {\n\t\t// allow multi line subtitle for the license\n\t\t.app-sidebar-header__subtitle {\n\t\t\toverflow: visible !important;\n\t\t\theight: auto;\n\t\t\twhite-space: normal !important;\n\t\t\tline-height: 16px;\n\t\t}\n\t}\n\n\t.app-sidebar-header__action {\n\t\t// align with tab content\n\t\tmargin: 0 20px;\n\t\tinput {\n\t\t\tmargin: 3px;\n\t\t}\n\t}\n}\n\n// Align the appNavigation toggle with the apps header toolbar\n.app-navigation::v-deep button.app-navigation-toggle {\n\ttop: 8px;\n\tright: -8px;\n}\n\n.app-sidebar-tabs__release {\n\th2 {\n\t\tborder-bottom: 1px solid var(--color-border);\n\t}\n\n\t// Overwrite changelog heading styles\n\t::v-deep {\n\t\th3 {\n\t\t\tfont-size: 20px;\n\t\t}\n\t\th4 {\n\t\t\tfont-size: 17px;\n\t\t}\n\t}\n}\n"],sourceRoot:""}]),n.Z=r},12635:function(t,n,e){var a=e(87537),i=e.n(a),s=e(23645),r=e.n(s)()(i());r.push([t.id,"\n.force[data-v-06bcd5b6] {\n\tbackground: var(--color-main-background);\n\tborder-color: var(--color-error);\n\tcolor: var(--color-error);\n}\n.force[data-v-06bcd5b6]:hover,\n.force[data-v-06bcd5b6]:active {\n\tbackground: var(--color-error);\n\tborder-color: var(--color-error) !important;\n\tcolor: var(--color-main-background);\n}\n","",{version:3,sources:["webpack://./apps/settings/src/components/AppList/AppItem.vue"],names:[],mappings:";AAmLA;CACA,wCAAA;CACA,gCAAA;CACA,yBAAA;AACA;AACA;;CAEA,8BAAA;CACA,2CAAA;CACA,mCAAA;AACA",sourcesContent:['\x3c!--\n - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n --\x3e\n\n<template>\n\t<div class="section" :class="{ selected: isSelected }" @click="showAppDetails">\n\t\t<div class="app-image app-image-icon" @click="showAppDetails">\n\t\t\t<div v-if="(listView && !app.preview) || (!listView && !screenshotLoaded)" class="icon-settings-dark" />\n\n\t\t\t<svg v-else-if="listView && app.preview"\n\t\t\t\twidth="32"\n\t\t\t\theight="32"\n\t\t\t\tviewBox="0 0 32 32">\n\t\t\t\t<defs><filter :id="filterId"><feColorMatrix in="SourceGraphic" type="matrix" values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0" /></filter></defs>\n\t\t\t\t<image x="0"\n\t\t\t\t\ty="0"\n\t\t\t\t\twidth="32"\n\t\t\t\t\theight="32"\n\t\t\t\t\tpreserveAspectRatio="xMinYMin meet"\n\t\t\t\t\t:filter="filterUrl"\n\t\t\t\t\t:xlink:href="app.preview"\n\t\t\t\t\tclass="app-icon" />\n\t\t\t</svg>\n\n\t\t\t<img v-if="!listView && app.screenshot && screenshotLoaded" :src="app.screenshot" width="100%">\n\t\t</div>\n\t\t<div class="app-name" @click="showAppDetails">\n\t\t\t{{ app.name }}\n\t\t</div>\n\t\t<div v-if="!listView" class="app-summary">\n\t\t\t{{ app.summary }}\n\t\t</div>\n\t\t<div v-if="listView" class="app-version">\n\t\t\t<span v-if="app.version">{{ app.version }}</span>\n\t\t\t<span v-else-if="app.appstoreData.releases[0].version">{{ app.appstoreData.releases[0].version }}</span>\n\t\t</div>\n\n\t\t<div class="app-level">\n\t\t\t<span v-if="app.level === 300"\n\t\t\t\tv-tooltip.auto="t(\'settings\', \'This app is supported via your current Nextcloud subscription.\')"\n\t\t\t\tclass="supported icon-checkmark-color">\n\t\t\t\t{{ t(\'settings\', \'Supported\') }}</span>\n\t\t\t<span v-if="app.level === 200"\n\t\t\t\tv-tooltip.auto="t(\'settings\', \'Featured apps are developed by and within the community. They offer central functionality and are ready for production use.\')"\n\t\t\t\tclass="official icon-checkmark">\n\t\t\t\t{{ t(\'settings\', \'Featured\') }}</span>\n\t\t\t<AppScore v-if="hasRating && !listView" :score="app.score" />\n\t\t</div>\n\n\t\t<div class="actions">\n\t\t\t<div v-if="app.error" class="warning">\n\t\t\t\t{{ app.error }}\n\t\t\t</div>\n\t\t\t<div v-if="isLoading" class="icon icon-loading-small" />\n\t\t\t<input v-if="app.update"\n\t\t\t\tclass="update primary"\n\t\t\t\ttype="button"\n\t\t\t\t:value="t(\'settings\', \'Update to {update}\', {update:app.update})"\n\t\t\t\t:disabled="installing || isLoading"\n\t\t\t\t@click.stop="update(app.id)">\n\t\t\t<input v-if="app.canUnInstall"\n\t\t\t\tclass="uninstall"\n\t\t\t\ttype="button"\n\t\t\t\t:value="t(\'settings\', \'Remove\')"\n\t\t\t\t:disabled="installing || isLoading"\n\t\t\t\t@click.stop="remove(app.id)">\n\t\t\t<input v-if="app.active"\n\t\t\t\tclass="enable"\n\t\t\t\ttype="button"\n\t\t\t\t:value="t(\'settings\',\'Disable\')"\n\t\t\t\t:disabled="installing || isLoading"\n\t\t\t\t@click.stop="disable(app.id)">\n\t\t\t<input v-if="!app.active && (app.canInstall || app.isCompatible)"\n\t\t\t\tv-tooltip.auto="enableButtonTooltip"\n\t\t\t\tclass="enable"\n\t\t\t\ttype="button"\n\t\t\t\t:value="enableButtonText"\n\t\t\t\t:disabled="!app.canInstall || installing || isLoading"\n\t\t\t\t@click.stop="enable(app.id)">\n\t\t\t<input v-else-if="!app.active"\n\t\t\t\tv-tooltip.auto="forceEnableButtonTooltip"\n\t\t\t\tclass="enable force"\n\t\t\t\ttype="button"\n\t\t\t\t:value="forceEnableButtonText"\n\t\t\t\t:disabled="installing || isLoading"\n\t\t\t\t@click.stop="forceEnable(app.id)">\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport AppScore from \'./AppScore\'\nimport AppManagement from \'../../mixins/AppManagement\'\nimport SvgFilterMixin from \'../SvgFilterMixin\'\n\nexport default {\n\tname: \'AppItem\',\n\tcomponents: {\n\t\tAppScore,\n\t},\n\tmixins: [AppManagement, SvgFilterMixin],\n\tprops: {\n\t\tapp: {},\n\t\tcategory: {},\n\t\tlistView: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisSelected: false,\n\t\t\tscrolled: false,\n\t\t\tscreenshotLoaded: false,\n\t\t}\n\t},\n\tcomputed: {\n\t\thasRating() {\n\t\t\treturn this.app.appstoreData && this.app.appstoreData.ratingNumOverall > 5\n\t\t},\n\t},\n\twatch: {\n\t\t\'$route.params.id\'(id) {\n\t\t\tthis.isSelected = (this.app.id === id)\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.isSelected = (this.app.id === this.$route.params.id)\n\t\tif (this.app.releases && this.app.screenshot) {\n\t\t\tconst image = new Image()\n\t\t\timage.onload = (e) => {\n\t\t\t\tthis.screenshotLoaded = true\n\t\t\t}\n\t\t\timage.src = this.app.screenshot\n\t\t}\n\t},\n\twatchers: {\n\n\t},\n\tmethods: {\n\t\tasync showAppDetails(event) {\n\t\t\tif (event.currentTarget.tagName === \'INPUT\' || event.currentTarget.tagName === \'A\') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait this.$router.push({\n\t\t\t\t\tname: \'apps-details\',\n\t\t\t\t\tparams: { category: this.category, id: this.app.id },\n\t\t\t\t})\n\t\t\t} catch (e) {\n\t\t\t\t// we already view this app\n\t\t\t}\n\t\t},\n\t\tprefix(prefix, content) {\n\t\t\treturn prefix + \'_\' + content\n\t\t},\n\t},\n}\n<\/script>\n\n<style scoped>\n\t.force {\n\t\tbackground: var(--color-main-background);\n\t\tborder-color: var(--color-error);\n\t\tcolor: var(--color-error);\n\t}\n\t.force:hover,\n\t.force:active {\n\t\tbackground: var(--color-error);\n\t\tborder-color: var(--color-error) !important;\n\t\tcolor: var(--color-main-background);\n\t}\n</style>\n'],sourceRoot:""}]),n.Z=r},77538:function(n,e,a){a.r(e),a.d(e,{default:function(){return mt}});var i=a(74854),s=a(20144),r=a(87369),o=a.n(r),p=a(23068),l=a.n(p),c=a(58908),d=a.n(c),u=a(50753),h=a.n(u),g=a(7612),v=a.n(g),A=a(6862),f=a.n(A),m=a(27801),b=a.n(m),C=a(47092),_=a.n(C),y=a(9597),w=a.n(y),k=a(79753),x={name:"AppScore",props:["score"],computed:{scoreImage:function(){var t="rating/s"+Math.round(10*this.score)+".svg";return(0,k.imagePath)("core",t)}}},D=a(51900),T=(0,D.Z)(x,(function(){var t=this,n=t.$createElement;return(t._self._c||n)("img",{staticClass:"app-score-image",attrs:{src:t.scoreImage}})}),[],!1,null,null,null).exports,S=a(26932),B=a(4820),L=function(){return B.default.get((0,k.generateOcsUrl)("core/navigation",2)+"/apps?format=json").then((function(t){var n=t.data;if(200===n.ocs.meta.statuscode){var e={},a=n.ocs.data,i=document.querySelector("#navigation #apps ul");a.forEach((function(t){i.querySelector('li[data-id="'+t.id+'"]')||(e[t.id]=!0)})),i.querySelectorAll("li[data-id]").forEach((function(t,n){var e=t.dataset.id;(!a[n]||a[n]&&a[n].id!==e)&&(t.remove(),document.querySelector("#appmenu li[data-id=".concat(e,"]")).remove())}));var s={};a.forEach((function(t){if(null===i.querySelector('li[data-id="'.concat(t.id,'"]'))){var n=document.createElement("li");n.dataset.id=t.id;var a='<svg width="20" height="20" viewBox="0 0 20 20" alt="">\n\t\t\t\t\t <defs>\n\t\t\t\t\t <filter id="invertMenuMore-'.concat(t.id,'"><feColorMatrix in="SourceGraphic" type="matrix" values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"></feColorMatrix></filter>\n\t\t\t\t\t <mask id="hole">\n\t\t\t\t\t <rect width="100%" height="100%" fill="white"></rect>\n\t\t\t\t\t\t<circle r="4.5" cx="17" cy="3" fill="black"></circle>\n\t\t\t\t\t </mask>\n\t\t\t\t\t </defs>\n\t\t\t\t\t <image x="0" y="0" width="16" height="16" filter="url(#invertMenuMore-').concat(t.id,')" preserveAspectRatio="xMinYMin meet" xlink:href="').concat(t.icon,'" class="app-icon" />\n\t\t\t\t\t</svg>'),r=document.createElement("template");r.innerHTML=a;var o=document.createElement("a");o.setAttribute("href",t.href);var p=document.createElement("span");p.appendChild(document.createTextNode(t.name));var l=document.createElement("div");l.setAttribute("class","unread-counter"),l.style.display="none",e[t.id]&&o.classList.add("animated"),o.prepend(r.content.firstChild,l,p),n.append(o);var c=document.querySelector("#navigation li[data-id=".concat(s.id,"]"));c?c.insertAdjacentElement("afterend",n):document.querySelector("#navigation #apps ul").prepend(n)}if(null===document.getElementById("appmenu").querySelector('li[data-id="'.concat(t.id,'"]'))){var d,u=document.createElement("li");u.dataset.id=t.id,d=OCA.Theming&&OCA.Theming.inverted?'<svg width="20" height="20" viewBox="0 0 20 20" alt="">\n\t\t\t\t\t\t <defs>\n\t\t\t\t\t\t <filter id="invert"><feColorMatrix in="SourceGraphic" type="matrix" values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0" /></filter>\n\t\t\t\t\t\t </defs>\n\t\t\t\t\t\t <image x="0" y="0" width="20" height="20" preserveAspectRatio="xMinYMin meet" filter="url(#invert)" xlink:href="'.concat(t.icon,'" class="app-icon" />\n\t\t\t\t\t\t</svg>'):'<svg width="20" height="20" viewBox="0 0 20 20" alt="">\n\t\t\t\t\t\t <image x="0" y="0" width="20" height="20" preserveAspectRatio="xMinYMin meet" xlink:href="'.concat(t.icon,'" class="app-icon" />\n\t\t\t\t\t\t</svg>');var h=document.createElement("template");h.innerHTML=d;var g=document.createElement("a");g.setAttribute("href",t.href);var v=document.createElement("span");v.appendChild(document.createTextNode(t.name));var A=document.createElement("div");A.setAttribute("class","icon-loading-dark"),A.style.display="none",e[t.id]&&g.classList.add("animated"),g.prepend(A,v,h.content.firstChild),u.append(g);var f=document.querySelector("#appmenu li[data-id="+s.id+"]");f?f.insertAdjacentElement("afterend",u):document.queryElementById("appmenu").prepend(u)}s=t})),window.dispatchEvent(new Event("resize"))}}))},I={computed:{appGroups:function(){return this.app.groups.map((function(t){return{id:t,name:t}}))},installing:function(){return this.$store.getters.loading("install")},isLoading:function(){return this.app&&this.$store.getters.loading(this.app.id)},enableButtonText:function(){return this.app.needsDownload?t("settings","Download and enable"):t("settings","Enable")},forceEnableButtonText:function(){return this.app.needsDownload,t("settings","Enable untested app")},enableButtonTooltip:function(){return!!this.app.needsDownload&&t("settings","The app will be downloaded from the App Store")},forceEnableButtonTooltip:function(){var n=t("settings","This app is not marked as compatible with your Nextcloud version. If you continue you will still be able to install the app. Note that the app might not work as expected.");return this.app.needsDownload?n+" "+t("settings","The app will be downloaded from the App Store"):n}},data:function(){return{groupCheckedAppsData:!1}},mounted:function(){this.app&&this.app.groups&&this.app.groups.length>0&&(this.groupCheckedAppsData=!0)},methods:{asyncFindGroup:function(t){return this.$store.dispatch("getGroups",{search:t,limit:5,offset:0})},isLimitedToGroups:function(t){return!(!this.app.groups.length&&!this.groupCheckedAppsData)},setGroupLimit:function(){this.groupCheckedAppsData||this.$store.dispatch("enableApp",{appId:this.app.id,groups:[]})},canLimitToGroups:function(t){return!(t.types&&t.types.includes("filesystem")||t.types.includes("prelogin")||t.types.includes("authentication")||t.types.includes("logging")||t.types.includes("prevent_group_restriction"))},addGroupLimitation:function(t){var n=this.app.groups.concat([]).concat([t.id]);this.$store.dispatch("enableApp",{appId:this.app.id,groups:n})},removeGroupLimitation:function(t){var n=this.app.groups.concat([]),e=n.indexOf(t.id);e>-1&&n.splice(e,1),this.$store.dispatch("enableApp",{appId:this.app.id,groups:n})},forceEnable:function(t){this.$store.dispatch("forceEnableApp",{appId:t,groups:[]}).then((function(t){L()})).catch((function(t){(0,S.x2)(t)}))},enable:function(t){this.$store.dispatch("enableApp",{appId:t,groups:[]}).then((function(t){L()})).catch((function(t){(0,S.x2)(t)}))},disable:function(t){this.$store.dispatch("disableApp",{appId:t}).then((function(t){L()})).catch((function(t){(0,S.x2)(t)}))},remove:function(t){this.$store.dispatch("uninstallApp",{appId:t}).then((function(t){L()})).catch((function(t){(0,S.x2)(t)}))},install:function(t){this.$store.dispatch("enableApp",{appId:t}).then((function(t){L()})).catch((function(t){(0,S.x2)(t)}))},update:function(t){this.$store.dispatch("updateApp",{appId:t}).then((function(t){L()})).catch((function(t){(0,S.x2)(t)}))}}},E={name:"SvgFilterMixin",data:function(){return{filterId:""}},computed:{filterUrl:function(){return"url(#".concat(this.filterId,")")}},mounted:function(){this.filterId="invertIconApps-"+Math.random().toString(36).substring(2)}};function N(t,n,e,a,i,s,r){try{var o=t[s](r),p=o.value}catch(t){return void e(t)}o.done?n(p):Promise.resolve(p).then(a,i)}var M={name:"AppItem",components:{AppScore:T},mixins:[I,(0,D.Z)(E,void 0,void 0,!1,null,null,null).exports],props:{app:{},category:{},listView:{type:Boolean,default:!0}},data:function(){return{isSelected:!1,scrolled:!1,screenshotLoaded:!1}},computed:{hasRating:function(){return this.app.appstoreData&&this.app.appstoreData.ratingNumOverall>5}},watch:{"$route.params.id":function(t){this.isSelected=this.app.id===t}},mounted:function(){var t=this;if(this.isSelected=this.app.id===this.$route.params.id,this.app.releases&&this.app.screenshot){var n=new Image;n.onload=function(n){t.screenshotLoaded=!0},n.src=this.app.screenshot}},watchers:{},methods:{showAppDetails:function(t){var n,e=this;return(n=regeneratorRuntime.mark((function n(){return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if("INPUT"!==t.currentTarget.tagName&&"A"!==t.currentTarget.tagName){n.next=2;break}return n.abrupt("return");case 2:return n.prev=2,n.next=5,e.$router.push({name:"apps-details",params:{category:e.category,id:e.app.id}});case 5:n.next=9;break;case 7:n.prev=7,n.t0=n.catch(2);case 9:case"end":return n.stop()}}),n,null,[[2,7]])})),function(){var t=this,e=arguments;return new Promise((function(a,i){var s=n.apply(t,e);function r(t){N(s,a,i,r,o,"next",t)}function o(t){N(s,a,i,r,o,"throw",t)}r(void 0)}))})()},prefix:function(t,n){return t+"_"+n}}},G=M,$=a(93379),U=a.n($),R=a(7795),V=a.n(R),Z=a(90569),z=a.n(Z),O=a(3565),F=a.n(O),P=a(19216),q=a.n(P),Y=a(44589),H=a.n(Y),j=a(12635),Q={};Q.styleTagTransform=H(),Q.setAttributes=F(),Q.insert=z().bind(null,"head"),Q.domAPI=V(),Q.insertStyleElement=q(),U()(j.Z,Q),j.Z&&j.Z.locals&&j.Z.locals;var W=(0,D.Z)(G,(function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("div",{staticClass:"section",class:{selected:t.isSelected},on:{click:t.showAppDetails}},[e("div",{staticClass:"app-image app-image-icon",on:{click:t.showAppDetails}},[t.listView&&!t.app.preview||!t.listView&&!t.screenshotLoaded?e("div",{staticClass:"icon-settings-dark"}):t.listView&&t.app.preview?e("svg",{attrs:{width:"32",height:"32",viewBox:"0 0 32 32"}},[e("defs",[e("filter",{attrs:{id:t.filterId}},[e("feColorMatrix",{attrs:{in:"SourceGraphic",type:"matrix",values:"-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"}})],1)]),t._v(" "),e("image",{staticClass:"app-icon",attrs:{x:"0",y:"0",width:"32",height:"32",preserveAspectRatio:"xMinYMin meet",filter:t.filterUrl,"xlink:href":t.app.preview}})]):t._e(),t._v(" "),!t.listView&&t.app.screenshot&&t.screenshotLoaded?e("img",{attrs:{src:t.app.screenshot,width:"100%"}}):t._e()]),t._v(" "),e("div",{staticClass:"app-name",on:{click:t.showAppDetails}},[t._v("\n\t\t"+t._s(t.app.name)+"\n\t")]),t._v(" "),t.listView?t._e():e("div",{staticClass:"app-summary"},[t._v("\n\t\t"+t._s(t.app.summary)+"\n\t")]),t._v(" "),t.listView?e("div",{staticClass:"app-version"},[t.app.version?e("span",[t._v(t._s(t.app.version))]):t.app.appstoreData.releases[0].version?e("span",[t._v(t._s(t.app.appstoreData.releases[0].version))]):t._e()]):t._e(),t._v(" "),e("div",{staticClass:"app-level"},[300===t.app.level?e("span",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.t("settings","This app is supported via your current Nextcloud subscription."),expression:"t('settings', 'This app is supported via your current Nextcloud subscription.')",modifiers:{auto:!0}}],staticClass:"supported icon-checkmark-color"},[t._v("\n\t\t\t"+t._s(t.t("settings","Supported")))]):t._e(),t._v(" "),200===t.app.level?e("span",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.t("settings","Featured apps are developed by and within the community. They offer central functionality and are ready for production use."),expression:"t('settings', 'Featured apps are developed by and within the community. They offer central functionality and are ready for production use.')",modifiers:{auto:!0}}],staticClass:"official icon-checkmark"},[t._v("\n\t\t\t"+t._s(t.t("settings","Featured")))]):t._e(),t._v(" "),t.hasRating&&!t.listView?e("AppScore",{attrs:{score:t.app.score}}):t._e()],1),t._v(" "),e("div",{staticClass:"actions"},[t.app.error?e("div",{staticClass:"warning"},[t._v("\n\t\t\t"+t._s(t.app.error)+"\n\t\t")]):t._e(),t._v(" "),t.isLoading?e("div",{staticClass:"icon icon-loading-small"}):t._e(),t._v(" "),t.app.update?e("input",{staticClass:"update primary",attrs:{type:"button",value:t.t("settings","Update to {update}",{update:t.app.update}),disabled:t.installing||t.isLoading},on:{click:function(n){return n.stopPropagation(),t.update(t.app.id)}}}):t._e(),t._v(" "),t.app.canUnInstall?e("input",{staticClass:"uninstall",attrs:{type:"button",value:t.t("settings","Remove"),disabled:t.installing||t.isLoading},on:{click:function(n){return n.stopPropagation(),t.remove(t.app.id)}}}):t._e(),t._v(" "),t.app.active?e("input",{staticClass:"enable",attrs:{type:"button",value:t.t("settings","Disable"),disabled:t.installing||t.isLoading},on:{click:function(n){return n.stopPropagation(),t.disable(t.app.id)}}}):t._e(),t._v(" "),t.app.active||!t.app.canInstall&&!t.app.isCompatible?t.app.active?t._e():e("input",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.forceEnableButtonTooltip,expression:"forceEnableButtonTooltip",modifiers:{auto:!0}}],staticClass:"enable force",attrs:{type:"button",value:t.forceEnableButtonText,disabled:t.installing||t.isLoading},on:{click:function(n){return n.stopPropagation(),t.forceEnable(t.app.id)}}}):e("input",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.enableButtonTooltip,expression:"enableButtonTooltip",modifiers:{auto:!0}}],staticClass:"enable",attrs:{type:"button",value:t.enableButtonText,disabled:!t.app.canInstall||t.installing||t.isLoading},on:{click:function(n){return n.stopPropagation(),t.enable(t.app.id)}}})])])}),[],!1,null,"06bcd5b6",null).exports,J=(0,D.Z)({name:"PrefixMixin",methods:{prefix:function(t,n){return t+"_"+n}}},void 0,void 0,!1,null,null,null).exports,K=a(63560),X=a(1412),tt={name:"AppList",components:{AppItem:W,Button:a.n(X)()},mixins:[J],props:["category","app","search"],computed:{counter:function(){return this.apps.filter((function(t){return t.update})).length},loading:function(){return this.$store.getters.loading("list")},hasPendingUpdate:function(){return this.apps.filter((function(t){return t.update})).length>0},showUpdateAll:function(){return this.hasPendingUpdate&&this.useListView},apps:function(){var t=this,n=this.$store.getters.getAllApps.filter((function(n){return-1!==n.name.toLowerCase().search(t.search.toLowerCase())})).sort((function(t,n){var e=""+(t.active?0:1)+(t.update?0:1)+t.name,a=""+(n.active?0:1)+(n.update?0:1)+n.name;return OC.Util.naturalSortCompare(e,a)}));return"installed"===this.category?n.filter((function(t){return t.installed})):"enabled"===this.category?n.filter((function(t){return t.active&&t.installed})):"disabled"===this.category?n.filter((function(t){return!t.active&&t.installed})):"app-bundles"===this.category?n.filter((function(t){return t.bundles})):"updates"===this.category?n.filter((function(t){return t.update})):"featured"===this.category?n.filter((function(t){return 200===t.level})):n.filter((function(n){return n.appstore&&void 0!==n.category&&(n.category===t.category||n.category.indexOf(t.category)>-1)}))},bundles:function(){var t=this;return this.$store.getters.getServerData.bundles.filter((function(n){return t.bundleApps(n.id).length>0}))},bundleApps:function(){return function(t){return this.$store.getters.getAllApps.filter((function(n){return void 0!==n.bundleIds&&n.bundleIds.includes(t)}))}},searchApps:function(){var t=this;return""===this.search?[]:this.$store.getters.getAllApps.filter((function(n){return-1!==n.name.toLowerCase().search(t.search.toLowerCase())&&!t.apps.find((function(t){return t.id===n.id}))}))},useAppStoreView:function(){return!this.useListView&&!this.useBundleView},useListView:function(){return"installed"===this.category||"enabled"===this.category||"disabled"===this.category||"updates"===this.category||"featured"===this.category},useBundleView:function(){return"app-bundles"===this.category},allBundlesEnabled:function(){var t=this;return function(n){return 0===t.bundleApps(n).filter((function(t){return!t.active})).length}},bundleToggleText:function(){var n=this;return function(e){return n.allBundlesEnabled(e)?t("settings","Disable all"):t("settings","Enable all")}}},methods:{toggleBundle:function(t){return this.allBundlesEnabled(t)?this.disableBundle(t):this.enableBundle(t)},enableBundle:function(t){var n=this.bundleApps(t).map((function(t){return t.id}));this.$store.dispatch("enableApp",{appId:n,groups:[]}).catch((function(t){console.error(t),OC.Notification.show(t)}))},disableBundle:function(t){var n=this.bundleApps(t).map((function(t){return t.id}));this.$store.dispatch("disableApp",{appId:n,groups:[]}).catch((function(t){OC.Notification.show(t)}))},updateAll:function(){var t=this,n=(0,K.Z)(1);this.apps.filter((function(t){return t.update})).map((function(e){return n((function(){return t.$store.dispatch("updateApp",{appId:e.id})}))}))}}},nt=(0,D.Z)(tt,(function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("div",{attrs:{id:"app-content-inner"}},[e("div",{staticClass:"apps-list",class:{installed:t.useBundleView||t.useListView,store:t.useAppStoreView},attrs:{id:"apps-list"}},[t.useListView?[t.showUpdateAll?e("div",{staticClass:"toolbar"},[t._v("\n\t\t\t\t"+t._s(t.n("settings","%n app has an update available","%n apps have an update available",t.counter))+"\n\t\t\t\t"),t.showUpdateAll?e("Button",{attrs:{id:"app-list-update-all",type:"primary"},on:{click:t.updateAll}},[t._v("\n\t\t\t\t\t"+t._s(t.n("settings","Update","Update all",t.counter))+"\n\t\t\t\t")]):t._e()],1):t._e(),t._v(" "),t.showUpdateAll?t._e():e("div",{staticClass:"toolbar"},[t._v("\n\t\t\t\t"+t._s(t.t("settings","All apps are up-to-date."))+"\n\t\t\t")]),t._v(" "),e("transition-group",{staticClass:"apps-list-container",attrs:{name:"app-list",tag:"div"}},t._l(t.apps,(function(n){return e("AppItem",{key:n.id,attrs:{app:n,category:t.category}})})),1)]:t._e(),t._v(" "),t.useBundleView?e("transition-group",{staticClass:"apps-list-container",attrs:{name:"app-list",tag:"div"}},[t._l(t.bundles,(function(n){return[e("div",{key:n.id,staticClass:"apps-header"},[e("div",{staticClass:"app-image"}),t._v(" "),e("h2",[t._v(t._s(n.name)+" "),e("input",{attrs:{type:"button",value:t.bundleToggleText(n.id)},on:{click:function(e){return t.toggleBundle(n.id)}}})]),t._v(" "),e("div",{staticClass:"app-version"}),t._v(" "),e("div",{staticClass:"app-level"}),t._v(" "),e("div",{staticClass:"app-groups"}),t._v(" "),e("div",{staticClass:"actions"},[t._v("\n\t\t\t\t\t\t \n\t\t\t\t\t")])]),t._v(" "),t._l(t.bundleApps(n.id),(function(a){return e("AppItem",{key:n.id+a.id,attrs:{app:a,category:t.category}})}))]}))],2):t._e(),t._v(" "),t.useAppStoreView?t._l(t.apps,(function(n){return e("AppItem",{key:n.id,attrs:{app:n,category:t.category,"list-view":!1}})})):t._e()],2),t._v(" "),e("div",{staticClass:"apps-list installed",attrs:{id:"apps-list-search"}},[e("div",{staticClass:"apps-list-container"},[""!==t.search&&t.searchApps.length>0?[e("div",{staticClass:"section"},[e("div"),t._v(" "),e("td",{attrs:{colspan:"5"}},[e("h2",[t._v(t._s(t.t("settings","Results from other categories")))])])]),t._v(" "),t._l(t.searchApps,(function(n){return e("AppItem",{key:n.id,attrs:{app:n,category:t.category,"list-view":!0}})}))]:t._e()],2)]),t._v(" "),""===t.search||t.loading||0!==t.searchApps.length||0!==t.apps.length?t._e():e("div",{staticClass:"emptycontent emptycontent-search",attrs:{id:"apps-list-empty"}},[e("div",{staticClass:"icon-settings-dark",attrs:{id:"app-list-empty-icon"}}),t._v(" "),e("h2",[t._v(t._s(t.t("settings","No apps found for your version")))])]),t._v(" "),e("div",{attrs:{id:"searchresults"}})])}),[],!1,null,null,null).exports,et=a(7811),at=a.n(et),it=a(87441),st=a(27856),rt=a.n(st),ot={name:"Markdown",props:{text:{type:String,default:""}},computed:{renderMarkdown:function(){var t=new it.TU.Renderer;return t.link=function(t,n,e){var a;try{a=decodeURIComponent(unescape(t)).replace(/[^\w:]/g,"").toLowerCase()}catch(t){return""}if(0!==a.indexOf("http:")&&0!==a.indexOf("https:"))return"";var i='<a href="'+t+'" rel="noreferrer noopener"';return n&&(i+=' title="'+n+'"'),i+">"+e+"</a>"},t.image=function(t,n,e){return e||n},t.blockquote=function(t){return t},rt().sanitize((0,it.TU)(this.text.trim(),{renderer:t,gfm:!1,highlight:!1,tables:!1,breaks:!1,pedantic:!1,sanitize:!0,smartLists:!0,smartypants:!1}),{SAFE_FOR_JQUERY:!0,ALLOWED_TAGS:["h1","h2","h3","h4","h5","h6","strong","p","a","ul","ol","li","em","del","blockquote"]})}}},pt=a(6578),lt={};lt.styleTagTransform=H(),lt.setAttributes=F(),lt.insert=z().bind(null,"head"),lt.domAPI=V(),lt.insertStyleElement=q(),U()(pt.Z,lt),pt.Z&&pt.Z.locals&&pt.Z.locals;var ct=(0,D.Z)(ot,(function(){var t=this,n=t.$createElement;return(t._self._c||n)("div",{staticClass:"settings-markdown",domProps:{innerHTML:t._s(t.renderMarkdown)}})}),[],!1,null,"652eb552",null).exports,dt={name:"AppDetails",components:{Multiselect:at(),Markdown:ct},mixins:[I,J],props:{app:{type:Object,required:!0}},data:function(){return{groupCheckedAppsData:!1}},computed:{appstoreUrl:function(){return"https://apps.nextcloud.com/apps/".concat(this.app.id)},licence:function(){return this.app.licence?t("settings","{license}-licensed",{license:(""+this.app.licence).toUpperCase()}):null},author:function(){return"string"==typeof this.app.author?[{"@value":this.app.author}]:this.app.author["@value"]?[this.app.author]:this.app.author},appGroups:function(){return this.app.groups.map((function(t){return{id:t,name:t}}))},groups:function(){return this.$store.getters.getGroups.filter((function(t){return"disabled"!==t.id})).sort((function(t,n){return t.name.localeCompare(n.name)}))}},mounted:function(){this.app.groups.length>0&&(this.groupCheckedAppsData=!0)}},ut=a(56934),ht={};ht.styleTagTransform=H(),ht.setAttributes=F(),ht.insert=z().bind(null,"head"),ht.domAPI=V(),ht.insertStyleElement=q(),U()(ut.Z,ht),ut.Z&&ut.Z.locals&&ut.Z.locals;var gt=(0,D.Z)(dt,(function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("div",{staticClass:"app-details"},[e("div",{staticClass:"app-details__actions"},[t.app.active&&t.canLimitToGroups(t.app)?e("div",{staticClass:"app-details__actions-groups"},[e("input",{directives:[{name:"model",rawName:"v-model",value:t.groupCheckedAppsData,expression:"groupCheckedAppsData"}],staticClass:"groups-enable__checkbox checkbox",attrs:{id:t.prefix("groups_enable",t.app.id),type:"checkbox"},domProps:{value:t.app.id,checked:Array.isArray(t.groupCheckedAppsData)?t._i(t.groupCheckedAppsData,t.app.id)>-1:t.groupCheckedAppsData},on:{change:[function(n){var e=t.groupCheckedAppsData,a=n.target,i=!!a.checked;if(Array.isArray(e)){var s=t.app.id,r=t._i(e,s);a.checked?r<0&&(t.groupCheckedAppsData=e.concat([s])):r>-1&&(t.groupCheckedAppsData=e.slice(0,r).concat(e.slice(r+1)))}else t.groupCheckedAppsData=i},t.setGroupLimit]}}),t._v(" "),e("label",{attrs:{for:t.prefix("groups_enable",t.app.id)}},[t._v(t._s(t.t("settings","Limit to groups")))]),t._v(" "),e("input",{staticClass:"group_select",attrs:{type:"hidden",title:t.t("settings","All"),value:""}}),t._v(" "),t.isLimitedToGroups(t.app)?e("Multiselect",{staticClass:"multiselect-vue",attrs:{options:t.groups,value:t.appGroups,"options-limit":5,placeholder:t.t("settings","Limit app usage to groups"),label:"name","track-by":"id",multiple:!0,"close-on-select":!1,"tag-width":60},on:{select:t.addGroupLimitation,remove:t.removeGroupLimitation,"search-change":t.asyncFindGroup}},[e("span",{attrs:{slot:"noResult"},slot:"noResult"},[t._v(t._s(t.t("settings","No results")))])]):t._e()],1):t._e(),t._v(" "),e("div",{staticClass:"app-details__actions-manage"},[t.app.update?e("input",{staticClass:"update primary",attrs:{type:"button",value:t.t("settings","Update to {version}",{version:t.app.update}),disabled:t.installing||t.isLoading},on:{click:function(n){return t.update(t.app.id)}}}):t._e(),t._v(" "),t.app.canUnInstall?e("input",{staticClass:"uninstall",attrs:{type:"button",value:t.t("settings","Remove"),disabled:t.installing||t.isLoading},on:{click:function(n){return t.remove(t.app.id)}}}):t._e(),t._v(" "),t.app.active?e("input",{staticClass:"enable",attrs:{type:"button",value:t.t("settings","Disable"),disabled:t.installing||t.isLoading},on:{click:function(n){return t.disable(t.app.id)}}}):t._e(),t._v(" "),t.app.active||!t.app.canInstall&&!t.app.isCompatible?t.app.active||t.app.canInstall?t._e():e("input",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.forceEnableButtonTooltip,expression:"forceEnableButtonTooltip",modifiers:{auto:!0}}],staticClass:"enable force",attrs:{type:"button",value:t.forceEnableButtonText,disabled:t.installing||t.isLoading},on:{click:function(n){return t.forceEnable(t.app.id)}}}):e("input",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.enableButtonTooltip,expression:"enableButtonTooltip",modifiers:{auto:!0}}],staticClass:"enable primary",attrs:{type:"button",value:t.enableButtonText,disabled:!t.app.canInstall||t.installing||t.isLoading},on:{click:function(n){return t.enable(t.app.id)}}})])]),t._v(" "),e("ul",{staticClass:"app-details__dependencies"},[t.app.missingMinOwnCloudVersion?e("li",[t._v("\n\t\t\t"+t._s(t.t("settings","This app has no minimum Nextcloud version assigned. This will be an error in the future."))+"\n\t\t")]):t._e(),t._v(" "),t.app.missingMaxOwnCloudVersion?e("li",[t._v("\n\t\t\t"+t._s(t.t("settings","This app has no maximum Nextcloud version assigned. This will be an error in the future."))+"\n\t\t")]):t._e(),t._v(" "),t.app.canInstall?t._e():e("li",[t._v("\n\t\t\t"+t._s(t.t("settings","This app cannot be installed because the following dependencies are not fulfilled:"))+"\n\t\t\t"),e("ul",{staticClass:"missing-dependencies"},t._l(t.app.missingDependencies,(function(n,a){return e("li",{key:a},[t._v("\n\t\t\t\t\t"+t._s(n)+"\n\t\t\t\t")])})),0)])]),t._v(" "),e("p",{staticClass:"app-details__documentation"},[t.app.internal?t._e():e("a",{staticClass:"appslink",attrs:{href:t.appstoreUrl,target:"_blank",rel:"noreferrer noopener"}},[t._v(t._s(t.t("settings","View in store"))+" ↗")]),t._v(" "),t.app.website?e("a",{staticClass:"appslink",attrs:{href:t.app.website,target:"_blank",rel:"noreferrer noopener"}},[t._v(t._s(t.t("settings","Visit website"))+" ↗")]):t._e(),t._v(" "),t.app.bugs?e("a",{staticClass:"appslink",attrs:{href:t.app.bugs,target:"_blank",rel:"noreferrer noopener"}},[t._v(t._s(t.t("settings","Report a bug"))+" ↗")]):t._e(),t._v(" "),t.app.documentation&&t.app.documentation.user?e("a",{staticClass:"appslink",attrs:{href:t.app.documentation.user,target:"_blank",rel:"noreferrer noopener"}},[t._v(t._s(t.t("settings","User documentation"))+" ↗")]):t._e(),t._v(" "),t.app.documentation&&t.app.documentation.admin?e("a",{staticClass:"appslink",attrs:{href:t.app.documentation.admin,target:"_blank",rel:"noreferrer noopener"}},[t._v(t._s(t.t("settings","Admin documentation"))+" ↗")]):t._e(),t._v(" "),t.app.documentation&&t.app.documentation.developer?e("a",{staticClass:"appslink",attrs:{href:t.app.documentation.developer,target:"_blank",rel:"noreferrer noopener"}},[t._v(t._s(t.t("settings","Developer documentation"))+" ↗")]):t._e()]),t._v(" "),e("Markdown",{staticClass:"app-details__description",attrs:{text:t.app.description}})],1)}),[],!1,null,"8ea5f476",null).exports;s.default.use(o());var vt={name:"Apps",components:{AppContent:l(),AppDetails:gt,AppList:nt,AppNavigation:d(),AppNavigationCounter:h(),AppNavigationItem:v(),AppNavigationSpacer:f(),AppScore:T,AppSidebar:b(),AppSidebarTab:_(),Content:w(),Markdown:ct},mixins:[I],props:{category:{type:String,default:"installed"},id:{type:String,default:""}},data:function(){return{searchQuery:"",screenshotLoaded:!1}},computed:{loading:function(){return this.$store.getters.loading("categories")},loadingList:function(){return this.$store.getters.loading("list")},app:function(){var t=this;return this.apps.find((function(n){return n.id===t.id}))},categories:function(){return this.$store.getters.getCategories},apps:function(){return this.$store.getters.getAllApps},updateCount:function(){return this.$store.getters.getUpdateCount},settings:function(){return this.$store.getters.getServerData},hasRating:function(){return this.app.appstoreData&&this.app.appstoreData.ratingNumOverall>5},appSidebar:function(){var n=function(t){return t["@value"]?t["@value"]:t},e=Array.isArray(this.app.author)?this.app.author.map(n).join(", "):n(this.app.author),a=t("settings","{license}-licensed",{license:(""+this.app.licence).toUpperCase()});return{subtitle:t("settings","by {author}\n{license}",{author:e,license:a}),background:this.app.screenshot&&this.screenshotLoaded?this.app.screenshot:this.app.preview,compact:!(this.app.screenshot&&this.screenshotLoaded),title:this.app.name}},changelog:function(){return function(t){return t.translations.en.changelog}}},watch:{category:function(){this.searchQuery=""},app:function(){var t,n,e=this;if(this.screenshotLoaded=!1,null!==(t=this.app)&&void 0!==t&&t.releases&&null!==(n=this.app)&&void 0!==n&&n.screenshot){var a=new Image;a.onload=function(t){e.screenshotLoaded=!0},a.src=this.app.screenshot}}},beforeMount:function(){this.$store.dispatch("getCategories"),this.$store.dispatch("getAllApps"),this.$store.dispatch("getGroups",{offset:0,limit:5}),this.$store.commit("setUpdateCount",this.$store.getters.getServerData.updateCount)},mounted:function(){(0,i.subscribe)("nextcloud:unified-search.search",this.setSearch),(0,i.subscribe)("nextcloud:unified-search.reset",this.resetSearch)},beforeDestroy:function(){(0,i.unsubscribe)("nextcloud:unified-search.search",this.setSearch),(0,i.unsubscribe)("nextcloud:unified-search.reset",this.resetSearch)},methods:{setSearch:function(t){var n=t.query;this.searchQuery=n},resetSearch:function(){this.searchQuery=""},hideAppDetails:function(){this.$router.push({name:"apps-category",params:{category:this.category}})},openDeveloperDocumentation:function(){window.open(this.settings.developerDocumentation)}}},At=a(57163),ft={};ft.styleTagTransform=H(),ft.setAttributes=F(),ft.insert=z().bind(null,"head"),ft.domAPI=V(),ft.insertStyleElement=q(),U()(At.Z,ft),At.Z&&At.Z.locals&&At.Z.locals;var mt=(0,D.Z)(vt,(function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("Content",{class:{"with-app-sidebar":t.app},attrs:{"app-name":"settings","content-class":{"icon-loading":t.loadingList},"navigation-class":{"icon-loading":t.loading}}},[e("AppNavigation",{scopedSlots:t._u([{key:"list",fn:function(){return[e("AppNavigationItem",{attrs:{id:"app-category-your-apps",to:{name:"apps"},exact:!0,icon:"icon-category-installed",title:t.t("settings","Your apps")}}),t._v(" "),e("AppNavigationItem",{attrs:{id:"app-category-enabled",to:{name:"apps-category",params:{category:"enabled"}},icon:"icon-category-enabled",title:t.t("settings","Active apps")}}),t._v(" "),e("AppNavigationItem",{attrs:{id:"app-category-disabled",to:{name:"apps-category",params:{category:"disabled"}},icon:"icon-category-disabled",title:t.t("settings","Disabled apps")}}),t._v(" "),t.updateCount>0?e("AppNavigationItem",{attrs:{id:"app-category-updates",to:{name:"apps-category",params:{category:"updates"}},icon:"icon-download",title:t.t("settings","Updates")}},[e("AppNavigationCounter",{attrs:{slot:"counter"},slot:"counter"},[t._v("\n\t\t\t\t\t"+t._s(t.updateCount)+"\n\t\t\t\t")])],1):t._e(),t._v(" "),e("AppNavigationItem",{attrs:{id:"app-category-your-bundles",to:{name:"apps-category",params:{category:"app-bundles"}},icon:"icon-category-app-bundles",title:t.t("settings","App bundles")}}),t._v(" "),e("AppNavigationSpacer"),t._v(" "),t.settings.appstoreEnabled?[e("AppNavigationItem",{attrs:{id:"app-category-featured",to:{name:"apps-category",params:{category:"featured"}},icon:"icon-favorite",title:t.t("settings","Featured apps")}}),t._v(" "),t._l(t.categories,(function(t){return e("AppNavigationItem",{key:"icon-category-"+t.ident,attrs:{icon:"icon-category-"+t.ident,to:{name:"apps-category",params:{category:t.ident}},title:t.displayName}})}))]:t._e(),t._v(" "),e("AppNavigationItem",{attrs:{id:"app-developer-docs",title:t.t("settings","Developer documentation")+" ↗"},on:{click:t.openDeveloperDocumentation}})]},proxy:!0}])}),t._v(" "),e("AppContent",{staticClass:"app-settings-content",class:{"icon-loading":t.loadingList}},[e("AppList",{attrs:{category:t.category,app:t.app,search:t.searchQuery}})],1),t._v(" "),t.id&&t.app?e("AppSidebar",t._b({class:{"app-sidebar--without-background":!t.appSidebar.background},on:{close:t.hideAppDetails},scopedSlots:t._u([t.appSidebar.background?null:{key:"header",fn:function(){return[e("div",{staticClass:"app-sidebar-header__figure--default-app-icon icon-settings-dark"})]},proxy:!0},{key:"description",fn:function(){return[300===t.app.level||200===t.app.level||t.hasRating?e("div",{staticClass:"app-level"},[300===t.app.level?e("span",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.t("settings","This app is supported via your current Nextcloud subscription."),expression:"t('settings', 'This app is supported via your current Nextcloud subscription.')",modifiers:{auto:!0}}],staticClass:"supported icon-checkmark-color"},[t._v("\n\t\t\t\t\t"+t._s(t.t("settings","Supported")))]):t._e(),t._v(" "),200===t.app.level?e("span",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.t("settings","Featured apps are developed by and within the community. They offer central functionality and are ready for production use."),expression:"t('settings', 'Featured apps are developed by and within the community. They offer central functionality and are ready for production use.')",modifiers:{auto:!0}}],staticClass:"official icon-checkmark"},[t._v("\n\t\t\t\t\t"+t._s(t.t("settings","Featured")))]):t._e(),t._v(" "),t.hasRating?e("AppScore",{attrs:{score:t.app.appstoreData.ratingOverall}}):t._e()],1):t._e(),t._v(" "),e("div",{staticClass:"app-version"},[e("p",[t._v(t._s(t.app.version))])])]},proxy:!0}],null,!0)},"AppSidebar",t.appSidebar,!1),[t._v(" "),t._v(" "),e("AppSidebarTab",{attrs:{id:"desc",icon:"icon-category-office",name:t.t("settings","Details"),order:0}},[e("AppDetails",{attrs:{app:t.app}})],1),t._v(" "),t.app.appstoreData&&t.app.releases[0].translations.en.changelog?e("AppSidebarTab",{attrs:{id:"desca",icon:"icon-category-organization",name:t.t("settings","Changelog"),order:1}},t._l(t.app.releases,(function(n){return e("div",{key:n.version,staticClass:"app-sidebar-tabs__release"},[e("h2",[t._v(t._s(n.version))]),t._v(" "),t.changelog(n)?e("Markdown",{attrs:{text:t.changelog(n)}}):t._e()],1)})),0):t._e()],1):t._e()],1)}),[],!1,null,"d3244798",null).exports}}]); +//# sourceMappingURL=settings-apps-view-7418.js.map?v=a58f27a0cd6f99595ea8
\ No newline at end of file diff --git a/dist/settings-apps-view-7418.js.map b/dist/settings-apps-view-7418.js.map index 1698b5c675d..1c0108407aa 100644 --- a/dist/settings-apps-view-7418.js.map +++ b/dist/settings-apps-view-7418.js.map @@ -1 +1 @@ -{"version":3,"file":"settings-apps-view-7418.js?v=79a434bb85984935c596","mappings":"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","sources":["webpack:///nextcloud/apps/settings/src/components/AppDetails.vue?vue&type=style&index=0&id=8ea5f476&scoped=true&lang=scss&","webpack:///nextcloud/apps/settings/src/components/Markdown.vue?vue&type=style&index=0&id=652eb552&scoped=true&lang=scss&","webpack:///nextcloud/apps/settings/src/views/Apps.vue?vue&type=style&index=0&id=d3244798&lang=scss&scoped=true&","webpack:///nextcloud/apps/settings/src/components/AppList/AppItem.vue?vue&type=style&index=0&id=06bcd5b6&scoped=true&lang=css&","webpack:///nextcloud/apps/settings/src/views/Apps.vue?vue&type=template&id=d3244798&scoped=true&","webpack:///nextcloud/apps/settings/src/components/AppList/AppScore.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/settings/src/components/AppList/AppScore.vue","webpack://nextcloud/./apps/settings/src/components/AppList/AppScore.vue?26fd","webpack:///nextcloud/apps/settings/src/components/AppList/AppScore.vue?vue&type=template&id=3b3081d1&","webpack:///nextcloud/apps/settings/src/service/rebuild-navigation.js","webpack:///nextcloud/apps/settings/src/mixins/AppManagement.js","webpack:///nextcloud/apps/settings/src/components/SvgFilterMixin.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/settings/src/components/SvgFilterMixin.vue","webpack:///nextcloud/apps/settings/src/components/AppList/AppItem.vue","webpack://nextcloud/./apps/settings/src/components/SvgFilterMixin.vue?5bcd","webpack:///nextcloud/apps/settings/src/components/AppList/AppItem.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/settings/src/components/AppList/AppItem.vue?8c5c","webpack://nextcloud/./apps/settings/src/components/AppList/AppItem.vue?a9a1","webpack:///nextcloud/apps/settings/src/components/AppList/AppItem.vue?vue&type=template&id=06bcd5b6&scoped=true&","webpack://nextcloud/./apps/settings/src/components/PrefixMixin.vue?c564","webpack:///nextcloud/apps/settings/src/components/PrefixMixin.vue","webpack:///nextcloud/apps/settings/src/components/AppList.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/settings/src/components/AppList.vue","webpack://nextcloud/./apps/settings/src/components/AppList.vue?8acf","webpack:///nextcloud/apps/settings/src/components/AppList.vue?vue&type=template&id=35e8fed4&","webpack:///nextcloud/apps/settings/src/components/Markdown.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/settings/src/components/Markdown.vue","webpack://nextcloud/./apps/settings/src/components/Markdown.vue?1464","webpack://nextcloud/./apps/settings/src/components/Markdown.vue?26cf","webpack:///nextcloud/apps/settings/src/components/Markdown.vue?vue&type=template&id=652eb552&scoped=true&","webpack:///nextcloud/apps/settings/src/components/AppDetails.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/settings/src/components/AppDetails.vue","webpack://nextcloud/./apps/settings/src/components/AppDetails.vue?60ff","webpack://nextcloud/./apps/settings/src/components/AppDetails.vue?2807","webpack:///nextcloud/apps/settings/src/components/AppDetails.vue?vue&type=template&id=8ea5f476&scoped=true&","webpack:///nextcloud/apps/settings/src/views/Apps.vue","webpack:///nextcloud/apps/settings/src/views/Apps.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/settings/src/views/Apps.vue?1019","webpack://nextcloud/./apps/settings/src/views/Apps.vue?7b97"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".app-details[data-v-8ea5f476]{padding:20px}.app-details__actions-manage[data-v-8ea5f476]{display:flex}.app-details__actions-manage input[data-v-8ea5f476]{flex:0 1 auto;min-width:0;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.app-details__dependencies[data-v-8ea5f476]{opacity:.7}.app-details__documentation[data-v-8ea5f476]{padding-top:20px}.app-details__description[data-v-8ea5f476]{padding-top:20px}.force[data-v-8ea5f476]{color:var(--color-error);border-color:var(--color-error);background:var(--color-main-background)}.force[data-v-8ea5f476]:hover,.force[data-v-8ea5f476]:active{color:var(--color-main-background);border-color:var(--color-error) !important;background:var(--color-error)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/AppDetails.vue\"],\"names\":[],\"mappings\":\"AAuNA,8BACC,YAAA,CAIC,8CAEC,YAAA,CACA,oDACC,aAAA,CACA,WAAA,CACA,sBAAA,CACA,kBAAA,CACA,eAAA,CAIH,4CACC,UAAA,CAED,6CACC,gBAAA,CAED,2CACC,gBAAA,CAIF,wBACC,wBAAA,CACA,+BAAA,CACA,uCAAA,CAED,6DAEC,kCAAA,CACA,0CAAA,CACA,6BAAA\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n.app-details {\\n\\tpadding: 20px;\\n\\n\\t&__actions {\\n\\t\\t// app management\\n\\t\\t&-manage {\\n\\t\\t\\t// if too many, shrink them and ellipsis\\n\\t\\t\\tdisplay: flex;\\n\\t\\t\\tinput {\\n\\t\\t\\t\\tflex: 0 1 auto;\\n\\t\\t\\t\\tmin-width: 0;\\n\\t\\t\\t\\ttext-overflow: ellipsis;\\n\\t\\t\\t\\twhite-space: nowrap;\\n\\t\\t\\t\\toverflow: hidden;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\t&__dependencies {\\n\\t\\topacity: .7;\\n\\t}\\n\\t&__documentation {\\n\\t\\tpadding-top: 20px;\\n\\t}\\n\\t&__description {\\n\\t\\tpadding-top: 20px;\\n\\t}\\n}\\n\\n.force {\\n\\tcolor: var(--color-error);\\n\\tborder-color: var(--color-error);\\n\\tbackground: var(--color-main-background);\\n}\\n.force:hover,\\n.force:active {\\n\\tcolor: var(--color-main-background);\\n\\tborder-color: var(--color-error) !important;\\n\\tbackground: var(--color-error);\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".settings-markdown[data-v-652eb552] h1,.settings-markdown[data-v-652eb552] h2,.settings-markdown[data-v-652eb552] h3,.settings-markdown[data-v-652eb552] h4,.settings-markdown[data-v-652eb552] h5,.settings-markdown[data-v-652eb552] h6{font-weight:600;line-height:120%;margin-top:24px;margin-bottom:12px;color:var(--color-main-text)}.settings-markdown[data-v-652eb552] h1{font-size:36px;margin-top:48px}.settings-markdown[data-v-652eb552] h2{font-size:28px;margin-top:48px}.settings-markdown[data-v-652eb552] h3{font-size:24px}.settings-markdown[data-v-652eb552] h4{font-size:21px}.settings-markdown[data-v-652eb552] h5{font-size:17px}.settings-markdown[data-v-652eb552] h6{font-size:var(--default-font-size)}.settings-markdown[data-v-652eb552] pre{white-space:pre;overflow-x:auto;background-color:var(--color-background-dark);border-radius:var(--border-radius);padding:1em 1.3em;margin-bottom:1em}.settings-markdown[data-v-652eb552] p code{background-color:var(--color-background-dark);border-radius:var(--border-radius);padding:.1em .3em}.settings-markdown[data-v-652eb552] li{position:relative}.settings-markdown[data-v-652eb552] ul,.settings-markdown[data-v-652eb552] ol{padding-left:10px;margin-left:10px}.settings-markdown[data-v-652eb552] ul li{list-style-type:disc}.settings-markdown[data-v-652eb552] ul>li>ul>li{list-style-type:circle}.settings-markdown[data-v-652eb552] ul>li>ul>li ul li{list-style-type:square}.settings-markdown[data-v-652eb552] blockquote{padding-left:1em;border-left:4px solid var(--color-primary-element);color:var(--color-text-maxcontrast);margin-left:0;margin-right:0}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/Markdown.vue\"],\"names\":[],\"mappings\":\"AAgHA,0OAMC,eAAA,CACA,gBAAA,CACA,eAAA,CACA,kBAAA,CACA,4BAAA,CAGD,uCACC,cAAA,CACA,eAAA,CAGD,uCACC,cAAA,CACA,eAAA,CAGD,uCACC,cAAA,CAGD,uCACC,cAAA,CAGD,uCACC,cAAA,CAGD,uCACC,kCAAA,CAGD,wCACC,eAAA,CACA,eAAA,CACA,6CAAA,CACA,kCAAA,CACA,iBAAA,CACA,iBAAA,CAGD,2CACC,6CAAA,CACA,kCAAA,CACA,iBAAA,CAGD,uCACC,iBAAA,CAGD,8EACC,iBAAA,CACA,gBAAA,CAGD,0CACC,oBAAA,CAGD,gDACC,sBAAA,CAGD,sDACC,sBAAA,CAGD,+CACC,gBAAA,CACA,kDAAA,CACA,mCAAA,CACA,aAAA,CACA,cAAA\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n.settings-markdown::v-deep {\\n\\nh1,\\nh2,\\nh3,\\nh4,\\nh5,\\nh6 {\\n\\tfont-weight: 600;\\n\\tline-height: 120%;\\n\\tmargin-top: 24px;\\n\\tmargin-bottom: 12px;\\n\\tcolor: var(--color-main-text);\\n}\\n\\nh1 {\\n\\tfont-size: 36px;\\n\\tmargin-top: 48px;\\n}\\n\\nh2 {\\n\\tfont-size: 28px;\\n\\tmargin-top: 48px;\\n}\\n\\nh3 {\\n\\tfont-size: 24px;\\n}\\n\\nh4 {\\n\\tfont-size: 21px;\\n}\\n\\nh5 {\\n\\tfont-size: 17px;\\n}\\n\\nh6 {\\n\\tfont-size: var(--default-font-size);\\n}\\n\\npre {\\n\\twhite-space: pre;\\n\\toverflow-x: auto;\\n\\tbackground-color: var(--color-background-dark);\\n\\tborder-radius: var(--border-radius);\\n\\tpadding: 1em 1.3em;\\n\\tmargin-bottom: 1em;\\n}\\n\\np code {\\n\\tbackground-color: var(--color-background-dark);\\n\\tborder-radius: var(--border-radius);\\n\\tpadding: .1em .3em;\\n}\\n\\nli {\\n\\tposition: relative;\\n}\\n\\nul, ol {\\n\\tpadding-left: 10px;\\n\\tmargin-left: 10px;\\n}\\n\\nul li {\\n\\tlist-style-type: disc;\\n}\\n\\nul > li > ul > li {\\n\\tlist-style-type: circle;\\n}\\n\\nul > li > ul > li ul li {\\n\\tlist-style-type: square;\\n}\\n\\nblockquote {\\n\\tpadding-left: 1em;\\n\\tborder-left: 4px solid var(--color-primary-element);\\n\\tcolor: var(--color-text-maxcontrast);\\n\\tmargin-left: 0;\\n\\tmargin-right: 0;\\n}\\n\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".app-sidebar[data-v-d3244798]:not(.app-sidebar--without-background) :not(.app-sidebar-header--compact) .app-sidebar-header__figure{background-size:cover}.app-sidebar[data-v-d3244798]:not(.app-sidebar--without-background) .app-sidebar-header--compact .app-sidebar-header__figure{background-size:32px;filter:invert(1)}.app-sidebar[data-v-d3244798] .app-sidebar-header__description .app-version{padding-left:10px}.app-sidebar[data-v-d3244798].app-sidebar--without-background .app-sidebar-header__figure{display:flex;align-items:center;justify-content:center}.app-sidebar[data-v-d3244798].app-sidebar--without-background .app-sidebar-header__figure--default-app-icon{width:32px;height:32px;background-size:32px}.app-sidebar[data-v-d3244798] .app-sidebar-header__desc .app-sidebar-header__subtitle{overflow:visible !important;height:auto;white-space:normal !important;line-height:16px}.app-sidebar[data-v-d3244798] .app-sidebar-header__action{margin:0 20px}.app-sidebar[data-v-d3244798] .app-sidebar-header__action input{margin:3px}.app-navigation[data-v-d3244798] button.app-navigation-toggle{top:8px;right:-8px}.app-sidebar-tabs__release h2[data-v-d3244798]{border-bottom:1px solid var(--color-border)}.app-sidebar-tabs__release[data-v-d3244798] h3{font-size:20px}.app-sidebar-tabs__release[data-v-d3244798] h4{font-size:17px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/views/Apps.vue\"],\"names\":[],\"mappings\":\"AA2TE,mIACC,qBAAA,CAGD,6HACC,oBAAA,CAEA,gBAAA,CAKD,4EACC,iBAAA,CAMD,0FACC,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,4GACC,UAAA,CACA,WAAA,CACA,oBAAA,CAQF,sFACC,2BAAA,CACA,WAAA,CACA,6BAAA,CACA,gBAAA,CAIF,0DAEC,aAAA,CACA,gEACC,UAAA,CAMH,8DACC,OAAA,CACA,UAAA,CAIA,+CACC,2CAAA,CAKA,gDACC,cAAA,CAED,gDACC,cAAA\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n.app-sidebar::v-deep {\\n\\t&:not(.app-sidebar--without-background) {\\n\\t\\t// with full screenshot, let's fill the figure\\n\\t\\t:not(.app-sidebar-header--compact) .app-sidebar-header__figure {\\n\\t\\t\\tbackground-size: cover;\\n\\t\\t}\\n\\t\\t// revert sidebar app icon so it is black\\n\\t\\t.app-sidebar-header--compact .app-sidebar-header__figure {\\n\\t\\t\\tbackground-size: 32px;\\n\\n\\t\\t\\tfilter: invert(1);\\n\\t\\t}\\n\\t}\\n\\n\\t.app-sidebar-header__description {\\n\\t\\t.app-version {\\n\\t\\t\\tpadding-left: 10px;\\n\\t\\t}\\n\\t}\\n\\n\\t// default icon slot styling\\n\\t&.app-sidebar--without-background {\\n\\t\\t.app-sidebar-header__figure {\\n\\t\\t\\tdisplay: flex;\\n\\t\\t\\talign-items: center;\\n\\t\\t\\tjustify-content: center;\\n\\t\\t\\t&--default-app-icon {\\n\\t\\t\\t\\twidth: 32px;\\n\\t\\t\\t\\theight: 32px;\\n\\t\\t\\t\\tbackground-size: 32px;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t// TODO: migrate to components\\n\\t.app-sidebar-header__desc {\\n\\t\\t// allow multi line subtitle for the license\\n\\t\\t.app-sidebar-header__subtitle {\\n\\t\\t\\toverflow: visible !important;\\n\\t\\t\\theight: auto;\\n\\t\\t\\twhite-space: normal !important;\\n\\t\\t\\tline-height: 16px;\\n\\t\\t}\\n\\t}\\n\\n\\t.app-sidebar-header__action {\\n\\t\\t// align with tab content\\n\\t\\tmargin: 0 20px;\\n\\t\\tinput {\\n\\t\\t\\tmargin: 3px;\\n\\t\\t}\\n\\t}\\n}\\n\\n// Align the appNavigation toggle with the apps header toolbar\\n.app-navigation::v-deep button.app-navigation-toggle {\\n\\ttop: 8px;\\n\\tright: -8px;\\n}\\n\\n.app-sidebar-tabs__release {\\n\\th2 {\\n\\t\\tborder-bottom: 1px solid var(--color-border);\\n\\t}\\n\\n\\t// Overwrite changelog heading styles\\n\\t::v-deep {\\n\\t\\th3 {\\n\\t\\t\\tfont-size: 20px;\\n\\t\\t}\\n\\t\\th4 {\\n\\t\\t\\tfont-size: 17px;\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\n.force[data-v-06bcd5b6] {\\n\\tbackground: var(--color-main-background);\\n\\tborder-color: var(--color-error);\\n\\tcolor: var(--color-error);\\n}\\n.force[data-v-06bcd5b6]:hover,\\n.force[data-v-06bcd5b6]:active {\\n\\tbackground: var(--color-error);\\n\\tborder-color: var(--color-error) !important;\\n\\tcolor: var(--color-main-background);\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/AppList/AppItem.vue\"],\"names\":[],\"mappings\":\";AAmLA;CACA,wCAAA;CACA,gCAAA;CACA,yBAAA;AACA;AACA;;CAEA,8BAAA;CACA,2CAAA;CACA,mCAAA;AACA\",\"sourcesContent\":[\"<!--\\n - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\\n -\\n - @author Julius Härtl <jus@bitgrid.net>\\n -\\n - @license GNU AGPL version 3 or any later version\\n -\\n - This program is free software: you can redistribute it and/or modify\\n - it under the terms of the GNU Affero General Public License as\\n - published by the Free Software Foundation, either version 3 of the\\n - License, or (at your option) any later version.\\n -\\n - This program is distributed in the hope that it will be useful,\\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\n - GNU Affero General Public License for more details.\\n -\\n - You should have received a copy of the GNU Affero General Public License\\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\\n -\\n -->\\n\\n<template>\\n\\t<div class=\\\"section\\\" :class=\\\"{ selected: isSelected }\\\" @click=\\\"showAppDetails\\\">\\n\\t\\t<div class=\\\"app-image app-image-icon\\\" @click=\\\"showAppDetails\\\">\\n\\t\\t\\t<div v-if=\\\"(listView && !app.preview) || (!listView && !screenshotLoaded)\\\" class=\\\"icon-settings-dark\\\" />\\n\\n\\t\\t\\t<svg v-else-if=\\\"listView && app.preview\\\"\\n\\t\\t\\t\\twidth=\\\"32\\\"\\n\\t\\t\\t\\theight=\\\"32\\\"\\n\\t\\t\\t\\tviewBox=\\\"0 0 32 32\\\">\\n\\t\\t\\t\\t<defs><filter :id=\\\"filterId\\\"><feColorMatrix in=\\\"SourceGraphic\\\" type=\\\"matrix\\\" values=\\\"-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0\\\" /></filter></defs>\\n\\t\\t\\t\\t<image x=\\\"0\\\"\\n\\t\\t\\t\\t\\ty=\\\"0\\\"\\n\\t\\t\\t\\t\\twidth=\\\"32\\\"\\n\\t\\t\\t\\t\\theight=\\\"32\\\"\\n\\t\\t\\t\\t\\tpreserveAspectRatio=\\\"xMinYMin meet\\\"\\n\\t\\t\\t\\t\\t:filter=\\\"filterUrl\\\"\\n\\t\\t\\t\\t\\t:xlink:href=\\\"app.preview\\\"\\n\\t\\t\\t\\t\\tclass=\\\"app-icon\\\" />\\n\\t\\t\\t</svg>\\n\\n\\t\\t\\t<img v-if=\\\"!listView && app.screenshot && screenshotLoaded\\\" :src=\\\"app.screenshot\\\" width=\\\"100%\\\">\\n\\t\\t</div>\\n\\t\\t<div class=\\\"app-name\\\" @click=\\\"showAppDetails\\\">\\n\\t\\t\\t{{ app.name }}\\n\\t\\t</div>\\n\\t\\t<div v-if=\\\"!listView\\\" class=\\\"app-summary\\\">\\n\\t\\t\\t{{ app.summary }}\\n\\t\\t</div>\\n\\t\\t<div v-if=\\\"listView\\\" class=\\\"app-version\\\">\\n\\t\\t\\t<span v-if=\\\"app.version\\\">{{ app.version }}</span>\\n\\t\\t\\t<span v-else-if=\\\"app.appstoreData.releases[0].version\\\">{{ app.appstoreData.releases[0].version }}</span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"app-level\\\">\\n\\t\\t\\t<span v-if=\\\"app.level === 300\\\"\\n\\t\\t\\t\\tv-tooltip.auto=\\\"t('settings', 'This app is supported via your current Nextcloud subscription.')\\\"\\n\\t\\t\\t\\tclass=\\\"supported icon-checkmark-color\\\">\\n\\t\\t\\t\\t{{ t('settings', 'Supported') }}</span>\\n\\t\\t\\t<span v-if=\\\"app.level === 200\\\"\\n\\t\\t\\t\\tv-tooltip.auto=\\\"t('settings', 'Featured apps are developed by and within the community. They offer central functionality and are ready for production use.')\\\"\\n\\t\\t\\t\\tclass=\\\"official icon-checkmark\\\">\\n\\t\\t\\t\\t{{ t('settings', 'Featured') }}</span>\\n\\t\\t\\t<AppScore v-if=\\\"hasRating && !listView\\\" :score=\\\"app.score\\\" />\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"actions\\\">\\n\\t\\t\\t<div v-if=\\\"app.error\\\" class=\\\"warning\\\">\\n\\t\\t\\t\\t{{ app.error }}\\n\\t\\t\\t</div>\\n\\t\\t\\t<div v-if=\\\"isLoading\\\" class=\\\"icon icon-loading-small\\\" />\\n\\t\\t\\t<input v-if=\\\"app.update\\\"\\n\\t\\t\\t\\tclass=\\\"update primary\\\"\\n\\t\\t\\t\\ttype=\\\"button\\\"\\n\\t\\t\\t\\t:value=\\\"t('settings', 'Update to {update}', {update:app.update})\\\"\\n\\t\\t\\t\\t:disabled=\\\"installing || isLoading\\\"\\n\\t\\t\\t\\t@click.stop=\\\"update(app.id)\\\">\\n\\t\\t\\t<input v-if=\\\"app.canUnInstall\\\"\\n\\t\\t\\t\\tclass=\\\"uninstall\\\"\\n\\t\\t\\t\\ttype=\\\"button\\\"\\n\\t\\t\\t\\t:value=\\\"t('settings', 'Remove')\\\"\\n\\t\\t\\t\\t:disabled=\\\"installing || isLoading\\\"\\n\\t\\t\\t\\t@click.stop=\\\"remove(app.id)\\\">\\n\\t\\t\\t<input v-if=\\\"app.active\\\"\\n\\t\\t\\t\\tclass=\\\"enable\\\"\\n\\t\\t\\t\\ttype=\\\"button\\\"\\n\\t\\t\\t\\t:value=\\\"t('settings','Disable')\\\"\\n\\t\\t\\t\\t:disabled=\\\"installing || isLoading\\\"\\n\\t\\t\\t\\t@click.stop=\\\"disable(app.id)\\\">\\n\\t\\t\\t<input v-if=\\\"!app.active && (app.canInstall || app.isCompatible)\\\"\\n\\t\\t\\t\\tv-tooltip.auto=\\\"enableButtonTooltip\\\"\\n\\t\\t\\t\\tclass=\\\"enable\\\"\\n\\t\\t\\t\\ttype=\\\"button\\\"\\n\\t\\t\\t\\t:value=\\\"enableButtonText\\\"\\n\\t\\t\\t\\t:disabled=\\\"!app.canInstall || installing || isLoading\\\"\\n\\t\\t\\t\\t@click.stop=\\\"enable(app.id)\\\">\\n\\t\\t\\t<input v-else-if=\\\"!app.active\\\"\\n\\t\\t\\t\\tv-tooltip.auto=\\\"forceEnableButtonTooltip\\\"\\n\\t\\t\\t\\tclass=\\\"enable force\\\"\\n\\t\\t\\t\\ttype=\\\"button\\\"\\n\\t\\t\\t\\t:value=\\\"forceEnableButtonText\\\"\\n\\t\\t\\t\\t:disabled=\\\"installing || isLoading\\\"\\n\\t\\t\\t\\t@click.stop=\\\"forceEnable(app.id)\\\">\\n\\t\\t</div>\\n\\t</div>\\n</template>\\n\\n<script>\\nimport AppScore from './AppScore'\\nimport AppManagement from '../../mixins/AppManagement'\\nimport SvgFilterMixin from '../SvgFilterMixin'\\n\\nexport default {\\n\\tname: 'AppItem',\\n\\tcomponents: {\\n\\t\\tAppScore,\\n\\t},\\n\\tmixins: [AppManagement, SvgFilterMixin],\\n\\tprops: {\\n\\t\\tapp: {},\\n\\t\\tcategory: {},\\n\\t\\tlistView: {\\n\\t\\t\\ttype: Boolean,\\n\\t\\t\\tdefault: true,\\n\\t\\t},\\n\\t},\\n\\tdata() {\\n\\t\\treturn {\\n\\t\\t\\tisSelected: false,\\n\\t\\t\\tscrolled: false,\\n\\t\\t\\tscreenshotLoaded: false,\\n\\t\\t}\\n\\t},\\n\\tcomputed: {\\n\\t\\thasRating() {\\n\\t\\t\\treturn this.app.appstoreData && this.app.appstoreData.ratingNumOverall > 5\\n\\t\\t},\\n\\t},\\n\\twatch: {\\n\\t\\t'$route.params.id'(id) {\\n\\t\\t\\tthis.isSelected = (this.app.id === id)\\n\\t\\t},\\n\\t},\\n\\tmounted() {\\n\\t\\tthis.isSelected = (this.app.id === this.$route.params.id)\\n\\t\\tif (this.app.releases && this.app.screenshot) {\\n\\t\\t\\tconst image = new Image()\\n\\t\\t\\timage.onload = (e) => {\\n\\t\\t\\t\\tthis.screenshotLoaded = true\\n\\t\\t\\t}\\n\\t\\t\\timage.src = this.app.screenshot\\n\\t\\t}\\n\\t},\\n\\twatchers: {\\n\\n\\t},\\n\\tmethods: {\\n\\t\\tasync showAppDetails(event) {\\n\\t\\t\\tif (event.currentTarget.tagName === 'INPUT' || event.currentTarget.tagName === 'A') {\\n\\t\\t\\t\\treturn\\n\\t\\t\\t}\\n\\t\\t\\ttry {\\n\\t\\t\\t\\tawait this.$router.push({\\n\\t\\t\\t\\t\\tname: 'apps-details',\\n\\t\\t\\t\\t\\tparams: { category: this.category, id: this.app.id },\\n\\t\\t\\t\\t})\\n\\t\\t\\t} catch (e) {\\n\\t\\t\\t\\t// we already view this app\\n\\t\\t\\t}\\n\\t\\t},\\n\\t\\tprefix(prefix, content) {\\n\\t\\t\\treturn prefix + '_' + content\\n\\t\\t},\\n\\t},\\n}\\n</script>\\n\\n<style scoped>\\n\\t.force {\\n\\t\\tbackground: var(--color-main-background);\\n\\t\\tborder-color: var(--color-error);\\n\\t\\tcolor: var(--color-error);\\n\\t}\\n\\t.force:hover,\\n\\t.force:active {\\n\\t\\tbackground: var(--color-error);\\n\\t\\tborder-color: var(--color-error) !important;\\n\\t\\tcolor: var(--color-main-background);\\n\\t}\\n</style>\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Content',{class:{ 'with-app-sidebar': _vm.app},attrs:{\"app-name\":\"settings\",\"content-class\":{ 'icon-loading': _vm.loadingList },\"navigation-class\":{ 'icon-loading': _vm.loading }}},[_c('AppNavigation',{scopedSlots:_vm._u([{key:\"list\",fn:function(){return [_c('AppNavigationItem',{attrs:{\"id\":\"app-category-your-apps\",\"to\":{ name: 'apps' },\"exact\":true,\"icon\":\"icon-category-installed\",\"title\":_vm.t('settings', 'Your apps')}}),_vm._v(\" \"),_c('AppNavigationItem',{attrs:{\"id\":\"app-category-enabled\",\"to\":{ name: 'apps-category', params: { category: 'enabled' } },\"icon\":\"icon-category-enabled\",\"title\":_vm.t('settings', 'Active apps')}}),_vm._v(\" \"),_c('AppNavigationItem',{attrs:{\"id\":\"app-category-disabled\",\"to\":{ name: 'apps-category', params: { category: 'disabled' } },\"icon\":\"icon-category-disabled\",\"title\":_vm.t('settings', 'Disabled apps')}}),_vm._v(\" \"),(_vm.updateCount > 0)?_c('AppNavigationItem',{attrs:{\"id\":\"app-category-updates\",\"to\":{ name: 'apps-category', params: { category: 'updates' } },\"icon\":\"icon-download\",\"title\":_vm.t('settings', 'Updates')}},[_c('AppNavigationCounter',{attrs:{\"slot\":\"counter\"},slot:\"counter\"},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.updateCount)+\"\\n\\t\\t\\t\\t\")])],1):_vm._e(),_vm._v(\" \"),_c('AppNavigationItem',{attrs:{\"id\":\"app-category-your-bundles\",\"to\":{ name: 'apps-category', params: { category: 'app-bundles' } },\"icon\":\"icon-category-app-bundles\",\"title\":_vm.t('settings', 'App bundles')}}),_vm._v(\" \"),_c('AppNavigationSpacer'),_vm._v(\" \"),(_vm.settings.appstoreEnabled)?[_c('AppNavigationItem',{attrs:{\"id\":\"app-category-featured\",\"to\":{ name: 'apps-category', params: { category: 'featured' } },\"icon\":\"icon-favorite\",\"title\":_vm.t('settings', 'Featured apps')}}),_vm._v(\" \"),_vm._l((_vm.categories),function(cat){return _c('AppNavigationItem',{key:'icon-category-' + cat.ident,attrs:{\"icon\":'icon-category-' + cat.ident,\"to\":{\n\t\t\t\t\t\tname: 'apps-category',\n\t\t\t\t\t\tparams: { category: cat.ident },\n\t\t\t\t\t},\"title\":cat.displayName}})})]:_vm._e(),_vm._v(\" \"),_c('AppNavigationItem',{attrs:{\"id\":\"app-developer-docs\",\"title\":_vm.t('settings', 'Developer documentation') + ' ↗'},on:{\"click\":_vm.openDeveloperDocumentation}})]},proxy:true}])}),_vm._v(\" \"),_c('AppContent',{staticClass:\"app-settings-content\",class:{ 'icon-loading': _vm.loadingList }},[_c('AppList',{attrs:{\"category\":_vm.category,\"app\":_vm.app,\"search\":_vm.searchQuery}})],1),_vm._v(\" \"),(_vm.id && _vm.app)?_c('AppSidebar',_vm._b({class:{'app-sidebar--without-background': !_vm.appSidebar.background},on:{\"close\":_vm.hideAppDetails},scopedSlots:_vm._u([(!_vm.appSidebar.background)?{key:\"header\",fn:function(){return [_c('div',{staticClass:\"app-sidebar-header__figure--default-app-icon icon-settings-dark\"})]},proxy:true}:null,{key:\"description\",fn:function(){return [(_vm.app.level === 300 || _vm.app.level === 200 || _vm.hasRating)?_c('div',{staticClass:\"app-level\"},[(_vm.app.level === 300)?_c('span',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.t('settings', 'This app is supported via your current Nextcloud subscription.')),expression:\"t('settings', 'This app is supported via your current Nextcloud subscription.')\",modifiers:{\"auto\":true}}],staticClass:\"supported icon-checkmark-color\"},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Supported')))]):_vm._e(),_vm._v(\" \"),(_vm.app.level === 200)?_c('span',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.t('settings', 'Featured apps are developed by and within the community. They offer central functionality and are ready for production use.')),expression:\"t('settings', 'Featured apps are developed by and within the community. They offer central functionality and are ready for production use.')\",modifiers:{\"auto\":true}}],staticClass:\"official icon-checkmark\"},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Featured')))]):_vm._e(),_vm._v(\" \"),(_vm.hasRating)?_c('AppScore',{attrs:{\"score\":_vm.app.appstoreData.ratingOverall}}):_vm._e()],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"app-version\"},[_c('p',[_vm._v(_vm._s(_vm.app.version))])])]},proxy:true}],null,true)},'AppSidebar',_vm.appSidebar,false),[_vm._v(\" \"),_vm._v(\" \"),_c('AppSidebarTab',{attrs:{\"id\":\"desc\",\"icon\":\"icon-category-office\",\"name\":_vm.t('settings', 'Details'),\"order\":0}},[_c('AppDetails',{attrs:{\"app\":_vm.app}})],1),_vm._v(\" \"),(_vm.app.appstoreData && _vm.app.releases[0].translations.en.changelog)?_c('AppSidebarTab',{attrs:{\"id\":\"desca\",\"icon\":\"icon-category-organization\",\"name\":_vm.t('settings', 'Changelog'),\"order\":1}},_vm._l((_vm.app.releases),function(release){return _c('div',{key:release.version,staticClass:\"app-sidebar-tabs__release\"},[_c('h2',[_vm._v(_vm._s(release.version))]),_vm._v(\" \"),(_vm.changelog(release))?_c('Markdown',{attrs:{\"text\":_vm.changelog(release)}}):_vm._e()],1)}),0):_vm._e()],1):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppScore.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppScore.vue?vue&type=script&lang=js&\"","<!--\n - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<img :src=\"scoreImage\" class=\"app-score-image\">\n</template>\n<script>\nimport { imagePath } from '@nextcloud/router'\n\nexport default {\n\tname: 'AppScore',\n\tprops: ['score'],\n\tcomputed: {\n\t\tscoreImage() {\n\t\t\tconst score = Math.round(this.score * 10)\n\t\t\tconst imageName = 'rating/s' + score + '.svg'\n\t\t\treturn imagePath('core', imageName)\n\t\t},\n\t},\n}\n</script>\n","import { render, staticRenderFns } from \"./AppScore.vue?vue&type=template&id=3b3081d1&\"\nimport script from \"./AppScore.vue?vue&type=script&lang=js&\"\nexport * from \"./AppScore.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('img',{staticClass:\"app-score-image\",attrs:{\"src\":_vm.scoreImage}})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import axios from '@nextcloud/axios'\nimport { generateOcsUrl } from '@nextcloud/router'\n\nexport default () => {\n\treturn axios.get(generateOcsUrl('core/navigation', 2) + '/apps?format=json')\n\t\t.then(({ data }) => {\n\t\t\tif (data.ocs.meta.statuscode !== 200) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst addedApps = {}\n\t\t\tconst navEntries = data.ocs.data\n\t\t\tconst container = document.querySelector('#navigation #apps ul')\n\n\t\t\t// remove disabled apps\n\t\t\tnavEntries.forEach((entry) => {\n\t\t\t\tif (!container.querySelector('li[data-id=\"' + entry.id + '\"]')) {\n\t\t\t\t\taddedApps[entry.id] = true\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tcontainer.querySelectorAll('li[data-id]').forEach((el, index) => {\n\t\t\t\tconst id = el.dataset.id\n\t\t\t\t// remove all apps that are not in the correct order\n\t\t\t\tif (!navEntries[index] || (navEntries[index] && navEntries[index].id !== id)) {\n\t\t\t\t\tel.remove()\n\t\t\t\t\tdocument.querySelector(`#appmenu li[data-id=${id}]`).remove()\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tlet previousEntry = {}\n\t\t\t// add enabled apps to #navigation and #appmenu\n\t\t\tnavEntries.forEach((entry) => {\n\t\t\t\tif (container.querySelector(`li[data-id=\"${entry.id}\"]`) === null) {\n\t\t\t\t\tconst li = document.createElement('li')\n\t\t\t\t\tli.dataset.id = entry.id\n\t\t\t\t\tconst img = `<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" alt=\"\">\n\t\t\t\t\t <defs>\n\t\t\t\t\t <filter id=\"invertMenuMore-${entry.id}\"><feColorMatrix in=\"SourceGraphic\" type=\"matrix\" values=\"-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0\"></feColorMatrix></filter>\n\t\t\t\t\t <mask id=\"hole\">\n\t\t\t\t\t <rect width=\"100%\" height=\"100%\" fill=\"white\"></rect>\n\t\t\t\t\t\t<circle r=\"4.5\" cx=\"17\" cy=\"3\" fill=\"black\"></circle>\n\t\t\t\t\t </mask>\n\t\t\t\t\t </defs>\n\t\t\t\t\t <image x=\"0\" y=\"0\" width=\"16\" height=\"16\" filter=\"url(#invertMenuMore-${entry.id})\" preserveAspectRatio=\"xMinYMin meet\" xlink:href=\"${entry.icon}\" class=\"app-icon\" />\n\t\t\t\t\t</svg>`\n\n\t\t\t\t\tconst imgElement = document.createElement('template')\n\t\t\t\t\timgElement.innerHTML = img\n\n\t\t\t\t\tconst a = document.createElement('a')\n\t\t\t\t\ta.setAttribute('href', entry.href)\n\n\t\t\t\t\tconst filename = document.createElement('span')\n\t\t\t\t\tfilename.appendChild(document.createTextNode(entry.name))\n\n\t\t\t\t\tconst loading = document.createElement('div')\n\t\t\t\t\tloading.setAttribute('class', 'unread-counter')\n\t\t\t\t\tloading.style.display = 'none'\n\n\t\t\t\t\t// draw attention to the newly added app entry\n\t\t\t\t\t// by flashing twice the more apps menu\n\t\t\t\t\tif (addedApps[entry.id]) {\n\t\t\t\t\t\ta.classList.add('animated')\n\t\t\t\t\t}\n\n\t\t\t\t\ta.prepend(imgElement.content.firstChild, loading, filename)\n\t\t\t\t\tli.append(a)\n\n\t\t\t\t\t// add app icon to the navigation\n\t\t\t\t\tconst previousElement = document.querySelector(`#navigation li[data-id=${previousEntry.id}]`)\n\t\t\t\t\tif (previousElement) {\n\t\t\t\t\t\tpreviousElement.insertAdjacentElement('afterend', li)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdocument.querySelector('#navigation #apps ul').prepend(li)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (document.getElementById('appmenu').querySelector(`li[data-id=\"${entry.id}\"]`) === null) {\n\t\t\t\t\tconst li = document.createElement('li')\n\t\t\t\t\tli.dataset.id = entry.id\n\t\t\t\t\t// Generating svg embedded image (see layout.user.php)\n\t\t\t\t\tlet img\n\t\t\t\t\tif (OCA.Theming && OCA.Theming.inverted) {\n\t\t\t\t\t\timg = `<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" alt=\"\">\n\t\t\t\t\t\t <defs>\n\t\t\t\t\t\t <filter id=\"invert\"><feColorMatrix in=\"SourceGraphic\" type=\"matrix\" values=\"-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0\" /></filter>\n\t\t\t\t\t\t </defs>\n\t\t\t\t\t\t <image x=\"0\" y=\"0\" width=\"20\" height=\"20\" preserveAspectRatio=\"xMinYMin meet\" filter=\"url(#invert)\" xlink:href=\"${entry.icon}\" class=\"app-icon\" />\n\t\t\t\t\t\t</svg>`\n\t\t\t\t\t} else {\n\t\t\t\t\t\timg = `<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" alt=\"\">\n\t\t\t\t\t\t <image x=\"0\" y=\"0\" width=\"20\" height=\"20\" preserveAspectRatio=\"xMinYMin meet\" xlink:href=\"${entry.icon}\" class=\"app-icon\" />\n\t\t\t\t\t\t</svg>`\n\t\t\t\t\t}\n\t\t\t\t\tconst imgElement = document.createElement('template')\n\t\t\t\t\timgElement.innerHTML = img\n\n\t\t\t\t\tconst a = document.createElement('a')\n\t\t\t\t\ta.setAttribute('href', entry.href)\n\n\t\t\t\t\tconst filename = document.createElement('span')\n\t\t\t\t\tfilename.appendChild(document.createTextNode(entry.name))\n\n\t\t\t\t\tconst loading = document.createElement('div')\n\t\t\t\t\tloading.setAttribute('class', 'icon-loading-dark')\n\t\t\t\t\tloading.style.display = 'none'\n\n\t\t\t\t\t// draw attention to the newly added app entry\n\t\t\t\t\t// by flashing twice the more apps menu\n\t\t\t\t\tif (addedApps[entry.id]) {\n\t\t\t\t\t\ta.classList.add('animated')\n\t\t\t\t\t}\n\n\t\t\t\t\ta.prepend(loading, filename, imgElement.content.firstChild)\n\t\t\t\t\tli.append(a)\n\n\t\t\t\t\t// add app icon to the navigation\n\t\t\t\t\tconst previousElement = document.querySelector('#appmenu li[data-id=' + previousEntry.id + ']')\n\t\t\t\t\tif (previousElement) {\n\t\t\t\t\t\tpreviousElement.insertAdjacentElement('afterend', li)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdocument.queryElementById('appmenu').prepend(li)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpreviousEntry = entry\n\t\t\t})\n\t\t\twindow.dispatchEvent(new Event('resize'))\n\t\t})\n}\n","/**\n * @copyright Copyright (c) 2019 Julius Härtl <jus@bitgrid.net>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { showError } from '@nextcloud/dialogs'\nimport rebuildNavigation from '../service/rebuild-navigation.js'\n\nexport default {\n\tcomputed: {\n\t\tappGroups() {\n\t\t\treturn this.app.groups.map(group => { return { id: group, name: group } })\n\t\t},\n\t\tinstalling() {\n\t\t\treturn this.$store.getters.loading('install')\n\t\t},\n\t\tisLoading() {\n\t\t\treturn this.app && this.$store.getters.loading(this.app.id)\n\t\t},\n\t\tenableButtonText() {\n\t\t\tif (this.app.needsDownload) {\n\t\t\t\treturn t('settings', 'Download and enable')\n\t\t\t}\n\t\t\treturn t('settings', 'Enable')\n\t\t},\n\t\tforceEnableButtonText() {\n\t\t\tif (this.app.needsDownload) {\n\t\t\t\treturn t('settings', 'Enable untested app')\n\t\t\t}\n\t\t\treturn t('settings', 'Enable untested app')\n\t\t},\n\t\tenableButtonTooltip() {\n\t\t\tif (this.app.needsDownload) {\n\t\t\t\treturn t('settings', 'The app will be downloaded from the App Store')\n\t\t\t}\n\t\t\treturn false\n\t\t},\n\t\tforceEnableButtonTooltip() {\n\t\t\tconst base = t('settings', 'This app is not marked as compatible with your Nextcloud version. If you continue you will still be able to install the app. Note that the app might not work as expected.')\n\t\t\tif (this.app.needsDownload) {\n\t\t\t\treturn base + ' ' + t('settings', 'The app will be downloaded from the App Store')\n\t\t\t}\n\t\t\treturn base\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tgroupCheckedAppsData: false,\n\t\t}\n\t},\n\n\tmounted() {\n\t\tif (this.app && this.app.groups && this.app.groups.length > 0) {\n\t\t\tthis.groupCheckedAppsData = true\n\t\t}\n\t},\n\n\tmethods: {\n\t\tasyncFindGroup(query) {\n\t\t\treturn this.$store.dispatch('getGroups', { search: query, limit: 5, offset: 0 })\n\t\t},\n\t\tisLimitedToGroups(app) {\n\t\t\tif (this.app.groups.length || this.groupCheckedAppsData) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\treturn false\n\t\t},\n\t\tsetGroupLimit() {\n\t\t\tif (!this.groupCheckedAppsData) {\n\t\t\t\tthis.$store.dispatch('enableApp', { appId: this.app.id, groups: [] })\n\t\t\t}\n\t\t},\n\t\tcanLimitToGroups(app) {\n\t\t\tif ((app.types && app.types.includes('filesystem'))\n\t\t\t\t\t|| app.types.includes('prelogin')\n\t\t\t\t\t|| app.types.includes('authentication')\n\t\t\t\t\t|| app.types.includes('logging')\n\t\t\t\t\t|| app.types.includes('prevent_group_restriction')) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn true\n\t\t},\n\t\taddGroupLimitation(group) {\n\t\t\tconst groups = this.app.groups.concat([]).concat([group.id])\n\t\t\tthis.$store.dispatch('enableApp', { appId: this.app.id, groups })\n\t\t},\n\t\tremoveGroupLimitation(group) {\n\t\t\tconst currentGroups = this.app.groups.concat([])\n\t\t\tconst index = currentGroups.indexOf(group.id)\n\t\t\tif (index > -1) {\n\t\t\t\tcurrentGroups.splice(index, 1)\n\t\t\t}\n\t\t\tthis.$store.dispatch('enableApp', { appId: this.app.id, groups: currentGroups })\n\t\t},\n\t\tforceEnable(appId) {\n\t\t\tthis.$store.dispatch('forceEnableApp', { appId, groups: [] })\n\t\t\t\t.then((response) => { rebuildNavigation() })\n\t\t\t\t.catch((error) => { showError(error) })\n\t\t},\n\t\tenable(appId) {\n\t\t\tthis.$store.dispatch('enableApp', { appId, groups: [] })\n\t\t\t\t.then((response) => { rebuildNavigation() })\n\t\t\t\t.catch((error) => { showError(error) })\n\t\t},\n\t\tdisable(appId) {\n\t\t\tthis.$store.dispatch('disableApp', { appId })\n\t\t\t\t.then((response) => { rebuildNavigation() })\n\t\t\t\t.catch((error) => { showError(error) })\n\t\t},\n\t\tremove(appId) {\n\t\t\tthis.$store.dispatch('uninstallApp', { appId })\n\t\t\t\t.then((response) => { rebuildNavigation() })\n\t\t\t\t.catch((error) => { showError(error) })\n\t\t},\n\t\tinstall(appId) {\n\t\t\tthis.$store.dispatch('enableApp', { appId })\n\t\t\t\t.then((response) => { rebuildNavigation() })\n\t\t\t\t.catch((error) => { showError(error) })\n\t\t},\n\t\tupdate(appId) {\n\t\t\tthis.$store.dispatch('updateApp', { appId })\n\t\t\t\t.then((response) => { rebuildNavigation() })\n\t\t\t\t.catch((error) => { showError(error) })\n\t\t},\n\t},\n}\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SvgFilterMixin.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SvgFilterMixin.vue?vue&type=script&lang=js&\"","<!--\n - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<script>\nexport default {\n\tname: 'SvgFilterMixin',\n\tdata() {\n\t\treturn {\n\t\t\tfilterId: '',\n\t\t}\n\t},\n\tcomputed: {\n\t\tfilterUrl() {\n\t\t\treturn `url(#${this.filterId})`\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.filterId = 'invertIconApps' + Math.floor((Math.random() * 100)) + new Date().getSeconds() + new Date().getMilliseconds()\n\t},\n}\n</script>\n","<!--\n - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<div class=\"section\" :class=\"{ selected: isSelected }\" @click=\"showAppDetails\">\n\t\t<div class=\"app-image app-image-icon\" @click=\"showAppDetails\">\n\t\t\t<div v-if=\"(listView && !app.preview) || (!listView && !screenshotLoaded)\" class=\"icon-settings-dark\" />\n\n\t\t\t<svg v-else-if=\"listView && app.preview\"\n\t\t\t\twidth=\"32\"\n\t\t\t\theight=\"32\"\n\t\t\t\tviewBox=\"0 0 32 32\">\n\t\t\t\t<defs><filter :id=\"filterId\"><feColorMatrix in=\"SourceGraphic\" type=\"matrix\" values=\"-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0\" /></filter></defs>\n\t\t\t\t<image x=\"0\"\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"32\"\n\t\t\t\t\theight=\"32\"\n\t\t\t\t\tpreserveAspectRatio=\"xMinYMin meet\"\n\t\t\t\t\t:filter=\"filterUrl\"\n\t\t\t\t\t:xlink:href=\"app.preview\"\n\t\t\t\t\tclass=\"app-icon\" />\n\t\t\t</svg>\n\n\t\t\t<img v-if=\"!listView && app.screenshot && screenshotLoaded\" :src=\"app.screenshot\" width=\"100%\">\n\t\t</div>\n\t\t<div class=\"app-name\" @click=\"showAppDetails\">\n\t\t\t{{ app.name }}\n\t\t</div>\n\t\t<div v-if=\"!listView\" class=\"app-summary\">\n\t\t\t{{ app.summary }}\n\t\t</div>\n\t\t<div v-if=\"listView\" class=\"app-version\">\n\t\t\t<span v-if=\"app.version\">{{ app.version }}</span>\n\t\t\t<span v-else-if=\"app.appstoreData.releases[0].version\">{{ app.appstoreData.releases[0].version }}</span>\n\t\t</div>\n\n\t\t<div class=\"app-level\">\n\t\t\t<span v-if=\"app.level === 300\"\n\t\t\t\tv-tooltip.auto=\"t('settings', 'This app is supported via your current Nextcloud subscription.')\"\n\t\t\t\tclass=\"supported icon-checkmark-color\">\n\t\t\t\t{{ t('settings', 'Supported') }}</span>\n\t\t\t<span v-if=\"app.level === 200\"\n\t\t\t\tv-tooltip.auto=\"t('settings', 'Featured apps are developed by and within the community. They offer central functionality and are ready for production use.')\"\n\t\t\t\tclass=\"official icon-checkmark\">\n\t\t\t\t{{ t('settings', 'Featured') }}</span>\n\t\t\t<AppScore v-if=\"hasRating && !listView\" :score=\"app.score\" />\n\t\t</div>\n\n\t\t<div class=\"actions\">\n\t\t\t<div v-if=\"app.error\" class=\"warning\">\n\t\t\t\t{{ app.error }}\n\t\t\t</div>\n\t\t\t<div v-if=\"isLoading\" class=\"icon icon-loading-small\" />\n\t\t\t<input v-if=\"app.update\"\n\t\t\t\tclass=\"update primary\"\n\t\t\t\ttype=\"button\"\n\t\t\t\t:value=\"t('settings', 'Update to {update}', {update:app.update})\"\n\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t@click.stop=\"update(app.id)\">\n\t\t\t<input v-if=\"app.canUnInstall\"\n\t\t\t\tclass=\"uninstall\"\n\t\t\t\ttype=\"button\"\n\t\t\t\t:value=\"t('settings', 'Remove')\"\n\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t@click.stop=\"remove(app.id)\">\n\t\t\t<input v-if=\"app.active\"\n\t\t\t\tclass=\"enable\"\n\t\t\t\ttype=\"button\"\n\t\t\t\t:value=\"t('settings','Disable')\"\n\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t@click.stop=\"disable(app.id)\">\n\t\t\t<input v-if=\"!app.active && (app.canInstall || app.isCompatible)\"\n\t\t\t\tv-tooltip.auto=\"enableButtonTooltip\"\n\t\t\t\tclass=\"enable\"\n\t\t\t\ttype=\"button\"\n\t\t\t\t:value=\"enableButtonText\"\n\t\t\t\t:disabled=\"!app.canInstall || installing || isLoading\"\n\t\t\t\t@click.stop=\"enable(app.id)\">\n\t\t\t<input v-else-if=\"!app.active\"\n\t\t\t\tv-tooltip.auto=\"forceEnableButtonTooltip\"\n\t\t\t\tclass=\"enable force\"\n\t\t\t\ttype=\"button\"\n\t\t\t\t:value=\"forceEnableButtonText\"\n\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t@click.stop=\"forceEnable(app.id)\">\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport AppScore from './AppScore'\nimport AppManagement from '../../mixins/AppManagement'\nimport SvgFilterMixin from '../SvgFilterMixin'\n\nexport default {\n\tname: 'AppItem',\n\tcomponents: {\n\t\tAppScore,\n\t},\n\tmixins: [AppManagement, SvgFilterMixin],\n\tprops: {\n\t\tapp: {},\n\t\tcategory: {},\n\t\tlistView: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisSelected: false,\n\t\t\tscrolled: false,\n\t\t\tscreenshotLoaded: false,\n\t\t}\n\t},\n\tcomputed: {\n\t\thasRating() {\n\t\t\treturn this.app.appstoreData && this.app.appstoreData.ratingNumOverall > 5\n\t\t},\n\t},\n\twatch: {\n\t\t'$route.params.id'(id) {\n\t\t\tthis.isSelected = (this.app.id === id)\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.isSelected = (this.app.id === this.$route.params.id)\n\t\tif (this.app.releases && this.app.screenshot) {\n\t\t\tconst image = new Image()\n\t\t\timage.onload = (e) => {\n\t\t\t\tthis.screenshotLoaded = true\n\t\t\t}\n\t\t\timage.src = this.app.screenshot\n\t\t}\n\t},\n\twatchers: {\n\n\t},\n\tmethods: {\n\t\tasync showAppDetails(event) {\n\t\t\tif (event.currentTarget.tagName === 'INPUT' || event.currentTarget.tagName === 'A') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait this.$router.push({\n\t\t\t\t\tname: 'apps-details',\n\t\t\t\t\tparams: { category: this.category, id: this.app.id },\n\t\t\t\t})\n\t\t\t} catch (e) {\n\t\t\t\t// we already view this app\n\t\t\t}\n\t\t},\n\t\tprefix(prefix, content) {\n\t\t\treturn prefix + '_' + content\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n\t.force {\n\t\tbackground: var(--color-main-background);\n\t\tborder-color: var(--color-error);\n\t\tcolor: var(--color-error);\n\t}\n\t.force:hover,\n\t.force:active {\n\t\tbackground: var(--color-error);\n\t\tborder-color: var(--color-error) !important;\n\t\tcolor: var(--color-main-background);\n\t}\n</style>\n","var render, staticRenderFns\nimport script from \"./SvgFilterMixin.vue?vue&type=script&lang=js&\"\nexport * from \"./SvgFilterMixin.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppItem.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppItem.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppItem.vue?vue&type=style&index=0&id=06bcd5b6&scoped=true&lang=css&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppItem.vue?vue&type=style&index=0&id=06bcd5b6&scoped=true&lang=css&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AppItem.vue?vue&type=template&id=06bcd5b6&scoped=true&\"\nimport script from \"./AppItem.vue?vue&type=script&lang=js&\"\nexport * from \"./AppItem.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AppItem.vue?vue&type=style&index=0&id=06bcd5b6&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"06bcd5b6\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"section\",class:{ selected: _vm.isSelected },on:{\"click\":_vm.showAppDetails}},[_c('div',{staticClass:\"app-image app-image-icon\",on:{\"click\":_vm.showAppDetails}},[((_vm.listView && !_vm.app.preview) || (!_vm.listView && !_vm.screenshotLoaded))?_c('div',{staticClass:\"icon-settings-dark\"}):(_vm.listView && _vm.app.preview)?_c('svg',{attrs:{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"0 0 32 32\"}},[_c('defs',[_c('filter',{attrs:{\"id\":_vm.filterId}},[_c('feColorMatrix',{attrs:{\"in\":\"SourceGraphic\",\"type\":\"matrix\",\"values\":\"-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0\"}})],1)]),_vm._v(\" \"),_c('image',{staticClass:\"app-icon\",attrs:{\"x\":\"0\",\"y\":\"0\",\"width\":\"32\",\"height\":\"32\",\"preserveAspectRatio\":\"xMinYMin meet\",\"filter\":_vm.filterUrl,\"xlink:href\":_vm.app.preview}})]):_vm._e(),_vm._v(\" \"),(!_vm.listView && _vm.app.screenshot && _vm.screenshotLoaded)?_c('img',{attrs:{\"src\":_vm.app.screenshot,\"width\":\"100%\"}}):_vm._e()]),_vm._v(\" \"),_c('div',{staticClass:\"app-name\",on:{\"click\":_vm.showAppDetails}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.app.name)+\"\\n\\t\")]),_vm._v(\" \"),(!_vm.listView)?_c('div',{staticClass:\"app-summary\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.app.summary)+\"\\n\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.listView)?_c('div',{staticClass:\"app-version\"},[(_vm.app.version)?_c('span',[_vm._v(_vm._s(_vm.app.version))]):(_vm.app.appstoreData.releases[0].version)?_c('span',[_vm._v(_vm._s(_vm.app.appstoreData.releases[0].version))]):_vm._e()]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"app-level\"},[(_vm.app.level === 300)?_c('span',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.t('settings', 'This app is supported via your current Nextcloud subscription.')),expression:\"t('settings', 'This app is supported via your current Nextcloud subscription.')\",modifiers:{\"auto\":true}}],staticClass:\"supported icon-checkmark-color\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Supported')))]):_vm._e(),_vm._v(\" \"),(_vm.app.level === 200)?_c('span',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.t('settings', 'Featured apps are developed by and within the community. They offer central functionality and are ready for production use.')),expression:\"t('settings', 'Featured apps are developed by and within the community. They offer central functionality and are ready for production use.')\",modifiers:{\"auto\":true}}],staticClass:\"official icon-checkmark\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Featured')))]):_vm._e(),_vm._v(\" \"),(_vm.hasRating && !_vm.listView)?_c('AppScore',{attrs:{\"score\":_vm.app.score}}):_vm._e()],1),_vm._v(\" \"),_c('div',{staticClass:\"actions\"},[(_vm.app.error)?_c('div',{staticClass:\"warning\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.app.error)+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.isLoading)?_c('div',{staticClass:\"icon icon-loading-small\"}):_vm._e(),_vm._v(\" \"),(_vm.app.update)?_c('input',{staticClass:\"update primary\",attrs:{\"type\":\"button\",\"value\":_vm.t('settings', 'Update to {update}', {update:_vm.app.update}),\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){$event.stopPropagation();return _vm.update(_vm.app.id)}}}):_vm._e(),_vm._v(\" \"),(_vm.app.canUnInstall)?_c('input',{staticClass:\"uninstall\",attrs:{\"type\":\"button\",\"value\":_vm.t('settings', 'Remove'),\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){$event.stopPropagation();return _vm.remove(_vm.app.id)}}}):_vm._e(),_vm._v(\" \"),(_vm.app.active)?_c('input',{staticClass:\"enable\",attrs:{\"type\":\"button\",\"value\":_vm.t('settings','Disable'),\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){$event.stopPropagation();return _vm.disable(_vm.app.id)}}}):_vm._e(),_vm._v(\" \"),(!_vm.app.active && (_vm.app.canInstall || _vm.app.isCompatible))?_c('input',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.enableButtonTooltip),expression:\"enableButtonTooltip\",modifiers:{\"auto\":true}}],staticClass:\"enable\",attrs:{\"type\":\"button\",\"value\":_vm.enableButtonText,\"disabled\":!_vm.app.canInstall || _vm.installing || _vm.isLoading},on:{\"click\":function($event){$event.stopPropagation();return _vm.enable(_vm.app.id)}}}):(!_vm.app.active)?_c('input',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.forceEnableButtonTooltip),expression:\"forceEnableButtonTooltip\",modifiers:{\"auto\":true}}],staticClass:\"enable force\",attrs:{\"type\":\"button\",\"value\":_vm.forceEnableButtonText,\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){$event.stopPropagation();return _vm.forceEnable(_vm.app.id)}}}):_vm._e()])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render, staticRenderFns\nimport script from \"./PrefixMixin.vue?vue&type=script&lang=js&\"\nexport * from \"./PrefixMixin.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","<!--\n - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<script>\nexport default {\n\tname: 'PrefixMixin',\n\tmethods: {\n\t\tprefix(prefix, content) {\n\t\t\treturn prefix + '_' + content\n\t\t},\n\t},\n}\n</script>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppList.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppList.vue?vue&type=script&lang=js&\"","<!--\n - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<div id=\"app-content-inner\">\n\t\t<div id=\"apps-list\" class=\"apps-list\" :class=\"{installed: (useBundleView || useListView), store: useAppStoreView}\">\n\t\t\t<template v-if=\"useListView\">\n\t\t\t\t<div v-if=\"showUpdateAll\" class=\"toolbar\">\n\t\t\t\t\t{{ n('settings', '%n app has an update available', '%n apps have an update available', counter) }}\n\t\t\t\t\t<Button v-if=\"showUpdateAll\"\n\t\t\t\t\t\tid=\"app-list-update-all\"\n\t\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t\t@click=\"updateAll\">\n\t\t\t\t\t\t{{ n('settings', 'Update', 'Update all', counter) }}\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\n\t\t\t\t<div v-if=\"!showUpdateAll\" class=\"toolbar\">\n\t\t\t\t\t{{ t('settings', 'All apps are up-to-date.') }}\n\t\t\t\t</div>\n\n\t\t\t\t<transition-group name=\"app-list\" tag=\"div\" class=\"apps-list-container\">\n\t\t\t\t\t<AppItem v-for=\"app in apps\"\n\t\t\t\t\t\t:key=\"app.id\"\n\t\t\t\t\t\t:app=\"app\"\n\t\t\t\t\t\t:category=\"category\" />\n\t\t\t\t</transition-group>\n\t\t\t</template>\n\n\t\t\t<transition-group v-if=\"useBundleView\"\n\t\t\t\tname=\"app-list\"\n\t\t\t\ttag=\"div\"\n\t\t\t\tclass=\"apps-list-container\">\n\t\t\t\t<template v-for=\"bundle in bundles\">\n\t\t\t\t\t<div :key=\"bundle.id\" class=\"apps-header\">\n\t\t\t\t\t\t<div class=\"app-image\" />\n\t\t\t\t\t\t<h2>{{ bundle.name }} <input type=\"button\" :value=\"bundleToggleText(bundle.id)\" @click=\"toggleBundle(bundle.id)\"></h2>\n\t\t\t\t\t\t<div class=\"app-version\" />\n\t\t\t\t\t\t<div class=\"app-level\" />\n\t\t\t\t\t\t<div class=\"app-groups\" />\n\t\t\t\t\t\t<div class=\"actions\">\n\t\t\t\t\t\t\t \n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<AppItem v-for=\"app in bundleApps(bundle.id)\"\n\t\t\t\t\t\t:key=\"bundle.id + app.id\"\n\t\t\t\t\t\t:app=\"app\"\n\t\t\t\t\t\t:category=\"category\" />\n\t\t\t\t</template>\n\t\t\t</transition-group>\n\t\t\t<template v-if=\"useAppStoreView\">\n\t\t\t\t<AppItem v-for=\"app in apps\"\n\t\t\t\t\t:key=\"app.id\"\n\t\t\t\t\t:app=\"app\"\n\t\t\t\t\t:category=\"category\"\n\t\t\t\t\t:list-view=\"false\" />\n\t\t\t</template>\n\t\t</div>\n\n\t\t<div id=\"apps-list-search\" class=\"apps-list installed\">\n\t\t\t<div class=\"apps-list-container\">\n\t\t\t\t<template v-if=\"search !== '' && searchApps.length > 0\">\n\t\t\t\t\t<div class=\"section\">\n\t\t\t\t\t\t<div />\n\t\t\t\t\t\t<td colspan=\"5\">\n\t\t\t\t\t\t\t<h2>{{ t('settings', 'Results from other categories') }}</h2>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t</div>\n\t\t\t\t\t<AppItem v-for=\"app in searchApps\"\n\t\t\t\t\t\t:key=\"app.id\"\n\t\t\t\t\t\t:app=\"app\"\n\t\t\t\t\t\t:category=\"category\"\n\t\t\t\t\t\t:list-view=\"true\" />\n\t\t\t\t</template>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div v-if=\"search !== '' && !loading && searchApps.length === 0 && apps.length === 0\" id=\"apps-list-empty\" class=\"emptycontent emptycontent-search\">\n\t\t\t<div id=\"app-list-empty-icon\" class=\"icon-settings-dark\" />\n\t\t\t<h2>{{ t('settings', 'No apps found for your version') }}</h2>\n\t\t</div>\n\n\t\t<div id=\"searchresults\" />\n\t</div>\n</template>\n\n<script>\nimport AppItem from './AppList/AppItem'\nimport PrefixMixin from './PrefixMixin'\nimport pLimit from 'p-limit'\nimport Button from '@nextcloud/vue/dist/Components/Button'\n\nexport default {\n\tname: 'AppList',\n\tcomponents: {\n\t\tAppItem,\n\t\tButton,\n\t},\n\tmixins: [PrefixMixin],\n\tprops: ['category', 'app', 'search'],\n\tcomputed: {\n\t\tcounter() {\n\t\t\treturn this.apps.filter(app => app.update).length\n\t\t},\n\t\tloading() {\n\t\t\treturn this.$store.getters.loading('list')\n\t\t},\n\t\thasPendingUpdate() {\n\t\t\treturn this.apps.filter(app => app.update).length > 0\n\t\t},\n\t\tshowUpdateAll() {\n\t\t\treturn this.hasPendingUpdate && this.useListView\n\t\t},\n\t\tapps() {\n\t\t\tconst apps = this.$store.getters.getAllApps\n\t\t\t\t.filter(app => app.name.toLowerCase().search(this.search.toLowerCase()) !== -1)\n\t\t\t\t.sort(function(a, b) {\n\t\t\t\t\tconst sortStringA = '' + (a.active ? 0 : 1) + (a.update ? 0 : 1) + a.name\n\t\t\t\t\tconst sortStringB = '' + (b.active ? 0 : 1) + (b.update ? 0 : 1) + b.name\n\t\t\t\t\treturn OC.Util.naturalSortCompare(sortStringA, sortStringB)\n\t\t\t\t})\n\n\t\t\tif (this.category === 'installed') {\n\t\t\t\treturn apps.filter(app => app.installed)\n\t\t\t}\n\t\t\tif (this.category === 'enabled') {\n\t\t\t\treturn apps.filter(app => app.active && app.installed)\n\t\t\t}\n\t\t\tif (this.category === 'disabled') {\n\t\t\t\treturn apps.filter(app => !app.active && app.installed)\n\t\t\t}\n\t\t\tif (this.category === 'app-bundles') {\n\t\t\t\treturn apps.filter(app => app.bundles)\n\t\t\t}\n\t\t\tif (this.category === 'updates') {\n\t\t\t\treturn apps.filter(app => app.update)\n\t\t\t}\n\t\t\tif (this.category === 'featured') {\n\t\t\t\treturn apps.filter(app => app.level === 200)\n\t\t\t}\n\t\t\t// filter app store categories\n\t\t\treturn apps.filter(app => {\n\t\t\t\treturn app.appstore && app.category !== undefined\n\t\t\t\t\t&& (app.category === this.category || app.category.indexOf(this.category) > -1)\n\t\t\t})\n\t\t},\n\t\tbundles() {\n\t\t\treturn this.$store.getters.getServerData.bundles.filter(bundle => this.bundleApps(bundle.id).length > 0)\n\t\t},\n\t\tbundleApps() {\n\t\t\treturn function(bundle) {\n\t\t\t\treturn this.$store.getters.getAllApps\n\t\t\t\t\t.filter(app => {\n\t\t\t\t\t\treturn app.bundleIds !== undefined && app.bundleIds.includes(bundle)\n\t\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\tsearchApps() {\n\t\t\tif (this.search === '') {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn this.$store.getters.getAllApps\n\t\t\t\t.filter(app => {\n\t\t\t\t\tif (app.name.toLowerCase().search(this.search.toLowerCase()) !== -1) {\n\t\t\t\t\t\treturn (!this.apps.find(_app => _app.id === app.id))\n\t\t\t\t\t}\n\t\t\t\t\treturn false\n\t\t\t\t})\n\t\t},\n\t\tuseAppStoreView() {\n\t\t\treturn !this.useListView && !this.useBundleView\n\t\t},\n\t\tuseListView() {\n\t\t\treturn (this.category === 'installed' || this.category === 'enabled' || this.category === 'disabled' || this.category === 'updates' || this.category === 'featured')\n\t\t},\n\t\tuseBundleView() {\n\t\t\treturn (this.category === 'app-bundles')\n\t\t},\n\t\tallBundlesEnabled() {\n\t\t\tconst self = this\n\t\t\treturn function(id) {\n\t\t\t\treturn self.bundleApps(id).filter(app => !app.active).length === 0\n\t\t\t}\n\t\t},\n\t\tbundleToggleText() {\n\t\t\tconst self = this\n\t\t\treturn function(id) {\n\t\t\t\tif (self.allBundlesEnabled(id)) {\n\t\t\t\t\treturn t('settings', 'Disable all')\n\t\t\t\t}\n\t\t\t\treturn t('settings', 'Enable all')\n\t\t\t}\n\t\t},\n\t},\n\tmethods: {\n\t\ttoggleBundle(id) {\n\t\t\tif (this.allBundlesEnabled(id)) {\n\t\t\t\treturn this.disableBundle(id)\n\t\t\t}\n\t\t\treturn this.enableBundle(id)\n\t\t},\n\t\tenableBundle(id) {\n\t\t\tconst apps = this.bundleApps(id).map(app => app.id)\n\t\t\tthis.$store.dispatch('enableApp', { appId: apps, groups: [] })\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error(error)\n\t\t\t\t\tOC.Notification.show(error)\n\t\t\t\t})\n\t\t},\n\t\tdisableBundle(id) {\n\t\t\tconst apps = this.bundleApps(id).map(app => app.id)\n\t\t\tthis.$store.dispatch('disableApp', { appId: apps, groups: [] })\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tOC.Notification.show(error)\n\t\t\t\t})\n\t\t},\n\t\tupdateAll() {\n\t\t\tconst limit = pLimit(1)\n\t\t\tthis.apps\n\t\t\t\t.filter(app => app.update)\n\t\t\t\t.map(app => limit(() => this.$store.dispatch('updateApp', { appId: app.id }))\n\t\t\t\t)\n\t\t},\n\t},\n}\n</script>\n","import { render, staticRenderFns } from \"./AppList.vue?vue&type=template&id=35e8fed4&\"\nimport script from \"./AppList.vue?vue&type=script&lang=js&\"\nexport * from \"./AppList.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app-content-inner\"}},[_c('div',{staticClass:\"apps-list\",class:{installed: (_vm.useBundleView || _vm.useListView), store: _vm.useAppStoreView},attrs:{\"id\":\"apps-list\"}},[(_vm.useListView)?[(_vm.showUpdateAll)?_c('div',{staticClass:\"toolbar\"},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.n('settings', '%n app has an update available', '%n apps have an update available', _vm.counter))+\"\\n\\t\\t\\t\\t\"),(_vm.showUpdateAll)?_c('Button',{attrs:{\"id\":\"app-list-update-all\",\"type\":\"primary\"},on:{\"click\":_vm.updateAll}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.n('settings', 'Update', 'Update all', _vm.counter))+\"\\n\\t\\t\\t\\t\")]):_vm._e()],1):_vm._e(),_vm._v(\" \"),(!_vm.showUpdateAll)?_c('div',{staticClass:\"toolbar\"},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'All apps are up-to-date.'))+\"\\n\\t\\t\\t\")]):_vm._e(),_vm._v(\" \"),_c('transition-group',{staticClass:\"apps-list-container\",attrs:{\"name\":\"app-list\",\"tag\":\"div\"}},_vm._l((_vm.apps),function(app){return _c('AppItem',{key:app.id,attrs:{\"app\":app,\"category\":_vm.category}})}),1)]:_vm._e(),_vm._v(\" \"),(_vm.useBundleView)?_c('transition-group',{staticClass:\"apps-list-container\",attrs:{\"name\":\"app-list\",\"tag\":\"div\"}},[_vm._l((_vm.bundles),function(bundle){return [_c('div',{key:bundle.id,staticClass:\"apps-header\"},[_c('div',{staticClass:\"app-image\"}),_vm._v(\" \"),_c('h2',[_vm._v(_vm._s(bundle.name)+\" \"),_c('input',{attrs:{\"type\":\"button\",\"value\":_vm.bundleToggleText(bundle.id)},on:{\"click\":function($event){return _vm.toggleBundle(bundle.id)}}})]),_vm._v(\" \"),_c('div',{staticClass:\"app-version\"}),_vm._v(\" \"),_c('div',{staticClass:\"app-level\"}),_vm._v(\" \"),_c('div',{staticClass:\"app-groups\"}),_vm._v(\" \"),_c('div',{staticClass:\"actions\"},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t \\n\\t\\t\\t\\t\\t\")])]),_vm._v(\" \"),_vm._l((_vm.bundleApps(bundle.id)),function(app){return _c('AppItem',{key:bundle.id + app.id,attrs:{\"app\":app,\"category\":_vm.category}})})]})],2):_vm._e(),_vm._v(\" \"),(_vm.useAppStoreView)?_vm._l((_vm.apps),function(app){return _c('AppItem',{key:app.id,attrs:{\"app\":app,\"category\":_vm.category,\"list-view\":false}})}):_vm._e()],2),_vm._v(\" \"),_c('div',{staticClass:\"apps-list installed\",attrs:{\"id\":\"apps-list-search\"}},[_c('div',{staticClass:\"apps-list-container\"},[(_vm.search !== '' && _vm.searchApps.length > 0)?[_c('div',{staticClass:\"section\"},[_c('div'),_vm._v(\" \"),_c('td',{attrs:{\"colspan\":\"5\"}},[_c('h2',[_vm._v(_vm._s(_vm.t('settings', 'Results from other categories')))])])]),_vm._v(\" \"),_vm._l((_vm.searchApps),function(app){return _c('AppItem',{key:app.id,attrs:{\"app\":app,\"category\":_vm.category,\"list-view\":true}})})]:_vm._e()],2)]),_vm._v(\" \"),(_vm.search !== '' && !_vm.loading && _vm.searchApps.length === 0 && _vm.apps.length === 0)?_c('div',{staticClass:\"emptycontent emptycontent-search\",attrs:{\"id\":\"apps-list-empty\"}},[_c('div',{staticClass:\"icon-settings-dark\",attrs:{\"id\":\"app-list-empty-icon\"}}),_vm._v(\" \"),_c('h2',[_vm._v(_vm._s(_vm.t('settings', 'No apps found for your version')))])]):_vm._e(),_vm._v(\" \"),_c('div',{attrs:{\"id\":\"searchresults\"}})])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Markdown.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Markdown.vue?vue&type=script&lang=js&\"","<!--\n - @copyright Copyright (c) 2020 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<div class=\"settings-markdown\" v-html=\"renderMarkdown\" />\n</template>\n\n<script>\nimport { marked } from 'marked'\nimport dompurify from 'dompurify'\n\nexport default {\n\tname: 'Markdown',\n\tprops: {\n\t\ttext: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t},\n\tcomputed: {\n\t\trenderMarkdown() {\n\t\t\tconst renderer = new marked.Renderer()\n\t\t\trenderer.link = function(href, title, text) {\n\t\t\t\tlet prot\n\t\t\t\ttry {\n\t\t\t\t\tprot = decodeURIComponent(unescape(href))\n\t\t\t\t\t\t.replace(/[^\\w:]/g, '')\n\t\t\t\t\t\t.toLowerCase()\n\t\t\t\t} catch (e) {\n\t\t\t\t\treturn ''\n\t\t\t\t}\n\n\t\t\t\tif (prot.indexOf('http:') !== 0 && prot.indexOf('https:') !== 0) {\n\t\t\t\t\treturn ''\n\t\t\t\t}\n\n\t\t\t\tlet out = '<a href=\"' + href + '\" rel=\"noreferrer noopener\"'\n\t\t\t\tif (title) {\n\t\t\t\t\tout += ' title=\"' + title + '\"'\n\t\t\t\t}\n\t\t\t\tout += '>' + text + '</a>'\n\t\t\t\treturn out\n\t\t\t}\n\t\t\trenderer.image = function(href, title, text) {\n\t\t\t\tif (text) {\n\t\t\t\t\treturn text\n\t\t\t\t}\n\t\t\t\treturn title\n\t\t\t}\n\t\t\trenderer.blockquote = function(quote) {\n\t\t\t\treturn quote\n\t\t\t}\n\t\t\treturn dompurify.sanitize(\n\t\t\t\tmarked(this.text.trim(), {\n\t\t\t\t\trenderer,\n\t\t\t\t\tgfm: false,\n\t\t\t\t\thighlight: false,\n\t\t\t\t\ttables: false,\n\t\t\t\t\tbreaks: false,\n\t\t\t\t\tpedantic: false,\n\t\t\t\t\tsanitize: true,\n\t\t\t\t\tsmartLists: true,\n\t\t\t\t\tsmartypants: false,\n\t\t\t\t}),\n\t\t\t\t{\n\t\t\t\t\tSAFE_FOR_JQUERY: true,\n\t\t\t\t\tALLOWED_TAGS: [\n\t\t\t\t\t\t'h1',\n\t\t\t\t\t\t'h2',\n\t\t\t\t\t\t'h3',\n\t\t\t\t\t\t'h4',\n\t\t\t\t\t\t'h5',\n\t\t\t\t\t\t'h6',\n\t\t\t\t\t\t'strong',\n\t\t\t\t\t\t'p',\n\t\t\t\t\t\t'a',\n\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t'ol',\n\t\t\t\t\t\t'li',\n\t\t\t\t\t\t'em',\n\t\t\t\t\t\t'del',\n\t\t\t\t\t\t'blockquote',\n\t\t\t\t\t],\n\t\t\t\t}\n\t\t\t)\n\t\t},\n\t},\n}\n</script>\n\n<style scoped lang=\"scss\">\n\t.settings-markdown::v-deep {\n\n\th1,\n\th2,\n\th3,\n\th4,\n\th5,\n\th6 {\n\t\tfont-weight: 600;\n\t\tline-height: 120%;\n\t\tmargin-top: 24px;\n\t\tmargin-bottom: 12px;\n\t\tcolor: var(--color-main-text);\n\t}\n\n\th1 {\n\t\tfont-size: 36px;\n\t\tmargin-top: 48px;\n\t}\n\n\th2 {\n\t\tfont-size: 28px;\n\t\tmargin-top: 48px;\n\t}\n\n\th3 {\n\t\tfont-size: 24px;\n\t}\n\n\th4 {\n\t\tfont-size: 21px;\n\t}\n\n\th5 {\n\t\tfont-size: 17px;\n\t}\n\n\th6 {\n\t\tfont-size: var(--default-font-size);\n\t}\n\n\tpre {\n\t\twhite-space: pre;\n\t\toverflow-x: auto;\n\t\tbackground-color: var(--color-background-dark);\n\t\tborder-radius: var(--border-radius);\n\t\tpadding: 1em 1.3em;\n\t\tmargin-bottom: 1em;\n\t}\n\n\tp code {\n\t\tbackground-color: var(--color-background-dark);\n\t\tborder-radius: var(--border-radius);\n\t\tpadding: .1em .3em;\n\t}\n\n\tli {\n\t\tposition: relative;\n\t}\n\n\tul, ol {\n\t\tpadding-left: 10px;\n\t\tmargin-left: 10px;\n\t}\n\n\tul li {\n\t\tlist-style-type: disc;\n\t}\n\n\tul > li > ul > li {\n\t\tlist-style-type: circle;\n\t}\n\n\tul > li > ul > li ul li {\n\t\tlist-style-type: square;\n\t}\n\n\tblockquote {\n\t\tpadding-left: 1em;\n\t\tborder-left: 4px solid var(--color-primary-element);\n\t\tcolor: var(--color-text-maxcontrast);\n\t\tmargin-left: 0;\n\t\tmargin-right: 0;\n\t}\n\n\t}\n</style>\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Markdown.vue?vue&type=style&index=0&id=652eb552&scoped=true&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Markdown.vue?vue&type=style&index=0&id=652eb552&scoped=true&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./Markdown.vue?vue&type=template&id=652eb552&scoped=true&\"\nimport script from \"./Markdown.vue?vue&type=script&lang=js&\"\nexport * from \"./Markdown.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Markdown.vue?vue&type=style&index=0&id=652eb552&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"652eb552\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"settings-markdown\",domProps:{\"innerHTML\":_vm._s(_vm.renderMarkdown)}})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppDetails.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppDetails.vue?vue&type=script&lang=js&\"","<!--\n - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<div class=\"app-details\">\n\t\t<div class=\"app-details__actions\">\n\t\t\t<div v-if=\"app.active && canLimitToGroups(app)\" class=\"app-details__actions-groups\">\n\t\t\t\t<input :id=\"prefix('groups_enable', app.id)\"\n\t\t\t\t\tv-model=\"groupCheckedAppsData\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t:value=\"app.id\"\n\t\t\t\t\tclass=\"groups-enable__checkbox checkbox\"\n\t\t\t\t\t@change=\"setGroupLimit\">\n\t\t\t\t<label :for=\"prefix('groups_enable', app.id)\">{{ t('settings', 'Limit to groups') }}</label>\n\t\t\t\t<input type=\"hidden\"\n\t\t\t\t\tclass=\"group_select\"\n\t\t\t\t\t:title=\"t('settings', 'All')\"\n\t\t\t\t\tvalue=\"\">\n\t\t\t\t<Multiselect v-if=\"isLimitedToGroups(app)\"\n\t\t\t\t\t:options=\"groups\"\n\t\t\t\t\t:value=\"appGroups\"\n\t\t\t\t\t:options-limit=\"5\"\n\t\t\t\t\t:placeholder=\"t('settings', 'Limit app usage to groups')\"\n\t\t\t\t\tlabel=\"name\"\n\t\t\t\t\ttrack-by=\"id\"\n\t\t\t\t\tclass=\"multiselect-vue\"\n\t\t\t\t\t:multiple=\"true\"\n\t\t\t\t\t:close-on-select=\"false\"\n\t\t\t\t\t:tag-width=\"60\"\n\t\t\t\t\t@select=\"addGroupLimitation\"\n\t\t\t\t\t@remove=\"removeGroupLimitation\"\n\t\t\t\t\t@search-change=\"asyncFindGroup\">\n\t\t\t\t\t<span slot=\"noResult\">{{ t('settings', 'No results') }}</span>\n\t\t\t\t</Multiselect>\n\t\t\t</div>\n\t\t\t<div class=\"app-details__actions-manage\">\n\t\t\t\t<input v-if=\"app.update\"\n\t\t\t\t\tclass=\"update primary\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t:value=\"t('settings', 'Update to {version}', { version: app.update })\"\n\t\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t\t@click=\"update(app.id)\">\n\t\t\t\t<input v-if=\"app.canUnInstall\"\n\t\t\t\t\tclass=\"uninstall\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t:value=\"t('settings', 'Remove')\"\n\t\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t\t@click=\"remove(app.id)\">\n\t\t\t\t<input v-if=\"app.active\"\n\t\t\t\t\tclass=\"enable\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t:value=\"t('settings','Disable')\"\n\t\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t\t@click=\"disable(app.id)\">\n\t\t\t\t<input v-if=\"!app.active && (app.canInstall || app.isCompatible)\"\n\t\t\t\t\tv-tooltip.auto=\"enableButtonTooltip\"\n\t\t\t\t\tclass=\"enable primary\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t:value=\"enableButtonText\"\n\t\t\t\t\t:disabled=\"!app.canInstall || installing || isLoading\"\n\t\t\t\t\t@click=\"enable(app.id)\">\n\t\t\t\t<input v-else-if=\"!app.active && !app.canInstall\"\n\t\t\t\t\tv-tooltip.auto=\"forceEnableButtonTooltip\"\n\t\t\t\t\tclass=\"enable force\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t:value=\"forceEnableButtonText\"\n\t\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t\t@click=\"forceEnable(app.id)\">\n\t\t\t</div>\n\t\t</div>\n\n\t\t<ul class=\"app-details__dependencies\">\n\t\t\t<li v-if=\"app.missingMinOwnCloudVersion\">\n\t\t\t\t{{ t('settings', 'This app has no minimum Nextcloud version assigned. This will be an error in the future.') }}\n\t\t\t</li>\n\t\t\t<li v-if=\"app.missingMaxOwnCloudVersion\">\n\t\t\t\t{{ t('settings', 'This app has no maximum Nextcloud version assigned. This will be an error in the future.') }}\n\t\t\t</li>\n\t\t\t<li v-if=\"!app.canInstall\">\n\t\t\t\t{{ t('settings', 'This app cannot be installed because the following dependencies are not fulfilled:') }}\n\t\t\t\t<ul class=\"missing-dependencies\">\n\t\t\t\t\t<li v-for=\"(dep, index) in app.missingDependencies\" :key=\"index\">\n\t\t\t\t\t\t{{ dep }}\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</li>\n\t\t</ul>\n\n\t\t<p class=\"app-details__documentation\">\n\t\t\t<a v-if=\"!app.internal\"\n\t\t\t\tclass=\"appslink\"\n\t\t\t\t:href=\"appstoreUrl\"\n\t\t\t\ttarget=\"_blank\"\n\t\t\t\trel=\"noreferrer noopener\">{{ t('settings', 'View in store') }} ↗</a>\n\n\t\t\t<a v-if=\"app.website\"\n\t\t\t\tclass=\"appslink\"\n\t\t\t\t:href=\"app.website\"\n\t\t\t\ttarget=\"_blank\"\n\t\t\t\trel=\"noreferrer noopener\">{{ t('settings', 'Visit website') }} ↗</a>\n\t\t\t<a v-if=\"app.bugs\"\n\t\t\t\tclass=\"appslink\"\n\t\t\t\t:href=\"app.bugs\"\n\t\t\t\ttarget=\"_blank\"\n\t\t\t\trel=\"noreferrer noopener\">{{ t('settings', 'Report a bug') }} ↗</a>\n\n\t\t\t<a v-if=\"app.documentation && app.documentation.user\"\n\t\t\t\tclass=\"appslink\"\n\t\t\t\t:href=\"app.documentation.user\"\n\t\t\t\ttarget=\"_blank\"\n\t\t\t\trel=\"noreferrer noopener\">{{ t('settings', 'User documentation') }} ↗</a>\n\t\t\t<a v-if=\"app.documentation && app.documentation.admin\"\n\t\t\t\tclass=\"appslink\"\n\t\t\t\t:href=\"app.documentation.admin\"\n\t\t\t\ttarget=\"_blank\"\n\t\t\t\trel=\"noreferrer noopener\">{{ t('settings', 'Admin documentation') }} ↗</a>\n\t\t\t<a v-if=\"app.documentation && app.documentation.developer\"\n\t\t\t\tclass=\"appslink\"\n\t\t\t\t:href=\"app.documentation.developer\"\n\t\t\t\ttarget=\"_blank\"\n\t\t\t\trel=\"noreferrer noopener\">{{ t('settings', 'Developer documentation') }} ↗</a>\n\t\t</p>\n\t\t<Markdown class=\"app-details__description\" :text=\"app.description\" />\n\t</div>\n</template>\n\n<script>\nimport Multiselect from '@nextcloud/vue/dist/Components/Multiselect'\n\nimport AppManagement from '../mixins/AppManagement'\nimport PrefixMixin from './PrefixMixin'\nimport Markdown from './Markdown'\n\nexport default {\n\tname: 'AppDetails',\n\n\tcomponents: {\n\t\tMultiselect,\n\t\tMarkdown,\n\t},\n\tmixins: [AppManagement, PrefixMixin],\n\n\tprops: {\n\t\tapp: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tgroupCheckedAppsData: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tappstoreUrl() {\n\t\t\treturn `https://apps.nextcloud.com/apps/${this.app.id}`\n\t\t},\n\t\tlicence() {\n\t\t\tif (this.app.licence) {\n\t\t\t\treturn t('settings', '{license}-licensed', { license: ('' + this.app.licence).toUpperCase() })\n\t\t\t}\n\t\t\treturn null\n\t\t},\n\t\tauthor() {\n\t\t\tif (typeof this.app.author === 'string') {\n\t\t\t\treturn [\n\t\t\t\t\t{\n\t\t\t\t\t\t'@value': this.app.author,\n\t\t\t\t\t},\n\t\t\t\t]\n\t\t\t}\n\t\t\tif (this.app.author['@value']) {\n\t\t\t\treturn [this.app.author]\n\t\t\t}\n\t\t\treturn this.app.author\n\t\t},\n\t\tappGroups() {\n\t\t\treturn this.app.groups.map(group => { return { id: group, name: group } })\n\t\t},\n\t\tgroups() {\n\t\t\treturn this.$store.getters.getGroups\n\t\t\t\t.filter(group => group.id !== 'disabled')\n\t\t\t\t.sort((a, b) => a.name.localeCompare(b.name))\n\t\t},\n\t},\n\tmounted() {\n\t\tif (this.app.groups.length > 0) {\n\t\t\tthis.groupCheckedAppsData = true\n\t\t}\n\t},\n}\n</script>\n\n<style scoped lang=\"scss\">\n.app-details {\n\tpadding: 20px;\n\n\t&__actions {\n\t\t// app management\n\t\t&-manage {\n\t\t\t// if too many, shrink them and ellipsis\n\t\t\tdisplay: flex;\n\t\t\tinput {\n\t\t\t\tflex: 0 1 auto;\n\t\t\t\tmin-width: 0;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\t\t}\n\t}\n\t&__dependencies {\n\t\topacity: .7;\n\t}\n\t&__documentation {\n\t\tpadding-top: 20px;\n\t}\n\t&__description {\n\t\tpadding-top: 20px;\n\t}\n}\n\n.force {\n\tcolor: var(--color-error);\n\tborder-color: var(--color-error);\n\tbackground: var(--color-main-background);\n}\n.force:hover,\n.force:active {\n\tcolor: var(--color-main-background);\n\tborder-color: var(--color-error) !important;\n\tbackground: var(--color-error);\n}\n\n</style>\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppDetails.vue?vue&type=style&index=0&id=8ea5f476&scoped=true&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppDetails.vue?vue&type=style&index=0&id=8ea5f476&scoped=true&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AppDetails.vue?vue&type=template&id=8ea5f476&scoped=true&\"\nimport script from \"./AppDetails.vue?vue&type=script&lang=js&\"\nexport * from \"./AppDetails.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AppDetails.vue?vue&type=style&index=0&id=8ea5f476&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"8ea5f476\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"app-details\"},[_c('div',{staticClass:\"app-details__actions\"},[(_vm.app.active && _vm.canLimitToGroups(_vm.app))?_c('div',{staticClass:\"app-details__actions-groups\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.groupCheckedAppsData),expression:\"groupCheckedAppsData\"}],staticClass:\"groups-enable__checkbox checkbox\",attrs:{\"id\":_vm.prefix('groups_enable', _vm.app.id),\"type\":\"checkbox\"},domProps:{\"value\":_vm.app.id,\"checked\":Array.isArray(_vm.groupCheckedAppsData)?_vm._i(_vm.groupCheckedAppsData,_vm.app.id)>-1:(_vm.groupCheckedAppsData)},on:{\"change\":[function($event){var $$a=_vm.groupCheckedAppsData,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=_vm.app.id,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.groupCheckedAppsData=$$a.concat([$$v]))}else{$$i>-1&&(_vm.groupCheckedAppsData=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.groupCheckedAppsData=$$c}},_vm.setGroupLimit]}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":_vm.prefix('groups_enable', _vm.app.id)}},[_vm._v(_vm._s(_vm.t('settings', 'Limit to groups')))]),_vm._v(\" \"),_c('input',{staticClass:\"group_select\",attrs:{\"type\":\"hidden\",\"title\":_vm.t('settings', 'All'),\"value\":\"\"}}),_vm._v(\" \"),(_vm.isLimitedToGroups(_vm.app))?_c('Multiselect',{staticClass:\"multiselect-vue\",attrs:{\"options\":_vm.groups,\"value\":_vm.appGroups,\"options-limit\":5,\"placeholder\":_vm.t('settings', 'Limit app usage to groups'),\"label\":\"name\",\"track-by\":\"id\",\"multiple\":true,\"close-on-select\":false,\"tag-width\":60},on:{\"select\":_vm.addGroupLimitation,\"remove\":_vm.removeGroupLimitation,\"search-change\":_vm.asyncFindGroup}},[_c('span',{attrs:{\"slot\":\"noResult\"},slot:\"noResult\"},[_vm._v(_vm._s(_vm.t('settings', 'No results')))])]):_vm._e()],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"app-details__actions-manage\"},[(_vm.app.update)?_c('input',{staticClass:\"update primary\",attrs:{\"type\":\"button\",\"value\":_vm.t('settings', 'Update to {version}', { version: _vm.app.update }),\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){return _vm.update(_vm.app.id)}}}):_vm._e(),_vm._v(\" \"),(_vm.app.canUnInstall)?_c('input',{staticClass:\"uninstall\",attrs:{\"type\":\"button\",\"value\":_vm.t('settings', 'Remove'),\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){return _vm.remove(_vm.app.id)}}}):_vm._e(),_vm._v(\" \"),(_vm.app.active)?_c('input',{staticClass:\"enable\",attrs:{\"type\":\"button\",\"value\":_vm.t('settings','Disable'),\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){return _vm.disable(_vm.app.id)}}}):_vm._e(),_vm._v(\" \"),(!_vm.app.active && (_vm.app.canInstall || _vm.app.isCompatible))?_c('input',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.enableButtonTooltip),expression:\"enableButtonTooltip\",modifiers:{\"auto\":true}}],staticClass:\"enable primary\",attrs:{\"type\":\"button\",\"value\":_vm.enableButtonText,\"disabled\":!_vm.app.canInstall || _vm.installing || _vm.isLoading},on:{\"click\":function($event){return _vm.enable(_vm.app.id)}}}):(!_vm.app.active && !_vm.app.canInstall)?_c('input',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.forceEnableButtonTooltip),expression:\"forceEnableButtonTooltip\",modifiers:{\"auto\":true}}],staticClass:\"enable force\",attrs:{\"type\":\"button\",\"value\":_vm.forceEnableButtonText,\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){return _vm.forceEnable(_vm.app.id)}}}):_vm._e()])]),_vm._v(\" \"),_c('ul',{staticClass:\"app-details__dependencies\"},[(_vm.app.missingMinOwnCloudVersion)?_c('li',[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'This app has no minimum Nextcloud version assigned. This will be an error in the future.'))+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.app.missingMaxOwnCloudVersion)?_c('li',[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'This app has no maximum Nextcloud version assigned. This will be an error in the future.'))+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),(!_vm.app.canInstall)?_c('li',[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'This app cannot be installed because the following dependencies are not fulfilled:'))+\"\\n\\t\\t\\t\"),_c('ul',{staticClass:\"missing-dependencies\"},_vm._l((_vm.app.missingDependencies),function(dep,index){return _c('li',{key:index},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(dep)+\"\\n\\t\\t\\t\\t\")])}),0)]):_vm._e()]),_vm._v(\" \"),_c('p',{staticClass:\"app-details__documentation\"},[(!_vm.app.internal)?_c('a',{staticClass:\"appslink\",attrs:{\"href\":_vm.appstoreUrl,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(_vm._s(_vm.t('settings', 'View in store'))+\" ↗\")]):_vm._e(),_vm._v(\" \"),(_vm.app.website)?_c('a',{staticClass:\"appslink\",attrs:{\"href\":_vm.app.website,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(_vm._s(_vm.t('settings', 'Visit website'))+\" ↗\")]):_vm._e(),_vm._v(\" \"),(_vm.app.bugs)?_c('a',{staticClass:\"appslink\",attrs:{\"href\":_vm.app.bugs,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(_vm._s(_vm.t('settings', 'Report a bug'))+\" ↗\")]):_vm._e(),_vm._v(\" \"),(_vm.app.documentation && _vm.app.documentation.user)?_c('a',{staticClass:\"appslink\",attrs:{\"href\":_vm.app.documentation.user,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(_vm._s(_vm.t('settings', 'User documentation'))+\" ↗\")]):_vm._e(),_vm._v(\" \"),(_vm.app.documentation && _vm.app.documentation.admin)?_c('a',{staticClass:\"appslink\",attrs:{\"href\":_vm.app.documentation.admin,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(_vm._s(_vm.t('settings', 'Admin documentation'))+\" ↗\")]):_vm._e(),_vm._v(\" \"),(_vm.app.documentation && _vm.app.documentation.developer)?_c('a',{staticClass:\"appslink\",attrs:{\"href\":_vm.app.documentation.developer,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(_vm._s(_vm.t('settings', 'Developer documentation'))+\" ↗\")]):_vm._e()]),_vm._v(\" \"),_c('Markdown',{staticClass:\"app-details__description\",attrs:{\"text\":_vm.app.description}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<Content app-name=\"settings\"\n\t\t:class=\"{ 'with-app-sidebar': app}\"\n\t\t:content-class=\"{ 'icon-loading': loadingList }\"\n\t\t:navigation-class=\"{ 'icon-loading': loading }\">\n\t\t<!-- Categories & filters -->\n\t\t<AppNavigation>\n\t\t\t<template #list>\n\t\t\t\t<AppNavigationItem id=\"app-category-your-apps\"\n\t\t\t\t\t:to=\"{ name: 'apps' }\"\n\t\t\t\t\t:exact=\"true\"\n\t\t\t\t\ticon=\"icon-category-installed\"\n\t\t\t\t\t:title=\"t('settings', 'Your apps')\" />\n\t\t\t\t<AppNavigationItem id=\"app-category-enabled\"\n\t\t\t\t\t:to=\"{ name: 'apps-category', params: { category: 'enabled' } }\"\n\t\t\t\t\ticon=\"icon-category-enabled\"\n\t\t\t\t\t:title=\"t('settings', 'Active apps')\" />\n\t\t\t\t<AppNavigationItem id=\"app-category-disabled\"\n\t\t\t\t\t:to=\"{ name: 'apps-category', params: { category: 'disabled' } }\"\n\t\t\t\t\ticon=\"icon-category-disabled\"\n\t\t\t\t\t:title=\"t('settings', 'Disabled apps')\" />\n\t\t\t\t<AppNavigationItem v-if=\"updateCount > 0\"\n\t\t\t\t\tid=\"app-category-updates\"\n\t\t\t\t\t:to=\"{ name: 'apps-category', params: { category: 'updates' } }\"\n\t\t\t\t\ticon=\"icon-download\"\n\t\t\t\t\t:title=\"t('settings', 'Updates')\">\n\t\t\t\t\t<AppNavigationCounter slot=\"counter\">\n\t\t\t\t\t\t{{ updateCount }}\n\t\t\t\t\t</AppNavigationCounter>\n\t\t\t\t</AppNavigationItem>\n\t\t\t\t<AppNavigationItem id=\"app-category-your-bundles\"\n\t\t\t\t\t:to=\"{ name: 'apps-category', params: { category: 'app-bundles' } }\"\n\t\t\t\t\ticon=\"icon-category-app-bundles\"\n\t\t\t\t\t:title=\"t('settings', 'App bundles')\" />\n\n\t\t\t\t<AppNavigationSpacer />\n\n\t\t\t\t<!-- App store categories -->\n\t\t\t\t<template v-if=\"settings.appstoreEnabled\">\n\t\t\t\t\t<AppNavigationItem id=\"app-category-featured\"\n\t\t\t\t\t\t:to=\"{ name: 'apps-category', params: { category: 'featured' } }\"\n\t\t\t\t\t\ticon=\"icon-favorite\"\n\t\t\t\t\t\t:title=\"t('settings', 'Featured apps')\" />\n\n\t\t\t\t\t<AppNavigationItem v-for=\"cat in categories\"\n\t\t\t\t\t\t:key=\"'icon-category-' + cat.ident\"\n\t\t\t\t\t\t:icon=\"'icon-category-' + cat.ident\"\n\t\t\t\t\t\t:to=\"{\n\t\t\t\t\t\t\tname: 'apps-category',\n\t\t\t\t\t\t\tparams: { category: cat.ident },\n\t\t\t\t\t\t}\"\n\t\t\t\t\t\t:title=\"cat.displayName\" />\n\t\t\t\t</template>\n\n\t\t\t\t<AppNavigationItem id=\"app-developer-docs\"\n\t\t\t\t\t:title=\"t('settings', 'Developer documentation') + ' ↗'\"\n\t\t\t\t\t@click=\"openDeveloperDocumentation\" />\n\t\t\t</template>\n\t\t</AppNavigation>\n\n\t\t<!-- Apps list -->\n\t\t<AppContent class=\"app-settings-content\" :class=\"{ 'icon-loading': loadingList }\">\n\t\t\t<AppList :category=\"category\" :app=\"app\" :search=\"searchQuery\" />\n\t\t</AppContent>\n\n\t\t<!-- Selected app details -->\n\t\t<AppSidebar v-if=\"id && app\"\n\t\t\tv-bind=\"appSidebar\"\n\t\t\t:class=\"{'app-sidebar--without-background': !appSidebar.background}\"\n\t\t\t@close=\"hideAppDetails\">\n\t\t\t<template v-if=\"!appSidebar.background\" #header>\n\t\t\t\t<div class=\"app-sidebar-header__figure--default-app-icon icon-settings-dark\" />\n\t\t\t</template>\n\n\t\t\t<template #description>\n\t\t\t\t<!-- Featured/Supported badges -->\n\t\t\t\t<div v-if=\"app.level === 300 || app.level === 200 || hasRating\" class=\"app-level\">\n\t\t\t\t\t<span v-if=\"app.level === 300\"\n\t\t\t\t\t\tv-tooltip.auto=\"t('settings', 'This app is supported via your current Nextcloud subscription.')\"\n\t\t\t\t\t\tclass=\"supported icon-checkmark-color\">\n\t\t\t\t\t\t{{ t('settings', 'Supported') }}</span>\n\t\t\t\t\t<span v-if=\"app.level === 200\"\n\t\t\t\t\t\tv-tooltip.auto=\"t('settings', 'Featured apps are developed by and within the community. They offer central functionality and are ready for production use.')\"\n\t\t\t\t\t\tclass=\"official icon-checkmark\">\n\t\t\t\t\t\t{{ t('settings', 'Featured') }}</span>\n\t\t\t\t\t<AppScore v-if=\"hasRating\" :score=\"app.appstoreData.ratingOverall\" />\n\t\t\t\t</div>\n\t\t\t\t<div class=\"app-version\">\n\t\t\t\t\t<p>{{ app.version }}</p>\n\t\t\t\t</div>\n\t\t\t</template>\n\n\t\t\t<!-- Tab content -->\n\n\t\t\t<AppSidebarTab id=\"desc\"\n\t\t\t\ticon=\"icon-category-office\"\n\t\t\t\t:name=\"t('settings', 'Details')\"\n\t\t\t\t:order=\"0\">\n\t\t\t\t<AppDetails :app=\"app\" />\n\t\t\t</AppSidebarTab>\n\t\t\t<AppSidebarTab v-if=\"app.appstoreData && app.releases[0].translations.en.changelog\"\n\t\t\t\tid=\"desca\"\n\t\t\t\ticon=\"icon-category-organization\"\n\t\t\t\t:name=\"t('settings', 'Changelog')\"\n\t\t\t\t:order=\"1\">\n\t\t\t\t<div v-for=\"release in app.releases\" :key=\"release.version\" class=\"app-sidebar-tabs__release\">\n\t\t\t\t\t<h2>{{ release.version }}</h2>\n\t\t\t\t\t<Markdown v-if=\"changelog(release)\" :text=\"changelog(release)\" />\n\t\t\t\t</div>\n\t\t\t</AppSidebarTab>\n\t\t</AppSidebar>\n\t</Content>\n</template>\n\n<script>\nimport { subscribe, unsubscribe } from '@nextcloud/event-bus'\nimport Vue from 'vue'\nimport VueLocalStorage from 'vue-localstorage'\n\nimport AppContent from '@nextcloud/vue/dist/Components/AppContent'\nimport AppNavigation from '@nextcloud/vue/dist/Components/AppNavigation'\nimport AppNavigationCounter from '@nextcloud/vue/dist/Components/AppNavigationCounter'\nimport AppNavigationItem from '@nextcloud/vue/dist/Components/AppNavigationItem'\nimport AppNavigationSpacer from '@nextcloud/vue/dist/Components/AppNavigationSpacer'\nimport AppSidebar from '@nextcloud/vue/dist/Components/AppSidebar'\nimport AppSidebarTab from '@nextcloud/vue/dist/Components/AppSidebarTab'\nimport Content from '@nextcloud/vue/dist/Components/Content'\n\nimport AppList from '../components/AppList'\nimport AppDetails from '../components/AppDetails'\nimport AppManagement from '../mixins/AppManagement'\nimport AppScore from '../components/AppList/AppScore'\nimport Markdown from '../components/Markdown'\n\nVue.use(VueLocalStorage)\n\nexport default {\n\tname: 'Apps',\n\n\tcomponents: {\n\t\tAppContent,\n\t\tAppDetails,\n\t\tAppList,\n\t\tAppNavigation,\n\t\tAppNavigationCounter,\n\t\tAppNavigationItem,\n\t\tAppNavigationSpacer,\n\t\tAppScore,\n\t\tAppSidebar,\n\t\tAppSidebarTab,\n\t\tContent,\n\t\tMarkdown,\n\t},\n\n\tmixins: [AppManagement],\n\n\tprops: {\n\t\tcategory: {\n\t\t\ttype: String,\n\t\t\tdefault: 'installed',\n\t\t},\n\t\tid: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tsearchQuery: '',\n\t\t\tscreenshotLoaded: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tloading() {\n\t\t\treturn this.$store.getters.loading('categories')\n\t\t},\n\t\tloadingList() {\n\t\t\treturn this.$store.getters.loading('list')\n\t\t},\n\t\tapp() {\n\t\t\treturn this.apps.find(app => app.id === this.id)\n\t\t},\n\t\tcategories() {\n\t\t\treturn this.$store.getters.getCategories\n\t\t},\n\t\tapps() {\n\t\t\treturn this.$store.getters.getAllApps\n\t\t},\n\t\tupdateCount() {\n\t\t\treturn this.$store.getters.getUpdateCount\n\t\t},\n\t\tsettings() {\n\t\t\treturn this.$store.getters.getServerData\n\t\t},\n\n\t\thasRating() {\n\t\t\treturn this.app.appstoreData && this.app.appstoreData.ratingNumOverall > 5\n\t\t},\n\n\t\t// sidebar app binding\n\t\tappSidebar() {\n\t\t\tconst authorName = (xmlNode) => {\n\t\t\t\tif (xmlNode['@value']) {\n\t\t\t\t\t// Complex node (with email or homepage attribute)\n\t\t\t\t\treturn xmlNode['@value']\n\t\t\t\t}\n\n\t\t\t\t// Simple text node\n\t\t\t\treturn xmlNode\n\t\t\t}\n\n\t\t\tconst author = Array.isArray(this.app.author)\n\t\t\t\t? this.app.author.map(authorName).join(', ')\n\t\t\t\t: authorName(this.app.author)\n\t\t\tconst license = t('settings', '{license}-licensed', { license: ('' + this.app.licence).toUpperCase() })\n\n\t\t\tconst subtitle = t('settings', 'by {author}\\n{license}', { author, license })\n\n\t\t\treturn {\n\t\t\t\tsubtitle,\n\t\t\t\tbackground: this.app.screenshot && this.screenshotLoaded\n\t\t\t\t\t? this.app.screenshot\n\t\t\t\t\t: this.app.preview,\n\t\t\t\tcompact: !(this.app.screenshot && this.screenshotLoaded),\n\t\t\t\ttitle: this.app.name,\n\n\t\t\t}\n\t\t},\n\t\tchangelog() {\n\t\t\treturn (release) => release.translations.en.changelog\n\t\t},\n\t},\n\n\twatch: {\n\t\tcategory() {\n\t\t\tthis.searchQuery = ''\n\t\t},\n\n\t\tapp() {\n\t\t\tthis.screenshotLoaded = false\n\t\t\tif (this.app?.releases && this.app?.screenshot) {\n\t\t\t\tconst image = new Image()\n\t\t\t\timage.onload = (e) => {\n\t\t\t\t\tthis.screenshotLoaded = true\n\t\t\t\t}\n\t\t\t\timage.src = this.app.screenshot\n\t\t\t}\n\t\t},\n\t},\n\n\tbeforeMount() {\n\t\tthis.$store.dispatch('getCategories')\n\t\tthis.$store.dispatch('getAllApps')\n\t\tthis.$store.dispatch('getGroups', { offset: 0, limit: 5 })\n\t\tthis.$store.commit('setUpdateCount', this.$store.getters.getServerData.updateCount)\n\t},\n\n\tmounted() {\n\t\tsubscribe('nextcloud:unified-search.search', this.setSearch)\n\t\tsubscribe('nextcloud:unified-search.reset', this.resetSearch)\n\t},\n\tbeforeDestroy() {\n\t\tunsubscribe('nextcloud:unified-search.search', this.setSearch)\n\t\tunsubscribe('nextcloud:unified-search.reset', this.resetSearch)\n\t},\n\n\tmethods: {\n\t\tsetSearch({ query }) {\n\t\t\tthis.searchQuery = query\n\t\t},\n\t\tresetSearch() {\n\t\t\tthis.searchQuery = ''\n\t\t},\n\n\t\thideAppDetails() {\n\t\t\tthis.$router.push({\n\t\t\t\tname: 'apps-category',\n\t\t\t\tparams: { category: this.category },\n\t\t\t})\n\t\t},\n\t\topenDeveloperDocumentation() {\n\t\t\twindow.open(this.settings.developerDocumentation)\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.app-sidebar::v-deep {\n\t&:not(.app-sidebar--without-background) {\n\t\t// with full screenshot, let's fill the figure\n\t\t:not(.app-sidebar-header--compact) .app-sidebar-header__figure {\n\t\t\tbackground-size: cover;\n\t\t}\n\t\t// revert sidebar app icon so it is black\n\t\t.app-sidebar-header--compact .app-sidebar-header__figure {\n\t\t\tbackground-size: 32px;\n\n\t\t\tfilter: invert(1);\n\t\t}\n\t}\n\n\t.app-sidebar-header__description {\n\t\t.app-version {\n\t\t\tpadding-left: 10px;\n\t\t}\n\t}\n\n\t// default icon slot styling\n\t&.app-sidebar--without-background {\n\t\t.app-sidebar-header__figure {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\t&--default-app-icon {\n\t\t\t\twidth: 32px;\n\t\t\t\theight: 32px;\n\t\t\t\tbackground-size: 32px;\n\t\t\t}\n\t\t}\n\t}\n\n\t// TODO: migrate to components\n\t.app-sidebar-header__desc {\n\t\t// allow multi line subtitle for the license\n\t\t.app-sidebar-header__subtitle {\n\t\t\toverflow: visible !important;\n\t\t\theight: auto;\n\t\t\twhite-space: normal !important;\n\t\t\tline-height: 16px;\n\t\t}\n\t}\n\n\t.app-sidebar-header__action {\n\t\t// align with tab content\n\t\tmargin: 0 20px;\n\t\tinput {\n\t\t\tmargin: 3px;\n\t\t}\n\t}\n}\n\n// Align the appNavigation toggle with the apps header toolbar\n.app-navigation::v-deep button.app-navigation-toggle {\n\ttop: 8px;\n\tright: -8px;\n}\n\n.app-sidebar-tabs__release {\n\th2 {\n\t\tborder-bottom: 1px solid var(--color-border);\n\t}\n\n\t// Overwrite changelog heading styles\n\t::v-deep {\n\t\th3 {\n\t\t\tfont-size: 20px;\n\t\t}\n\t\th4 {\n\t\t\tfont-size: 17px;\n\t\t}\n\t}\n}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Apps.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Apps.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Apps.vue?vue&type=style&index=0&id=d3244798&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Apps.vue?vue&type=style&index=0&id=d3244798&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./Apps.vue?vue&type=template&id=d3244798&scoped=true&\"\nimport script from \"./Apps.vue?vue&type=script&lang=js&\"\nexport * from \"./Apps.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Apps.vue?vue&type=style&index=0&id=d3244798&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"d3244798\",\n null\n \n)\n\nexport default component.exports"],"names":["___CSS_LOADER_EXPORT___","push","module","id","_vm","this","_h","$createElement","_self","_c","staticClass","attrs","scoreImage","axios","generateOcsUrl","then","data","ocs","meta","statuscode","addedApps","navEntries","container","document","querySelector","forEach","entry","querySelectorAll","el","index","dataset","remove","previousEntry","li","createElement","img","icon","imgElement","innerHTML","a","setAttribute","href","filename","appendChild","createTextNode","name","loading","style","display","classList","add","prepend","content","firstChild","append","previousElement","insertAdjacentElement","getElementById","OCA","Theming","inverted","queryElementById","window","dispatchEvent","Event","computed","appGroups","app","groups","map","group","installing","$store","getters","isLoading","enableButtonText","needsDownload","t","forceEnableButtonText","enableButtonTooltip","forceEnableButtonTooltip","base","groupCheckedAppsData","mounted","length","methods","asyncFindGroup","query","dispatch","search","limit","offset","isLimitedToGroups","setGroupLimit","appId","canLimitToGroups","types","includes","addGroupLimitation","concat","removeGroupLimitation","currentGroups","indexOf","splice","forceEnable","response","rebuildNavigation","catch","error","showError","enable","disable","install","update","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","class","selected","isSelected","on","showAppDetails","listView","preview","screenshotLoaded","filterId","_v","filterUrl","_e","screenshot","_s","summary","version","appstoreData","releases","level","directives","rawName","value","expression","modifiers","hasRating","score","$event","stopPropagation","active","canInstall","isCompatible","installed","useBundleView","useListView","store","useAppStoreView","n","counter","updateAll","showUpdateAll","_l","key","category","bundle","bundleToggleText","toggleBundle","bundleApps","searchApps","apps","domProps","renderMarkdown","prefix","Array","isArray","_i","$$a","$$el","target","$$c","checked","$$v","$$i","slice","slot","dep","internal","appstoreUrl","website","bugs","documentation","user","admin","developer","description","loadingList","scopedSlots","_u","fn","params","updateCount","settings","cat","ident","displayName","openDeveloperDocumentation","proxy","searchQuery","_b","appSidebar","background","hideAppDetails","ratingOverall","translations","en","changelog","release"],"sourceRoot":""}
\ No newline at end of file +{"version":3,"file":"settings-apps-view-7418.js?v=a58f27a0cd6f99595ea8","mappings":"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","sources":["webpack:///nextcloud/apps/settings/src/components/AppDetails.vue?vue&type=style&index=0&id=8ea5f476&scoped=true&lang=scss&","webpack:///nextcloud/apps/settings/src/components/Markdown.vue?vue&type=style&index=0&id=652eb552&scoped=true&lang=scss&","webpack:///nextcloud/apps/settings/src/views/Apps.vue?vue&type=style&index=0&id=d3244798&lang=scss&scoped=true&","webpack:///nextcloud/apps/settings/src/components/AppList/AppItem.vue?vue&type=style&index=0&id=06bcd5b6&scoped=true&lang=css&","webpack:///nextcloud/apps/settings/src/views/Apps.vue?vue&type=template&id=d3244798&scoped=true&","webpack:///nextcloud/apps/settings/src/components/AppList/AppScore.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/settings/src/components/AppList/AppScore.vue","webpack://nextcloud/./apps/settings/src/components/AppList/AppScore.vue?26fd","webpack:///nextcloud/apps/settings/src/components/AppList/AppScore.vue?vue&type=template&id=3b3081d1&","webpack:///nextcloud/apps/settings/src/service/rebuild-navigation.js","webpack:///nextcloud/apps/settings/src/mixins/AppManagement.js","webpack:///nextcloud/apps/settings/src/components/SvgFilterMixin.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/settings/src/components/SvgFilterMixin.vue","webpack:///nextcloud/apps/settings/src/components/AppList/AppItem.vue","webpack://nextcloud/./apps/settings/src/components/SvgFilterMixin.vue?5bcd","webpack:///nextcloud/apps/settings/src/components/AppList/AppItem.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/settings/src/components/AppList/AppItem.vue?8c5c","webpack://nextcloud/./apps/settings/src/components/AppList/AppItem.vue?a9a1","webpack:///nextcloud/apps/settings/src/components/AppList/AppItem.vue?vue&type=template&id=06bcd5b6&scoped=true&","webpack://nextcloud/./apps/settings/src/components/PrefixMixin.vue?c564","webpack:///nextcloud/apps/settings/src/components/PrefixMixin.vue","webpack:///nextcloud/apps/settings/src/components/AppList.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/settings/src/components/AppList.vue","webpack://nextcloud/./apps/settings/src/components/AppList.vue?8acf","webpack:///nextcloud/apps/settings/src/components/AppList.vue?vue&type=template&id=35e8fed4&","webpack:///nextcloud/apps/settings/src/components/Markdown.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/settings/src/components/Markdown.vue","webpack://nextcloud/./apps/settings/src/components/Markdown.vue?1464","webpack://nextcloud/./apps/settings/src/components/Markdown.vue?26cf","webpack:///nextcloud/apps/settings/src/components/Markdown.vue?vue&type=template&id=652eb552&scoped=true&","webpack:///nextcloud/apps/settings/src/components/AppDetails.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/settings/src/components/AppDetails.vue","webpack://nextcloud/./apps/settings/src/components/AppDetails.vue?60ff","webpack://nextcloud/./apps/settings/src/components/AppDetails.vue?2807","webpack:///nextcloud/apps/settings/src/components/AppDetails.vue?vue&type=template&id=8ea5f476&scoped=true&","webpack:///nextcloud/apps/settings/src/views/Apps.vue","webpack:///nextcloud/apps/settings/src/views/Apps.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/settings/src/views/Apps.vue?1019","webpack://nextcloud/./apps/settings/src/views/Apps.vue?7b97"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".app-details[data-v-8ea5f476]{padding:20px}.app-details__actions-manage[data-v-8ea5f476]{display:flex}.app-details__actions-manage input[data-v-8ea5f476]{flex:0 1 auto;min-width:0;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.app-details__dependencies[data-v-8ea5f476]{opacity:.7}.app-details__documentation[data-v-8ea5f476]{padding-top:20px}.app-details__description[data-v-8ea5f476]{padding-top:20px}.force[data-v-8ea5f476]{color:var(--color-error);border-color:var(--color-error);background:var(--color-main-background)}.force[data-v-8ea5f476]:hover,.force[data-v-8ea5f476]:active{color:var(--color-main-background);border-color:var(--color-error) !important;background:var(--color-error)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/AppDetails.vue\"],\"names\":[],\"mappings\":\"AAuNA,8BACC,YAAA,CAIC,8CAEC,YAAA,CACA,oDACC,aAAA,CACA,WAAA,CACA,sBAAA,CACA,kBAAA,CACA,eAAA,CAIH,4CACC,UAAA,CAED,6CACC,gBAAA,CAED,2CACC,gBAAA,CAIF,wBACC,wBAAA,CACA,+BAAA,CACA,uCAAA,CAED,6DAEC,kCAAA,CACA,0CAAA,CACA,6BAAA\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n.app-details {\\n\\tpadding: 20px;\\n\\n\\t&__actions {\\n\\t\\t// app management\\n\\t\\t&-manage {\\n\\t\\t\\t// if too many, shrink them and ellipsis\\n\\t\\t\\tdisplay: flex;\\n\\t\\t\\tinput {\\n\\t\\t\\t\\tflex: 0 1 auto;\\n\\t\\t\\t\\tmin-width: 0;\\n\\t\\t\\t\\ttext-overflow: ellipsis;\\n\\t\\t\\t\\twhite-space: nowrap;\\n\\t\\t\\t\\toverflow: hidden;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\t&__dependencies {\\n\\t\\topacity: .7;\\n\\t}\\n\\t&__documentation {\\n\\t\\tpadding-top: 20px;\\n\\t}\\n\\t&__description {\\n\\t\\tpadding-top: 20px;\\n\\t}\\n}\\n\\n.force {\\n\\tcolor: var(--color-error);\\n\\tborder-color: var(--color-error);\\n\\tbackground: var(--color-main-background);\\n}\\n.force:hover,\\n.force:active {\\n\\tcolor: var(--color-main-background);\\n\\tborder-color: var(--color-error) !important;\\n\\tbackground: var(--color-error);\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".settings-markdown[data-v-652eb552] h1,.settings-markdown[data-v-652eb552] h2,.settings-markdown[data-v-652eb552] h3,.settings-markdown[data-v-652eb552] h4,.settings-markdown[data-v-652eb552] h5,.settings-markdown[data-v-652eb552] h6{font-weight:600;line-height:120%;margin-top:24px;margin-bottom:12px;color:var(--color-main-text)}.settings-markdown[data-v-652eb552] h1{font-size:36px;margin-top:48px}.settings-markdown[data-v-652eb552] h2{font-size:28px;margin-top:48px}.settings-markdown[data-v-652eb552] h3{font-size:24px}.settings-markdown[data-v-652eb552] h4{font-size:21px}.settings-markdown[data-v-652eb552] h5{font-size:17px}.settings-markdown[data-v-652eb552] h6{font-size:var(--default-font-size)}.settings-markdown[data-v-652eb552] pre{white-space:pre;overflow-x:auto;background-color:var(--color-background-dark);border-radius:var(--border-radius);padding:1em 1.3em;margin-bottom:1em}.settings-markdown[data-v-652eb552] p code{background-color:var(--color-background-dark);border-radius:var(--border-radius);padding:.1em .3em}.settings-markdown[data-v-652eb552] li{position:relative}.settings-markdown[data-v-652eb552] ul,.settings-markdown[data-v-652eb552] ol{padding-left:10px;margin-left:10px}.settings-markdown[data-v-652eb552] ul li{list-style-type:disc}.settings-markdown[data-v-652eb552] ul>li>ul>li{list-style-type:circle}.settings-markdown[data-v-652eb552] ul>li>ul>li ul li{list-style-type:square}.settings-markdown[data-v-652eb552] blockquote{padding-left:1em;border-left:4px solid var(--color-primary-element);color:var(--color-text-maxcontrast);margin-left:0;margin-right:0}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/Markdown.vue\"],\"names\":[],\"mappings\":\"AAgHA,0OAMC,eAAA,CACA,gBAAA,CACA,eAAA,CACA,kBAAA,CACA,4BAAA,CAGD,uCACC,cAAA,CACA,eAAA,CAGD,uCACC,cAAA,CACA,eAAA,CAGD,uCACC,cAAA,CAGD,uCACC,cAAA,CAGD,uCACC,cAAA,CAGD,uCACC,kCAAA,CAGD,wCACC,eAAA,CACA,eAAA,CACA,6CAAA,CACA,kCAAA,CACA,iBAAA,CACA,iBAAA,CAGD,2CACC,6CAAA,CACA,kCAAA,CACA,iBAAA,CAGD,uCACC,iBAAA,CAGD,8EACC,iBAAA,CACA,gBAAA,CAGD,0CACC,oBAAA,CAGD,gDACC,sBAAA,CAGD,sDACC,sBAAA,CAGD,+CACC,gBAAA,CACA,kDAAA,CACA,mCAAA,CACA,aAAA,CACA,cAAA\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n.settings-markdown::v-deep {\\n\\nh1,\\nh2,\\nh3,\\nh4,\\nh5,\\nh6 {\\n\\tfont-weight: 600;\\n\\tline-height: 120%;\\n\\tmargin-top: 24px;\\n\\tmargin-bottom: 12px;\\n\\tcolor: var(--color-main-text);\\n}\\n\\nh1 {\\n\\tfont-size: 36px;\\n\\tmargin-top: 48px;\\n}\\n\\nh2 {\\n\\tfont-size: 28px;\\n\\tmargin-top: 48px;\\n}\\n\\nh3 {\\n\\tfont-size: 24px;\\n}\\n\\nh4 {\\n\\tfont-size: 21px;\\n}\\n\\nh5 {\\n\\tfont-size: 17px;\\n}\\n\\nh6 {\\n\\tfont-size: var(--default-font-size);\\n}\\n\\npre {\\n\\twhite-space: pre;\\n\\toverflow-x: auto;\\n\\tbackground-color: var(--color-background-dark);\\n\\tborder-radius: var(--border-radius);\\n\\tpadding: 1em 1.3em;\\n\\tmargin-bottom: 1em;\\n}\\n\\np code {\\n\\tbackground-color: var(--color-background-dark);\\n\\tborder-radius: var(--border-radius);\\n\\tpadding: .1em .3em;\\n}\\n\\nli {\\n\\tposition: relative;\\n}\\n\\nul, ol {\\n\\tpadding-left: 10px;\\n\\tmargin-left: 10px;\\n}\\n\\nul li {\\n\\tlist-style-type: disc;\\n}\\n\\nul > li > ul > li {\\n\\tlist-style-type: circle;\\n}\\n\\nul > li > ul > li ul li {\\n\\tlist-style-type: square;\\n}\\n\\nblockquote {\\n\\tpadding-left: 1em;\\n\\tborder-left: 4px solid var(--color-primary-element);\\n\\tcolor: var(--color-text-maxcontrast);\\n\\tmargin-left: 0;\\n\\tmargin-right: 0;\\n}\\n\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".app-sidebar[data-v-d3244798]:not(.app-sidebar--without-background) :not(.app-sidebar-header--compact) .app-sidebar-header__figure{background-size:cover}.app-sidebar[data-v-d3244798]:not(.app-sidebar--without-background) .app-sidebar-header--compact .app-sidebar-header__figure{background-size:32px;filter:invert(1)}.app-sidebar[data-v-d3244798] .app-sidebar-header__description .app-version{padding-left:10px}.app-sidebar[data-v-d3244798].app-sidebar--without-background .app-sidebar-header__figure{display:flex;align-items:center;justify-content:center}.app-sidebar[data-v-d3244798].app-sidebar--without-background .app-sidebar-header__figure--default-app-icon{width:32px;height:32px;background-size:32px}.app-sidebar[data-v-d3244798] .app-sidebar-header__desc .app-sidebar-header__subtitle{overflow:visible !important;height:auto;white-space:normal !important;line-height:16px}.app-sidebar[data-v-d3244798] .app-sidebar-header__action{margin:0 20px}.app-sidebar[data-v-d3244798] .app-sidebar-header__action input{margin:3px}.app-navigation[data-v-d3244798] button.app-navigation-toggle{top:8px;right:-8px}.app-sidebar-tabs__release h2[data-v-d3244798]{border-bottom:1px solid var(--color-border)}.app-sidebar-tabs__release[data-v-d3244798] h3{font-size:20px}.app-sidebar-tabs__release[data-v-d3244798] h4{font-size:17px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/views/Apps.vue\"],\"names\":[],\"mappings\":\"AA2TE,mIACC,qBAAA,CAGD,6HACC,oBAAA,CAEA,gBAAA,CAKD,4EACC,iBAAA,CAMD,0FACC,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,4GACC,UAAA,CACA,WAAA,CACA,oBAAA,CAQF,sFACC,2BAAA,CACA,WAAA,CACA,6BAAA,CACA,gBAAA,CAIF,0DAEC,aAAA,CACA,gEACC,UAAA,CAMH,8DACC,OAAA,CACA,UAAA,CAIA,+CACC,2CAAA,CAKA,gDACC,cAAA,CAED,gDACC,cAAA\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n.app-sidebar::v-deep {\\n\\t&:not(.app-sidebar--without-background) {\\n\\t\\t// with full screenshot, let's fill the figure\\n\\t\\t:not(.app-sidebar-header--compact) .app-sidebar-header__figure {\\n\\t\\t\\tbackground-size: cover;\\n\\t\\t}\\n\\t\\t// revert sidebar app icon so it is black\\n\\t\\t.app-sidebar-header--compact .app-sidebar-header__figure {\\n\\t\\t\\tbackground-size: 32px;\\n\\n\\t\\t\\tfilter: invert(1);\\n\\t\\t}\\n\\t}\\n\\n\\t.app-sidebar-header__description {\\n\\t\\t.app-version {\\n\\t\\t\\tpadding-left: 10px;\\n\\t\\t}\\n\\t}\\n\\n\\t// default icon slot styling\\n\\t&.app-sidebar--without-background {\\n\\t\\t.app-sidebar-header__figure {\\n\\t\\t\\tdisplay: flex;\\n\\t\\t\\talign-items: center;\\n\\t\\t\\tjustify-content: center;\\n\\t\\t\\t&--default-app-icon {\\n\\t\\t\\t\\twidth: 32px;\\n\\t\\t\\t\\theight: 32px;\\n\\t\\t\\t\\tbackground-size: 32px;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t// TODO: migrate to components\\n\\t.app-sidebar-header__desc {\\n\\t\\t// allow multi line subtitle for the license\\n\\t\\t.app-sidebar-header__subtitle {\\n\\t\\t\\toverflow: visible !important;\\n\\t\\t\\theight: auto;\\n\\t\\t\\twhite-space: normal !important;\\n\\t\\t\\tline-height: 16px;\\n\\t\\t}\\n\\t}\\n\\n\\t.app-sidebar-header__action {\\n\\t\\t// align with tab content\\n\\t\\tmargin: 0 20px;\\n\\t\\tinput {\\n\\t\\t\\tmargin: 3px;\\n\\t\\t}\\n\\t}\\n}\\n\\n// Align the appNavigation toggle with the apps header toolbar\\n.app-navigation::v-deep button.app-navigation-toggle {\\n\\ttop: 8px;\\n\\tright: -8px;\\n}\\n\\n.app-sidebar-tabs__release {\\n\\th2 {\\n\\t\\tborder-bottom: 1px solid var(--color-border);\\n\\t}\\n\\n\\t// Overwrite changelog heading styles\\n\\t::v-deep {\\n\\t\\th3 {\\n\\t\\t\\tfont-size: 20px;\\n\\t\\t}\\n\\t\\th4 {\\n\\t\\t\\tfont-size: 17px;\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\n.force[data-v-06bcd5b6] {\\n\\tbackground: var(--color-main-background);\\n\\tborder-color: var(--color-error);\\n\\tcolor: var(--color-error);\\n}\\n.force[data-v-06bcd5b6]:hover,\\n.force[data-v-06bcd5b6]:active {\\n\\tbackground: var(--color-error);\\n\\tborder-color: var(--color-error) !important;\\n\\tcolor: var(--color-main-background);\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/AppList/AppItem.vue\"],\"names\":[],\"mappings\":\";AAmLA;CACA,wCAAA;CACA,gCAAA;CACA,yBAAA;AACA;AACA;;CAEA,8BAAA;CACA,2CAAA;CACA,mCAAA;AACA\",\"sourcesContent\":[\"<!--\\n - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\\n -\\n - @author Julius Härtl <jus@bitgrid.net>\\n -\\n - @license GNU AGPL version 3 or any later version\\n -\\n - This program is free software: you can redistribute it and/or modify\\n - it under the terms of the GNU Affero General Public License as\\n - published by the Free Software Foundation, either version 3 of the\\n - License, or (at your option) any later version.\\n -\\n - This program is distributed in the hope that it will be useful,\\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\n - GNU Affero General Public License for more details.\\n -\\n - You should have received a copy of the GNU Affero General Public License\\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\\n -\\n -->\\n\\n<template>\\n\\t<div class=\\\"section\\\" :class=\\\"{ selected: isSelected }\\\" @click=\\\"showAppDetails\\\">\\n\\t\\t<div class=\\\"app-image app-image-icon\\\" @click=\\\"showAppDetails\\\">\\n\\t\\t\\t<div v-if=\\\"(listView && !app.preview) || (!listView && !screenshotLoaded)\\\" class=\\\"icon-settings-dark\\\" />\\n\\n\\t\\t\\t<svg v-else-if=\\\"listView && app.preview\\\"\\n\\t\\t\\t\\twidth=\\\"32\\\"\\n\\t\\t\\t\\theight=\\\"32\\\"\\n\\t\\t\\t\\tviewBox=\\\"0 0 32 32\\\">\\n\\t\\t\\t\\t<defs><filter :id=\\\"filterId\\\"><feColorMatrix in=\\\"SourceGraphic\\\" type=\\\"matrix\\\" values=\\\"-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0\\\" /></filter></defs>\\n\\t\\t\\t\\t<image x=\\\"0\\\"\\n\\t\\t\\t\\t\\ty=\\\"0\\\"\\n\\t\\t\\t\\t\\twidth=\\\"32\\\"\\n\\t\\t\\t\\t\\theight=\\\"32\\\"\\n\\t\\t\\t\\t\\tpreserveAspectRatio=\\\"xMinYMin meet\\\"\\n\\t\\t\\t\\t\\t:filter=\\\"filterUrl\\\"\\n\\t\\t\\t\\t\\t:xlink:href=\\\"app.preview\\\"\\n\\t\\t\\t\\t\\tclass=\\\"app-icon\\\" />\\n\\t\\t\\t</svg>\\n\\n\\t\\t\\t<img v-if=\\\"!listView && app.screenshot && screenshotLoaded\\\" :src=\\\"app.screenshot\\\" width=\\\"100%\\\">\\n\\t\\t</div>\\n\\t\\t<div class=\\\"app-name\\\" @click=\\\"showAppDetails\\\">\\n\\t\\t\\t{{ app.name }}\\n\\t\\t</div>\\n\\t\\t<div v-if=\\\"!listView\\\" class=\\\"app-summary\\\">\\n\\t\\t\\t{{ app.summary }}\\n\\t\\t</div>\\n\\t\\t<div v-if=\\\"listView\\\" class=\\\"app-version\\\">\\n\\t\\t\\t<span v-if=\\\"app.version\\\">{{ app.version }}</span>\\n\\t\\t\\t<span v-else-if=\\\"app.appstoreData.releases[0].version\\\">{{ app.appstoreData.releases[0].version }}</span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"app-level\\\">\\n\\t\\t\\t<span v-if=\\\"app.level === 300\\\"\\n\\t\\t\\t\\tv-tooltip.auto=\\\"t('settings', 'This app is supported via your current Nextcloud subscription.')\\\"\\n\\t\\t\\t\\tclass=\\\"supported icon-checkmark-color\\\">\\n\\t\\t\\t\\t{{ t('settings', 'Supported') }}</span>\\n\\t\\t\\t<span v-if=\\\"app.level === 200\\\"\\n\\t\\t\\t\\tv-tooltip.auto=\\\"t('settings', 'Featured apps are developed by and within the community. They offer central functionality and are ready for production use.')\\\"\\n\\t\\t\\t\\tclass=\\\"official icon-checkmark\\\">\\n\\t\\t\\t\\t{{ t('settings', 'Featured') }}</span>\\n\\t\\t\\t<AppScore v-if=\\\"hasRating && !listView\\\" :score=\\\"app.score\\\" />\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"actions\\\">\\n\\t\\t\\t<div v-if=\\\"app.error\\\" class=\\\"warning\\\">\\n\\t\\t\\t\\t{{ app.error }}\\n\\t\\t\\t</div>\\n\\t\\t\\t<div v-if=\\\"isLoading\\\" class=\\\"icon icon-loading-small\\\" />\\n\\t\\t\\t<input v-if=\\\"app.update\\\"\\n\\t\\t\\t\\tclass=\\\"update primary\\\"\\n\\t\\t\\t\\ttype=\\\"button\\\"\\n\\t\\t\\t\\t:value=\\\"t('settings', 'Update to {update}', {update:app.update})\\\"\\n\\t\\t\\t\\t:disabled=\\\"installing || isLoading\\\"\\n\\t\\t\\t\\t@click.stop=\\\"update(app.id)\\\">\\n\\t\\t\\t<input v-if=\\\"app.canUnInstall\\\"\\n\\t\\t\\t\\tclass=\\\"uninstall\\\"\\n\\t\\t\\t\\ttype=\\\"button\\\"\\n\\t\\t\\t\\t:value=\\\"t('settings', 'Remove')\\\"\\n\\t\\t\\t\\t:disabled=\\\"installing || isLoading\\\"\\n\\t\\t\\t\\t@click.stop=\\\"remove(app.id)\\\">\\n\\t\\t\\t<input v-if=\\\"app.active\\\"\\n\\t\\t\\t\\tclass=\\\"enable\\\"\\n\\t\\t\\t\\ttype=\\\"button\\\"\\n\\t\\t\\t\\t:value=\\\"t('settings','Disable')\\\"\\n\\t\\t\\t\\t:disabled=\\\"installing || isLoading\\\"\\n\\t\\t\\t\\t@click.stop=\\\"disable(app.id)\\\">\\n\\t\\t\\t<input v-if=\\\"!app.active && (app.canInstall || app.isCompatible)\\\"\\n\\t\\t\\t\\tv-tooltip.auto=\\\"enableButtonTooltip\\\"\\n\\t\\t\\t\\tclass=\\\"enable\\\"\\n\\t\\t\\t\\ttype=\\\"button\\\"\\n\\t\\t\\t\\t:value=\\\"enableButtonText\\\"\\n\\t\\t\\t\\t:disabled=\\\"!app.canInstall || installing || isLoading\\\"\\n\\t\\t\\t\\t@click.stop=\\\"enable(app.id)\\\">\\n\\t\\t\\t<input v-else-if=\\\"!app.active\\\"\\n\\t\\t\\t\\tv-tooltip.auto=\\\"forceEnableButtonTooltip\\\"\\n\\t\\t\\t\\tclass=\\\"enable force\\\"\\n\\t\\t\\t\\ttype=\\\"button\\\"\\n\\t\\t\\t\\t:value=\\\"forceEnableButtonText\\\"\\n\\t\\t\\t\\t:disabled=\\\"installing || isLoading\\\"\\n\\t\\t\\t\\t@click.stop=\\\"forceEnable(app.id)\\\">\\n\\t\\t</div>\\n\\t</div>\\n</template>\\n\\n<script>\\nimport AppScore from './AppScore'\\nimport AppManagement from '../../mixins/AppManagement'\\nimport SvgFilterMixin from '../SvgFilterMixin'\\n\\nexport default {\\n\\tname: 'AppItem',\\n\\tcomponents: {\\n\\t\\tAppScore,\\n\\t},\\n\\tmixins: [AppManagement, SvgFilterMixin],\\n\\tprops: {\\n\\t\\tapp: {},\\n\\t\\tcategory: {},\\n\\t\\tlistView: {\\n\\t\\t\\ttype: Boolean,\\n\\t\\t\\tdefault: true,\\n\\t\\t},\\n\\t},\\n\\tdata() {\\n\\t\\treturn {\\n\\t\\t\\tisSelected: false,\\n\\t\\t\\tscrolled: false,\\n\\t\\t\\tscreenshotLoaded: false,\\n\\t\\t}\\n\\t},\\n\\tcomputed: {\\n\\t\\thasRating() {\\n\\t\\t\\treturn this.app.appstoreData && this.app.appstoreData.ratingNumOverall > 5\\n\\t\\t},\\n\\t},\\n\\twatch: {\\n\\t\\t'$route.params.id'(id) {\\n\\t\\t\\tthis.isSelected = (this.app.id === id)\\n\\t\\t},\\n\\t},\\n\\tmounted() {\\n\\t\\tthis.isSelected = (this.app.id === this.$route.params.id)\\n\\t\\tif (this.app.releases && this.app.screenshot) {\\n\\t\\t\\tconst image = new Image()\\n\\t\\t\\timage.onload = (e) => {\\n\\t\\t\\t\\tthis.screenshotLoaded = true\\n\\t\\t\\t}\\n\\t\\t\\timage.src = this.app.screenshot\\n\\t\\t}\\n\\t},\\n\\twatchers: {\\n\\n\\t},\\n\\tmethods: {\\n\\t\\tasync showAppDetails(event) {\\n\\t\\t\\tif (event.currentTarget.tagName === 'INPUT' || event.currentTarget.tagName === 'A') {\\n\\t\\t\\t\\treturn\\n\\t\\t\\t}\\n\\t\\t\\ttry {\\n\\t\\t\\t\\tawait this.$router.push({\\n\\t\\t\\t\\t\\tname: 'apps-details',\\n\\t\\t\\t\\t\\tparams: { category: this.category, id: this.app.id },\\n\\t\\t\\t\\t})\\n\\t\\t\\t} catch (e) {\\n\\t\\t\\t\\t// we already view this app\\n\\t\\t\\t}\\n\\t\\t},\\n\\t\\tprefix(prefix, content) {\\n\\t\\t\\treturn prefix + '_' + content\\n\\t\\t},\\n\\t},\\n}\\n</script>\\n\\n<style scoped>\\n\\t.force {\\n\\t\\tbackground: var(--color-main-background);\\n\\t\\tborder-color: var(--color-error);\\n\\t\\tcolor: var(--color-error);\\n\\t}\\n\\t.force:hover,\\n\\t.force:active {\\n\\t\\tbackground: var(--color-error);\\n\\t\\tborder-color: var(--color-error) !important;\\n\\t\\tcolor: var(--color-main-background);\\n\\t}\\n</style>\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Content',{class:{ 'with-app-sidebar': _vm.app},attrs:{\"app-name\":\"settings\",\"content-class\":{ 'icon-loading': _vm.loadingList },\"navigation-class\":{ 'icon-loading': _vm.loading }}},[_c('AppNavigation',{scopedSlots:_vm._u([{key:\"list\",fn:function(){return [_c('AppNavigationItem',{attrs:{\"id\":\"app-category-your-apps\",\"to\":{ name: 'apps' },\"exact\":true,\"icon\":\"icon-category-installed\",\"title\":_vm.t('settings', 'Your apps')}}),_vm._v(\" \"),_c('AppNavigationItem',{attrs:{\"id\":\"app-category-enabled\",\"to\":{ name: 'apps-category', params: { category: 'enabled' } },\"icon\":\"icon-category-enabled\",\"title\":_vm.t('settings', 'Active apps')}}),_vm._v(\" \"),_c('AppNavigationItem',{attrs:{\"id\":\"app-category-disabled\",\"to\":{ name: 'apps-category', params: { category: 'disabled' } },\"icon\":\"icon-category-disabled\",\"title\":_vm.t('settings', 'Disabled apps')}}),_vm._v(\" \"),(_vm.updateCount > 0)?_c('AppNavigationItem',{attrs:{\"id\":\"app-category-updates\",\"to\":{ name: 'apps-category', params: { category: 'updates' } },\"icon\":\"icon-download\",\"title\":_vm.t('settings', 'Updates')}},[_c('AppNavigationCounter',{attrs:{\"slot\":\"counter\"},slot:\"counter\"},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.updateCount)+\"\\n\\t\\t\\t\\t\")])],1):_vm._e(),_vm._v(\" \"),_c('AppNavigationItem',{attrs:{\"id\":\"app-category-your-bundles\",\"to\":{ name: 'apps-category', params: { category: 'app-bundles' } },\"icon\":\"icon-category-app-bundles\",\"title\":_vm.t('settings', 'App bundles')}}),_vm._v(\" \"),_c('AppNavigationSpacer'),_vm._v(\" \"),(_vm.settings.appstoreEnabled)?[_c('AppNavigationItem',{attrs:{\"id\":\"app-category-featured\",\"to\":{ name: 'apps-category', params: { category: 'featured' } },\"icon\":\"icon-favorite\",\"title\":_vm.t('settings', 'Featured apps')}}),_vm._v(\" \"),_vm._l((_vm.categories),function(cat){return _c('AppNavigationItem',{key:'icon-category-' + cat.ident,attrs:{\"icon\":'icon-category-' + cat.ident,\"to\":{\n\t\t\t\t\t\tname: 'apps-category',\n\t\t\t\t\t\tparams: { category: cat.ident },\n\t\t\t\t\t},\"title\":cat.displayName}})})]:_vm._e(),_vm._v(\" \"),_c('AppNavigationItem',{attrs:{\"id\":\"app-developer-docs\",\"title\":_vm.t('settings', 'Developer documentation') + ' ↗'},on:{\"click\":_vm.openDeveloperDocumentation}})]},proxy:true}])}),_vm._v(\" \"),_c('AppContent',{staticClass:\"app-settings-content\",class:{ 'icon-loading': _vm.loadingList }},[_c('AppList',{attrs:{\"category\":_vm.category,\"app\":_vm.app,\"search\":_vm.searchQuery}})],1),_vm._v(\" \"),(_vm.id && _vm.app)?_c('AppSidebar',_vm._b({class:{'app-sidebar--without-background': !_vm.appSidebar.background},on:{\"close\":_vm.hideAppDetails},scopedSlots:_vm._u([(!_vm.appSidebar.background)?{key:\"header\",fn:function(){return [_c('div',{staticClass:\"app-sidebar-header__figure--default-app-icon icon-settings-dark\"})]},proxy:true}:null,{key:\"description\",fn:function(){return [(_vm.app.level === 300 || _vm.app.level === 200 || _vm.hasRating)?_c('div',{staticClass:\"app-level\"},[(_vm.app.level === 300)?_c('span',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.t('settings', 'This app is supported via your current Nextcloud subscription.')),expression:\"t('settings', 'This app is supported via your current Nextcloud subscription.')\",modifiers:{\"auto\":true}}],staticClass:\"supported icon-checkmark-color\"},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Supported')))]):_vm._e(),_vm._v(\" \"),(_vm.app.level === 200)?_c('span',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.t('settings', 'Featured apps are developed by and within the community. They offer central functionality and are ready for production use.')),expression:\"t('settings', 'Featured apps are developed by and within the community. They offer central functionality and are ready for production use.')\",modifiers:{\"auto\":true}}],staticClass:\"official icon-checkmark\"},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Featured')))]):_vm._e(),_vm._v(\" \"),(_vm.hasRating)?_c('AppScore',{attrs:{\"score\":_vm.app.appstoreData.ratingOverall}}):_vm._e()],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"app-version\"},[_c('p',[_vm._v(_vm._s(_vm.app.version))])])]},proxy:true}],null,true)},'AppSidebar',_vm.appSidebar,false),[_vm._v(\" \"),_vm._v(\" \"),_c('AppSidebarTab',{attrs:{\"id\":\"desc\",\"icon\":\"icon-category-office\",\"name\":_vm.t('settings', 'Details'),\"order\":0}},[_c('AppDetails',{attrs:{\"app\":_vm.app}})],1),_vm._v(\" \"),(_vm.app.appstoreData && _vm.app.releases[0].translations.en.changelog)?_c('AppSidebarTab',{attrs:{\"id\":\"desca\",\"icon\":\"icon-category-organization\",\"name\":_vm.t('settings', 'Changelog'),\"order\":1}},_vm._l((_vm.app.releases),function(release){return _c('div',{key:release.version,staticClass:\"app-sidebar-tabs__release\"},[_c('h2',[_vm._v(_vm._s(release.version))]),_vm._v(\" \"),(_vm.changelog(release))?_c('Markdown',{attrs:{\"text\":_vm.changelog(release)}}):_vm._e()],1)}),0):_vm._e()],1):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppScore.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppScore.vue?vue&type=script&lang=js&\"","<!--\n - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<img :src=\"scoreImage\" class=\"app-score-image\">\n</template>\n<script>\nimport { imagePath } from '@nextcloud/router'\n\nexport default {\n\tname: 'AppScore',\n\tprops: ['score'],\n\tcomputed: {\n\t\tscoreImage() {\n\t\t\tconst score = Math.round(this.score * 10)\n\t\t\tconst imageName = 'rating/s' + score + '.svg'\n\t\t\treturn imagePath('core', imageName)\n\t\t},\n\t},\n}\n</script>\n","import { render, staticRenderFns } from \"./AppScore.vue?vue&type=template&id=3b3081d1&\"\nimport script from \"./AppScore.vue?vue&type=script&lang=js&\"\nexport * from \"./AppScore.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('img',{staticClass:\"app-score-image\",attrs:{\"src\":_vm.scoreImage}})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import axios from '@nextcloud/axios'\nimport { generateOcsUrl } from '@nextcloud/router'\n\nexport default () => {\n\treturn axios.get(generateOcsUrl('core/navigation', 2) + '/apps?format=json')\n\t\t.then(({ data }) => {\n\t\t\tif (data.ocs.meta.statuscode !== 200) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst addedApps = {}\n\t\t\tconst navEntries = data.ocs.data\n\t\t\tconst container = document.querySelector('#navigation #apps ul')\n\n\t\t\t// remove disabled apps\n\t\t\tnavEntries.forEach((entry) => {\n\t\t\t\tif (!container.querySelector('li[data-id=\"' + entry.id + '\"]')) {\n\t\t\t\t\taddedApps[entry.id] = true\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tcontainer.querySelectorAll('li[data-id]').forEach((el, index) => {\n\t\t\t\tconst id = el.dataset.id\n\t\t\t\t// remove all apps that are not in the correct order\n\t\t\t\tif (!navEntries[index] || (navEntries[index] && navEntries[index].id !== id)) {\n\t\t\t\t\tel.remove()\n\t\t\t\t\tdocument.querySelector(`#appmenu li[data-id=${id}]`).remove()\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tlet previousEntry = {}\n\t\t\t// add enabled apps to #navigation and #appmenu\n\t\t\tnavEntries.forEach((entry) => {\n\t\t\t\tif (container.querySelector(`li[data-id=\"${entry.id}\"]`) === null) {\n\t\t\t\t\tconst li = document.createElement('li')\n\t\t\t\t\tli.dataset.id = entry.id\n\t\t\t\t\tconst img = `<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" alt=\"\">\n\t\t\t\t\t <defs>\n\t\t\t\t\t <filter id=\"invertMenuMore-${entry.id}\"><feColorMatrix in=\"SourceGraphic\" type=\"matrix\" values=\"-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0\"></feColorMatrix></filter>\n\t\t\t\t\t <mask id=\"hole\">\n\t\t\t\t\t <rect width=\"100%\" height=\"100%\" fill=\"white\"></rect>\n\t\t\t\t\t\t<circle r=\"4.5\" cx=\"17\" cy=\"3\" fill=\"black\"></circle>\n\t\t\t\t\t </mask>\n\t\t\t\t\t </defs>\n\t\t\t\t\t <image x=\"0\" y=\"0\" width=\"16\" height=\"16\" filter=\"url(#invertMenuMore-${entry.id})\" preserveAspectRatio=\"xMinYMin meet\" xlink:href=\"${entry.icon}\" class=\"app-icon\" />\n\t\t\t\t\t</svg>`\n\n\t\t\t\t\tconst imgElement = document.createElement('template')\n\t\t\t\t\timgElement.innerHTML = img\n\n\t\t\t\t\tconst a = document.createElement('a')\n\t\t\t\t\ta.setAttribute('href', entry.href)\n\n\t\t\t\t\tconst filename = document.createElement('span')\n\t\t\t\t\tfilename.appendChild(document.createTextNode(entry.name))\n\n\t\t\t\t\tconst loading = document.createElement('div')\n\t\t\t\t\tloading.setAttribute('class', 'unread-counter')\n\t\t\t\t\tloading.style.display = 'none'\n\n\t\t\t\t\t// draw attention to the newly added app entry\n\t\t\t\t\t// by flashing twice the more apps menu\n\t\t\t\t\tif (addedApps[entry.id]) {\n\t\t\t\t\t\ta.classList.add('animated')\n\t\t\t\t\t}\n\n\t\t\t\t\ta.prepend(imgElement.content.firstChild, loading, filename)\n\t\t\t\t\tli.append(a)\n\n\t\t\t\t\t// add app icon to the navigation\n\t\t\t\t\tconst previousElement = document.querySelector(`#navigation li[data-id=${previousEntry.id}]`)\n\t\t\t\t\tif (previousElement) {\n\t\t\t\t\t\tpreviousElement.insertAdjacentElement('afterend', li)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdocument.querySelector('#navigation #apps ul').prepend(li)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (document.getElementById('appmenu').querySelector(`li[data-id=\"${entry.id}\"]`) === null) {\n\t\t\t\t\tconst li = document.createElement('li')\n\t\t\t\t\tli.dataset.id = entry.id\n\t\t\t\t\t// Generating svg embedded image (see layout.user.php)\n\t\t\t\t\tlet img\n\t\t\t\t\tif (OCA.Theming && OCA.Theming.inverted) {\n\t\t\t\t\t\timg = `<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" alt=\"\">\n\t\t\t\t\t\t <defs>\n\t\t\t\t\t\t <filter id=\"invert\"><feColorMatrix in=\"SourceGraphic\" type=\"matrix\" values=\"-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0\" /></filter>\n\t\t\t\t\t\t </defs>\n\t\t\t\t\t\t <image x=\"0\" y=\"0\" width=\"20\" height=\"20\" preserveAspectRatio=\"xMinYMin meet\" filter=\"url(#invert)\" xlink:href=\"${entry.icon}\" class=\"app-icon\" />\n\t\t\t\t\t\t</svg>`\n\t\t\t\t\t} else {\n\t\t\t\t\t\timg = `<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" alt=\"\">\n\t\t\t\t\t\t <image x=\"0\" y=\"0\" width=\"20\" height=\"20\" preserveAspectRatio=\"xMinYMin meet\" xlink:href=\"${entry.icon}\" class=\"app-icon\" />\n\t\t\t\t\t\t</svg>`\n\t\t\t\t\t}\n\t\t\t\t\tconst imgElement = document.createElement('template')\n\t\t\t\t\timgElement.innerHTML = img\n\n\t\t\t\t\tconst a = document.createElement('a')\n\t\t\t\t\ta.setAttribute('href', entry.href)\n\n\t\t\t\t\tconst filename = document.createElement('span')\n\t\t\t\t\tfilename.appendChild(document.createTextNode(entry.name))\n\n\t\t\t\t\tconst loading = document.createElement('div')\n\t\t\t\t\tloading.setAttribute('class', 'icon-loading-dark')\n\t\t\t\t\tloading.style.display = 'none'\n\n\t\t\t\t\t// draw attention to the newly added app entry\n\t\t\t\t\t// by flashing twice the more apps menu\n\t\t\t\t\tif (addedApps[entry.id]) {\n\t\t\t\t\t\ta.classList.add('animated')\n\t\t\t\t\t}\n\n\t\t\t\t\ta.prepend(loading, filename, imgElement.content.firstChild)\n\t\t\t\t\tli.append(a)\n\n\t\t\t\t\t// add app icon to the navigation\n\t\t\t\t\tconst previousElement = document.querySelector('#appmenu li[data-id=' + previousEntry.id + ']')\n\t\t\t\t\tif (previousElement) {\n\t\t\t\t\t\tpreviousElement.insertAdjacentElement('afterend', li)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdocument.queryElementById('appmenu').prepend(li)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpreviousEntry = entry\n\t\t\t})\n\t\t\twindow.dispatchEvent(new Event('resize'))\n\t\t})\n}\n","/**\n * @copyright Copyright (c) 2019 Julius Härtl <jus@bitgrid.net>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { showError } from '@nextcloud/dialogs'\nimport rebuildNavigation from '../service/rebuild-navigation.js'\n\nexport default {\n\tcomputed: {\n\t\tappGroups() {\n\t\t\treturn this.app.groups.map(group => { return { id: group, name: group } })\n\t\t},\n\t\tinstalling() {\n\t\t\treturn this.$store.getters.loading('install')\n\t\t},\n\t\tisLoading() {\n\t\t\treturn this.app && this.$store.getters.loading(this.app.id)\n\t\t},\n\t\tenableButtonText() {\n\t\t\tif (this.app.needsDownload) {\n\t\t\t\treturn t('settings', 'Download and enable')\n\t\t\t}\n\t\t\treturn t('settings', 'Enable')\n\t\t},\n\t\tforceEnableButtonText() {\n\t\t\tif (this.app.needsDownload) {\n\t\t\t\treturn t('settings', 'Enable untested app')\n\t\t\t}\n\t\t\treturn t('settings', 'Enable untested app')\n\t\t},\n\t\tenableButtonTooltip() {\n\t\t\tif (this.app.needsDownload) {\n\t\t\t\treturn t('settings', 'The app will be downloaded from the App Store')\n\t\t\t}\n\t\t\treturn false\n\t\t},\n\t\tforceEnableButtonTooltip() {\n\t\t\tconst base = t('settings', 'This app is not marked as compatible with your Nextcloud version. If you continue you will still be able to install the app. Note that the app might not work as expected.')\n\t\t\tif (this.app.needsDownload) {\n\t\t\t\treturn base + ' ' + t('settings', 'The app will be downloaded from the App Store')\n\t\t\t}\n\t\t\treturn base\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tgroupCheckedAppsData: false,\n\t\t}\n\t},\n\n\tmounted() {\n\t\tif (this.app && this.app.groups && this.app.groups.length > 0) {\n\t\t\tthis.groupCheckedAppsData = true\n\t\t}\n\t},\n\n\tmethods: {\n\t\tasyncFindGroup(query) {\n\t\t\treturn this.$store.dispatch('getGroups', { search: query, limit: 5, offset: 0 })\n\t\t},\n\t\tisLimitedToGroups(app) {\n\t\t\tif (this.app.groups.length || this.groupCheckedAppsData) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\treturn false\n\t\t},\n\t\tsetGroupLimit() {\n\t\t\tif (!this.groupCheckedAppsData) {\n\t\t\t\tthis.$store.dispatch('enableApp', { appId: this.app.id, groups: [] })\n\t\t\t}\n\t\t},\n\t\tcanLimitToGroups(app) {\n\t\t\tif ((app.types && app.types.includes('filesystem'))\n\t\t\t\t\t|| app.types.includes('prelogin')\n\t\t\t\t\t|| app.types.includes('authentication')\n\t\t\t\t\t|| app.types.includes('logging')\n\t\t\t\t\t|| app.types.includes('prevent_group_restriction')) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn true\n\t\t},\n\t\taddGroupLimitation(group) {\n\t\t\tconst groups = this.app.groups.concat([]).concat([group.id])\n\t\t\tthis.$store.dispatch('enableApp', { appId: this.app.id, groups })\n\t\t},\n\t\tremoveGroupLimitation(group) {\n\t\t\tconst currentGroups = this.app.groups.concat([])\n\t\t\tconst index = currentGroups.indexOf(group.id)\n\t\t\tif (index > -1) {\n\t\t\t\tcurrentGroups.splice(index, 1)\n\t\t\t}\n\t\t\tthis.$store.dispatch('enableApp', { appId: this.app.id, groups: currentGroups })\n\t\t},\n\t\tforceEnable(appId) {\n\t\t\tthis.$store.dispatch('forceEnableApp', { appId, groups: [] })\n\t\t\t\t.then((response) => { rebuildNavigation() })\n\t\t\t\t.catch((error) => { showError(error) })\n\t\t},\n\t\tenable(appId) {\n\t\t\tthis.$store.dispatch('enableApp', { appId, groups: [] })\n\t\t\t\t.then((response) => { rebuildNavigation() })\n\t\t\t\t.catch((error) => { showError(error) })\n\t\t},\n\t\tdisable(appId) {\n\t\t\tthis.$store.dispatch('disableApp', { appId })\n\t\t\t\t.then((response) => { rebuildNavigation() })\n\t\t\t\t.catch((error) => { showError(error) })\n\t\t},\n\t\tremove(appId) {\n\t\t\tthis.$store.dispatch('uninstallApp', { appId })\n\t\t\t\t.then((response) => { rebuildNavigation() })\n\t\t\t\t.catch((error) => { showError(error) })\n\t\t},\n\t\tinstall(appId) {\n\t\t\tthis.$store.dispatch('enableApp', { appId })\n\t\t\t\t.then((response) => { rebuildNavigation() })\n\t\t\t\t.catch((error) => { showError(error) })\n\t\t},\n\t\tupdate(appId) {\n\t\t\tthis.$store.dispatch('updateApp', { appId })\n\t\t\t\t.then((response) => { rebuildNavigation() })\n\t\t\t\t.catch((error) => { showError(error) })\n\t\t},\n\t},\n}\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SvgFilterMixin.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SvgFilterMixin.vue?vue&type=script&lang=js&\"","<!--\n - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<script>\nexport default {\n\tname: 'SvgFilterMixin',\n\tdata() {\n\t\treturn {\n\t\t\tfilterId: '',\n\t\t}\n\t},\n\tcomputed: {\n\t\tfilterUrl() {\n\t\t\treturn `url(#${this.filterId})`\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.filterId = 'invertIconApps-' + Math.random().toString(36).substring(2)\n\t},\n}\n</script>\n","<!--\n - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<div class=\"section\" :class=\"{ selected: isSelected }\" @click=\"showAppDetails\">\n\t\t<div class=\"app-image app-image-icon\" @click=\"showAppDetails\">\n\t\t\t<div v-if=\"(listView && !app.preview) || (!listView && !screenshotLoaded)\" class=\"icon-settings-dark\" />\n\n\t\t\t<svg v-else-if=\"listView && app.preview\"\n\t\t\t\twidth=\"32\"\n\t\t\t\theight=\"32\"\n\t\t\t\tviewBox=\"0 0 32 32\">\n\t\t\t\t<defs><filter :id=\"filterId\"><feColorMatrix in=\"SourceGraphic\" type=\"matrix\" values=\"-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0\" /></filter></defs>\n\t\t\t\t<image x=\"0\"\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"32\"\n\t\t\t\t\theight=\"32\"\n\t\t\t\t\tpreserveAspectRatio=\"xMinYMin meet\"\n\t\t\t\t\t:filter=\"filterUrl\"\n\t\t\t\t\t:xlink:href=\"app.preview\"\n\t\t\t\t\tclass=\"app-icon\" />\n\t\t\t</svg>\n\n\t\t\t<img v-if=\"!listView && app.screenshot && screenshotLoaded\" :src=\"app.screenshot\" width=\"100%\">\n\t\t</div>\n\t\t<div class=\"app-name\" @click=\"showAppDetails\">\n\t\t\t{{ app.name }}\n\t\t</div>\n\t\t<div v-if=\"!listView\" class=\"app-summary\">\n\t\t\t{{ app.summary }}\n\t\t</div>\n\t\t<div v-if=\"listView\" class=\"app-version\">\n\t\t\t<span v-if=\"app.version\">{{ app.version }}</span>\n\t\t\t<span v-else-if=\"app.appstoreData.releases[0].version\">{{ app.appstoreData.releases[0].version }}</span>\n\t\t</div>\n\n\t\t<div class=\"app-level\">\n\t\t\t<span v-if=\"app.level === 300\"\n\t\t\t\tv-tooltip.auto=\"t('settings', 'This app is supported via your current Nextcloud subscription.')\"\n\t\t\t\tclass=\"supported icon-checkmark-color\">\n\t\t\t\t{{ t('settings', 'Supported') }}</span>\n\t\t\t<span v-if=\"app.level === 200\"\n\t\t\t\tv-tooltip.auto=\"t('settings', 'Featured apps are developed by and within the community. They offer central functionality and are ready for production use.')\"\n\t\t\t\tclass=\"official icon-checkmark\">\n\t\t\t\t{{ t('settings', 'Featured') }}</span>\n\t\t\t<AppScore v-if=\"hasRating && !listView\" :score=\"app.score\" />\n\t\t</div>\n\n\t\t<div class=\"actions\">\n\t\t\t<div v-if=\"app.error\" class=\"warning\">\n\t\t\t\t{{ app.error }}\n\t\t\t</div>\n\t\t\t<div v-if=\"isLoading\" class=\"icon icon-loading-small\" />\n\t\t\t<input v-if=\"app.update\"\n\t\t\t\tclass=\"update primary\"\n\t\t\t\ttype=\"button\"\n\t\t\t\t:value=\"t('settings', 'Update to {update}', {update:app.update})\"\n\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t@click.stop=\"update(app.id)\">\n\t\t\t<input v-if=\"app.canUnInstall\"\n\t\t\t\tclass=\"uninstall\"\n\t\t\t\ttype=\"button\"\n\t\t\t\t:value=\"t('settings', 'Remove')\"\n\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t@click.stop=\"remove(app.id)\">\n\t\t\t<input v-if=\"app.active\"\n\t\t\t\tclass=\"enable\"\n\t\t\t\ttype=\"button\"\n\t\t\t\t:value=\"t('settings','Disable')\"\n\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t@click.stop=\"disable(app.id)\">\n\t\t\t<input v-if=\"!app.active && (app.canInstall || app.isCompatible)\"\n\t\t\t\tv-tooltip.auto=\"enableButtonTooltip\"\n\t\t\t\tclass=\"enable\"\n\t\t\t\ttype=\"button\"\n\t\t\t\t:value=\"enableButtonText\"\n\t\t\t\t:disabled=\"!app.canInstall || installing || isLoading\"\n\t\t\t\t@click.stop=\"enable(app.id)\">\n\t\t\t<input v-else-if=\"!app.active\"\n\t\t\t\tv-tooltip.auto=\"forceEnableButtonTooltip\"\n\t\t\t\tclass=\"enable force\"\n\t\t\t\ttype=\"button\"\n\t\t\t\t:value=\"forceEnableButtonText\"\n\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t@click.stop=\"forceEnable(app.id)\">\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport AppScore from './AppScore'\nimport AppManagement from '../../mixins/AppManagement'\nimport SvgFilterMixin from '../SvgFilterMixin'\n\nexport default {\n\tname: 'AppItem',\n\tcomponents: {\n\t\tAppScore,\n\t},\n\tmixins: [AppManagement, SvgFilterMixin],\n\tprops: {\n\t\tapp: {},\n\t\tcategory: {},\n\t\tlistView: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisSelected: false,\n\t\t\tscrolled: false,\n\t\t\tscreenshotLoaded: false,\n\t\t}\n\t},\n\tcomputed: {\n\t\thasRating() {\n\t\t\treturn this.app.appstoreData && this.app.appstoreData.ratingNumOverall > 5\n\t\t},\n\t},\n\twatch: {\n\t\t'$route.params.id'(id) {\n\t\t\tthis.isSelected = (this.app.id === id)\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.isSelected = (this.app.id === this.$route.params.id)\n\t\tif (this.app.releases && this.app.screenshot) {\n\t\t\tconst image = new Image()\n\t\t\timage.onload = (e) => {\n\t\t\t\tthis.screenshotLoaded = true\n\t\t\t}\n\t\t\timage.src = this.app.screenshot\n\t\t}\n\t},\n\twatchers: {\n\n\t},\n\tmethods: {\n\t\tasync showAppDetails(event) {\n\t\t\tif (event.currentTarget.tagName === 'INPUT' || event.currentTarget.tagName === 'A') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait this.$router.push({\n\t\t\t\t\tname: 'apps-details',\n\t\t\t\t\tparams: { category: this.category, id: this.app.id },\n\t\t\t\t})\n\t\t\t} catch (e) {\n\t\t\t\t// we already view this app\n\t\t\t}\n\t\t},\n\t\tprefix(prefix, content) {\n\t\t\treturn prefix + '_' + content\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n\t.force {\n\t\tbackground: var(--color-main-background);\n\t\tborder-color: var(--color-error);\n\t\tcolor: var(--color-error);\n\t}\n\t.force:hover,\n\t.force:active {\n\t\tbackground: var(--color-error);\n\t\tborder-color: var(--color-error) !important;\n\t\tcolor: var(--color-main-background);\n\t}\n</style>\n","var render, staticRenderFns\nimport script from \"./SvgFilterMixin.vue?vue&type=script&lang=js&\"\nexport * from \"./SvgFilterMixin.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppItem.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppItem.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppItem.vue?vue&type=style&index=0&id=06bcd5b6&scoped=true&lang=css&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppItem.vue?vue&type=style&index=0&id=06bcd5b6&scoped=true&lang=css&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AppItem.vue?vue&type=template&id=06bcd5b6&scoped=true&\"\nimport script from \"./AppItem.vue?vue&type=script&lang=js&\"\nexport * from \"./AppItem.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AppItem.vue?vue&type=style&index=0&id=06bcd5b6&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"06bcd5b6\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"section\",class:{ selected: _vm.isSelected },on:{\"click\":_vm.showAppDetails}},[_c('div',{staticClass:\"app-image app-image-icon\",on:{\"click\":_vm.showAppDetails}},[((_vm.listView && !_vm.app.preview) || (!_vm.listView && !_vm.screenshotLoaded))?_c('div',{staticClass:\"icon-settings-dark\"}):(_vm.listView && _vm.app.preview)?_c('svg',{attrs:{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"0 0 32 32\"}},[_c('defs',[_c('filter',{attrs:{\"id\":_vm.filterId}},[_c('feColorMatrix',{attrs:{\"in\":\"SourceGraphic\",\"type\":\"matrix\",\"values\":\"-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0\"}})],1)]),_vm._v(\" \"),_c('image',{staticClass:\"app-icon\",attrs:{\"x\":\"0\",\"y\":\"0\",\"width\":\"32\",\"height\":\"32\",\"preserveAspectRatio\":\"xMinYMin meet\",\"filter\":_vm.filterUrl,\"xlink:href\":_vm.app.preview}})]):_vm._e(),_vm._v(\" \"),(!_vm.listView && _vm.app.screenshot && _vm.screenshotLoaded)?_c('img',{attrs:{\"src\":_vm.app.screenshot,\"width\":\"100%\"}}):_vm._e()]),_vm._v(\" \"),_c('div',{staticClass:\"app-name\",on:{\"click\":_vm.showAppDetails}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.app.name)+\"\\n\\t\")]),_vm._v(\" \"),(!_vm.listView)?_c('div',{staticClass:\"app-summary\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.app.summary)+\"\\n\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.listView)?_c('div',{staticClass:\"app-version\"},[(_vm.app.version)?_c('span',[_vm._v(_vm._s(_vm.app.version))]):(_vm.app.appstoreData.releases[0].version)?_c('span',[_vm._v(_vm._s(_vm.app.appstoreData.releases[0].version))]):_vm._e()]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"app-level\"},[(_vm.app.level === 300)?_c('span',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.t('settings', 'This app is supported via your current Nextcloud subscription.')),expression:\"t('settings', 'This app is supported via your current Nextcloud subscription.')\",modifiers:{\"auto\":true}}],staticClass:\"supported icon-checkmark-color\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Supported')))]):_vm._e(),_vm._v(\" \"),(_vm.app.level === 200)?_c('span',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.t('settings', 'Featured apps are developed by and within the community. They offer central functionality and are ready for production use.')),expression:\"t('settings', 'Featured apps are developed by and within the community. They offer central functionality and are ready for production use.')\",modifiers:{\"auto\":true}}],staticClass:\"official icon-checkmark\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Featured')))]):_vm._e(),_vm._v(\" \"),(_vm.hasRating && !_vm.listView)?_c('AppScore',{attrs:{\"score\":_vm.app.score}}):_vm._e()],1),_vm._v(\" \"),_c('div',{staticClass:\"actions\"},[(_vm.app.error)?_c('div',{staticClass:\"warning\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.app.error)+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.isLoading)?_c('div',{staticClass:\"icon icon-loading-small\"}):_vm._e(),_vm._v(\" \"),(_vm.app.update)?_c('input',{staticClass:\"update primary\",attrs:{\"type\":\"button\",\"value\":_vm.t('settings', 'Update to {update}', {update:_vm.app.update}),\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){$event.stopPropagation();return _vm.update(_vm.app.id)}}}):_vm._e(),_vm._v(\" \"),(_vm.app.canUnInstall)?_c('input',{staticClass:\"uninstall\",attrs:{\"type\":\"button\",\"value\":_vm.t('settings', 'Remove'),\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){$event.stopPropagation();return _vm.remove(_vm.app.id)}}}):_vm._e(),_vm._v(\" \"),(_vm.app.active)?_c('input',{staticClass:\"enable\",attrs:{\"type\":\"button\",\"value\":_vm.t('settings','Disable'),\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){$event.stopPropagation();return _vm.disable(_vm.app.id)}}}):_vm._e(),_vm._v(\" \"),(!_vm.app.active && (_vm.app.canInstall || _vm.app.isCompatible))?_c('input',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.enableButtonTooltip),expression:\"enableButtonTooltip\",modifiers:{\"auto\":true}}],staticClass:\"enable\",attrs:{\"type\":\"button\",\"value\":_vm.enableButtonText,\"disabled\":!_vm.app.canInstall || _vm.installing || _vm.isLoading},on:{\"click\":function($event){$event.stopPropagation();return _vm.enable(_vm.app.id)}}}):(!_vm.app.active)?_c('input',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.forceEnableButtonTooltip),expression:\"forceEnableButtonTooltip\",modifiers:{\"auto\":true}}],staticClass:\"enable force\",attrs:{\"type\":\"button\",\"value\":_vm.forceEnableButtonText,\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){$event.stopPropagation();return _vm.forceEnable(_vm.app.id)}}}):_vm._e()])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render, staticRenderFns\nimport script from \"./PrefixMixin.vue?vue&type=script&lang=js&\"\nexport * from \"./PrefixMixin.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","<!--\n - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<script>\nexport default {\n\tname: 'PrefixMixin',\n\tmethods: {\n\t\tprefix(prefix, content) {\n\t\t\treturn prefix + '_' + content\n\t\t},\n\t},\n}\n</script>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppList.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppList.vue?vue&type=script&lang=js&\"","<!--\n - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<div id=\"app-content-inner\">\n\t\t<div id=\"apps-list\" class=\"apps-list\" :class=\"{installed: (useBundleView || useListView), store: useAppStoreView}\">\n\t\t\t<template v-if=\"useListView\">\n\t\t\t\t<div v-if=\"showUpdateAll\" class=\"toolbar\">\n\t\t\t\t\t{{ n('settings', '%n app has an update available', '%n apps have an update available', counter) }}\n\t\t\t\t\t<Button v-if=\"showUpdateAll\"\n\t\t\t\t\t\tid=\"app-list-update-all\"\n\t\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t\t@click=\"updateAll\">\n\t\t\t\t\t\t{{ n('settings', 'Update', 'Update all', counter) }}\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\n\t\t\t\t<div v-if=\"!showUpdateAll\" class=\"toolbar\">\n\t\t\t\t\t{{ t('settings', 'All apps are up-to-date.') }}\n\t\t\t\t</div>\n\n\t\t\t\t<transition-group name=\"app-list\" tag=\"div\" class=\"apps-list-container\">\n\t\t\t\t\t<AppItem v-for=\"app in apps\"\n\t\t\t\t\t\t:key=\"app.id\"\n\t\t\t\t\t\t:app=\"app\"\n\t\t\t\t\t\t:category=\"category\" />\n\t\t\t\t</transition-group>\n\t\t\t</template>\n\n\t\t\t<transition-group v-if=\"useBundleView\"\n\t\t\t\tname=\"app-list\"\n\t\t\t\ttag=\"div\"\n\t\t\t\tclass=\"apps-list-container\">\n\t\t\t\t<template v-for=\"bundle in bundles\">\n\t\t\t\t\t<div :key=\"bundle.id\" class=\"apps-header\">\n\t\t\t\t\t\t<div class=\"app-image\" />\n\t\t\t\t\t\t<h2>{{ bundle.name }} <input type=\"button\" :value=\"bundleToggleText(bundle.id)\" @click=\"toggleBundle(bundle.id)\"></h2>\n\t\t\t\t\t\t<div class=\"app-version\" />\n\t\t\t\t\t\t<div class=\"app-level\" />\n\t\t\t\t\t\t<div class=\"app-groups\" />\n\t\t\t\t\t\t<div class=\"actions\">\n\t\t\t\t\t\t\t \n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<AppItem v-for=\"app in bundleApps(bundle.id)\"\n\t\t\t\t\t\t:key=\"bundle.id + app.id\"\n\t\t\t\t\t\t:app=\"app\"\n\t\t\t\t\t\t:category=\"category\" />\n\t\t\t\t</template>\n\t\t\t</transition-group>\n\t\t\t<template v-if=\"useAppStoreView\">\n\t\t\t\t<AppItem v-for=\"app in apps\"\n\t\t\t\t\t:key=\"app.id\"\n\t\t\t\t\t:app=\"app\"\n\t\t\t\t\t:category=\"category\"\n\t\t\t\t\t:list-view=\"false\" />\n\t\t\t</template>\n\t\t</div>\n\n\t\t<div id=\"apps-list-search\" class=\"apps-list installed\">\n\t\t\t<div class=\"apps-list-container\">\n\t\t\t\t<template v-if=\"search !== '' && searchApps.length > 0\">\n\t\t\t\t\t<div class=\"section\">\n\t\t\t\t\t\t<div />\n\t\t\t\t\t\t<td colspan=\"5\">\n\t\t\t\t\t\t\t<h2>{{ t('settings', 'Results from other categories') }}</h2>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t</div>\n\t\t\t\t\t<AppItem v-for=\"app in searchApps\"\n\t\t\t\t\t\t:key=\"app.id\"\n\t\t\t\t\t\t:app=\"app\"\n\t\t\t\t\t\t:category=\"category\"\n\t\t\t\t\t\t:list-view=\"true\" />\n\t\t\t\t</template>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div v-if=\"search !== '' && !loading && searchApps.length === 0 && apps.length === 0\" id=\"apps-list-empty\" class=\"emptycontent emptycontent-search\">\n\t\t\t<div id=\"app-list-empty-icon\" class=\"icon-settings-dark\" />\n\t\t\t<h2>{{ t('settings', 'No apps found for your version') }}</h2>\n\t\t</div>\n\n\t\t<div id=\"searchresults\" />\n\t</div>\n</template>\n\n<script>\nimport AppItem from './AppList/AppItem'\nimport PrefixMixin from './PrefixMixin'\nimport pLimit from 'p-limit'\nimport Button from '@nextcloud/vue/dist/Components/Button'\n\nexport default {\n\tname: 'AppList',\n\tcomponents: {\n\t\tAppItem,\n\t\tButton,\n\t},\n\tmixins: [PrefixMixin],\n\tprops: ['category', 'app', 'search'],\n\tcomputed: {\n\t\tcounter() {\n\t\t\treturn this.apps.filter(app => app.update).length\n\t\t},\n\t\tloading() {\n\t\t\treturn this.$store.getters.loading('list')\n\t\t},\n\t\thasPendingUpdate() {\n\t\t\treturn this.apps.filter(app => app.update).length > 0\n\t\t},\n\t\tshowUpdateAll() {\n\t\t\treturn this.hasPendingUpdate && this.useListView\n\t\t},\n\t\tapps() {\n\t\t\tconst apps = this.$store.getters.getAllApps\n\t\t\t\t.filter(app => app.name.toLowerCase().search(this.search.toLowerCase()) !== -1)\n\t\t\t\t.sort(function(a, b) {\n\t\t\t\t\tconst sortStringA = '' + (a.active ? 0 : 1) + (a.update ? 0 : 1) + a.name\n\t\t\t\t\tconst sortStringB = '' + (b.active ? 0 : 1) + (b.update ? 0 : 1) + b.name\n\t\t\t\t\treturn OC.Util.naturalSortCompare(sortStringA, sortStringB)\n\t\t\t\t})\n\n\t\t\tif (this.category === 'installed') {\n\t\t\t\treturn apps.filter(app => app.installed)\n\t\t\t}\n\t\t\tif (this.category === 'enabled') {\n\t\t\t\treturn apps.filter(app => app.active && app.installed)\n\t\t\t}\n\t\t\tif (this.category === 'disabled') {\n\t\t\t\treturn apps.filter(app => !app.active && app.installed)\n\t\t\t}\n\t\t\tif (this.category === 'app-bundles') {\n\t\t\t\treturn apps.filter(app => app.bundles)\n\t\t\t}\n\t\t\tif (this.category === 'updates') {\n\t\t\t\treturn apps.filter(app => app.update)\n\t\t\t}\n\t\t\tif (this.category === 'featured') {\n\t\t\t\treturn apps.filter(app => app.level === 200)\n\t\t\t}\n\t\t\t// filter app store categories\n\t\t\treturn apps.filter(app => {\n\t\t\t\treturn app.appstore && app.category !== undefined\n\t\t\t\t\t&& (app.category === this.category || app.category.indexOf(this.category) > -1)\n\t\t\t})\n\t\t},\n\t\tbundles() {\n\t\t\treturn this.$store.getters.getServerData.bundles.filter(bundle => this.bundleApps(bundle.id).length > 0)\n\t\t},\n\t\tbundleApps() {\n\t\t\treturn function(bundle) {\n\t\t\t\treturn this.$store.getters.getAllApps\n\t\t\t\t\t.filter(app => {\n\t\t\t\t\t\treturn app.bundleIds !== undefined && app.bundleIds.includes(bundle)\n\t\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\tsearchApps() {\n\t\t\tif (this.search === '') {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn this.$store.getters.getAllApps\n\t\t\t\t.filter(app => {\n\t\t\t\t\tif (app.name.toLowerCase().search(this.search.toLowerCase()) !== -1) {\n\t\t\t\t\t\treturn (!this.apps.find(_app => _app.id === app.id))\n\t\t\t\t\t}\n\t\t\t\t\treturn false\n\t\t\t\t})\n\t\t},\n\t\tuseAppStoreView() {\n\t\t\treturn !this.useListView && !this.useBundleView\n\t\t},\n\t\tuseListView() {\n\t\t\treturn (this.category === 'installed' || this.category === 'enabled' || this.category === 'disabled' || this.category === 'updates' || this.category === 'featured')\n\t\t},\n\t\tuseBundleView() {\n\t\t\treturn (this.category === 'app-bundles')\n\t\t},\n\t\tallBundlesEnabled() {\n\t\t\tconst self = this\n\t\t\treturn function(id) {\n\t\t\t\treturn self.bundleApps(id).filter(app => !app.active).length === 0\n\t\t\t}\n\t\t},\n\t\tbundleToggleText() {\n\t\t\tconst self = this\n\t\t\treturn function(id) {\n\t\t\t\tif (self.allBundlesEnabled(id)) {\n\t\t\t\t\treturn t('settings', 'Disable all')\n\t\t\t\t}\n\t\t\t\treturn t('settings', 'Enable all')\n\t\t\t}\n\t\t},\n\t},\n\tmethods: {\n\t\ttoggleBundle(id) {\n\t\t\tif (this.allBundlesEnabled(id)) {\n\t\t\t\treturn this.disableBundle(id)\n\t\t\t}\n\t\t\treturn this.enableBundle(id)\n\t\t},\n\t\tenableBundle(id) {\n\t\t\tconst apps = this.bundleApps(id).map(app => app.id)\n\t\t\tthis.$store.dispatch('enableApp', { appId: apps, groups: [] })\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error(error)\n\t\t\t\t\tOC.Notification.show(error)\n\t\t\t\t})\n\t\t},\n\t\tdisableBundle(id) {\n\t\t\tconst apps = this.bundleApps(id).map(app => app.id)\n\t\t\tthis.$store.dispatch('disableApp', { appId: apps, groups: [] })\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tOC.Notification.show(error)\n\t\t\t\t})\n\t\t},\n\t\tupdateAll() {\n\t\t\tconst limit = pLimit(1)\n\t\t\tthis.apps\n\t\t\t\t.filter(app => app.update)\n\t\t\t\t.map(app => limit(() => this.$store.dispatch('updateApp', { appId: app.id }))\n\t\t\t\t)\n\t\t},\n\t},\n}\n</script>\n","import { render, staticRenderFns } from \"./AppList.vue?vue&type=template&id=35e8fed4&\"\nimport script from \"./AppList.vue?vue&type=script&lang=js&\"\nexport * from \"./AppList.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app-content-inner\"}},[_c('div',{staticClass:\"apps-list\",class:{installed: (_vm.useBundleView || _vm.useListView), store: _vm.useAppStoreView},attrs:{\"id\":\"apps-list\"}},[(_vm.useListView)?[(_vm.showUpdateAll)?_c('div',{staticClass:\"toolbar\"},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.n('settings', '%n app has an update available', '%n apps have an update available', _vm.counter))+\"\\n\\t\\t\\t\\t\"),(_vm.showUpdateAll)?_c('Button',{attrs:{\"id\":\"app-list-update-all\",\"type\":\"primary\"},on:{\"click\":_vm.updateAll}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.n('settings', 'Update', 'Update all', _vm.counter))+\"\\n\\t\\t\\t\\t\")]):_vm._e()],1):_vm._e(),_vm._v(\" \"),(!_vm.showUpdateAll)?_c('div',{staticClass:\"toolbar\"},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'All apps are up-to-date.'))+\"\\n\\t\\t\\t\")]):_vm._e(),_vm._v(\" \"),_c('transition-group',{staticClass:\"apps-list-container\",attrs:{\"name\":\"app-list\",\"tag\":\"div\"}},_vm._l((_vm.apps),function(app){return _c('AppItem',{key:app.id,attrs:{\"app\":app,\"category\":_vm.category}})}),1)]:_vm._e(),_vm._v(\" \"),(_vm.useBundleView)?_c('transition-group',{staticClass:\"apps-list-container\",attrs:{\"name\":\"app-list\",\"tag\":\"div\"}},[_vm._l((_vm.bundles),function(bundle){return [_c('div',{key:bundle.id,staticClass:\"apps-header\"},[_c('div',{staticClass:\"app-image\"}),_vm._v(\" \"),_c('h2',[_vm._v(_vm._s(bundle.name)+\" \"),_c('input',{attrs:{\"type\":\"button\",\"value\":_vm.bundleToggleText(bundle.id)},on:{\"click\":function($event){return _vm.toggleBundle(bundle.id)}}})]),_vm._v(\" \"),_c('div',{staticClass:\"app-version\"}),_vm._v(\" \"),_c('div',{staticClass:\"app-level\"}),_vm._v(\" \"),_c('div',{staticClass:\"app-groups\"}),_vm._v(\" \"),_c('div',{staticClass:\"actions\"},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t \\n\\t\\t\\t\\t\\t\")])]),_vm._v(\" \"),_vm._l((_vm.bundleApps(bundle.id)),function(app){return _c('AppItem',{key:bundle.id + app.id,attrs:{\"app\":app,\"category\":_vm.category}})})]})],2):_vm._e(),_vm._v(\" \"),(_vm.useAppStoreView)?_vm._l((_vm.apps),function(app){return _c('AppItem',{key:app.id,attrs:{\"app\":app,\"category\":_vm.category,\"list-view\":false}})}):_vm._e()],2),_vm._v(\" \"),_c('div',{staticClass:\"apps-list installed\",attrs:{\"id\":\"apps-list-search\"}},[_c('div',{staticClass:\"apps-list-container\"},[(_vm.search !== '' && _vm.searchApps.length > 0)?[_c('div',{staticClass:\"section\"},[_c('div'),_vm._v(\" \"),_c('td',{attrs:{\"colspan\":\"5\"}},[_c('h2',[_vm._v(_vm._s(_vm.t('settings', 'Results from other categories')))])])]),_vm._v(\" \"),_vm._l((_vm.searchApps),function(app){return _c('AppItem',{key:app.id,attrs:{\"app\":app,\"category\":_vm.category,\"list-view\":true}})})]:_vm._e()],2)]),_vm._v(\" \"),(_vm.search !== '' && !_vm.loading && _vm.searchApps.length === 0 && _vm.apps.length === 0)?_c('div',{staticClass:\"emptycontent emptycontent-search\",attrs:{\"id\":\"apps-list-empty\"}},[_c('div',{staticClass:\"icon-settings-dark\",attrs:{\"id\":\"app-list-empty-icon\"}}),_vm._v(\" \"),_c('h2',[_vm._v(_vm._s(_vm.t('settings', 'No apps found for your version')))])]):_vm._e(),_vm._v(\" \"),_c('div',{attrs:{\"id\":\"searchresults\"}})])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Markdown.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Markdown.vue?vue&type=script&lang=js&\"","<!--\n - @copyright Copyright (c) 2020 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<div class=\"settings-markdown\" v-html=\"renderMarkdown\" />\n</template>\n\n<script>\nimport { marked } from 'marked'\nimport dompurify from 'dompurify'\n\nexport default {\n\tname: 'Markdown',\n\tprops: {\n\t\ttext: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t},\n\tcomputed: {\n\t\trenderMarkdown() {\n\t\t\tconst renderer = new marked.Renderer()\n\t\t\trenderer.link = function(href, title, text) {\n\t\t\t\tlet prot\n\t\t\t\ttry {\n\t\t\t\t\tprot = decodeURIComponent(unescape(href))\n\t\t\t\t\t\t.replace(/[^\\w:]/g, '')\n\t\t\t\t\t\t.toLowerCase()\n\t\t\t\t} catch (e) {\n\t\t\t\t\treturn ''\n\t\t\t\t}\n\n\t\t\t\tif (prot.indexOf('http:') !== 0 && prot.indexOf('https:') !== 0) {\n\t\t\t\t\treturn ''\n\t\t\t\t}\n\n\t\t\t\tlet out = '<a href=\"' + href + '\" rel=\"noreferrer noopener\"'\n\t\t\t\tif (title) {\n\t\t\t\t\tout += ' title=\"' + title + '\"'\n\t\t\t\t}\n\t\t\t\tout += '>' + text + '</a>'\n\t\t\t\treturn out\n\t\t\t}\n\t\t\trenderer.image = function(href, title, text) {\n\t\t\t\tif (text) {\n\t\t\t\t\treturn text\n\t\t\t\t}\n\t\t\t\treturn title\n\t\t\t}\n\t\t\trenderer.blockquote = function(quote) {\n\t\t\t\treturn quote\n\t\t\t}\n\t\t\treturn dompurify.sanitize(\n\t\t\t\tmarked(this.text.trim(), {\n\t\t\t\t\trenderer,\n\t\t\t\t\tgfm: false,\n\t\t\t\t\thighlight: false,\n\t\t\t\t\ttables: false,\n\t\t\t\t\tbreaks: false,\n\t\t\t\t\tpedantic: false,\n\t\t\t\t\tsanitize: true,\n\t\t\t\t\tsmartLists: true,\n\t\t\t\t\tsmartypants: false,\n\t\t\t\t}),\n\t\t\t\t{\n\t\t\t\t\tSAFE_FOR_JQUERY: true,\n\t\t\t\t\tALLOWED_TAGS: [\n\t\t\t\t\t\t'h1',\n\t\t\t\t\t\t'h2',\n\t\t\t\t\t\t'h3',\n\t\t\t\t\t\t'h4',\n\t\t\t\t\t\t'h5',\n\t\t\t\t\t\t'h6',\n\t\t\t\t\t\t'strong',\n\t\t\t\t\t\t'p',\n\t\t\t\t\t\t'a',\n\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t'ol',\n\t\t\t\t\t\t'li',\n\t\t\t\t\t\t'em',\n\t\t\t\t\t\t'del',\n\t\t\t\t\t\t'blockquote',\n\t\t\t\t\t],\n\t\t\t\t}\n\t\t\t)\n\t\t},\n\t},\n}\n</script>\n\n<style scoped lang=\"scss\">\n\t.settings-markdown::v-deep {\n\n\th1,\n\th2,\n\th3,\n\th4,\n\th5,\n\th6 {\n\t\tfont-weight: 600;\n\t\tline-height: 120%;\n\t\tmargin-top: 24px;\n\t\tmargin-bottom: 12px;\n\t\tcolor: var(--color-main-text);\n\t}\n\n\th1 {\n\t\tfont-size: 36px;\n\t\tmargin-top: 48px;\n\t}\n\n\th2 {\n\t\tfont-size: 28px;\n\t\tmargin-top: 48px;\n\t}\n\n\th3 {\n\t\tfont-size: 24px;\n\t}\n\n\th4 {\n\t\tfont-size: 21px;\n\t}\n\n\th5 {\n\t\tfont-size: 17px;\n\t}\n\n\th6 {\n\t\tfont-size: var(--default-font-size);\n\t}\n\n\tpre {\n\t\twhite-space: pre;\n\t\toverflow-x: auto;\n\t\tbackground-color: var(--color-background-dark);\n\t\tborder-radius: var(--border-radius);\n\t\tpadding: 1em 1.3em;\n\t\tmargin-bottom: 1em;\n\t}\n\n\tp code {\n\t\tbackground-color: var(--color-background-dark);\n\t\tborder-radius: var(--border-radius);\n\t\tpadding: .1em .3em;\n\t}\n\n\tli {\n\t\tposition: relative;\n\t}\n\n\tul, ol {\n\t\tpadding-left: 10px;\n\t\tmargin-left: 10px;\n\t}\n\n\tul li {\n\t\tlist-style-type: disc;\n\t}\n\n\tul > li > ul > li {\n\t\tlist-style-type: circle;\n\t}\n\n\tul > li > ul > li ul li {\n\t\tlist-style-type: square;\n\t}\n\n\tblockquote {\n\t\tpadding-left: 1em;\n\t\tborder-left: 4px solid var(--color-primary-element);\n\t\tcolor: var(--color-text-maxcontrast);\n\t\tmargin-left: 0;\n\t\tmargin-right: 0;\n\t}\n\n\t}\n</style>\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Markdown.vue?vue&type=style&index=0&id=652eb552&scoped=true&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Markdown.vue?vue&type=style&index=0&id=652eb552&scoped=true&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./Markdown.vue?vue&type=template&id=652eb552&scoped=true&\"\nimport script from \"./Markdown.vue?vue&type=script&lang=js&\"\nexport * from \"./Markdown.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Markdown.vue?vue&type=style&index=0&id=652eb552&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"652eb552\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"settings-markdown\",domProps:{\"innerHTML\":_vm._s(_vm.renderMarkdown)}})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppDetails.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppDetails.vue?vue&type=script&lang=js&\"","<!--\n - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<div class=\"app-details\">\n\t\t<div class=\"app-details__actions\">\n\t\t\t<div v-if=\"app.active && canLimitToGroups(app)\" class=\"app-details__actions-groups\">\n\t\t\t\t<input :id=\"prefix('groups_enable', app.id)\"\n\t\t\t\t\tv-model=\"groupCheckedAppsData\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t:value=\"app.id\"\n\t\t\t\t\tclass=\"groups-enable__checkbox checkbox\"\n\t\t\t\t\t@change=\"setGroupLimit\">\n\t\t\t\t<label :for=\"prefix('groups_enable', app.id)\">{{ t('settings', 'Limit to groups') }}</label>\n\t\t\t\t<input type=\"hidden\"\n\t\t\t\t\tclass=\"group_select\"\n\t\t\t\t\t:title=\"t('settings', 'All')\"\n\t\t\t\t\tvalue=\"\">\n\t\t\t\t<Multiselect v-if=\"isLimitedToGroups(app)\"\n\t\t\t\t\t:options=\"groups\"\n\t\t\t\t\t:value=\"appGroups\"\n\t\t\t\t\t:options-limit=\"5\"\n\t\t\t\t\t:placeholder=\"t('settings', 'Limit app usage to groups')\"\n\t\t\t\t\tlabel=\"name\"\n\t\t\t\t\ttrack-by=\"id\"\n\t\t\t\t\tclass=\"multiselect-vue\"\n\t\t\t\t\t:multiple=\"true\"\n\t\t\t\t\t:close-on-select=\"false\"\n\t\t\t\t\t:tag-width=\"60\"\n\t\t\t\t\t@select=\"addGroupLimitation\"\n\t\t\t\t\t@remove=\"removeGroupLimitation\"\n\t\t\t\t\t@search-change=\"asyncFindGroup\">\n\t\t\t\t\t<span slot=\"noResult\">{{ t('settings', 'No results') }}</span>\n\t\t\t\t</Multiselect>\n\t\t\t</div>\n\t\t\t<div class=\"app-details__actions-manage\">\n\t\t\t\t<input v-if=\"app.update\"\n\t\t\t\t\tclass=\"update primary\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t:value=\"t('settings', 'Update to {version}', { version: app.update })\"\n\t\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t\t@click=\"update(app.id)\">\n\t\t\t\t<input v-if=\"app.canUnInstall\"\n\t\t\t\t\tclass=\"uninstall\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t:value=\"t('settings', 'Remove')\"\n\t\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t\t@click=\"remove(app.id)\">\n\t\t\t\t<input v-if=\"app.active\"\n\t\t\t\t\tclass=\"enable\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t:value=\"t('settings','Disable')\"\n\t\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t\t@click=\"disable(app.id)\">\n\t\t\t\t<input v-if=\"!app.active && (app.canInstall || app.isCompatible)\"\n\t\t\t\t\tv-tooltip.auto=\"enableButtonTooltip\"\n\t\t\t\t\tclass=\"enable primary\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t:value=\"enableButtonText\"\n\t\t\t\t\t:disabled=\"!app.canInstall || installing || isLoading\"\n\t\t\t\t\t@click=\"enable(app.id)\">\n\t\t\t\t<input v-else-if=\"!app.active && !app.canInstall\"\n\t\t\t\t\tv-tooltip.auto=\"forceEnableButtonTooltip\"\n\t\t\t\t\tclass=\"enable force\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t:value=\"forceEnableButtonText\"\n\t\t\t\t\t:disabled=\"installing || isLoading\"\n\t\t\t\t\t@click=\"forceEnable(app.id)\">\n\t\t\t</div>\n\t\t</div>\n\n\t\t<ul class=\"app-details__dependencies\">\n\t\t\t<li v-if=\"app.missingMinOwnCloudVersion\">\n\t\t\t\t{{ t('settings', 'This app has no minimum Nextcloud version assigned. This will be an error in the future.') }}\n\t\t\t</li>\n\t\t\t<li v-if=\"app.missingMaxOwnCloudVersion\">\n\t\t\t\t{{ t('settings', 'This app has no maximum Nextcloud version assigned. This will be an error in the future.') }}\n\t\t\t</li>\n\t\t\t<li v-if=\"!app.canInstall\">\n\t\t\t\t{{ t('settings', 'This app cannot be installed because the following dependencies are not fulfilled:') }}\n\t\t\t\t<ul class=\"missing-dependencies\">\n\t\t\t\t\t<li v-for=\"(dep, index) in app.missingDependencies\" :key=\"index\">\n\t\t\t\t\t\t{{ dep }}\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</li>\n\t\t</ul>\n\n\t\t<p class=\"app-details__documentation\">\n\t\t\t<a v-if=\"!app.internal\"\n\t\t\t\tclass=\"appslink\"\n\t\t\t\t:href=\"appstoreUrl\"\n\t\t\t\ttarget=\"_blank\"\n\t\t\t\trel=\"noreferrer noopener\">{{ t('settings', 'View in store') }} ↗</a>\n\n\t\t\t<a v-if=\"app.website\"\n\t\t\t\tclass=\"appslink\"\n\t\t\t\t:href=\"app.website\"\n\t\t\t\ttarget=\"_blank\"\n\t\t\t\trel=\"noreferrer noopener\">{{ t('settings', 'Visit website') }} ↗</a>\n\t\t\t<a v-if=\"app.bugs\"\n\t\t\t\tclass=\"appslink\"\n\t\t\t\t:href=\"app.bugs\"\n\t\t\t\ttarget=\"_blank\"\n\t\t\t\trel=\"noreferrer noopener\">{{ t('settings', 'Report a bug') }} ↗</a>\n\n\t\t\t<a v-if=\"app.documentation && app.documentation.user\"\n\t\t\t\tclass=\"appslink\"\n\t\t\t\t:href=\"app.documentation.user\"\n\t\t\t\ttarget=\"_blank\"\n\t\t\t\trel=\"noreferrer noopener\">{{ t('settings', 'User documentation') }} ↗</a>\n\t\t\t<a v-if=\"app.documentation && app.documentation.admin\"\n\t\t\t\tclass=\"appslink\"\n\t\t\t\t:href=\"app.documentation.admin\"\n\t\t\t\ttarget=\"_blank\"\n\t\t\t\trel=\"noreferrer noopener\">{{ t('settings', 'Admin documentation') }} ↗</a>\n\t\t\t<a v-if=\"app.documentation && app.documentation.developer\"\n\t\t\t\tclass=\"appslink\"\n\t\t\t\t:href=\"app.documentation.developer\"\n\t\t\t\ttarget=\"_blank\"\n\t\t\t\trel=\"noreferrer noopener\">{{ t('settings', 'Developer documentation') }} ↗</a>\n\t\t</p>\n\t\t<Markdown class=\"app-details__description\" :text=\"app.description\" />\n\t</div>\n</template>\n\n<script>\nimport Multiselect from '@nextcloud/vue/dist/Components/Multiselect'\n\nimport AppManagement from '../mixins/AppManagement'\nimport PrefixMixin from './PrefixMixin'\nimport Markdown from './Markdown'\n\nexport default {\n\tname: 'AppDetails',\n\n\tcomponents: {\n\t\tMultiselect,\n\t\tMarkdown,\n\t},\n\tmixins: [AppManagement, PrefixMixin],\n\n\tprops: {\n\t\tapp: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tgroupCheckedAppsData: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tappstoreUrl() {\n\t\t\treturn `https://apps.nextcloud.com/apps/${this.app.id}`\n\t\t},\n\t\tlicence() {\n\t\t\tif (this.app.licence) {\n\t\t\t\treturn t('settings', '{license}-licensed', { license: ('' + this.app.licence).toUpperCase() })\n\t\t\t}\n\t\t\treturn null\n\t\t},\n\t\tauthor() {\n\t\t\tif (typeof this.app.author === 'string') {\n\t\t\t\treturn [\n\t\t\t\t\t{\n\t\t\t\t\t\t'@value': this.app.author,\n\t\t\t\t\t},\n\t\t\t\t]\n\t\t\t}\n\t\t\tif (this.app.author['@value']) {\n\t\t\t\treturn [this.app.author]\n\t\t\t}\n\t\t\treturn this.app.author\n\t\t},\n\t\tappGroups() {\n\t\t\treturn this.app.groups.map(group => { return { id: group, name: group } })\n\t\t},\n\t\tgroups() {\n\t\t\treturn this.$store.getters.getGroups\n\t\t\t\t.filter(group => group.id !== 'disabled')\n\t\t\t\t.sort((a, b) => a.name.localeCompare(b.name))\n\t\t},\n\t},\n\tmounted() {\n\t\tif (this.app.groups.length > 0) {\n\t\t\tthis.groupCheckedAppsData = true\n\t\t}\n\t},\n}\n</script>\n\n<style scoped lang=\"scss\">\n.app-details {\n\tpadding: 20px;\n\n\t&__actions {\n\t\t// app management\n\t\t&-manage {\n\t\t\t// if too many, shrink them and ellipsis\n\t\t\tdisplay: flex;\n\t\t\tinput {\n\t\t\t\tflex: 0 1 auto;\n\t\t\t\tmin-width: 0;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\t\t}\n\t}\n\t&__dependencies {\n\t\topacity: .7;\n\t}\n\t&__documentation {\n\t\tpadding-top: 20px;\n\t}\n\t&__description {\n\t\tpadding-top: 20px;\n\t}\n}\n\n.force {\n\tcolor: var(--color-error);\n\tborder-color: var(--color-error);\n\tbackground: var(--color-main-background);\n}\n.force:hover,\n.force:active {\n\tcolor: var(--color-main-background);\n\tborder-color: var(--color-error) !important;\n\tbackground: var(--color-error);\n}\n\n</style>\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppDetails.vue?vue&type=style&index=0&id=8ea5f476&scoped=true&lang=scss&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppDetails.vue?vue&type=style&index=0&id=8ea5f476&scoped=true&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AppDetails.vue?vue&type=template&id=8ea5f476&scoped=true&\"\nimport script from \"./AppDetails.vue?vue&type=script&lang=js&\"\nexport * from \"./AppDetails.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AppDetails.vue?vue&type=style&index=0&id=8ea5f476&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"8ea5f476\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"app-details\"},[_c('div',{staticClass:\"app-details__actions\"},[(_vm.app.active && _vm.canLimitToGroups(_vm.app))?_c('div',{staticClass:\"app-details__actions-groups\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.groupCheckedAppsData),expression:\"groupCheckedAppsData\"}],staticClass:\"groups-enable__checkbox checkbox\",attrs:{\"id\":_vm.prefix('groups_enable', _vm.app.id),\"type\":\"checkbox\"},domProps:{\"value\":_vm.app.id,\"checked\":Array.isArray(_vm.groupCheckedAppsData)?_vm._i(_vm.groupCheckedAppsData,_vm.app.id)>-1:(_vm.groupCheckedAppsData)},on:{\"change\":[function($event){var $$a=_vm.groupCheckedAppsData,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=_vm.app.id,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.groupCheckedAppsData=$$a.concat([$$v]))}else{$$i>-1&&(_vm.groupCheckedAppsData=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.groupCheckedAppsData=$$c}},_vm.setGroupLimit]}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":_vm.prefix('groups_enable', _vm.app.id)}},[_vm._v(_vm._s(_vm.t('settings', 'Limit to groups')))]),_vm._v(\" \"),_c('input',{staticClass:\"group_select\",attrs:{\"type\":\"hidden\",\"title\":_vm.t('settings', 'All'),\"value\":\"\"}}),_vm._v(\" \"),(_vm.isLimitedToGroups(_vm.app))?_c('Multiselect',{staticClass:\"multiselect-vue\",attrs:{\"options\":_vm.groups,\"value\":_vm.appGroups,\"options-limit\":5,\"placeholder\":_vm.t('settings', 'Limit app usage to groups'),\"label\":\"name\",\"track-by\":\"id\",\"multiple\":true,\"close-on-select\":false,\"tag-width\":60},on:{\"select\":_vm.addGroupLimitation,\"remove\":_vm.removeGroupLimitation,\"search-change\":_vm.asyncFindGroup}},[_c('span',{attrs:{\"slot\":\"noResult\"},slot:\"noResult\"},[_vm._v(_vm._s(_vm.t('settings', 'No results')))])]):_vm._e()],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"app-details__actions-manage\"},[(_vm.app.update)?_c('input',{staticClass:\"update primary\",attrs:{\"type\":\"button\",\"value\":_vm.t('settings', 'Update to {version}', { version: _vm.app.update }),\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){return _vm.update(_vm.app.id)}}}):_vm._e(),_vm._v(\" \"),(_vm.app.canUnInstall)?_c('input',{staticClass:\"uninstall\",attrs:{\"type\":\"button\",\"value\":_vm.t('settings', 'Remove'),\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){return _vm.remove(_vm.app.id)}}}):_vm._e(),_vm._v(\" \"),(_vm.app.active)?_c('input',{staticClass:\"enable\",attrs:{\"type\":\"button\",\"value\":_vm.t('settings','Disable'),\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){return _vm.disable(_vm.app.id)}}}):_vm._e(),_vm._v(\" \"),(!_vm.app.active && (_vm.app.canInstall || _vm.app.isCompatible))?_c('input',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.enableButtonTooltip),expression:\"enableButtonTooltip\",modifiers:{\"auto\":true}}],staticClass:\"enable primary\",attrs:{\"type\":\"button\",\"value\":_vm.enableButtonText,\"disabled\":!_vm.app.canInstall || _vm.installing || _vm.isLoading},on:{\"click\":function($event){return _vm.enable(_vm.app.id)}}}):(!_vm.app.active && !_vm.app.canInstall)?_c('input',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:(_vm.forceEnableButtonTooltip),expression:\"forceEnableButtonTooltip\",modifiers:{\"auto\":true}}],staticClass:\"enable force\",attrs:{\"type\":\"button\",\"value\":_vm.forceEnableButtonText,\"disabled\":_vm.installing || _vm.isLoading},on:{\"click\":function($event){return _vm.forceEnable(_vm.app.id)}}}):_vm._e()])]),_vm._v(\" \"),_c('ul',{staticClass:\"app-details__dependencies\"},[(_vm.app.missingMinOwnCloudVersion)?_c('li',[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'This app has no minimum Nextcloud version assigned. This will be an error in the future.'))+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.app.missingMaxOwnCloudVersion)?_c('li',[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'This app has no maximum Nextcloud version assigned. This will be an error in the future.'))+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),(!_vm.app.canInstall)?_c('li',[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'This app cannot be installed because the following dependencies are not fulfilled:'))+\"\\n\\t\\t\\t\"),_c('ul',{staticClass:\"missing-dependencies\"},_vm._l((_vm.app.missingDependencies),function(dep,index){return _c('li',{key:index},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(dep)+\"\\n\\t\\t\\t\\t\")])}),0)]):_vm._e()]),_vm._v(\" \"),_c('p',{staticClass:\"app-details__documentation\"},[(!_vm.app.internal)?_c('a',{staticClass:\"appslink\",attrs:{\"href\":_vm.appstoreUrl,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(_vm._s(_vm.t('settings', 'View in store'))+\" ↗\")]):_vm._e(),_vm._v(\" \"),(_vm.app.website)?_c('a',{staticClass:\"appslink\",attrs:{\"href\":_vm.app.website,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(_vm._s(_vm.t('settings', 'Visit website'))+\" ↗\")]):_vm._e(),_vm._v(\" \"),(_vm.app.bugs)?_c('a',{staticClass:\"appslink\",attrs:{\"href\":_vm.app.bugs,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(_vm._s(_vm.t('settings', 'Report a bug'))+\" ↗\")]):_vm._e(),_vm._v(\" \"),(_vm.app.documentation && _vm.app.documentation.user)?_c('a',{staticClass:\"appslink\",attrs:{\"href\":_vm.app.documentation.user,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(_vm._s(_vm.t('settings', 'User documentation'))+\" ↗\")]):_vm._e(),_vm._v(\" \"),(_vm.app.documentation && _vm.app.documentation.admin)?_c('a',{staticClass:\"appslink\",attrs:{\"href\":_vm.app.documentation.admin,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(_vm._s(_vm.t('settings', 'Admin documentation'))+\" ↗\")]):_vm._e(),_vm._v(\" \"),(_vm.app.documentation && _vm.app.documentation.developer)?_c('a',{staticClass:\"appslink\",attrs:{\"href\":_vm.app.documentation.developer,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(_vm._s(_vm.t('settings', 'Developer documentation'))+\" ↗\")]):_vm._e()]),_vm._v(\" \"),_c('Markdown',{staticClass:\"app-details__description\",attrs:{\"text\":_vm.app.description}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n -\n - @author Julius Härtl <jus@bitgrid.net>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<Content app-name=\"settings\"\n\t\t:class=\"{ 'with-app-sidebar': app}\"\n\t\t:content-class=\"{ 'icon-loading': loadingList }\"\n\t\t:navigation-class=\"{ 'icon-loading': loading }\">\n\t\t<!-- Categories & filters -->\n\t\t<AppNavigation>\n\t\t\t<template #list>\n\t\t\t\t<AppNavigationItem id=\"app-category-your-apps\"\n\t\t\t\t\t:to=\"{ name: 'apps' }\"\n\t\t\t\t\t:exact=\"true\"\n\t\t\t\t\ticon=\"icon-category-installed\"\n\t\t\t\t\t:title=\"t('settings', 'Your apps')\" />\n\t\t\t\t<AppNavigationItem id=\"app-category-enabled\"\n\t\t\t\t\t:to=\"{ name: 'apps-category', params: { category: 'enabled' } }\"\n\t\t\t\t\ticon=\"icon-category-enabled\"\n\t\t\t\t\t:title=\"t('settings', 'Active apps')\" />\n\t\t\t\t<AppNavigationItem id=\"app-category-disabled\"\n\t\t\t\t\t:to=\"{ name: 'apps-category', params: { category: 'disabled' } }\"\n\t\t\t\t\ticon=\"icon-category-disabled\"\n\t\t\t\t\t:title=\"t('settings', 'Disabled apps')\" />\n\t\t\t\t<AppNavigationItem v-if=\"updateCount > 0\"\n\t\t\t\t\tid=\"app-category-updates\"\n\t\t\t\t\t:to=\"{ name: 'apps-category', params: { category: 'updates' } }\"\n\t\t\t\t\ticon=\"icon-download\"\n\t\t\t\t\t:title=\"t('settings', 'Updates')\">\n\t\t\t\t\t<AppNavigationCounter slot=\"counter\">\n\t\t\t\t\t\t{{ updateCount }}\n\t\t\t\t\t</AppNavigationCounter>\n\t\t\t\t</AppNavigationItem>\n\t\t\t\t<AppNavigationItem id=\"app-category-your-bundles\"\n\t\t\t\t\t:to=\"{ name: 'apps-category', params: { category: 'app-bundles' } }\"\n\t\t\t\t\ticon=\"icon-category-app-bundles\"\n\t\t\t\t\t:title=\"t('settings', 'App bundles')\" />\n\n\t\t\t\t<AppNavigationSpacer />\n\n\t\t\t\t<!-- App store categories -->\n\t\t\t\t<template v-if=\"settings.appstoreEnabled\">\n\t\t\t\t\t<AppNavigationItem id=\"app-category-featured\"\n\t\t\t\t\t\t:to=\"{ name: 'apps-category', params: { category: 'featured' } }\"\n\t\t\t\t\t\ticon=\"icon-favorite\"\n\t\t\t\t\t\t:title=\"t('settings', 'Featured apps')\" />\n\n\t\t\t\t\t<AppNavigationItem v-for=\"cat in categories\"\n\t\t\t\t\t\t:key=\"'icon-category-' + cat.ident\"\n\t\t\t\t\t\t:icon=\"'icon-category-' + cat.ident\"\n\t\t\t\t\t\t:to=\"{\n\t\t\t\t\t\t\tname: 'apps-category',\n\t\t\t\t\t\t\tparams: { category: cat.ident },\n\t\t\t\t\t\t}\"\n\t\t\t\t\t\t:title=\"cat.displayName\" />\n\t\t\t\t</template>\n\n\t\t\t\t<AppNavigationItem id=\"app-developer-docs\"\n\t\t\t\t\t:title=\"t('settings', 'Developer documentation') + ' ↗'\"\n\t\t\t\t\t@click=\"openDeveloperDocumentation\" />\n\t\t\t</template>\n\t\t</AppNavigation>\n\n\t\t<!-- Apps list -->\n\t\t<AppContent class=\"app-settings-content\" :class=\"{ 'icon-loading': loadingList }\">\n\t\t\t<AppList :category=\"category\" :app=\"app\" :search=\"searchQuery\" />\n\t\t</AppContent>\n\n\t\t<!-- Selected app details -->\n\t\t<AppSidebar v-if=\"id && app\"\n\t\t\tv-bind=\"appSidebar\"\n\t\t\t:class=\"{'app-sidebar--without-background': !appSidebar.background}\"\n\t\t\t@close=\"hideAppDetails\">\n\t\t\t<template v-if=\"!appSidebar.background\" #header>\n\t\t\t\t<div class=\"app-sidebar-header__figure--default-app-icon icon-settings-dark\" />\n\t\t\t</template>\n\n\t\t\t<template #description>\n\t\t\t\t<!-- Featured/Supported badges -->\n\t\t\t\t<div v-if=\"app.level === 300 || app.level === 200 || hasRating\" class=\"app-level\">\n\t\t\t\t\t<span v-if=\"app.level === 300\"\n\t\t\t\t\t\tv-tooltip.auto=\"t('settings', 'This app is supported via your current Nextcloud subscription.')\"\n\t\t\t\t\t\tclass=\"supported icon-checkmark-color\">\n\t\t\t\t\t\t{{ t('settings', 'Supported') }}</span>\n\t\t\t\t\t<span v-if=\"app.level === 200\"\n\t\t\t\t\t\tv-tooltip.auto=\"t('settings', 'Featured apps are developed by and within the community. They offer central functionality and are ready for production use.')\"\n\t\t\t\t\t\tclass=\"official icon-checkmark\">\n\t\t\t\t\t\t{{ t('settings', 'Featured') }}</span>\n\t\t\t\t\t<AppScore v-if=\"hasRating\" :score=\"app.appstoreData.ratingOverall\" />\n\t\t\t\t</div>\n\t\t\t\t<div class=\"app-version\">\n\t\t\t\t\t<p>{{ app.version }}</p>\n\t\t\t\t</div>\n\t\t\t</template>\n\n\t\t\t<!-- Tab content -->\n\n\t\t\t<AppSidebarTab id=\"desc\"\n\t\t\t\ticon=\"icon-category-office\"\n\t\t\t\t:name=\"t('settings', 'Details')\"\n\t\t\t\t:order=\"0\">\n\t\t\t\t<AppDetails :app=\"app\" />\n\t\t\t</AppSidebarTab>\n\t\t\t<AppSidebarTab v-if=\"app.appstoreData && app.releases[0].translations.en.changelog\"\n\t\t\t\tid=\"desca\"\n\t\t\t\ticon=\"icon-category-organization\"\n\t\t\t\t:name=\"t('settings', 'Changelog')\"\n\t\t\t\t:order=\"1\">\n\t\t\t\t<div v-for=\"release in app.releases\" :key=\"release.version\" class=\"app-sidebar-tabs__release\">\n\t\t\t\t\t<h2>{{ release.version }}</h2>\n\t\t\t\t\t<Markdown v-if=\"changelog(release)\" :text=\"changelog(release)\" />\n\t\t\t\t</div>\n\t\t\t</AppSidebarTab>\n\t\t</AppSidebar>\n\t</Content>\n</template>\n\n<script>\nimport { subscribe, unsubscribe } from '@nextcloud/event-bus'\nimport Vue from 'vue'\nimport VueLocalStorage from 'vue-localstorage'\n\nimport AppContent from '@nextcloud/vue/dist/Components/AppContent'\nimport AppNavigation from '@nextcloud/vue/dist/Components/AppNavigation'\nimport AppNavigationCounter from '@nextcloud/vue/dist/Components/AppNavigationCounter'\nimport AppNavigationItem from '@nextcloud/vue/dist/Components/AppNavigationItem'\nimport AppNavigationSpacer from '@nextcloud/vue/dist/Components/AppNavigationSpacer'\nimport AppSidebar from '@nextcloud/vue/dist/Components/AppSidebar'\nimport AppSidebarTab from '@nextcloud/vue/dist/Components/AppSidebarTab'\nimport Content from '@nextcloud/vue/dist/Components/Content'\n\nimport AppList from '../components/AppList'\nimport AppDetails from '../components/AppDetails'\nimport AppManagement from '../mixins/AppManagement'\nimport AppScore from '../components/AppList/AppScore'\nimport Markdown from '../components/Markdown'\n\nVue.use(VueLocalStorage)\n\nexport default {\n\tname: 'Apps',\n\n\tcomponents: {\n\t\tAppContent,\n\t\tAppDetails,\n\t\tAppList,\n\t\tAppNavigation,\n\t\tAppNavigationCounter,\n\t\tAppNavigationItem,\n\t\tAppNavigationSpacer,\n\t\tAppScore,\n\t\tAppSidebar,\n\t\tAppSidebarTab,\n\t\tContent,\n\t\tMarkdown,\n\t},\n\n\tmixins: [AppManagement],\n\n\tprops: {\n\t\tcategory: {\n\t\t\ttype: String,\n\t\t\tdefault: 'installed',\n\t\t},\n\t\tid: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tsearchQuery: '',\n\t\t\tscreenshotLoaded: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tloading() {\n\t\t\treturn this.$store.getters.loading('categories')\n\t\t},\n\t\tloadingList() {\n\t\t\treturn this.$store.getters.loading('list')\n\t\t},\n\t\tapp() {\n\t\t\treturn this.apps.find(app => app.id === this.id)\n\t\t},\n\t\tcategories() {\n\t\t\treturn this.$store.getters.getCategories\n\t\t},\n\t\tapps() {\n\t\t\treturn this.$store.getters.getAllApps\n\t\t},\n\t\tupdateCount() {\n\t\t\treturn this.$store.getters.getUpdateCount\n\t\t},\n\t\tsettings() {\n\t\t\treturn this.$store.getters.getServerData\n\t\t},\n\n\t\thasRating() {\n\t\t\treturn this.app.appstoreData && this.app.appstoreData.ratingNumOverall > 5\n\t\t},\n\n\t\t// sidebar app binding\n\t\tappSidebar() {\n\t\t\tconst authorName = (xmlNode) => {\n\t\t\t\tif (xmlNode['@value']) {\n\t\t\t\t\t// Complex node (with email or homepage attribute)\n\t\t\t\t\treturn xmlNode['@value']\n\t\t\t\t}\n\n\t\t\t\t// Simple text node\n\t\t\t\treturn xmlNode\n\t\t\t}\n\n\t\t\tconst author = Array.isArray(this.app.author)\n\t\t\t\t? this.app.author.map(authorName).join(', ')\n\t\t\t\t: authorName(this.app.author)\n\t\t\tconst license = t('settings', '{license}-licensed', { license: ('' + this.app.licence).toUpperCase() })\n\n\t\t\tconst subtitle = t('settings', 'by {author}\\n{license}', { author, license })\n\n\t\t\treturn {\n\t\t\t\tsubtitle,\n\t\t\t\tbackground: this.app.screenshot && this.screenshotLoaded\n\t\t\t\t\t? this.app.screenshot\n\t\t\t\t\t: this.app.preview,\n\t\t\t\tcompact: !(this.app.screenshot && this.screenshotLoaded),\n\t\t\t\ttitle: this.app.name,\n\n\t\t\t}\n\t\t},\n\t\tchangelog() {\n\t\t\treturn (release) => release.translations.en.changelog\n\t\t},\n\t},\n\n\twatch: {\n\t\tcategory() {\n\t\t\tthis.searchQuery = ''\n\t\t},\n\n\t\tapp() {\n\t\t\tthis.screenshotLoaded = false\n\t\t\tif (this.app?.releases && this.app?.screenshot) {\n\t\t\t\tconst image = new Image()\n\t\t\t\timage.onload = (e) => {\n\t\t\t\t\tthis.screenshotLoaded = true\n\t\t\t\t}\n\t\t\t\timage.src = this.app.screenshot\n\t\t\t}\n\t\t},\n\t},\n\n\tbeforeMount() {\n\t\tthis.$store.dispatch('getCategories')\n\t\tthis.$store.dispatch('getAllApps')\n\t\tthis.$store.dispatch('getGroups', { offset: 0, limit: 5 })\n\t\tthis.$store.commit('setUpdateCount', this.$store.getters.getServerData.updateCount)\n\t},\n\n\tmounted() {\n\t\tsubscribe('nextcloud:unified-search.search', this.setSearch)\n\t\tsubscribe('nextcloud:unified-search.reset', this.resetSearch)\n\t},\n\tbeforeDestroy() {\n\t\tunsubscribe('nextcloud:unified-search.search', this.setSearch)\n\t\tunsubscribe('nextcloud:unified-search.reset', this.resetSearch)\n\t},\n\n\tmethods: {\n\t\tsetSearch({ query }) {\n\t\t\tthis.searchQuery = query\n\t\t},\n\t\tresetSearch() {\n\t\t\tthis.searchQuery = ''\n\t\t},\n\n\t\thideAppDetails() {\n\t\t\tthis.$router.push({\n\t\t\t\tname: 'apps-category',\n\t\t\t\tparams: { category: this.category },\n\t\t\t})\n\t\t},\n\t\topenDeveloperDocumentation() {\n\t\t\twindow.open(this.settings.developerDocumentation)\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.app-sidebar::v-deep {\n\t&:not(.app-sidebar--without-background) {\n\t\t// with full screenshot, let's fill the figure\n\t\t:not(.app-sidebar-header--compact) .app-sidebar-header__figure {\n\t\t\tbackground-size: cover;\n\t\t}\n\t\t// revert sidebar app icon so it is black\n\t\t.app-sidebar-header--compact .app-sidebar-header__figure {\n\t\t\tbackground-size: 32px;\n\n\t\t\tfilter: invert(1);\n\t\t}\n\t}\n\n\t.app-sidebar-header__description {\n\t\t.app-version {\n\t\t\tpadding-left: 10px;\n\t\t}\n\t}\n\n\t// default icon slot styling\n\t&.app-sidebar--without-background {\n\t\t.app-sidebar-header__figure {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\t&--default-app-icon {\n\t\t\t\twidth: 32px;\n\t\t\t\theight: 32px;\n\t\t\t\tbackground-size: 32px;\n\t\t\t}\n\t\t}\n\t}\n\n\t// TODO: migrate to components\n\t.app-sidebar-header__desc {\n\t\t// allow multi line subtitle for the license\n\t\t.app-sidebar-header__subtitle {\n\t\t\toverflow: visible !important;\n\t\t\theight: auto;\n\t\t\twhite-space: normal !important;\n\t\t\tline-height: 16px;\n\t\t}\n\t}\n\n\t.app-sidebar-header__action {\n\t\t// align with tab content\n\t\tmargin: 0 20px;\n\t\tinput {\n\t\t\tmargin: 3px;\n\t\t}\n\t}\n}\n\n// Align the appNavigation toggle with the apps header toolbar\n.app-navigation::v-deep button.app-navigation-toggle {\n\ttop: 8px;\n\tright: -8px;\n}\n\n.app-sidebar-tabs__release {\n\th2 {\n\t\tborder-bottom: 1px solid var(--color-border);\n\t}\n\n\t// Overwrite changelog heading styles\n\t::v-deep {\n\t\th3 {\n\t\t\tfont-size: 20px;\n\t\t}\n\t\th4 {\n\t\t\tfont-size: 17px;\n\t\t}\n\t}\n}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Apps.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Apps.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Apps.vue?vue&type=style&index=0&id=d3244798&lang=scss&scoped=true&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Apps.vue?vue&type=style&index=0&id=d3244798&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./Apps.vue?vue&type=template&id=d3244798&scoped=true&\"\nimport script from \"./Apps.vue?vue&type=script&lang=js&\"\nexport * from \"./Apps.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Apps.vue?vue&type=style&index=0&id=d3244798&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"d3244798\",\n null\n \n)\n\nexport default component.exports"],"names":["___CSS_LOADER_EXPORT___","push","module","id","_vm","this","_h","$createElement","_self","_c","staticClass","attrs","scoreImage","axios","generateOcsUrl","then","data","ocs","meta","statuscode","addedApps","navEntries","container","document","querySelector","forEach","entry","querySelectorAll","el","index","dataset","remove","previousEntry","li","createElement","img","icon","imgElement","innerHTML","a","setAttribute","href","filename","appendChild","createTextNode","name","loading","style","display","classList","add","prepend","content","firstChild","append","previousElement","insertAdjacentElement","getElementById","OCA","Theming","inverted","queryElementById","window","dispatchEvent","Event","computed","appGroups","app","groups","map","group","installing","$store","getters","isLoading","enableButtonText","needsDownload","t","forceEnableButtonText","enableButtonTooltip","forceEnableButtonTooltip","base","groupCheckedAppsData","mounted","length","methods","asyncFindGroup","query","dispatch","search","limit","offset","isLimitedToGroups","setGroupLimit","appId","canLimitToGroups","types","includes","addGroupLimitation","concat","removeGroupLimitation","currentGroups","indexOf","splice","forceEnable","response","rebuildNavigation","catch","error","showError","enable","disable","install","update","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","class","selected","isSelected","on","showAppDetails","listView","preview","screenshotLoaded","filterId","_v","filterUrl","_e","screenshot","_s","summary","version","appstoreData","releases","level","directives","rawName","value","expression","modifiers","hasRating","score","$event","stopPropagation","active","canInstall","isCompatible","installed","useBundleView","useListView","store","useAppStoreView","n","counter","updateAll","showUpdateAll","_l","key","category","bundle","bundleToggleText","toggleBundle","bundleApps","searchApps","apps","domProps","renderMarkdown","prefix","Array","isArray","_i","$$a","$$el","target","$$c","checked","$$v","$$i","slice","slot","dep","internal","appstoreUrl","website","bugs","documentation","user","admin","developer","description","loadingList","scopedSlots","_u","fn","params","updateCount","settings","cat","ident","displayName","openDeveloperDocumentation","proxy","searchQuery","_b","appSidebar","background","hideAppDetails","ratingOverall","translations","en","changelog","release"],"sourceRoot":""}
\ No newline at end of file diff --git a/dist/settings-vue-settings-apps-users-management.js b/dist/settings-vue-settings-apps-users-management.js index 159f05de4e6..05a5aa91a3e 100644 --- a/dist/settings-vue-settings-apps-users-management.js +++ b/dist/settings-vue-settings-apps-users-management.js @@ -1,3 +1,3 @@ /*! For license information please see settings-vue-settings-apps-users-management.js.LICENSE.txt */ -!function(){"use strict";var e,r,o,i={78778:function(e,r,o){var i=o(20144),u=o(34741),a=o(83678),s={name:"App",beforeMount:function(){null!==document.getElementById("serverData")&&this.$store.commit("setServerData",JSON.parse(document.getElementById("serverData").dataset.server))}},c=(0,o(51900).Z)(s,(function(){var e=this.$createElement;return(this._self._c||e)("router-view")}),[],!1,null,null,null).exports,d=o(78345),p=o(79753),f=function(){return Promise.all([o.e(7874),o.e(8351)]).then(o.bind(o,69455))},l=function(){return Promise.all([o.e(7874),o.e(7418)]).then(o.bind(o,77538))};i.default.use(d.Z);var m=new d.Z({mode:"history",base:(0,p.generateUrl)(""),linkActiveClass:"active",routes:[{path:"/:index(index.php/)?settings/users",component:f,props:!0,name:"users",children:[{path:":selectedGroup",name:"group",component:f}]},{path:"/:index(index.php/)?settings/apps",component:l,props:!0,name:"apps",children:[{path:":category",name:"apps-category",component:l,children:[{path:":id",name:"apps-details",component:l}]}]}]}),g=o(20629),h=o(4820),v=o(10128),A=o.n(v),U=function(e){return e.replace(/\/$/,"")},b=function(){return A()()},I=function(e,t){return h.default.get(U(e),t)},y=function(e,t){return h.default.post(U(e),t)},L=function(e,t){return h.default.put(U(e),t)},P=function(e,t){return h.default.delete(U(e),{params:t})},w=(0,o(17499).IY)().setApp("settings").detectUser().build(),E=o(26932),O=function(e,t){return 1===t?e.sort((function(e,t){return e.usercount-e.disabled<t.usercount-t.disabled})):e.sort((function(e,t){return e.name.localeCompare(t.name)}))},C={id:"",name:"",usercount:0,disabled:0,canAdd:!0,canRemove:!0},_={appendUsers:function(e,t){var r=e.users.concat(Object.keys(t).map((function(e){return t[e]})));e.usersOffset+=e.usersLimit,e.users=r},setPasswordPolicyMinLength:function(e,t){e.minPasswordLength=""!==t?t:0},initGroups:function(e,t){var r=t.groups,n=t.orderBy,o=t.userCount;e.groups=r.map((function(e){return Object.assign({},C,e)})),e.orderBy=n,e.userCount=o,e.groups=O(e.groups,e.orderBy)},addGroup:function(e,t){var r=t.gid,n=t.displayName;try{if(void 0!==e.groups.find((function(e){return e.id===r})))return;var o=Object.assign({},C,{id:r,name:n});e.groups.push(o),e.groups=O(e.groups,e.orderBy)}catch(e){console.error("Can't create group",e)}},renameGroup:function(e,t){var r=t.gid,n=t.displayName,o=e.groups.findIndex((function(e){return e.id===r}));if(o>=0){var i=e.groups[o];i.name=n,e.groups.splice(o,1,i),e.groups=O(e.groups,e.orderBy)}},removeGroup:function(e,t){var r=e.groups.findIndex((function(e){return e.id===t}));r>=0&&e.groups.splice(r,1)},addUserGroup:function(e,t){var r=t.userid,n=t.gid,o=e.groups.find((function(e){return e.id===n})),i=e.users.find((function(e){return e.id===r}));o&&i.enabled&&e.userCount>0&&o.usercount++,i.groups.push(n),e.groups=O(e.groups,e.orderBy)},removeUserGroup:function(e,t){var r=t.userid,n=t.gid,o=e.groups.find((function(e){return e.id===n})),i=e.users.find((function(e){return e.id===r}));o&&i.enabled&&e.userCount>0&&o.usercount--;var u=i.groups;u.splice(u.indexOf(n),1),e.groups=O(e.groups,e.orderBy)},addUserSubAdmin:function(e,t){var r=t.userid,n=t.gid;e.users.find((function(e){return e.id===r})).subadmin.push(n)},removeUserSubAdmin:function(e,t){var r=t.userid,n=t.gid,o=e.users.find((function(e){return e.id===r})).subadmin;o.splice(o.indexOf(n),1)},deleteUser:function(e,t){var r=e.users.findIndex((function(e){return e.id===t}));this.commit("updateUserCounts",{user:e.users[r],actionType:"remove"}),e.users.splice(r,1)},addUserData:function(e,t){var r=t.data.ocs.data;e.users.push(r),this.commit("updateUserCounts",{user:r,actionType:"create"})},enableDisableUser:function(e,t){var r=t.userid,n=t.enabled,o=e.users.find((function(e){return e.id===r}));o.enabled=n,this.commit("updateUserCounts",{user:o,actionType:n?"enable":"disable"})},updateUserCounts:function(e,t){var r=t.user,n=t.actionType,o=e.groups.find((function(e){return"disabled"===e.id}));switch(n){case"enable":case"disable":o.usercount+=r.enabled?-1:1,e.userCount+=r.enabled?1:-1,r.groups.forEach((function(t){e.groups.find((function(e){return e.id===t})).disabled+=r.enabled?-1:1}));break;case"create":e.userCount++,r.groups.forEach((function(t){e.groups.find((function(e){return e.id===t})).usercount++}));break;case"remove":r.enabled?(e.userCount--,r.groups.forEach((function(t){e.groups.find((function(e){return e.id===t})).usercount--}))):(o.usercount--,r.groups.forEach((function(t){e.groups.find((function(e){return e.id===t})).disabled--})));break;default:w.error("Unknown action type in updateUserCounts: '".concat(n,"'"))}},setUserData:function(e,t){var r=t.userid,n=t.key,o=t.value;if("quota"===n){var i=OC.Util.computerFileSize(o);e.users.find((function(e){return e.id===r}))[n][n]=null!==i?i:o}else e.users.find((function(e){return e.id===r}))[n]=o},resetUsers:function(e){e.users=[],e.usersOffset=0}},R=h.default.CancelToken,k=null,F={state:{users:[],groups:[],orderBy:1,minPasswordLength:0,usersOffset:0,usersLimit:25,userCount:0},mutations:_,getters:{getUsers:function(e){return e.users},getGroups:function(e){return e.groups},getSubadminGroups:function(e){return e.groups.filter((function(e){return"admin"!==e.id&&"disabled"!==e.id}))},getPasswordPolicyMinLength:function(e){return e.minPasswordLength},getUsersOffset:function(e){return e.usersOffset},getUsersLimit:function(e){return e.usersLimit},getUserCount:function(e){return e.userCount}},actions:{getUsers:function(e,t){var r=t.offset,n=t.limit,o=t.search,i=t.group;return k&&k.cancel("Operation canceled by another search request."),k=R.source(),o="string"==typeof o?o:"",""!==(i="string"==typeof i?i:"")?I((0,p.generateOcsUrl)("cloud/groups/{group}/users/details?offset={offset}&limit={limit}&search={search}",{group:encodeURIComponent(i),offset:r,limit:n,search:o}),{cancelToken:k.token}).then((function(t){var r=Object.keys(t.data.ocs.data.users).length;return r>0&&e.commit("appendUsers",t.data.ocs.data.users),r})).catch((function(t){h.default.isCancel(t)||e.commit("API_FAILURE",t)})):I((0,p.generateOcsUrl)("cloud/users/details?offset={offset}&limit={limit}&search={search}",{offset:r,limit:n,search:o}),{cancelToken:k.token}).then((function(t){var r=Object.keys(t.data.ocs.data.users).length;return r>0&&e.commit("appendUsers",t.data.ocs.data.users),r})).catch((function(t){h.default.isCancel(t)||e.commit("API_FAILURE",t)}))},getGroups:function(e,t){var r=t.offset,n=t.limit,o=t.search;o="string"==typeof o?o:"";var i=-1===n?"":"&limit=".concat(n);return I((0,p.generateOcsUrl)("cloud/groups?offset={offset}&search={search}",{offset:r,search:o})+i).then((function(t){return Object.keys(t.data.ocs.data.groups).length>0&&(t.data.ocs.data.groups.forEach((function(t){e.commit("addGroup",{gid:t,displayName:t})})),!0)})).catch((function(t){return e.commit("API_FAILURE",t)}))},getUsersFromList:function(e,t){var r=t.offset,n=t.limit,o=t.search;return o="string"==typeof o?o:"",I((0,p.generateOcsUrl)("cloud/users/details?offset={offset}&limit={limit}&search={search}",{offset:r,limit:n,search:o})).then((function(t){return Object.keys(t.data.ocs.data.users).length>0&&(e.commit("appendUsers",t.data.ocs.data.users),!0)})).catch((function(t){return e.commit("API_FAILURE",t)}))},getUsersFromGroup:function(e,t){var r=t.groupid,n=t.offset,o=t.limit;return I((0,p.generateOcsUrl)("cloud/users/{groupId}/details?offset={offset}&limit={limit}",{groupId:encodeURIComponent(r),offset:n,limit:o})).then((function(t){return e.commit("getUsersFromList",t.data.ocs.data.users)})).catch((function(t){return e.commit("API_FAILURE",t)}))},getPasswordPolicyMinLength:function(e){return!(!OC.getCapabilities().password_policy||!OC.getCapabilities().password_policy.minLength)&&(e.commit("setPasswordPolicyMinLength",OC.getCapabilities().password_policy.minLength),OC.getCapabilities().password_policy.minLength)},addGroup:function(e,t){return b().then((function(r){return y((0,p.generateOcsUrl)("cloud/groups"),{groupid:t}).then((function(r){return e.commit("addGroup",{gid:t,displayName:t}),{gid:t,displayName:t}})).catch((function(e){throw e}))})).catch((function(r){throw e.commit("API_FAILURE",{gid:t,error:r}),r}))},renameGroup:function(e,t){var r=t.groupid,n=t.displayName;return b().then((function(t){return L((0,p.generateOcsUrl)("cloud/groups/{groupId}",{groupId:encodeURIComponent(r)}),{key:"displayname",value:n}).then((function(t){return e.commit("renameGroup",{gid:r,displayName:n}),{groupid:r,displayName:n}})).catch((function(e){throw e}))})).catch((function(t){throw e.commit("API_FAILURE",{groupid:r,error:t}),t}))},removeGroup:function(e,t){return b().then((function(r){return P((0,p.generateOcsUrl)("cloud/groups/{groupId}",{groupId:encodeURIComponent(t)})).then((function(r){return e.commit("removeGroup",t)})).catch((function(e){throw e}))})).catch((function(r){return e.commit("API_FAILURE",{gid:t,error:r})}))},addUserGroup:function(e,t){var r=t.userid,n=t.gid;return b().then((function(t){return y((0,p.generateOcsUrl)("cloud/users/{userid}/groups",{userid:r}),{groupid:n}).then((function(t){return e.commit("addUserGroup",{userid:r,gid:n})})).catch((function(e){throw e}))})).catch((function(t){return e.commit("API_FAILURE",{userid:r,error:t})}))},removeUserGroup:function(e,t){var r=t.userid,n=t.gid;return b().then((function(t){return P((0,p.generateOcsUrl)("cloud/users/{userid}/groups",{userid:r}),{groupid:n}).then((function(t){return e.commit("removeUserGroup",{userid:r,gid:n})})).catch((function(e){throw e}))})).catch((function(t){throw e.commit("API_FAILURE",{userid:r,error:t}),t}))},addUserSubAdmin:function(e,t){var r=t.userid,n=t.gid;return b().then((function(t){return y((0,p.generateOcsUrl)("cloud/users/{userid}/subadmins",{userid:r}),{groupid:n}).then((function(t){return e.commit("addUserSubAdmin",{userid:r,gid:n})})).catch((function(e){throw e}))})).catch((function(t){return e.commit("API_FAILURE",{userid:r,error:t})}))},removeUserSubAdmin:function(e,t){var r=t.userid,n=t.gid;return b().then((function(t){return P((0,p.generateOcsUrl)("cloud/users/{userid}/subadmins",{userid:r}),{groupid:n}).then((function(t){return e.commit("removeUserSubAdmin",{userid:r,gid:n})})).catch((function(e){throw e}))})).catch((function(t){return e.commit("API_FAILURE",{userid:r,error:t})}))},wipeUserDevices:function(e,t){return b().then((function(e){return y((0,p.generateOcsUrl)("cloud/users/{userid}/wipe",{userid:t})).catch((function(e){throw e}))})).catch((function(r){return e.commit("API_FAILURE",{userid:t,error:r})}))},deleteUser:function(e,t){return b().then((function(r){return P((0,p.generateOcsUrl)("cloud/users/{userid}",{userid:t})).then((function(r){return e.commit("deleteUser",t)})).catch((function(e){throw e}))})).catch((function(r){return e.commit("API_FAILURE",{userid:t,error:r})}))},addUser:function(e,r){var n=e.commit,o=e.dispatch,i=r.userid,u=r.password,a=r.displayName,s=r.email,c=r.groups,d=r.subadmin,f=r.quota,l=r.language;return b().then((function(e){return y((0,p.generateOcsUrl)("cloud/users"),{userid:i,password:u,displayName:a,email:s,groups:c,subadmin:d,quota:f,language:l}).then((function(e){return o("addUserData",i||e.data.ocs.data.id)})).catch((function(e){throw e}))})).catch((function(e){var r,o,u,a;if(102===(null==e||null===(r=e.response)||void 0===r||null===(o=r.data)||void 0===o||null===(u=o.ocs)||void 0===u||null===(a=u.meta)||void 0===a?void 0:a.statuscode))throw(0,E.x2)(t("settings","User already exists.")),e;throw n("API_FAILURE",{userid:i,error:e}),e}))},addUserData:function(e,t){return b().then((function(r){return I((0,p.generateOcsUrl)("cloud/users/{userid}",{userid:t})).then((function(t){return e.commit("addUserData",t)})).catch((function(e){throw e}))})).catch((function(r){return e.commit("API_FAILURE",{userid:t,error:r})}))},enableDisableUser:function(e,t){var r=t.userid,n=t.enabled,o=void 0===n||n,i=o?"enable":"disable";return b().then((function(t){return L((0,p.generateOcsUrl)("cloud/users/{userid}/{userStatus}",{userid:r,userStatus:i})).then((function(t){return e.commit("enableDisableUser",{userid:r,enabled:o})})).catch((function(e){throw e}))})).catch((function(t){return e.commit("API_FAILURE",{userid:r,error:t})}))},setUserData:function(e,t){var r=t.userid,n=t.key,o=t.value,i=["email","displayname"];return-1!==["email","language","quota","displayname","password"].indexOf(n)&&"string"==typeof o&&(-1===i.indexOf(n)&&o.length>0||-1!==i.indexOf(n))?b().then((function(t){return L((0,p.generateOcsUrl)("cloud/users/{userid}",{userid:r}),{key:n,value:o}).then((function(t){return e.commit("setUserData",{userid:r,key:n,value:o})})).catch((function(e){throw e}))})).catch((function(t){return e.commit("API_FAILURE",{userid:r,error:t})})):Promise.reject(new Error("Invalid request data"))},sendWelcomeMail:function(e,t){return b().then((function(e){return y((0,p.generateOcsUrl)("cloud/users/{userid}/welcome",{userid:t})).then((function(e){return!0})).catch((function(e){throw e}))})).catch((function(r){return e.commit("API_FAILURE",{userid:t,error:r})}))}}},S=(o(73317),{APPS_API_FAILURE:function(e,r){(0,E.x2)(t("settings","An error occured during the request. Unable to proceed.")+"<br>"+r.error.response.data.data.message,{isHTML:!0}),console.error(e,r)},initCategories:function(e,t){var r=t.categories,n=t.updateCount;e.categories=r,e.updateCount=n},setUpdateCount:function(e,t){e.updateCount=t},addCategory:function(e,t){e.categories.push(t)},appendCategories:function(e,t){e.categories=t},setAllApps:function(e,t){e.apps=t},setError:function(e,t){var r=t.appId,n=t.error;Array.isArray(r)||(r=[r]),r.forEach((function(t){e.apps.find((function(e){return e.id===t})).error=n}))},clearError:function(e,t){var r=t.appId;t.error,e.apps.find((function(e){return e.id===r})).error=null},enableApp:function(e,t){var r=t.appId,n=t.groups,o=e.apps.find((function(e){return e.id===r}));o.active=!0,o.groups=n},disableApp:function(e,t){var r=e.apps.find((function(e){return e.id===t}));r.active=!1,r.groups=[],r.removable&&(r.canUnInstall=!0)},uninstallApp:function(e,t){e.apps.find((function(e){return e.id===t})).active=!1,e.apps.find((function(e){return e.id===t})).groups=[],e.apps.find((function(e){return e.id===t})).needsDownload=!0,e.apps.find((function(e){return e.id===t})).installed=!1,e.apps.find((function(e){return e.id===t})).canUnInstall=!1,e.apps.find((function(e){return e.id===t})).canInstall=!0},updateApp:function(e,t){var r=e.apps.find((function(e){return e.id===t})),n=r.update;r.update=null,r.version=n,e.updateCount--},resetApps:function(e){e.apps=[]},reset:function(e){e.apps=[],e.categories=[],e.updateCount=0},startLoading:function(e,t){Array.isArray(t)?t.forEach((function(t){i.default.set(e.loading,t,!0)})):i.default.set(e.loading,t,!0)},stopLoading:function(e,t){Array.isArray(t)?t.forEach((function(t){i.default.set(e.loading,t,!1)})):i.default.set(e.loading,t,!1)}}),x={enableApp:function(e,r){var n,o=r.appId,i=r.groups;return n=Array.isArray(o)?o:[o],b().then((function(r){return e.commit("startLoading",n),e.commit("startLoading","install"),y((0,p.generateUrl)("settings/apps/enable"),{appIds:n,groups:i}).then((function(r){return e.commit("stopLoading",n),e.commit("stopLoading","install"),n.forEach((function(t){e.commit("enableApp",{appId:t,groups:i})})),I((0,p.generateUrl)("apps/files")).then((function(){r.data.update_required&&((0,E.JQ)(t("settings","The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds."),{onClick:function(){return window.location.reload()},close:!1}),setTimeout((function(){location.reload()}),5e3))})).catch((function(){Array.isArray(o)||e.commit("setError",{appId:n,error:t("settings","Error: This app cannot be enabled because it makes the server unstable")})}))})).catch((function(t){e.commit("stopLoading",n),e.commit("stopLoading","install"),e.commit("setError",{appId:n,error:t.response.data.data.message}),e.commit("APPS_API_FAILURE",{appId:o,error:t})}))})).catch((function(t){return e.commit("API_FAILURE",{appId:o,error:t})}))},forceEnableApp:function(e,t){var r,n=t.appId;return t.groups,r=Array.isArray(n)?n:[n],b().then((function(){return e.commit("startLoading",r),e.commit("startLoading","install"),y((0,p.generateUrl)("settings/apps/force"),{appId:n}).then((function(e){location.reload()})).catch((function(t){e.commit("stopLoading",r),e.commit("stopLoading","install"),e.commit("setError",{appId:r,error:t.response.data.data.message}),e.commit("APPS_API_FAILURE",{appId:n,error:t})}))})).catch((function(t){return e.commit("API_FAILURE",{appId:n,error:t})}))},disableApp:function(e,t){var r,n=t.appId;return r=Array.isArray(n)?n:[n],b().then((function(t){return e.commit("startLoading",r),y((0,p.generateUrl)("settings/apps/disable"),{appIds:r}).then((function(t){return e.commit("stopLoading",r),r.forEach((function(t){e.commit("disableApp",t)})),!0})).catch((function(t){e.commit("stopLoading",r),e.commit("APPS_API_FAILURE",{appId:n,error:t})}))})).catch((function(t){return e.commit("API_FAILURE",{appId:n,error:t})}))},uninstallApp:function(e,t){var r=t.appId;return b().then((function(t){return e.commit("startLoading",r),I((0,p.generateUrl)("settings/apps/uninstall/".concat(r))).then((function(t){return e.commit("stopLoading",r),e.commit("uninstallApp",r),!0})).catch((function(t){e.commit("stopLoading",r),e.commit("APPS_API_FAILURE",{appId:r,error:t})}))})).catch((function(t){return e.commit("API_FAILURE",{appId:r,error:t})}))},updateApp:function(e,t){var r=t.appId;return b().then((function(t){return e.commit("startLoading",r),e.commit("startLoading","install"),I((0,p.generateUrl)("settings/apps/update/".concat(r))).then((function(t){return e.commit("stopLoading","install"),e.commit("stopLoading",r),e.commit("updateApp",r),!0})).catch((function(t){e.commit("stopLoading",r),e.commit("stopLoading","install"),e.commit("APPS_API_FAILURE",{appId:r,error:t})}))})).catch((function(t){return e.commit("API_FAILURE",{appId:r,error:t})}))},getAllApps:function(e){return e.commit("startLoading","list"),I((0,p.generateUrl)("settings/apps/list")).then((function(t){return e.commit("setAllApps",t.data.apps),e.commit("stopLoading","list"),!0})).catch((function(t){return e.commit("API_FAILURE",t)}))},getCategories:function(e){return e.commit("startLoading","categories"),I((0,p.generateUrl)("settings/apps/categories")).then((function(t){return t.data.length>0&&(e.commit("appendCategories",t.data),e.commit("stopLoading","categories"),!0)})).catch((function(t){return e.commit("API_FAILURE",t)}))}},G={state:{apps:[],categories:[],updateCount:0,loading:{},loadingList:!1},mutations:S,getters:{loading:function(e){return function(t){return e.loading[t]}},getCategories:function(e){return e.categories},getAllApps:function(e){return e.apps},getUpdateCount:function(e){return e.updateCount}},actions:x},D={state:{},mutations:{},getters:{},actions:{setAppConfig:function(e,t){var r=t.app,n=t.key,o=t.value;return b().then((function(e){return y((0,p.generateOcsUrl)("apps/provisioning_api/api/v1/config/apps/{app}/{key}",{app:r,key:n}),{value:o}).catch((function(e){throw e}))})).catch((function(t){return e.commit("API_FAILURE",{app:r,key:n,value:o,error:t})}))}}};i.default.use(g.ZP);var T={API_FAILURE:function(e,r){try{var n=r.error.response.data.ocs.meta.message;(0,E.x2)(t("settings","An error occurred during the request. Unable to proceed.")+"<br>"+n,{isHTML:!0})}catch(e){(0,E.x2)(t("settings","An error occurred during the request. Unable to proceed."))}console.error(e,r)}},j=new g.yh({modules:{users:F,apps:G,settings:{state:{serverData:{}},mutations:{setServerData:function(e,t){e.serverData=t}},getters:{getServerData:function(e){return e.serverData}},actions:{}},oc:D},strict:!1,mutations:T});i.default.use(u.default,{defaultHtml:!1}),(0,a.Z)(j,m),o.nc=btoa(OC.requestToken),i.default.prototype.t=t,i.default.prototype.n=n,i.default.prototype.OC=OC,i.default.prototype.OCA=OCA,i.default.prototype.oc_userconfig=oc_userconfig,new i.default({router:m,store:j,render:function(e){return e(c)}}).$mount("#content")}},u={};function a(e){var t=u[e];if(void 0!==t)return t.exports;var r=u[e]={id:e,loaded:!1,exports:{}};return i[e].call(r.exports,r,r.exports,a),r.loaded=!0,r.exports}a.m=i,a.amdD=function(){throw new Error("define cannot be used indirect")},a.amdO={},e=[],a.O=function(t,r,n,o){if(!r){var i=1/0;for(d=0;d<e.length;d++){r=e[d][0],n=e[d][1],o=e[d][2];for(var u=!0,s=0;s<r.length;s++)(!1&o||i>=o)&&Object.keys(a.O).every((function(e){return a.O[e](r[s])}))?r.splice(s--,1):(u=!1,o<i&&(i=o));if(u){e.splice(d--,1);var c=n();void 0!==c&&(t=c)}}return t}o=o||0;for(var d=e.length;d>0&&e[d-1][2]>o;d--)e[d]=e[d-1];e[d]=[r,n,o]},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,{a:t}),t},a.d=function(e,t){for(var r in t)a.o(t,r)&&!a.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},a.f={},a.e=function(e){return Promise.all(Object.keys(a.f).reduce((function(t,r){return a.f[r](e,t),t}),[]))},a.u=function(e){return{7418:"settings-apps-view",8351:"settings-users"}[e]+"-"+e+".js?v="+{7418:"79a434bb85984935c596",8351:"04e1d33f947711080615"}[e]},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},o="nextcloud:",a.l=function(e,t,n,i){if(r[e])r[e].push(t);else{var u,s;if(void 0!==n)for(var c=document.getElementsByTagName("script"),d=0;d<c.length;d++){var p=c[d];if(p.getAttribute("src")==e||p.getAttribute("data-webpack")==o+n){u=p;break}}u||(s=!0,(u=document.createElement("script")).charset="utf-8",u.timeout=120,a.nc&&u.setAttribute("nonce",a.nc),u.setAttribute("data-webpack",o+n),u.src=e),r[e]=[t];var f=function(t,n){u.onerror=u.onload=null,clearTimeout(l);var o=r[e];if(delete r[e],u.parentNode&&u.parentNode.removeChild(u),o&&o.forEach((function(e){return e(n)})),t)return t(n)},l=setTimeout(f.bind(null,void 0,{type:"timeout",target:u}),12e4);u.onerror=f.bind(null,u.onerror),u.onload=f.bind(null,u.onload),s&&document.head.appendChild(u)}},a.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.nmd=function(e){return e.paths=[],e.children||(e.children=[]),e},a.j=8562,function(){var e;a.g.importScripts&&(e=a.g.location+"");var t=a.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var r=t.getElementsByTagName("script");r.length&&(e=r[r.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),a.p=e}(),function(){a.b=document.baseURI||self.location.href;var e={8562:0};a.f.j=function(t,r){var n=a.o(e,t)?e[t]:void 0;if(0!==n)if(n)r.push(n[2]);else{var o=new Promise((function(r,o){n=e[t]=[r,o]}));r.push(n[2]=o);var i=a.p+a.u(t),u=new Error;a.l(i,(function(r){if(a.o(e,t)&&(0!==(n=e[t])&&(e[t]=void 0),n)){var o=r&&("load"===r.type?"missing":r.type),i=r&&r.target&&r.target.src;u.message="Loading chunk "+t+" failed.\n("+o+": "+i+")",u.name="ChunkLoadError",u.type=o,u.request=i,n[1](u)}}),"chunk-"+t,t)}},a.O.j=function(t){return 0===e[t]};var t=function(t,r){var n,o,i=r[0],u=r[1],s=r[2],c=0;if(i.some((function(t){return 0!==e[t]}))){for(n in u)a.o(u,n)&&(a.m[n]=u[n]);if(s)var d=s(a)}for(t&&t(r);c<i.length;c++)o=i[c],a.o(e,o)&&e[o]&&e[o][0](),e[o]=0;return a.O(d)},r=self.webpackChunknextcloud=self.webpackChunknextcloud||[];r.forEach(t.bind(null,0)),r.push=t.bind(null,r.push.bind(r))}(),a.nc=void 0;var s=a.O(void 0,[7874],(function(){return a(78778)}));s=a.O(s)}(); -//# sourceMappingURL=settings-vue-settings-apps-users-management.js.map?v=a47853254ecb1bef5cea
\ No newline at end of file +!function(){"use strict";var e,r,o,i={78778:function(e,r,o){var i=o(20144),u=o(34741),a=o(83678),s={name:"App",beforeMount:function(){null!==document.getElementById("serverData")&&this.$store.commit("setServerData",JSON.parse(document.getElementById("serverData").dataset.server))}},c=(0,o(51900).Z)(s,(function(){var e=this.$createElement;return(this._self._c||e)("router-view")}),[],!1,null,null,null).exports,d=o(78345),p=o(79753),f=function(){return Promise.all([o.e(7874),o.e(8351)]).then(o.bind(o,69455))},l=function(){return Promise.all([o.e(7874),o.e(7418)]).then(o.bind(o,77538))};i.default.use(d.Z);var m=new d.Z({mode:"history",base:(0,p.generateUrl)(""),linkActiveClass:"active",routes:[{path:"/:index(index.php/)?settings/users",component:f,props:!0,name:"users",children:[{path:":selectedGroup",name:"group",component:f}]},{path:"/:index(index.php/)?settings/apps",component:l,props:!0,name:"apps",children:[{path:":category",name:"apps-category",component:l,children:[{path:":id",name:"apps-details",component:l}]}]}]}),g=o(20629),h=o(4820),v=o(10128),A=o.n(v),b=function(e){return e.replace(/\/$/,"")},U=function(){return A()()},I=function(e,t){return h.default.get(b(e),t)},y=function(e,t){return h.default.post(b(e),t)},L=function(e,t){return h.default.put(b(e),t)},P=function(e,t){return h.default.delete(b(e),{params:t})},w=(0,o(17499).IY)().setApp("settings").detectUser().build(),E=o(26932),O=function(e,t){return 1===t?e.sort((function(e,t){return e.usercount-e.disabled<t.usercount-t.disabled})):e.sort((function(e,t){return e.name.localeCompare(t.name)}))},C={id:"",name:"",usercount:0,disabled:0,canAdd:!0,canRemove:!0},_={appendUsers:function(e,t){var r=e.users.concat(Object.keys(t).map((function(e){return t[e]})));e.usersOffset+=e.usersLimit,e.users=r},setPasswordPolicyMinLength:function(e,t){e.minPasswordLength=""!==t?t:0},initGroups:function(e,t){var r=t.groups,n=t.orderBy,o=t.userCount;e.groups=r.map((function(e){return Object.assign({},C,e)})),e.orderBy=n,e.userCount=o,e.groups=O(e.groups,e.orderBy)},addGroup:function(e,t){var r=t.gid,n=t.displayName;try{if(void 0!==e.groups.find((function(e){return e.id===r})))return;var o=Object.assign({},C,{id:r,name:n});e.groups.push(o),e.groups=O(e.groups,e.orderBy)}catch(e){console.error("Can't create group",e)}},renameGroup:function(e,t){var r=t.gid,n=t.displayName,o=e.groups.findIndex((function(e){return e.id===r}));if(o>=0){var i=e.groups[o];i.name=n,e.groups.splice(o,1,i),e.groups=O(e.groups,e.orderBy)}},removeGroup:function(e,t){var r=e.groups.findIndex((function(e){return e.id===t}));r>=0&&e.groups.splice(r,1)},addUserGroup:function(e,t){var r=t.userid,n=t.gid,o=e.groups.find((function(e){return e.id===n})),i=e.users.find((function(e){return e.id===r}));o&&i.enabled&&e.userCount>0&&o.usercount++,i.groups.push(n),e.groups=O(e.groups,e.orderBy)},removeUserGroup:function(e,t){var r=t.userid,n=t.gid,o=e.groups.find((function(e){return e.id===n})),i=e.users.find((function(e){return e.id===r}));o&&i.enabled&&e.userCount>0&&o.usercount--;var u=i.groups;u.splice(u.indexOf(n),1),e.groups=O(e.groups,e.orderBy)},addUserSubAdmin:function(e,t){var r=t.userid,n=t.gid;e.users.find((function(e){return e.id===r})).subadmin.push(n)},removeUserSubAdmin:function(e,t){var r=t.userid,n=t.gid,o=e.users.find((function(e){return e.id===r})).subadmin;o.splice(o.indexOf(n),1)},deleteUser:function(e,t){var r=e.users.findIndex((function(e){return e.id===t}));this.commit("updateUserCounts",{user:e.users[r],actionType:"remove"}),e.users.splice(r,1)},addUserData:function(e,t){var r=t.data.ocs.data;e.users.push(r),this.commit("updateUserCounts",{user:r,actionType:"create"})},enableDisableUser:function(e,t){var r=t.userid,n=t.enabled,o=e.users.find((function(e){return e.id===r}));o.enabled=n,this.commit("updateUserCounts",{user:o,actionType:n?"enable":"disable"})},updateUserCounts:function(e,t){var r=t.user,n=t.actionType,o=e.groups.find((function(e){return"disabled"===e.id}));switch(n){case"enable":case"disable":o.usercount+=r.enabled?-1:1,e.userCount+=r.enabled?1:-1,r.groups.forEach((function(t){e.groups.find((function(e){return e.id===t})).disabled+=r.enabled?-1:1}));break;case"create":e.userCount++,r.groups.forEach((function(t){e.groups.find((function(e){return e.id===t})).usercount++}));break;case"remove":r.enabled?(e.userCount--,r.groups.forEach((function(t){e.groups.find((function(e){return e.id===t})).usercount--}))):(o.usercount--,r.groups.forEach((function(t){e.groups.find((function(e){return e.id===t})).disabled--})));break;default:w.error("Unknown action type in updateUserCounts: '".concat(n,"'"))}},setUserData:function(e,t){var r=t.userid,n=t.key,o=t.value;if("quota"===n){var i=OC.Util.computerFileSize(o);e.users.find((function(e){return e.id===r}))[n][n]=null!==i?i:o}else e.users.find((function(e){return e.id===r}))[n]=o},resetUsers:function(e){e.users=[],e.usersOffset=0}},R=h.default.CancelToken,k=null,F={state:{users:[],groups:[],orderBy:1,minPasswordLength:0,usersOffset:0,usersLimit:25,userCount:0},mutations:_,getters:{getUsers:function(e){return e.users},getGroups:function(e){return e.groups},getSubadminGroups:function(e){return e.groups.filter((function(e){return"admin"!==e.id&&"disabled"!==e.id}))},getPasswordPolicyMinLength:function(e){return e.minPasswordLength},getUsersOffset:function(e){return e.usersOffset},getUsersLimit:function(e){return e.usersLimit},getUserCount:function(e){return e.userCount}},actions:{getUsers:function(e,t){var r=t.offset,n=t.limit,o=t.search,i=t.group;return k&&k.cancel("Operation canceled by another search request."),k=R.source(),o="string"==typeof o?o:"",""!==(i="string"==typeof i?i:"")?I((0,p.generateOcsUrl)("cloud/groups/{group}/users/details?offset={offset}&limit={limit}&search={search}",{group:encodeURIComponent(i),offset:r,limit:n,search:o}),{cancelToken:k.token}).then((function(t){var r=Object.keys(t.data.ocs.data.users).length;return r>0&&e.commit("appendUsers",t.data.ocs.data.users),r})).catch((function(t){h.default.isCancel(t)||e.commit("API_FAILURE",t)})):I((0,p.generateOcsUrl)("cloud/users/details?offset={offset}&limit={limit}&search={search}",{offset:r,limit:n,search:o}),{cancelToken:k.token}).then((function(t){var r=Object.keys(t.data.ocs.data.users).length;return r>0&&e.commit("appendUsers",t.data.ocs.data.users),r})).catch((function(t){h.default.isCancel(t)||e.commit("API_FAILURE",t)}))},getGroups:function(e,t){var r=t.offset,n=t.limit,o=t.search;o="string"==typeof o?o:"";var i=-1===n?"":"&limit=".concat(n);return I((0,p.generateOcsUrl)("cloud/groups?offset={offset}&search={search}",{offset:r,search:o})+i).then((function(t){return Object.keys(t.data.ocs.data.groups).length>0&&(t.data.ocs.data.groups.forEach((function(t){e.commit("addGroup",{gid:t,displayName:t})})),!0)})).catch((function(t){return e.commit("API_FAILURE",t)}))},getUsersFromList:function(e,t){var r=t.offset,n=t.limit,o=t.search;return o="string"==typeof o?o:"",I((0,p.generateOcsUrl)("cloud/users/details?offset={offset}&limit={limit}&search={search}",{offset:r,limit:n,search:o})).then((function(t){return Object.keys(t.data.ocs.data.users).length>0&&(e.commit("appendUsers",t.data.ocs.data.users),!0)})).catch((function(t){return e.commit("API_FAILURE",t)}))},getUsersFromGroup:function(e,t){var r=t.groupid,n=t.offset,o=t.limit;return I((0,p.generateOcsUrl)("cloud/users/{groupId}/details?offset={offset}&limit={limit}",{groupId:encodeURIComponent(r),offset:n,limit:o})).then((function(t){return e.commit("getUsersFromList",t.data.ocs.data.users)})).catch((function(t){return e.commit("API_FAILURE",t)}))},getPasswordPolicyMinLength:function(e){return!(!OC.getCapabilities().password_policy||!OC.getCapabilities().password_policy.minLength)&&(e.commit("setPasswordPolicyMinLength",OC.getCapabilities().password_policy.minLength),OC.getCapabilities().password_policy.minLength)},addGroup:function(e,t){return U().then((function(r){return y((0,p.generateOcsUrl)("cloud/groups"),{groupid:t}).then((function(r){return e.commit("addGroup",{gid:t,displayName:t}),{gid:t,displayName:t}})).catch((function(e){throw e}))})).catch((function(r){throw e.commit("API_FAILURE",{gid:t,error:r}),r}))},renameGroup:function(e,t){var r=t.groupid,n=t.displayName;return U().then((function(t){return L((0,p.generateOcsUrl)("cloud/groups/{groupId}",{groupId:encodeURIComponent(r)}),{key:"displayname",value:n}).then((function(t){return e.commit("renameGroup",{gid:r,displayName:n}),{groupid:r,displayName:n}})).catch((function(e){throw e}))})).catch((function(t){throw e.commit("API_FAILURE",{groupid:r,error:t}),t}))},removeGroup:function(e,t){return U().then((function(r){return P((0,p.generateOcsUrl)("cloud/groups/{groupId}",{groupId:encodeURIComponent(t)})).then((function(r){return e.commit("removeGroup",t)})).catch((function(e){throw e}))})).catch((function(r){return e.commit("API_FAILURE",{gid:t,error:r})}))},addUserGroup:function(e,t){var r=t.userid,n=t.gid;return U().then((function(t){return y((0,p.generateOcsUrl)("cloud/users/{userid}/groups",{userid:r}),{groupid:n}).then((function(t){return e.commit("addUserGroup",{userid:r,gid:n})})).catch((function(e){throw e}))})).catch((function(t){return e.commit("API_FAILURE",{userid:r,error:t})}))},removeUserGroup:function(e,t){var r=t.userid,n=t.gid;return U().then((function(t){return P((0,p.generateOcsUrl)("cloud/users/{userid}/groups",{userid:r}),{groupid:n}).then((function(t){return e.commit("removeUserGroup",{userid:r,gid:n})})).catch((function(e){throw e}))})).catch((function(t){throw e.commit("API_FAILURE",{userid:r,error:t}),t}))},addUserSubAdmin:function(e,t){var r=t.userid,n=t.gid;return U().then((function(t){return y((0,p.generateOcsUrl)("cloud/users/{userid}/subadmins",{userid:r}),{groupid:n}).then((function(t){return e.commit("addUserSubAdmin",{userid:r,gid:n})})).catch((function(e){throw e}))})).catch((function(t){return e.commit("API_FAILURE",{userid:r,error:t})}))},removeUserSubAdmin:function(e,t){var r=t.userid,n=t.gid;return U().then((function(t){return P((0,p.generateOcsUrl)("cloud/users/{userid}/subadmins",{userid:r}),{groupid:n}).then((function(t){return e.commit("removeUserSubAdmin",{userid:r,gid:n})})).catch((function(e){throw e}))})).catch((function(t){return e.commit("API_FAILURE",{userid:r,error:t})}))},wipeUserDevices:function(e,t){return U().then((function(e){return y((0,p.generateOcsUrl)("cloud/users/{userid}/wipe",{userid:t})).catch((function(e){throw e}))})).catch((function(r){return e.commit("API_FAILURE",{userid:t,error:r})}))},deleteUser:function(e,t){return U().then((function(r){return P((0,p.generateOcsUrl)("cloud/users/{userid}",{userid:t})).then((function(r){return e.commit("deleteUser",t)})).catch((function(e){throw e}))})).catch((function(r){return e.commit("API_FAILURE",{userid:t,error:r})}))},addUser:function(e,r){var n=e.commit,o=e.dispatch,i=r.userid,u=r.password,a=r.displayName,s=r.email,c=r.groups,d=r.subadmin,f=r.quota,l=r.language;return U().then((function(e){return y((0,p.generateOcsUrl)("cloud/users"),{userid:i,password:u,displayName:a,email:s,groups:c,subadmin:d,quota:f,language:l}).then((function(e){return o("addUserData",i||e.data.ocs.data.id)})).catch((function(e){throw e}))})).catch((function(e){var r,o,u,a;if(102===(null==e||null===(r=e.response)||void 0===r||null===(o=r.data)||void 0===o||null===(u=o.ocs)||void 0===u||null===(a=u.meta)||void 0===a?void 0:a.statuscode))throw(0,E.x2)(t("settings","User already exists.")),e;throw n("API_FAILURE",{userid:i,error:e}),e}))},addUserData:function(e,t){return U().then((function(r){return I((0,p.generateOcsUrl)("cloud/users/{userid}",{userid:t})).then((function(t){return e.commit("addUserData",t)})).catch((function(e){throw e}))})).catch((function(r){return e.commit("API_FAILURE",{userid:t,error:r})}))},enableDisableUser:function(e,t){var r=t.userid,n=t.enabled,o=void 0===n||n,i=o?"enable":"disable";return U().then((function(t){return L((0,p.generateOcsUrl)("cloud/users/{userid}/{userStatus}",{userid:r,userStatus:i})).then((function(t){return e.commit("enableDisableUser",{userid:r,enabled:o})})).catch((function(e){throw e}))})).catch((function(t){return e.commit("API_FAILURE",{userid:r,error:t})}))},setUserData:function(e,t){var r=t.userid,n=t.key,o=t.value,i=["email","displayname"];return-1!==["email","language","quota","displayname","password"].indexOf(n)&&"string"==typeof o&&(-1===i.indexOf(n)&&o.length>0||-1!==i.indexOf(n))?U().then((function(t){return L((0,p.generateOcsUrl)("cloud/users/{userid}",{userid:r}),{key:n,value:o}).then((function(t){return e.commit("setUserData",{userid:r,key:n,value:o})})).catch((function(e){throw e}))})).catch((function(t){return e.commit("API_FAILURE",{userid:r,error:t})})):Promise.reject(new Error("Invalid request data"))},sendWelcomeMail:function(e,t){return U().then((function(e){return y((0,p.generateOcsUrl)("cloud/users/{userid}/welcome",{userid:t})).then((function(e){return!0})).catch((function(e){throw e}))})).catch((function(r){return e.commit("API_FAILURE",{userid:t,error:r})}))}}},S=(o(73317),{APPS_API_FAILURE:function(e,r){(0,E.x2)(t("settings","An error occured during the request. Unable to proceed.")+"<br>"+r.error.response.data.data.message,{isHTML:!0}),console.error(e,r)},initCategories:function(e,t){var r=t.categories,n=t.updateCount;e.categories=r,e.updateCount=n},setUpdateCount:function(e,t){e.updateCount=t},addCategory:function(e,t){e.categories.push(t)},appendCategories:function(e,t){e.categories=t},setAllApps:function(e,t){e.apps=t},setError:function(e,t){var r=t.appId,n=t.error;Array.isArray(r)||(r=[r]),r.forEach((function(t){e.apps.find((function(e){return e.id===t})).error=n}))},clearError:function(e,t){var r=t.appId;t.error,e.apps.find((function(e){return e.id===r})).error=null},enableApp:function(e,t){var r=t.appId,n=t.groups,o=e.apps.find((function(e){return e.id===r}));o.active=!0,o.groups=n},disableApp:function(e,t){var r=e.apps.find((function(e){return e.id===t}));r.active=!1,r.groups=[],r.removable&&(r.canUnInstall=!0)},uninstallApp:function(e,t){e.apps.find((function(e){return e.id===t})).active=!1,e.apps.find((function(e){return e.id===t})).groups=[],e.apps.find((function(e){return e.id===t})).needsDownload=!0,e.apps.find((function(e){return e.id===t})).installed=!1,e.apps.find((function(e){return e.id===t})).canUnInstall=!1,e.apps.find((function(e){return e.id===t})).canInstall=!0},updateApp:function(e,t){var r=e.apps.find((function(e){return e.id===t})),n=r.update;r.update=null,r.version=n,e.updateCount--},resetApps:function(e){e.apps=[]},reset:function(e){e.apps=[],e.categories=[],e.updateCount=0},startLoading:function(e,t){Array.isArray(t)?t.forEach((function(t){i.default.set(e.loading,t,!0)})):i.default.set(e.loading,t,!0)},stopLoading:function(e,t){Array.isArray(t)?t.forEach((function(t){i.default.set(e.loading,t,!1)})):i.default.set(e.loading,t,!1)}}),x={enableApp:function(e,r){var n,o=r.appId,i=r.groups;return n=Array.isArray(o)?o:[o],U().then((function(r){return e.commit("startLoading",n),e.commit("startLoading","install"),y((0,p.generateUrl)("settings/apps/enable"),{appIds:n,groups:i}).then((function(r){return e.commit("stopLoading",n),e.commit("stopLoading","install"),n.forEach((function(t){e.commit("enableApp",{appId:t,groups:i})})),I((0,p.generateUrl)("apps/files")).then((function(){r.data.update_required&&((0,E.JQ)(t("settings","The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds."),{onClick:function(){return window.location.reload()},close:!1}),setTimeout((function(){location.reload()}),5e3))})).catch((function(){Array.isArray(o)||e.commit("setError",{appId:n,error:t("settings","Error: This app cannot be enabled because it makes the server unstable")})}))})).catch((function(t){e.commit("stopLoading",n),e.commit("stopLoading","install"),e.commit("setError",{appId:n,error:t.response.data.data.message}),e.commit("APPS_API_FAILURE",{appId:o,error:t})}))})).catch((function(t){return e.commit("API_FAILURE",{appId:o,error:t})}))},forceEnableApp:function(e,t){var r,n=t.appId;return t.groups,r=Array.isArray(n)?n:[n],U().then((function(){return e.commit("startLoading",r),e.commit("startLoading","install"),y((0,p.generateUrl)("settings/apps/force"),{appId:n}).then((function(e){location.reload()})).catch((function(t){e.commit("stopLoading",r),e.commit("stopLoading","install"),e.commit("setError",{appId:r,error:t.response.data.data.message}),e.commit("APPS_API_FAILURE",{appId:n,error:t})}))})).catch((function(t){return e.commit("API_FAILURE",{appId:n,error:t})}))},disableApp:function(e,t){var r,n=t.appId;return r=Array.isArray(n)?n:[n],U().then((function(t){return e.commit("startLoading",r),y((0,p.generateUrl)("settings/apps/disable"),{appIds:r}).then((function(t){return e.commit("stopLoading",r),r.forEach((function(t){e.commit("disableApp",t)})),!0})).catch((function(t){e.commit("stopLoading",r),e.commit("APPS_API_FAILURE",{appId:n,error:t})}))})).catch((function(t){return e.commit("API_FAILURE",{appId:n,error:t})}))},uninstallApp:function(e,t){var r=t.appId;return U().then((function(t){return e.commit("startLoading",r),I((0,p.generateUrl)("settings/apps/uninstall/".concat(r))).then((function(t){return e.commit("stopLoading",r),e.commit("uninstallApp",r),!0})).catch((function(t){e.commit("stopLoading",r),e.commit("APPS_API_FAILURE",{appId:r,error:t})}))})).catch((function(t){return e.commit("API_FAILURE",{appId:r,error:t})}))},updateApp:function(e,t){var r=t.appId;return U().then((function(t){return e.commit("startLoading",r),e.commit("startLoading","install"),I((0,p.generateUrl)("settings/apps/update/".concat(r))).then((function(t){return e.commit("stopLoading","install"),e.commit("stopLoading",r),e.commit("updateApp",r),!0})).catch((function(t){e.commit("stopLoading",r),e.commit("stopLoading","install"),e.commit("APPS_API_FAILURE",{appId:r,error:t})}))})).catch((function(t){return e.commit("API_FAILURE",{appId:r,error:t})}))},getAllApps:function(e){return e.commit("startLoading","list"),I((0,p.generateUrl)("settings/apps/list")).then((function(t){return e.commit("setAllApps",t.data.apps),e.commit("stopLoading","list"),!0})).catch((function(t){return e.commit("API_FAILURE",t)}))},getCategories:function(e){return e.commit("startLoading","categories"),I((0,p.generateUrl)("settings/apps/categories")).then((function(t){return t.data.length>0&&(e.commit("appendCategories",t.data),e.commit("stopLoading","categories"),!0)})).catch((function(t){return e.commit("API_FAILURE",t)}))}},G={state:{apps:[],categories:[],updateCount:0,loading:{},loadingList:!1},mutations:S,getters:{loading:function(e){return function(t){return e.loading[t]}},getCategories:function(e){return e.categories},getAllApps:function(e){return e.apps},getUpdateCount:function(e){return e.updateCount}},actions:x},D={state:{},mutations:{},getters:{},actions:{setAppConfig:function(e,t){var r=t.app,n=t.key,o=t.value;return U().then((function(e){return y((0,p.generateOcsUrl)("apps/provisioning_api/api/v1/config/apps/{app}/{key}",{app:r,key:n}),{value:o}).catch((function(e){throw e}))})).catch((function(t){return e.commit("API_FAILURE",{app:r,key:n,value:o,error:t})}))}}};i.default.use(g.ZP);var T={API_FAILURE:function(e,r){try{var n=r.error.response.data.ocs.meta.message;(0,E.x2)(t("settings","An error occurred during the request. Unable to proceed.")+"<br>"+n,{isHTML:!0})}catch(e){(0,E.x2)(t("settings","An error occurred during the request. Unable to proceed."))}console.error(e,r)}},j=new g.yh({modules:{users:F,apps:G,settings:{state:{serverData:{}},mutations:{setServerData:function(e,t){e.serverData=t}},getters:{getServerData:function(e){return e.serverData}},actions:{}},oc:D},strict:!1,mutations:T});i.default.use(u.default,{defaultHtml:!1}),(0,a.Z)(j,m),o.nc=btoa(OC.requestToken),i.default.prototype.t=t,i.default.prototype.n=n,i.default.prototype.OC=OC,i.default.prototype.OCA=OCA,i.default.prototype.oc_userconfig=oc_userconfig,new i.default({router:m,store:j,render:function(e){return e(c)}}).$mount("#content")}},u={};function a(e){var t=u[e];if(void 0!==t)return t.exports;var r=u[e]={id:e,loaded:!1,exports:{}};return i[e].call(r.exports,r,r.exports,a),r.loaded=!0,r.exports}a.m=i,a.amdD=function(){throw new Error("define cannot be used indirect")},a.amdO={},e=[],a.O=function(t,r,n,o){if(!r){var i=1/0;for(d=0;d<e.length;d++){r=e[d][0],n=e[d][1],o=e[d][2];for(var u=!0,s=0;s<r.length;s++)(!1&o||i>=o)&&Object.keys(a.O).every((function(e){return a.O[e](r[s])}))?r.splice(s--,1):(u=!1,o<i&&(i=o));if(u){e.splice(d--,1);var c=n();void 0!==c&&(t=c)}}return t}o=o||0;for(var d=e.length;d>0&&e[d-1][2]>o;d--)e[d]=e[d-1];e[d]=[r,n,o]},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,{a:t}),t},a.d=function(e,t){for(var r in t)a.o(t,r)&&!a.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},a.f={},a.e=function(e){return Promise.all(Object.keys(a.f).reduce((function(t,r){return a.f[r](e,t),t}),[]))},a.u=function(e){return{7418:"settings-apps-view",8351:"settings-users"}[e]+"-"+e+".js?v="+{7418:"a58f27a0cd6f99595ea8",8351:"04e1d33f947711080615"}[e]},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},o="nextcloud:",a.l=function(e,t,n,i){if(r[e])r[e].push(t);else{var u,s;if(void 0!==n)for(var c=document.getElementsByTagName("script"),d=0;d<c.length;d++){var p=c[d];if(p.getAttribute("src")==e||p.getAttribute("data-webpack")==o+n){u=p;break}}u||(s=!0,(u=document.createElement("script")).charset="utf-8",u.timeout=120,a.nc&&u.setAttribute("nonce",a.nc),u.setAttribute("data-webpack",o+n),u.src=e),r[e]=[t];var f=function(t,n){u.onerror=u.onload=null,clearTimeout(l);var o=r[e];if(delete r[e],u.parentNode&&u.parentNode.removeChild(u),o&&o.forEach((function(e){return e(n)})),t)return t(n)},l=setTimeout(f.bind(null,void 0,{type:"timeout",target:u}),12e4);u.onerror=f.bind(null,u.onerror),u.onload=f.bind(null,u.onload),s&&document.head.appendChild(u)}},a.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.nmd=function(e){return e.paths=[],e.children||(e.children=[]),e},a.j=8562,function(){var e;a.g.importScripts&&(e=a.g.location+"");var t=a.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var r=t.getElementsByTagName("script");r.length&&(e=r[r.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),a.p=e}(),function(){a.b=document.baseURI||self.location.href;var e={8562:0};a.f.j=function(t,r){var n=a.o(e,t)?e[t]:void 0;if(0!==n)if(n)r.push(n[2]);else{var o=new Promise((function(r,o){n=e[t]=[r,o]}));r.push(n[2]=o);var i=a.p+a.u(t),u=new Error;a.l(i,(function(r){if(a.o(e,t)&&(0!==(n=e[t])&&(e[t]=void 0),n)){var o=r&&("load"===r.type?"missing":r.type),i=r&&r.target&&r.target.src;u.message="Loading chunk "+t+" failed.\n("+o+": "+i+")",u.name="ChunkLoadError",u.type=o,u.request=i,n[1](u)}}),"chunk-"+t,t)}},a.O.j=function(t){return 0===e[t]};var t=function(t,r){var n,o,i=r[0],u=r[1],s=r[2],c=0;if(i.some((function(t){return 0!==e[t]}))){for(n in u)a.o(u,n)&&(a.m[n]=u[n]);if(s)var d=s(a)}for(t&&t(r);c<i.length;c++)o=i[c],a.o(e,o)&&e[o]&&e[o][0](),e[o]=0;return a.O(d)},r=self.webpackChunknextcloud=self.webpackChunknextcloud||[];r.forEach(t.bind(null,0)),r.push=t.bind(null,r.push.bind(r))}(),a.nc=void 0;var s=a.O(void 0,[7874],(function(){return a(78778)}));s=a.O(s)}(); +//# sourceMappingURL=settings-vue-settings-apps-users-management.js.map?v=621594b16a8925e874cd
\ No newline at end of file diff --git a/dist/settings-vue-settings-apps-users-management.js.map b/dist/settings-vue-settings-apps-users-management.js.map index b1fef97311f..8aba5a72d67 100644 --- a/dist/settings-vue-settings-apps-users-management.js.map +++ b/dist/settings-vue-settings-apps-users-management.js.map @@ -1 +1 @@ -{"version":3,"file":"settings-vue-settings-apps-users-management.js?v=a47853254ecb1bef5cea","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/webpack/runtime/load script","webpack:///nextcloud/apps/settings/src/App.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/settings/src/App.vue","webpack://nextcloud/./apps/settings/src/App.vue?536c","webpack:///nextcloud/apps/settings/src/App.vue?vue&type=template&id=50420604&","webpack:///nextcloud/apps/settings/src/router.js","webpack:///nextcloud/apps/settings/src/store/api.js","webpack:///nextcloud/apps/settings/src/logger.js","webpack:///nextcloud/apps/settings/src/store/users.js","webpack:///nextcloud/apps/settings/src/store/apps.js","webpack:///nextcloud/apps/settings/src/store/oc.js","webpack:///nextcloud/apps/settings/src/store/index.js","webpack:///nextcloud/apps/settings/src/store/settings.js","webpack:///nextcloud/apps/settings/src/main-apps-users-management.js","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/amd define","webpack:///nextcloud/webpack/runtime/amd options","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/ensure chunk","webpack:///nextcloud/webpack/runtime/get javascript chunk filename","webpack:///nextcloud/webpack/runtime/global","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/publicPath","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"nextcloud:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\t;\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","import mod from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","<!--\n - @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<router-view />\n</template>\n\n<script>\nexport default {\n\tname: 'App',\n\tbeforeMount() {\n\t\t// importing server data into the store\n\t\tconst serverDataElmt = document.getElementById('serverData')\n\t\tif (serverDataElmt !== null) {\n\t\t\tthis.$store.commit('setServerData', JSON.parse(document.getElementById('serverData').dataset.server))\n\t\t}\n\t},\n}\n</script>\n","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=50420604&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('router-view')}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Julius Härtl <jus@bitgrid.net>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport Vue from 'vue'\nimport Router from 'vue-router'\nimport { generateUrl } from '@nextcloud/router'\n\n// Dynamic loading\nconst Users = () => import(/* webpackChunkName: 'settings-users' */'./views/Users')\nconst Apps = () => import(/* webpackChunkName: 'settings-apps-view' */'./views/Apps')\n\nVue.use(Router)\n\n/*\n * This is the list of routes where the vuejs app will\n * take over php to provide data\n * You need to forward the php routing (routes.php) to\n * the settings-vue template, where the vue-router will\n * ensure the proper route.\n * ⚠️ Routes needs to match the php routes.\n */\n\nexport default new Router({\n\tmode: 'history',\n\t// if index.php is in the url AND we got this far, then it's working:\n\t// let's keep using index.php in the url\n\tbase: generateUrl(''),\n\tlinkActiveClass: 'active',\n\troutes: [\n\t\t{\n\t\t\tpath: '/:index(index.php/)?settings/users',\n\t\t\tcomponent: Users,\n\t\t\tprops: true,\n\t\t\tname: 'users',\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tpath: ':selectedGroup',\n\t\t\t\t\tname: 'group',\n\t\t\t\t\tcomponent: Users,\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tpath: '/:index(index.php/)?settings/apps',\n\t\t\tcomponent: Apps,\n\t\t\tprops: true,\n\t\t\tname: 'apps',\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tpath: ':category',\n\t\t\t\t\tname: 'apps-category',\n\t\t\t\t\tcomponent: Apps,\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: ':id',\n\t\t\t\t\t\t\tname: 'apps-details',\n\t\t\t\t\t\t\tcomponent: Apps,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t],\n})\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author Christoph Wurst <christoph@winzerhof-wurst.at>\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Julius Härtl <jus@bitgrid.net>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n * @author Sujith Haridasan <sujith.h@gmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport axios from '@nextcloud/axios'\nimport confirmPassword from '@nextcloud/password-confirmation'\n\nconst sanitize = function(url) {\n\treturn url.replace(/\\/$/, '') // Remove last url slash\n}\n\nexport default {\n\n\t/**\n\t * This Promise is used to chain a request that require an admin password confirmation\n\t * Since chaining Promise have a very precise behavior concerning catch and then,\n\t * you'll need to be careful when using it.\n\t * e.g\n\t * // store\n\t * action(context) {\n\t * return api.requireAdmin().then((response) => {\n\t * return api.get('url')\n\t * .then((response) => {API success})\n\t * .catch((error) => {API failure});\n\t * }).catch((error) => {requireAdmin failure});\n\t * }\n\t * // vue\n\t * this.$store.dispatch('action').then(() => {always executed})\n\t *\n\t * Since Promise.then().catch().then() will always execute the last then\n\t * this.$store.dispatch('action').then will always be executed\n\t *\n\t * If you want requireAdmin failure to also catch the API request failure\n\t * you will need to throw a new error in the api.get.catch()\n\t *\n\t * e.g\n\t * api.requireAdmin().then((response) => {\n\t * api.get('url')\n\t * .then((response) => {API success})\n\t * .catch((error) => {throw error;});\n\t * }).catch((error) => {requireAdmin OR API failure});\n\t *\n\t * @return {Promise}\n\t */\n\trequireAdmin() {\n\t\treturn confirmPassword()\n\t},\n\tget(url, options) {\n\t\treturn axios.get(sanitize(url), options)\n\t},\n\tpost(url, data) {\n\t\treturn axios.post(sanitize(url), data)\n\t},\n\tpatch(url, data) {\n\t\treturn axios.patch(sanitize(url), data)\n\t},\n\tput(url, data) {\n\t\treturn axios.put(sanitize(url), data)\n\t},\n\tdelete(url, data) {\n\t\treturn axios.delete(sanitize(url), { params: data })\n\t},\n}\n","/**\n * @copyright 2020 Christoph Wurst <christoph@winzerhof-wurst.at>\n *\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { getLoggerBuilder } from '@nextcloud/logger'\n\nexport default getLoggerBuilder()\n\t.setApp('settings')\n\t.detectUser()\n\t.build()\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author Arthur Schiwon <blizzz@arthur-schiwon.de>\n * @author Christoph Wurst <christoph@winzerhof-wurst.at>\n * @author Daniel Calviño Sánchez <danxuliu@gmail.com>\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Julius Härtl <jus@bitgrid.net>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n * @author Vincent Petry <vincent@nextcloud.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport api from './api'\nimport axios from '@nextcloud/axios'\nimport { generateOcsUrl } from '@nextcloud/router'\nimport logger from '../logger'\nimport { showError } from '@nextcloud/dialogs'\n\nconst orderGroups = function(groups, orderBy) {\n\t/* const SORT_USERCOUNT = 1;\n\t * const SORT_GROUPNAME = 2;\n\t * https://github.com/nextcloud/server/blob/208e38e84e1a07a49699aa90dc5b7272d24489f0/lib/private/Group/MetaData.php#L34\n\t */\n\tif (orderBy === 1) {\n\t\treturn groups.sort((a, b) => a.usercount - a.disabled < b.usercount - b.disabled)\n\t} else {\n\t\treturn groups.sort((a, b) => a.name.localeCompare(b.name))\n\t}\n}\n\nconst defaults = {\n\tgroup: {\n\t\tid: '',\n\t\tname: '',\n\t\tusercount: 0,\n\t\tdisabled: 0,\n\t\tcanAdd: true,\n\t\tcanRemove: true,\n\t},\n}\n\nconst state = {\n\tusers: [],\n\tgroups: [],\n\torderBy: 1,\n\tminPasswordLength: 0,\n\tusersOffset: 0,\n\tusersLimit: 25,\n\tuserCount: 0,\n}\n\nconst mutations = {\n\tappendUsers(state, usersObj) {\n\t\t// convert obj to array\n\t\tconst users = state.users.concat(Object.keys(usersObj).map(userid => usersObj[userid]))\n\t\tstate.usersOffset += state.usersLimit\n\t\tstate.users = users\n\t},\n\tsetPasswordPolicyMinLength(state, length) {\n\t\tstate.minPasswordLength = length !== '' ? length : 0\n\t},\n\tinitGroups(state, { groups, orderBy, userCount }) {\n\t\tstate.groups = groups.map(group => Object.assign({}, defaults.group, group))\n\t\tstate.orderBy = orderBy\n\t\tstate.userCount = userCount\n\t\tstate.groups = orderGroups(state.groups, state.orderBy)\n\n\t},\n\taddGroup(state, { gid, displayName }) {\n\t\ttry {\n\t\t\tif (typeof state.groups.find((group) => group.id === gid) !== 'undefined') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// extend group to default values\n\t\t\tconst group = Object.assign({}, defaults.group, {\n\t\t\t\tid: gid,\n\t\t\t\tname: displayName,\n\t\t\t})\n\t\t\tstate.groups.push(group)\n\t\t\tstate.groups = orderGroups(state.groups, state.orderBy)\n\t\t} catch (e) {\n\t\t\tconsole.error('Can\\'t create group', e)\n\t\t}\n\t},\n\trenameGroup(state, { gid, displayName }) {\n\t\tconst groupIndex = state.groups.findIndex(groupSearch => groupSearch.id === gid)\n\t\tif (groupIndex >= 0) {\n\t\t\tconst updatedGroup = state.groups[groupIndex]\n\t\t\tupdatedGroup.name = displayName\n\t\t\tstate.groups.splice(groupIndex, 1, updatedGroup)\n\t\t\tstate.groups = orderGroups(state.groups, state.orderBy)\n\t\t}\n\t},\n\tremoveGroup(state, gid) {\n\t\tconst groupIndex = state.groups.findIndex(groupSearch => groupSearch.id === gid)\n\t\tif (groupIndex >= 0) {\n\t\t\tstate.groups.splice(groupIndex, 1)\n\t\t}\n\t},\n\taddUserGroup(state, { userid, gid }) {\n\t\tconst group = state.groups.find(groupSearch => groupSearch.id === gid)\n\t\tconst user = state.users.find(user => user.id === userid)\n\t\t// increase count if user is enabled\n\t\tif (group && user.enabled && state.userCount > 0) {\n\t\t\tgroup.usercount++\n\t\t}\n\t\tconst groups = user.groups\n\t\tgroups.push(gid)\n\t\tstate.groups = orderGroups(state.groups, state.orderBy)\n\t},\n\tremoveUserGroup(state, { userid, gid }) {\n\t\tconst group = state.groups.find(groupSearch => groupSearch.id === gid)\n\t\tconst user = state.users.find(user => user.id === userid)\n\t\t// lower count if user is enabled\n\t\tif (group && user.enabled && state.userCount > 0) {\n\t\t\tgroup.usercount--\n\t\t}\n\t\tconst groups = user.groups\n\t\tgroups.splice(groups.indexOf(gid), 1)\n\t\tstate.groups = orderGroups(state.groups, state.orderBy)\n\t},\n\taddUserSubAdmin(state, { userid, gid }) {\n\t\tconst groups = state.users.find(user => user.id === userid).subadmin\n\t\tgroups.push(gid)\n\t},\n\tremoveUserSubAdmin(state, { userid, gid }) {\n\t\tconst groups = state.users.find(user => user.id === userid).subadmin\n\t\tgroups.splice(groups.indexOf(gid), 1)\n\t},\n\tdeleteUser(state, userid) {\n\t\tconst userIndex = state.users.findIndex(user => user.id === userid)\n\t\tthis.commit('updateUserCounts', { user: state.users[userIndex], actionType: 'remove' })\n\t\tstate.users.splice(userIndex, 1)\n\t},\n\taddUserData(state, response) {\n\t\tconst user = response.data.ocs.data\n\t\tstate.users.push(user)\n\t\tthis.commit('updateUserCounts', { user, actionType: 'create' })\n\t},\n\tenableDisableUser(state, { userid, enabled }) {\n\t\tconst user = state.users.find(user => user.id === userid)\n\t\tuser.enabled = enabled\n\t\tthis.commit('updateUserCounts', { user, actionType: enabled ? 'enable' : 'disable' })\n\t},\n\t// update active/disabled counts, groups counts\n\tupdateUserCounts(state, { user, actionType }) {\n\t\tconst disabledGroup = state.groups.find(group => group.id === 'disabled')\n\t\tswitch (actionType) {\n\t\tcase 'enable':\n\t\tcase 'disable':\n\t\t\tdisabledGroup.usercount += user.enabled ? -1 : 1 // update Disabled Users count\n\t\t\tstate.userCount += user.enabled ? 1 : -1 // update Active Users count\n\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\tconst group = state.groups.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\tgroup.disabled += user.enabled ? -1 : 1 // update group disabled count\n\t\t\t})\n\t\t\tbreak\n\t\tcase 'create':\n\t\t\tstate.userCount++ // increment Active Users count\n\n\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\tstate.groups\n\t\t\t\t\t.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\t .usercount++ // increment group total count\n\t\t\t})\n\t\t\tbreak\n\t\tcase 'remove':\n\t\t\tif (user.enabled) {\n\t\t\t\tstate.userCount-- // decrement Active Users count\n\t\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\t\tconst group = state.groups.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\t\tgroup.usercount-- // decrement group total count\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tdisabledGroup.usercount-- // decrement Disabled Users count\n\t\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\t\tconst group = state.groups.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\t\tgroup.disabled-- // decrement group disabled count\n\t\t\t\t})\n\t\t\t}\n\t\t\tbreak\n\t\tdefault:\n\t\t\tlogger.error(`Unknown action type in updateUserCounts: '${actionType}'`)\n\t\t\t// not throwing error to interupt execution as this is not fatal\n\t\t}\n\t},\n\tsetUserData(state, { userid, key, value }) {\n\t\tif (key === 'quota') {\n\t\t\tconst humanValue = OC.Util.computerFileSize(value)\n\t\t\tstate.users.find(user => user.id === userid)[key][key] = humanValue !== null ? humanValue : value\n\t\t} else {\n\t\t\tstate.users.find(user => user.id === userid)[key] = value\n\t\t}\n\t},\n\n\t/**\n\t * Reset users list\n\t *\n\t * @param {object} state the store state\n\t */\n\tresetUsers(state) {\n\t\tstate.users = []\n\t\tstate.usersOffset = 0\n\t},\n}\n\nconst getters = {\n\tgetUsers(state) {\n\t\treturn state.users\n\t},\n\tgetGroups(state) {\n\t\treturn state.groups\n\t},\n\tgetSubadminGroups(state) {\n\t\t// Can't be subadmin of admin or disabled\n\t\treturn state.groups.filter(group => group.id !== 'admin' && group.id !== 'disabled')\n\t},\n\tgetPasswordPolicyMinLength(state) {\n\t\treturn state.minPasswordLength\n\t},\n\tgetUsersOffset(state) {\n\t\treturn state.usersOffset\n\t},\n\tgetUsersLimit(state) {\n\t\treturn state.usersLimit\n\t},\n\tgetUserCount(state) {\n\t\treturn state.userCount\n\t},\n}\n\nconst CancelToken = axios.CancelToken\nlet searchRequestCancelSource = null\n\nconst actions = {\n\n\t/**\n\t * Get all users with full details\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param {string} options.search Search amongst users\n\t * @param {string} options.group Get users from group\n\t * @return {Promise}\n\t */\n\tgetUsers(context, { offset, limit, search, group }) {\n\t\tif (searchRequestCancelSource) {\n\t\t\tsearchRequestCancelSource.cancel('Operation canceled by another search request.')\n\t\t}\n\t\tsearchRequestCancelSource = CancelToken.source()\n\t\tsearch = typeof search === 'string' ? search : ''\n\t\tgroup = typeof group === 'string' ? group : ''\n\t\tif (group !== '') {\n\t\t\treturn api.get(generateOcsUrl('cloud/groups/{group}/users/details?offset={offset}&limit={limit}&search={search}', { group: encodeURIComponent(group), offset, limit, search }), {\n\t\t\t\tcancelToken: searchRequestCancelSource.token,\n\t\t\t})\n\t\t\t\t.then((response) => {\n\t\t\t\t\tconst usersCount = Object.keys(response.data.ocs.data.users).length\n\t\t\t\t\tif (usersCount > 0) {\n\t\t\t\t\t\tcontext.commit('appendUsers', response.data.ocs.data.users)\n\t\t\t\t\t}\n\t\t\t\t\treturn usersCount\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tif (!axios.isCancel(error)) {\n\t\t\t\t\t\tcontext.commit('API_FAILURE', error)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t}\n\n\t\treturn api.get(generateOcsUrl('cloud/users/details?offset={offset}&limit={limit}&search={search}', { offset, limit, search }), {\n\t\t\tcancelToken: searchRequestCancelSource.token,\n\t\t})\n\t\t\t.then((response) => {\n\t\t\t\tconst usersCount = Object.keys(response.data.ocs.data.users).length\n\t\t\t\tif (usersCount > 0) {\n\t\t\t\t\tcontext.commit('appendUsers', response.data.ocs.data.users)\n\t\t\t\t}\n\t\t\t\treturn usersCount\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tif (!axios.isCancel(error)) {\n\t\t\t\t\tcontext.commit('API_FAILURE', error)\n\t\t\t\t}\n\t\t\t})\n\t},\n\n\tgetGroups(context, { offset, limit, search }) {\n\t\tsearch = typeof search === 'string' ? search : ''\n\t\tconst limitParam = limit === -1 ? '' : `&limit=${limit}`\n\t\treturn api.get(generateOcsUrl('cloud/groups?offset={offset}&search={search}', { offset, search }) + limitParam)\n\t\t\t.then((response) => {\n\t\t\t\tif (Object.keys(response.data.ocs.data.groups).length > 0) {\n\t\t\t\t\tresponse.data.ocs.data.groups.forEach(function(group) {\n\t\t\t\t\t\tcontext.commit('addGroup', { gid: group, displayName: group })\n\t\t\t\t\t})\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t})\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\t/**\n\t * Get all users with full details\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param {string} options.search -\n\t * @return {Promise}\n\t */\n\tgetUsersFromList(context, { offset, limit, search }) {\n\t\tsearch = typeof search === 'string' ? search : ''\n\t\treturn api.get(generateOcsUrl('cloud/users/details?offset={offset}&limit={limit}&search={search}', { offset, limit, search }))\n\t\t\t.then((response) => {\n\t\t\t\tif (Object.keys(response.data.ocs.data.users).length > 0) {\n\t\t\t\t\tcontext.commit('appendUsers', response.data.ocs.data.users)\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t})\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\t/**\n\t * Get all users with full details from a groupid\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param {string} options.groupid -\n\t * @return {Promise}\n\t */\n\tgetUsersFromGroup(context, { groupid, offset, limit }) {\n\t\treturn api.get(generateOcsUrl('cloud/users/{groupId}/details?offset={offset}&limit={limit}', { groupId: encodeURIComponent(groupid), offset, limit }))\n\t\t\t.then((response) => context.commit('getUsersFromList', response.data.ocs.data.users))\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\tgetPasswordPolicyMinLength(context) {\n\t\tif (OC.getCapabilities().password_policy && OC.getCapabilities().password_policy.minLength) {\n\t\t\tcontext.commit('setPasswordPolicyMinLength', OC.getCapabilities().password_policy.minLength)\n\t\t\treturn OC.getCapabilities().password_policy.minLength\n\t\t}\n\t\treturn false\n\t},\n\n\t/**\n\t * Add group\n\t *\n\t * @param {object} context store context\n\t * @param {string} gid Group id\n\t * @return {Promise}\n\t */\n\taddGroup(context, gid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/groups'), { groupid: gid })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('addGroup', { gid, displayName: gid })\n\t\t\t\t\treturn { gid, displayName: gid }\n\t\t\t\t})\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tcontext.commit('API_FAILURE', { gid, error })\n\t\t\t// let's throw one more time to prevent the view\n\t\t\t// from adding the user to a group that doesn't exists\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Rename group\n\t *\n\t * @param {Object} context store context\n\t * @param {string} groupid Group id\n\t * @param {string} displayName Group display name\n\t * @return {Promise}\n\t */\n\trenameGroup(context, { groupid, displayName }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.put(generateOcsUrl('cloud/groups/{groupId}', { groupId: encodeURIComponent(groupid) }), { key: 'displayname', value: displayName })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('renameGroup', { gid: groupid, displayName })\n\t\t\t\t\treturn { groupid, displayName }\n\t\t\t\t})\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tcontext.commit('API_FAILURE', { groupid, error })\n\t\t\t// let's throw one more time to prevent the view\n\t\t\t// from renaming the group\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Remove group\n\t *\n\t * @param {object} context store context\n\t * @param {string} gid Group id\n\t * @return {Promise}\n\t */\n\tremoveGroup(context, gid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/groups/{groupId}', { groupId: encodeURIComponent(gid) }))\n\t\t\t\t.then((response) => context.commit('removeGroup', gid))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { gid, error }))\n\t},\n\n\t/**\n\t * Add user to group\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\taddUserGroup(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users/{userid}/groups', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('addUserGroup', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Remove user from group\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\tremoveUserGroup(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/users/{userid}/groups', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('removeUserGroup', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tcontext.commit('API_FAILURE', { userid, error })\n\t\t\t// let's throw one more time to prevent\n\t\t\t// the view from removing the user row on failure\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Add user to group admin\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\taddUserSubAdmin(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users/{userid}/subadmins', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('addUserSubAdmin', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Remove user from group admin\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\tremoveUserSubAdmin(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/users/{userid}/subadmins', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('removeUserSubAdmin', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Mark all user devices for remote wipe\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\twipeUserDevices(context, userid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users/{userid}/wipe', { userid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Delete a user\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\tdeleteUser(context, userid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/users/{userid}', { userid }))\n\t\t\t\t.then((response) => context.commit('deleteUser', userid))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Add a user\n\t *\n\t * @param {object} context store context\n\t * @param {Function} context.commit -\n\t * @param {Function} context.dispatch -\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.password User password\n\t * @param {string} options.displayName User display name\n\t * @param {string} options.email User email\n\t * @param {string} options.groups User groups\n\t * @param {string} options.subadmin User subadmin groups\n\t * @param {string} options.quota User email\n\t * @param {string} options.language User language\n\t * @return {Promise}\n\t */\n\taddUser({ commit, dispatch }, { userid, password, displayName, email, groups, subadmin, quota, language }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users'), { userid, password, displayName, email, groups, subadmin, quota, language })\n\t\t\t\t.then((response) => dispatch('addUserData', userid || response.data.ocs.data.id))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tconst statusCode = error?.response?.data?.ocs?.meta?.statuscode\n\n\t\t\tif (statusCode === 102) {\n\t\t\t\tshowError(t('settings', 'User already exists.'))\n\t\t\t\tthrow error\n\t\t\t}\n\n\t\t\tcommit('API_FAILURE', { userid, error })\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Get user data and commit addition\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\taddUserData(context, userid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.get(generateOcsUrl('cloud/users/{userid}', { userid }))\n\t\t\t\t.then((response) => context.commit('addUserData', response))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Enable or disable user\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {boolean} options.enabled User enablement status\n\t * @return {Promise}\n\t */\n\tenableDisableUser(context, { userid, enabled = true }) {\n\t\tconst userStatus = enabled ? 'enable' : 'disable'\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.put(generateOcsUrl('cloud/users/{userid}/{userStatus}', { userid, userStatus }))\n\t\t\t\t.then((response) => context.commit('enableDisableUser', { userid, enabled }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Edit user data\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.key User field to edit\n\t * @param {string} options.value Value of the change\n\t * @return {Promise}\n\t */\n\tsetUserData(context, { userid, key, value }) {\n\t\tconst allowedEmpty = ['email', 'displayname']\n\t\tif (['email', 'language', 'quota', 'displayname', 'password'].indexOf(key) !== -1) {\n\t\t\t// We allow empty email or displayname\n\t\t\tif (typeof value === 'string'\n\t\t\t\t&& (\n\t\t\t\t\t(allowedEmpty.indexOf(key) === -1 && value.length > 0)\n\t\t\t\t\t|| allowedEmpty.indexOf(key) !== -1\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn api.requireAdmin().then((response) => {\n\t\t\t\t\treturn api.put(generateOcsUrl('cloud/users/{userid}', { userid }), { key, value })\n\t\t\t\t\t\t.then((response) => context.commit('setUserData', { userid, key, value }))\n\t\t\t\t\t\t.catch((error) => { throw error })\n\t\t\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t\t\t}\n\t\t}\n\t\treturn Promise.reject(new Error('Invalid request data'))\n\t},\n\n\t/**\n\t * Send welcome mail\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\tsendWelcomeMail(context, userid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users/{userid}/welcome', { userid }))\n\t\t\t\t.then(response => true)\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n}\n\nexport default { state, mutations, getters, actions }\n","/**\n * @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Julius Härtl <jus@bitgrid.net>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport api from './api'\nimport Vue from 'vue'\nimport { generateUrl } from '@nextcloud/router'\nimport { showError, showInfo } from '@nextcloud/dialogs'\nimport '@nextcloud/dialogs/styles/toast.scss'\n\nconst state = {\n\tapps: [],\n\tcategories: [],\n\tupdateCount: 0,\n\tloading: {},\n\tloadingList: false,\n}\n\nconst mutations = {\n\n\tAPPS_API_FAILURE(state, error) {\n\t\tshowError(t('settings', 'An error occured during the request. Unable to proceed.') + '<br>' + error.error.response.data.data.message, { isHTML: true })\n\t\tconsole.error(state, error)\n\t},\n\n\tinitCategories(state, { categories, updateCount }) {\n\t\tstate.categories = categories\n\t\tstate.updateCount = updateCount\n\t},\n\n\tsetUpdateCount(state, updateCount) {\n\t\tstate.updateCount = updateCount\n\t},\n\n\taddCategory(state, category) {\n\t\tstate.categories.push(category)\n\t},\n\n\tappendCategories(state, categoriesArray) {\n\t\t// convert obj to array\n\t\tstate.categories = categoriesArray\n\t},\n\n\tsetAllApps(state, apps) {\n\t\tstate.apps = apps\n\t},\n\n\tsetError(state, { appId, error }) {\n\t\tif (!Array.isArray(appId)) {\n\t\t\tappId = [appId]\n\t\t}\n\t\tappId.forEach((_id) => {\n\t\t\tconst app = state.apps.find(app => app.id === _id)\n\t\t\tapp.error = error\n\t\t})\n\t},\n\n\tclearError(state, { appId, error }) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tapp.error = null\n\t},\n\n\tenableApp(state, { appId, groups }) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tapp.active = true\n\t\tapp.groups = groups\n\t},\n\n\tdisableApp(state, appId) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tapp.active = false\n\t\tapp.groups = []\n\t\tif (app.removable) {\n\t\t\tapp.canUnInstall = true\n\t\t}\n\t},\n\n\tuninstallApp(state, appId) {\n\t\tstate.apps.find(app => app.id === appId).active = false\n\t\tstate.apps.find(app => app.id === appId).groups = []\n\t\tstate.apps.find(app => app.id === appId).needsDownload = true\n\t\tstate.apps.find(app => app.id === appId).installed = false\n\t\tstate.apps.find(app => app.id === appId).canUnInstall = false\n\t\tstate.apps.find(app => app.id === appId).canInstall = true\n\t},\n\n\tupdateApp(state, appId) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tconst version = app.update\n\t\tapp.update = null\n\t\tapp.version = version\n\t\tstate.updateCount--\n\n\t},\n\n\tresetApps(state) {\n\t\tstate.apps = []\n\t},\n\treset(state) {\n\t\tstate.apps = []\n\t\tstate.categories = []\n\t\tstate.updateCount = 0\n\t},\n\tstartLoading(state, id) {\n\t\tif (Array.isArray(id)) {\n\t\t\tid.forEach((_id) => {\n\t\t\t\tVue.set(state.loading, _id, true)\n\t\t\t})\n\t\t} else {\n\t\t\tVue.set(state.loading, id, true)\n\t\t}\n\t},\n\tstopLoading(state, id) {\n\t\tif (Array.isArray(id)) {\n\t\t\tid.forEach((_id) => {\n\t\t\t\tVue.set(state.loading, _id, false)\n\t\t\t})\n\t\t} else {\n\t\t\tVue.set(state.loading, id, false)\n\t\t}\n\t},\n}\n\nconst getters = {\n\tloading(state) {\n\t\treturn function(id) {\n\t\t\treturn state.loading[id]\n\t\t}\n\t},\n\tgetCategories(state) {\n\t\treturn state.categories\n\t},\n\tgetAllApps(state) {\n\t\treturn state.apps\n\t},\n\tgetUpdateCount(state) {\n\t\treturn state.updateCount\n\t},\n}\n\nconst actions = {\n\n\tenableApp(context, { appId, groups }) {\n\t\tlet apps\n\t\tif (Array.isArray(appId)) {\n\t\t\tapps = appId\n\t\t} else {\n\t\t\tapps = [appId]\n\t\t}\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', apps)\n\t\t\tcontext.commit('startLoading', 'install')\n\t\t\treturn api.post(generateUrl('settings/apps/enable'), { appIds: apps, groups })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tapps.forEach(_appId => {\n\t\t\t\t\t\tcontext.commit('enableApp', { appId: _appId, groups })\n\t\t\t\t\t})\n\n\t\t\t\t\t// check for server health\n\t\t\t\t\treturn api.get(generateUrl('apps/files'))\n\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\tif (response.data.update_required) {\n\t\t\t\t\t\t\t\tshowInfo(\n\t\t\t\t\t\t\t\t\tt(\n\t\t\t\t\t\t\t\t\t\t'settings',\n\t\t\t\t\t\t\t\t\t\t'The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds.'\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tonClick: () => window.location.reload(),\n\t\t\t\t\t\t\t\t\t\tclose: false,\n\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\t\tlocation.reload()\n\t\t\t\t\t\t\t\t}, 5000)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch(() => {\n\t\t\t\t\t\t\tif (!Array.isArray(appId)) {\n\t\t\t\t\t\t\t\tcontext.commit('setError', {\n\t\t\t\t\t\t\t\t\tappId: apps,\n\t\t\t\t\t\t\t\t\terror: t('settings', 'Error: This app cannot be enabled because it makes the server unstable'),\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('setError', {\n\t\t\t\t\t\tappId: apps,\n\t\t\t\t\t\terror: error.response.data.data.message,\n\t\t\t\t\t})\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\tforceEnableApp(context, { appId, groups }) {\n\t\tlet apps\n\t\tif (Array.isArray(appId)) {\n\t\t\tapps = appId\n\t\t} else {\n\t\t\tapps = [appId]\n\t\t}\n\t\treturn api.requireAdmin().then(() => {\n\t\t\tcontext.commit('startLoading', apps)\n\t\t\tcontext.commit('startLoading', 'install')\n\t\t\treturn api.post(generateUrl('settings/apps/force'), { appId })\n\t\t\t\t.then((response) => {\n\t\t\t\t\t// TODO: find a cleaner solution\n\t\t\t\t\tlocation.reload()\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('setError', {\n\t\t\t\t\t\tappId: apps,\n\t\t\t\t\t\terror: error.response.data.data.message,\n\t\t\t\t\t})\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\tdisableApp(context, { appId }) {\n\t\tlet apps\n\t\tif (Array.isArray(appId)) {\n\t\t\tapps = appId\n\t\t} else {\n\t\t\tapps = [appId]\n\t\t}\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', apps)\n\t\t\treturn api.post(generateUrl('settings/apps/disable'), { appIds: apps })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tapps.forEach(_appId => {\n\t\t\t\t\t\tcontext.commit('disableApp', _appId)\n\t\t\t\t\t})\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\tuninstallApp(context, { appId }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', appId)\n\t\t\treturn api.get(generateUrl(`settings/apps/uninstall/${appId}`))\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('uninstallApp', appId)\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\n\tupdateApp(context, { appId }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', appId)\n\t\t\tcontext.commit('startLoading', 'install')\n\t\t\treturn api.get(generateUrl(`settings/apps/update/${appId}`))\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('updateApp', appId)\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\n\tgetAllApps(context) {\n\t\tcontext.commit('startLoading', 'list')\n\t\treturn api.get(generateUrl('settings/apps/list'))\n\t\t\t.then((response) => {\n\t\t\t\tcontext.commit('setAllApps', response.data.apps)\n\t\t\t\tcontext.commit('stopLoading', 'list')\n\t\t\t\treturn true\n\t\t\t})\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\tgetCategories(context) {\n\t\tcontext.commit('startLoading', 'categories')\n\t\treturn api.get(generateUrl('settings/apps/categories'))\n\t\t\t.then((response) => {\n\t\t\t\tif (response.data.length > 0) {\n\t\t\t\t\tcontext.commit('appendCategories', response.data)\n\t\t\t\t\tcontext.commit('stopLoading', 'categories')\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t})\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n}\n\nexport default { state, mutations, getters, actions }\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport api from './api'\nimport { generateOcsUrl } from '@nextcloud/router'\n\nconst state = {}\nconst mutations = {}\nconst getters = {}\nconst actions = {\n\t/**\n\t * Set application config in database\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.app Application name\n\t * @param {boolean} options.key Config key\n\t * @param {boolean} options.value Value to set\n\t * @return {Promise}\n\t */\n\tsetAppConfig(context, { app, key, value }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('apps/provisioning_api/api/v1/config/apps/{app}/{key}', { app, key }), { value })\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { app, key, value, error }))\n\t},\n}\n\nexport default { state, mutations, getters, actions }\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Julius Härtl <jus@bitgrid.net>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport Vue from 'vue'\nimport Vuex, { Store } from 'vuex'\nimport users from './users'\nimport apps from './apps'\nimport settings from './settings'\nimport oc from './oc'\nimport { showError } from '@nextcloud/dialogs'\n\nVue.use(Vuex)\n\nconst debug = process.env.NODE_ENV !== 'production'\n\nconst mutations = {\n\tAPI_FAILURE(state, error) {\n\t\ttry {\n\t\t\tconst message = error.error.response.data.ocs.meta.message\n\t\t\tshowError(t('settings', 'An error occurred during the request. Unable to proceed.') + '<br>' + message, { isHTML: true })\n\t\t} catch (e) {\n\t\t\tshowError(t('settings', 'An error occurred during the request. Unable to proceed.'))\n\t\t}\n\t\tconsole.error(state, error)\n\t},\n}\n\nexport default new Store({\n\tmodules: {\n\t\tusers,\n\t\tapps,\n\t\tsettings,\n\t\toc,\n\t},\n\tstrict: debug,\n\n\tmutations,\n})\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nconst state = {\n\tserverData: {},\n}\nconst mutations = {\n\tsetServerData(state, data) {\n\t\tstate.serverData = data\n\t},\n}\nconst getters = {\n\tgetServerData(state) {\n\t\treturn state.serverData\n\t},\n}\nconst actions = {}\n\nexport default { state, mutations, getters, actions }\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author rakekniven <mark.ziegler@rakekniven.de>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport Vue from 'vue'\nimport VTooltip from 'v-tooltip'\nimport { sync } from 'vuex-router-sync'\n\nimport App from './App.vue'\nimport router from './router'\nimport store from './store'\n\nVue.use(VTooltip, { defaultHtml: false })\n\nsync(store, router)\n\n// CSP config for webpack dynamic chunk loading\n// eslint-disable-next-line camelcase\n__webpack_nonce__ = btoa(OC.requestToken)\n\n// bind to window\nVue.prototype.t = t\nVue.prototype.n = n\nVue.prototype.OC = OC\nVue.prototype.OCA = OCA\n// eslint-disable-next-line camelcase\nVue.prototype.oc_userconfig = oc_userconfig\n\nconst app = new Vue({\n\trouter,\n\tstore,\n\trender: h => h(App),\n}).$mount('#content')\n\nexport { app, router, store }\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","__webpack_require__.amdD = function () {\n\tthrow new Error('define cannot be used indirect');\n};","__webpack_require__.amdO = {};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + {\"7418\":\"settings-apps-view\",\"8351\":\"settings-users\"}[chunkId] + \"-\" + chunkId + \".js?v=\" + {\"7418\":\"79a434bb85984935c596\",\"8351\":\"04e1d33f947711080615\"}[chunkId] + \"\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 8562;","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t8562: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [7874], function() { return __webpack_require__(78778); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","inProgress","dataWebpackPrefix","_h","this","$createElement","_self","_c","Users","Apps","Vue","Router","mode","base","generateUrl","linkActiveClass","routes","path","component","props","name","children","sanitize","url","replace","confirmPassword","options","axios","data","params","getLoggerBuilder","setApp","detectUser","build","orderGroups","groups","orderBy","sort","a","b","usercount","disabled","localeCompare","defaults","id","canAdd","canRemove","mutations","appendUsers","state","usersObj","users","concat","Object","keys","map","userid","usersOffset","usersLimit","setPasswordPolicyMinLength","length","minPasswordLength","initGroups","userCount","group","assign","addGroup","gid","displayName","find","push","e","console","error","renameGroup","groupIndex","findIndex","groupSearch","updatedGroup","splice","removeGroup","addUserGroup","user","enabled","removeUserGroup","indexOf","addUserSubAdmin","subadmin","removeUserSubAdmin","deleteUser","userIndex","commit","actionType","addUserData","response","ocs","enableDisableUser","updateUserCounts","disabledGroup","forEach","userGroup","logger","setUserData","key","value","humanValue","OC","Util","computerFileSize","resetUsers","CancelToken","searchRequestCancelSource","getters","getUsers","getGroups","getSubadminGroups","filter","getPasswordPolicyMinLength","getUsersOffset","getUsersLimit","getUserCount","actions","context","offset","limit","search","cancel","source","api","generateOcsUrl","encodeURIComponent","cancelToken","token","then","usersCount","catch","limitParam","getUsersFromList","getUsersFromGroup","groupid","groupId","getCapabilities","password_policy","minLength","wipeUserDevices","addUser","dispatch","password","email","quota","language","meta","statuscode","showError","t","userStatus","allowedEmpty","Promise","reject","Error","sendWelcomeMail","APPS_API_FAILURE","message","isHTML","initCategories","categories","updateCount","setUpdateCount","addCategory","category","appendCategories","categoriesArray","setAllApps","apps","setError","appId","Array","isArray","_id","app","clearError","enableApp","active","disableApp","removable","canUnInstall","uninstallApp","needsDownload","installed","canInstall","updateApp","version","update","resetApps","reset","startLoading","loading","stopLoading","appIds","_appId","update_required","showInfo","onClick","window","location","reload","close","setTimeout","forceEnableApp","getAllApps","getCategories","loadingList","getUpdateCount","setAppConfig","Vuex","API_FAILURE","Store","modules","settings","serverData","setServerData","getServerData","oc","strict","process","VTooltip","defaultHtml","sync","store","router","__webpack_nonce__","btoa","requestToken","n","OCA","oc_userconfig","render","h","App","$mount","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","loaded","__webpack_modules__","call","m","amdD","amdO","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","fulfilled","j","every","r","getter","__esModule","d","definition","o","defineProperty","enumerable","get","f","chunkId","all","reduce","promises","u","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","l","done","script","needAttach","scripts","document","getElementsByTagName","s","getAttribute","createElement","charset","timeout","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","bind","type","target","head","appendChild","Symbol","toStringTag","nmd","paths","scriptUrl","importScripts","currentScript","p","baseURI","self","href","installedChunks","installedChunkData","promise","resolve","errorType","realSrc","request","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file +{"version":3,"file":"settings-vue-settings-apps-users-management.js?v=621594b16a8925e874cd","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/webpack/runtime/load script","webpack:///nextcloud/apps/settings/src/App.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/settings/src/App.vue","webpack://nextcloud/./apps/settings/src/App.vue?536c","webpack:///nextcloud/apps/settings/src/App.vue?vue&type=template&id=50420604&","webpack:///nextcloud/apps/settings/src/router.js","webpack:///nextcloud/apps/settings/src/store/api.js","webpack:///nextcloud/apps/settings/src/logger.js","webpack:///nextcloud/apps/settings/src/store/users.js","webpack:///nextcloud/apps/settings/src/store/apps.js","webpack:///nextcloud/apps/settings/src/store/oc.js","webpack:///nextcloud/apps/settings/src/store/index.js","webpack:///nextcloud/apps/settings/src/store/settings.js","webpack:///nextcloud/apps/settings/src/main-apps-users-management.js","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/amd define","webpack:///nextcloud/webpack/runtime/amd options","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/ensure chunk","webpack:///nextcloud/webpack/runtime/get javascript chunk filename","webpack:///nextcloud/webpack/runtime/global","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/publicPath","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"nextcloud:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\t;\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","import mod from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","<!--\n - @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<router-view />\n</template>\n\n<script>\nexport default {\n\tname: 'App',\n\tbeforeMount() {\n\t\t// importing server data into the store\n\t\tconst serverDataElmt = document.getElementById('serverData')\n\t\tif (serverDataElmt !== null) {\n\t\t\tthis.$store.commit('setServerData', JSON.parse(document.getElementById('serverData').dataset.server))\n\t\t}\n\t},\n}\n</script>\n","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=50420604&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('router-view')}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Julius Härtl <jus@bitgrid.net>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport Vue from 'vue'\nimport Router from 'vue-router'\nimport { generateUrl } from '@nextcloud/router'\n\n// Dynamic loading\nconst Users = () => import(/* webpackChunkName: 'settings-users' */'./views/Users')\nconst Apps = () => import(/* webpackChunkName: 'settings-apps-view' */'./views/Apps')\n\nVue.use(Router)\n\n/*\n * This is the list of routes where the vuejs app will\n * take over php to provide data\n * You need to forward the php routing (routes.php) to\n * the settings-vue template, where the vue-router will\n * ensure the proper route.\n * ⚠️ Routes needs to match the php routes.\n */\n\nexport default new Router({\n\tmode: 'history',\n\t// if index.php is in the url AND we got this far, then it's working:\n\t// let's keep using index.php in the url\n\tbase: generateUrl(''),\n\tlinkActiveClass: 'active',\n\troutes: [\n\t\t{\n\t\t\tpath: '/:index(index.php/)?settings/users',\n\t\t\tcomponent: Users,\n\t\t\tprops: true,\n\t\t\tname: 'users',\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tpath: ':selectedGroup',\n\t\t\t\t\tname: 'group',\n\t\t\t\t\tcomponent: Users,\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tpath: '/:index(index.php/)?settings/apps',\n\t\t\tcomponent: Apps,\n\t\t\tprops: true,\n\t\t\tname: 'apps',\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tpath: ':category',\n\t\t\t\t\tname: 'apps-category',\n\t\t\t\t\tcomponent: Apps,\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: ':id',\n\t\t\t\t\t\t\tname: 'apps-details',\n\t\t\t\t\t\t\tcomponent: Apps,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t],\n})\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author Christoph Wurst <christoph@winzerhof-wurst.at>\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Julius Härtl <jus@bitgrid.net>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n * @author Sujith Haridasan <sujith.h@gmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport axios from '@nextcloud/axios'\nimport confirmPassword from '@nextcloud/password-confirmation'\n\nconst sanitize = function(url) {\n\treturn url.replace(/\\/$/, '') // Remove last url slash\n}\n\nexport default {\n\n\t/**\n\t * This Promise is used to chain a request that require an admin password confirmation\n\t * Since chaining Promise have a very precise behavior concerning catch and then,\n\t * you'll need to be careful when using it.\n\t * e.g\n\t * // store\n\t * action(context) {\n\t * return api.requireAdmin().then((response) => {\n\t * return api.get('url')\n\t * .then((response) => {API success})\n\t * .catch((error) => {API failure});\n\t * }).catch((error) => {requireAdmin failure});\n\t * }\n\t * // vue\n\t * this.$store.dispatch('action').then(() => {always executed})\n\t *\n\t * Since Promise.then().catch().then() will always execute the last then\n\t * this.$store.dispatch('action').then will always be executed\n\t *\n\t * If you want requireAdmin failure to also catch the API request failure\n\t * you will need to throw a new error in the api.get.catch()\n\t *\n\t * e.g\n\t * api.requireAdmin().then((response) => {\n\t * api.get('url')\n\t * .then((response) => {API success})\n\t * .catch((error) => {throw error;});\n\t * }).catch((error) => {requireAdmin OR API failure});\n\t *\n\t * @return {Promise}\n\t */\n\trequireAdmin() {\n\t\treturn confirmPassword()\n\t},\n\tget(url, options) {\n\t\treturn axios.get(sanitize(url), options)\n\t},\n\tpost(url, data) {\n\t\treturn axios.post(sanitize(url), data)\n\t},\n\tpatch(url, data) {\n\t\treturn axios.patch(sanitize(url), data)\n\t},\n\tput(url, data) {\n\t\treturn axios.put(sanitize(url), data)\n\t},\n\tdelete(url, data) {\n\t\treturn axios.delete(sanitize(url), { params: data })\n\t},\n}\n","/**\n * @copyright 2020 Christoph Wurst <christoph@winzerhof-wurst.at>\n *\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { getLoggerBuilder } from '@nextcloud/logger'\n\nexport default getLoggerBuilder()\n\t.setApp('settings')\n\t.detectUser()\n\t.build()\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author Arthur Schiwon <blizzz@arthur-schiwon.de>\n * @author Christoph Wurst <christoph@winzerhof-wurst.at>\n * @author Daniel Calviño Sánchez <danxuliu@gmail.com>\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Julius Härtl <jus@bitgrid.net>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n * @author Vincent Petry <vincent@nextcloud.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport api from './api'\nimport axios from '@nextcloud/axios'\nimport { generateOcsUrl } from '@nextcloud/router'\nimport logger from '../logger'\nimport { showError } from '@nextcloud/dialogs'\n\nconst orderGroups = function(groups, orderBy) {\n\t/* const SORT_USERCOUNT = 1;\n\t * const SORT_GROUPNAME = 2;\n\t * https://github.com/nextcloud/server/blob/208e38e84e1a07a49699aa90dc5b7272d24489f0/lib/private/Group/MetaData.php#L34\n\t */\n\tif (orderBy === 1) {\n\t\treturn groups.sort((a, b) => a.usercount - a.disabled < b.usercount - b.disabled)\n\t} else {\n\t\treturn groups.sort((a, b) => a.name.localeCompare(b.name))\n\t}\n}\n\nconst defaults = {\n\tgroup: {\n\t\tid: '',\n\t\tname: '',\n\t\tusercount: 0,\n\t\tdisabled: 0,\n\t\tcanAdd: true,\n\t\tcanRemove: true,\n\t},\n}\n\nconst state = {\n\tusers: [],\n\tgroups: [],\n\torderBy: 1,\n\tminPasswordLength: 0,\n\tusersOffset: 0,\n\tusersLimit: 25,\n\tuserCount: 0,\n}\n\nconst mutations = {\n\tappendUsers(state, usersObj) {\n\t\t// convert obj to array\n\t\tconst users = state.users.concat(Object.keys(usersObj).map(userid => usersObj[userid]))\n\t\tstate.usersOffset += state.usersLimit\n\t\tstate.users = users\n\t},\n\tsetPasswordPolicyMinLength(state, length) {\n\t\tstate.minPasswordLength = length !== '' ? length : 0\n\t},\n\tinitGroups(state, { groups, orderBy, userCount }) {\n\t\tstate.groups = groups.map(group => Object.assign({}, defaults.group, group))\n\t\tstate.orderBy = orderBy\n\t\tstate.userCount = userCount\n\t\tstate.groups = orderGroups(state.groups, state.orderBy)\n\n\t},\n\taddGroup(state, { gid, displayName }) {\n\t\ttry {\n\t\t\tif (typeof state.groups.find((group) => group.id === gid) !== 'undefined') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// extend group to default values\n\t\t\tconst group = Object.assign({}, defaults.group, {\n\t\t\t\tid: gid,\n\t\t\t\tname: displayName,\n\t\t\t})\n\t\t\tstate.groups.push(group)\n\t\t\tstate.groups = orderGroups(state.groups, state.orderBy)\n\t\t} catch (e) {\n\t\t\tconsole.error('Can\\'t create group', e)\n\t\t}\n\t},\n\trenameGroup(state, { gid, displayName }) {\n\t\tconst groupIndex = state.groups.findIndex(groupSearch => groupSearch.id === gid)\n\t\tif (groupIndex >= 0) {\n\t\t\tconst updatedGroup = state.groups[groupIndex]\n\t\t\tupdatedGroup.name = displayName\n\t\t\tstate.groups.splice(groupIndex, 1, updatedGroup)\n\t\t\tstate.groups = orderGroups(state.groups, state.orderBy)\n\t\t}\n\t},\n\tremoveGroup(state, gid) {\n\t\tconst groupIndex = state.groups.findIndex(groupSearch => groupSearch.id === gid)\n\t\tif (groupIndex >= 0) {\n\t\t\tstate.groups.splice(groupIndex, 1)\n\t\t}\n\t},\n\taddUserGroup(state, { userid, gid }) {\n\t\tconst group = state.groups.find(groupSearch => groupSearch.id === gid)\n\t\tconst user = state.users.find(user => user.id === userid)\n\t\t// increase count if user is enabled\n\t\tif (group && user.enabled && state.userCount > 0) {\n\t\t\tgroup.usercount++\n\t\t}\n\t\tconst groups = user.groups\n\t\tgroups.push(gid)\n\t\tstate.groups = orderGroups(state.groups, state.orderBy)\n\t},\n\tremoveUserGroup(state, { userid, gid }) {\n\t\tconst group = state.groups.find(groupSearch => groupSearch.id === gid)\n\t\tconst user = state.users.find(user => user.id === userid)\n\t\t// lower count if user is enabled\n\t\tif (group && user.enabled && state.userCount > 0) {\n\t\t\tgroup.usercount--\n\t\t}\n\t\tconst groups = user.groups\n\t\tgroups.splice(groups.indexOf(gid), 1)\n\t\tstate.groups = orderGroups(state.groups, state.orderBy)\n\t},\n\taddUserSubAdmin(state, { userid, gid }) {\n\t\tconst groups = state.users.find(user => user.id === userid).subadmin\n\t\tgroups.push(gid)\n\t},\n\tremoveUserSubAdmin(state, { userid, gid }) {\n\t\tconst groups = state.users.find(user => user.id === userid).subadmin\n\t\tgroups.splice(groups.indexOf(gid), 1)\n\t},\n\tdeleteUser(state, userid) {\n\t\tconst userIndex = state.users.findIndex(user => user.id === userid)\n\t\tthis.commit('updateUserCounts', { user: state.users[userIndex], actionType: 'remove' })\n\t\tstate.users.splice(userIndex, 1)\n\t},\n\taddUserData(state, response) {\n\t\tconst user = response.data.ocs.data\n\t\tstate.users.push(user)\n\t\tthis.commit('updateUserCounts', { user, actionType: 'create' })\n\t},\n\tenableDisableUser(state, { userid, enabled }) {\n\t\tconst user = state.users.find(user => user.id === userid)\n\t\tuser.enabled = enabled\n\t\tthis.commit('updateUserCounts', { user, actionType: enabled ? 'enable' : 'disable' })\n\t},\n\t// update active/disabled counts, groups counts\n\tupdateUserCounts(state, { user, actionType }) {\n\t\tconst disabledGroup = state.groups.find(group => group.id === 'disabled')\n\t\tswitch (actionType) {\n\t\tcase 'enable':\n\t\tcase 'disable':\n\t\t\tdisabledGroup.usercount += user.enabled ? -1 : 1 // update Disabled Users count\n\t\t\tstate.userCount += user.enabled ? 1 : -1 // update Active Users count\n\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\tconst group = state.groups.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\tgroup.disabled += user.enabled ? -1 : 1 // update group disabled count\n\t\t\t})\n\t\t\tbreak\n\t\tcase 'create':\n\t\t\tstate.userCount++ // increment Active Users count\n\n\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\tstate.groups\n\t\t\t\t\t.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\t .usercount++ // increment group total count\n\t\t\t})\n\t\t\tbreak\n\t\tcase 'remove':\n\t\t\tif (user.enabled) {\n\t\t\t\tstate.userCount-- // decrement Active Users count\n\t\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\t\tconst group = state.groups.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\t\tgroup.usercount-- // decrement group total count\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tdisabledGroup.usercount-- // decrement Disabled Users count\n\t\t\t\tuser.groups.forEach(userGroup => {\n\t\t\t\t\tconst group = state.groups.find(groupSearch => groupSearch.id === userGroup)\n\t\t\t\t\tgroup.disabled-- // decrement group disabled count\n\t\t\t\t})\n\t\t\t}\n\t\t\tbreak\n\t\tdefault:\n\t\t\tlogger.error(`Unknown action type in updateUserCounts: '${actionType}'`)\n\t\t\t// not throwing error to interupt execution as this is not fatal\n\t\t}\n\t},\n\tsetUserData(state, { userid, key, value }) {\n\t\tif (key === 'quota') {\n\t\t\tconst humanValue = OC.Util.computerFileSize(value)\n\t\t\tstate.users.find(user => user.id === userid)[key][key] = humanValue !== null ? humanValue : value\n\t\t} else {\n\t\t\tstate.users.find(user => user.id === userid)[key] = value\n\t\t}\n\t},\n\n\t/**\n\t * Reset users list\n\t *\n\t * @param {object} state the store state\n\t */\n\tresetUsers(state) {\n\t\tstate.users = []\n\t\tstate.usersOffset = 0\n\t},\n}\n\nconst getters = {\n\tgetUsers(state) {\n\t\treturn state.users\n\t},\n\tgetGroups(state) {\n\t\treturn state.groups\n\t},\n\tgetSubadminGroups(state) {\n\t\t// Can't be subadmin of admin or disabled\n\t\treturn state.groups.filter(group => group.id !== 'admin' && group.id !== 'disabled')\n\t},\n\tgetPasswordPolicyMinLength(state) {\n\t\treturn state.minPasswordLength\n\t},\n\tgetUsersOffset(state) {\n\t\treturn state.usersOffset\n\t},\n\tgetUsersLimit(state) {\n\t\treturn state.usersLimit\n\t},\n\tgetUserCount(state) {\n\t\treturn state.userCount\n\t},\n}\n\nconst CancelToken = axios.CancelToken\nlet searchRequestCancelSource = null\n\nconst actions = {\n\n\t/**\n\t * Get all users with full details\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param {string} options.search Search amongst users\n\t * @param {string} options.group Get users from group\n\t * @return {Promise}\n\t */\n\tgetUsers(context, { offset, limit, search, group }) {\n\t\tif (searchRequestCancelSource) {\n\t\t\tsearchRequestCancelSource.cancel('Operation canceled by another search request.')\n\t\t}\n\t\tsearchRequestCancelSource = CancelToken.source()\n\t\tsearch = typeof search === 'string' ? search : ''\n\t\tgroup = typeof group === 'string' ? group : ''\n\t\tif (group !== '') {\n\t\t\treturn api.get(generateOcsUrl('cloud/groups/{group}/users/details?offset={offset}&limit={limit}&search={search}', { group: encodeURIComponent(group), offset, limit, search }), {\n\t\t\t\tcancelToken: searchRequestCancelSource.token,\n\t\t\t})\n\t\t\t\t.then((response) => {\n\t\t\t\t\tconst usersCount = Object.keys(response.data.ocs.data.users).length\n\t\t\t\t\tif (usersCount > 0) {\n\t\t\t\t\t\tcontext.commit('appendUsers', response.data.ocs.data.users)\n\t\t\t\t\t}\n\t\t\t\t\treturn usersCount\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tif (!axios.isCancel(error)) {\n\t\t\t\t\t\tcontext.commit('API_FAILURE', error)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t}\n\n\t\treturn api.get(generateOcsUrl('cloud/users/details?offset={offset}&limit={limit}&search={search}', { offset, limit, search }), {\n\t\t\tcancelToken: searchRequestCancelSource.token,\n\t\t})\n\t\t\t.then((response) => {\n\t\t\t\tconst usersCount = Object.keys(response.data.ocs.data.users).length\n\t\t\t\tif (usersCount > 0) {\n\t\t\t\t\tcontext.commit('appendUsers', response.data.ocs.data.users)\n\t\t\t\t}\n\t\t\t\treturn usersCount\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tif (!axios.isCancel(error)) {\n\t\t\t\t\tcontext.commit('API_FAILURE', error)\n\t\t\t\t}\n\t\t\t})\n\t},\n\n\tgetGroups(context, { offset, limit, search }) {\n\t\tsearch = typeof search === 'string' ? search : ''\n\t\tconst limitParam = limit === -1 ? '' : `&limit=${limit}`\n\t\treturn api.get(generateOcsUrl('cloud/groups?offset={offset}&search={search}', { offset, search }) + limitParam)\n\t\t\t.then((response) => {\n\t\t\t\tif (Object.keys(response.data.ocs.data.groups).length > 0) {\n\t\t\t\t\tresponse.data.ocs.data.groups.forEach(function(group) {\n\t\t\t\t\t\tcontext.commit('addGroup', { gid: group, displayName: group })\n\t\t\t\t\t})\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t})\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\t/**\n\t * Get all users with full details\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param {string} options.search -\n\t * @return {Promise}\n\t */\n\tgetUsersFromList(context, { offset, limit, search }) {\n\t\tsearch = typeof search === 'string' ? search : ''\n\t\treturn api.get(generateOcsUrl('cloud/users/details?offset={offset}&limit={limit}&search={search}', { offset, limit, search }))\n\t\t\t.then((response) => {\n\t\t\t\tif (Object.keys(response.data.ocs.data.users).length > 0) {\n\t\t\t\t\tcontext.commit('appendUsers', response.data.ocs.data.users)\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t})\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\t/**\n\t * Get all users with full details from a groupid\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {number} options.offset List offset to request\n\t * @param {number} options.limit List number to return from offset\n\t * @param {string} options.groupid -\n\t * @return {Promise}\n\t */\n\tgetUsersFromGroup(context, { groupid, offset, limit }) {\n\t\treturn api.get(generateOcsUrl('cloud/users/{groupId}/details?offset={offset}&limit={limit}', { groupId: encodeURIComponent(groupid), offset, limit }))\n\t\t\t.then((response) => context.commit('getUsersFromList', response.data.ocs.data.users))\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\tgetPasswordPolicyMinLength(context) {\n\t\tif (OC.getCapabilities().password_policy && OC.getCapabilities().password_policy.minLength) {\n\t\t\tcontext.commit('setPasswordPolicyMinLength', OC.getCapabilities().password_policy.minLength)\n\t\t\treturn OC.getCapabilities().password_policy.minLength\n\t\t}\n\t\treturn false\n\t},\n\n\t/**\n\t * Add group\n\t *\n\t * @param {object} context store context\n\t * @param {string} gid Group id\n\t * @return {Promise}\n\t */\n\taddGroup(context, gid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/groups'), { groupid: gid })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('addGroup', { gid, displayName: gid })\n\t\t\t\t\treturn { gid, displayName: gid }\n\t\t\t\t})\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tcontext.commit('API_FAILURE', { gid, error })\n\t\t\t// let's throw one more time to prevent the view\n\t\t\t// from adding the user to a group that doesn't exists\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Rename group\n\t *\n\t * @param {Object} context store context\n\t * @param {string} groupid Group id\n\t * @param {string} displayName Group display name\n\t * @return {Promise}\n\t */\n\trenameGroup(context, { groupid, displayName }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.put(generateOcsUrl('cloud/groups/{groupId}', { groupId: encodeURIComponent(groupid) }), { key: 'displayname', value: displayName })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('renameGroup', { gid: groupid, displayName })\n\t\t\t\t\treturn { groupid, displayName }\n\t\t\t\t})\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tcontext.commit('API_FAILURE', { groupid, error })\n\t\t\t// let's throw one more time to prevent the view\n\t\t\t// from renaming the group\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Remove group\n\t *\n\t * @param {object} context store context\n\t * @param {string} gid Group id\n\t * @return {Promise}\n\t */\n\tremoveGroup(context, gid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/groups/{groupId}', { groupId: encodeURIComponent(gid) }))\n\t\t\t\t.then((response) => context.commit('removeGroup', gid))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { gid, error }))\n\t},\n\n\t/**\n\t * Add user to group\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\taddUserGroup(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users/{userid}/groups', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('addUserGroup', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Remove user from group\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\tremoveUserGroup(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/users/{userid}/groups', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('removeUserGroup', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tcontext.commit('API_FAILURE', { userid, error })\n\t\t\t// let's throw one more time to prevent\n\t\t\t// the view from removing the user row on failure\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Add user to group admin\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\taddUserSubAdmin(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users/{userid}/subadmins', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('addUserSubAdmin', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Remove user from group admin\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.gid Group id\n\t * @return {Promise}\n\t */\n\tremoveUserSubAdmin(context, { userid, gid }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/users/{userid}/subadmins', { userid }), { groupid: gid })\n\t\t\t\t.then((response) => context.commit('removeUserSubAdmin', { userid, gid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Mark all user devices for remote wipe\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\twipeUserDevices(context, userid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users/{userid}/wipe', { userid }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Delete a user\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\tdeleteUser(context, userid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.delete(generateOcsUrl('cloud/users/{userid}', { userid }))\n\t\t\t\t.then((response) => context.commit('deleteUser', userid))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Add a user\n\t *\n\t * @param {object} context store context\n\t * @param {Function} context.commit -\n\t * @param {Function} context.dispatch -\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.password User password\n\t * @param {string} options.displayName User display name\n\t * @param {string} options.email User email\n\t * @param {string} options.groups User groups\n\t * @param {string} options.subadmin User subadmin groups\n\t * @param {string} options.quota User email\n\t * @param {string} options.language User language\n\t * @return {Promise}\n\t */\n\taddUser({ commit, dispatch }, { userid, password, displayName, email, groups, subadmin, quota, language }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users'), { userid, password, displayName, email, groups, subadmin, quota, language })\n\t\t\t\t.then((response) => dispatch('addUserData', userid || response.data.ocs.data.id))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => {\n\t\t\tconst statusCode = error?.response?.data?.ocs?.meta?.statuscode\n\n\t\t\tif (statusCode === 102) {\n\t\t\t\tshowError(t('settings', 'User already exists.'))\n\t\t\t\tthrow error\n\t\t\t}\n\n\t\t\tcommit('API_FAILURE', { userid, error })\n\t\t\tthrow error\n\t\t})\n\t},\n\n\t/**\n\t * Get user data and commit addition\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\taddUserData(context, userid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.get(generateOcsUrl('cloud/users/{userid}', { userid }))\n\t\t\t\t.then((response) => context.commit('addUserData', response))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Enable or disable user\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {boolean} options.enabled User enablement status\n\t * @return {Promise}\n\t */\n\tenableDisableUser(context, { userid, enabled = true }) {\n\t\tconst userStatus = enabled ? 'enable' : 'disable'\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.put(generateOcsUrl('cloud/users/{userid}/{userStatus}', { userid, userStatus }))\n\t\t\t\t.then((response) => context.commit('enableDisableUser', { userid, enabled }))\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n\n\t/**\n\t * Edit user data\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.userid User id\n\t * @param {string} options.key User field to edit\n\t * @param {string} options.value Value of the change\n\t * @return {Promise}\n\t */\n\tsetUserData(context, { userid, key, value }) {\n\t\tconst allowedEmpty = ['email', 'displayname']\n\t\tif (['email', 'language', 'quota', 'displayname', 'password'].indexOf(key) !== -1) {\n\t\t\t// We allow empty email or displayname\n\t\t\tif (typeof value === 'string'\n\t\t\t\t&& (\n\t\t\t\t\t(allowedEmpty.indexOf(key) === -1 && value.length > 0)\n\t\t\t\t\t|| allowedEmpty.indexOf(key) !== -1\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn api.requireAdmin().then((response) => {\n\t\t\t\t\treturn api.put(generateOcsUrl('cloud/users/{userid}', { userid }), { key, value })\n\t\t\t\t\t\t.then((response) => context.commit('setUserData', { userid, key, value }))\n\t\t\t\t\t\t.catch((error) => { throw error })\n\t\t\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t\t\t}\n\t\t}\n\t\treturn Promise.reject(new Error('Invalid request data'))\n\t},\n\n\t/**\n\t * Send welcome mail\n\t *\n\t * @param {object} context store context\n\t * @param {string} userid User id\n\t * @return {Promise}\n\t */\n\tsendWelcomeMail(context, userid) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('cloud/users/{userid}/welcome', { userid }))\n\t\t\t\t.then(response => true)\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { userid, error }))\n\t},\n}\n\nexport default { state, mutations, getters, actions }\n","/**\n * @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Julius Härtl <jus@bitgrid.net>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport api from './api'\nimport Vue from 'vue'\nimport { generateUrl } from '@nextcloud/router'\nimport { showError, showInfo } from '@nextcloud/dialogs'\nimport '@nextcloud/dialogs/styles/toast.scss'\n\nconst state = {\n\tapps: [],\n\tcategories: [],\n\tupdateCount: 0,\n\tloading: {},\n\tloadingList: false,\n}\n\nconst mutations = {\n\n\tAPPS_API_FAILURE(state, error) {\n\t\tshowError(t('settings', 'An error occured during the request. Unable to proceed.') + '<br>' + error.error.response.data.data.message, { isHTML: true })\n\t\tconsole.error(state, error)\n\t},\n\n\tinitCategories(state, { categories, updateCount }) {\n\t\tstate.categories = categories\n\t\tstate.updateCount = updateCount\n\t},\n\n\tsetUpdateCount(state, updateCount) {\n\t\tstate.updateCount = updateCount\n\t},\n\n\taddCategory(state, category) {\n\t\tstate.categories.push(category)\n\t},\n\n\tappendCategories(state, categoriesArray) {\n\t\t// convert obj to array\n\t\tstate.categories = categoriesArray\n\t},\n\n\tsetAllApps(state, apps) {\n\t\tstate.apps = apps\n\t},\n\n\tsetError(state, { appId, error }) {\n\t\tif (!Array.isArray(appId)) {\n\t\t\tappId = [appId]\n\t\t}\n\t\tappId.forEach((_id) => {\n\t\t\tconst app = state.apps.find(app => app.id === _id)\n\t\t\tapp.error = error\n\t\t})\n\t},\n\n\tclearError(state, { appId, error }) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tapp.error = null\n\t},\n\n\tenableApp(state, { appId, groups }) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tapp.active = true\n\t\tapp.groups = groups\n\t},\n\n\tdisableApp(state, appId) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tapp.active = false\n\t\tapp.groups = []\n\t\tif (app.removable) {\n\t\t\tapp.canUnInstall = true\n\t\t}\n\t},\n\n\tuninstallApp(state, appId) {\n\t\tstate.apps.find(app => app.id === appId).active = false\n\t\tstate.apps.find(app => app.id === appId).groups = []\n\t\tstate.apps.find(app => app.id === appId).needsDownload = true\n\t\tstate.apps.find(app => app.id === appId).installed = false\n\t\tstate.apps.find(app => app.id === appId).canUnInstall = false\n\t\tstate.apps.find(app => app.id === appId).canInstall = true\n\t},\n\n\tupdateApp(state, appId) {\n\t\tconst app = state.apps.find(app => app.id === appId)\n\t\tconst version = app.update\n\t\tapp.update = null\n\t\tapp.version = version\n\t\tstate.updateCount--\n\n\t},\n\n\tresetApps(state) {\n\t\tstate.apps = []\n\t},\n\treset(state) {\n\t\tstate.apps = []\n\t\tstate.categories = []\n\t\tstate.updateCount = 0\n\t},\n\tstartLoading(state, id) {\n\t\tif (Array.isArray(id)) {\n\t\t\tid.forEach((_id) => {\n\t\t\t\tVue.set(state.loading, _id, true)\n\t\t\t})\n\t\t} else {\n\t\t\tVue.set(state.loading, id, true)\n\t\t}\n\t},\n\tstopLoading(state, id) {\n\t\tif (Array.isArray(id)) {\n\t\t\tid.forEach((_id) => {\n\t\t\t\tVue.set(state.loading, _id, false)\n\t\t\t})\n\t\t} else {\n\t\t\tVue.set(state.loading, id, false)\n\t\t}\n\t},\n}\n\nconst getters = {\n\tloading(state) {\n\t\treturn function(id) {\n\t\t\treturn state.loading[id]\n\t\t}\n\t},\n\tgetCategories(state) {\n\t\treturn state.categories\n\t},\n\tgetAllApps(state) {\n\t\treturn state.apps\n\t},\n\tgetUpdateCount(state) {\n\t\treturn state.updateCount\n\t},\n}\n\nconst actions = {\n\n\tenableApp(context, { appId, groups }) {\n\t\tlet apps\n\t\tif (Array.isArray(appId)) {\n\t\t\tapps = appId\n\t\t} else {\n\t\t\tapps = [appId]\n\t\t}\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', apps)\n\t\t\tcontext.commit('startLoading', 'install')\n\t\t\treturn api.post(generateUrl('settings/apps/enable'), { appIds: apps, groups })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tapps.forEach(_appId => {\n\t\t\t\t\t\tcontext.commit('enableApp', { appId: _appId, groups })\n\t\t\t\t\t})\n\n\t\t\t\t\t// check for server health\n\t\t\t\t\treturn api.get(generateUrl('apps/files'))\n\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\tif (response.data.update_required) {\n\t\t\t\t\t\t\t\tshowInfo(\n\t\t\t\t\t\t\t\t\tt(\n\t\t\t\t\t\t\t\t\t\t'settings',\n\t\t\t\t\t\t\t\t\t\t'The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds.'\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tonClick: () => window.location.reload(),\n\t\t\t\t\t\t\t\t\t\tclose: false,\n\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\t\tlocation.reload()\n\t\t\t\t\t\t\t\t}, 5000)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch(() => {\n\t\t\t\t\t\t\tif (!Array.isArray(appId)) {\n\t\t\t\t\t\t\t\tcontext.commit('setError', {\n\t\t\t\t\t\t\t\t\tappId: apps,\n\t\t\t\t\t\t\t\t\terror: t('settings', 'Error: This app cannot be enabled because it makes the server unstable'),\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('setError', {\n\t\t\t\t\t\tappId: apps,\n\t\t\t\t\t\terror: error.response.data.data.message,\n\t\t\t\t\t})\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\tforceEnableApp(context, { appId, groups }) {\n\t\tlet apps\n\t\tif (Array.isArray(appId)) {\n\t\t\tapps = appId\n\t\t} else {\n\t\t\tapps = [appId]\n\t\t}\n\t\treturn api.requireAdmin().then(() => {\n\t\t\tcontext.commit('startLoading', apps)\n\t\t\tcontext.commit('startLoading', 'install')\n\t\t\treturn api.post(generateUrl('settings/apps/force'), { appId })\n\t\t\t\t.then((response) => {\n\t\t\t\t\t// TODO: find a cleaner solution\n\t\t\t\t\tlocation.reload()\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('setError', {\n\t\t\t\t\t\tappId: apps,\n\t\t\t\t\t\terror: error.response.data.data.message,\n\t\t\t\t\t})\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\tdisableApp(context, { appId }) {\n\t\tlet apps\n\t\tif (Array.isArray(appId)) {\n\t\t\tapps = appId\n\t\t} else {\n\t\t\tapps = [appId]\n\t\t}\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', apps)\n\t\t\treturn api.post(generateUrl('settings/apps/disable'), { appIds: apps })\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tapps.forEach(_appId => {\n\t\t\t\t\t\tcontext.commit('disableApp', _appId)\n\t\t\t\t\t})\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', apps)\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\tuninstallApp(context, { appId }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', appId)\n\t\t\treturn api.get(generateUrl(`settings/apps/uninstall/${appId}`))\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('uninstallApp', appId)\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\n\tupdateApp(context, { appId }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\tcontext.commit('startLoading', appId)\n\t\t\tcontext.commit('startLoading', 'install')\n\t\t\treturn api.get(generateUrl(`settings/apps/update/${appId}`))\n\t\t\t\t.then((response) => {\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('updateApp', appId)\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tcontext.commit('stopLoading', appId)\n\t\t\t\t\tcontext.commit('stopLoading', 'install')\n\t\t\t\t\tcontext.commit('APPS_API_FAILURE', { appId, error })\n\t\t\t\t})\n\t\t}).catch((error) => context.commit('API_FAILURE', { appId, error }))\n\t},\n\n\tgetAllApps(context) {\n\t\tcontext.commit('startLoading', 'list')\n\t\treturn api.get(generateUrl('settings/apps/list'))\n\t\t\t.then((response) => {\n\t\t\t\tcontext.commit('setAllApps', response.data.apps)\n\t\t\t\tcontext.commit('stopLoading', 'list')\n\t\t\t\treturn true\n\t\t\t})\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n\tgetCategories(context) {\n\t\tcontext.commit('startLoading', 'categories')\n\t\treturn api.get(generateUrl('settings/apps/categories'))\n\t\t\t.then((response) => {\n\t\t\t\tif (response.data.length > 0) {\n\t\t\t\t\tcontext.commit('appendCategories', response.data)\n\t\t\t\t\tcontext.commit('stopLoading', 'categories')\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t})\n\t\t\t.catch((error) => context.commit('API_FAILURE', error))\n\t},\n\n}\n\nexport default { state, mutations, getters, actions }\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport api from './api'\nimport { generateOcsUrl } from '@nextcloud/router'\n\nconst state = {}\nconst mutations = {}\nconst getters = {}\nconst actions = {\n\t/**\n\t * Set application config in database\n\t *\n\t * @param {object} context store context\n\t * @param {object} options destructuring object\n\t * @param {string} options.app Application name\n\t * @param {boolean} options.key Config key\n\t * @param {boolean} options.value Value to set\n\t * @return {Promise}\n\t */\n\tsetAppConfig(context, { app, key, value }) {\n\t\treturn api.requireAdmin().then((response) => {\n\t\t\treturn api.post(generateOcsUrl('apps/provisioning_api/api/v1/config/apps/{app}/{key}', { app, key }), { value })\n\t\t\t\t.catch((error) => { throw error })\n\t\t}).catch((error) => context.commit('API_FAILURE', { app, key, value, error }))\n\t},\n}\n\nexport default { state, mutations, getters, actions }\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Julius Härtl <jus@bitgrid.net>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport Vue from 'vue'\nimport Vuex, { Store } from 'vuex'\nimport users from './users'\nimport apps from './apps'\nimport settings from './settings'\nimport oc from './oc'\nimport { showError } from '@nextcloud/dialogs'\n\nVue.use(Vuex)\n\nconst debug = process.env.NODE_ENV !== 'production'\n\nconst mutations = {\n\tAPI_FAILURE(state, error) {\n\t\ttry {\n\t\t\tconst message = error.error.response.data.ocs.meta.message\n\t\t\tshowError(t('settings', 'An error occurred during the request. Unable to proceed.') + '<br>' + message, { isHTML: true })\n\t\t} catch (e) {\n\t\t\tshowError(t('settings', 'An error occurred during the request. Unable to proceed.'))\n\t\t}\n\t\tconsole.error(state, error)\n\t},\n}\n\nexport default new Store({\n\tmodules: {\n\t\tusers,\n\t\tapps,\n\t\tsettings,\n\t\toc,\n\t},\n\tstrict: debug,\n\n\tmutations,\n})\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nconst state = {\n\tserverData: {},\n}\nconst mutations = {\n\tsetServerData(state, data) {\n\t\tstate.serverData = data\n\t},\n}\nconst getters = {\n\tgetServerData(state) {\n\t\treturn state.serverData\n\t},\n}\nconst actions = {}\n\nexport default { state, mutations, getters, actions }\n","/**\n * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author rakekniven <mark.ziegler@rakekniven.de>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport Vue from 'vue'\nimport VTooltip from 'v-tooltip'\nimport { sync } from 'vuex-router-sync'\n\nimport App from './App.vue'\nimport router from './router'\nimport store from './store'\n\nVue.use(VTooltip, { defaultHtml: false })\n\nsync(store, router)\n\n// CSP config for webpack dynamic chunk loading\n// eslint-disable-next-line camelcase\n__webpack_nonce__ = btoa(OC.requestToken)\n\n// bind to window\nVue.prototype.t = t\nVue.prototype.n = n\nVue.prototype.OC = OC\nVue.prototype.OCA = OCA\n// eslint-disable-next-line camelcase\nVue.prototype.oc_userconfig = oc_userconfig\n\nconst app = new Vue({\n\trouter,\n\tstore,\n\trender: h => h(App),\n}).$mount('#content')\n\nexport { app, router, store }\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","__webpack_require__.amdD = function () {\n\tthrow new Error('define cannot be used indirect');\n};","__webpack_require__.amdO = {};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + {\"7418\":\"settings-apps-view\",\"8351\":\"settings-users\"}[chunkId] + \"-\" + chunkId + \".js?v=\" + {\"7418\":\"a58f27a0cd6f99595ea8\",\"8351\":\"04e1d33f947711080615\"}[chunkId] + \"\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 8562;","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t8562: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [7874], function() { return __webpack_require__(78778); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","inProgress","dataWebpackPrefix","_h","this","$createElement","_self","_c","Users","Apps","Vue","Router","mode","base","generateUrl","linkActiveClass","routes","path","component","props","name","children","sanitize","url","replace","confirmPassword","options","axios","data","params","getLoggerBuilder","setApp","detectUser","build","orderGroups","groups","orderBy","sort","a","b","usercount","disabled","localeCompare","defaults","id","canAdd","canRemove","mutations","appendUsers","state","usersObj","users","concat","Object","keys","map","userid","usersOffset","usersLimit","setPasswordPolicyMinLength","length","minPasswordLength","initGroups","userCount","group","assign","addGroup","gid","displayName","find","push","e","console","error","renameGroup","groupIndex","findIndex","groupSearch","updatedGroup","splice","removeGroup","addUserGroup","user","enabled","removeUserGroup","indexOf","addUserSubAdmin","subadmin","removeUserSubAdmin","deleteUser","userIndex","commit","actionType","addUserData","response","ocs","enableDisableUser","updateUserCounts","disabledGroup","forEach","userGroup","logger","setUserData","key","value","humanValue","OC","Util","computerFileSize","resetUsers","CancelToken","searchRequestCancelSource","getters","getUsers","getGroups","getSubadminGroups","filter","getPasswordPolicyMinLength","getUsersOffset","getUsersLimit","getUserCount","actions","context","offset","limit","search","cancel","source","api","generateOcsUrl","encodeURIComponent","cancelToken","token","then","usersCount","catch","limitParam","getUsersFromList","getUsersFromGroup","groupid","groupId","getCapabilities","password_policy","minLength","wipeUserDevices","addUser","dispatch","password","email","quota","language","meta","statuscode","showError","t","userStatus","allowedEmpty","Promise","reject","Error","sendWelcomeMail","APPS_API_FAILURE","message","isHTML","initCategories","categories","updateCount","setUpdateCount","addCategory","category","appendCategories","categoriesArray","setAllApps","apps","setError","appId","Array","isArray","_id","app","clearError","enableApp","active","disableApp","removable","canUnInstall","uninstallApp","needsDownload","installed","canInstall","updateApp","version","update","resetApps","reset","startLoading","loading","stopLoading","appIds","_appId","update_required","showInfo","onClick","window","location","reload","close","setTimeout","forceEnableApp","getAllApps","getCategories","loadingList","getUpdateCount","setAppConfig","Vuex","API_FAILURE","Store","modules","settings","serverData","setServerData","getServerData","oc","strict","process","VTooltip","defaultHtml","sync","store","router","__webpack_nonce__","btoa","requestToken","n","OCA","oc_userconfig","render","h","App","$mount","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","loaded","__webpack_modules__","call","m","amdD","amdO","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","fulfilled","j","every","r","getter","__esModule","d","definition","o","defineProperty","enumerable","get","f","chunkId","all","reduce","promises","u","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","l","done","script","needAttach","scripts","document","getElementsByTagName","s","getAttribute","createElement","charset","timeout","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","bind","type","target","head","appendChild","Symbol","toStringTag","nmd","paths","scriptUrl","importScripts","currentScript","p","baseURI","self","href","installedChunks","installedChunkData","promise","resolve","errorType","realSrc","request","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file diff --git a/lib/l10n/bg.js b/lib/l10n/bg.js index 172493809dd..1f31e9e0504 100644 --- a/lib/l10n/bg.js +++ b/lib/l10n/bg.js @@ -207,6 +207,7 @@ OC.L10N.register( "App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Приложението „%1$s“ не може да бъде инсталирано, защото следните зависимости не са изпълнени: %2$s", "a safe home for all your data" : "безопасен дом за всички ваши данни", "File is currently busy, please try again later" : "Файлът в момента е зает, моля, опитайте отново по-късно", + "Cannot download file" : "Файлът не можа да бъде изтеглен", "Application is not enabled" : "Приложението не е включено", "Authentication error" : "Грешка при удостоверяването", "Token expired. Please reload page." : "Изтекла сесия. Моля, презареди страницата.", diff --git a/lib/l10n/bg.json b/lib/l10n/bg.json index 954c27b98eb..41507e49a44 100644 --- a/lib/l10n/bg.json +++ b/lib/l10n/bg.json @@ -205,6 +205,7 @@ "App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Приложението „%1$s“ не може да бъде инсталирано, защото следните зависимости не са изпълнени: %2$s", "a safe home for all your data" : "безопасен дом за всички ваши данни", "File is currently busy, please try again later" : "Файлът в момента е зает, моля, опитайте отново по-късно", + "Cannot download file" : "Файлът не можа да бъде изтеглен", "Application is not enabled" : "Приложението не е включено", "Authentication error" : "Грешка при удостоверяването", "Token expired. Please reload page." : "Изтекла сесия. Моля, презареди страницата.", diff --git a/lib/l10n/eu.js b/lib/l10n/eu.js index f1b057aaeaf..94244be5607 100644 --- a/lib/l10n/eu.js +++ b/lib/l10n/eu.js @@ -207,7 +207,7 @@ OC.L10N.register( "App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "\"%1$s\" aplikazioa ezin da instalatu, menpekotasun hauek betetzen ez direlako:%2$s", "a safe home for all your data" : "zure datu guztientzako toki segurua", "File is currently busy, please try again later" : "Fitxategia lanpetuta dago, saiatu berriro geroago", - "Cannot download file" : "Ezin da fitxategia jaitsi", + "Cannot download file" : "Ezin da fitxategia deskargatu", "Application is not enabled" : "Aplikazioa ez dago gaituta", "Authentication error" : "Autentifikazio errorea", "Token expired. Please reload page." : "Tokena iraungitu da. Mesedez birkargatu orria.", diff --git a/lib/l10n/eu.json b/lib/l10n/eu.json index 42923cf5599..0eac90e1da9 100644 --- a/lib/l10n/eu.json +++ b/lib/l10n/eu.json @@ -205,7 +205,7 @@ "App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "\"%1$s\" aplikazioa ezin da instalatu, menpekotasun hauek betetzen ez direlako:%2$s", "a safe home for all your data" : "zure datu guztientzako toki segurua", "File is currently busy, please try again later" : "Fitxategia lanpetuta dago, saiatu berriro geroago", - "Cannot download file" : "Ezin da fitxategia jaitsi", + "Cannot download file" : "Ezin da fitxategia deskargatu", "Application is not enabled" : "Aplikazioa ez dago gaituta", "Authentication error" : "Autentifikazio errorea", "Token expired. Please reload page." : "Tokena iraungitu da. Mesedez birkargatu orria.", diff --git a/lib/l10n/fi.js b/lib/l10n/fi.js index 62ac7751f43..13ebcfcffeb 100644 --- a/lib/l10n/fi.js +++ b/lib/l10n/fi.js @@ -116,7 +116,11 @@ OC.L10N.register( "Set an admin password." : "Aseta ylläpitäjän salasana.", "Sharing backend %s not found" : "Jakamisen taustaosaa %s ei löytynyt", "Sharing backend for %s not found" : "Jakamisen taustaosaa kohteelle %s ei löytynyt", + "%1$s shared »%2$s« with you and wants to add:" : "%1$s jakoi kohteen »%2$s« kanssasi ja haluaa lisätä:", + "%1$s shared »%2$s« with you and wants to add" : "%1$s jakoi kohteen »%2$s« kanssasi ja haluaa lisätä", + "»%s« added a note to a file shared with you" : "»%s« lisäsi huomion jakamaasi tiedostoon", "Open »%s«" : "Avaa »%s«", + "%1$s via %2$s" : "%1$s palvelun %2$s kautta", "You are not allowed to share %s" : "Oikeutesi eivät riitä kohteen %s jakamiseen.", "Cannot increase permissions of %s" : "Kohteen %s käyttöoikeuksien lisääminen ei onnistu", "Files cannot be shared with delete permissions" : "Tiedostoja ei voi jakaa poistamisoikeuksilla", @@ -189,6 +193,7 @@ OC.L10N.register( "App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Sovellusta \"%1$s\" ei voi asentaa, koska seuraavat riippuvuudet eivät täyty: %2$s", "a safe home for all your data" : "turvallinen koti kaikille tiedostoillesi", "File is currently busy, please try again later" : "Tiedosto on parhaillaan käytössä, yritä myöhemmin uudelleen", + "Cannot download file" : "Tiedostoa ei voi ladata", "Application is not enabled" : "Sovellusta ei ole otettu käyttöön", "Authentication error" : "Tunnistautumisvirhe", "Token expired. Please reload page." : "Valtuutus vanheni. Lataa sivu uudelleen.", diff --git a/lib/l10n/fi.json b/lib/l10n/fi.json index 975213c6cdc..2aa4fdcd0d5 100644 --- a/lib/l10n/fi.json +++ b/lib/l10n/fi.json @@ -114,7 +114,11 @@ "Set an admin password." : "Aseta ylläpitäjän salasana.", "Sharing backend %s not found" : "Jakamisen taustaosaa %s ei löytynyt", "Sharing backend for %s not found" : "Jakamisen taustaosaa kohteelle %s ei löytynyt", + "%1$s shared »%2$s« with you and wants to add:" : "%1$s jakoi kohteen »%2$s« kanssasi ja haluaa lisätä:", + "%1$s shared »%2$s« with you and wants to add" : "%1$s jakoi kohteen »%2$s« kanssasi ja haluaa lisätä", + "»%s« added a note to a file shared with you" : "»%s« lisäsi huomion jakamaasi tiedostoon", "Open »%s«" : "Avaa »%s«", + "%1$s via %2$s" : "%1$s palvelun %2$s kautta", "You are not allowed to share %s" : "Oikeutesi eivät riitä kohteen %s jakamiseen.", "Cannot increase permissions of %s" : "Kohteen %s käyttöoikeuksien lisääminen ei onnistu", "Files cannot be shared with delete permissions" : "Tiedostoja ei voi jakaa poistamisoikeuksilla", @@ -187,6 +191,7 @@ "App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Sovellusta \"%1$s\" ei voi asentaa, koska seuraavat riippuvuudet eivät täyty: %2$s", "a safe home for all your data" : "turvallinen koti kaikille tiedostoillesi", "File is currently busy, please try again later" : "Tiedosto on parhaillaan käytössä, yritä myöhemmin uudelleen", + "Cannot download file" : "Tiedostoa ei voi ladata", "Application is not enabled" : "Sovellusta ei ole otettu käyttöön", "Authentication error" : "Tunnistautumisvirhe", "Token expired. Please reload page." : "Valtuutus vanheni. Lataa sivu uudelleen.", diff --git a/lib/l10n/fr.js b/lib/l10n/fr.js index 86f56e69a85..fce71090c61 100644 --- a/lib/l10n/fr.js +++ b/lib/l10n/fr.js @@ -207,6 +207,7 @@ OC.L10N.register( "App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "L'application \"%1$s\" ne peut pas être installée à cause des dépendances suivantes non satisfaites : %2$s", "a safe home for all your data" : "un lieu sûr pour toutes vos données", "File is currently busy, please try again later" : "Le fichier est actuellement utilisé, veuillez réessayer plus tard", + "Cannot download file" : "Impossible de télécharger le fichier", "Application is not enabled" : "L'application n'est pas activée", "Authentication error" : "Erreur d'authentification", "Token expired. Please reload page." : "La session a expiré. Veuillez recharger la page.", diff --git a/lib/l10n/fr.json b/lib/l10n/fr.json index f3b85ba4ac2..f9ff67188b0 100644 --- a/lib/l10n/fr.json +++ b/lib/l10n/fr.json @@ -205,6 +205,7 @@ "App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "L'application \"%1$s\" ne peut pas être installée à cause des dépendances suivantes non satisfaites : %2$s", "a safe home for all your data" : "un lieu sûr pour toutes vos données", "File is currently busy, please try again later" : "Le fichier est actuellement utilisé, veuillez réessayer plus tard", + "Cannot download file" : "Impossible de télécharger le fichier", "Application is not enabled" : "L'application n'est pas activée", "Authentication error" : "Erreur d'authentification", "Token expired. Please reload page." : "La session a expiré. Veuillez recharger la page.", diff --git a/lib/l10n/ko.js b/lib/l10n/ko.js index a2329ec6590..039f738edd9 100644 --- a/lib/l10n/ko.js +++ b/lib/l10n/ko.js @@ -79,6 +79,7 @@ OC.L10N.register( "About" : "정보", "Full name" : "전체 이름", "Headline" : "표제", + "Organisation" : "조직", "Role" : "직책", "Unknown user" : "알려지지 않은 사용자", "Additional settings" : "고급 설정", diff --git a/lib/l10n/ko.json b/lib/l10n/ko.json index c431ac654b9..81f384b4c3a 100644 --- a/lib/l10n/ko.json +++ b/lib/l10n/ko.json @@ -77,6 +77,7 @@ "About" : "정보", "Full name" : "전체 이름", "Headline" : "표제", + "Organisation" : "조직", "Role" : "직책", "Unknown user" : "알려지지 않은 사용자", "Additional settings" : "고급 설정", diff --git a/lib/l10n/nb.js b/lib/l10n/nb.js index cd3822384e6..023f43b136c 100644 --- a/lib/l10n/nb.js +++ b/lib/l10n/nb.js @@ -5,6 +5,11 @@ OC.L10N.register( "See %s" : "Se %s", "Sample configuration detected" : "Eksempeloppsett oppdaget", "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Det ble oppdaget at eksempeloppsettet er blitt kopiert. Dette kan ødelegge installasjonen din og støttes ikke. Les dokumentasjonen før du gjør endringer i config.php", + "%s email verification" : "%s e-postbekreftelse", + "Email verification" : "E-postbekreftelse", + "Click the following button to confirm your email." : "Klikk på følgende knapp for å bekrefte e-posten din.", + "Click the following link to confirm your email." : "Klikk på følgende lenke for å bekrefte e-posten din.", + "Confirm your email" : "Bekreft din e-post", "%1$s and %2$s" : "%1$s og %2$s", "%1$s, %2$s and %3$s" : "%1$s, %2$s og %3$s", "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s og %4$s", @@ -45,8 +50,10 @@ OC.L10N.register( "_%n minute ago_::_%n minutes ago_" : ["for %n minutt siden","for %n minutter siden"], "in a few seconds" : "om noen sekunder", "seconds ago" : "for få sekunder siden", + "Empty file" : "Tom fil", "Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Modul med ID: %s finnes ikke. Skru den på i app-innstillingene eller kontakt en administrator.", "File already exists" : "Filen finnes allerede", + "Invalid path" : "Ugyldig filbane", "File name is a reserved word" : "Filnavnet er et reservert ord", "File name contains at least one invalid character" : "Filnavnet inneholder minst ett ulovlig tegn", "File name is too long" : "Filnavnet er for langt", @@ -62,13 +69,20 @@ OC.L10N.register( "Log out" : "Logg ut", "Users" : "Brukere", "Email" : "E-post", + "Mail %s" : "E-post til %s", "Phone" : "Telefon", + "Call %s" : "Ring %s", "Twitter" : "Twitter", + "View %s on Twitter" : "Se %s på Twitter", "Website" : "Nettsted", + "Visit %s" : "Besøk %s", "Address" : "Adresse", "Profile picture" : "Profilbilde", "About" : "Om", "Full name" : "Fullt nav", + "Headline" : "Overskrift", + "Organisation" : "Organisasion", + "Role" : "Rolle", "Unknown user" : "Ukjent bruker", "Additional settings" : "Flere innstillinger", "%s enter the database username and name." : "%s legg inn database brukernavn og navn.", @@ -158,6 +172,7 @@ OC.L10N.register( "Login canceled by app" : "Innlogging avbrutt av app", "a safe home for all your data" : "et sikkert hjem for alle dine data", "File is currently busy, please try again later" : "Filen er opptatt for øyeblikket, prøv igjen senere", + "Cannot download file" : "Kan ikke laste ned fil", "Application is not enabled" : "Appen er ikke aktivert", "Authentication error" : "Autentikasjonsfeil", "Token expired. Please reload page." : "Symbol utløpt. Last inn siden på nytt.", @@ -180,6 +195,7 @@ OC.L10N.register( "Storage connection error. %s" : "Tilkoblingsfeil for lager. %s", "Storage is temporarily not available" : "Lagring er midlertidig utilgjengelig", "Storage connection timeout. %s" : "Tidsavbrudd ved tilkobling av lager: %s", + "Cannot read file" : "Kan ikke lese fil", "Cannot write into \"config\" directory" : "Kan ikke skrive i \"config\"-mappen", "This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Dette kan vanligvis ordnes ved å gi webserveren skrivetilgang til config-mappen. Se %s", "Cannot write into \"apps\" directory" : "Kan ikke skrive i \"apps\"-mappen", diff --git a/lib/l10n/nb.json b/lib/l10n/nb.json index ee405c25723..1f0f6b629c7 100644 --- a/lib/l10n/nb.json +++ b/lib/l10n/nb.json @@ -3,6 +3,11 @@ "See %s" : "Se %s", "Sample configuration detected" : "Eksempeloppsett oppdaget", "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Det ble oppdaget at eksempeloppsettet er blitt kopiert. Dette kan ødelegge installasjonen din og støttes ikke. Les dokumentasjonen før du gjør endringer i config.php", + "%s email verification" : "%s e-postbekreftelse", + "Email verification" : "E-postbekreftelse", + "Click the following button to confirm your email." : "Klikk på følgende knapp for å bekrefte e-posten din.", + "Click the following link to confirm your email." : "Klikk på følgende lenke for å bekrefte e-posten din.", + "Confirm your email" : "Bekreft din e-post", "%1$s and %2$s" : "%1$s og %2$s", "%1$s, %2$s and %3$s" : "%1$s, %2$s og %3$s", "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s og %4$s", @@ -43,8 +48,10 @@ "_%n minute ago_::_%n minutes ago_" : ["for %n minutt siden","for %n minutter siden"], "in a few seconds" : "om noen sekunder", "seconds ago" : "for få sekunder siden", + "Empty file" : "Tom fil", "Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Modul med ID: %s finnes ikke. Skru den på i app-innstillingene eller kontakt en administrator.", "File already exists" : "Filen finnes allerede", + "Invalid path" : "Ugyldig filbane", "File name is a reserved word" : "Filnavnet er et reservert ord", "File name contains at least one invalid character" : "Filnavnet inneholder minst ett ulovlig tegn", "File name is too long" : "Filnavnet er for langt", @@ -60,13 +67,20 @@ "Log out" : "Logg ut", "Users" : "Brukere", "Email" : "E-post", + "Mail %s" : "E-post til %s", "Phone" : "Telefon", + "Call %s" : "Ring %s", "Twitter" : "Twitter", + "View %s on Twitter" : "Se %s på Twitter", "Website" : "Nettsted", + "Visit %s" : "Besøk %s", "Address" : "Adresse", "Profile picture" : "Profilbilde", "About" : "Om", "Full name" : "Fullt nav", + "Headline" : "Overskrift", + "Organisation" : "Organisasion", + "Role" : "Rolle", "Unknown user" : "Ukjent bruker", "Additional settings" : "Flere innstillinger", "%s enter the database username and name." : "%s legg inn database brukernavn og navn.", @@ -156,6 +170,7 @@ "Login canceled by app" : "Innlogging avbrutt av app", "a safe home for all your data" : "et sikkert hjem for alle dine data", "File is currently busy, please try again later" : "Filen er opptatt for øyeblikket, prøv igjen senere", + "Cannot download file" : "Kan ikke laste ned fil", "Application is not enabled" : "Appen er ikke aktivert", "Authentication error" : "Autentikasjonsfeil", "Token expired. Please reload page." : "Symbol utløpt. Last inn siden på nytt.", @@ -178,6 +193,7 @@ "Storage connection error. %s" : "Tilkoblingsfeil for lager. %s", "Storage is temporarily not available" : "Lagring er midlertidig utilgjengelig", "Storage connection timeout. %s" : "Tidsavbrudd ved tilkobling av lager: %s", + "Cannot read file" : "Kan ikke lese fil", "Cannot write into \"config\" directory" : "Kan ikke skrive i \"config\"-mappen", "This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Dette kan vanligvis ordnes ved å gi webserveren skrivetilgang til config-mappen. Se %s", "Cannot write into \"apps\" directory" : "Kan ikke skrive i \"apps\"-mappen", diff --git a/lib/l10n/tr.js b/lib/l10n/tr.js index 1093853236e..53de08e4f73 100644 --- a/lib/l10n/tr.js +++ b/lib/l10n/tr.js @@ -210,7 +210,7 @@ OC.L10N.register( "Cannot download file" : "Dosya indirilemedi", "Application is not enabled" : "Uygulama etkinleştirilmemiş", "Authentication error" : "Kimlik doğrulama sorunu", - "Token expired. Please reload page." : "Kodun süresi dolmuş. Lütfen sayfayı yenileyin.", + "Token expired. Please reload page." : "Kodun geçerlilik süresi dolmuş. Lütfen sayfayı yenileyin.", "No database drivers (sqlite, mysql, or postgresql) installed." : "Herhangi bir veritabanı sürücüsü (sqlite, mysql ya da postgresql) kurulmamış.", "Cannot write into \"config\" directory." : "\"config\" klasörüne yazılamadı.", "This can usually be fixed by giving the web server write access to the config directory. See %s" : "Bu sorun genellikle, web sunucusuna config klasörüne yazma izni verilerek çözülebilir. %s bölümüne bakın", diff --git a/lib/l10n/tr.json b/lib/l10n/tr.json index 36bf1d804a1..eb666c3b364 100644 --- a/lib/l10n/tr.json +++ b/lib/l10n/tr.json @@ -208,7 +208,7 @@ "Cannot download file" : "Dosya indirilemedi", "Application is not enabled" : "Uygulama etkinleştirilmemiş", "Authentication error" : "Kimlik doğrulama sorunu", - "Token expired. Please reload page." : "Kodun süresi dolmuş. Lütfen sayfayı yenileyin.", + "Token expired. Please reload page." : "Kodun geçerlilik süresi dolmuş. Lütfen sayfayı yenileyin.", "No database drivers (sqlite, mysql, or postgresql) installed." : "Herhangi bir veritabanı sürücüsü (sqlite, mysql ya da postgresql) kurulmamış.", "Cannot write into \"config\" directory." : "\"config\" klasörüne yazılamadı.", "This can usually be fixed by giving the web server write access to the config directory. See %s" : "Bu sorun genellikle, web sunucusuna config klasörüne yazma izni verilerek çözülebilir. %s bölümüne bakın", diff --git a/lib/private/DB/QueryBuilder/ExpressionBuilder/ExpressionBuilder.php b/lib/private/DB/QueryBuilder/ExpressionBuilder/ExpressionBuilder.php index 333984bde71..ae4f19f5d18 100644 --- a/lib/private/DB/QueryBuilder/ExpressionBuilder/ExpressionBuilder.php +++ b/lib/private/DB/QueryBuilder/ExpressionBuilder/ExpressionBuilder.php @@ -114,12 +114,12 @@ class ExpressionBuilder implements IExpressionBuilder { * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants * required when comparing text fields for oci compatibility * - * @return IQueryFunction + * @return string */ - public function comparison($x, string $operator, $y, $type = null): IQueryFunction { + public function comparison($x, string $operator, $y, $type = null): string { $x = $this->helper->quoteColumnName($x); $y = $this->helper->quoteColumnName($y); - return new QueryFunction($this->expressionBuilder->comparison($x, $operator, $y)); + return $this->expressionBuilder->comparison($x, $operator, $y); } /** @@ -137,12 +137,12 @@ class ExpressionBuilder implements IExpressionBuilder { * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants * required when comparing text fields for oci compatibility * - * @return IQueryFunction + * @return string */ - public function eq($x, $y, $type = null): IQueryFunction { + public function eq($x, $y, $type = null): string { $x = $this->helper->quoteColumnName($x); $y = $this->helper->quoteColumnName($y); - return new QueryFunction($this->expressionBuilder->eq($x, $y)); + return $this->expressionBuilder->eq($x, $y); } /** @@ -159,12 +159,12 @@ class ExpressionBuilder implements IExpressionBuilder { * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants * required when comparing text fields for oci compatibility * - * @return IQueryFunction + * @return string */ - public function neq($x, $y, $type = null): IQueryFunction { + public function neq($x, $y, $type = null): string { $x = $this->helper->quoteColumnName($x); $y = $this->helper->quoteColumnName($y); - return new QueryFunction($this->expressionBuilder->neq($x, $y)); + return $this->expressionBuilder->neq($x, $y); } /** @@ -181,12 +181,12 @@ class ExpressionBuilder implements IExpressionBuilder { * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants * required when comparing text fields for oci compatibility * - * @return IQueryFunction + * @return string */ - public function lt($x, $y, $type = null): IQueryFunction { + public function lt($x, $y, $type = null): string { $x = $this->helper->quoteColumnName($x); $y = $this->helper->quoteColumnName($y); - return new QueryFunction($this->expressionBuilder->lt($x, $y)); + return $this->expressionBuilder->lt($x, $y); } /** @@ -203,12 +203,12 @@ class ExpressionBuilder implements IExpressionBuilder { * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants * required when comparing text fields for oci compatibility * - * @return IQueryFunction + * @return string */ - public function lte($x, $y, $type = null): IQueryFunction { + public function lte($x, $y, $type = null): string { $x = $this->helper->quoteColumnName($x); $y = $this->helper->quoteColumnName($y); - return new QueryFunction($this->expressionBuilder->lte($x, $y)); + return $this->expressionBuilder->lte($x, $y); } /** @@ -225,12 +225,12 @@ class ExpressionBuilder implements IExpressionBuilder { * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants * required when comparing text fields for oci compatibility * - * @return IQueryFunction + * @return string */ - public function gt($x, $y, $type = null): IQueryFunction { + public function gt($x, $y, $type = null): string { $x = $this->helper->quoteColumnName($x); $y = $this->helper->quoteColumnName($y); - return new QueryFunction($this->expressionBuilder->gt($x, $y)); + return $this->expressionBuilder->gt($x, $y); } /** @@ -247,12 +247,12 @@ class ExpressionBuilder implements IExpressionBuilder { * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants * required when comparing text fields for oci compatibility * - * @return IQueryFunction + * @return string */ - public function gte($x, $y, $type = null): IQueryFunction { + public function gte($x, $y, $type = null): string { $x = $this->helper->quoteColumnName($x); $y = $this->helper->quoteColumnName($y); - return new QueryFunction($this->expressionBuilder->gte($x, $y)); + return $this->expressionBuilder->gte($x, $y); } /** @@ -260,11 +260,11 @@ class ExpressionBuilder implements IExpressionBuilder { * * @param string|ILiteral|IParameter|IQueryFunction $x The field in string format to be restricted by IS NULL. * - * @return IQueryFunction + * @return string */ - public function isNull($x): IQueryFunction { + public function isNull($x): string { $x = $this->helper->quoteColumnName($x); - return new QueryFunction($this->expressionBuilder->isNull($x)); + return $this->expressionBuilder->isNull($x); } /** @@ -272,11 +272,11 @@ class ExpressionBuilder implements IExpressionBuilder { * * @param string|ILiteral|IParameter|IQueryFunction $x The field in string format to be restricted by IS NOT NULL. * - * @return IQueryFunction + * @return string */ - public function isNotNull($x): IQueryFunction { + public function isNotNull($x): string { $x = $this->helper->quoteColumnName($x); - return new QueryFunction($this->expressionBuilder->isNotNull($x)); + return $this->expressionBuilder->isNotNull($x); } /** @@ -287,12 +287,12 @@ class ExpressionBuilder implements IExpressionBuilder { * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants * required when comparing text fields for oci compatibility * - * @return IQueryFunction + * @return string */ - public function like($x, $y, $type = null): IQueryFunction { + public function like($x, $y, $type = null): string { $x = $this->helper->quoteColumnName($x); $y = $this->helper->quoteColumnName($y); - return new QueryFunction($this->expressionBuilder->like($x, $y)); + return $this->expressionBuilder->like($x, $y); } /** @@ -303,11 +303,11 @@ class ExpressionBuilder implements IExpressionBuilder { * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants * required when comparing text fields for oci compatibility * - * @return IQueryFunction + * @return string * @since 9.0.0 */ - public function iLike($x, $y, $type = null): IQueryFunction { - return new QueryFunction($this->expressionBuilder->like($this->functionBuilder->lower($x), $this->functionBuilder->lower($y))); + public function iLike($x, $y, $type = null): string { + return $this->expressionBuilder->like($this->functionBuilder->lower($x), $this->functionBuilder->lower($y)); } /** @@ -318,12 +318,12 @@ class ExpressionBuilder implements IExpressionBuilder { * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants * required when comparing text fields for oci compatibility * - * @return IQueryFunction + * @return string */ - public function notLike($x, $y, $type = null): IQueryFunction { + public function notLike($x, $y, $type = null): string { $x = $this->helper->quoteColumnName($x); $y = $this->helper->quoteColumnName($y); - return new QueryFunction($this->expressionBuilder->notLike($x, $y)); + return $this->expressionBuilder->notLike($x, $y); } /** @@ -334,12 +334,12 @@ class ExpressionBuilder implements IExpressionBuilder { * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants * required when comparing text fields for oci compatibility * - * @return IQueryFunction + * @return string */ - public function in($x, $y, $type = null): IQueryFunction { + public function in($x, $y, $type = null): string { $x = $this->helper->quoteColumnName($x); $y = $this->helper->quoteColumnNames($y); - return new QueryFunction($this->expressionBuilder->in($x, $y)); + return $this->expressionBuilder->in($x, $y); } /** @@ -350,34 +350,34 @@ class ExpressionBuilder implements IExpressionBuilder { * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants * required when comparing text fields for oci compatibility * - * @return IQueryFunction + * @return string */ - public function notIn($x, $y, $type = null): IQueryFunction { + public function notIn($x, $y, $type = null): string { $x = $this->helper->quoteColumnName($x); $y = $this->helper->quoteColumnNames($y); - return new QueryFunction($this->expressionBuilder->notIn($x, $y)); + return $this->expressionBuilder->notIn($x, $y); } /** * Creates a $x = '' statement, because Oracle needs a different check * * @param string|ILiteral|IParameter|IQueryFunction $x The field in string format to be inspected by the comparison. - * @return IQueryFunction + * @return string * @since 13.0.0 */ - public function emptyString($x): IQueryFunction { - return new QueryFunction($this->eq($x, $this->literal('', IQueryBuilder::PARAM_STR))); + public function emptyString($x): string { + return $this->eq($x, $this->literal('', IQueryBuilder::PARAM_STR)); } /** * Creates a `$x <> ''` statement, because Oracle needs a different check * * @param string|ILiteral|IParameter|IQueryFunction $x The field in string format to be inspected by the comparison. - * @return IQueryFunction + * @return string * @since 13.0.0 */ - public function nonEmptyString($x): IQueryFunction { - return new QueryFunction($this->neq($x, $this->literal('', IQueryBuilder::PARAM_STR))); + public function nonEmptyString($x): string { + return $this->neq($x, $this->literal('', IQueryBuilder::PARAM_STR)); } /** diff --git a/lib/private/DB/QueryBuilder/ExpressionBuilder/MySqlExpressionBuilder.php b/lib/private/DB/QueryBuilder/ExpressionBuilder/MySqlExpressionBuilder.php index 74209d0c3da..3bb54d4b26e 100644 --- a/lib/private/DB/QueryBuilder/ExpressionBuilder/MySqlExpressionBuilder.php +++ b/lib/private/DB/QueryBuilder/ExpressionBuilder/MySqlExpressionBuilder.php @@ -49,10 +49,10 @@ class MySqlExpressionBuilder extends ExpressionBuilder { /** * @inheritdoc */ - public function iLike($x, $y, $type = null): IQueryFunction { + public function iLike($x, $y, $type = null): string { $x = $this->helper->quoteColumnName($x); $y = $this->helper->quoteColumnName($y); - return new QueryFunction($this->expressionBuilder->comparison($x, ' COLLATE ' . $this->collation . ' LIKE', $y)); + return $this->expressionBuilder->comparison($x, ' COLLATE ' . $this->collation . ' LIKE', $y); } /** diff --git a/lib/private/DB/QueryBuilder/ExpressionBuilder/OCIExpressionBuilder.php b/lib/private/DB/QueryBuilder/ExpressionBuilder/OCIExpressionBuilder.php index 20d68b30b33..f9b58d7d8ed 100644 --- a/lib/private/DB/QueryBuilder/ExpressionBuilder/OCIExpressionBuilder.php +++ b/lib/private/DB/QueryBuilder/ExpressionBuilder/OCIExpressionBuilder.php @@ -49,101 +49,101 @@ class OCIExpressionBuilder extends ExpressionBuilder { /** * @inheritdoc */ - public function comparison($x, string $operator, $y, $type = null): IQueryFunction { + public function comparison($x, string $operator, $y, $type = null): string { $x = $this->prepareColumn($x, $type); $y = $this->prepareColumn($y, $type); - return new QueryFunction($this->expressionBuilder->comparison($x, $operator, $y)); + return $this->expressionBuilder->comparison($x, $operator, $y); } /** * @inheritdoc */ - public function eq($x, $y, $type = null): IQueryFunction { + public function eq($x, $y, $type = null): string { $x = $this->prepareColumn($x, $type); $y = $this->prepareColumn($y, $type); - return new QueryFunction($this->expressionBuilder->eq($x, $y)); + return $this->expressionBuilder->eq($x, $y); } /** * @inheritdoc */ - public function neq($x, $y, $type = null): IQueryFunction { + public function neq($x, $y, $type = null): string { $x = $this->prepareColumn($x, $type); $y = $this->prepareColumn($y, $type); - return new QueryFunction($this->expressionBuilder->neq($x, $y)); + return $this->expressionBuilder->neq($x, $y); } /** * @inheritdoc */ - public function lt($x, $y, $type = null): IQueryFunction { + public function lt($x, $y, $type = null): string { $x = $this->prepareColumn($x, $type); $y = $this->prepareColumn($y, $type); - return new QueryFunction($this->expressionBuilder->lt($x, $y)); + return $this->expressionBuilder->lt($x, $y); } /** * @inheritdoc */ - public function lte($x, $y, $type = null): IQueryFunction { + public function lte($x, $y, $type = null): string { $x = $this->prepareColumn($x, $type); $y = $this->prepareColumn($y, $type); - return new QueryFunction($this->expressionBuilder->lte($x, $y)); + return $this->expressionBuilder->lte($x, $y); } /** * @inheritdoc */ - public function gt($x, $y, $type = null): IQueryFunction { + public function gt($x, $y, $type = null): string { $x = $this->prepareColumn($x, $type); $y = $this->prepareColumn($y, $type); - return new QueryFunction($this->expressionBuilder->gt($x, $y)); + return $this->expressionBuilder->gt($x, $y); } /** * @inheritdoc */ - public function gte($x, $y, $type = null): IQueryFunction { + public function gte($x, $y, $type = null): string { $x = $this->prepareColumn($x, $type); $y = $this->prepareColumn($y, $type); - return new QueryFunction($this->expressionBuilder->gte($x, $y)); + return $this->expressionBuilder->gte($x, $y); } /** * @inheritdoc */ - public function in($x, $y, $type = null): IQueryFunction { + public function in($x, $y, $type = null): string { $x = $this->prepareColumn($x, $type); $y = $this->prepareColumn($y, $type); - return new QueryFunction($this->expressionBuilder->in($x, $y)); + return $this->expressionBuilder->in($x, $y); } /** * @inheritdoc */ - public function notIn($x, $y, $type = null): IQueryFunction { + public function notIn($x, $y, $type = null): string { $x = $this->prepareColumn($x, $type); $y = $this->prepareColumn($y, $type); - return new QueryFunction($this->expressionBuilder->notIn($x, $y)); + return $this->expressionBuilder->notIn($x, $y); } /** * Creates a $x = '' statement, because Oracle needs a different check * * @param string|ILiteral|IParameter|IQueryFunction $x The field in string format to be inspected by the comparison. - * @return IQueryFunction + * @return string * @since 13.0.0 */ - public function emptyString($x): IQueryFunction { + public function emptyString($x): string { return $this->isNull($x); } @@ -151,10 +151,10 @@ class OCIExpressionBuilder extends ExpressionBuilder { * Creates a `$x <> ''` statement, because Oracle needs a different check * * @param string|ILiteral|IParameter|IQueryFunction $x The field in string format to be inspected by the comparison. - * @return IQueryFunction + * @return string * @since 13.0.0 */ - public function nonEmptyString($x): IQueryFunction { + public function nonEmptyString($x): string { return $this->isNotNull($x); } @@ -182,14 +182,14 @@ class OCIExpressionBuilder extends ExpressionBuilder { /** * @inheritdoc */ - public function like($x, $y, $type = null): IQueryFunction { - return new QueryFunction(parent::like($x, $y, $type) . " ESCAPE '\\'"); + public function like($x, $y, $type = null): string { + return parent::like($x, $y, $type) . " ESCAPE '\\'"; } /** * @inheritdoc */ - public function iLike($x, $y, $type = null): IQueryFunction { + public function iLike($x, $y, $type = null): string { return $this->like($this->functionBuilder->lower($x), $this->functionBuilder->lower($y)); } } diff --git a/lib/private/DB/QueryBuilder/ExpressionBuilder/PgSqlExpressionBuilder.php b/lib/private/DB/QueryBuilder/ExpressionBuilder/PgSqlExpressionBuilder.php index cbebe97ae87..0fba5363a28 100644 --- a/lib/private/DB/QueryBuilder/ExpressionBuilder/PgSqlExpressionBuilder.php +++ b/lib/private/DB/QueryBuilder/ExpressionBuilder/PgSqlExpressionBuilder.php @@ -52,9 +52,9 @@ class PgSqlExpressionBuilder extends ExpressionBuilder { /** * @inheritdoc */ - public function iLike($x, $y, $type = null): IQueryFunction { + public function iLike($x, $y, $type = null): string { $x = $this->helper->quoteColumnName($x); $y = $this->helper->quoteColumnName($y); - return new QueryFunction($this->expressionBuilder->comparison($x, 'ILIKE', $y)); + return $this->expressionBuilder->comparison($x, 'ILIKE', $y); } } diff --git a/lib/private/DB/QueryBuilder/ExpressionBuilder/SqliteExpressionBuilder.php b/lib/private/DB/QueryBuilder/ExpressionBuilder/SqliteExpressionBuilder.php index 5425138fa6c..289aa09b003 100644 --- a/lib/private/DB/QueryBuilder/ExpressionBuilder/SqliteExpressionBuilder.php +++ b/lib/private/DB/QueryBuilder/ExpressionBuilder/SqliteExpressionBuilder.php @@ -23,18 +23,15 @@ */ namespace OC\DB\QueryBuilder\ExpressionBuilder; -use OC\DB\QueryBuilder\QueryFunction; -use OCP\DB\QueryBuilder\IQueryFunction; - class SqliteExpressionBuilder extends ExpressionBuilder { /** * @inheritdoc */ - public function like($x, $y, $type = null): IQueryFunction { - return new QueryFunction(parent::like($x, $y, $type) . " ESCAPE '\\'"); + public function like($x, $y, $type = null): string { + return parent::like($x, $y, $type) . " ESCAPE '\\'"; } - public function iLike($x, $y, $type = null): IQueryFunction { - return new QueryFunction($this->like($this->functionBuilder->lower($x), $this->functionBuilder->lower($y), $type)); + public function iLike($x, $y, $type = null): string { + return $this->like($this->functionBuilder->lower($x), $this->functionBuilder->lower($y), $type); } } diff --git a/lib/private/DB/QueryBuilder/FunctionBuilder/FunctionBuilder.php b/lib/private/DB/QueryBuilder/FunctionBuilder/FunctionBuilder.php index 408a879d624..e0a7549a0ad 100644 --- a/lib/private/DB/QueryBuilder/FunctionBuilder/FunctionBuilder.php +++ b/lib/private/DB/QueryBuilder/FunctionBuilder/FunctionBuilder.php @@ -121,15 +121,4 @@ class FunctionBuilder implements IFunctionBuilder { public function least($x, $y): IQueryFunction { return new QueryFunction('LEAST(' . $this->helper->quoteColumnName($x) . ', ' . $this->helper->quoteColumnName($y) . ')'); } - - public function case(array $whens, $else): IQueryFunction { - if (count($whens) < 1) { - return new QueryFunction($this->helper->quoteColumnName($else)); - } - - $whenParts = array_map(function (array $when) { - return 'WHEN ' . $this->helper->quoteColumnName($when['when']) . ' THEN ' . $this->helper->quoteColumnName($when['then']); - }, $whens); - return new QueryFunction('CASE ' . implode(' ', $whenParts) . ' ELSE ' . $this->helper->quoteColumnName($else) . ' END'); - } } diff --git a/lib/private/DB/QueryBuilder/QueryBuilder.php b/lib/private/DB/QueryBuilder/QueryBuilder.php index d991cbd1dd5..e81ba61b3a7 100644 --- a/lib/private/DB/QueryBuilder/QueryBuilder.php +++ b/lib/private/DB/QueryBuilder/QueryBuilder.php @@ -715,12 +715,11 @@ class QueryBuilder implements IQueryBuilder { * @param string $fromAlias The alias that points to a from clause. * @param string $join The table name to join. * @param string $alias The alias of the join table. - * @param string|IQueryFunction|ICompositeExpression|null $condition The condition for the join. + * @param string|ICompositeExpression|null $condition The condition for the join. * * @return $this This QueryBuilder instance. */ public function join($fromAlias, $join, $alias, $condition = null) { - $condition = $condition !== null ? (string)$condition : null; $this->queryBuilder->join( $this->quoteAlias($fromAlias), $this->getTableName($join), @@ -744,12 +743,11 @@ class QueryBuilder implements IQueryBuilder { * @param string $fromAlias The alias that points to a from clause. * @param string $join The table name to join. * @param string $alias The alias of the join table. - * @param string|IQueryFunction|ICompositeExpression|null $condition The condition for the join. + * @param string|ICompositeExpression|null $condition The condition for the join. * * @return $this This QueryBuilder instance. */ public function innerJoin($fromAlias, $join, $alias, $condition = null) { - $condition = $condition !== null ? (string)$condition : null; $this->queryBuilder->innerJoin( $this->quoteAlias($fromAlias), $this->getTableName($join), @@ -773,12 +771,11 @@ class QueryBuilder implements IQueryBuilder { * @param string $fromAlias The alias that points to a from clause. * @param string $join The table name to join. * @param string $alias The alias of the join table. - * @param string|IQueryFunction|ICompositeExpression|null $condition The condition for the join. + * @param string|ICompositeExpression|null $condition The condition for the join. * * @return $this This QueryBuilder instance. */ public function leftJoin($fromAlias, $join, $alias, $condition = null) { - $condition = $condition !== null ? (string)$condition : null; $this->queryBuilder->leftJoin( $this->quoteAlias($fromAlias), $this->getTableName($join), @@ -802,12 +799,11 @@ class QueryBuilder implements IQueryBuilder { * @param string $fromAlias The alias that points to a from clause. * @param string $join The table name to join. * @param string $alias The alias of the join table. - * @param string|IQueryFunction|ICompositeExpression|null $condition The condition for the join. + * @param string|ICompositeExpression|null $condition The condition for the join. * * @return $this This QueryBuilder instance. */ public function rightJoin($fromAlias, $join, $alias, $condition = null) { - $condition = $condition !== null ? (string)$condition : null; $this->queryBuilder->rightJoin( $this->quoteAlias($fromAlias), $this->getTableName($join), diff --git a/lib/private/Files/Cache/Cache.php b/lib/private/Files/Cache/Cache.php index f23635aa01b..ec284282178 100644 --- a/lib/private/Files/Cache/Cache.php +++ b/lib/private/Files/Cache/Cache.php @@ -875,26 +875,32 @@ class Cache implements ICache { $id = $entry['fileid']; $query = $this->getQueryBuilder(); - $query->selectAlias($query->func()->sum('size'), 'size_sum') - ->selectAlias($query->func()->min('size'), 'size_min') - // in case of encryption being enabled after some files are already uploaded, some entries will have an unencrypted_size of 0 and a non-zero size - ->selectAlias($query->func()->sum( - $query->func()->case([ - ['when' => $query->expr()->eq('unencrypted_size', $query->expr()->literal(0, IQueryBuilder::PARAM_INT)), 'then' => 'size'], - ], 'unencrypted_size') - ), 'unencrypted_sum') - ->selectAlias($query->func()->min('unencrypted_size'), 'unencrypted_min') - ->selectAlias($query->func()->max('unencrypted_size'), 'unencrypted_max') + $query->select('size', 'unencrypted_size') ->from('filecache') - ->whereStorageId($this->getNumericStorageId()) ->whereParent($id); $result = $query->execute(); - $row = $result->fetch(); + $rows = $result->fetchAll(); $result->closeCursor(); - if ($row) { - ['size_sum' => $sum, 'size_min' => $min, 'unencrypted_sum' => $unencryptedSum, 'unencrypted_min' => $unencryptedMin, 'unencrypted_max' => $unencryptedMax] = $row; + if ($rows) { + $sizes = array_map(function (array $row) { + return (int)$row['size']; + }, $rows); + $unencryptedOnlySizes = array_map(function (array $row) { + return (int)$row['unencrypted_size']; + }, $rows); + $unencryptedSizes = array_map(function (array $row) { + return (int)(($row['unencrypted_size'] > 0) ? $row['unencrypted_size'] : $row['size']); + }, $rows); + + $sum = array_sum($sizes); + $min = min($sizes); + + $unencryptedSum = array_sum($unencryptedSizes); + $unencryptedMin = min($unencryptedSizes); + $unencryptedMax = max($unencryptedOnlySizes); + $sum = 0 + $sum; $min = 0 + $min; if ($min === -1) { @@ -907,18 +913,22 @@ class Cache implements ICache { } else { $unencryptedTotal = $unencryptedSum; } - if ($entry['size'] !== $totalSize) { - // only set unencrypted size for a folder if any child entries have it set - if ($unencryptedMax > 0) { - $this->update($id, [ - 'size' => $totalSize, - 'unencrypted_size' => $unencryptedTotal, - ]); - } else { - $this->update($id, [ - 'size' => $totalSize, - ]); - } + } else { + $totalSize = 0; + $unencryptedTotal = 0; + $unencryptedMax = 0; + } + if ($entry['size'] !== $totalSize) { + // only set unencrypted size for a folder if any child entries have it set, or the folder is empty + if ($unencryptedMax > 0 || $totalSize === 0) { + $this->update($id, [ + 'size' => $totalSize, + 'unencrypted_size' => $unencryptedTotal, + ]); + } else { + $this->update($id, [ + 'size' => $totalSize, + ]); } } } diff --git a/lib/private/Files/Cache/Propagator.php b/lib/private/Files/Cache/Propagator.php index a0953baa785..2909e998bf9 100644 --- a/lib/private/Files/Cache/Propagator.php +++ b/lib/private/Files/Cache/Propagator.php @@ -116,18 +116,18 @@ class Propagator implements IPropagator { if ($this->storage->instanceOfStorage(Encryption::class)) { // in case of encryption being enabled after some files are already uploaded, some entries will have an unencrypted_size of 0 and a non-zero size + $eq = $builder->expr()->eq('unencrypted_size', $builder->expr()->literal(0, IQueryBuilder::PARAM_INT)); + $sizeColumn = $builder->getColumnName('size'); + $unencryptedSizeColumn = $builder->getColumnName('unencrypted_size'); $builder->set('unencrypted_size', $builder->func()->greatest( $builder->func()->add( - $builder->func()->case([ - ['when' => $builder->expr()->eq('unencrypted_size', $builder->expr()->literal(0, IQueryBuilder::PARAM_INT)), 'then' => 'size'] - ], 'unencrypted_size'), + $builder->createFunction("CASE WHEN $eq THEN $unencryptedSizeColumn ELSE $sizeColumn END"), $builder->createNamedParameter($sizeDifference) ), $builder->createNamedParameter(-1, IQueryBuilder::PARAM_INT) )); } - $a = $builder->getSQL(); $builder->execute(); } } diff --git a/lib/private/Files/Cache/Scanner.php b/lib/private/Files/Cache/Scanner.php index fb32b64c012..4799c3bff7d 100644 --- a/lib/private/Files/Cache/Scanner.php +++ b/lib/private/Files/Cache/Scanner.php @@ -339,7 +339,7 @@ class Scanner extends BasicEmitter implements IScanner { try { $data = $this->scanFile($path, $reuse, -1, null, $lock); if ($data and $data['mimetype'] === 'httpd/unix-directory') { - $size = $this->scanChildren($path, $recursive, $reuse, $data['fileid'], $lock); + $size = $this->scanChildren($path, $recursive, $reuse, $data['fileid'], $lock, $data); $data['size'] = $size; } } finally { @@ -376,9 +376,10 @@ class Scanner extends BasicEmitter implements IScanner { * @param int $reuse * @param int $folderId id for the folder to be scanned * @param bool $lock set to false to disable getting an additional read lock during scanning + * @param array $data the data of the folder before (re)scanning the children * @return int the size of the scanned folder or -1 if the size is unknown at this stage */ - protected function scanChildren($path, $recursive = self::SCAN_RECURSIVE, $reuse = -1, $folderId = null, $lock = true) { + protected function scanChildren($path, $recursive = self::SCAN_RECURSIVE, $reuse = -1, $folderId = null, $lock = true, array $data = []) { if ($reuse === -1) { $reuse = ($recursive === self::SCAN_SHALLOW) ? self::REUSE_ETAG | self::REUSE_SIZE : self::REUSE_ETAG; } @@ -397,7 +398,8 @@ class Scanner extends BasicEmitter implements IScanner { $size += $childSize; } } - if ($this->cacheActive) { + $oldSize = $data['size'] ?? null; + if ($this->cacheActive && $oldSize !== $size) { $this->cache->update($folderId, ['size' => $size]); } $this->emit('\OC\Files\Cache\Scanner', 'postScanFolder', [$path, $this->storageId]); @@ -409,6 +411,11 @@ class Scanner extends BasicEmitter implements IScanner { $existingChildren = $this->getExistingChildren($folderId); $newChildren = iterator_to_array($this->storage->getDirectoryContent($path)); + if (count($existingChildren) === 0 && count($newChildren) === 0) { + // no need to do a transaction + return []; + } + if ($this->useTransactions) { \OC::$server->getDatabaseConnection()->beginTransaction(); } diff --git a/lib/private/Files/Cache/SearchBuilder.php b/lib/private/Files/Cache/SearchBuilder.php index b5f548dd563..1a8c3637063 100644 --- a/lib/private/Files/Cache/SearchBuilder.php +++ b/lib/private/Files/Cache/SearchBuilder.php @@ -54,7 +54,7 @@ class SearchBuilder { ISearchComparison::COMPARE_GREATER_THAN => 'lte', ISearchComparison::COMPARE_GREATER_THAN_EQUAL => 'lt', ISearchComparison::COMPARE_LESS_THAN => 'gte', - ISearchComparison::COMPARE_LESS_THAN_EQUAL => 'lt', + ISearchComparison::COMPARE_LESS_THAN_EQUAL => 'gt', ]; public const TAG_FAVORITE = '_$!<Favorite>!$_'; diff --git a/lib/private/Files/Cache/Wrapper/CacheJail.php b/lib/private/Files/Cache/Wrapper/CacheJail.php index 4053042edd9..834c9fd3d72 100644 --- a/lib/private/Files/Cache/Wrapper/CacheJail.php +++ b/lib/private/Files/Cache/Wrapper/CacheJail.php @@ -324,11 +324,13 @@ class CacheJail extends CacheWrapper { } public function getCacheEntryFromSearchResult(ICacheEntry $rawEntry): ?ICacheEntry { - $rawEntry = $this->getCache()->getCacheEntryFromSearchResult($rawEntry); - if ($rawEntry) { - $jailedPath = $this->getJailedPath($rawEntry->getPath()); - if ($jailedPath !== null) { - return $this->formatCacheEntry(clone $rawEntry) ?: null; + if ($this->getGetUnjailedRoot() === '' || strpos($rawEntry->getPath(), $this->getGetUnjailedRoot()) === 0) { + $rawEntry = $this->getCache()->getCacheEntryFromSearchResult($rawEntry); + if ($rawEntry) { + $jailedPath = $this->getJailedPath($rawEntry->getPath()); + if ($jailedPath !== null) { + return $this->formatCacheEntry(clone $rawEntry) ?: null; + } } } diff --git a/lib/private/Files/Config/UserMountCache.php b/lib/private/Files/Config/UserMountCache.php index 685057a7860..3540b563742 100644 --- a/lib/private/Files/Config/UserMountCache.php +++ b/lib/private/Files/Config/UserMountCache.php @@ -90,7 +90,12 @@ class UserMountCache implements IUserMountCache { $cachedMounts = $this->getMountsForUser($user); if (is_array($mountProviderClasses)) { - $cachedMounts = array_filter($cachedMounts, function (ICachedMountInfo $mountInfo) use ($mountProviderClasses) { + $cachedMounts = array_filter($cachedMounts, function (ICachedMountInfo $mountInfo) use ($mountProviderClasses, $newMounts) { + // for existing mounts that didn't have a mount provider set + // we still want the ones that map to new mounts + if ($mountInfo->getMountProvider() === '' && isset($newMounts[$mountInfo->getRootId()])) { + return true; + } return in_array($mountInfo->getMountProvider(), $mountProviderClasses); }); } diff --git a/lib/private/Files/ObjectStore/NoopScanner.php b/lib/private/Files/ObjectStore/NoopScanner.php index 3b8cbdb18bb..bdfc93758d4 100644 --- a/lib/private/Files/ObjectStore/NoopScanner.php +++ b/lib/private/Files/ObjectStore/NoopScanner.php @@ -68,7 +68,7 @@ class NoopScanner extends Scanner { * @param array $folderData existing cache data for the folder to be scanned * @return int the size of the scanned folder or -1 if the size is unknown at this stage */ - protected function scanChildren($path, $recursive = self::SCAN_RECURSIVE, $reuse = -1, $folderId = null, $lock = true) { + protected function scanChildren($path, $recursive = self::SCAN_RECURSIVE, $reuse = -1, $folderId = null, $lock = true, array $data = []) { return 0; } diff --git a/lib/private/Files/View.php b/lib/private/Files/View.php index d12869fbdaa..e5394e72ffe 100644 --- a/lib/private/Files/View.php +++ b/lib/private/Files/View.php @@ -49,9 +49,7 @@ namespace OC\Files; use Icewind\Streams\CallbackWrapper; use OC\Files\Mount\MoveableMount; use OC\Files\Storage\Storage; -use OC\User\DisplayNameCache; use OC\User\LazyUser; -use OC\User\User; use OCA\Files_Sharing\SharedMount; use OCP\Constants; use OCP\Files\Cache\ICacheEntry; @@ -103,8 +101,6 @@ class View { private LoggerInterface $logger; - private DisplayNameCache $displayNameCache; - /** * @param string $root * @throws \Exception If $root contains an invalid path @@ -121,7 +117,6 @@ class View { $this->lockingProvider = \OC::$server->getLockingProvider(); $this->lockingEnabled = !($this->lockingProvider instanceof \OC\Lock\NoopLockingProvider); $this->userManager = \OC::$server->getUserManager(); - $this->displayNameCache = \OC::$server->get(DisplayNameCache::class); $this->logger = \OC::$server->get(LoggerInterface::class); } @@ -1319,7 +1314,7 @@ class View { * @return IUser */ private function getUserObjectForOwner(string $ownerId) { - return new LazyUser($ownerId, $this->displayNameCache, $this->userManager); + return new LazyUser($ownerId, $this->userManager); } /** diff --git a/lib/private/Metadata/Provider/ExifProvider.php b/lib/private/Metadata/Provider/ExifProvider.php index 2e1eb1d4208..892671556b3 100644 --- a/lib/private/Metadata/Provider/ExifProvider.php +++ b/lib/private/Metadata/Provider/ExifProvider.php @@ -17,7 +17,7 @@ class ExifProvider implements IMetadataProvider { public function execute(File $file): array { $fileDescriptor = $file->fopen('rb'); - $data = @exif_read_data($fileDescriptor, 'ANY_TAG', true); + $data = exif_read_data($fileDescriptor, 'COMPUTED', true); $size = new FileMetadata(); $size->setGroupName('size'); diff --git a/lib/private/Notification/Manager.php b/lib/private/Notification/Manager.php index c707884355b..148ad3e912d 100644 --- a/lib/private/Notification/Manager.php +++ b/lib/private/Notification/Manager.php @@ -27,7 +27,6 @@ declare(strict_types=1); namespace OC\Notification; use OC\AppFramework\Bootstrap\Coordinator; -use OCP\AppFramework\Utility\ITimeFactory; use OCP\ICache; use OCP\ICacheFactory; use OCP\IUserManager; @@ -50,8 +49,6 @@ class Manager implements IManager { private $userManager; /** @var ICache */ protected $cache; - /** @var ITimeFactory */ - protected $timeFactory; /** @var IRegistry */ protected $subscription; /** @var LoggerInterface */ @@ -79,14 +76,12 @@ class Manager implements IManager { public function __construct(IValidator $validator, IUserManager $userManager, ICacheFactory $cacheFactory, - ITimeFactory $timeFactory, IRegistry $subscription, LoggerInterface $logger, Coordinator $coordinator) { $this->validator = $validator; $this->userManager = $userManager; $this->cache = $cacheFactory->createDistributed('notifications'); - $this->timeFactory = $timeFactory; $this->subscription = $subscription; $this->logger = $logger; $this->coordinator = $coordinator; @@ -310,10 +305,7 @@ class Manager implements IManager { * users overload our infrastructure. For this reason we have to rate-limit the * use of push notifications. If you need this feature, consider using Nextcloud Enterprise. */ - // TODO Remove time check after 1st March 2022 - $isFairUse = $this->timeFactory->getTime() < 1646089200 - || $this->subscription->delegateHasValidSubscription() - || $this->userManager->countSeenUsers() < 5000; + $isFairUse = $this->subscription->delegateHasValidSubscription() || $this->userManager->countSeenUsers() < 5000; $pushAllowed = $isFairUse ? 'yes' : 'no'; $this->cache->set('push_fair_use', $pushAllowed, 3600); } diff --git a/lib/private/Server.php b/lib/private/Server.php index b473f4e75c0..7223c3b8ae3 100644 --- a/lib/private/Server.php +++ b/lib/private/Server.php @@ -151,6 +151,7 @@ use OC\SystemTag\ManagerFactory as SystemTagManagerFactory; use OC\Tagging\TagMapper; use OC\Talk\Broker; use OC\Template\JSCombiner; +use OC\User\DisplayNameCache; use OC\User\Listeners\UserChangedListener; use OC\User\Listeners\UserDeletedListener; use OCA\Theming\ImageManager; @@ -474,6 +475,10 @@ class Server extends ServerContainer implements IServerContainer { $this->registerDeprecatedAlias('UserManager', \OC\User\Manager::class); $this->registerAlias(\OCP\IUserManager::class, \OC\User\Manager::class); + $this->registerService(DisplayNameCache::class, function (ContainerInterface $c) { + return $c->get(\OC\User\Manager::class)->getDisplayNameCache(); + }); + $this->registerService(\OCP\IGroupManager::class, function (ContainerInterface $c) { $groupManager = new \OC\Group\Manager( $this->get(IUserManager::class), diff --git a/lib/private/Setup/MySQL.php b/lib/private/Setup/MySQL.php index e878ed4d9aa..e3004c269bc 100644 --- a/lib/private/Setup/MySQL.php +++ b/lib/private/Setup/MySQL.php @@ -129,6 +129,7 @@ class MySQL extends AbstractDatabase { 'exception' => $ex, 'app' => 'mysql.setup', ]); + throw $ex; } } @@ -137,6 +138,19 @@ class MySQL extends AbstractDatabase { * @param IDBConnection $connection */ private function createSpecificUser($username, $connection): void { + $rootUser = $this->dbUser; + $rootPassword = $this->dbPassword; + + //create a random password so we don't need to store the admin password in the config file + $saveSymbols = str_replace(['\"', '\\', '\'', '`'], '', ISecureRandom::CHAR_SYMBOLS); + $password = $this->random->generate(22, ISecureRandom::CHAR_ALPHANUMERIC . $saveSymbols) + . $this->random->generate(2, ISecureRandom::CHAR_UPPER) + . $this->random->generate(2, ISecureRandom::CHAR_LOWER) + . $this->random->generate(2, ISecureRandom::CHAR_DIGITS) + . $this->random->generate(2, $saveSymbols) + ; + $this->dbPassword = str_shuffle($password); + try { //user already specified in config $oldUser = $this->config->getValue('dbuser', false); @@ -159,10 +173,6 @@ class MySQL extends AbstractDatabase { if (count($data) === 0) { //use the admin login data for the new database user $this->dbUser = $adminUser; - - //create a random password so we don't need to store the admin password in the config file - $this->dbPassword = $this->random->generate(30, ISecureRandom::CHAR_ALPHANUMERIC); - $this->createDBUser($connection); break; @@ -179,6 +189,9 @@ class MySQL extends AbstractDatabase { 'exception' => $ex, 'app' => 'mysql.setup', ]); + // Restore the original credentials + $this->dbUser = $rootUser; + $this->dbPassword = $rootPassword; } $this->config->setValues([ diff --git a/lib/private/User/DisplayNameCache.php b/lib/private/User/DisplayNameCache.php index 22a79863e49..5d1cc8940d7 100644 --- a/lib/private/User/DisplayNameCache.php +++ b/lib/private/User/DisplayNameCache.php @@ -47,7 +47,7 @@ class DisplayNameCache implements IEventListener { $this->userManager = $userManager; } - public function getDisplayName(string $userId) { + public function getDisplayName(string $userId): ?string { if (isset($this->cache[$userId])) { return $this->cache[$userId]; } @@ -61,7 +61,7 @@ class DisplayNameCache implements IEventListener { if ($user) { $displayName = $user->getDisplayName(); } else { - $displayName = $userId; + $displayName = null; } $this->cache[$userId] = $displayName; $this->memCache->set($userId, $displayName, 60 * 10); // 10 minutes diff --git a/lib/private/User/LazyUser.php b/lib/private/User/LazyUser.php index 8e93d6481ab..096578b8f37 100644 --- a/lib/private/User/LazyUser.php +++ b/lib/private/User/LazyUser.php @@ -29,12 +29,10 @@ use OCP\UserInterface; class LazyUser implements IUser { private ?IUser $user = null; - private DisplayNameCache $displayNameCache; private string $uid; private IUserManager $userManager; - public function __construct(string $uid, DisplayNameCache $displayNameCache, IUserManager $userManager) { - $this->displayNameCache = $displayNameCache; + public function __construct(string $uid, IUserManager $userManager) { $this->uid = $uid; $this->userManager = $userManager; } @@ -53,7 +51,7 @@ class LazyUser implements IUser { } public function getDisplayName() { - return $this->displayNameCache->getDisplayName($this->uid); + return $this->userManager->getDisplayName($this->uid) ?? $this->uid; } public function setDisplayName($displayName) { diff --git a/lib/private/User/Manager.php b/lib/private/User/Manager.php index a6f56585325..be5151313c4 100644 --- a/lib/private/User/Manager.php +++ b/lib/private/User/Manager.php @@ -95,6 +95,8 @@ class Manager extends PublicEmitter implements IUserManager { /** @var IEventDispatcher */ private $eventDispatcher; + private DisplayNameCache $displayNameCache; + public function __construct(IConfig $config, EventDispatcherInterface $oldDispatcher, ICacheFactory $cacheFactory, @@ -108,6 +110,7 @@ class Manager extends PublicEmitter implements IUserManager { unset($cachedUsers[$user->getUID()]); }); $this->eventDispatcher = $eventDispatcher; + $this->displayNameCache = new DisplayNameCache($cacheFactory, $this); } /** @@ -185,6 +188,10 @@ class Manager extends PublicEmitter implements IUserManager { return null; } + public function getDisplayName(string $uid): ?string { + return $this->displayNameCache->getDisplayName($uid); + } + /** * get or construct the user object * @@ -742,4 +749,8 @@ class Manager extends PublicEmitter implements IUserManager { return !file_exists(rtrim($dataDirectory, '/') . '/' . $uid); } + + public function getDisplayNameCache(): DisplayNameCache { + return $this->displayNameCache; + } } diff --git a/lib/public/DB/QueryBuilder/IExpressionBuilder.php b/lib/public/DB/QueryBuilder/IExpressionBuilder.php index 8f7cd10dee5..53dc1fa5a7f 100644 --- a/lib/public/DB/QueryBuilder/IExpressionBuilder.php +++ b/lib/public/DB/QueryBuilder/IExpressionBuilder.php @@ -107,7 +107,7 @@ interface IExpressionBuilder { * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants * required when comparing text fields for oci compatibility * - * @return IQueryFunction + * @return string * @since 8.2.0 - Parameter $type was added in 9.0.0 * * @psalm-taint-sink sql $x @@ -115,7 +115,7 @@ interface IExpressionBuilder { * @psalm-taint-sink sql $y * @psalm-taint-sink sql $type */ - public function comparison($x, string $operator, $y, $type = null): IQueryFunction; + public function comparison($x, string $operator, $y, $type = null): string; /** * Creates an equality comparison expression with the given arguments. @@ -132,14 +132,14 @@ interface IExpressionBuilder { * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants * required when comparing text fields for oci compatibility * - * @return IQueryFunction + * @return string * @since 8.2.0 - Parameter $type was added in 9.0.0 * * @psalm-taint-sink sql $x * @psalm-taint-sink sql $y * @psalm-taint-sink sql $type */ - public function eq($x, $y, $type = null): IQueryFunction; + public function eq($x, $y, $type = null): string; /** * Creates a non equality comparison expression with the given arguments. @@ -155,14 +155,14 @@ interface IExpressionBuilder { * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants * required when comparing text fields for oci compatibility * - * @return IQueryFunction + * @return string * @since 8.2.0 - Parameter $type was added in 9.0.0 * * @psalm-taint-sink sql $x * @psalm-taint-sink sql $y * @psalm-taint-sink sql $type */ - public function neq($x, $y, $type = null): IQueryFunction; + public function neq($x, $y, $type = null): string; /** * Creates a lower-than comparison expression with the given arguments. @@ -178,14 +178,14 @@ interface IExpressionBuilder { * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants * required when comparing text fields for oci compatibility * - * @return IQueryFunction + * @return string * @since 8.2.0 - Parameter $type was added in 9.0.0 * * @psalm-taint-sink sql $x * @psalm-taint-sink sql $y * @psalm-taint-sink sql $type */ - public function lt($x, $y, $type = null): IQueryFunction; + public function lt($x, $y, $type = null): string; /** * Creates a lower-than-equal comparison expression with the given arguments. @@ -201,14 +201,14 @@ interface IExpressionBuilder { * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants * required when comparing text fields for oci compatibility * - * @return IQueryFunction + * @return string * @since 8.2.0 - Parameter $type was added in 9.0.0 * * @psalm-taint-sink sql $x * @psalm-taint-sink sql $y * @psalm-taint-sink sql $type */ - public function lte($x, $y, $type = null): IQueryFunction; + public function lte($x, $y, $type = null): string; /** * Creates a greater-than comparison expression with the given arguments. @@ -224,14 +224,14 @@ interface IExpressionBuilder { * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants * required when comparing text fields for oci compatibility * - * @return IQueryFunction + * @return string * @since 8.2.0 - Parameter $type was added in 9.0.0 * * @psalm-taint-sink sql $x * @psalm-taint-sink sql $y * @psalm-taint-sink sql $type */ - public function gt($x, $y, $type = null): IQueryFunction; + public function gt($x, $y, $type = null): string; /** * Creates a greater-than-equal comparison expression with the given arguments. @@ -247,38 +247,38 @@ interface IExpressionBuilder { * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants * required when comparing text fields for oci compatibility * - * @return IQueryFunction + * @return string * @since 8.2.0 - Parameter $type was added in 9.0.0 * * @psalm-taint-sink sql $x * @psalm-taint-sink sql $y * @psalm-taint-sink sql $type */ - public function gte($x, $y, $type = null): IQueryFunction; + public function gte($x, $y, $type = null): string; /** * Creates an IS NULL expression with the given arguments. * * @param string|ILiteral|IParameter|IQueryFunction $x The field in string format to be restricted by IS NULL. * - * @return IQueryFunction + * @return string * @since 8.2.0 * * @psalm-taint-sink sql $x */ - public function isNull($x): IQueryFunction; + public function isNull($x): string; /** * Creates an IS NOT NULL expression with the given arguments. * * @param string|ILiteral|IParameter|IQueryFunction $x The field in string format to be restricted by IS NOT NULL. * - * @return IQueryFunction + * @return string * @since 8.2.0 * * @psalm-taint-sink sql $x */ - public function isNotNull($x): IQueryFunction; + public function isNotNull($x): string; /** * Creates a LIKE() comparison expression with the given arguments. @@ -288,14 +288,14 @@ interface IExpressionBuilder { * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants * required when comparing text fields for oci compatibility * - * @return IQueryFunction + * @return string * @since 8.2.0 - Parameter $type was added in 9.0.0 * * @psalm-taint-sink sql $x * @psalm-taint-sink sql $y * @psalm-taint-sink sql $type */ - public function like($x, $y, $type = null): IQueryFunction; + public function like($x, $y, $type = null): string; /** * Creates a NOT LIKE() comparison expression with the given arguments. @@ -305,14 +305,14 @@ interface IExpressionBuilder { * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants * required when comparing text fields for oci compatibility * - * @return IQueryFunction + * @return string * @since 8.2.0 - Parameter $type was added in 9.0.0 * * @psalm-taint-sink sql $x * @psalm-taint-sink sql $y * @psalm-taint-sink sql $type */ - public function notLike($x, $y, $type = null): IQueryFunction; + public function notLike($x, $y, $type = null): string; /** * Creates a ILIKE() comparison expression with the given arguments. @@ -322,14 +322,14 @@ interface IExpressionBuilder { * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants * required when comparing text fields for oci compatibility * - * @return IQueryFunction + * @return string * @since 9.0.0 * * @psalm-taint-sink sql $x * @psalm-taint-sink sql $y * @psalm-taint-sink sql $type */ - public function iLike($x, $y, $type = null): IQueryFunction; + public function iLike($x, $y, $type = null): string; /** * Creates a IN () comparison expression with the given arguments. @@ -339,14 +339,14 @@ interface IExpressionBuilder { * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants * required when comparing text fields for oci compatibility * - * @return IQueryFunction + * @return string * @since 8.2.0 - Parameter $type was added in 9.0.0 * * @psalm-taint-sink sql $x * @psalm-taint-sink sql $y * @psalm-taint-sink sql $type */ - public function in($x, $y, $type = null): IQueryFunction; + public function in($x, $y, $type = null): string; /** * Creates a NOT IN () comparison expression with the given arguments. @@ -356,36 +356,36 @@ interface IExpressionBuilder { * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants * required when comparing text fields for oci compatibility * - * @return IQueryFunction + * @return string * @since 8.2.0 - Parameter $type was added in 9.0.0 * * @psalm-taint-sink sql $x * @psalm-taint-sink sql $y * @psalm-taint-sink sql $type */ - public function notIn($x, $y, $type = null): IQueryFunction; + public function notIn($x, $y, $type = null): string; /** * Creates a $x = '' statement, because Oracle needs a different check * * @param string|ILiteral|IParameter|IQueryFunction $x The field in string format to be inspected by the comparison. - * @return IQueryFunction + * @return string * @since 13.0.0 * * @psalm-taint-sink sql $x */ - public function emptyString($x): IQueryFunction; + public function emptyString($x): string; /** * Creates a `$x <> ''` statement, because Oracle needs a different check * * @param string|ILiteral|IParameter|IQueryFunction $x The field in string format to be inspected by the comparison. - * @return IQueryFunction + * @return string * @since 13.0.0 * * @psalm-taint-sink sql $x */ - public function nonEmptyString($x): IQueryFunction; + public function nonEmptyString($x): string; /** diff --git a/lib/public/DB/QueryBuilder/IFunctionBuilder.php b/lib/public/DB/QueryBuilder/IFunctionBuilder.php index 811e8d06aaf..d4edc8ea9f8 100644 --- a/lib/public/DB/QueryBuilder/IFunctionBuilder.php +++ b/lib/public/DB/QueryBuilder/IFunctionBuilder.php @@ -188,16 +188,4 @@ interface IFunctionBuilder { * @since 18.0.0 */ public function least($x, $y): IQueryFunction; - - /** - * Takes the minimum of multiple values - * - * If you want to get the minimum value of all rows in a column, use `min` instead - * - * @param array<array{"when": string|ILiteral|IParameter|IQueryFunction, "then": string|ILiteral|IParameter|IQueryFunction}> $whens - * @param string|ILiteral|IParameter|IQueryFunction $else - * @return IQueryFunction - * @since 18.0.0 - */ - public function case(array $whens, $else): IQueryFunction; } diff --git a/lib/public/DB/QueryBuilder/IQueryBuilder.php b/lib/public/DB/QueryBuilder/IQueryBuilder.php index 446e9a00b4c..218b7d8cb2d 100644 --- a/lib/public/DB/QueryBuilder/IQueryBuilder.php +++ b/lib/public/DB/QueryBuilder/IQueryBuilder.php @@ -503,7 +503,7 @@ interface IQueryBuilder { * @param string $fromAlias The alias that points to a from clause. * @param string $join The table name to join. * @param string $alias The alias of the join table. - * @param string|IQueryFunction|ICompositeExpression|null $condition The condition for the join. + * @param string|ICompositeExpression|null $condition The condition for the join. * * @return $this This QueryBuilder instance. * @since 8.2.0 @@ -528,7 +528,7 @@ interface IQueryBuilder { * @param string $fromAlias The alias that points to a from clause. * @param string $join The table name to join. * @param string $alias The alias of the join table. - * @param string|IQueryFunction|ICompositeExpression|null $condition The condition for the join. + * @param string|ICompositeExpression|null $condition The condition for the join. * * @return $this This QueryBuilder instance. * @since 8.2.0 @@ -553,7 +553,7 @@ interface IQueryBuilder { * @param string $fromAlias The alias that points to a from clause. * @param string $join The table name to join. * @param string $alias The alias of the join table. - * @param string|IQueryFunction|ICompositeExpression|null $condition The condition for the join. + * @param string|ICompositeExpression|null $condition The condition for the join. * * @return $this This QueryBuilder instance. * @since 8.2.0 @@ -578,7 +578,7 @@ interface IQueryBuilder { * @param string $fromAlias The alias that points to a from clause. * @param string $join The table name to join. * @param string $alias The alias of the join table. - * @param string|IQueryFunction|ICompositeExpression|null $condition The condition for the join. + * @param string|ICompositeExpression|null $condition The condition for the join. * * @return $this This QueryBuilder instance. * @since 8.2.0 diff --git a/lib/public/IUserManager.php b/lib/public/IUserManager.php index 77e2fc21a22..af0d5f08809 100644 --- a/lib/public/IUserManager.php +++ b/lib/public/IUserManager.php @@ -85,6 +85,15 @@ interface IUserManager { public function get($uid); /** + * Get the display name of a user + * + * @param string $uid + * @return string|null + * @since 25.0.0 + */ + public function getDisplayName(string $uid): ?string; + + /** * check if a user exists * * @param string $uid diff --git a/package-lock.json b/package-lock.json index cb51b77666c..b5266b71442 100644 --- a/package-lock.json +++ b/package-lock.json @@ -104,7 +104,7 @@ "jest": "^26.6.3", "jsdoc": "^3.6.10", "jsdom": "^19.0.0", - "karma": "^6.3.19", + "karma": "^6.4.0", "karma-chrome-launcher": "^3.1.1", "karma-coverage": "2.2.0", "karma-jasmine": "^1.1.2", @@ -121,13 +121,13 @@ "vue-jest": "^4.0.1", "vue-loader": "^15.9.8", "vue-template-compiler": "^2.6.14", - "webpack": "^5.73.0", + "webpack": "^5.74.0", "webpack-cli": "^4.9.2", "webpack-merge": "^5.8.0" }, "engines": { - "node": "^14.0.0", - "npm": "^7.0.0" + "node": "^16.0.0", + "npm": "^7.0.0 || ^8.0.0" } }, "node_modules/@achrinza/node-ipc": { @@ -13419,9 +13419,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", - "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -21363,9 +21363,9 @@ "dev": true }, "node_modules/karma": { - "version": "6.3.19", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.19.tgz", - "integrity": "sha512-NDhWckzES/Y9xMiddyU1RzaKL76/scCsu8Mp0vR0Z3lQRvC3p72+Ab4ppoxs36S9tyPNX5V48yvaV++RNEBPZw==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.0.tgz", + "integrity": "sha512-s8m7z0IF5g/bS5ONT7wsOavhW4i4aFkzD4u4wgzAQWT4HGUeWI3i21cK2Yz6jndMAeHETp5XuNsRoyGJZXVd4w==", "dev": true, "dependencies": { "@colors/colors": "1.5.0", @@ -30979,9 +30979,9 @@ } }, "node_modules/watchpack": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", - "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -31321,20 +31321,20 @@ } }, "node_modules/webpack": { - "version": "5.73.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", - "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==", + "version": "5.74.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", + "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^0.0.51", "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", + "acorn": "^8.7.1", "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.3", + "enhanced-resolve": "^5.10.0", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -31347,7 +31347,7 @@ "schema-utils": "^3.1.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", + "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, "bin": { @@ -31583,9 +31583,9 @@ } }, "node_modules/webpack/node_modules/acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", "bin": { "acorn": "bin/acorn" }, @@ -42512,9 +42512,9 @@ } }, "enhanced-resolve": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", - "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", "requires": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -48553,9 +48553,9 @@ "dev": true }, "karma": { - "version": "6.3.19", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.19.tgz", - "integrity": "sha512-NDhWckzES/Y9xMiddyU1RzaKL76/scCsu8Mp0vR0Z3lQRvC3p72+Ab4ppoxs36S9tyPNX5V48yvaV++RNEBPZw==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.0.tgz", + "integrity": "sha512-s8m7z0IF5g/bS5ONT7wsOavhW4i4aFkzD4u4wgzAQWT4HGUeWI3i21cK2Yz6jndMAeHETp5XuNsRoyGJZXVd4w==", "dev": true, "requires": { "@colors/colors": "1.5.0", @@ -56118,9 +56118,9 @@ } }, "watchpack": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", - "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "requires": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -56408,20 +56408,20 @@ "dev": true }, "webpack": { - "version": "5.73.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", - "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==", + "version": "5.74.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", + "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", "requires": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^0.0.51", "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", + "acorn": "^8.7.1", "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.3", + "enhanced-resolve": "^5.10.0", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -56434,14 +56434,14 @@ "schema-utils": "^3.1.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", + "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, "dependencies": { "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==" }, "acorn-import-assertions": { "version": "1.8.0", diff --git a/package.json b/package.json index b8609ab80bb..1b140f2f5af 100644 --- a/package.json +++ b/package.json @@ -124,7 +124,7 @@ "jest": "^26.6.3", "jsdoc": "^3.6.10", "jsdom": "^19.0.0", - "karma": "^6.3.19", + "karma": "^6.4.0", "karma-chrome-launcher": "^3.1.1", "karma-coverage": "2.2.0", "karma-jasmine": "^1.1.2", @@ -141,7 +141,7 @@ "vue-jest": "^4.0.1", "vue-loader": "^15.9.8", "vue-template-compiler": "^2.6.14", - "webpack": "^5.73.0", + "webpack": "^5.74.0", "webpack-cli": "^4.9.2", "webpack-merge": "^5.8.0" }, diff --git a/tests/lib/DB/QueryBuilder/FunctionBuilderTest.php b/tests/lib/DB/QueryBuilder/FunctionBuilderTest.php index 0ea6e69c956..08392b09d8d 100644 --- a/tests/lib/DB/QueryBuilder/FunctionBuilderTest.php +++ b/tests/lib/DB/QueryBuilder/FunctionBuilderTest.php @@ -501,21 +501,4 @@ class FunctionBuilderTest extends TestCase { $result->closeCursor(); $this->assertEquals(1, $row); } - - public function testCase() { - $query = $this->connection->getQueryBuilder(); - - $query->select($query->func()->case([ - ['when' => $query->expr()->gt($query->expr()->literal(1, IQueryBuilder::PARAM_INT), $query->expr()->literal(2, IQueryBuilder::PARAM_INT)), 'then' => $query->expr()->literal('first')], - ['when' => $query->expr()->lt($query->expr()->literal(1, IQueryBuilder::PARAM_INT), $query->expr()->literal(2, IQueryBuilder::PARAM_INT)), 'then' => $query->expr()->literal('second')], - ['when' => $query->expr()->eq($query->expr()->literal(1, IQueryBuilder::PARAM_INT), $query->expr()->literal(2, IQueryBuilder::PARAM_INT)), 'then' => $query->expr()->literal('third')], - ], $query->createNamedParameter('else'))); - $query->from('appconfig') - ->setMaxResults(1); - - $result = $query->execute(); - $row = $result->fetchOne(); - $result->closeCursor(); - $this->assertEquals('second', $row); - } } diff --git a/tests/lib/Files/Cache/ScannerTest.php b/tests/lib/Files/Cache/ScannerTest.php index 29e619cd09b..e4c052f6025 100644 --- a/tests/lib/Files/Cache/ScannerTest.php +++ b/tests/lib/Files/Cache/ScannerTest.php @@ -8,7 +8,14 @@ namespace Test\Files\Cache; +use OC; +use OC\Files\Cache\Cache; use OC\Files\Cache\CacheEntry; +use OC\Files\Cache\Scanner; +use OC\Files\Storage\Storage; +use OC\Files\Storage\Temporary; +use OCP\Files\Cache\IScanner; +use Test\TestCase; /** * Class ScannerTest @@ -17,34 +24,21 @@ use OC\Files\Cache\CacheEntry; * * @package Test\Files\Cache */ -class ScannerTest extends \Test\TestCase { - /** - * @var \OC\Files\Storage\Storage $storage - */ - private $storage; - - /** - * @var \OC\Files\Cache\Scanner $scanner - */ - private $scanner; - - /** - * @var \OC\Files\Cache\Cache $cache - */ - private $cache; +class ScannerTest extends TestCase { + private Storage $storage; + private Scanner $scanner; + private Cache $cache; protected function setUp(): void { parent::setUp(); - $this->storage = new \OC\Files\Storage\Temporary([]); - $this->scanner = new \OC\Files\Cache\Scanner($this->storage); - $this->cache = new \OC\Files\Cache\Cache($this->storage); + $this->storage = new Temporary([]); + $this->scanner = new Scanner($this->storage); + $this->cache = new Cache($this->storage); } protected function tearDown(): void { - if ($this->cache) { - $this->cache->clear(); - } + $this->cache->clear(); parent::tearDown(); } @@ -60,7 +54,7 @@ class ScannerTest extends \Test\TestCase { $this->assertEquals($cachedData['mimetype'], 'text/plain'); $this->assertNotEquals($cachedData['parent'], -1); //parent folders should be scanned automatically - $data = file_get_contents(\OC::$SERVERROOT . '/core/img/logo/logo.png'); + $data = file_get_contents(OC::$SERVERROOT . '/core/img/logo/logo.png'); $this->storage->file_put_contents('foo.png', $data); $this->scanner->scanFile('foo.png'); @@ -74,7 +68,7 @@ class ScannerTest extends \Test\TestCase { $data = "dummy file data\n"; $this->storage->file_put_contents('foo🙈.txt', $data); - if (\OC::$server->getDatabaseConnection()->supports4ByteText()) { + if (OC::$server->getDatabaseConnection()->supports4ByteText()) { $this->assertNotNull($this->scanner->scanFile('foo🙈.txt')); $this->assertTrue($this->cache->inCache('foo🙈.txt'), true); @@ -98,7 +92,7 @@ class ScannerTest extends \Test\TestCase { private function fillTestFolders() { $textData = "dummy file data\n"; - $imgData = file_get_contents(\OC::$SERVERROOT . '/core/img/logo/logo.png'); + $imgData = file_get_contents(OC::$SERVERROOT . '/core/img/logo/logo.png'); $this->storage->mkdir('folder'); $this->storage->file_put_contents('foo.txt', $textData); $this->storage->file_put_contents('foo.png', $imgData); @@ -130,7 +124,7 @@ class ScannerTest extends \Test\TestCase { public function testShallow() { $this->fillTestFolders(); - $this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW); + $this->scanner->scan('', IScanner::SCAN_SHALLOW); $this->assertEquals($this->cache->inCache(''), true); $this->assertEquals($this->cache->inCache('foo.txt'), true); $this->assertEquals($this->cache->inCache('foo.png'), true); @@ -143,7 +137,7 @@ class ScannerTest extends \Test\TestCase { $this->assertEquals(-1, $cachedDataFolder['size']); $this->assertEquals(-1, $cachedDataFolder2['size']); - $this->scanner->scan('folder', \OC\Files\Cache\Scanner::SCAN_SHALLOW); + $this->scanner->scan('folder', IScanner::SCAN_SHALLOW); $cachedDataFolder2 = $this->cache->get('folder'); @@ -160,7 +154,7 @@ class ScannerTest extends \Test\TestCase { $this->storage->mkdir('folder2'); $this->storage->file_put_contents('folder2/bar.txt', 'foobar'); - $this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW); + $this->scanner->scan('', IScanner::SCAN_SHALLOW); $this->assertFalse($this->cache->inCache('folder/bar.txt')); $this->assertFalse($this->cache->inCache('folder/2bar.txt')); $cachedData = $this->cache->get(''); @@ -182,7 +176,7 @@ class ScannerTest extends \Test\TestCase { $this->storage->mkdir('folder2'); $this->storage->file_put_contents('folder2/bar.txt', 'foobar'); - $this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW); + $this->scanner->scan('', IScanner::SCAN_SHALLOW); $this->assertFalse($this->cache->inCache('folder/bar.txt')); $this->assertFalse($this->cache->inCache('folder/2bar.txt')); $this->assertFalse($this->cache->inCache('folder2/bar.txt')); @@ -191,7 +185,7 @@ class ScannerTest extends \Test\TestCase { $cachedData = $this->cache->get(''); $this->assertEquals(-1, $cachedData['size']); - $this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_RECURSIVE_INCOMPLETE, \OC\Files\Cache\Scanner::REUSE_ETAG | \OC\Files\Cache\Scanner::REUSE_SIZE); + $this->scanner->scan('', IScanner::SCAN_RECURSIVE_INCOMPLETE, IScanner::REUSE_ETAG | IScanner::REUSE_SIZE); $this->assertTrue($this->cache->inCache('folder/bar.txt')); $this->assertTrue($this->cache->inCache('folder/bar.txt')); @@ -248,7 +242,7 @@ class ScannerTest extends \Test\TestCase { $oldData = $this->cache->get(''); $this->storage->unlink('folder/bar.txt'); $this->cache->put('folder', ['mtime' => $this->storage->filemtime('folder'), 'storage_mtime' => $this->storage->filemtime('folder')]); - $this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW, \OC\Files\Cache\Scanner::REUSE_SIZE); + $this->scanner->scan('', IScanner::SCAN_SHALLOW, IScanner::REUSE_SIZE); $newData = $this->cache->get(''); $this->assertIsString($oldData['etag']); $this->assertIsString($newData['etag']); @@ -256,25 +250,25 @@ class ScannerTest extends \Test\TestCase { $this->assertEquals($oldData['size'], $newData['size']); $oldData = $newData; - $this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW, \OC\Files\Cache\Scanner::REUSE_ETAG); + $this->scanner->scan('', IScanner::SCAN_SHALLOW, IScanner::REUSE_ETAG); $newData = $this->cache->get(''); $this->assertSame($oldData['etag'], $newData['etag']); $this->assertEquals(-1, $newData['size']); - $this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_RECURSIVE); + $this->scanner->scan('', IScanner::SCAN_RECURSIVE); $oldData = $this->cache->get(''); $this->assertNotEquals(-1, $oldData['size']); - $this->scanner->scanFile('', \OC\Files\Cache\Scanner::REUSE_ETAG + \OC\Files\Cache\Scanner::REUSE_SIZE); + $this->scanner->scanFile('', IScanner::REUSE_ETAG + IScanner::REUSE_SIZE); $newData = $this->cache->get(''); $this->assertSame($oldData['etag'], $newData['etag']); $this->assertEquals($oldData['size'], $newData['size']); - $this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_RECURSIVE, \OC\Files\Cache\Scanner::REUSE_ETAG + \OC\Files\Cache\Scanner::REUSE_SIZE); + $this->scanner->scan('', IScanner::SCAN_RECURSIVE, IScanner::REUSE_ETAG + IScanner::REUSE_SIZE); $newData = $this->cache->get(''); $this->assertSame($oldData['etag'], $newData['etag']); $this->assertEquals($oldData['size'], $newData['size']); - $this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW, \OC\Files\Cache\Scanner::REUSE_ETAG + \OC\Files\Cache\Scanner::REUSE_SIZE); + $this->scanner->scan('', IScanner::SCAN_SHALLOW, IScanner::REUSE_ETAG + IScanner::REUSE_SIZE); $newData = $this->cache->get(''); $this->assertSame($oldData['etag'], $newData['etag']); $this->assertEquals($oldData['size'], $newData['size']); @@ -286,7 +280,7 @@ class ScannerTest extends \Test\TestCase { $this->scanner->scan(''); $this->assertTrue($this->cache->inCache('foo.txt')); $this->storage->unlink('foo.txt'); - $this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW); + $this->scanner->scan('', IScanner::SCAN_SHALLOW); $this->assertFalse($this->cache->inCache('foo.txt')); } @@ -296,7 +290,7 @@ class ScannerTest extends \Test\TestCase { $this->scanner->scan(''); $this->assertTrue($this->cache->inCache('folder/bar.txt')); $this->storage->rmdir('/folder'); - $this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW); + $this->scanner->scan('', IScanner::SCAN_SHALLOW); $this->assertFalse($this->cache->inCache('folder')); $this->assertFalse($this->cache->inCache('folder/bar.txt')); } @@ -317,7 +311,7 @@ class ScannerTest extends \Test\TestCase { $this->scanner->scan('folder/bar.txt'); // manipulate etag to simulate an empty etag - $this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW, \OC\Files\Cache\Scanner::REUSE_ETAG); + $this->scanner->scan('', IScanner::SCAN_SHALLOW, IScanner::REUSE_ETAG); /** @var CacheEntry $data0 */ $data0 = $this->cache->get('folder/bar.txt'); $this->assertIsString($data0['etag']); @@ -329,7 +323,7 @@ class ScannerTest extends \Test\TestCase { $this->cache->put('folder/bar.txt', $data0->getData()); // rescan - $this->scanner->scan('folder/bar.txt', \OC\Files\Cache\Scanner::SCAN_SHALLOW, \OC\Files\Cache\Scanner::REUSE_ETAG); + $this->scanner->scan('folder/bar.txt', IScanner::SCAN_SHALLOW, IScanner::REUSE_ETAG); // verify cache content $newData0 = $this->cache->get('folder/bar.txt'); @@ -344,7 +338,7 @@ class ScannerTest extends \Test\TestCase { $oldFolderId = $this->cache->getId('folder'); // delete the folder without removing the children - $query = \OC::$server->getDatabaseConnection()->getQueryBuilder(); + $query = OC::$server->getDatabaseConnection()->getQueryBuilder(); $query->delete('filecache') ->where($query->expr()->eq('fileid', $query->createNamedParameter($oldFolderId))); $query->execute(); @@ -370,7 +364,7 @@ class ScannerTest extends \Test\TestCase { $oldFolderId = $this->cache->getId('folder'); // delete the folder without removing the children - $query = \OC::$server->getDatabaseConnection()->getQueryBuilder(); + $query = OC::$server->getDatabaseConnection()->getQueryBuilder(); $query->delete('filecache') ->where($query->expr()->eq('fileid', $query->createNamedParameter($oldFolderId))); $query->execute(); @@ -379,7 +373,7 @@ class ScannerTest extends \Test\TestCase { $this->assertEquals($oldFolderId, $cachedData['parent']); $this->assertFalse($this->cache->inCache('folder')); - $this->scanner->scan('folder', \OC\Files\Cache\Scanner::SCAN_SHALLOW); + $this->scanner->scan('folder', IScanner::SCAN_SHALLOW); $this->assertTrue($this->cache->inCache('folder')); $newFolderId = $this->cache->getId('folder'); diff --git a/tests/lib/Files/Config/UserMountCacheTest.php b/tests/lib/Files/Config/UserMountCacheTest.php index 8b26b309daa..f1206781c5e 100644 --- a/tests/lib/Files/Config/UserMountCacheTest.php +++ b/tests/lib/Files/Config/UserMountCacheTest.php @@ -507,4 +507,29 @@ class UserMountCacheTest extends TestCase { $result = $this->cache->getUsedSpaceForUsers([$user1, $user2]); $this->assertEquals(['u1' => 100], $result); } + + + public function testMigrateMountProvider() { + $user1 = $this->userManager->get('u1'); + + [$storage1, $rootId] = $this->getStorage(2); + $rootId = $this->createCacheEntry('', 2); + $mount1 = new MountPoint($storage1, '/foo/'); + $this->cache->registerMounts($user1, [$mount1]); + + $this->clearCache(); + + $cachedMounts = $this->cache->getMountsForUser($user1); + $this->assertCount(1, $cachedMounts); + $this->assertEquals('', $cachedMounts[0]->getMountProvider()); + + $mount1 = new MountPoint($storage1, '/foo/', null, null, null, null, 'dummy'); + $this->cache->registerMounts($user1, [$mount1], ['dummy']); + + $this->clearCache(); + + $cachedMounts = $this->cache->getMountsForUser($user1); + $this->assertCount(1, $cachedMounts); + $this->assertEquals('dummy', $cachedMounts[0]->getMountProvider()); + } } diff --git a/tests/lib/Files/ObjectStore/S3Test.php b/tests/lib/Files/ObjectStore/S3Test.php index a7a95d53375..fd451dc3c01 100644 --- a/tests/lib/Files/ObjectStore/S3Test.php +++ b/tests/lib/Files/ObjectStore/S3Test.php @@ -176,7 +176,7 @@ class S3Test extends ObjectStoreTest { // end of file reached fseek($result, $size); - self:self::assertTrue(feof($result)); + self::assertTrue(feof($result)); $this->assertNoUpload('testfilesizes'); } diff --git a/tests/lib/Notification/ManagerTest.php b/tests/lib/Notification/ManagerTest.php index 400ae3a53ef..6cdd254f001 100644 --- a/tests/lib/Notification/ManagerTest.php +++ b/tests/lib/Notification/ManagerTest.php @@ -27,7 +27,6 @@ use OC\AppFramework\Bootstrap\Coordinator; use OC\AppFramework\Bootstrap\RegistrationContext; use OC\AppFramework\Bootstrap\ServiceRegistration; use OC\Notification\Manager; -use OCP\AppFramework\Utility\ITimeFactory; use OCP\ICache; use OCP\ICacheFactory; use OCP\IUserManager; @@ -51,8 +50,6 @@ class ManagerTest extends TestCase { protected $cacheFactory; /** @var ICache|MockObject */ protected $cache; - /** @var ITimeFactory|MockObject */ - protected $timeFactory; /** @var IRegistry|MockObject */ protected $subscriptionRegistry; /** @var LoggerInterface|MockObject */ @@ -68,7 +65,6 @@ class ManagerTest extends TestCase { $this->validator = $this->createMock(IValidator::class); $this->userManager = $this->createMock(IUserManager::class); $this->cache = $this->createMock(ICache::class); - $this->timeFactory = $this->createMock(ITimeFactory::class); $this->subscriptionRegistry = $this->createMock(IRegistry::class); $this->logger = $this->createMock(LoggerInterface::class); @@ -82,10 +78,10 @@ class ManagerTest extends TestCase { $this->coordinator->method('getRegistrationContext') ->willReturn($this->registrationContext); - $this->manager = new Manager($this->validator, $this->userManager, $this->cacheFactory, $this->timeFactory, $this->subscriptionRegistry, $this->logger, $this->coordinator); + $this->manager = new Manager($this->validator, $this->userManager, $this->cacheFactory, $this->subscriptionRegistry, $this->logger, $this->coordinator); } - public function testRegisterApp() { + public function testRegisterApp(): void { $this->assertEquals([], self::invokePrivate($this->manager, 'getApps')); $this->manager->registerApp(DummyApp::class); @@ -98,7 +94,7 @@ class ManagerTest extends TestCase { $this->assertCount(2, self::invokePrivate($this->manager, 'getApps')); } - public function testRegisterAppInvalid() { + public function testRegisterAppInvalid(): void { $this->manager->registerApp(DummyNotifier::class); $this->logger->expects($this->once()) @@ -106,7 +102,7 @@ class ManagerTest extends TestCase { self::invokePrivate($this->manager, 'getApps'); } - public function testRegisterNotifier() { + public function testRegisterNotifier(): void { $this->assertEquals([], self::invokePrivate($this->manager, 'getNotifiers')); $this->manager->registerNotifierService(DummyNotifier::class); @@ -119,7 +115,7 @@ class ManagerTest extends TestCase { $this->assertCount(2, self::invokePrivate($this->manager, 'getNotifiers')); } - public function testRegisterNotifierBootstrap() { + public function testRegisterNotifierBootstrap(): void { $this->registrationContext->method('getNotifierServices') ->willReturn([ new ServiceRegistration('app', DummyNotifier::class), @@ -129,7 +125,7 @@ class ManagerTest extends TestCase { $this->assertCount(1, self::invokePrivate($this->manager, 'getNotifiers')); } - public function testRegisterNotifierInvalid() { + public function testRegisterNotifierInvalid(): void { $this->manager->registerNotifierService(DummyApp::class); $this->logger->expects($this->once()) @@ -137,13 +133,13 @@ class ManagerTest extends TestCase { self::invokePrivate($this->manager, 'getNotifiers'); } - public function testCreateNotification() { + public function testCreateNotification(): void { $action = $this->manager->createNotification(); - $this->assertInstanceOf('OCP\Notification\INotification', $action); + $this->assertInstanceOf(INotification::class, $action); } - public function testNotify() { - /** @var \OCP\Notification\INotification|\PHPUnit\Framework\MockObject\MockObject $notification */ + public function testNotify(): void { + /** @var INotification|MockObject $notification */ $notification = $this->getMockBuilder(INotification::class) ->disableOriginalConstructor() ->getMock(); @@ -156,7 +152,6 @@ class ManagerTest extends TestCase { $this->validator, $this->userManager, $this->cacheFactory, - $this->timeFactory, $this->subscriptionRegistry, $this->logger, $this->coordinator, @@ -172,10 +167,10 @@ class ManagerTest extends TestCase { } - public function testNotifyInvalid() { + public function testNotifyInvalid(): void { $this->expectException(\InvalidArgumentException::class); - /** @var \OCP\Notification\INotification|\PHPUnit\Framework\MockObject\MockObject $notification */ + /** @var INotification|MockObject $notification */ $notification = $this->getMockBuilder(INotification::class) ->disableOriginalConstructor() ->getMock(); @@ -188,7 +183,6 @@ class ManagerTest extends TestCase { $this->validator, $this->userManager, $this->cacheFactory, - $this->timeFactory, $this->subscriptionRegistry, $this->logger, $this->coordinator, @@ -202,8 +196,8 @@ class ManagerTest extends TestCase { $manager->notify($notification); } - public function testMarkProcessed() { - /** @var \OCP\Notification\INotification|\PHPUnit\Framework\MockObject\MockObject $notification */ + public function testMarkProcessed(): void { + /** @var INotification|MockObject $notification */ $notification = $this->getMockBuilder(INotification::class) ->disableOriginalConstructor() ->getMock(); @@ -213,7 +207,6 @@ class ManagerTest extends TestCase { $this->validator, $this->userManager, $this->cacheFactory, - $this->timeFactory, $this->subscriptionRegistry, $this->logger, $this->coordinator, @@ -228,8 +221,8 @@ class ManagerTest extends TestCase { $manager->markProcessed($notification); } - public function testGetCount() { - /** @var \OCP\Notification\INotification|\PHPUnit\Framework\MockObject\MockObject $notification */ + public function testGetCount(): void { + /** @var INotification|MockObject $notification */ $notification = $this->getMockBuilder(INotification::class) ->disableOriginalConstructor() ->getMock(); @@ -239,7 +232,6 @@ class ManagerTest extends TestCase { $this->validator, $this->userManager, $this->cacheFactory, - $this->timeFactory, $this->subscriptionRegistry, $this->logger, $this->coordinator, @@ -254,33 +246,22 @@ class ManagerTest extends TestCase { $manager->getCount($notification); } - public function dataIsFairUseOfFreePushService() { + public function dataIsFairUseOfFreePushService(): array { return [ - // Before 1st March - [1646089199, true, 4999, true], - [1646089199, true, 5000, true], - [1646089199, false, 4999, true], - [1646089199, false, 5000, true], - - // After 1st March - [1646089200, true, 4999, true], - [1646089200, true, 5000, true], - [1646089200, false, 4999, true], - [1646089200, false, 5000, false], + [true, 4999, true], + [true, 5000, true], + [false, 4999, true], + [false, 5000, false], ]; } /** * @dataProvider dataIsFairUseOfFreePushService - * @param int $time * @param bool $hasValidSubscription * @param int $userCount * @param bool $isFair */ - public function testIsFairUseOfFreePushService(int $time, bool $hasValidSubscription, int $userCount, bool $isFair): void { - $this->timeFactory->method('getTime') - ->willReturn($time); - + public function testIsFairUseOfFreePushService(bool $hasValidSubscription, int $userCount, bool $isFair): void { $this->subscriptionRegistry->method('delegateHasValidSubscription') ->willReturn($hasValidSubscription); diff --git a/tests/lib/User/ManagerTest.php b/tests/lib/User/ManagerTest.php index 2536eee8441..cef578e9555 100644 --- a/tests/lib/User/ManagerTest.php +++ b/tests/lib/User/ManagerTest.php @@ -50,7 +50,6 @@ class ManagerTest extends TestCase { $this->cache = $this->createMock(ICache::class); $this->cacheFactory->method('createDistributed') - ->with('user_backend_map') ->willReturn($this->cache); } diff --git a/version.php b/version.php index 2ecdb0dcfe2..3100e3d2f56 100644 --- a/version.php +++ b/version.php @@ -30,10 +30,10 @@ // between betas, final and RCs. This is _not_ the public version number. Reset minor/patchlevel // when updating major/minor version number. -$OC_Version = [25, 0, 0, 4]; +$OC_Version = [25, 0, 0, 5]; // The human readable string -$OC_VersionString = '25.0.0 dev'; +$OC_VersionString = '25.0.0 beta 1'; $OC_VersionCanBeUpgradedFrom = [ 'nextcloud' => [ diff --git a/webpack.common.js b/webpack.common.js index 401ec6ef3f9..28c569ef7ac 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -141,7 +141,9 @@ module.exports = { new VueLoaderPlugin(), new webpack.ProvidePlugin({ // Provide jQuery to jquery plugins as some are loaded before $ is exposed globally. - jQuery: 'jquery', + // We need to provide the path to node_moduels as otherwise npm link will fail due + // to tribute.js checking for jQuery in @nextcloud/vue + jQuery: path.resolve(path.join(__dirname, 'node_modules/jquery')), // Shim ICAL to prevent using the global object (window.ICAL). // The library ical.js heavily depends on instanceof checks which will // break if two separate versions of the library are used (e.g. bundled one @@ -155,7 +157,7 @@ module.exports = { handlebars: 'handlebars/runtime', }, extensions: ['*', '.js', '.vue'], - symlinks: false, + symlinks: true, fallback: { stream: require.resolve('stream-browserify'), buffer: require.resolve('buffer'), |