diff options
92 files changed, 953 insertions, 357 deletions
diff --git a/apps/accessibility/l10n/ru.js b/apps/accessibility/l10n/ru.js index 65fec98803f..de00362a1e1 100644 --- a/apps/accessibility/l10n/ru.js +++ b/apps/accessibility/l10n/ru.js @@ -14,6 +14,6 @@ OC.L10N.register( "Accessibility options for nextcloud" : "Настройки доступности для Nextcloud", "Provides multiple accessibilities options to ease your use of Nextcloud" : "Предлагает дополнительные настройки для упрощения использования Nextcloud", "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Доступная среда очень важна для нас. При разработке мы следуем веб-стандартам, контролируя возможность пользования всем сервисом без помощи мыши и с использованием вспомогательных программ, например, выполняющих чтение с экрана. Мы стремимся к выполнению рекомендаций {guidelines}Руководства доступности Веб-Контента{linkend} 2.1 на уровне АА, а при использовании режима высокой контрастности — даже на уровне ААА.", - "If you find any issues, don’t hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "При обнаружении ошибок, не стесняйтесь сообщать о них {issuetracker}на наш форум{linkend}. Если Вы заинтересованы в продвижении проекта присоединяйтесь к {designteam}команде дизайнеров{linkend}!" + "If you find any issues, don’t hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "При обнаружении ошибок, не стесняйтесь сообщать о них {issuetracker}на наш форум{linkend}. Если Вы заинтересованы в продвижении проекта присоединяйтесь к {designteam}нашей команде дизайнеров{linkend}!" }, "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/accessibility/l10n/ru.json b/apps/accessibility/l10n/ru.json index 51d4de3ebe1..01dced937bb 100644 --- a/apps/accessibility/l10n/ru.json +++ b/apps/accessibility/l10n/ru.json @@ -12,6 +12,6 @@ "Accessibility options for nextcloud" : "Настройки доступности для Nextcloud", "Provides multiple accessibilities options to ease your use of Nextcloud" : "Предлагает дополнительные настройки для упрощения использования Nextcloud", "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Доступная среда очень важна для нас. При разработке мы следуем веб-стандартам, контролируя возможность пользования всем сервисом без помощи мыши и с использованием вспомогательных программ, например, выполняющих чтение с экрана. Мы стремимся к выполнению рекомендаций {guidelines}Руководства доступности Веб-Контента{linkend} 2.1 на уровне АА, а при использовании режима высокой контрастности — даже на уровне ААА.", - "If you find any issues, don’t hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "При обнаружении ошибок, не стесняйтесь сообщать о них {issuetracker}на наш форум{linkend}. Если Вы заинтересованы в продвижении проекта присоединяйтесь к {designteam}команде дизайнеров{linkend}!" + "If you find any issues, don’t hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "При обнаружении ошибок, не стесняйтесь сообщать о них {issuetracker}на наш форум{linkend}. Если Вы заинтересованы в продвижении проекта присоединяйтесь к {designteam}нашей команде дизайнеров{linkend}!" },"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/ca.js b/apps/dashboard/l10n/ca.js index 7361ddf37aa..8d696acd0f2 100644 --- a/apps/dashboard/l10n/ca.js +++ b/apps/dashboard/l10n/ca.js @@ -3,8 +3,10 @@ OC.L10N.register( { "Dashboard" : "Tauler", "Dashboard app" : "Aplicació tauler", + "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." : "Comença el dia informat\n\nEl tauler de control de Nextcloud és el vostre punt de partida del dia i us ofereix una\nvisió general de les vostres properes cites, correus electrònics urgents, missatges de xat,\ntiquets entrants, els darrers tuits i molt més! Els usuaris poden afegir els widgets\nque els agraden i canviar el fons al seu gust.", "Customize" : "Personalitza", "Edit widgets" : "Edita els ginys", + "Get more widgets from the App Store" : "Aconseguiu més widgets de la botiga d'aplicacions", "Change background image" : "Canvia la imatge de fons", "Weather service" : "Servei meteorològic", "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Per a la seva privacitat, les dades meteorològiques les sol·licita el seu servidor Nextcloud en el seu lloc perquè el servei meteorològic no rebi cap informació personal.", diff --git a/apps/dashboard/l10n/ca.json b/apps/dashboard/l10n/ca.json index a47930687db..3ef8707beef 100644 --- a/apps/dashboard/l10n/ca.json +++ b/apps/dashboard/l10n/ca.json @@ -1,8 +1,10 @@ { "translations": { "Dashboard" : "Tauler", "Dashboard app" : "Aplicació tauler", + "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." : "Comença el dia informat\n\nEl tauler de control de Nextcloud és el vostre punt de partida del dia i us ofereix una\nvisió general de les vostres properes cites, correus electrònics urgents, missatges de xat,\ntiquets entrants, els darrers tuits i molt més! Els usuaris poden afegir els widgets\nque els agraden i canviar el fons al seu gust.", "Customize" : "Personalitza", "Edit widgets" : "Edita els ginys", + "Get more widgets from the App Store" : "Aconseguiu més widgets de la botiga d'aplicacions", "Change background image" : "Canvia la imatge de fons", "Weather service" : "Servei meteorològic", "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Per a la seva privacitat, les dades meteorològiques les sol·licita el seu servidor Nextcloud en el seu lloc perquè el servei meteorològic no rebi cap informació personal.", diff --git a/apps/dashboard/l10n/cs.js b/apps/dashboard/l10n/cs.js index 5991e915936..c0721a14726 100644 --- a/apps/dashboard/l10n/cs.js +++ b/apps/dashboard/l10n/cs.js @@ -3,6 +3,7 @@ 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.", "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í", diff --git a/apps/dashboard/l10n/cs.json b/apps/dashboard/l10n/cs.json index b3abe6bf02e..3e4d4fd7b26 100644 --- a/apps/dashboard/l10n/cs.json +++ b/apps/dashboard/l10n/cs.json @@ -1,6 +1,7 @@ { "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.", "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í", diff --git a/apps/dashboard/l10n/fi.js b/apps/dashboard/l10n/fi.js index c54546cf6ad..5047d9b6d9c 100644 --- a/apps/dashboard/l10n/fi.js +++ b/apps/dashboard/l10n/fi.js @@ -5,6 +5,7 @@ OC.L10N.register( "Dashboard app" : "Konsolisovellus", "Customize" : "Mukauta", "Edit widgets" : "Muokkaa pienoissovelluksia", + "Get more widgets from the App Store" : "Hae lisää pienoissovelluksia sovelluskaupasta", "Change background image" : "Vaihda taustakuva", "Weather service" : "Sääpalvelu", "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Yksityisyytesi vuoksi Nextcloud-palvelin hakee säätiedot, joten sääpalvelulle ei lähetetä henkilökohtaisia tietojasi.", @@ -24,6 +25,7 @@ OC.L10N.register( "Pick from Files" : "Valitse tiedostoista", "Default images" : "Oletuskuvat", "Plain background" : "Yksinkertainen tausta", + "Insert from {productName}" : "Aseta kohteesta {productName}", "Show something" : "Näytä jotain", "Get more widgets from the app store" : "Hae lisää pienoissovelluksia sovelluskaupasta" }, diff --git a/apps/dashboard/l10n/fi.json b/apps/dashboard/l10n/fi.json index 8613b39addc..c73672403cf 100644 --- a/apps/dashboard/l10n/fi.json +++ b/apps/dashboard/l10n/fi.json @@ -3,6 +3,7 @@ "Dashboard app" : "Konsolisovellus", "Customize" : "Mukauta", "Edit widgets" : "Muokkaa pienoissovelluksia", + "Get more widgets from the App Store" : "Hae lisää pienoissovelluksia sovelluskaupasta", "Change background image" : "Vaihda taustakuva", "Weather service" : "Sääpalvelu", "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Yksityisyytesi vuoksi Nextcloud-palvelin hakee säätiedot, joten sääpalvelulle ei lähetetä henkilökohtaisia tietojasi.", @@ -22,6 +23,7 @@ "Pick from Files" : "Valitse tiedostoista", "Default images" : "Oletuskuvat", "Plain background" : "Yksinkertainen tausta", + "Insert from {productName}" : "Aseta kohteesta {productName}", "Show something" : "Näytä jotain", "Get more widgets from the app store" : "Hae lisää pienoissovelluksia sovelluskaupasta" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/dashboard/src/App.vue b/apps/dashboard/src/App.vue index 5ab24effffa..e8a1933287a 100644 --- a/apps/dashboard/src/App.vue +++ b/apps/dashboard/src/App.vue @@ -543,11 +543,15 @@ export default { background-color: var(--color-background-translucent); -webkit-backdrop-filter: var(--background-blur); backdrop-filter: var(--background-blur); + opacity: 1 !important; &:hover, &:focus, &:active { - background-color: var(--color-background-hover); + background-color: var(--color-background-hover)!important; + } + &:focus-visible { + border: 2px solid var(--color-main-text)!important; } } diff --git a/apps/dav/lib/Connector/Sabre/Auth.php b/apps/dav/lib/Connector/Sabre/Auth.php index 71e833809ac..df4e3c65ce0 100644 --- a/apps/dav/lib/Connector/Sabre/Auth.php +++ b/apps/dav/lib/Connector/Sabre/Auth.php @@ -235,7 +235,6 @@ class Auth extends AbstractBasic { \OC_User::handleApacheAuth() ) { $user = $this->userSession->getUser()->getUID(); - \OC_Util::setupFS($user); $this->currentUser = $user; $this->session->close(); return [true, $this->principalPrefix . $user]; diff --git a/apps/dav/lib/Connector/Sabre/ServerFactory.php b/apps/dav/lib/Connector/Sabre/ServerFactory.php index ff96b7a19c5..095fb631c2b 100644 --- a/apps/dav/lib/Connector/Sabre/ServerFactory.php +++ b/apps/dav/lib/Connector/Sabre/ServerFactory.php @@ -31,7 +31,7 @@ */ namespace OCA\DAV\Connector\Sabre; -use OC\Files\Node\Folder; +use OCP\Files\Folder; use OCA\DAV\AppInfo\PluginManager; use OCA\DAV\Files\BrowserErrorPagePlugin; use OCP\Files\Mount\IMountManager; diff --git a/apps/federatedfilesharing/l10n/ca.js b/apps/federatedfilesharing/l10n/ca.js index e5212cfe405..248fcd5252e 100644 --- a/apps/federatedfilesharing/l10n/ca.js +++ b/apps/federatedfilesharing/l10n/ca.js @@ -38,6 +38,7 @@ OC.L10N.register( "Federated file sharing" : "Compartició federada de fitxers", "Provide federated file sharing across servers" : "Proporcioneu compartició de fitxers federats entre servidors", "Open documentation" : "Obre la documentació", + "Adjust how people can share between servers. This includes shares between users on this server as well if they are using federated sharing." : "Ajusta com les persones poden compartir entre servidors. Això inclou també els recursos compartits entre usuaris d'aquest servidor si utilitzen compartició federada.", "Allow users on this server to send shares to other servers (this option also allows WebDAV access to public shares)" : "Permet als usuaris d'aquest servidor enviar comparticions a altres servidors (aquest paràmetre també permet accés WebDAV a comparticions públiques)", "Allow users on this server to receive shares from other servers" : "Permet als usuaris d'aquest servidor rebre comparticions a d'altres servidors", "Allow users on this server to send shares to groups on other servers" : "Permet als usuaris d'aquest servidor enviar comparticions a grups d'altres servidors", diff --git a/apps/federatedfilesharing/l10n/ca.json b/apps/federatedfilesharing/l10n/ca.json index 81fe7e47ab5..f76539b4727 100644 --- a/apps/federatedfilesharing/l10n/ca.json +++ b/apps/federatedfilesharing/l10n/ca.json @@ -36,6 +36,7 @@ "Federated file sharing" : "Compartició federada de fitxers", "Provide federated file sharing across servers" : "Proporcioneu compartició de fitxers federats entre servidors", "Open documentation" : "Obre la documentació", + "Adjust how people can share between servers. This includes shares between users on this server as well if they are using federated sharing." : "Ajusta com les persones poden compartir entre servidors. Això inclou també els recursos compartits entre usuaris d'aquest servidor si utilitzen compartició federada.", "Allow users on this server to send shares to other servers (this option also allows WebDAV access to public shares)" : "Permet als usuaris d'aquest servidor enviar comparticions a altres servidors (aquest paràmetre també permet accés WebDAV a comparticions públiques)", "Allow users on this server to receive shares from other servers" : "Permet als usuaris d'aquest servidor rebre comparticions a d'altres servidors", "Allow users on this server to send shares to groups on other servers" : "Permet als usuaris d'aquest servidor enviar comparticions a grups d'altres servidors", diff --git a/apps/federatedfilesharing/l10n/zh_TW.js b/apps/federatedfilesharing/l10n/zh_TW.js index 1978ef3bb12..4a25a72b32d 100644 --- a/apps/federatedfilesharing/l10n/zh_TW.js +++ b/apps/federatedfilesharing/l10n/zh_TW.js @@ -42,7 +42,7 @@ OC.L10N.register( "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" : "允許此伺服氣上的使用者接收來自其他伺服器的群組分享", + "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" : "允許使用者將其資料發佈到全域且公開的通訊錄", "Federated Cloud" : "聯盟式雲端", diff --git a/apps/federatedfilesharing/l10n/zh_TW.json b/apps/federatedfilesharing/l10n/zh_TW.json index e6fceab9373..05a946f0793 100644 --- a/apps/federatedfilesharing/l10n/zh_TW.json +++ b/apps/federatedfilesharing/l10n/zh_TW.json @@ -40,7 +40,7 @@ "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" : "允許此伺服氣上的使用者接收來自其他伺服器的群組分享", + "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" : "允許使用者將其資料發佈到全域且公開的通訊錄", "Federated Cloud" : "聯盟式雲端", diff --git a/apps/files/l10n/fi.js b/apps/files/l10n/fi.js index 159d5d23940..906a121a3bc 100644 --- a/apps/files/l10n/fi.js +++ b/apps/files/l10n/fi.js @@ -39,6 +39,8 @@ OC.L10N.register( "Could not load info for file \"{file}\"" : "Ei voida ladata tiedoston \"{file}\" tietoja", "Files" : "Tiedostot", "Details" : "Tiedot", + "Please select tag(s) to add to the selection" : "Valitse lisättävät tunnisteet valinnalle", + "Apply tag(s) to selection" : "Hyväksy tunnisteet valinnalle", "Select" : "Valitse", "Pending" : "Odottaa", "Unable to determine date" : "Päivämäärän määrittäminen epäonnistui", @@ -86,6 +88,7 @@ OC.L10N.register( "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Ryhmäkansio \"{mountPoint}\" on melkein täynnä ({usedSpacePercent}%).", "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Erillinen tallennustila \"{mountPoint}\" on melkein täynnä ({usedSpacePercent}%).", "Your storage is almost full ({usedSpacePercent}%)." : "Tallennustila on melkein täynnä ({usedSpacePercent}%).", + "_matches \"{filter}\"_::_match \"{filter}\"_" : ["vastaa \"{filter}\"","vastaa \"{filter}\""], "View in folder" : "Näe kansiossa", "Copied!" : "Kopioitu!", "Copy direct link (only works for users who have access to this file/folder)" : "Kopioi suora linkki (toimii vain käyttäjillä, joilla on pääsyoikeus tähän tiedostoon/kansioon)", diff --git a/apps/files/l10n/fi.json b/apps/files/l10n/fi.json index f8b9e012ef0..a757f9b571a 100644 --- a/apps/files/l10n/fi.json +++ b/apps/files/l10n/fi.json @@ -37,6 +37,8 @@ "Could not load info for file \"{file}\"" : "Ei voida ladata tiedoston \"{file}\" tietoja", "Files" : "Tiedostot", "Details" : "Tiedot", + "Please select tag(s) to add to the selection" : "Valitse lisättävät tunnisteet valinnalle", + "Apply tag(s) to selection" : "Hyväksy tunnisteet valinnalle", "Select" : "Valitse", "Pending" : "Odottaa", "Unable to determine date" : "Päivämäärän määrittäminen epäonnistui", @@ -84,6 +86,7 @@ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Ryhmäkansio \"{mountPoint}\" on melkein täynnä ({usedSpacePercent}%).", "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Erillinen tallennustila \"{mountPoint}\" on melkein täynnä ({usedSpacePercent}%).", "Your storage is almost full ({usedSpacePercent}%)." : "Tallennustila on melkein täynnä ({usedSpacePercent}%).", + "_matches \"{filter}\"_::_match \"{filter}\"_" : ["vastaa \"{filter}\"","vastaa \"{filter}\""], "View in folder" : "Näe kansiossa", "Copied!" : "Kopioitu!", "Copy direct link (only works for users who have access to this file/folder)" : "Kopioi suora linkki (toimii vain käyttäjillä, joilla on pääsyoikeus tähän tiedostoon/kansioon)", diff --git a/apps/files_external/l10n/ca.js b/apps/files_external/l10n/ca.js index 25eda82dcda..b40cb7b5f71 100644 --- a/apps/files_external/l10n/ca.js +++ b/apps/files_external/l10n/ca.js @@ -22,6 +22,7 @@ OC.L10N.register( "Read only" : "Només lectura", "Delete" : "Suprimeix", "Admin defined" : "Administrador definit", + "Automatic status checking is disabled due to the large number of configured storages, click to check status" : "La comprovació automàtica de l'estat està inhabilitada a causa del gran nombre d'emmagatzematges configurats, feu clic per comprovar l'estat", "Are you sure you want to delete this external storage?" : "Esteu segur que voleu suprimir aquest emmagatzematge extern?", "Delete storage?" : "Suprimeix-ho l'emmagatzematge?", "Saved" : "Desat", diff --git a/apps/files_external/l10n/ca.json b/apps/files_external/l10n/ca.json index a092f8a53a9..38541dfbc0f 100644 --- a/apps/files_external/l10n/ca.json +++ b/apps/files_external/l10n/ca.json @@ -20,6 +20,7 @@ "Read only" : "Només lectura", "Delete" : "Suprimeix", "Admin defined" : "Administrador definit", + "Automatic status checking is disabled due to the large number of configured storages, click to check status" : "La comprovació automàtica de l'estat està inhabilitada a causa del gran nombre d'emmagatzematges configurats, feu clic per comprovar l'estat", "Are you sure you want to delete this external storage?" : "Esteu segur que voleu suprimir aquest emmagatzematge extern?", "Delete storage?" : "Suprimeix-ho l'emmagatzematge?", "Saved" : "Desat", diff --git a/apps/files_external/lib/Config/ConfigAdapter.php b/apps/files_external/lib/Config/ConfigAdapter.php index fe9beceeb36..57faf91fcdc 100644 --- a/apps/files_external/lib/Config/ConfigAdapter.php +++ b/apps/files_external/lib/Config/ConfigAdapter.php @@ -33,7 +33,6 @@ use OC\Files\Storage\FailedStorage; use OC\Files\Storage\Wrapper\Availability; use OCA\Files_External\Lib\PersonalMount; use OCA\Files_External\Lib\StorageConfig; -use OCA\Files_External\Migration\StorageMigrator; use OCA\Files_External\Service\UserGlobalStoragesService; use OCA\Files_External\Service\UserStoragesService; use OCP\Files\Config\IMountProvider; @@ -52,22 +51,17 @@ class ConfigAdapter implements IMountProvider { /** @var UserGlobalStoragesService */ private $userGlobalStoragesService; - /** @var StorageMigrator */ - private $migrator; /** * @param UserStoragesService $userStoragesService * @param UserGlobalStoragesService $userGlobalStoragesService - * @param StorageMigrator $migrator */ public function __construct( UserStoragesService $userStoragesService, - UserGlobalStoragesService $userGlobalStoragesService, - StorageMigrator $migrator + UserGlobalStoragesService $userGlobalStoragesService ) { $this->userStoragesService = $userStoragesService; $this->userGlobalStoragesService = $userGlobalStoragesService; - $this->migrator = $migrator; } /** @@ -120,8 +114,6 @@ class ConfigAdapter implements IMountProvider { * @return \OCP\Files\Mount\IMountPoint[] */ public function getMountsForUser(IUser $user, IStorageFactory $loader) { - $this->migrator->migrateUser($user); - $this->userStoragesService->setUser($user); $this->userGlobalStoragesService->setUser($user); diff --git a/apps/files_external/lib/Migration/StorageMigrator.php b/apps/files_external/lib/Migration/StorageMigrator.php deleted file mode 100644 index 05a39865797..00000000000 --- a/apps/files_external/lib/Migration/StorageMigrator.php +++ /dev/null @@ -1,135 +0,0 @@ -<?php -/** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Joas Schilling <coding@schilljs.com> - * @author Robin Appelman <robin@icewind.nl> - * @author Vincent Petry <vincent@nextcloud.com> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * - */ -namespace OCA\Files_External\Migration; - -use OCA\Files_External\Service\BackendService; -use OCA\Files_External\Service\DBConfigService; -use OCA\Files_External\Service\LegacyStoragesService; -use OCA\Files_External\Service\StoragesService; -use OCA\Files_External\Service\UserLegacyStoragesService; -use OCA\Files_External\Service\UserStoragesService; -use OCP\Files\Config\IUserMountCache; -use OCP\IConfig; -use OCP\IDBConnection; -use OCP\ILogger; -use OCP\IUser; - -/** - * Migrate mount config from mount.json to the database - */ -class StorageMigrator { - /** - * @var BackendService - */ - private $backendService; - - /** - * @var DBConfigService - */ - private $dbConfig; - - /** - * @var IConfig - */ - private $config; - - /** - * @var IDBConnection - */ - private $connection; - - /** - * @var ILogger - */ - private $logger; - - /** @var IUserMountCache */ - private $userMountCache; - - /** - * StorageMigrator constructor. - * - * @param BackendService $backendService - * @param DBConfigService $dbConfig - * @param IConfig $config - * @param IDBConnection $connection - * @param ILogger $logger - * @param IUserMountCache $userMountCache - */ - public function __construct( - BackendService $backendService, - DBConfigService $dbConfig, - IConfig $config, - IDBConnection $connection, - ILogger $logger, - IUserMountCache $userMountCache - ) { - $this->backendService = $backendService; - $this->dbConfig = $dbConfig; - $this->config = $config; - $this->connection = $connection; - $this->logger = $logger; - $this->userMountCache = $userMountCache; - } - - private function migrate(LegacyStoragesService $legacyService, StoragesService $storageService) { - $existingStorage = $legacyService->getAllStorages(); - - $this->connection->beginTransaction(); - try { - foreach ($existingStorage as $storage) { - $mountOptions = $storage->getMountOptions(); - if (!empty($mountOptions) && !isset($mountOptions['enable_sharing'])) { - // existing mounts must have sharing enabled by default to avoid surprises - $mountOptions['enable_sharing'] = true; - $storage->setMountOptions($mountOptions); - } - $storageService->addStorage($storage); - } - $this->connection->commit(); - } catch (\Exception $e) { - $this->logger->logException($e); - $this->connection->rollBack(); - } - } - - /** - * Migrate personal storages configured by the current user - * - * @param IUser $user - */ - public function migrateUser(IUser $user) { - $dummySession = new DummyUserSession(); - $dummySession->setUser($user); - $userId = $user->getUID(); - $userVersion = $this->config->getUserValue($userId, 'files_external', 'config_version', '0.0.0'); - if (version_compare($userVersion, '0.5.0', '<')) { - $this->config->setUserValue($userId, 'files_external', 'config_version', '0.5.0'); - $legacyService = new UserLegacyStoragesService($this->backendService, $dummySession); - $storageService = new UserStoragesService($this->backendService, $this->dbConfig, $dummySession, $this->userMountCache); - - $this->migrate($legacyService, $storageService); - } - } -} diff --git a/apps/files_external/lib/MountConfig.php b/apps/files_external/lib/MountConfig.php index aa3b662e224..a95ea01add9 100644 --- a/apps/files_external/lib/MountConfig.php +++ b/apps/files_external/lib/MountConfig.php @@ -47,6 +47,7 @@ use OCA\Files_External\Service\GlobalStoragesService; use OCA\Files_External\Service\UserGlobalStoragesService; use OCA\Files_External\Service\UserStoragesService; use OCP\Files\StorageNotAvailableException; +use OCP\IUser; use phpseclib\Crypt\AES; /** @@ -145,29 +146,6 @@ class MountConfig { } /** - * Read the mount points in the config file into an array - * - * @param string|null $user If not null, personal for $user, otherwise system - * @return array - */ - public static function readData($user = null) { - if (isset($user)) { - $jsonFile = \OC::$server->getUserManager()->get($user)->getHome() . '/mount.json'; - } else { - $config = \OC::$server->getConfig(); - $datadir = $config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data/'); - $jsonFile = $config->getSystemValue('mount_file', $datadir . '/mount.json'); - } - if (is_file($jsonFile)) { - $mountPoints = json_decode(file_get_contents($jsonFile), true); - if (is_array($mountPoints)) { - return $mountPoints; - } - } - return []; - } - - /** * Get backend dependency message * TODO: move into AppFramework along with templates * diff --git a/apps/files_external/lib/Service/StoragesService.php b/apps/files_external/lib/Service/StoragesService.php index b8eabd65e1e..489192dbdc2 100644 --- a/apps/files_external/lib/Service/StoragesService.php +++ b/apps/files_external/lib/Service/StoragesService.php @@ -40,7 +40,9 @@ use OCA\Files_External\Lib\Backend\InvalidBackend; use OCA\Files_External\Lib\DefinitionParameter; use OCA\Files_External\Lib\StorageConfig; use OCA\Files_External\NotFoundException; +use OCP\EventDispatcher\IEventDispatcher; use OCP\Files\Config\IUserMountCache; +use OCP\Files\Events\InvalidateMountCacheEvent; use OCP\Files\StorageNotAvailableException; use OCP\ILogger; @@ -62,15 +64,24 @@ abstract class StoragesService { */ protected $userMountCache; + protected IEventDispatcher $eventDispatcher; + /** * @param BackendService $backendService * @param DBConfigService $dbConfigService * @param IUserMountCache $userMountCache + * @param IEventDispatcher $eventDispatcher */ - public function __construct(BackendService $backendService, DBConfigService $dbConfigService, IUserMountCache $userMountCache) { + public function __construct( + BackendService $backendService, + DBConfigService $dbConfigService, + IUserMountCache $userMountCache, + IEventDispatcher $eventDispatcher + ) { $this->backendService = $backendService; $this->dbConfig = $dbConfigService; $this->userMountCache = $userMountCache; + $this->eventDispatcher = $eventDispatcher; } protected function readDBConfig() { @@ -338,7 +349,8 @@ abstract class StoragesService { * @param string $mountType hook mount type param * @param array $applicableArray array of applicable users/groups for which to trigger the hook */ - protected function triggerApplicableHooks($signal, $mountPoint, $mountType, $applicableArray) { + protected function triggerApplicableHooks($signal, $mountPoint, $mountType, $applicableArray): void { + $this->eventDispatcher->dispatchTyped(new InvalidateMountCacheEvent(null)); foreach ($applicableArray as $applicable) { \OCP\Util::emitHook( Filesystem::CLASSNAME, diff --git a/apps/files_external/lib/Service/UserGlobalStoragesService.php b/apps/files_external/lib/Service/UserGlobalStoragesService.php index ba894d8f210..2eda36e9242 100644 --- a/apps/files_external/lib/Service/UserGlobalStoragesService.php +++ b/apps/files_external/lib/Service/UserGlobalStoragesService.php @@ -24,6 +24,7 @@ namespace OCA\Files_External\Service; use OCA\Files_External\Lib\StorageConfig; +use OCP\EventDispatcher\IEventDispatcher; use OCP\Files\Config\IUserMountCache; use OCP\IGroupManager; use OCP\IUser; @@ -45,15 +46,17 @@ class UserGlobalStoragesService extends GlobalStoragesService { * @param IUserSession $userSession * @param IGroupManager $groupManager * @param IUserMountCache $userMountCache + * @param IEventDispatcher $eventDispatcher */ public function __construct( BackendService $backendService, DBConfigService $dbConfig, IUserSession $userSession, IGroupManager $groupManager, - IUserMountCache $userMountCache + IUserMountCache $userMountCache, + IEventDispatcher $eventDispatcher ) { - parent::__construct($backendService, $dbConfig, $userMountCache); + parent::__construct($backendService, $dbConfig, $userMountCache, $eventDispatcher); $this->userSession = $userSession; $this->groupManager = $groupManager; } diff --git a/apps/files_external/lib/Service/UserLegacyStoragesService.php b/apps/files_external/lib/Service/UserLegacyStoragesService.php deleted file mode 100644 index ce86ce30bad..00000000000 --- a/apps/files_external/lib/Service/UserLegacyStoragesService.php +++ /dev/null @@ -1,56 +0,0 @@ -<?php -/** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Joas Schilling <coding@schilljs.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Robin Appelman <robin@icewind.nl> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * - */ -namespace OCA\Files_External\Service; - -use OCP\IUserSession; - -/** - * Read user defined mounts from the legacy mount.json - */ -class UserLegacyStoragesService extends LegacyStoragesService { - /** - * @var IUserSession - */ - private $userSession; - - /** - * @param BackendService $backendService - * @param IUserSession $userSession - */ - public function __construct(BackendService $backendService, IUserSession $userSession) { - $this->backendService = $backendService; - $this->userSession = $userSession; - } - - /** - * Read legacy config data - * - * @return array list of storage configs - */ - protected function readLegacyConfig() { - // read user config - $user = $this->userSession->getUser()->getUID(); - return \OCA\Files_External\MountConfig::readData($user); - } -} diff --git a/apps/files_external/lib/Service/UserStoragesService.php b/apps/files_external/lib/Service/UserStoragesService.php index 8af6bdb3a77..b09b37b40cc 100644 --- a/apps/files_external/lib/Service/UserStoragesService.php +++ b/apps/files_external/lib/Service/UserStoragesService.php @@ -32,6 +32,7 @@ use OC\Files\Filesystem; use OCA\Files_External\Lib\StorageConfig; use OCA\Files_External\NotFoundException; +use OCP\EventDispatcher\IEventDispatcher; use OCP\Files\Config\IUserMountCache; use OCP\IUserSession; @@ -49,15 +50,17 @@ class UserStoragesService extends StoragesService { * @param DBConfigService $dbConfig * @param IUserSession $userSession user session * @param IUserMountCache $userMountCache + * @param IEventDispatcher $eventDispatcher */ public function __construct( BackendService $backendService, DBConfigService $dbConfig, IUserSession $userSession, - IUserMountCache $userMountCache + IUserMountCache $userMountCache, + IEventDispatcher $eventDispatcher ) { $this->userSession = $userSession; - parent::__construct($backendService, $dbConfig, $userMountCache); + parent::__construct($backendService, $dbConfig, $userMountCache, $eventDispatcher); } protected function readDBConfig() { diff --git a/apps/files_external/tests/Service/GlobalStoragesServiceTest.php b/apps/files_external/tests/Service/GlobalStoragesServiceTest.php index b23c4b8f2bf..7d77ea971f3 100644 --- a/apps/files_external/tests/Service/GlobalStoragesServiceTest.php +++ b/apps/files_external/tests/Service/GlobalStoragesServiceTest.php @@ -37,7 +37,7 @@ use OCA\Files_External\Service\GlobalStoragesService; class GlobalStoragesServiceTest extends StoragesServiceTest { protected function setUp(): void { parent::setUp(); - $this->service = new GlobalStoragesService($this->backendService, $this->dbConfig, $this->mountCache); + $this->service = new GlobalStoragesService($this->backendService, $this->dbConfig, $this->mountCache, $this->eventDispatcher); } protected function tearDown(): void { diff --git a/apps/files_external/tests/Service/StoragesServiceTest.php b/apps/files_external/tests/Service/StoragesServiceTest.php index 3829a9ea0ce..4eaf70a8e84 100644 --- a/apps/files_external/tests/Service/StoragesServiceTest.php +++ b/apps/files_external/tests/Service/StoragesServiceTest.php @@ -39,6 +39,7 @@ use OCA\Files_External\Service\BackendService; use OCA\Files_External\Service\DBConfigService; use OCA\Files_External\Service\StoragesService; use OCP\AppFramework\IAppContainer; +use OCP\EventDispatcher\IEventDispatcher; use OCP\Files\Cache\ICache; use OCP\Files\Config\IUserMountCache; use OCP\Files\Mount\IMountPoint; @@ -96,6 +97,11 @@ abstract class StoragesServiceTest extends \Test\TestCase { */ protected $mountCache; + /** + * @var \PHPUnit\Framework\MockObject\MockObject|IEventDispatcher + */ + protected IEventDispatcher $eventDispatcher; + protected function setUp(): void { parent::setUp(); $this->dbConfig = new CleaningDBConfig(\OC::$server->getDatabaseConnection(), \OC::$server->getCrypto()); @@ -108,6 +114,7 @@ abstract class StoragesServiceTest extends \Test\TestCase { \OCA\Files_External\MountConfig::$skipTest = true; $this->mountCache = $this->createMock(IUserMountCache::class); + $this->eventDispatcher = $this->createMock(IEventDispatcher::class); // prepare BackendService mock $this->backendService = diff --git a/apps/files_external/tests/Service/UserGlobalStoragesServiceTest.php b/apps/files_external/tests/Service/UserGlobalStoragesServiceTest.php index ea77148c8f2..aa5aa1df431 100644 --- a/apps/files_external/tests/Service/UserGlobalStoragesServiceTest.php +++ b/apps/files_external/tests/Service/UserGlobalStoragesServiceTest.php @@ -100,7 +100,8 @@ class UserGlobalStoragesServiceTest extends GlobalStoragesServiceTest { $this->dbConfig, $userSession, $this->groupManager, - $this->mountCache + $this->mountCache, + $this->eventDispatcher, ); } diff --git a/apps/files_external/tests/Service/UserStoragesServiceTest.php b/apps/files_external/tests/Service/UserStoragesServiceTest.php index ff39ea9ddbc..cda1dd0a27f 100644 --- a/apps/files_external/tests/Service/UserStoragesServiceTest.php +++ b/apps/files_external/tests/Service/UserStoragesServiceTest.php @@ -54,7 +54,7 @@ class UserStoragesServiceTest extends StoragesServiceTest { protected function setUp(): void { parent::setUp(); - $this->globalStoragesService = new GlobalStoragesService($this->backendService, $this->dbConfig, $this->mountCache); + $this->globalStoragesService = new GlobalStoragesService($this->backendService, $this->dbConfig, $this->mountCache, $this->eventDispatcher); $this->userId = $this->getUniqueID('user_'); $this->createUser($this->userId, $this->userId); @@ -67,7 +67,7 @@ class UserStoragesServiceTest extends StoragesServiceTest { ->method('getUser') ->willReturn($this->user); - $this->service = new UserStoragesService($this->backendService, $this->dbConfig, $userSession, $this->mountCache); + $this->service = new UserStoragesService($this->backendService, $this->dbConfig, $userSession, $this->mountCache, $this->eventDispatcher); } private function makeTestStorageData() { diff --git a/apps/files_sharing/lib/MountProvider.php b/apps/files_sharing/lib/MountProvider.php index 102e5d96559..27edf5074e1 100644 --- a/apps/files_sharing/lib/MountProvider.php +++ b/apps/files_sharing/lib/MountProvider.php @@ -134,7 +134,9 @@ class MountProvider implements IMountProvider { ], $loader, $view, - $foldersExistCache + $foldersExistCache, + $this->eventDispatcher, + $user ); $event = new ShareMountedEvent($mount); diff --git a/apps/files_sharing/lib/SharedMount.php b/apps/files_sharing/lib/SharedMount.php index c8f5d0f64ae..60361e25fd0 100644 --- a/apps/files_sharing/lib/SharedMount.php +++ b/apps/files_sharing/lib/SharedMount.php @@ -34,7 +34,9 @@ use OC\Files\Mount\MountPoint; use OC\Files\Mount\MoveableMount; use OC\Files\View; use OCP\EventDispatcher\IEventDispatcher; +use OCP\Files\Events\InvalidateMountCacheEvent; use OCP\Files\Storage\IStorageFactory; +use OCP\IUser; use OCP\Share\Events\VerifyMountPointEvent; /** @@ -51,10 +53,7 @@ class SharedMount extends MountPoint implements MoveableMount { */ private $recipientView; - /** - * @var string - */ - private $user; + private IUser $user; /** @var \OCP\Share\IShare */ private $superShare; @@ -62,22 +61,27 @@ class SharedMount extends MountPoint implements MoveableMount { /** @var \OCP\Share\IShare[] */ private $groupedShares; - /** - * @param string $storage - * @param SharedMount[] $mountpoints - * @param array $arguments - * @param IStorageFactory $loader - * @param View $recipientView - */ - public function __construct($storage, array $mountpoints, $arguments, IStorageFactory $loader, View $recipientView, CappedMemoryCache $folderExistCache) { - $this->user = $arguments['user']; + private IEventDispatcher $eventDispatcher; + + public function __construct( + $storage, + array $mountpoints, + $arguments, + IStorageFactory $loader, + View $recipientView, + CappedMemoryCache $folderExistCache, + IEventDispatcher $eventDispatcher, + IUser $user + ) { + $this->user = $user; $this->recipientView = $recipientView; + $this->eventDispatcher = $eventDispatcher; $this->superShare = $arguments['superShare']; $this->groupedShares = $arguments['groupedShares']; $newMountPoint = $this->verifyMountPoint($this->superShare, $mountpoints, $folderExistCache); - $absMountPoint = '/' . $this->user . '/files' . $newMountPoint; + $absMountPoint = '/' . $user->getUID() . '/files' . $newMountPoint; parent::__construct($storage, $absMountPoint, $arguments, $loader, null, null, MountProvider::class); } @@ -93,9 +97,7 @@ class SharedMount extends MountPoint implements MoveableMount { $parent = dirname($share->getTarget()); $event = new VerifyMountPointEvent($share, $this->recipientView, $parent); - /** @var IEventDispatcher $dispatcher */ - $dispatcher = \OC::$server->query(IEventDispatcher::class); - $dispatcher->dispatchTyped($event); + $this->eventDispatcher->dispatchTyped($event); $parent = $event->getParent(); if ($folderExistCache->hasKey($parent)) { @@ -105,7 +107,7 @@ class SharedMount extends MountPoint implements MoveableMount { $folderExistCache->set($parent, $parentExists); } if (!$parentExists) { - $parent = Helper::getShareFolder($this->recipientView, $this->user); + $parent = Helper::getShareFolder($this->recipientView, $this->user->getUID()); } $newMountPoint = $this->generateUniqueTarget( @@ -133,8 +135,10 @@ class SharedMount extends MountPoint implements MoveableMount { foreach ($this->groupedShares as $tmpShare) { $tmpShare->setTarget($newPath); - \OC::$server->getShareManager()->moveShare($tmpShare, $this->user); + \OC::$server->getShareManager()->moveShare($tmpShare, $this->user->getUID()); } + + $this->eventDispatcher->dispatchTyped(new InvalidateMountCacheEvent($this->user)); } diff --git a/apps/lookup_server_connector/l10n/fi.js b/apps/lookup_server_connector/l10n/fi.js new file mode 100644 index 00000000000..f9f3ed3bd5a --- /dev/null +++ b/apps/lookup_server_connector/l10n/fi.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "lookup_server_connector", + { + "Lookup Server Connector" : "Hakemistopalvelin yhdistäjä", + "Sync public user information with the lookup server" : "Synkronoi julkinen käyttäjätieto hakemistopalvelimen kanssa" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/lookup_server_connector/l10n/fi.json b/apps/lookup_server_connector/l10n/fi.json new file mode 100644 index 00000000000..e8013ca2ab8 --- /dev/null +++ b/apps/lookup_server_connector/l10n/fi.json @@ -0,0 +1,5 @@ +{ "translations": { + "Lookup Server Connector" : "Hakemistopalvelin yhdistäjä", + "Sync public user information with the lookup server" : "Synkronoi julkinen käyttäjätieto hakemistopalvelimen kanssa" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/settings/l10n/cs.js b/apps/settings/l10n/cs.js index aefa11d356e..ca5c492a917 100644 --- a/apps/settings/l10n/cs.js +++ b/apps/settings/l10n/cs.js @@ -67,6 +67,14 @@ OC.L10N.register( "Federated Cloud Sharing" : "Federované cloudové sdílení", "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 používá zastaralou verzi %1$s (%2$s). Aktualizujte operační systém jinak funkce jako například %3$s nebudou fungovat spolehlivě.", "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." : "Nelze zjistit, zda je verze TLS cURL zastaralá nebo ne, protože během požadavku HTTPS na https://nextcloud.com došlo k chybě. Další podrobnosti najdete v souboru se záznamy událostí v Nextcloud.", + "The PHP OPcache module is not loaded. For better performance it is recommended to load it into your PHP installation." : "PHP modul OPcache není načten. Pro lepší výkon je doporučeno načíst ho do vaší PHP instalace.", + "OPcache is disabled. For better performance, it is recommended to apply <code>opcache.enable=1</code> to your PHP configuration." : "OPcache je vypnuté. Pro lepší výkon je doporučeno přidat do nastavení PHP volbu <code>opcache.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 je nastaveno tak, aby odebíralo komentáře kódu. Pokud je OPcache zapnuté, pak aby Nextcloud fungoval, je třeba, aby bylo nastaveno také <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." : "Pro Nextcloud nemáte zpřístupněno používání aplikačního program. rozhraní (API) OPcache. Pokud je OPcache zapnuté, je velmi doporučováno zahrnout veškeré složky s Nextcloud do <code>opcache.restrict_api</code> nebo toto nastavení zrušit a vypnout tak omezení k OPcache API. Zabráníte tak chybám při aktualizacím jádra Nextcloud či aplikací.", + "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." : "Pro Nextcloud nemáte zpřístupněno používání aplikačního program. rozhraní (API) OPcache. Je silně doporučováno zahrnout veškeré složky s Nextcloud do <code>opcache.restrict_api</code> nebo toto nastavení zrušit a vypnout tak omezení k OPcache API. Zabráníte tak chybám při aktualizacím jádra Nextcloud či aplikací.", + "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>." : "Je téměř vyčerpán nejvyšší umožněný počet klíčů v OPcache. Aby bylo zajištěno, že se do mezipaměti vejdou veškeré skripty, je doporučeno přidat do nastavení PHP volbu <code>opcache.max_accelerated_files</code> s hodnotou vyšší než <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>." : "Vnitřní vyrovnávací paměť OPcache je téměř zaplněná. Aby bylo zajištěno, že se do mezipaměti vejdou veškeré skripty, je doporučeno přidat do nastavení PHP volbu <code>opcache.memory_consumption</code> s hodnotou vyšší než <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>." : "Vnitřní vyrovnávací paměť OPcache pro řetězce je téměř zaplněná. Aby bylo zajištěno, že ukládání řetězců do mezipaměti bude skutečně prováděno, je doporučeno přidat do nastavení PHP volbu <code>opcache.interned_strings_buffer</code> s hodnotou vyšší než <code>%s</code>.", "Invalid SMTP password." : "Neplatné heslo pro SMTP.", "Email setting test" : "Zkouška nastavení e-mailu", "Well done, %s!" : "Úspěšně nastaveno, %s!", @@ -266,6 +274,7 @@ OC.L10N.register( "Change scope level of {accountProperty}" : "Změnit stupeň rozsahu {accountProperty}", "Unable to update federation scope of the primary {accountProperty}" : "Nedaří se aktualizovat rozsah federování primární {accountProperty}", "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", "Add new password" : "Přidat nové heslo", diff --git a/apps/settings/l10n/cs.json b/apps/settings/l10n/cs.json index be4c5ae22a1..0adfad4a4e9 100644 --- a/apps/settings/l10n/cs.json +++ b/apps/settings/l10n/cs.json @@ -65,6 +65,14 @@ "Federated Cloud Sharing" : "Federované cloudové sdílení", "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 používá zastaralou verzi %1$s (%2$s). Aktualizujte operační systém jinak funkce jako například %3$s nebudou fungovat spolehlivě.", "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." : "Nelze zjistit, zda je verze TLS cURL zastaralá nebo ne, protože během požadavku HTTPS na https://nextcloud.com došlo k chybě. Další podrobnosti najdete v souboru se záznamy událostí v Nextcloud.", + "The PHP OPcache module is not loaded. For better performance it is recommended to load it into your PHP installation." : "PHP modul OPcache není načten. Pro lepší výkon je doporučeno načíst ho do vaší PHP instalace.", + "OPcache is disabled. For better performance, it is recommended to apply <code>opcache.enable=1</code> to your PHP configuration." : "OPcache je vypnuté. Pro lepší výkon je doporučeno přidat do nastavení PHP volbu <code>opcache.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 je nastaveno tak, aby odebíralo komentáře kódu. Pokud je OPcache zapnuté, pak aby Nextcloud fungoval, je třeba, aby bylo nastaveno také <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." : "Pro Nextcloud nemáte zpřístupněno používání aplikačního program. rozhraní (API) OPcache. Pokud je OPcache zapnuté, je velmi doporučováno zahrnout veškeré složky s Nextcloud do <code>opcache.restrict_api</code> nebo toto nastavení zrušit a vypnout tak omezení k OPcache API. Zabráníte tak chybám při aktualizacím jádra Nextcloud či aplikací.", + "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." : "Pro Nextcloud nemáte zpřístupněno používání aplikačního program. rozhraní (API) OPcache. Je silně doporučováno zahrnout veškeré složky s Nextcloud do <code>opcache.restrict_api</code> nebo toto nastavení zrušit a vypnout tak omezení k OPcache API. Zabráníte tak chybám při aktualizacím jádra Nextcloud či aplikací.", + "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>." : "Je téměř vyčerpán nejvyšší umožněný počet klíčů v OPcache. Aby bylo zajištěno, že se do mezipaměti vejdou veškeré skripty, je doporučeno přidat do nastavení PHP volbu <code>opcache.max_accelerated_files</code> s hodnotou vyšší než <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>." : "Vnitřní vyrovnávací paměť OPcache je téměř zaplněná. Aby bylo zajištěno, že se do mezipaměti vejdou veškeré skripty, je doporučeno přidat do nastavení PHP volbu <code>opcache.memory_consumption</code> s hodnotou vyšší než <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>." : "Vnitřní vyrovnávací paměť OPcache pro řetězce je téměř zaplněná. Aby bylo zajištěno, že ukládání řetězců do mezipaměti bude skutečně prováděno, je doporučeno přidat do nastavení PHP volbu <code>opcache.interned_strings_buffer</code> s hodnotou vyšší než <code>%s</code>.", "Invalid SMTP password." : "Neplatné heslo pro SMTP.", "Email setting test" : "Zkouška nastavení e-mailu", "Well done, %s!" : "Úspěšně nastaveno, %s!", @@ -264,6 +272,7 @@ "Change scope level of {accountProperty}" : "Změnit stupeň rozsahu {accountProperty}", "Unable to update federation scope of the primary {accountProperty}" : "Nedaří se aktualizovat rozsah federování primární {accountProperty}", "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", "Add new password" : "Přidat nové heslo", diff --git a/apps/settings/l10n/de_DE.js b/apps/settings/l10n/de_DE.js index 10fbee1f8cf..545005cc482 100644 --- a/apps/settings/l10n/de_DE.js +++ b/apps/settings/l10n/de_DE.js @@ -67,6 +67,14 @@ OC.L10N.register( "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 verwendet eine veraltete %1$s Version (%2$s). Bitte aktualisieren Sie Ihr Betriebssystem, da ansonsten Funktionen wie z.B. %3$s nicht zuverlässig funktionieren.", "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." : "Es konnte nicht festgestellt werden, ob die TLS-Version von cURL veraltet ist oder nicht, da während der HTTPS-Anforderung an https://nextcloud.com ein Fehler aufgetreten ist. Bitte überprüfen Sie die Nextcloud-Protokolldatei für weitere Einzelheiten.", + "The PHP OPcache module is not loaded. For better performance it is recommended to load it into your PHP installation." : "Das PHP-OPcache-Modul ist nicht geladen. Für eine bessere Leistung empfiehlt es sich, das Modul in Ihre PHP-Installation zu laden.", + "OPcache is disabled. For better performance, it is recommended to apply <code>opcache.enable=1</code> to your PHP configuration." : "OPcache ist deaktiviert. Für eine bessere Leistung wird empfohlen, <code>opcache.enable=1</code> auf Ihre PHP-Konfiguration anzuwenden.", + "OPcache is configured to remove code comments. With OPcache enabled, <code>opcache.save_comments=1</code> must be set for Nextcloud to function." : "OPcache ist so konfiguriert, dass Codekommentare entfernt werden. Wenn OPcache aktiviert ist, muss <code>opcache.save_comments=1</code> gesetzt werden, damit Nextcloud funktioniert.", + "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 darf die OPcache-API nicht verwenden. Wenn OPcache aktiviert ist, wird dringend empfohlen, alle Nextcloud-Verzeichnisse mit <code>opcache.restrict_api</code> einzuschließen oder diese Einstellung zu deaktivieren, um OPcache-API-Einschränkungen zu deaktivieren und Fehler während Nextcloud-Core- oder App-Aktualisierungen zu vermeiden.", + "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 darf die OPcache-API nicht verwenden. Es wird dringend empfohlen, alle Nextcloud-Verzeichnisse mit <code>opcache.restrict_api</code> einzuschließen oder diese Einstellung zu deaktivieren, um OPcache-API-Einschränkungen zu deaktivieren und Fehler während Nextcloud-Core- oder App-Aktualisierungen zu vermeiden.", + "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>." : "Die maximale Anzahl von OPcache-Schlüsseln ist fast überschritten. Um sicherzustellen, dass alle Skripte im Cache gehalten werden können, wird empfohlen, <code>opcache.max_accelerated_files</code> mit einem höheren Wert als <code>%s</code> auf Ihre PHP-Konfiguration anzuwenden.", + "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>." : "Der OPcache-Puffer ist fast voll. Um sicherzustellen, dass alle Skripte im Cache gehalten werden können, wird empfohlen, <code>opcache.memory_consumption</code> auf Ihre PHP-Konfiguration mit einem höheren Wert als <code>%s</code> anzuwenden. ", + "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>." : "Der OPcache-Zwischenspeicher für interne Zeichenfolgen ist fast voll. Um sicherzustellen, dass sich wiederholende Zeichenfolgen effektiv zwischengespeichert werden können, wird empfohlen, <code>opcache.interned_strings_buffer</code> mit einem Wert größer als <code>%s</code> auf Ihre PHP-Konfiguration anzuwenden.", "Invalid SMTP password." : "Ungültiges SMTP-Passwort.", "Email setting test" : "Test der E-Mail-Einstellungen", "Well done, %s!" : "Gut gemacht, %s!", diff --git a/apps/settings/l10n/de_DE.json b/apps/settings/l10n/de_DE.json index 74400bb53d7..0701208e1d4 100644 --- a/apps/settings/l10n/de_DE.json +++ b/apps/settings/l10n/de_DE.json @@ -65,6 +65,14 @@ "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 verwendet eine veraltete %1$s Version (%2$s). Bitte aktualisieren Sie Ihr Betriebssystem, da ansonsten Funktionen wie z.B. %3$s nicht zuverlässig funktionieren.", "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." : "Es konnte nicht festgestellt werden, ob die TLS-Version von cURL veraltet ist oder nicht, da während der HTTPS-Anforderung an https://nextcloud.com ein Fehler aufgetreten ist. Bitte überprüfen Sie die Nextcloud-Protokolldatei für weitere Einzelheiten.", + "The PHP OPcache module is not loaded. For better performance it is recommended to load it into your PHP installation." : "Das PHP-OPcache-Modul ist nicht geladen. Für eine bessere Leistung empfiehlt es sich, das Modul in Ihre PHP-Installation zu laden.", + "OPcache is disabled. For better performance, it is recommended to apply <code>opcache.enable=1</code> to your PHP configuration." : "OPcache ist deaktiviert. Für eine bessere Leistung wird empfohlen, <code>opcache.enable=1</code> auf Ihre PHP-Konfiguration anzuwenden.", + "OPcache is configured to remove code comments. With OPcache enabled, <code>opcache.save_comments=1</code> must be set for Nextcloud to function." : "OPcache ist so konfiguriert, dass Codekommentare entfernt werden. Wenn OPcache aktiviert ist, muss <code>opcache.save_comments=1</code> gesetzt werden, damit Nextcloud funktioniert.", + "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 darf die OPcache-API nicht verwenden. Wenn OPcache aktiviert ist, wird dringend empfohlen, alle Nextcloud-Verzeichnisse mit <code>opcache.restrict_api</code> einzuschließen oder diese Einstellung zu deaktivieren, um OPcache-API-Einschränkungen zu deaktivieren und Fehler während Nextcloud-Core- oder App-Aktualisierungen zu vermeiden.", + "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 darf die OPcache-API nicht verwenden. Es wird dringend empfohlen, alle Nextcloud-Verzeichnisse mit <code>opcache.restrict_api</code> einzuschließen oder diese Einstellung zu deaktivieren, um OPcache-API-Einschränkungen zu deaktivieren und Fehler während Nextcloud-Core- oder App-Aktualisierungen zu vermeiden.", + "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>." : "Die maximale Anzahl von OPcache-Schlüsseln ist fast überschritten. Um sicherzustellen, dass alle Skripte im Cache gehalten werden können, wird empfohlen, <code>opcache.max_accelerated_files</code> mit einem höheren Wert als <code>%s</code> auf Ihre PHP-Konfiguration anzuwenden.", + "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>." : "Der OPcache-Puffer ist fast voll. Um sicherzustellen, dass alle Skripte im Cache gehalten werden können, wird empfohlen, <code>opcache.memory_consumption</code> auf Ihre PHP-Konfiguration mit einem höheren Wert als <code>%s</code> anzuwenden. ", + "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>." : "Der OPcache-Zwischenspeicher für interne Zeichenfolgen ist fast voll. Um sicherzustellen, dass sich wiederholende Zeichenfolgen effektiv zwischengespeichert werden können, wird empfohlen, <code>opcache.interned_strings_buffer</code> mit einem Wert größer als <code>%s</code> auf Ihre PHP-Konfiguration anzuwenden.", "Invalid SMTP password." : "Ungültiges SMTP-Passwort.", "Email setting test" : "Test der E-Mail-Einstellungen", "Well done, %s!" : "Gut gemacht, %s!", diff --git a/apps/settings/l10n/es.js b/apps/settings/l10n/es.js index c59201cb68c..887673055e3 100644 --- a/apps/settings/l10n/es.js +++ b/apps/settings/l10n/es.js @@ -219,7 +219,9 @@ OC.L10N.register( "Copy" : "Copiar", "Could not copy app password. Please copy it manually." : "No se ha podido copiar la contraseña de app. Por favor, cópiala manualmente.", "Profile" : "Perfil", + "Enable or disable profile by default for new users." : "Activar o desactivar el perfil por defecto para los nuevos usuarios.", "Enable" : "Activar", + "Unable to update profile default setting" : "No se pudo actualizar la configuración por defecto del perfil", "Rename group" : "Renombrar grupo", "Remove group" : "Eliminar grupo", "You are about to remove the group {group}. The users will NOT be deleted." : "Vas a eliminar el grupo {group}. Los usuarios NO serán eliminados.", @@ -264,6 +266,7 @@ OC.L10N.register( "Change scope level of {accountProperty}" : "Cambiar el nivel de privacidad de {accountProperty}", "Unable to update federation scope of the primary {accountProperty}" : "No se puede actualizar el perímetro de la federación del principal {accountProperty}", "Unable to update federation scope of additional {accountProperty}" : "No se puede actualizar el perímetro de la federación de la adicional {accountProperty}", + "Add additional email" : "Añadir un email adicional", "Add" : "Añadir", "You do not have permissions to see the details of this user" : "No tienes permisos para ver los detalles de este usuario", "Add new password" : " Añadir nueva contraseña", diff --git a/apps/settings/l10n/es.json b/apps/settings/l10n/es.json index 8dcbe8d2418..6b27634f74d 100644 --- a/apps/settings/l10n/es.json +++ b/apps/settings/l10n/es.json @@ -217,7 +217,9 @@ "Copy" : "Copiar", "Could not copy app password. Please copy it manually." : "No se ha podido copiar la contraseña de app. Por favor, cópiala manualmente.", "Profile" : "Perfil", + "Enable or disable profile by default for new users." : "Activar o desactivar el perfil por defecto para los nuevos usuarios.", "Enable" : "Activar", + "Unable to update profile default setting" : "No se pudo actualizar la configuración por defecto del perfil", "Rename group" : "Renombrar grupo", "Remove group" : "Eliminar grupo", "You are about to remove the group {group}. The users will NOT be deleted." : "Vas a eliminar el grupo {group}. Los usuarios NO serán eliminados.", @@ -262,6 +264,7 @@ "Change scope level of {accountProperty}" : "Cambiar el nivel de privacidad de {accountProperty}", "Unable to update federation scope of the primary {accountProperty}" : "No se puede actualizar el perímetro de la federación del principal {accountProperty}", "Unable to update federation scope of additional {accountProperty}" : "No se puede actualizar el perímetro de la federación de la adicional {accountProperty}", + "Add additional email" : "Añadir un email adicional", "Add" : "Añadir", "You do not have permissions to see the details of this user" : "No tienes permisos para ver los detalles de este usuario", "Add new password" : " Añadir nueva contraseña", diff --git a/apps/settings/l10n/fi.js b/apps/settings/l10n/fi.js index 7131dc9b592..4a083c9cd08 100644 --- a/apps/settings/l10n/fi.js +++ b/apps/settings/l10n/fi.js @@ -102,6 +102,7 @@ OC.L10N.register( "Personal" : "Henkilökohtainen", "Administration" : "Ylläpito", "Additional settings" : "Lisäasetukset", + "Admin privileges" : "Ylläpitäjän oikeudet", "Groupware" : "Groupware", "Overview" : "Yleiskuvaus", "Basic settings" : "Perusasetukset", @@ -153,6 +154,7 @@ OC.L10N.register( "Featured" : "Poiminta", "Update to {update}" : "Päivitä versioon {update}", "Update all" : "Päivitä kaikki", + "All apps are up-to-date." : "Kaikki sovellukset ovat ajan tasalla.", "Results from other categories" : "Tulokset muista luokista", "No apps found for your version" : "Sovelluksia ei löytynyt versiollesi", "Disable all" : "Poista kaikki käytöstä", @@ -201,9 +203,11 @@ OC.L10N.register( "Could not copy app password. Please copy it manually." : "Sovellussalasanaa ei voitu kopioida. Kopioi se manuaalisesti.", "Profile" : "Profiili", "Enable" : "Käytä", + "Rename group" : "Nimeä ryhmä uudelleen", "Remove group" : "Poista ryhmä", "You are about to remove the group {group}. The users will NOT be deleted." : "Olet aikeissa poistaa ryhmän {group}. Käyttäjiä EI poisteta!", "Please confirm the group removal " : "Vahvista ryhmän poistaminen", + "Your biography" : "Sinun elämäkertasi", "Your full name" : "Koko nimesi", "Unable to update full name" : "Koko nimeä ei voi päivittää", "No full name set" : "Koko nimeä ei ole asetettu", @@ -211,11 +215,14 @@ OC.L10N.register( "Primary email for password reset and notifications" : "Ensisijainen sähköposti salasanan nollaamista ja ilmoituksia varten", "Remove primary email" : "Poista ensisijainen sähköpostiosoite", "Delete email" : "Poista sähköposti", + "Unset as primary email" : "Poista ensisijaisesta sähköpostista", "This address is not confirmed" : "Tätä osoitetta ei ole vahvistettu", "Set as primary email" : "Aseta ensisijaiseksi sähköpostiosoitteeksi", "Your email address" : "Sähköpostiosoitteesi", "Additional email address {index}" : "Lisäsähköpostiosoite {index}", "No email address set" : "Sähköpostiosoitetta ei ole asetettu", + "Additional emails" : "Muut sähköpostit", + "Your headline" : "Otsikkosi", "Language" : "Kieli", "Help translate" : "Auta kääntämisessä", "Unable to update language" : "Kieltä ei voi päivittää", @@ -304,8 +311,10 @@ OC.L10N.register( "Sending…" : "Lähetetään…", "Email sent" : "Sähköposti lähetetty", "Address" : "Osoite", + "Avatar" : "Profiilikuva", "About" : "Tietoja", "Full name" : "Koko nimi", + "Headline" : "Otsikko", "Organisation" : "Organisaatio", "Phone number" : "Puhelinnumero", "Role" : "Rooli", diff --git a/apps/settings/l10n/fi.json b/apps/settings/l10n/fi.json index 609da945cbc..bc84e1666c1 100644 --- a/apps/settings/l10n/fi.json +++ b/apps/settings/l10n/fi.json @@ -100,6 +100,7 @@ "Personal" : "Henkilökohtainen", "Administration" : "Ylläpito", "Additional settings" : "Lisäasetukset", + "Admin privileges" : "Ylläpitäjän oikeudet", "Groupware" : "Groupware", "Overview" : "Yleiskuvaus", "Basic settings" : "Perusasetukset", @@ -151,6 +152,7 @@ "Featured" : "Poiminta", "Update to {update}" : "Päivitä versioon {update}", "Update all" : "Päivitä kaikki", + "All apps are up-to-date." : "Kaikki sovellukset ovat ajan tasalla.", "Results from other categories" : "Tulokset muista luokista", "No apps found for your version" : "Sovelluksia ei löytynyt versiollesi", "Disable all" : "Poista kaikki käytöstä", @@ -199,9 +201,11 @@ "Could not copy app password. Please copy it manually." : "Sovellussalasanaa ei voitu kopioida. Kopioi se manuaalisesti.", "Profile" : "Profiili", "Enable" : "Käytä", + "Rename group" : "Nimeä ryhmä uudelleen", "Remove group" : "Poista ryhmä", "You are about to remove the group {group}. The users will NOT be deleted." : "Olet aikeissa poistaa ryhmän {group}. Käyttäjiä EI poisteta!", "Please confirm the group removal " : "Vahvista ryhmän poistaminen", + "Your biography" : "Sinun elämäkertasi", "Your full name" : "Koko nimesi", "Unable to update full name" : "Koko nimeä ei voi päivittää", "No full name set" : "Koko nimeä ei ole asetettu", @@ -209,11 +213,14 @@ "Primary email for password reset and notifications" : "Ensisijainen sähköposti salasanan nollaamista ja ilmoituksia varten", "Remove primary email" : "Poista ensisijainen sähköpostiosoite", "Delete email" : "Poista sähköposti", + "Unset as primary email" : "Poista ensisijaisesta sähköpostista", "This address is not confirmed" : "Tätä osoitetta ei ole vahvistettu", "Set as primary email" : "Aseta ensisijaiseksi sähköpostiosoitteeksi", "Your email address" : "Sähköpostiosoitteesi", "Additional email address {index}" : "Lisäsähköpostiosoite {index}", "No email address set" : "Sähköpostiosoitetta ei ole asetettu", + "Additional emails" : "Muut sähköpostit", + "Your headline" : "Otsikkosi", "Language" : "Kieli", "Help translate" : "Auta kääntämisessä", "Unable to update language" : "Kieltä ei voi päivittää", @@ -302,8 +309,10 @@ "Sending…" : "Lähetetään…", "Email sent" : "Sähköposti lähetetty", "Address" : "Osoite", + "Avatar" : "Profiilikuva", "About" : "Tietoja", "Full name" : "Koko nimi", + "Headline" : "Otsikko", "Organisation" : "Organisaatio", "Phone number" : "Puhelinnumero", "Role" : "Rooli", diff --git a/apps/settings/l10n/fr.js b/apps/settings/l10n/fr.js index d19e6429c52..96cc598eb43 100644 --- a/apps/settings/l10n/fr.js +++ b/apps/settings/l10n/fr.js @@ -166,6 +166,7 @@ OC.L10N.register( "Featured" : "Mises en avant", "Update to {update}" : "Mise à jour vers {update}", "Update all" : "Tout mettre à jour", + "All apps are up-to-date." : "Toutes les applications sont à jour.", "Results from other categories" : "Résultats d'autres catégories", "No apps found for your version" : "Pas d'application trouvée pour votre version", "Disable all" : "Tout désactiver", diff --git a/apps/settings/l10n/fr.json b/apps/settings/l10n/fr.json index 9511580e6aa..4f3b4f08f68 100644 --- a/apps/settings/l10n/fr.json +++ b/apps/settings/l10n/fr.json @@ -164,6 +164,7 @@ "Featured" : "Mises en avant", "Update to {update}" : "Mise à jour vers {update}", "Update all" : "Tout mettre à jour", + "All apps are up-to-date." : "Toutes les applications sont à jour.", "Results from other categories" : "Résultats d'autres catégories", "No apps found for your version" : "Pas d'application trouvée pour votre version", "Disable all" : "Tout désactiver", diff --git a/apps/settings/l10n/pl.js b/apps/settings/l10n/pl.js index f52ad4f2992..b0a1374b527 100644 --- a/apps/settings/l10n/pl.js +++ b/apps/settings/l10n/pl.js @@ -67,6 +67,14 @@ OC.L10N.register( "Federated Cloud Sharing" : "Udostępnianie Chmury Federacyjnej", "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 używa nieaktualnej %1$s wersji (%2$s). Zaktualizuj system operacyjny lub funkcje takie jak %3$s nie będą działać prawidłowo.", "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." : "Nie można określić, czy wersja TLS cURL jest aktualna, ponieważ wystąpił błąd podczas żądania HTTPS skierowanego do https://nextcloud.com. Aby uzyskać więcej informacji, sprawdź plik dziennika nextcloud.", + "The PHP OPcache module is not loaded. For better performance it is recommended to load it into your PHP installation." : "Moduł PHP OPcache nie jest wczytany. Aby uzyskać lepszą wydajność, zaleca się wczytanie go do instalacji PHP.", + "OPcache is disabled. For better performance, it is recommended to apply <code>opcache.enable=1</code> to your PHP configuration." : "OPcache jest wyłączone. Aby uzyskać lepszą wydajność, zaleca się zastosowanie <code>opcache.enable=1</code> w konfiguracji 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 jest skonfigurowane do usuwania komentarzy kodu. Przy włączonym OPcache, musi być ustawione <code>opcache.save_comments=1</code>, aby działał Nextcloud.", + "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 nie może korzystać z interfejsu OPcache API. Po włączeniu OPcache zdecydowanie zaleca się uwzględnienie wszystkich katalogów Nextcloud z <code>opcache.restrict_api</code> lub usunięcie tego ustawienia, aby wyłączyć ograniczenia interfejsu OPcache API, żeby zapobiec błędom podczas aktualizacji rdzenia lub aplikacji Nextcloud.", + "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 nie może korzystać z interfejsu OPcache API. Zdecydowanie zaleca się uwzględnienie wszystkich katalogów Nextcloud z <code>opcache.restrict_api</code> lub usunięcie tego ustawienia, aby wyłączyć ograniczenia interfejsu OPcache API, żeby zapobiec błędom podczas aktualizacji rdzenia lub aplikacji Nextcloud.", + "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>." : "Maksymalna liczba kluczy OPcache jest prawie przekroczona. Aby upewnić się, że wszystkie skrypty mogą być przechowywane w pamięci podręcznej, zaleca się zastosowanie <code>opcache.max_accelerated_files</code> w konfiguracji PHP z wartością wyższą niż <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>." : "Bufor OPcache jest prawie pełny. Aby upewnić się, że wszystkie skrypty mogą być przechowywane w pamięci podręcznej, zaleca się zastosowanie <code>opcache.memory_consumption</code> w konfiguracji PHP z wartością wyższą niż <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>." : "Bufor ciągów internowanych OPcache jest prawie pełny. Aby upewnić się, że powtarzające się ciągi mogą być efektywnie buforowane, zaleca się zastosowanie <code>opcache.interned_strings_buffer</code> w konfiguracji PHP z wartością wyższą niż <code>%s</code>.", "Invalid SMTP password." : "Nieprawidłowe hasło SMTP.", "Email setting test" : "Test ustawień e-mail", "Well done, %s!" : "Dobra robota, %s!", diff --git a/apps/settings/l10n/pl.json b/apps/settings/l10n/pl.json index f63346dd664..98efb783d44 100644 --- a/apps/settings/l10n/pl.json +++ b/apps/settings/l10n/pl.json @@ -65,6 +65,14 @@ "Federated Cloud Sharing" : "Udostępnianie Chmury Federacyjnej", "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 używa nieaktualnej %1$s wersji (%2$s). Zaktualizuj system operacyjny lub funkcje takie jak %3$s nie będą działać prawidłowo.", "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." : "Nie można określić, czy wersja TLS cURL jest aktualna, ponieważ wystąpił błąd podczas żądania HTTPS skierowanego do https://nextcloud.com. Aby uzyskać więcej informacji, sprawdź plik dziennika nextcloud.", + "The PHP OPcache module is not loaded. For better performance it is recommended to load it into your PHP installation." : "Moduł PHP OPcache nie jest wczytany. Aby uzyskać lepszą wydajność, zaleca się wczytanie go do instalacji PHP.", + "OPcache is disabled. For better performance, it is recommended to apply <code>opcache.enable=1</code> to your PHP configuration." : "OPcache jest wyłączone. Aby uzyskać lepszą wydajność, zaleca się zastosowanie <code>opcache.enable=1</code> w konfiguracji 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 jest skonfigurowane do usuwania komentarzy kodu. Przy włączonym OPcache, musi być ustawione <code>opcache.save_comments=1</code>, aby działał Nextcloud.", + "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 nie może korzystać z interfejsu OPcache API. Po włączeniu OPcache zdecydowanie zaleca się uwzględnienie wszystkich katalogów Nextcloud z <code>opcache.restrict_api</code> lub usunięcie tego ustawienia, aby wyłączyć ograniczenia interfejsu OPcache API, żeby zapobiec błędom podczas aktualizacji rdzenia lub aplikacji Nextcloud.", + "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 nie może korzystać z interfejsu OPcache API. Zdecydowanie zaleca się uwzględnienie wszystkich katalogów Nextcloud z <code>opcache.restrict_api</code> lub usunięcie tego ustawienia, aby wyłączyć ograniczenia interfejsu OPcache API, żeby zapobiec błędom podczas aktualizacji rdzenia lub aplikacji Nextcloud.", + "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>." : "Maksymalna liczba kluczy OPcache jest prawie przekroczona. Aby upewnić się, że wszystkie skrypty mogą być przechowywane w pamięci podręcznej, zaleca się zastosowanie <code>opcache.max_accelerated_files</code> w konfiguracji PHP z wartością wyższą niż <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>." : "Bufor OPcache jest prawie pełny. Aby upewnić się, że wszystkie skrypty mogą być przechowywane w pamięci podręcznej, zaleca się zastosowanie <code>opcache.memory_consumption</code> w konfiguracji PHP z wartością wyższą niż <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>." : "Bufor ciągów internowanych OPcache jest prawie pełny. Aby upewnić się, że powtarzające się ciągi mogą być efektywnie buforowane, zaleca się zastosowanie <code>opcache.interned_strings_buffer</code> w konfiguracji PHP z wartością wyższą niż <code>%s</code>.", "Invalid SMTP password." : "Nieprawidłowe hasło SMTP.", "Email setting test" : "Test ustawień e-mail", "Well done, %s!" : "Dobra robota, %s!", diff --git a/apps/settings/l10n/tr.js b/apps/settings/l10n/tr.js index 2846f365eb6..b54a26395a8 100644 --- a/apps/settings/l10n/tr.js +++ b/apps/settings/l10n/tr.js @@ -67,6 +67,14 @@ OC.L10N.register( "Federated Cloud Sharing" : "Birleşik Bulut Paylaşımı", "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 eski bir %1$s sürümü kullanıyor (%2$s). Lütfen işletim sisteminizi güncelleyin, yoksa %3$s gibi özellikler düzgün çalışmaz.", "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 üzerine yapılan HTTPS isteği sırasında oluşan sorun nedeniyle cURL TLS sürümünün eski olup olmadığı belirlenemedi. Ayrıntılı bilgi almak için nextcloud günlük dosyasına bakabilirsiniz.", + "The PHP OPcache module is not loaded. For better performance it is recommended to load it into your PHP installation." : "PHP OPcache modülü yüklenmemiş. Daha iyi başarım sağlamak için PHP kurulumunuza eklemeniz önerilir.", + "OPcache is disabled. For better performance, it is recommended to apply <code>opcache.enable=1</code> to your PHP configuration." : "OPcache devre dışı. Daha iyi başarım için PHP yapılandırmanızda <code>opcache.enable=1</code> seçeneğini ayarlamanız önerilir.", + "OPcache is configured to remove code comments. With OPcache enabled, <code>opcache.save_comments=1</code> must be set for Nextcloud to function." : "OPcache, kod yorumlarını kaldıracak şekilde yapılandırılmış. OPcache etkinken, Nextcloud uygulamasının çalışması için <code>opcache.save_comments=1</code> ayarı yapılmalıdır.", + "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 tarafından OPcache API' yazılımının kullanmasına izin verilmez. OPcache etkinleştirildiğinde, Nextcloud çekirdeği veya uygulama yükseltmeleri sırasında hataları önlemek için <code>opcache.restrict_api</code> ile tüm Nextcloud klasörlerini katmanız ya da OPcache API kısıtlamalarını devre dışı bırakmak için bu ayarı kaldırmanız önemle önerilir.", + "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 tarafından OPcache API' yazılımının kullanmasına izin verilmez. Nextcloud çekirdeği veya uygulama yükseltmeleri sırasında hataları önlemek için <code>opcache.restrict_api</code> ile tüm Nextcloud klasörlerini katmanız ya da OPcache API kısıtlamalarını devre dışı bırakmak için bu ayarı kaldırmanız önemle önerilir.", + "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>." : "En fazla OPcache anahtar sayısına neredeyse erişildi. Tüm betik dosyalarının ön bellekte tutulabilmesini sağlamak için, PHP yapılandırmanıza <code>%s</code> üzerinde bir değerle <code>opcache.max_accelerated_files</code> uygulamanız önerilir.", + "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 ara belleği neredeyse dolu. Tüm betik dosyalarının ön bellekte tutulabilmesini sağlamak için, PHP yapılandırmanıza <code>%s</code> üzerinde bir değerle <code>opcache.memory_consumption</code> uygulamanız önerilir.", + "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 dizge ara belleği neredeyse dolu. Yinelenen dizgelerin etkin bir şekilde ön belleğe alınabilmesini sağlamak için, PHP yapılandırmanıza <code>%s</code> üzerinde bir değerle <code>opcache.interned_strings_buffer</code> uygulamanız önerilir.", "Invalid SMTP password." : "SMTP parolası geçersiz.", "Email setting test" : "E-posta ayarları sınaması", "Well done, %s!" : "Tamamdır %s!", diff --git a/apps/settings/l10n/tr.json b/apps/settings/l10n/tr.json index 7c432e114af..1af09baa173 100644 --- a/apps/settings/l10n/tr.json +++ b/apps/settings/l10n/tr.json @@ -65,6 +65,14 @@ "Federated Cloud Sharing" : "Birleşik Bulut Paylaşımı", "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 eski bir %1$s sürümü kullanıyor (%2$s). Lütfen işletim sisteminizi güncelleyin, yoksa %3$s gibi özellikler düzgün çalışmaz.", "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 üzerine yapılan HTTPS isteği sırasında oluşan sorun nedeniyle cURL TLS sürümünün eski olup olmadığı belirlenemedi. Ayrıntılı bilgi almak için nextcloud günlük dosyasına bakabilirsiniz.", + "The PHP OPcache module is not loaded. For better performance it is recommended to load it into your PHP installation." : "PHP OPcache modülü yüklenmemiş. Daha iyi başarım sağlamak için PHP kurulumunuza eklemeniz önerilir.", + "OPcache is disabled. For better performance, it is recommended to apply <code>opcache.enable=1</code> to your PHP configuration." : "OPcache devre dışı. Daha iyi başarım için PHP yapılandırmanızda <code>opcache.enable=1</code> seçeneğini ayarlamanız önerilir.", + "OPcache is configured to remove code comments. With OPcache enabled, <code>opcache.save_comments=1</code> must be set for Nextcloud to function." : "OPcache, kod yorumlarını kaldıracak şekilde yapılandırılmış. OPcache etkinken, Nextcloud uygulamasının çalışması için <code>opcache.save_comments=1</code> ayarı yapılmalıdır.", + "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 tarafından OPcache API' yazılımının kullanmasına izin verilmez. OPcache etkinleştirildiğinde, Nextcloud çekirdeği veya uygulama yükseltmeleri sırasında hataları önlemek için <code>opcache.restrict_api</code> ile tüm Nextcloud klasörlerini katmanız ya da OPcache API kısıtlamalarını devre dışı bırakmak için bu ayarı kaldırmanız önemle önerilir.", + "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 tarafından OPcache API' yazılımının kullanmasına izin verilmez. Nextcloud çekirdeği veya uygulama yükseltmeleri sırasında hataları önlemek için <code>opcache.restrict_api</code> ile tüm Nextcloud klasörlerini katmanız ya da OPcache API kısıtlamalarını devre dışı bırakmak için bu ayarı kaldırmanız önemle önerilir.", + "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>." : "En fazla OPcache anahtar sayısına neredeyse erişildi. Tüm betik dosyalarının ön bellekte tutulabilmesini sağlamak için, PHP yapılandırmanıza <code>%s</code> üzerinde bir değerle <code>opcache.max_accelerated_files</code> uygulamanız önerilir.", + "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 ara belleği neredeyse dolu. Tüm betik dosyalarının ön bellekte tutulabilmesini sağlamak için, PHP yapılandırmanıza <code>%s</code> üzerinde bir değerle <code>opcache.memory_consumption</code> uygulamanız önerilir.", + "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 dizge ara belleği neredeyse dolu. Yinelenen dizgelerin etkin bir şekilde ön belleğe alınabilmesini sağlamak için, PHP yapılandırmanıza <code>%s</code> üzerinde bir değerle <code>opcache.interned_strings_buffer</code> uygulamanız önerilir.", "Invalid SMTP password." : "SMTP parolası geçersiz.", "Email setting test" : "E-posta ayarları sınaması", "Well done, %s!" : "Tamamdır %s!", diff --git a/apps/settings/l10n/zh_HK.js b/apps/settings/l10n/zh_HK.js index 92690f9bebf..2e4653f98aa 100644 --- a/apps/settings/l10n/zh_HK.js +++ b/apps/settings/l10n/zh_HK.js @@ -67,6 +67,14 @@ OC.L10N.register( "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." : "已停用 OPcache。要得到更好的效能,建議在您的 PHP 設定中套用 <code>opcache.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 被設定為移除程式碼註釋。啟用 OPcache 後,必須設定 <code>opcache.save_comments=1</code> 才能讓 Nextcloud 正常運作。", + "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。啟用 OPcache 後,強烈建議使用 <code>opcache.restrict_api</code> 包含所有 Nextcloud 目錄,或是關閉此設定以停用 OPcache API 限制,以避免在 Nextcloud 核心或應用程式升級期間發生錯誤。", + "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。強烈建議使用 <code>opcache.restrict_api</code> 包含所有 Nextcloud 目錄,或是關閉此設定以停用 OPcache API 限制,以避免在 Nextcloud 核心或應用程式升級期間發生錯誤。", + "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 密鑰的最大數量。為確保所有腳本都可以保存在緩存中,建議將 <code>opcache.max_accelerated_files</code> 應用於您的 PHP 配置,其值高於 <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 內部字串緩衝區幾乎快滿了。為確保可以有效快取重複字串,建議在您的 PHP 設定中的 <code>opcache.interned_strings_buffer</code> 套用高於 <code>%s</code> 的值。", "Invalid SMTP password." : "無效的 SMTP 密碼", "Email setting test" : "測試郵件設定", "Well done, %s!" : "太棒了,%s!", diff --git a/apps/settings/l10n/zh_HK.json b/apps/settings/l10n/zh_HK.json index 61420276ead..70afcc6b6ab 100644 --- a/apps/settings/l10n/zh_HK.json +++ b/apps/settings/l10n/zh_HK.json @@ -65,6 +65,14 @@ "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." : "已停用 OPcache。要得到更好的效能,建議在您的 PHP 設定中套用 <code>opcache.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 被設定為移除程式碼註釋。啟用 OPcache 後,必須設定 <code>opcache.save_comments=1</code> 才能讓 Nextcloud 正常運作。", + "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。啟用 OPcache 後,強烈建議使用 <code>opcache.restrict_api</code> 包含所有 Nextcloud 目錄,或是關閉此設定以停用 OPcache API 限制,以避免在 Nextcloud 核心或應用程式升級期間發生錯誤。", + "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。強烈建議使用 <code>opcache.restrict_api</code> 包含所有 Nextcloud 目錄,或是關閉此設定以停用 OPcache API 限制,以避免在 Nextcloud 核心或應用程式升級期間發生錯誤。", + "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 密鑰的最大數量。為確保所有腳本都可以保存在緩存中,建議將 <code>opcache.max_accelerated_files</code> 應用於您的 PHP 配置,其值高於 <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 內部字串緩衝區幾乎快滿了。為確保可以有效快取重複字串,建議在您的 PHP 設定中的 <code>opcache.interned_strings_buffer</code> 套用高於 <code>%s</code> 的值。", "Invalid SMTP password." : "無效的 SMTP 密碼", "Email setting test" : "測試郵件設定", "Well done, %s!" : "太棒了,%s!", diff --git a/apps/settings/l10n/zh_TW.js b/apps/settings/l10n/zh_TW.js index 9cb2da33342..2e00a04dc1d 100644 --- a/apps/settings/l10n/zh_TW.js +++ b/apps/settings/l10n/zh_TW.js @@ -67,6 +67,14 @@ OC.L10N.register( "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." : "已停用 OPcache。要得到更好的效能,建議在您的 PHP 設定中套用 <code>opcache.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 被設定為移除程式碼註釋。啟用 OPcache 後,必須設定 <code>opcache.save_comments=1</code> 才能讓 Nextcloud 正常運作。", + "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。啟用 OPcache 後,強烈建議使用 <code>opcache.restrict_api</code> 包含所有 Nextcloud 目錄,或是關閉此設定以停用 OPcache API 限制,以避免在 Nextcloud 核心或應用程式升級期間發生錯誤。", + "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。強烈建議使用 <code>opcache.restrict_api</code> 包含所有 Nextcloud 目錄,或是關閉此設定以停用 OPcache API 限制,以避免在 Nextcloud 核心或應用程式升級期間發生錯誤。", + "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 鍵的最大數量。為確保幾乎所有指令稿都可以保留在快取中,建議在您的 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 內部字串緩衝區幾乎快滿了。為確保可以有效快取重複字串,建議在您的 PHP 設定中的 <code>opcache.interned_strings_buffer</code> 套用高於 <code>%s</code> 的值。", "Invalid SMTP password." : "無效的 SMTP 密碼", "Email setting test" : "測試郵件設定", "Well done, %s!" : "太棒了,%s!", diff --git a/apps/settings/l10n/zh_TW.json b/apps/settings/l10n/zh_TW.json index cf9f3296c04..fb704815ff6 100644 --- a/apps/settings/l10n/zh_TW.json +++ b/apps/settings/l10n/zh_TW.json @@ -65,6 +65,14 @@ "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." : "已停用 OPcache。要得到更好的效能,建議在您的 PHP 設定中套用 <code>opcache.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 被設定為移除程式碼註釋。啟用 OPcache 後,必須設定 <code>opcache.save_comments=1</code> 才能讓 Nextcloud 正常運作。", + "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。啟用 OPcache 後,強烈建議使用 <code>opcache.restrict_api</code> 包含所有 Nextcloud 目錄,或是關閉此設定以停用 OPcache API 限制,以避免在 Nextcloud 核心或應用程式升級期間發生錯誤。", + "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。強烈建議使用 <code>opcache.restrict_api</code> 包含所有 Nextcloud 目錄,或是關閉此設定以停用 OPcache API 限制,以避免在 Nextcloud 核心或應用程式升級期間發生錯誤。", + "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 鍵的最大數量。為確保幾乎所有指令稿都可以保留在快取中,建議在您的 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 內部字串緩衝區幾乎快滿了。為確保可以有效快取重複字串,建議在您的 PHP 設定中的 <code>opcache.interned_strings_buffer</code> 套用高於 <code>%s</code> 的值。", "Invalid SMTP password." : "無效的 SMTP 密碼", "Email setting test" : "測試郵件設定", "Well done, %s!" : "太棒了,%s!", diff --git a/apps/settings/lib/Controller/CheckSetupController.php b/apps/settings/lib/Controller/CheckSetupController.php index 5225cd04f09..b9f176f97c5 100644 --- a/apps/settings/lib/Controller/CheckSetupController.php +++ b/apps/settings/lib/Controller/CheckSetupController.php @@ -474,7 +474,7 @@ Raw output protected function getOpcacheSetupRecommendations(): array { // If the module is not loaded, return directly to skip inapplicable checks if (!extension_loaded('Zend OPcache')) { - return ['The PHP OPcache module is not loaded. For better performance it is recommended to load it into your PHP installation.']; + return [$this->l10n->t('The PHP OPcache module is not loaded. For better performance it is recommended to load it into your PHP installation.')]; } $recommendations = []; @@ -487,18 +487,18 @@ Raw output } if (!$this->iniGetWrapper->getBool('opcache.enable')) { - $recommendations[] = 'OPcache is disabled. For better performance, it is recommended to apply <code>opcache.enable=1</code> to your PHP configuration.'; + $recommendations[] = $this->l10n->t('OPcache is disabled. For better performance, it is recommended to apply <code>opcache.enable=1</code> to your PHP configuration.'); // Check for saved comments only when OPcache is currently disabled. If it was enabled, opcache.save_comments=0 would break Nextcloud in the first place. if (!$this->iniGetWrapper->getBool('opcache.save_comments')) { - $recommendations[] = 'OPcache is configured to remove code comments. With OPcache enabled, <code>opcache.save_comments=1</code> must be set for Nextcloud to function.'; + $recommendations[] = $this->l10n->t('OPcache is configured to remove code comments. With OPcache enabled, <code>opcache.save_comments=1</code> must be set for Nextcloud to function.'); } if (!$isPermitted) { - $recommendations[] = '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.'; + $recommendations[] = $this->l10n->t('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.'); } } elseif (!$isPermitted) { - $recommendations[] = '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.'; + $recommendations[] = $this->l10n->t('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.'); } else { // Check whether opcache_get_status has been explicitly disabled an in case skip usage based checks $disabledFunctions = $this->iniGetWrapper->getString('disable_functions'); @@ -513,21 +513,21 @@ Raw output empty($status['opcache_statistics']['max_cached_keys']) || ($status['opcache_statistics']['num_cached_keys'] / $status['opcache_statistics']['max_cached_keys'] > 0.9) ) { - $recommendations[] = '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>' . ($this->iniGetWrapper->getNumeric('opcache.max_accelerated_files') ?: 'currently') . '</code>.'; + $recommendations[] = $this->l10n->t('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>.', [($this->iniGetWrapper->getNumeric('opcache.max_accelerated_files') ?: 'currently')]); } if ( empty($status['memory_usage']['free_memory']) || ($status['memory_usage']['used_memory'] / $status['memory_usage']['free_memory'] > 9) ) { - $recommendations[] = '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>' . ($this->iniGetWrapper->getNumeric('opcache.memory_consumption') ?: 'currently') . '</code>.'; + $recommendations[] = $this->l10n->t('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>.', [($this->iniGetWrapper->getNumeric('opcache.memory_consumption') ?: 'currently')]); } if ( empty($status['interned_strings_usage']['free_memory']) || ($status['interned_strings_usage']['used_memory'] / $status['interned_strings_usage']['free_memory'] > 9) ) { - $recommendations[] = '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>' . ($this->iniGetWrapper->getNumeric('opcache.interned_strings_buffer') ?: 'currently') . '</code>.'; + $recommendations[] = $this->l10n->t('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>.', [($this->iniGetWrapper->getNumeric('opcache.interned_strings_buffer') ?: 'currently')]); } } diff --git a/apps/settings/src/components/AuthTokenSetupDialogue.vue b/apps/settings/src/components/AuthTokenSetupDialogue.vue index a65da9552a3..6500f533881 100644 --- a/apps/settings/src/components/AuthTokenSetupDialogue.vue +++ b/apps/settings/src/components/AuthTokenSetupDialogue.vue @@ -23,6 +23,7 @@ <div v-if="!adding"> <input v-model="deviceName" type="text" + :maxlength="120" :disabled="loading" :placeholder="t('settings', 'App name')" @keydown.enter="submit"> diff --git a/apps/sharebymail/l10n/ru.js b/apps/sharebymail/l10n/ru.js index c95791325bd..f0c4d2a5fec 100644 --- a/apps/sharebymail/l10n/ru.js +++ b/apps/sharebymail/l10n/ru.js @@ -26,6 +26,8 @@ OC.L10N.register( "Password to access {file} was sent to you" : "Вам был отправлен пароль для доступа к «{file}»", "Share by mail" : "Поделиться по почте", "Sharing %1$s failed, because this item is already shared with user %2$s" : "Не удалось предоставить доступ к %1$s, так как этот ресурс уже доступен пользователю %2$s", + "We cannot send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Мы не можем отправить вам автоматически сгенерированный пароль. Укажите действующий адрес электронной почты в личных настройках и повторите попытку.", + "Failed to send share by email. Got an invalid email address" : "Не удалось отправить ссылку общего доступа по электронной почте. Получен неверный адрес электронной почты", "Failed to send share by email" : "Не удалось предоставить общий доступ по адресу электронной почты", "%1$s shared »%2$s« with you" : "%1$s предоставил(а) вам доступ к «%2$s»", "%1$s shared »%2$s« with you." : "%1$s предоставил(а) вам доступ к «%2$s».", diff --git a/apps/sharebymail/l10n/ru.json b/apps/sharebymail/l10n/ru.json index 6583128465b..eb3d33edc32 100644 --- a/apps/sharebymail/l10n/ru.json +++ b/apps/sharebymail/l10n/ru.json @@ -24,6 +24,8 @@ "Password to access {file} was sent to you" : "Вам был отправлен пароль для доступа к «{file}»", "Share by mail" : "Поделиться по почте", "Sharing %1$s failed, because this item is already shared with user %2$s" : "Не удалось предоставить доступ к %1$s, так как этот ресурс уже доступен пользователю %2$s", + "We cannot send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Мы не можем отправить вам автоматически сгенерированный пароль. Укажите действующий адрес электронной почты в личных настройках и повторите попытку.", + "Failed to send share by email. Got an invalid email address" : "Не удалось отправить ссылку общего доступа по электронной почте. Получен неверный адрес электронной почты", "Failed to send share by email" : "Не удалось предоставить общий доступ по адресу электронной почты", "%1$s shared »%2$s« with you" : "%1$s предоставил(а) вам доступ к «%2$s»", "%1$s shared »%2$s« with you." : "%1$s предоставил(а) вам доступ к «%2$s».", diff --git a/apps/user_ldap/l10n/zh_TW.js b/apps/user_ldap/l10n/zh_TW.js index 355278ff69c..3c1f9320b87 100644 --- a/apps/user_ldap/l10n/zh_TW.js +++ b/apps/user_ldap/l10n/zh_TW.js @@ -164,7 +164,7 @@ OC.L10N.register( "Paging chunksize" : "分頁區塊大小", "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "分頁 LDAP 搜尋使用的區塊大小可能會回傳大量結果,如使用者或群組列舉。(在這種情況下,將其設定為 0 將會停用分頁 LDAP 搜尋。)", "Enable LDAP password changes per user" : "啟用每個使用者的 LDAP 密碼", - "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "允許 LDAP 使用者變更他們的密碼,並允許超級管理員與群組管理員變更其 LDAP 使用者的密碼。僅當在 LDAP 伺服器上設定了對應的存取控制策略時,此選項才會有效。因為密碼以明文形式傳送到 LDAP 伺服器,因此必須使用傳輸加密,且必須在 LDAP 伺服氣上設定密碼雜湊。", + "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "允許 LDAP 使用者變更他們的密碼,並允許超級管理員與群組管理員變更其 LDAP 使用者的密碼。僅當在 LDAP 伺服器上設定了對應的存取控制策略時,此選項才會有效。因為密碼以明文形式傳送到 LDAP 伺服器,因此必須使用傳輸加密,且必須在 LDAP 伺服器上設定密碼雜湊。", "(New password is sent as plain text to LDAP)" : "(新密碼會以明文傳送給 LDAP)", "Default password policy DN" : "預設密碼策略 DN", "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "預設密碼策略的 DN,其將用於密碼過期處理。僅當啟用了每個使用者的 LDAP 密碼變更且 OpenLDAP 支援時才能正常運作。保留為空將停用密碼過期處理。", diff --git a/apps/user_ldap/l10n/zh_TW.json b/apps/user_ldap/l10n/zh_TW.json index dc0cacf3678..ec8e1840fc3 100644 --- a/apps/user_ldap/l10n/zh_TW.json +++ b/apps/user_ldap/l10n/zh_TW.json @@ -162,7 +162,7 @@ "Paging chunksize" : "分頁區塊大小", "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "分頁 LDAP 搜尋使用的區塊大小可能會回傳大量結果,如使用者或群組列舉。(在這種情況下,將其設定為 0 將會停用分頁 LDAP 搜尋。)", "Enable LDAP password changes per user" : "啟用每個使用者的 LDAP 密碼", - "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "允許 LDAP 使用者變更他們的密碼,並允許超級管理員與群組管理員變更其 LDAP 使用者的密碼。僅當在 LDAP 伺服器上設定了對應的存取控制策略時,此選項才會有效。因為密碼以明文形式傳送到 LDAP 伺服器,因此必須使用傳輸加密,且必須在 LDAP 伺服氣上設定密碼雜湊。", + "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "允許 LDAP 使用者變更他們的密碼,並允許超級管理員與群組管理員變更其 LDAP 使用者的密碼。僅當在 LDAP 伺服器上設定了對應的存取控制策略時,此選項才會有效。因為密碼以明文形式傳送到 LDAP 伺服器,因此必須使用傳輸加密,且必須在 LDAP 伺服器上設定密碼雜湊。", "(New password is sent as plain text to LDAP)" : "(新密碼會以明文傳送給 LDAP)", "Default password policy DN" : "預設密碼策略 DN", "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "預設密碼策略的 DN,其將用於密碼過期處理。僅當啟用了每個使用者的 LDAP 密碼變更且 OpenLDAP 支援時才能正常運作。保留為空將停用密碼過期處理。", diff --git a/apps/user_status/src/UserStatus.vue b/apps/user_status/src/UserStatus.vue index 997265a362b..8baf31de1b7 100644 --- a/apps/user_status/src/UserStatus.vue +++ b/apps/user_status/src/UserStatus.vue @@ -297,6 +297,9 @@ export default { &:focus { background-color: var(--color-background-hover); } + &:focus { + border: 2px solid var(--color-main-text)!important; + } } } } diff --git a/apps/weather_status/l10n/hu.js b/apps/weather_status/l10n/hu.js index c76096e4f96..bd551b2151d 100644 --- a/apps/weather_status/l10n/hu.js +++ b/apps/weather_status/l10n/hu.js @@ -11,6 +11,15 @@ OC.L10N.register( "Detect location" : "Helymeghatározás", "Set custom address" : "Egyéni cím beállítása", "Favorites" : "Kedvencek", + "{temperature} {unit} clear sky" : "{temperature} {unit} tiszta égbolt", + "{temperature} {unit} cloudy" : "{temperature} {unit} felhős", + "{temperature} {unit} partly cloudy" : "{temperature} {unit} részben felhős", + "{temperature} {unit} foggy" : "{temperature} {unit} ködös", + "{temperature} {unit} light rain" : "{temperature} {unit} gyenge eső", + "{temperature} {unit} rain" : "{temperature} {unit} eső", + "{temperature} {unit} rain showers" : "{temperature} {unit} záporok", + "{temperature} {unit} light rain showers" : "{temperature} {unit} enyhe záporok", + "{temperature} {unit} heavy rain showers" : "{temperature} {unit} erős záporok", "More weather for {adr}" : "További időjárás a {adr} címhez", "Loading weather" : "Időjárás betöltése", "Remove from favorites" : "Eltávolítás a kedvencekből", diff --git a/apps/weather_status/l10n/hu.json b/apps/weather_status/l10n/hu.json index c5a62ddedc4..1564b08b93f 100644 --- a/apps/weather_status/l10n/hu.json +++ b/apps/weather_status/l10n/hu.json @@ -9,6 +9,15 @@ "Detect location" : "Helymeghatározás", "Set custom address" : "Egyéni cím beállítása", "Favorites" : "Kedvencek", + "{temperature} {unit} clear sky" : "{temperature} {unit} tiszta égbolt", + "{temperature} {unit} cloudy" : "{temperature} {unit} felhős", + "{temperature} {unit} partly cloudy" : "{temperature} {unit} részben felhős", + "{temperature} {unit} foggy" : "{temperature} {unit} ködös", + "{temperature} {unit} light rain" : "{temperature} {unit} gyenge eső", + "{temperature} {unit} rain" : "{temperature} {unit} eső", + "{temperature} {unit} rain showers" : "{temperature} {unit} záporok", + "{temperature} {unit} light rain showers" : "{temperature} {unit} enyhe záporok", + "{temperature} {unit} heavy rain showers" : "{temperature} {unit} erős záporok", "More weather for {adr}" : "További időjárás a {adr} címhez", "Loading weather" : "Időjárás betöltése", "Remove from favorites" : "Eltávolítás a kedvencekből", diff --git a/core/Command/Db/AddMissingIndices.php b/core/Command/Db/AddMissingIndices.php index f1dba2f4c31..a4379ffacc3 100644 --- a/core/Command/Db/AddMissingIndices.php +++ b/core/Command/Db/AddMissingIndices.php @@ -258,11 +258,15 @@ class AddMissingIndices extends Command { $table = $schema->getTable('cards'); if ($table->hasIndex('addressbookid_uri_index')) { - $output->writeln('<info>Renaming addressbookid_uri_index index to to the cards table, this can take some time...</info>'); - - foreach ($table->getIndexes() as $index) { - if ($index->getColumns() === ['addressbookid', 'uri']) { - $table->renameIndex('addressbookid_uri_index', 'cards_abiduri'); + if ($table->hasIndex('cards_abiduri')) { + $table->dropIndex('addressbookid_uri_index'); + } else { + $output->writeln('<info>Renaming addressbookid_uri_index index to cards_abiduri in the cards table, this can take some time...</info>'); + + foreach ($table->getIndexes() as $index) { + if ($index->getColumns() === ['addressbookid', 'uri']) { + $table->renameIndex('addressbookid_uri_index', 'cards_abiduri'); + } } } diff --git a/core/l10n/fi.js b/core/l10n/fi.js index 84a06de64c5..ceeeaff66c7 100644 --- a/core/l10n/fi.js +++ b/core/l10n/fi.js @@ -147,6 +147,7 @@ OC.L10N.register( "Back" : "Takaisin", "Login form is disabled." : "Kirjautumislomake on poistettu käytöstä.", "Edit Profile" : "Muokkaa profiilia", + "You have not added any info yet" : "Et ole lisännyt tietoja vielä", "Reset search" : "Tyhjennä haku", "Search for {name} only" : "Etsi vain {name}", "No results for {query}" : "Ei tuloksia haulle {query}", @@ -281,6 +282,8 @@ OC.L10N.register( "You chose SQLite as database." : "Valitsit SQLiten tietokannaksi.", "SQLite should only be used for minimal and development instances. For production we recommend a different database backend." : "SQLite tulisi ottaa käyttöön vain minimaalisissa kehitysympäristöissä. Tuotantokäyttöön suosittelemme toista tietokantaratkaisua.", "If you use clients for file syncing, the use of SQLite is highly discouraged." : "Jos käytät asiakasohjelmia tiedostojen synkronointiin, SQLiten käyttöä ei suositella.", + "Install" : "Asenna", + "Installing …" : "Asennetaan …", "Need help?" : "Tarvitsetko apua?", "See the documentation" : "Tutustu ohjeisiin", "It looks like you are trying to reinstall your Nextcloud. However the file CAN_INSTALL is missing from your config directory. Please create the file CAN_INSTALL in your config folder to continue." : "Vaikuttaa siltä, että yrität Nextcloudin uudelleenasennusta. Tiedosto CAN_INSTALL puuttuu asetuskansiosta. Ole hyvä ja luo tiedosto CAN_INSTALL asetuskansioon jatkaaksesi.", diff --git a/core/l10n/fi.json b/core/l10n/fi.json index 0c79e519c3e..6c932d8aebe 100644 --- a/core/l10n/fi.json +++ b/core/l10n/fi.json @@ -145,6 +145,7 @@ "Back" : "Takaisin", "Login form is disabled." : "Kirjautumislomake on poistettu käytöstä.", "Edit Profile" : "Muokkaa profiilia", + "You have not added any info yet" : "Et ole lisännyt tietoja vielä", "Reset search" : "Tyhjennä haku", "Search for {name} only" : "Etsi vain {name}", "No results for {query}" : "Ei tuloksia haulle {query}", @@ -279,6 +280,8 @@ "You chose SQLite as database." : "Valitsit SQLiten tietokannaksi.", "SQLite should only be used for minimal and development instances. For production we recommend a different database backend." : "SQLite tulisi ottaa käyttöön vain minimaalisissa kehitysympäristöissä. Tuotantokäyttöön suosittelemme toista tietokantaratkaisua.", "If you use clients for file syncing, the use of SQLite is highly discouraged." : "Jos käytät asiakasohjelmia tiedostojen synkronointiin, SQLiten käyttöä ei suositella.", + "Install" : "Asenna", + "Installing …" : "Asennetaan …", "Need help?" : "Tarvitsetko apua?", "See the documentation" : "Tutustu ohjeisiin", "It looks like you are trying to reinstall your Nextcloud. However the file CAN_INSTALL is missing from your config directory. Please create the file CAN_INSTALL in your config folder to continue." : "Vaikuttaa siltä, että yrität Nextcloudin uudelleenasennusta. Tiedosto CAN_INSTALL puuttuu asetuskansiosta. Ole hyvä ja luo tiedosto CAN_INSTALL asetuskansioon jatkaaksesi.", diff --git a/dist/dashboard-main.js b/dist/dashboard-main.js index 70c80e99f66..4dc0d7d01a8 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={27465:function(n,e,a){var o=a(20144),r=a(16453),i=a(22200),s=a(47450),d=a.n(s),c=a(9980),l=a.n(c),A=a(4820),u=a(79753),p={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}}},b=function(t){return(0,u.generateFilePath)("dashboard","","img/")+t},g=function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";return"default"===t?e&&"backgroundColor"!==e?(0,u.generateUrl)("/apps/theming/image/background")+"?v="+window.OCA.Theming.cacheBuster:window.OCA.Accessibility&&"dark"===window.OCA.Accessibility.theme?b("eduardo-neves-pedra-azul.jpg"):b("kamil-porembinski-clouds.jpg"):"custom"===t?(0,u.generateUrl)("/apps/dashboard/background")+"?v="+n:b(t)};function C(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 h(t){return function(){var n=this,e=arguments;return new Promise((function(a,o){var r=t.apply(n,e);function i(t){C(r,a,o,i,s,"next",t)}function s(t){C(r,a,o,i,s,"throw",t)}i(void 0)}))}}var v=(0,r.loadState)("dashboard","shippedBackgrounds"),m={name:"BackgroundSettings",props:{background:{type:String,default:"default"},themingDefaultBackground:{type:String,default:""}},data:function(){return{backgroundImage:(0,u.generateUrl)("/apps/dashboard/background")+"?v="+Date.now(),loading:!1}},computed:{shippedBackgrounds:function(){return Object.keys(v).map((function(t){return{name:t,url:b(t),preview:b("previews/"+t),details:v[t]}}))}},methods:{update:function(t){var n=this;return h(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=g(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 h(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,A.default.post((0,u.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 h(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,A.default.post((0,u.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 h(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,A.default.post((0,u.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 h(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,A.default.post((0,u.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)}}},f=m,k=a(93379),x=a.n(k),w=a(7795),y=a.n(w),_=a(90569),S=a.n(_),B=a(3565),D=a.n(B),O=a(19216),E=a.n(O),F=a(44589),G=a.n(F),I=a(56510),T={};T.styleTagTransform=G(),T.setAttributes=D(),T.insert=S().bind(null,"head"),T.domAPI=y(),T.insertStyleElement=E(),x()(I.Z,T),I.Z&&I.Z.locals&&I.Z.locals;var j=a(51900),z=(0,j.Z)(f,(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,"e4c3a7ca",null).exports,R=(0,r.loadState)("dashboard","panels"),P=(0,r.loadState)("dashboard","firstRun"),U=(0,r.loadState)("dashboard","background"),L=(0,r.loadState)("dashboard","themingDefaultBackground"),N=(0,r.loadState)("dashboard","version"),W=(0,r.loadState)("dashboard","shippedBackgrounds"),M={weather:{text:t("dashboard","Weather"),icon:"icon-weather-status"},status:{text:t("dashboard","Status"),icon:"icon-user-status-online"}},q={name:"App",components:{Modal:d(),Draggable:l(),BackgroundSettings:z},mixins:[p],data:function(){var t,n;return{isAdmin:(0,i.getCurrentUser)().isAdmin,timer:new Date,registeredStatus:[],callbacks:{},callbacksStatus:{},allCallbacksStatus:{},statusInfo:M,enabledStatuses:(0,r.loadState)("dashboard","statuses"),panels:R,firstRun:P,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,r.loadState)("dashboard","layout").filter((function(t){return R[t]})),modal:!1,appStoreUrl:(0,u.generateUrl)("/settings/apps/dashboard"),statuses:{},background:U,themingDefaultBackground:L,version:N}},computed:{backgroundImage:function(){return g(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(){A.default.post((0,u.generateUrl)("/apps/dashboard/layout"),{layout:this.layout.join(",")})},saveStatuses:function(){A.default.post((0,u.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(){document.body.setAttribute("data-dashboard-background",this.background),window.OCA.Theming.inverted&&document.body.classList.add("dashboard--inverted"),"dark"===(W[this.background]?W[this.background].theming:"light")?document.body.classList.add("dashboard--dark"):document.body.classList.remove("dashboard--dark")},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")}}},Z=a(52734),H={};H.styleTagTransform=G(),H.setAttributes=D(),H.insert=S().bind(null,"head"),H.domAPI=y(),H.insertStyleElement=E(),x()(Z.Z,H),Z.Z&&Z.Z.locals&&Z.Z.locals;var Y=(0,j.Z)(q,(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",{class:t.panels[n].iconClass},[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("a",{staticClass:"edit-panels icon-rename",attrs:{tabindex:"0"},on:{click:t.showModal,keyup:[function(n){return!n.type.indexOf("key")&&t._k(n.keyCode,"enter",13,n.key,"Enter")?null:t.showModal.apply(null,arguments)},function(n){return!n.type.indexOf("key")&&t._k(n.keyCode,"space",32,n.key,[" ","Spacebar"])?null:t.showModal.apply(null,arguments)}]}},[t._v(t._s(t.t("dashboard","Customize")))])]),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},[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",{class:t.statusInfo[n].icon,attrs:{for:"status-checkbox-"+n}},[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},[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:t.isActive(n)?"draggable "+n.iconClass:n.iconClass,attrs:{for:"panel-checkbox-"+n.id}},[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,"3911b905",null),$=Y.exports,K=a(9944),Q=a(15168),J=a.n(Q);a.nc=btoa((0,i.getRequestToken)()),o.default.directive("Tooltip",J()),o.default.prototype.t=K.translate,window.OCA.Files||(window.OCA.Files={}),Object.assign(window.OCA.Files,{App:{fileList:{filesClient:OC.Files.getClient()}}},window.OCA.Files);var V=new(o.default.extend($))({}).$mount("#app-content-vue");window.OCA.Dashboard={register:function(t,n){return V.register(t,n)},registerStatus:function(t,n){return V.registerStatus(t,n)}}},52734: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-3911b905]{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(255, 255, 255, 0.8);--background-blur: blur(10px)}#body-user.theme--dark #app-dashboard[data-v-3911b905]{background-color:var(--color-main-background);--color-background-translucent: rgba(24, 24, 24, 0.8)}#body-user.theme--highcontrast #app-dashboard[data-v-3911b905]{background-color:var(--color-main-background);--color-background-translucent: var(--color-main-background)}#app-dashboard>h2[data-v-3911b905]{color:var(--color-primary-text);text-align:center;font-size:32px;line-height:130%;padding:10vh 16px 0px}.panels[data-v-3911b905]{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-3911b905],.panels>div[data-v-3911b905]{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-3911b905],#body-user.theme--highcontrast .panels>div[data-v-3911b905]{border:2px solid var(--color-border)}.panel.sortable-ghost[data-v-3911b905],.panels>div.sortable-ghost[data-v-3911b905]{opacity:.1}.panel>.panel--header[data-v-3911b905],.panels>div>.panel--header[data-v-3911b905]{display:flex;z-index:1;top:50px;padding:16px;cursor:grab}.panel>.panel--header[data-v-3911b905],.panel>.panel--header[data-v-3911b905] *,.panels>div>.panel--header[data-v-3911b905],.panels>div>.panel--header[data-v-3911b905] *{-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-3911b905]:active,.panels>div>.panel--header[data-v-3911b905]:active{cursor:grabbing}.panel>.panel--header a[data-v-3911b905],.panels>div>.panel--header a[data-v-3911b905]{flex-grow:1}.panel>.panel--header>h2[data-v-3911b905],.panels>div>.panel--header>h2[data-v-3911b905]{display:block;flex-grow:1;margin:0;font-size:20px;line-height:24px;font-weight:bold;background-size:32px;background-position:14px 12px;padding:16px 8px 16px 60px;height:56px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:grab}.panel>.panel--content[data-v-3911b905],.panels>div>.panel--content[data-v-3911b905]{margin:0 16px 16px 16px;height:420px;overflow:hidden}@media only screen and (max-width: 709px){.panel>.panel--content[data-v-3911b905],.panels>div>.panel--content[data-v-3911b905]{height:auto}}.footer[data-v-3911b905]{text-align:center;transition:bottom var(--animation-slow) ease-in-out;bottom:0;padding:44px 0}.edit-panels[data-v-3911b905]{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}.edit-panels[data-v-3911b905],.statuses[data-v-3911b905] .action-item .action-item__menutoggle,.statuses[data-v-3911b905] .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)}.edit-panels[data-v-3911b905]:hover,.edit-panels[data-v-3911b905]:focus,.edit-panels[data-v-3911b905]:active,.statuses[data-v-3911b905] .action-item .action-item__menutoggle:hover,.statuses[data-v-3911b905] .action-item .action-item__menutoggle:focus,.statuses[data-v-3911b905] .action-item .action-item__menutoggle:active,.statuses[data-v-3911b905] .action-item.action-item--open .action-item__menutoggle:hover,.statuses[data-v-3911b905] .action-item.action-item--open .action-item__menutoggle:focus,.statuses[data-v-3911b905] .action-item.action-item--open .action-item__menutoggle:active{background-color:var(--color-background-hover)}.modal__content[data-v-3911b905]{padding:32px 16px;text-align:center}.modal__content ol[data-v-3911b905]{display:flex;flex-direction:row;justify-content:center;list-style-type:none;padding-bottom:16px}.modal__content li label[data-v-3911b905]{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);background-size:24px;background-position:16px 16px;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.modal__content li label[data-v-3911b905]:hover{border-color:var(--color-primary)}.modal__content li input[type=checkbox].checkbox+label[data-v-3911b905]:before{position:absolute;right:12px;top:16px}.modal__content li input:focus+label[data-v-3911b905]{border-color:var(--color-primary)}.modal__content h3[data-v-3911b905]{font-weight:bold}.modal__content h3[data-v-3911b905]:not(:first-of-type){margin-top:64px}.modal__content .button[data-v-3911b905]{display:inline-block;padding:10px 16px;margin:0}.modal__content p[data-v-3911b905]{max-width:650px;margin:0 auto}.modal__content p a[data-v-3911b905]:hover,.modal__content p a[data-v-3911b905]:focus{border-bottom:2px solid var(--color-border)}.modal__content .credits--end[data-v-3911b905]{padding-bottom:32px;color:var(--color-text-maxcontrast)}.modal__content .credits--end a[data-v-3911b905]{color:var(--color-text-maxcontrast)}.flip-list-move[data-v-3911b905]{transition:transform var(--animation-slow)}.statuses[data-v-3911b905]{display:flex;flex-direction:row;justify-content:center;flex-wrap:wrap;margin-bottom:36px}.statuses>div[data-v-3911b905]{margin:8px}","",{version:3,sources:["webpack://./apps/dashboard/src/App.vue"],names:[],mappings:"AAqZA,gCACC,UAAA,CACA,gBAAA,CACA,qBAAA,CACA,iCAAA,CACA,2BAAA,CACA,2BAAA,CACA,qCAAA,CACA,wDAAA,CACA,6BAAA,CAEA,uDACC,6CAAA,CACA,qDAAA,CAGD,+DACC,6CAAA,CACA,4DAAA,CAGD,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,WAAA,CACA,QAAA,CACA,cAAA,CACA,gBAAA,CACA,gBAAA,CACA,oBAAA,CACA,6BAAA,CACA,0BAAA,CACA,WAAA,CACA,kBAAA,CACA,eAAA,CACA,sBAAA,CACA,WAAA,CAIF,qFACC,uBAAA,CACA,YAAA,CAEA,eAAA,CAID,0CACC,qFACC,WAAA,CAAA,CAKH,yBACC,iBAAA,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,oLAGC,oDAAA,CACA,8CAAA,CACA,sCAAA,CAEA,qlBAGC,8CAAA,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,oBAAA,CACA,6BAAA,CACA,eAAA,CACA,eAAA,CACA,sBAAA,CACA,kBAAA,CAEA,gDACC,iCAAA,CAIF,+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#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(255, 255, 255, 0.8);\n\t--background-blur: blur(10px);\n\n\t#body-user.theme--dark & {\n\t\tbackground-color: var(--color-main-background);\n\t\t--color-background-translucent: rgba(24, 24, 24, 0.8);\n\t}\n\n\t#body-user.theme--highcontrast & {\n\t\tbackground-color: var(--color-main-background);\n\t\t--color-background-translucent: var(--color-main-background);\n\t}\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\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\tbackground-size: 32px;\n\t\t\tbackground-position: 14px 12px;\n\t\t\tpadding: 16px 8px 16px 60px;\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}\n\t}\n\n\t& > .panel--content {\n\t\tmargin: 0 16px 16px 16px;\n\t\theight: 420px;\n\t\t// We specifically do not want scrollbars inside widgets\n\t\toverflow: hidden;\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\ttext-align: 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.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\n\t&:hover,\n\t&:focus,\n\t&:active {\n\t\tbackground-color: var(--color-background-hover);\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\tbackground-size: 24px;\n\t\t\tbackground-position: 16px 16px;\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\t&:hover {\n\t\t\t\tborder-color: var(--color-primary);\n\t\t\t}\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},56510: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-e4c3a7ca]{display:flex;flex-wrap:wrap;justify-content:center}.background-selector .background[data-v-e4c3a7ca]{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-e4c3a7ca]{background-image:var(--color-background-dark)}.background-selector .background.filepicker[data-v-e4c3a7ca],.background-selector .background.default[data-v-e4c3a7ca],.background-selector .background.color[data-v-e4c3a7ca]{border-color:var(--color-border)}.background-selector .background.color[data-v-e4c3a7ca]{background-color:var(--color-primary);color:var(--color-primary-text)}.background-selector .background.active[data-v-e4c3a7ca],.background-selector .background[data-v-e4c3a7ca]:hover,.background-selector .background[data-v-e4c3a7ca]:focus{border:2px solid var(--color-primary)}.background-selector .background.active[data-v-e4c3a7ca]:not(.icon-loading):after{background-image:var(--icon-checkmark-fff);background-repeat:no-repeat;background-position:center;background-size:44px;content:"";display:block;height:100%}body.theme--dark .background-selector .background.active[data-v-e4c3a7ca]:not(.icon-loading):after{background-image:var(--icon-checkmark-000)}',"",{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,0CAAA,CACA,2BAAA,CACA,0BAAA,CACA,oBAAA,CACA,UAAA,CACA,aAAA,CACA,WAAA,CAEA,mGACC,0CAAA",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-fff);\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\n\t\t\tbody.theme--dark & {\n\t\t\t\tbackground-image: var(--icon-checkmark-000);\n\t\t\t}\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(l=0;l<n.length;l++){e=n[l][0],a=n[l][1],r=n[l][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(l--,1);var c=a();void 0!==c&&(t=c)}}return t}r=r||0;for(var l=n.length;l>0&&n[l-1][2]>r;l--)n[l]=n[l-1];n[l]=[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],c=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 l=d(o)}for(n&&n(e);c<i.length;c++)r=i[c],o.o(t,r)&&t[r]&&t[r][0](),t[r]=0;return o.O(l)},e=self.webpackChunknextcloud=self.webpackChunknextcloud||[];e.forEach(n.bind(null,0)),e.push=n.bind(null,e.push.bind(e))}();var r=o.O(void 0,[7874],(function(){return o(27465)}));r=o.O(r)}(); -//# sourceMappingURL=dashboard-main.js.map?v=536eb01ac2d8043861ca
\ No newline at end of file +!function(){"use strict";var n,e={30320:function(n,e,a){var o=a(20144),r=a(16453),i=a(22200),s=a(47450),d=a.n(s),c=a(9980),l=a.n(c),A=a(4820),u=a(79753),p={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}}},g=function(t){return(0,u.generateFilePath)("dashboard","","img/")+t},b=function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";return"default"===t?e&&"backgroundColor"!==e?(0,u.generateUrl)("/apps/theming/image/background")+"?v="+window.OCA.Theming.cacheBuster:window.OCA.Accessibility&&"dark"===window.OCA.Accessibility.theme?g("eduardo-neves-pedra-azul.jpg"):g("kamil-porembinski-clouds.jpg"):"custom"===t?(0,u.generateUrl)("/apps/dashboard/background")+"?v="+n:g(t)};function C(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 h(t){return function(){var n=this,e=arguments;return new Promise((function(a,o){var r=t.apply(n,e);function i(t){C(r,a,o,i,s,"next",t)}function s(t){C(r,a,o,i,s,"throw",t)}i(void 0)}))}}var f=(0,r.loadState)("dashboard","shippedBackgrounds"),v={name:"BackgroundSettings",props:{background:{type:String,default:"default"},themingDefaultBackground:{type:String,default:""}},data:function(){return{backgroundImage:(0,u.generateUrl)("/apps/dashboard/background")+"?v="+Date.now(),loading:!1}},computed:{shippedBackgrounds:function(){return Object.keys(f).map((function(t){return{name:t,url:g(t),preview:g("previews/"+t),details:f[t]}}))}},methods:{update:function(t){var n=this;return h(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=b(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 h(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,A.default.post((0,u.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 h(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,A.default.post((0,u.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 h(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,A.default.post((0,u.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 h(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,A.default.post((0,u.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)}}},m=v,k=a(93379),x=a.n(k),y=a(7795),w=a.n(y),_=a(90569),S=a.n(_),B=a(3565),D=a.n(B),O=a(19216),E=a.n(O),F=a(44589),G=a.n(F),I=a(56510),T={};T.styleTagTransform=G(),T.setAttributes=D(),T.insert=S().bind(null,"head"),T.domAPI=w(),T.insertStyleElement=E(),x()(I.Z,T),I.Z&&I.Z.locals&&I.Z.locals;var j=a(51900),z=(0,j.Z)(m,(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,"e4c3a7ca",null).exports,R=(0,r.loadState)("dashboard","panels"),P=(0,r.loadState)("dashboard","firstRun"),U=(0,r.loadState)("dashboard","background"),L=(0,r.loadState)("dashboard","themingDefaultBackground"),N=(0,r.loadState)("dashboard","version"),W=(0,r.loadState)("dashboard","shippedBackgrounds"),M={weather:{text:t("dashboard","Weather"),icon:"icon-weather-status"},status:{text:t("dashboard","Status"),icon:"icon-user-status-online"}},q={name:"App",components:{Modal:d(),Draggable:l(),BackgroundSettings:z},mixins:[p],data:function(){var t,n;return{isAdmin:(0,i.getCurrentUser)().isAdmin,timer:new Date,registeredStatus:[],callbacks:{},callbacksStatus:{},allCallbacksStatus:{},statusInfo:M,enabledStatuses:(0,r.loadState)("dashboard","statuses"),panels:R,firstRun:P,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,r.loadState)("dashboard","layout").filter((function(t){return R[t]})),modal:!1,appStoreUrl:(0,u.generateUrl)("/settings/apps/dashboard"),statuses:{},background:U,themingDefaultBackground:L,version:N}},computed:{backgroundImage:function(){return b(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(){A.default.post((0,u.generateUrl)("/apps/dashboard/layout"),{layout:this.layout.join(",")})},saveStatuses:function(){A.default.post((0,u.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(){document.body.setAttribute("data-dashboard-background",this.background),window.OCA.Theming.inverted&&document.body.classList.add("dashboard--inverted"),"dark"===(W[this.background]?W[this.background].theming:"light")?document.body.classList.add("dashboard--dark"):document.body.classList.remove("dashboard--dark")},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")}}},Z=a(44326),H={};H.styleTagTransform=G(),H.setAttributes=D(),H.insert=S().bind(null,"head"),H.domAPI=w(),H.insertStyleElement=E(),x()(Z.Z,H),Z.Z&&Z.Z.locals&&Z.Z.locals;var Y=(0,j.Z)(q,(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",{class:t.panels[n].iconClass},[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("a",{staticClass:"edit-panels icon-rename",attrs:{tabindex:"0"},on:{click:t.showModal,keyup:[function(n){return!n.type.indexOf("key")&&t._k(n.keyCode,"enter",13,n.key,"Enter")?null:t.showModal.apply(null,arguments)},function(n){return!n.type.indexOf("key")&&t._k(n.keyCode,"space",32,n.key,[" ","Spacebar"])?null:t.showModal.apply(null,arguments)}]}},[t._v(t._s(t.t("dashboard","Customize")))])]),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},[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",{class:t.statusInfo[n].icon,attrs:{for:"status-checkbox-"+n}},[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},[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:t.isActive(n)?"draggable "+n.iconClass:n.iconClass,attrs:{for:"panel-checkbox-"+n.id}},[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,"af526754",null),$=Y.exports,K=a(9944),Q=a(15168),J=a.n(Q);a.nc=btoa((0,i.getRequestToken)()),o.default.directive("Tooltip",J()),o.default.prototype.t=K.translate,window.OCA.Files||(window.OCA.Files={}),Object.assign(window.OCA.Files,{App:{fileList:{filesClient:OC.Files.getClient()}}},window.OCA.Files);var V=new(o.default.extend($))({}).$mount("#app-content-vue");window.OCA.Dashboard={register:function(t,n){return V.register(t,n)},registerStatus:function(t,n){return V.registerStatus(t,n)}}},44326: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-af526754]{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(255, 255, 255, 0.8);--background-blur: blur(10px)}#body-user.theme--dark #app-dashboard[data-v-af526754]{background-color:var(--color-main-background);--color-background-translucent: rgba(24, 24, 24, 0.8)}#body-user.theme--highcontrast #app-dashboard[data-v-af526754]{background-color:var(--color-main-background);--color-background-translucent: var(--color-main-background)}#app-dashboard>h2[data-v-af526754]{color:var(--color-primary-text);text-align:center;font-size:32px;line-height:130%;padding:10vh 16px 0px}.panels[data-v-af526754]{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-af526754],.panels>div[data-v-af526754]{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-af526754],#body-user.theme--highcontrast .panels>div[data-v-af526754]{border:2px solid var(--color-border)}.panel.sortable-ghost[data-v-af526754],.panels>div.sortable-ghost[data-v-af526754]{opacity:.1}.panel>.panel--header[data-v-af526754],.panels>div>.panel--header[data-v-af526754]{display:flex;z-index:1;top:50px;padding:16px;cursor:grab}.panel>.panel--header[data-v-af526754],.panel>.panel--header[data-v-af526754] *,.panels>div>.panel--header[data-v-af526754],.panels>div>.panel--header[data-v-af526754] *{-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-af526754]:active,.panels>div>.panel--header[data-v-af526754]:active{cursor:grabbing}.panel>.panel--header a[data-v-af526754],.panels>div>.panel--header a[data-v-af526754]{flex-grow:1}.panel>.panel--header>h2[data-v-af526754],.panels>div>.panel--header>h2[data-v-af526754]{display:block;flex-grow:1;margin:0;font-size:20px;line-height:24px;font-weight:bold;background-size:32px;background-position:14px 12px;padding:16px 8px 16px 60px;height:56px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:grab}.panel>.panel--content[data-v-af526754],.panels>div>.panel--content[data-v-af526754]{margin:0 16px 16px 16px;height:420px;overflow:hidden}@media only screen and (max-width: 709px){.panel>.panel--content[data-v-af526754],.panels>div>.panel--content[data-v-af526754]{height:auto}}.footer[data-v-af526754]{text-align:center;transition:bottom var(--animation-slow) ease-in-out;bottom:0;padding:44px 0}.edit-panels[data-v-af526754]{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}.edit-panels[data-v-af526754],.statuses[data-v-af526754] .action-item .action-item__menutoggle,.statuses[data-v-af526754] .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}.edit-panels[data-v-af526754]:hover,.edit-panels[data-v-af526754]:focus,.edit-panels[data-v-af526754]:active,.statuses[data-v-af526754] .action-item .action-item__menutoggle:hover,.statuses[data-v-af526754] .action-item .action-item__menutoggle:focus,.statuses[data-v-af526754] .action-item .action-item__menutoggle:active,.statuses[data-v-af526754] .action-item.action-item--open .action-item__menutoggle:hover,.statuses[data-v-af526754] .action-item.action-item--open .action-item__menutoggle:focus,.statuses[data-v-af526754] .action-item.action-item--open .action-item__menutoggle:active{background-color:var(--color-background-hover) !important}.edit-panels[data-v-af526754]:focus-visible,.statuses[data-v-af526754] .action-item .action-item__menutoggle:focus-visible,.statuses[data-v-af526754] .action-item.action-item--open .action-item__menutoggle:focus-visible{border:2px solid var(--color-main-text) !important}.modal__content[data-v-af526754]{padding:32px 16px;text-align:center}.modal__content ol[data-v-af526754]{display:flex;flex-direction:row;justify-content:center;list-style-type:none;padding-bottom:16px}.modal__content li label[data-v-af526754]{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);background-size:24px;background-position:16px 16px;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.modal__content li label[data-v-af526754]:hover{border-color:var(--color-primary)}.modal__content li input[type=checkbox].checkbox+label[data-v-af526754]:before{position:absolute;right:12px;top:16px}.modal__content li input:focus+label[data-v-af526754]{border-color:var(--color-primary)}.modal__content h3[data-v-af526754]{font-weight:bold}.modal__content h3[data-v-af526754]:not(:first-of-type){margin-top:64px}.modal__content .button[data-v-af526754]{display:inline-block;padding:10px 16px;margin:0}.modal__content p[data-v-af526754]{max-width:650px;margin:0 auto}.modal__content p a[data-v-af526754]:hover,.modal__content p a[data-v-af526754]:focus{border-bottom:2px solid var(--color-border)}.modal__content .credits--end[data-v-af526754]{padding-bottom:32px;color:var(--color-text-maxcontrast)}.modal__content .credits--end a[data-v-af526754]{color:var(--color-text-maxcontrast)}.flip-list-move[data-v-af526754]{transition:transform var(--animation-slow)}.statuses[data-v-af526754]{display:flex;flex-direction:row;justify-content:center;flex-wrap:wrap;margin-bottom:36px}.statuses>div[data-v-af526754]{margin:8px}","",{version:3,sources:["webpack://./apps/dashboard/src/App.vue"],names:[],mappings:"AAqZA,gCACC,UAAA,CACA,gBAAA,CACA,qBAAA,CACA,iCAAA,CACA,2BAAA,CACA,2BAAA,CACA,qCAAA,CACA,wDAAA,CACA,6BAAA,CAEA,uDACC,6CAAA,CACA,qDAAA,CAGD,+DACC,6CAAA,CACA,4DAAA,CAGD,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,WAAA,CACA,QAAA,CACA,cAAA,CACA,gBAAA,CACA,gBAAA,CACA,oBAAA,CACA,6BAAA,CACA,0BAAA,CACA,WAAA,CACA,kBAAA,CACA,eAAA,CACA,sBAAA,CACA,WAAA,CAIF,qFACC,uBAAA,CACA,YAAA,CAEA,eAAA,CAID,0CACC,qFACC,WAAA,CAAA,CAKH,yBACC,iBAAA,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,oLAGC,oDAAA,CACA,8CAAA,CACA,sCAAA,CACA,oBAAA,CAEA,qlBAGC,yDAAA,CAED,8NACC,kDAAA,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,oBAAA,CACA,6BAAA,CACA,eAAA,CACA,eAAA,CACA,sBAAA,CACA,kBAAA,CAEA,gDACC,iCAAA,CAIF,+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#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(255, 255, 255, 0.8);\n\t--background-blur: blur(10px);\n\n\t#body-user.theme--dark & {\n\t\tbackground-color: var(--color-main-background);\n\t\t--color-background-translucent: rgba(24, 24, 24, 0.8);\n\t}\n\n\t#body-user.theme--highcontrast & {\n\t\tbackground-color: var(--color-main-background);\n\t\t--color-background-translucent: var(--color-main-background);\n\t}\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\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\tbackground-size: 32px;\n\t\t\tbackground-position: 14px 12px;\n\t\t\tpadding: 16px 8px 16px 60px;\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}\n\t}\n\n\t& > .panel--content {\n\t\tmargin: 0 16px 16px 16px;\n\t\theight: 420px;\n\t\t// We specifically do not want scrollbars inside widgets\n\t\toverflow: hidden;\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\ttext-align: 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.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\tborder: 2px solid 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\tbackground-size: 24px;\n\t\t\tbackground-position: 16px 16px;\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\t&:hover {\n\t\t\t\tborder-color: var(--color-primary);\n\t\t\t}\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},56510: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-e4c3a7ca]{display:flex;flex-wrap:wrap;justify-content:center}.background-selector .background[data-v-e4c3a7ca]{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-e4c3a7ca]{background-image:var(--color-background-dark)}.background-selector .background.filepicker[data-v-e4c3a7ca],.background-selector .background.default[data-v-e4c3a7ca],.background-selector .background.color[data-v-e4c3a7ca]{border-color:var(--color-border)}.background-selector .background.color[data-v-e4c3a7ca]{background-color:var(--color-primary);color:var(--color-primary-text)}.background-selector .background.active[data-v-e4c3a7ca],.background-selector .background[data-v-e4c3a7ca]:hover,.background-selector .background[data-v-e4c3a7ca]:focus{border:2px solid var(--color-primary)}.background-selector .background.active[data-v-e4c3a7ca]:not(.icon-loading):after{background-image:var(--icon-checkmark-fff);background-repeat:no-repeat;background-position:center;background-size:44px;content:"";display:block;height:100%}body.theme--dark .background-selector .background.active[data-v-e4c3a7ca]:not(.icon-loading):after{background-image:var(--icon-checkmark-000)}',"",{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,0CAAA,CACA,2BAAA,CACA,0BAAA,CACA,oBAAA,CACA,UAAA,CACA,aAAA,CACA,WAAA,CAEA,mGACC,0CAAA",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-fff);\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\n\t\t\tbody.theme--dark & {\n\t\t\t\tbackground-image: var(--icon-checkmark-000);\n\t\t\t}\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(l=0;l<n.length;l++){e=n[l][0],a=n[l][1],r=n[l][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(l--,1);var c=a();void 0!==c&&(t=c)}}return t}r=r||0;for(var l=n.length;l>0&&n[l-1][2]>r;l--)n[l]=n[l-1];n[l]=[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],c=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 l=d(o)}for(n&&n(e);c<i.length;c++)r=i[c],o.o(t,r)&&t[r]&&t[r][0](),t[r]=0;return o.O(l)},e=self.webpackChunknextcloud=self.webpackChunknextcloud||[];e.forEach(n.bind(null,0)),e.push=n.bind(null,e.push.bind(e))}();var r=o.O(void 0,[7874],(function(){return o(30320)}));r=o.O(r)}(); +//# sourceMappingURL=dashboard-main.js.map?v=8ffb30e23fd986745925
\ No newline at end of file diff --git a/dist/dashboard-main.js.map b/dist/dashboard-main.js.map index 2250fb71b8b..b5f0b913fe6 100644 --- a/dist/dashboard-main.js.map +++ b/dist/dashboard-main.js.map @@ -1 +1 @@ -{"version":3,"file":"dashboard-main.js?v=536eb01ac2d8043861ca","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?8d16","webpack://nextcloud/./apps/dashboard/src/components/BackgroundSettings.vue?20a7","webpack:///nextcloud/apps/dashboard/src/components/BackgroundSettings.vue?vue&type=template&id=e4c3a7ca&scoped=true&","webpack:///nextcloud/apps/dashboard/src/App.vue","webpack:///nextcloud/apps/dashboard/src/App.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/dashboard/src/App.vue?2167","webpack://nextcloud/./apps/dashboard/src/App.vue?d9a5","webpack:///nextcloud/apps/dashboard/src/App.vue?vue&type=template&id=3911b905&scoped=true&","webpack:///nextcloud/apps/dashboard/src/main.js","webpack:///nextcloud/apps/dashboard/src/App.vue?vue&type=style&index=0&id=3911b905&lang=scss&scoped=true&","webpack:///nextcloud/apps/dashboard/src/components/BackgroundSettings.vue?vue&type=style&index=0&id=e4c3a7ca&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/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\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\t\tif (window.OCA.Accessibility && window.OCA.Accessibility.theme === 'dark') {\n\t\t\treturn prefixWithBaseUrl('eduardo-neves-pedra-azul.jpg')\n\t\t}\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\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-fff);\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\n\t\t\tbody.theme--dark & {\n\t\t\t\tbackground-image: var(--icon-checkmark-000);\n\t\t\t}\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=e4c3a7ca&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=e4c3a7ca&scoped=true&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./BackgroundSettings.vue?vue&type=template&id=e4c3a7ca&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=e4c3a7ca&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 \"e4c3a7ca\",\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 :class=\"panels[panelId].iconClass\">\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<a class=\"edit-panels icon-rename\"\n\t\t\t\ttabindex=\"0\"\n\t\t\t\t@click=\"showModal\"\n\t\t\t\t@keyup.enter=\"showModal\"\n\t\t\t\t@keyup.space=\"showModal\">{{ t('dashboard', 'Customize') }}</a>\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\">\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\" :class=\"statusInfo[status].icon\">\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\">\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=\"isActive(panel) ? 'draggable ' + panel.iconClass : panel.iconClass\">\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 Vue from 'vue'\nimport { loadState } from '@nextcloud/initial-state'\nimport { getCurrentUser } from '@nextcloud/auth'\nimport Modal from '@nextcloud/vue/dist/Components/Modal'\nimport Draggable from 'vuedraggable'\nimport axios from '@nextcloud/axios'\nimport { generateUrl } from '@nextcloud/router'\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')\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: 'App',\n\tcomponents: {\n\t\tModal,\n\t\tDraggable,\n\t\tBackgroundSettings,\n\t},\n\tmixins: [\n\t\tisMobile,\n\t],\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\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\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\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\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\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\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\tdocument.body.setAttribute('data-dashboard-background', this.background)\n\t\t\tif (window.OCA.Theming.inverted) {\n\t\t\t\tdocument.body.classList.add('dashboard--inverted')\n\t\t\t}\n\n\t\t\tconst shippedBackgroundTheme = shippedBackgroundList[this.background] ? shippedBackgroundList[this.background].theming : 'light'\n\t\t\tif (shippedBackgroundTheme === 'dark') {\n\t\t\t\tdocument.body.classList.add('dashboard--dark')\n\t\t\t} else {\n\t\t\t\tdocument.body.classList.remove('dashboard--dark')\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(255, 255, 255, 0.8);\n\t--background-blur: blur(10px);\n\n\t#body-user.theme--dark & {\n\t\tbackground-color: var(--color-main-background);\n\t\t--color-background-translucent: rgba(24, 24, 24, 0.8);\n\t}\n\n\t#body-user.theme--highcontrast & {\n\t\tbackground-color: var(--color-main-background);\n\t\t--color-background-translucent: var(--color-main-background);\n\t}\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\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\tbackground-size: 32px;\n\t\t\tbackground-position: 14px 12px;\n\t\t\tpadding: 16px 8px 16px 60px;\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}\n\t}\n\n\t& > .panel--content {\n\t\tmargin: 0 16px 16px 16px;\n\t\theight: 420px;\n\t\t// We specifically do not want scrollbars inside widgets\n\t\toverflow: hidden;\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\ttext-align: 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.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\n\t&:hover,\n\t&:focus,\n\t&:active {\n\t\tbackground-color: var(--color-background-hover);\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\tbackground-size: 24px;\n\t\t\tbackground-position: 16px 16px;\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\t&:hover {\n\t\t\t\tborder-color: var(--color-primary);\n\t\t\t}\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!./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 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!./App.vue?vue&type=style&index=0&id=3911b905&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!./App.vue?vue&type=style&index=0&id=3911b905&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=3911b905&scoped=true&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&id=3911b905&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 \"3911b905\",\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',{class:_vm.panels[panelId].iconClass},[_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('a',{staticClass:\"edit-panels icon-rename\",attrs:{\"tabindex\":\"0\"},on:{\"click\":_vm.showModal,\"keyup\":[function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.showModal.apply(null, arguments)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"space\",32,$event.key,[\" \",\"Spacebar\"])){ return null; }return _vm.showModal.apply(null, arguments)}]}},[_vm._v(_vm._s(_vm.t('dashboard', 'Customize')))])]),_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},[_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',{class:_vm.statusInfo[status].icon,attrs:{\"for\":'status-checkbox-' + status}},[_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},[_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:_vm.isActive(panel) ? 'draggable ' + panel.iconClass : panel.iconClass,attrs:{\"for\":'panel-checkbox-' + panel.id}},[_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 App from './App.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(App)\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-3911b905]{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(255, 255, 255, 0.8);--background-blur: blur(10px)}#body-user.theme--dark #app-dashboard[data-v-3911b905]{background-color:var(--color-main-background);--color-background-translucent: rgba(24, 24, 24, 0.8)}#body-user.theme--highcontrast #app-dashboard[data-v-3911b905]{background-color:var(--color-main-background);--color-background-translucent: var(--color-main-background)}#app-dashboard>h2[data-v-3911b905]{color:var(--color-primary-text);text-align:center;font-size:32px;line-height:130%;padding:10vh 16px 0px}.panels[data-v-3911b905]{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-3911b905],.panels>div[data-v-3911b905]{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-3911b905],#body-user.theme--highcontrast .panels>div[data-v-3911b905]{border:2px solid var(--color-border)}.panel.sortable-ghost[data-v-3911b905],.panels>div.sortable-ghost[data-v-3911b905]{opacity:.1}.panel>.panel--header[data-v-3911b905],.panels>div>.panel--header[data-v-3911b905]{display:flex;z-index:1;top:50px;padding:16px;cursor:grab}.panel>.panel--header[data-v-3911b905],.panel>.panel--header[data-v-3911b905] *,.panels>div>.panel--header[data-v-3911b905],.panels>div>.panel--header[data-v-3911b905] *{-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-3911b905]:active,.panels>div>.panel--header[data-v-3911b905]:active{cursor:grabbing}.panel>.panel--header a[data-v-3911b905],.panels>div>.panel--header a[data-v-3911b905]{flex-grow:1}.panel>.panel--header>h2[data-v-3911b905],.panels>div>.panel--header>h2[data-v-3911b905]{display:block;flex-grow:1;margin:0;font-size:20px;line-height:24px;font-weight:bold;background-size:32px;background-position:14px 12px;padding:16px 8px 16px 60px;height:56px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:grab}.panel>.panel--content[data-v-3911b905],.panels>div>.panel--content[data-v-3911b905]{margin:0 16px 16px 16px;height:420px;overflow:hidden}@media only screen and (max-width: 709px){.panel>.panel--content[data-v-3911b905],.panels>div>.panel--content[data-v-3911b905]{height:auto}}.footer[data-v-3911b905]{text-align:center;transition:bottom var(--animation-slow) ease-in-out;bottom:0;padding:44px 0}.edit-panels[data-v-3911b905]{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}.edit-panels[data-v-3911b905],.statuses[data-v-3911b905] .action-item .action-item__menutoggle,.statuses[data-v-3911b905] .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)}.edit-panels[data-v-3911b905]:hover,.edit-panels[data-v-3911b905]:focus,.edit-panels[data-v-3911b905]:active,.statuses[data-v-3911b905] .action-item .action-item__menutoggle:hover,.statuses[data-v-3911b905] .action-item .action-item__menutoggle:focus,.statuses[data-v-3911b905] .action-item .action-item__menutoggle:active,.statuses[data-v-3911b905] .action-item.action-item--open .action-item__menutoggle:hover,.statuses[data-v-3911b905] .action-item.action-item--open .action-item__menutoggle:focus,.statuses[data-v-3911b905] .action-item.action-item--open .action-item__menutoggle:active{background-color:var(--color-background-hover)}.modal__content[data-v-3911b905]{padding:32px 16px;text-align:center}.modal__content ol[data-v-3911b905]{display:flex;flex-direction:row;justify-content:center;list-style-type:none;padding-bottom:16px}.modal__content li label[data-v-3911b905]{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);background-size:24px;background-position:16px 16px;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.modal__content li label[data-v-3911b905]:hover{border-color:var(--color-primary)}.modal__content li input[type=checkbox].checkbox+label[data-v-3911b905]:before{position:absolute;right:12px;top:16px}.modal__content li input:focus+label[data-v-3911b905]{border-color:var(--color-primary)}.modal__content h3[data-v-3911b905]{font-weight:bold}.modal__content h3[data-v-3911b905]:not(:first-of-type){margin-top:64px}.modal__content .button[data-v-3911b905]{display:inline-block;padding:10px 16px;margin:0}.modal__content p[data-v-3911b905]{max-width:650px;margin:0 auto}.modal__content p a[data-v-3911b905]:hover,.modal__content p a[data-v-3911b905]:focus{border-bottom:2px solid var(--color-border)}.modal__content .credits--end[data-v-3911b905]{padding-bottom:32px;color:var(--color-text-maxcontrast)}.modal__content .credits--end a[data-v-3911b905]{color:var(--color-text-maxcontrast)}.flip-list-move[data-v-3911b905]{transition:transform var(--animation-slow)}.statuses[data-v-3911b905]{display:flex;flex-direction:row;justify-content:center;flex-wrap:wrap;margin-bottom:36px}.statuses>div[data-v-3911b905]{margin:8px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/dashboard/src/App.vue\"],\"names\":[],\"mappings\":\"AAqZA,gCACC,UAAA,CACA,gBAAA,CACA,qBAAA,CACA,iCAAA,CACA,2BAAA,CACA,2BAAA,CACA,qCAAA,CACA,wDAAA,CACA,6BAAA,CAEA,uDACC,6CAAA,CACA,qDAAA,CAGD,+DACC,6CAAA,CACA,4DAAA,CAGD,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,WAAA,CACA,QAAA,CACA,cAAA,CACA,gBAAA,CACA,gBAAA,CACA,oBAAA,CACA,6BAAA,CACA,0BAAA,CACA,WAAA,CACA,kBAAA,CACA,eAAA,CACA,sBAAA,CACA,WAAA,CAIF,qFACC,uBAAA,CACA,YAAA,CAEA,eAAA,CAID,0CACC,qFACC,WAAA,CAAA,CAKH,yBACC,iBAAA,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,oLAGC,oDAAA,CACA,8CAAA,CACA,sCAAA,CAEA,qlBAGC,8CAAA,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,oBAAA,CACA,6BAAA,CACA,eAAA,CACA,eAAA,CACA,sBAAA,CACA,kBAAA,CAEA,gDACC,iCAAA,CAIF,+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#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(255, 255, 255, 0.8);\\n\\t--background-blur: blur(10px);\\n\\n\\t#body-user.theme--dark & {\\n\\t\\tbackground-color: var(--color-main-background);\\n\\t\\t--color-background-translucent: rgba(24, 24, 24, 0.8);\\n\\t}\\n\\n\\t#body-user.theme--highcontrast & {\\n\\t\\tbackground-color: var(--color-main-background);\\n\\t\\t--color-background-translucent: var(--color-main-background);\\n\\t}\\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\\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\\tbackground-size: 32px;\\n\\t\\t\\tbackground-position: 14px 12px;\\n\\t\\t\\tpadding: 16px 8px 16px 60px;\\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}\\n\\t}\\n\\n\\t& > .panel--content {\\n\\t\\tmargin: 0 16px 16px 16px;\\n\\t\\theight: 420px;\\n\\t\\t// We specifically do not want scrollbars inside widgets\\n\\t\\toverflow: hidden;\\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\\ttext-align: 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.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\\n\\t&:hover,\\n\\t&:focus,\\n\\t&:active {\\n\\t\\tbackground-color: var(--color-background-hover);\\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\\tbackground-size: 24px;\\n\\t\\t\\tbackground-position: 16px 16px;\\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\\t&:hover {\\n\\t\\t\\t\\tborder-color: var(--color-primary);\\n\\t\\t\\t}\\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-e4c3a7ca]{display:flex;flex-wrap:wrap;justify-content:center}.background-selector .background[data-v-e4c3a7ca]{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-e4c3a7ca]{background-image:var(--color-background-dark)}.background-selector .background.filepicker[data-v-e4c3a7ca],.background-selector .background.default[data-v-e4c3a7ca],.background-selector .background.color[data-v-e4c3a7ca]{border-color:var(--color-border)}.background-selector .background.color[data-v-e4c3a7ca]{background-color:var(--color-primary);color:var(--color-primary-text)}.background-selector .background.active[data-v-e4c3a7ca],.background-selector .background[data-v-e4c3a7ca]:hover,.background-selector .background[data-v-e4c3a7ca]:focus{border:2px solid var(--color-primary)}.background-selector .background.active[data-v-e4c3a7ca]:not(.icon-loading):after{background-image:var(--icon-checkmark-fff);background-repeat:no-repeat;background-position:center;background-size:44px;content:\\\"\\\";display:block;height:100%}body.theme--dark .background-selector .background.active[data-v-e4c3a7ca]:not(.icon-loading):after{background-image:var(--icon-checkmark-000)}\", \"\",{\"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,0CAAA,CACA,2BAAA,CACA,0BAAA,CACA,oBAAA,CACA,UAAA,CACA,aAAA,CACA,WAAA,CAEA,mGACC,0CAAA\",\"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-fff);\\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\\n\\t\\t\\tbody.theme--dark & {\\n\\t\\t\\t\\tbackground-image: var(--icon-checkmark-000);\\n\\t\\t\\t}\\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));","// 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__(27465); })\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","generateUrl","OCA","Theming","cacheBuster","Accessibility","theme","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","type","indexOf","_k","keyCode","apply","arguments","closeModal","domProps","isStatusActive","updateStatusCheckbox","target","checked","statusInfo","icon","panel","isActive","updateCheckbox","appStoreUrl","_e","updateBackground","__webpack_nonce__","btoa","getRequestToken","Vue","VTooltip","Files","Object","assign","App","fileList","filesClient","OC","getClient","Instance","$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","fn","priority","notFulfilled","Infinity","i","length","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","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file +{"version":3,"file":"dashboard-main.js?v=8ffb30e23fd986745925","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?8d16","webpack://nextcloud/./apps/dashboard/src/components/BackgroundSettings.vue?20a7","webpack:///nextcloud/apps/dashboard/src/components/BackgroundSettings.vue?vue&type=template&id=e4c3a7ca&scoped=true&","webpack:///nextcloud/apps/dashboard/src/App.vue","webpack:///nextcloud/apps/dashboard/src/App.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/dashboard/src/App.vue?1ed9","webpack://nextcloud/./apps/dashboard/src/App.vue?d9a5","webpack:///nextcloud/apps/dashboard/src/App.vue?vue&type=template&id=af526754&scoped=true&","webpack:///nextcloud/apps/dashboard/src/main.js","webpack:///nextcloud/apps/dashboard/src/App.vue?vue&type=style&index=0&id=af526754&lang=scss&scoped=true&","webpack:///nextcloud/apps/dashboard/src/components/BackgroundSettings.vue?vue&type=style&index=0&id=e4c3a7ca&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/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\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\t\tif (window.OCA.Accessibility && window.OCA.Accessibility.theme === 'dark') {\n\t\t\treturn prefixWithBaseUrl('eduardo-neves-pedra-azul.jpg')\n\t\t}\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\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-fff);\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\n\t\t\tbody.theme--dark & {\n\t\t\t\tbackground-image: var(--icon-checkmark-000);\n\t\t\t}\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=e4c3a7ca&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=e4c3a7ca&scoped=true&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./BackgroundSettings.vue?vue&type=template&id=e4c3a7ca&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=e4c3a7ca&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 \"e4c3a7ca\",\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 :class=\"panels[panelId].iconClass\">\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<a class=\"edit-panels icon-rename\"\n\t\t\t\ttabindex=\"0\"\n\t\t\t\t@click=\"showModal\"\n\t\t\t\t@keyup.enter=\"showModal\"\n\t\t\t\t@keyup.space=\"showModal\">{{ t('dashboard', 'Customize') }}</a>\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\">\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\" :class=\"statusInfo[status].icon\">\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\">\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=\"isActive(panel) ? 'draggable ' + panel.iconClass : panel.iconClass\">\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 Vue from 'vue'\nimport { loadState } from '@nextcloud/initial-state'\nimport { getCurrentUser } from '@nextcloud/auth'\nimport Modal from '@nextcloud/vue/dist/Components/Modal'\nimport Draggable from 'vuedraggable'\nimport axios from '@nextcloud/axios'\nimport { generateUrl } from '@nextcloud/router'\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')\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: 'App',\n\tcomponents: {\n\t\tModal,\n\t\tDraggable,\n\t\tBackgroundSettings,\n\t},\n\tmixins: [\n\t\tisMobile,\n\t],\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\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\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\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\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\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\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\tdocument.body.setAttribute('data-dashboard-background', this.background)\n\t\t\tif (window.OCA.Theming.inverted) {\n\t\t\t\tdocument.body.classList.add('dashboard--inverted')\n\t\t\t}\n\n\t\t\tconst shippedBackgroundTheme = shippedBackgroundList[this.background] ? shippedBackgroundList[this.background].theming : 'light'\n\t\t\tif (shippedBackgroundTheme === 'dark') {\n\t\t\t\tdocument.body.classList.add('dashboard--dark')\n\t\t\t} else {\n\t\t\t\tdocument.body.classList.remove('dashboard--dark')\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(255, 255, 255, 0.8);\n\t--background-blur: blur(10px);\n\n\t#body-user.theme--dark & {\n\t\tbackground-color: var(--color-main-background);\n\t\t--color-background-translucent: rgba(24, 24, 24, 0.8);\n\t}\n\n\t#body-user.theme--highcontrast & {\n\t\tbackground-color: var(--color-main-background);\n\t\t--color-background-translucent: var(--color-main-background);\n\t}\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\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\tbackground-size: 32px;\n\t\t\tbackground-position: 14px 12px;\n\t\t\tpadding: 16px 8px 16px 60px;\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}\n\t}\n\n\t& > .panel--content {\n\t\tmargin: 0 16px 16px 16px;\n\t\theight: 420px;\n\t\t// We specifically do not want scrollbars inside widgets\n\t\toverflow: hidden;\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\ttext-align: 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.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\tborder: 2px solid 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\tbackground-size: 24px;\n\t\t\tbackground-position: 16px 16px;\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\t&:hover {\n\t\t\t\tborder-color: var(--color-primary);\n\t\t\t}\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!./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 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!./App.vue?vue&type=style&index=0&id=af526754&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!./App.vue?vue&type=style&index=0&id=af526754&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=af526754&scoped=true&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&id=af526754&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 \"af526754\",\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',{class:_vm.panels[panelId].iconClass},[_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('a',{staticClass:\"edit-panels icon-rename\",attrs:{\"tabindex\":\"0\"},on:{\"click\":_vm.showModal,\"keyup\":[function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.showModal.apply(null, arguments)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"space\",32,$event.key,[\" \",\"Spacebar\"])){ return null; }return _vm.showModal.apply(null, arguments)}]}},[_vm._v(_vm._s(_vm.t('dashboard', 'Customize')))])]),_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},[_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',{class:_vm.statusInfo[status].icon,attrs:{\"for\":'status-checkbox-' + status}},[_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},[_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:_vm.isActive(panel) ? 'draggable ' + panel.iconClass : panel.iconClass,attrs:{\"for\":'panel-checkbox-' + panel.id}},[_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 App from './App.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(App)\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-af526754]{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(255, 255, 255, 0.8);--background-blur: blur(10px)}#body-user.theme--dark #app-dashboard[data-v-af526754]{background-color:var(--color-main-background);--color-background-translucent: rgba(24, 24, 24, 0.8)}#body-user.theme--highcontrast #app-dashboard[data-v-af526754]{background-color:var(--color-main-background);--color-background-translucent: var(--color-main-background)}#app-dashboard>h2[data-v-af526754]{color:var(--color-primary-text);text-align:center;font-size:32px;line-height:130%;padding:10vh 16px 0px}.panels[data-v-af526754]{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-af526754],.panels>div[data-v-af526754]{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-af526754],#body-user.theme--highcontrast .panels>div[data-v-af526754]{border:2px solid var(--color-border)}.panel.sortable-ghost[data-v-af526754],.panels>div.sortable-ghost[data-v-af526754]{opacity:.1}.panel>.panel--header[data-v-af526754],.panels>div>.panel--header[data-v-af526754]{display:flex;z-index:1;top:50px;padding:16px;cursor:grab}.panel>.panel--header[data-v-af526754],.panel>.panel--header[data-v-af526754] *,.panels>div>.panel--header[data-v-af526754],.panels>div>.panel--header[data-v-af526754] *{-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-af526754]:active,.panels>div>.panel--header[data-v-af526754]:active{cursor:grabbing}.panel>.panel--header a[data-v-af526754],.panels>div>.panel--header a[data-v-af526754]{flex-grow:1}.panel>.panel--header>h2[data-v-af526754],.panels>div>.panel--header>h2[data-v-af526754]{display:block;flex-grow:1;margin:0;font-size:20px;line-height:24px;font-weight:bold;background-size:32px;background-position:14px 12px;padding:16px 8px 16px 60px;height:56px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:grab}.panel>.panel--content[data-v-af526754],.panels>div>.panel--content[data-v-af526754]{margin:0 16px 16px 16px;height:420px;overflow:hidden}@media only screen and (max-width: 709px){.panel>.panel--content[data-v-af526754],.panels>div>.panel--content[data-v-af526754]{height:auto}}.footer[data-v-af526754]{text-align:center;transition:bottom var(--animation-slow) ease-in-out;bottom:0;padding:44px 0}.edit-panels[data-v-af526754]{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}.edit-panels[data-v-af526754],.statuses[data-v-af526754] .action-item .action-item__menutoggle,.statuses[data-v-af526754] .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}.edit-panels[data-v-af526754]:hover,.edit-panels[data-v-af526754]:focus,.edit-panels[data-v-af526754]:active,.statuses[data-v-af526754] .action-item .action-item__menutoggle:hover,.statuses[data-v-af526754] .action-item .action-item__menutoggle:focus,.statuses[data-v-af526754] .action-item .action-item__menutoggle:active,.statuses[data-v-af526754] .action-item.action-item--open .action-item__menutoggle:hover,.statuses[data-v-af526754] .action-item.action-item--open .action-item__menutoggle:focus,.statuses[data-v-af526754] .action-item.action-item--open .action-item__menutoggle:active{background-color:var(--color-background-hover) !important}.edit-panels[data-v-af526754]:focus-visible,.statuses[data-v-af526754] .action-item .action-item__menutoggle:focus-visible,.statuses[data-v-af526754] .action-item.action-item--open .action-item__menutoggle:focus-visible{border:2px solid var(--color-main-text) !important}.modal__content[data-v-af526754]{padding:32px 16px;text-align:center}.modal__content ol[data-v-af526754]{display:flex;flex-direction:row;justify-content:center;list-style-type:none;padding-bottom:16px}.modal__content li label[data-v-af526754]{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);background-size:24px;background-position:16px 16px;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.modal__content li label[data-v-af526754]:hover{border-color:var(--color-primary)}.modal__content li input[type=checkbox].checkbox+label[data-v-af526754]:before{position:absolute;right:12px;top:16px}.modal__content li input:focus+label[data-v-af526754]{border-color:var(--color-primary)}.modal__content h3[data-v-af526754]{font-weight:bold}.modal__content h3[data-v-af526754]:not(:first-of-type){margin-top:64px}.modal__content .button[data-v-af526754]{display:inline-block;padding:10px 16px;margin:0}.modal__content p[data-v-af526754]{max-width:650px;margin:0 auto}.modal__content p a[data-v-af526754]:hover,.modal__content p a[data-v-af526754]:focus{border-bottom:2px solid var(--color-border)}.modal__content .credits--end[data-v-af526754]{padding-bottom:32px;color:var(--color-text-maxcontrast)}.modal__content .credits--end a[data-v-af526754]{color:var(--color-text-maxcontrast)}.flip-list-move[data-v-af526754]{transition:transform var(--animation-slow)}.statuses[data-v-af526754]{display:flex;flex-direction:row;justify-content:center;flex-wrap:wrap;margin-bottom:36px}.statuses>div[data-v-af526754]{margin:8px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/dashboard/src/App.vue\"],\"names\":[],\"mappings\":\"AAqZA,gCACC,UAAA,CACA,gBAAA,CACA,qBAAA,CACA,iCAAA,CACA,2BAAA,CACA,2BAAA,CACA,qCAAA,CACA,wDAAA,CACA,6BAAA,CAEA,uDACC,6CAAA,CACA,qDAAA,CAGD,+DACC,6CAAA,CACA,4DAAA,CAGD,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,WAAA,CACA,QAAA,CACA,cAAA,CACA,gBAAA,CACA,gBAAA,CACA,oBAAA,CACA,6BAAA,CACA,0BAAA,CACA,WAAA,CACA,kBAAA,CACA,eAAA,CACA,sBAAA,CACA,WAAA,CAIF,qFACC,uBAAA,CACA,YAAA,CAEA,eAAA,CAID,0CACC,qFACC,WAAA,CAAA,CAKH,yBACC,iBAAA,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,oLAGC,oDAAA,CACA,8CAAA,CACA,sCAAA,CACA,oBAAA,CAEA,qlBAGC,yDAAA,CAED,8NACC,kDAAA,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,oBAAA,CACA,6BAAA,CACA,eAAA,CACA,eAAA,CACA,sBAAA,CACA,kBAAA,CAEA,gDACC,iCAAA,CAIF,+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#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(255, 255, 255, 0.8);\\n\\t--background-blur: blur(10px);\\n\\n\\t#body-user.theme--dark & {\\n\\t\\tbackground-color: var(--color-main-background);\\n\\t\\t--color-background-translucent: rgba(24, 24, 24, 0.8);\\n\\t}\\n\\n\\t#body-user.theme--highcontrast & {\\n\\t\\tbackground-color: var(--color-main-background);\\n\\t\\t--color-background-translucent: var(--color-main-background);\\n\\t}\\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\\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\\tbackground-size: 32px;\\n\\t\\t\\tbackground-position: 14px 12px;\\n\\t\\t\\tpadding: 16px 8px 16px 60px;\\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}\\n\\t}\\n\\n\\t& > .panel--content {\\n\\t\\tmargin: 0 16px 16px 16px;\\n\\t\\theight: 420px;\\n\\t\\t// We specifically do not want scrollbars inside widgets\\n\\t\\toverflow: hidden;\\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\\ttext-align: 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.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\\tborder: 2px solid 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\\tbackground-size: 24px;\\n\\t\\t\\tbackground-position: 16px 16px;\\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\\t&:hover {\\n\\t\\t\\t\\tborder-color: var(--color-primary);\\n\\t\\t\\t}\\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-e4c3a7ca]{display:flex;flex-wrap:wrap;justify-content:center}.background-selector .background[data-v-e4c3a7ca]{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-e4c3a7ca]{background-image:var(--color-background-dark)}.background-selector .background.filepicker[data-v-e4c3a7ca],.background-selector .background.default[data-v-e4c3a7ca],.background-selector .background.color[data-v-e4c3a7ca]{border-color:var(--color-border)}.background-selector .background.color[data-v-e4c3a7ca]{background-color:var(--color-primary);color:var(--color-primary-text)}.background-selector .background.active[data-v-e4c3a7ca],.background-selector .background[data-v-e4c3a7ca]:hover,.background-selector .background[data-v-e4c3a7ca]:focus{border:2px solid var(--color-primary)}.background-selector .background.active[data-v-e4c3a7ca]:not(.icon-loading):after{background-image:var(--icon-checkmark-fff);background-repeat:no-repeat;background-position:center;background-size:44px;content:\\\"\\\";display:block;height:100%}body.theme--dark .background-selector .background.active[data-v-e4c3a7ca]:not(.icon-loading):after{background-image:var(--icon-checkmark-000)}\", \"\",{\"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,0CAAA,CACA,2BAAA,CACA,0BAAA,CACA,oBAAA,CACA,UAAA,CACA,aAAA,CACA,WAAA,CAEA,mGACC,0CAAA\",\"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-fff);\\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\\n\\t\\t\\tbody.theme--dark & {\\n\\t\\t\\t\\tbackground-image: var(--icon-checkmark-000);\\n\\t\\t\\t}\\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));","// 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__(30320); })\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","generateUrl","OCA","Theming","cacheBuster","Accessibility","theme","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","type","indexOf","_k","keyCode","apply","arguments","closeModal","domProps","isStatusActive","updateStatusCheckbox","target","checked","statusInfo","icon","panel","isActive","updateCheckbox","appStoreUrl","_e","updateBackground","__webpack_nonce__","btoa","getRequestToken","Vue","VTooltip","Files","Object","assign","App","fileList","filesClient","OC","getClient","Instance","$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","fn","priority","notFulfilled","Infinity","i","length","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","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file diff --git a/dist/settings-vue-settings-personal-security.js b/dist/settings-vue-settings-personal-security.js index 59a70707475..df3424e34e2 100644 --- a/dist/settings-vue-settings-personal-security.js +++ b/dist/settings-vue-settings-personal-security.js @@ -1,3 +1,3 @@ /*! For license information please see settings-vue-settings-personal-security.js.LICENSE.txt */ -!function(){"use strict";var n,e={71213:function(n,e,o){var i=o(16453),a=o(20144),r=o(72268),s=o.n(r),c=o(34741),p=o(4820),l=o(10128),d=o.n(l),u=o(79753),A=o(33476),h={ie:/(?:MSIE|Trident|Trident\/7.0; rv)[ :](\d+)/,edge:/^Mozilla\/5\.0 \([^)]+\) AppleWebKit\/[0-9.]+ \(KHTML, like Gecko\) Chrome\/[0-9.]+ (?:Mobile Safari|Safari)\/[0-9.]+ Edge\/[0-9.]+$/,firefox:/^Mozilla\/5\.0 \([^)]*(Windows|OS X|Linux)[^)]+\) Gecko\/[0-9.]+ Firefox\/(\d+)(?:\.\d)?$/,chrome:/^Mozilla\/5\.0 \([^)]*(Windows|OS X|Linux)[^)]+\) AppleWebKit\/[0-9.]+ \(KHTML, like Gecko\) Chrome\/(\d+)[0-9.]+ (?:Mobile Safari|Safari)\/[0-9.]+$/,safari:/^Mozilla\/5\.0 \([^)]*(Windows|OS X)[^)]+\) AppleWebKit\/[0-9.]+ \(KHTML, like Gecko\)(?: Version\/([0-9]+)[0-9.]+)? Safari\/[0-9.A-Z]+$/,androidChrome:/Android.*(?:; (.*) Build\/).*Chrome\/(\d+)[0-9.]+/,iphone:/ *CPU +iPhone +OS +([0-9]+)_(?:[0-9_])+ +like +Mac +OS +X */,ipad:/\(iPad; *CPU +OS +([0-9]+)_(?:[0-9_])+ +like +Mac +OS +X */,iosClient:/^Mozilla\/5\.0 \(iOS\) (?:ownCloud|Nextcloud)-iOS.*$/,androidClient:/^Mozilla\/5\.0 \(Android\) ownCloud-android.*$/,iosTalkClient:/^Mozilla\/5\.0 \(iOS\) Nextcloud-Talk.*$/,androidTalkClient:/^Mozilla\/5\.0 \(Android\) Nextcloud-Talk.*$/,davx5:/DAV(?:droid|x5)\/([^ ]+)/,webPirate:/(Sailfish).*WebPirate\/(\d+)/,sailfishBrowser:/(Sailfish).*SailfishBrowser\/(\d+)/},f={ie:t("setting","Internet Explorer"),edge:t("setting","Edge"),firefox:t("setting","Firefox"),chrome:t("setting","Google Chrome"),safari:t("setting","Safari"),androidChrome:t("setting","Google Chrome for Android"),iphone:t("setting","iPhone"),ipad:t("setting","iPad"),iosClient:t("setting","{productName} iOS app",{productName:window.oc_defaults.productName}),androidClient:t("setting","{productName} Android app",{productName:window.oc_defaults.productName}),iosTalkClient:t("setting","{productName} Talk for iOS",{productName:window.oc_defaults.productName}),androidTalkClient:t("setting","{productName} Talk for Android",{productName:window.oc_defaults.productName}),davx5:"DAVx5",webPirate:"WebPirate",sailfishBrowser:"SailfishBrowser"},m={ie:"icon-desktop",edge:"icon-desktop",firefox:"icon-desktop",chrome:"icon-desktop",safari:"icon-desktop",androidChrome:"icon-phone",iphone:"icon-phone",ipad:"icon-tablet",iosClient:"icon-phone",androidClient:"icon-phone",iosTalkClient:"icon-phone",androidTalkClient:"icon-phone",davx5:"icon-phone",webPirate:"icon-link",sailfishBrowser:"icon-link"},g={name:"AuthToken",components:{Actions:A.Actions,ActionButton:A.ActionButton,ActionCheckbox:A.ActionCheckbox},props:{token:{type:Object,required:!0}},data:function(){return{showMore:this.token.canScope||this.token.canDelete,renaming:!1,newName:"",actionOpen:!1}},computed:{lastActivityRelative:function(){return OC.Util.relativeModifiedDate(1e3*this.token.lastActivity)},lastActivity:function(){return OC.Util.formatDate(1e3*this.token.lastActivity,"LLL")},iconName:function(){var n=this.token.name.match(/Mozilla\/5\.0 \((\w+)\) (?:mirall|csyncoC)\/(\d+\.\d+\.\d+)/),e="";n&&(this.token.name=t("settings","Sync client - {os}",{os:n[1],version:n[2]}),e="icon-desktop");var o=this.token.name,i=this.token.name;for(var a in h){var r=o.match(h[a]);r&&(i=r[2]&&r[1]?f[a]+" "+r[2]+" - "+r[1]:r[1]?f[a]+" "+r[1]:f[a],e=m[a])}return this.token.current&&(i=t("settings","This session")),{icon:e,name:i}},wiping:function(){return 2===this.token.type}},methods:{startRename:function(){var n=this;this.actionOpen=!1,this.newName=this.token.name,this.renaming=!0,this.$nextTick((function(){n.$refs.input.select()}))},cancelRename:function(){this.renaming=!1},revoke:function(){this.actionOpen=!1,this.$emit("delete",this.token)},rename:function(){this.renaming=!1,this.$emit("rename",this.token,this.newName)},wipe:function(){this.actionOpen=!1,this.$emit("wipe",this.token)}}},v=o(93379),C=o.n(v),k=o(7795),w=o.n(k),y=o(90569),b=o.n(y),x=o(3565),_=o.n(x),T=o(19216),O=o.n(T),P=o(44589),N=o.n(P),B=o(40708),S={};S.styleTagTransform=N(),S.setAttributes=_(),S.insert=b().bind(null,"head"),S.domAPI=w(),S.insertStyleElement=O(),C()(B.Z,S),B.Z&&B.Z.locals&&B.Z.locals;var D=o(51900),E=(0,D.Z)(g,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("tr",{class:n.wiping,attrs:{"data-id":n.token.id}},[e("td",{staticClass:"client"},[e("div",{class:n.iconName.icon})]),n._v(" "),e("td",{staticClass:"token-name"},[n.token.canRename&&n.renaming?e("input",{directives:[{name:"model",rawName:"v-model",value:n.newName,expression:"newName"}],ref:"input",attrs:{type:"text"},domProps:{value:n.newName},on:{keyup:[function(t){return!t.type.indexOf("key")&&n._k(t.keyCode,"enter",13,t.key,"Enter")?null:n.rename.apply(null,arguments)},function(t){return!t.type.indexOf("key")&&n._k(t.keyCode,"esc",27,t.key,["Esc","Escape"])?null:n.cancelRename.apply(null,arguments)}],blur:n.cancelRename,input:function(t){t.target.composing||(n.newName=t.target.value)}}}):e("span",[n._v(n._s(n.iconName.name))]),n._v(" "),n.wiping?e("span",{staticClass:"wiping-warning"},[n._v("("+n._s(n.t("settings","Marked for remote wipe"))+")")]):n._e()]),n._v(" "),e("td",[e("span",{directives:[{name:"tooltip",rawName:"v-tooltip",value:n.lastActivity,expression:"lastActivity"}],staticClass:"last-activity"},[n._v(n._s(n.lastActivityRelative))])]),n._v(" "),e("td",{staticClass:"more"},[n.token.current?n._e():e("Actions",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:{content:n.t("settings","Device settings"),container:"body"},expression:"{\n\t\t\t\tcontent: t('settings', 'Device settings'),\n\t\t\t\tcontainer: 'body'\n\t\t\t}",modifiers:{auto:!0}}],attrs:{open:n.actionOpen},on:{"update:open":function(t){n.actionOpen=t}}},[1===n.token.type?e("ActionCheckbox",{attrs:{checked:n.token.scope.filesystem},on:{change:function(t){return t.stopPropagation(),t.preventDefault(),n.$emit("toggle-scope",n.token,"filesystem",!n.token.scope.filesystem)}}},[n._v("\n\t\t\t\t"+n._s(n.t("settings","Allow filesystem access"))+"\n\t\t\t")]):n._e(),n._v(" "),n.token.canRename?e("ActionButton",{attrs:{icon:"icon-rename"},on:{click:function(t){return t.stopPropagation(),t.preventDefault(),n.startRename.apply(null,arguments)}}},[n._v("\n\t\t\t\t"+n._s(n.t("settings","Rename"))+"\n\t\t\t")]):n._e(),n._v(" "),n.token.canDelete?[2!==n.token.type?[e("ActionButton",{attrs:{icon:"icon-delete"},on:{click:function(t){return t.stopPropagation(),t.preventDefault(),n.revoke.apply(null,arguments)}}},[n._v("\n\t\t\t\t\t\t"+n._s(n.t("settings","Revoke"))+"\n\t\t\t\t\t")]),n._v(" "),e("ActionButton",{attrs:{icon:"icon-delete"},on:{click:function(t){return t.stopPropagation(),t.preventDefault(),n.wipe.apply(null,arguments)}}},[n._v("\n\t\t\t\t\t\t"+n._s(n.t("settings","Wipe device"))+"\n\t\t\t\t\t")])]:2===n.token.type?e("ActionButton",{attrs:{icon:"icon-delete",title:n.t("settings","Revoke")},on:{click:function(t){return t.stopPropagation(),t.preventDefault(),n.revoke.apply(null,arguments)}}},[n._v("\n\t\t\t\t\t"+n._s(n.t("settings","Revoking this token might prevent the wiping of your device if it has not started the wipe yet."))+"\n\t\t\t\t")]):n._e()]:n._e()],2)],1)])}),[],!1,null,"6852e55e",null),R={name:"AuthTokenList",components:{AuthToken:E.exports},props:{tokens:{type:Array,required:!0}},computed:{sortedTokens:function(){return this.tokens.slice().sort((function(n,t){var e=parseInt(n.lastActivity,10);return parseInt(t.lastActivity,10)-e}))}},methods:{toggleScope:function(n,t,e){this.$emit("toggle-scope",n,t,e)},rename:function(n,t){this.$emit("rename",n,t)},onDelete:function(n){this.$emit("delete",n)},onWipe:function(n){this.$emit("wipe",n)}}},$=o(52442),U={};U.styleTagTransform=N(),U.setAttributes=_(),U.insert=b().bind(null,"head"),U.domAPI=w(),U.insertStyleElement=O(),C()($.Z,U),$.Z&&$.Z.locals&&$.Z.locals;var Z=o(47719),M={};M.styleTagTransform=N(),M.setAttributes=_(),M.insert=b().bind(null,"head"),M.domAPI=w(),M.insertStyleElement=O(),C()(Z.Z,M),Z.Z&&Z.Z.locals&&Z.Z.locals;var j=(0,D.Z)(R,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("table",{attrs:{id:"app-tokens-table"}},[n.tokens.length?e("thead",[e("tr",[e("th"),n._v(" "),e("th",[n._v(n._s(n.t("settings","Device")))]),n._v(" "),e("th",[n._v(n._s(n.t("settings","Last activity")))]),n._v(" "),e("th")])]):n._e(),n._v(" "),e("tbody",{staticClass:"token-list"},n._l(n.sortedTokens,(function(t){return e("AuthToken",{key:t.id,attrs:{token:t},on:{"toggle-scope":n.toggleScope,rename:n.rename,delete:n.onDelete,wipe:n.onWipe}})})),1)])}),[],!1,null,"4f8ceff3",null).exports,q=o(147),W=o.n(q),G=o(1412),L=o.n(G);function I(n,t){var e=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(n,t).enumerable}))),e.push.apply(e,o)}return e}function z(n){for(var t=1;t<arguments.length;t++){var e=null!=arguments[t]?arguments[t]:{};t%2?I(Object(e),!0).forEach((function(t){F(n,t,e[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(e)):I(Object(e)).forEach((function(t){Object.defineProperty(n,t,Object.getOwnPropertyDescriptor(e,t))}))}return n}function F(n,t,e){return t in n?Object.defineProperty(n,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):n[t]=e,n}var Q={name:"AuthTokenSetupDialogue",components:{QR:W(),Button:L()},props:{add:{type:Function,required:!0}},data:function(){return{adding:!1,loading:!1,deviceName:"",appPassword:"",loginName:"",passwordCopied:!1,showQR:!1,qrUrl:"",hoveringCopyButton:!1}},computed:{copyTooltipOptions:function(){var n={hideOnTargetClick:!1,trigger:"manual"};return this.passwordCopied?z(z({},n),{},{content:t("settings","Copied!"),show:!0}):z(z({},n),{},{content:t("settings","Copy"),show:this.hoveringCopyButton})}},methods:{selectInput:function(n){n.currentTarget.select()},submit:function(){var n=this;d()().then((function(){return n.loading=!0,n.add(n.deviceName)})).then((function(t){n.adding=!0,n.loginName=t.loginName,n.appPassword=t.token;var e=window.location.protocol+"//"+window.location.host+(0,u.getRootUrl)();n.qrUrl="nc://login/user:".concat(t.loginName,"&password:").concat(t.token,"&server:").concat(e),n.$nextTick((function(){n.$refs.appPassword.select()}))})).catch((function(e){console.error("could not create a new app password",e),OC.Notification.showTemporary(t("settings","Error while creating device token")),n.reset()}))},onCopyPassword:function(){var n=this;this.passwordCopied=!0,this.$refs.clipboardButton.blur(),setTimeout((function(){n.passwordCopied=!1}),3e3)},onCopyPasswordFailed:function(){OC.Notification.showTemporary(t("settings","Could not copy app password. Please copy it manually."))},reset:function(){this.adding=!1,this.loading=!1,this.showQR=!1,this.qrUrl="",this.deviceName="",this.appPassword="",this.loginName=""}}},K=o(34775),H={};H.styleTagTransform=N(),H.setAttributes=_(),H.insert=b().bind(null,"head"),H.domAPI=w(),H.insertStyleElement=O(),C()(K.Z,H),K.Z&&K.Z.locals&&K.Z.locals;var X=(0,D.Z)(Q,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return n.adding?e("div",[n._v("\n\t"+n._s(n.t("settings","Use the credentials below to configure your app or device."))+"\n\t"+n._s(n.t("settings","For security reasons this password will only be shown once."))+"\n\t"),e("div",{staticClass:"app-password-row"},[e("span",{staticClass:"app-password-label"},[n._v(n._s(n.t("settings","Username")))]),n._v(" "),e("input",{staticClass:"monospaced",attrs:{type:"text",readonly:"readonly"},domProps:{value:n.loginName},on:{focus:n.selectInput}})]),n._v(" "),e("div",{staticClass:"app-password-row"},[e("span",{staticClass:"app-password-label"},[n._v(n._s(n.t("settings","Password")))]),n._v(" "),e("input",{ref:"appPassword",staticClass:"monospaced",attrs:{type:"text",readonly:"readonly"},domProps:{value:n.appPassword},on:{focus:n.selectInput}}),n._v(" "),e("a",{directives:[{name:"tooltip",rawName:"v-tooltip",value:n.copyTooltipOptions,expression:"copyTooltipOptions"},{name:"clipboard",rawName:"v-clipboard:copy",value:n.appPassword,expression:"appPassword",arg:"copy"},{name:"clipboard",rawName:"v-clipboard:success",value:n.onCopyPassword,expression:"onCopyPassword",arg:"success"},{name:"clipboard",rawName:"v-clipboard:error",value:n.onCopyPasswordFailed,expression:"onCopyPasswordFailed",arg:"error"}],ref:"clipboardButton",staticClass:"icon icon-clippy",on:{mouseover:function(t){n.hoveringCopyButton=!0},mouseleave:function(t){n.hoveringCopyButton=!1}}}),n._v(" "),e("Button",{on:{click:n.reset}},[n._v("\n\t\t\t"+n._s(n.t("settings","Done"))+"\n\t\t")])],1),n._v(" "),e("div",{staticClass:"app-password-row"},[e("span",{staticClass:"app-password-label"}),n._v(" "),n.showQR?e("QR",{attrs:{value:n.qrUrl}}):e("a",{on:{click:function(t){n.showQR=!0}}},[n._v("\n\t\t\t"+n._s(n.t("settings","Show QR code for mobile apps"))+"\n\t\t")])],1)]):e("div",[e("input",{directives:[{name:"model",rawName:"v-model",value:n.deviceName,expression:"deviceName"}],attrs:{type:"text",disabled:n.loading,placeholder:n.t("settings","App name")},domProps:{value:n.deviceName},on:{keydown:function(t){return!t.type.indexOf("key")&&n._k(t.keyCode,"enter",13,t.key,"Enter")?null:n.submit.apply(null,arguments)},input:function(t){t.target.composing||(n.deviceName=t.target.value)}}}),n._v(" "),e("Button",{attrs:{disabled:n.loading},on:{click:n.submit}},[n._v("\n\t\t"+n._s(n.t("settings","Create new app password"))+"\n\t")])],1)}),[],!1,null,"c67d1466",null),V=X.exports;function J(n,t,e,o,i,a,r){try{var s=n[a](r),c=s.value}catch(n){return void e(n)}s.done?t(c):Promise.resolve(c).then(o,i)}var Y=function(n){return function(t){return n(t),t}},nn={name:"AuthTokenSection",components:{AuthTokenSetupDialogue:V,AuthTokenList:j},props:{tokens:{type:Array,required:!0},canCreateToken:{type:Boolean,required:!0}},data:function(){return{baseUrl:(0,u.generateUrl)("/settings/personal/authtokens")}},methods:{addNewToken:function(n){var e=this;console.debug("creating a new app token",n);var o={name:n};return p.default.post(this.baseUrl,o).then((function(n){return n.data})).then(Y((function(){return console.debug("app token created")}))).then(Y((function(n){return e.tokens.push(n.deviceToken)}))).catch((function(n){throw console.error.bind("could not create app password",n),OC.Notification.showTemporary(t("settings","Error while creating device token")),n}))},toggleTokenScope:function(n,e,o){console.debug("updating app token scope",n.id,e,o);var i=n.scope[e];return n.scope[e]=o,this.updateToken(n).then(Y((function(){return console.debug("app token scope updated")}))).catch((function(o){throw console.error.bind("could not update app token scope",o),OC.Notification.showTemporary(t("settings","Error while updating device token scope")),n.scope[e]=i,o}))},rename:function(n,e){console.debug("renaming app token",n.id,n.name,e);var o=n.name;return n.name=e,this.updateToken(n).then(Y((function(){return console.debug("app token name updated")}))).catch((function(e){console.error.bind("could not update app token name",e),OC.Notification.showTemporary(t("settings","Error while updating device token name")),n.name=o}))},updateToken:function(n){return p.default.put(this.baseUrl+"/"+n.id,n).then((function(n){return n.data}))},deleteToken:function(n){var e=this;return console.debug("deleting app token",n),this.tokens=this.tokens.filter((function(t){return t!==n})),p.default.delete(this.baseUrl+"/"+n.id).then((function(n){return n.data})).then(Y((function(){return console.debug("app token deleted")}))).catch((function(o){console.error.bind("could not delete app token",o),OC.Notification.showTemporary(t("settings","Error while deleting the token")),e.tokens.push(n)}))},wipeToken:function(n){var e,o=this;return(e=regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return console.debug("wiping app token",n),e.prev=1,e.next=4,d()();case 4:return e.next=6,new Promise((function(n){OC.dialogs.confirm(t("settings","Do you really want to wipe your data from this device?"),t("settings","Confirm wipe"),n,!0)}));case 6:if(e.sent){e.next=9;break}return console.debug("wipe aborted by user"),e.abrupt("return");case 9:return e.next=11,p.default.post(o.baseUrl+"/wipe/"+n.id);case 11:console.debug("app token marked for wipe"),n.type=2,e.next=19;break;case 15:e.prev=15,e.t0=e.catch(1),console.error("could not wipe app token",e.t0),OC.Notification.showTemporary(t("settings","Error while wiping the device with the token"));case 19:case"end":return e.stop()}}),e,null,[[1,15]])})),function(){var n=this,t=arguments;return new Promise((function(o,i){var a=e.apply(n,t);function r(n){J(a,o,i,r,s,"next",n)}function s(n){J(a,o,i,r,s,"throw",n)}r(void 0)}))})()}}},tn=nn,en=(0,D.Z)(tn,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("div",{staticClass:"section",attrs:{id:"security"}},[e("h2",[n._v(n._s(n.t("settings","Devices & sessions",{},void 0,{sanitize:!1})))]),n._v(" "),e("p",{staticClass:"settings-hint hidden-when-empty"},[n._v("\n\t\t"+n._s(n.t("settings","Web, desktop and mobile clients currently logged in to your account."))+"\n\t")]),n._v(" "),e("AuthTokenList",{attrs:{tokens:n.tokens},on:{"toggle-scope":n.toggleTokenScope,rename:n.rename,delete:n.deleteToken,wipe:n.wipeToken}}),n._v(" "),n.canCreateToken?e("AuthTokenSetupDialogue",{attrs:{add:n.addNewToken}}):n._e()],1)}),[],!1,null,"451cdc4a",null).exports;o.nc=btoa(OC.requestToken),a.default.use(s()),a.default.use(c.default,{defaultHtml:!1}),a.default.prototype.t=t,new(a.default.extend(en))({propsData:{tokens:(0,i.loadState)("settings","app_tokens"),canCreateToken:(0,i.loadState)("settings","can_create_app_token")}}).$mount("#security-authtokens")},40708:function(n,t,e){var o=e(87537),i=e.n(o),a=e(23645),r=e.n(a)()(i());r.push([n.id,".wiping[data-v-6852e55e]{background-color:var(--color-background-darker)}td[data-v-6852e55e]{border-top:1px solid var(--color-border);max-width:200px;white-space:normal;vertical-align:middle;position:relative}td.client[data-v-6852e55e],td.more[data-v-6852e55e]{overflow:visible;position:relative;width:44px;height:44px}td.token-name[data-v-6852e55e]{padding:10px 6px}td.token-name.token-rename[data-v-6852e55e]{padding:0}td.token-name input[data-v-6852e55e]{width:100%;margin:0}td.token-name .wiping-warning[data-v-6852e55e]{color:var(--color-text-lighter)}td.more[data-v-6852e55e]{padding:0 10px}td.client div[data-v-6852e55e]{opacity:.57;width:44px;height:44px}","",{version:3,sources:["webpack://./apps/settings/src/components/AuthToken.vue"],names:[],mappings:"AAiQA,yBACC,+CAAA,CAGD,oBACC,wCAAA,CACA,eAAA,CACA,kBAAA,CACA,qBAAA,CACA,iBAAA,CAEA,oDACC,gBAAA,CACA,iBAAA,CACA,UAAA,CACA,WAAA,CAGD,+BACC,gBAAA,CAEA,4CACC,SAAA,CAGD,qCACC,UAAA,CACA,QAAA,CAGF,+CACC,+BAAA,CAGD,yBAEC,cAAA,CAMA,+BACC,WAAA,CACA,UAAA,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\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.wiping {\n\tbackground-color: var(--color-background-darker);\n}\n\ntd {\n\tborder-top: 1px solid var(--color-border);\n\tmax-width: 200px;\n\twhite-space: normal;\n\tvertical-align: middle;\n\tposition: relative;\n\n\t&%icon {\n\t\toverflow: visible;\n\t\tposition: relative;\n\t\twidth: 44px;\n\t\theight: 44px;\n\t}\n\n\t&.token-name {\n\t\tpadding: 10px 6px;\n\n\t\t&.token-rename {\n\t\t\tpadding: 0;\n\t\t}\n\n\t\tinput {\n\t\t\twidth: 100%;\n\t\t\tmargin: 0;\n\t\t}\n\t}\n\t&.token-name .wiping-warning {\n\t\tcolor: var(--color-text-lighter);\n\t}\n\n\t&.more {\n\t\t@extend %icon;\n\t\tpadding: 0 10px;\n\t}\n\n\t&.client {\n\t\t@extend %icon;\n\n\t\tdiv {\n\t\t\topacity: 0.57;\n\t\t\twidth: 44px;\n\t\t\theight: 44px;\n\t\t}\n\t}\n}\n"],sourceRoot:""}]),t.Z=r},52442:function(n,t,e){var o=e(87537),i=e.n(o),a=e(23645),r=e.n(a)()(i());r.push([n.id,"table[data-v-4f8ceff3]{width:100%;min-height:50px;padding-top:5px;max-width:580px}table th[data-v-4f8ceff3]{opacity:.5;padding:10px 0}.token-list td>a.icon-more[data-v-4f8ceff3]{transition:opacity var(--animation-quick)}.token-list a.icon-more[data-v-4f8ceff3]{padding:14px;display:block;width:44px;height:44px;opacity:.5}.token-list tr:hover td>a.icon[data-v-4f8ceff3],.token-list tr td>a.icon[data-v-4f8ceff3]:focus,.token-list tr.active td>a.icon[data-v-4f8ceff3]{opacity:1}","",{version:3,sources:["webpack://./apps/settings/src/components/AuthTokenList.vue"],names:[],mappings:"AAwFA,uBACC,UAAA,CACA,eAAA,CACA,eAAA,CACA,eAAA,CAEA,0BACC,UAAA,CACA,cAAA,CAKD,4CACC,yCAAA,CAGD,yCACC,YAAA,CACA,aAAA,CACA,UAAA,CACA,WAAA,CACA,UAAA,CAIA,iJAGC,SAAA",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\ntable {\n\twidth: 100%;\n\tmin-height: 50px;\n\tpadding-top: 5px;\n\tmax-width: 580px;\n\n\tth {\n\t\topacity: .5;\n\t\tpadding: 10px 0;\n\t}\n}\n\n.token-list {\n\ttd > a.icon-more {\n\t\ttransition: opacity var(--animation-quick);\n\t}\n\n\ta.icon-more {\n\t\tpadding: 14px;\n\t\tdisplay: block;\n\t\twidth: 44px;\n\t\theight: 44px;\n\t\topacity: .5;\n\t}\n\n\ttr {\n\t\t&:hover td > a.icon,\n\t\ttd > a.icon:focus,\n\t\t&.active td > a.icon {\n\t\t\topacity: 1;\n\t\t}\n\t}\n}\n"],sourceRoot:""}]),t.Z=r},47719:function(n,t,e){var o=e(87537),i=e.n(o),a=e(23645),r=e.n(a)()(i());r.push([n.id,"#app-tokens-table tr>*:nth-child(2){padding-left:6px}#app-tokens-table tr>*:nth-child(3){text-align:right}","",{version:3,sources:["webpack://./apps/settings/src/components/AuthTokenList.vue"],names:[],mappings:"AA8HC,oCACC,gBAAA,CAGD,oCACC,gBAAA",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#app-tokens-table {\n\ttr > *:nth-child(2) {\n\t\tpadding-left: 6px;\n\t}\n\n\ttr > *:nth-child(3) {\n\t\ttext-align: right;\n\t}\n}\n"],sourceRoot:""}]),t.Z=r},34775:function(n,t,e){var o=e(87537),i=e.n(o),a=e(23645),r=e.n(a)()(i());r.push([n.id,".app-password-row[data-v-c67d1466]{display:table-row}.app-password-row .icon[data-v-c67d1466]{background-size:16px 16px;display:inline-block;position:relative;top:3px;margin-left:5px;margin-right:8px}.app-password-label[data-v-c67d1466]{display:table-cell;padding-right:1em;text-align:right;vertical-align:middle}.monospaced[data-v-c67d1466]{width:245px;font-family:monospace}.button-vue[data-v-c67d1466]{display:inline-block;margin:3px 3px 3px 3px}","",{version:3,sources:["webpack://./apps/settings/src/components/AuthTokenSetupDialogue.vue"],names:[],mappings:"AAoLA,mCACC,iBAAA,CAEA,yCACC,yBAAA,CACA,oBAAA,CACA,iBAAA,CACA,OAAA,CACA,eAAA,CACA,gBAAA,CAKF,qCACC,kBAAA,CACA,iBAAA,CACA,gBAAA,CACA,qBAAA,CAGD,6BACC,WAAA,CACA,qBAAA,CAGD,6BACC,oBAAA,CACA,sBAAA",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.app-password-row {\n\tdisplay: table-row;\n\n\t.icon {\n\t\tbackground-size: 16px 16px;\n\t\tdisplay: inline-block;\n\t\tposition: relative;\n\t\ttop: 3px;\n\t\tmargin-left: 5px;\n\t\tmargin-right: 8px;\n\t}\n\n}\n\n.app-password-label {\n\tdisplay: table-cell;\n\tpadding-right: 1em;\n\ttext-align: right;\n\tvertical-align: middle;\n}\n\n.monospaced {\n\twidth: 245px;\n\tfont-family: monospace;\n}\n\n.button-vue{\n\tdisplay:inline-block;\n\tmargin: 3px 3px 3px 3px;\n}\n\n"],sourceRoot:""}]),t.Z=r}},o={};function i(n){var t=o[n];if(void 0!==t)return t.exports;var a=o[n]={id:n,loaded:!1,exports:{}};return e[n].call(a.exports,a,a.exports,i),a.loaded=!0,a.exports}i.m=e,i.amdD=function(){throw new Error("define cannot be used indirect")},i.amdO={},n=[],i.O=function(t,e,o,a){if(!e){var r=1/0;for(l=0;l<n.length;l++){e=n[l][0],o=n[l][1],a=n[l][2];for(var s=!0,c=0;c<e.length;c++)(!1&a||r>=a)&&Object.keys(i.O).every((function(n){return i.O[n](e[c])}))?e.splice(c--,1):(s=!1,a<r&&(r=a));if(s){n.splice(l--,1);var p=o();void 0!==p&&(t=p)}}return t}a=a||0;for(var l=n.length;l>0&&n[l-1][2]>a;l--)n[l]=n[l-1];n[l]=[e,o,a]},i.n=function(n){var t=n&&n.__esModule?function(){return n.default}:function(){return n};return i.d(t,{a:t}),t},i.d=function(n,t){for(var e in t)i.o(t,e)&&!i.o(n,e)&&Object.defineProperty(n,e,{enumerable:!0,get:t[e]})},i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(n){if("object"==typeof window)return window}}(),i.o=function(n,t){return Object.prototype.hasOwnProperty.call(n,t)},i.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},i.nmd=function(n){return n.paths=[],n.children||(n.children=[]),n},i.j=4783,function(){i.b=document.baseURI||self.location.href;var n={4783:0};i.O.j=function(t){return 0===n[t]};var t=function(t,e){var o,a,r=e[0],s=e[1],c=e[2],p=0;if(r.some((function(t){return 0!==n[t]}))){for(o in s)i.o(s,o)&&(i.m[o]=s[o]);if(c)var l=c(i)}for(t&&t(e);p<r.length;p++)a=r[p],i.o(n,a)&&n[a]&&n[a][0](),n[a]=0;return i.O(l)},e=self.webpackChunknextcloud=self.webpackChunknextcloud||[];e.forEach(t.bind(null,0)),e.push=t.bind(null,e.push.bind(e))}();var a=i.O(void 0,[7874],(function(){return i(71213)}));a=i.O(a)}(); -//# sourceMappingURL=settings-vue-settings-personal-security.js.map?v=6cf20d6b95ebfa4d0b73
\ No newline at end of file +!function(){"use strict";var n,e={73887:function(n,e,o){var i=o(16453),a=o(20144),r=o(72268),s=o.n(r),c=o(34741),p=o(4820),l=o(10128),d=o.n(l),u=o(79753),A=o(33476),h={ie:/(?:MSIE|Trident|Trident\/7.0; rv)[ :](\d+)/,edge:/^Mozilla\/5\.0 \([^)]+\) AppleWebKit\/[0-9.]+ \(KHTML, like Gecko\) Chrome\/[0-9.]+ (?:Mobile Safari|Safari)\/[0-9.]+ Edge\/[0-9.]+$/,firefox:/^Mozilla\/5\.0 \([^)]*(Windows|OS X|Linux)[^)]+\) Gecko\/[0-9.]+ Firefox\/(\d+)(?:\.\d)?$/,chrome:/^Mozilla\/5\.0 \([^)]*(Windows|OS X|Linux)[^)]+\) AppleWebKit\/[0-9.]+ \(KHTML, like Gecko\) Chrome\/(\d+)[0-9.]+ (?:Mobile Safari|Safari)\/[0-9.]+$/,safari:/^Mozilla\/5\.0 \([^)]*(Windows|OS X)[^)]+\) AppleWebKit\/[0-9.]+ \(KHTML, like Gecko\)(?: Version\/([0-9]+)[0-9.]+)? Safari\/[0-9.A-Z]+$/,androidChrome:/Android.*(?:; (.*) Build\/).*Chrome\/(\d+)[0-9.]+/,iphone:/ *CPU +iPhone +OS +([0-9]+)_(?:[0-9_])+ +like +Mac +OS +X */,ipad:/\(iPad; *CPU +OS +([0-9]+)_(?:[0-9_])+ +like +Mac +OS +X */,iosClient:/^Mozilla\/5\.0 \(iOS\) (?:ownCloud|Nextcloud)-iOS.*$/,androidClient:/^Mozilla\/5\.0 \(Android\) ownCloud-android.*$/,iosTalkClient:/^Mozilla\/5\.0 \(iOS\) Nextcloud-Talk.*$/,androidTalkClient:/^Mozilla\/5\.0 \(Android\) Nextcloud-Talk.*$/,davx5:/DAV(?:droid|x5)\/([^ ]+)/,webPirate:/(Sailfish).*WebPirate\/(\d+)/,sailfishBrowser:/(Sailfish).*SailfishBrowser\/(\d+)/},f={ie:t("setting","Internet Explorer"),edge:t("setting","Edge"),firefox:t("setting","Firefox"),chrome:t("setting","Google Chrome"),safari:t("setting","Safari"),androidChrome:t("setting","Google Chrome for Android"),iphone:t("setting","iPhone"),ipad:t("setting","iPad"),iosClient:t("setting","{productName} iOS app",{productName:window.oc_defaults.productName}),androidClient:t("setting","{productName} Android app",{productName:window.oc_defaults.productName}),iosTalkClient:t("setting","{productName} Talk for iOS",{productName:window.oc_defaults.productName}),androidTalkClient:t("setting","{productName} Talk for Android",{productName:window.oc_defaults.productName}),davx5:"DAVx5",webPirate:"WebPirate",sailfishBrowser:"SailfishBrowser"},m={ie:"icon-desktop",edge:"icon-desktop",firefox:"icon-desktop",chrome:"icon-desktop",safari:"icon-desktop",androidChrome:"icon-phone",iphone:"icon-phone",ipad:"icon-tablet",iosClient:"icon-phone",androidClient:"icon-phone",iosTalkClient:"icon-phone",androidTalkClient:"icon-phone",davx5:"icon-phone",webPirate:"icon-link",sailfishBrowser:"icon-link"},g={name:"AuthToken",components:{Actions:A.Actions,ActionButton:A.ActionButton,ActionCheckbox:A.ActionCheckbox},props:{token:{type:Object,required:!0}},data:function(){return{showMore:this.token.canScope||this.token.canDelete,renaming:!1,newName:"",actionOpen:!1}},computed:{lastActivityRelative:function(){return OC.Util.relativeModifiedDate(1e3*this.token.lastActivity)},lastActivity:function(){return OC.Util.formatDate(1e3*this.token.lastActivity,"LLL")},iconName:function(){var n=this.token.name.match(/Mozilla\/5\.0 \((\w+)\) (?:mirall|csyncoC)\/(\d+\.\d+\.\d+)/),e="";n&&(this.token.name=t("settings","Sync client - {os}",{os:n[1],version:n[2]}),e="icon-desktop");var o=this.token.name,i=this.token.name;for(var a in h){var r=o.match(h[a]);r&&(i=r[2]&&r[1]?f[a]+" "+r[2]+" - "+r[1]:r[1]?f[a]+" "+r[1]:f[a],e=m[a])}return this.token.current&&(i=t("settings","This session")),{icon:e,name:i}},wiping:function(){return 2===this.token.type}},methods:{startRename:function(){var n=this;this.actionOpen=!1,this.newName=this.token.name,this.renaming=!0,this.$nextTick((function(){n.$refs.input.select()}))},cancelRename:function(){this.renaming=!1},revoke:function(){this.actionOpen=!1,this.$emit("delete",this.token)},rename:function(){this.renaming=!1,this.$emit("rename",this.token,this.newName)},wipe:function(){this.actionOpen=!1,this.$emit("wipe",this.token)}}},v=o(93379),C=o.n(v),k=o(7795),w=o.n(k),y=o(90569),b=o.n(y),x=o(3565),_=o.n(x),T=o(19216),O=o.n(T),P=o(44589),N=o.n(P),B=o(40708),S={};S.styleTagTransform=N(),S.setAttributes=_(),S.insert=b().bind(null,"head"),S.domAPI=w(),S.insertStyleElement=O(),C()(B.Z,S),B.Z&&B.Z.locals&&B.Z.locals;var D=o(51900),E=(0,D.Z)(g,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("tr",{class:n.wiping,attrs:{"data-id":n.token.id}},[e("td",{staticClass:"client"},[e("div",{class:n.iconName.icon})]),n._v(" "),e("td",{staticClass:"token-name"},[n.token.canRename&&n.renaming?e("input",{directives:[{name:"model",rawName:"v-model",value:n.newName,expression:"newName"}],ref:"input",attrs:{type:"text"},domProps:{value:n.newName},on:{keyup:[function(t){return!t.type.indexOf("key")&&n._k(t.keyCode,"enter",13,t.key,"Enter")?null:n.rename.apply(null,arguments)},function(t){return!t.type.indexOf("key")&&n._k(t.keyCode,"esc",27,t.key,["Esc","Escape"])?null:n.cancelRename.apply(null,arguments)}],blur:n.cancelRename,input:function(t){t.target.composing||(n.newName=t.target.value)}}}):e("span",[n._v(n._s(n.iconName.name))]),n._v(" "),n.wiping?e("span",{staticClass:"wiping-warning"},[n._v("("+n._s(n.t("settings","Marked for remote wipe"))+")")]):n._e()]),n._v(" "),e("td",[e("span",{directives:[{name:"tooltip",rawName:"v-tooltip",value:n.lastActivity,expression:"lastActivity"}],staticClass:"last-activity"},[n._v(n._s(n.lastActivityRelative))])]),n._v(" "),e("td",{staticClass:"more"},[n.token.current?n._e():e("Actions",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:{content:n.t("settings","Device settings"),container:"body"},expression:"{\n\t\t\t\tcontent: t('settings', 'Device settings'),\n\t\t\t\tcontainer: 'body'\n\t\t\t}",modifiers:{auto:!0}}],attrs:{open:n.actionOpen},on:{"update:open":function(t){n.actionOpen=t}}},[1===n.token.type?e("ActionCheckbox",{attrs:{checked:n.token.scope.filesystem},on:{change:function(t){return t.stopPropagation(),t.preventDefault(),n.$emit("toggle-scope",n.token,"filesystem",!n.token.scope.filesystem)}}},[n._v("\n\t\t\t\t"+n._s(n.t("settings","Allow filesystem access"))+"\n\t\t\t")]):n._e(),n._v(" "),n.token.canRename?e("ActionButton",{attrs:{icon:"icon-rename"},on:{click:function(t){return t.stopPropagation(),t.preventDefault(),n.startRename.apply(null,arguments)}}},[n._v("\n\t\t\t\t"+n._s(n.t("settings","Rename"))+"\n\t\t\t")]):n._e(),n._v(" "),n.token.canDelete?[2!==n.token.type?[e("ActionButton",{attrs:{icon:"icon-delete"},on:{click:function(t){return t.stopPropagation(),t.preventDefault(),n.revoke.apply(null,arguments)}}},[n._v("\n\t\t\t\t\t\t"+n._s(n.t("settings","Revoke"))+"\n\t\t\t\t\t")]),n._v(" "),e("ActionButton",{attrs:{icon:"icon-delete"},on:{click:function(t){return t.stopPropagation(),t.preventDefault(),n.wipe.apply(null,arguments)}}},[n._v("\n\t\t\t\t\t\t"+n._s(n.t("settings","Wipe device"))+"\n\t\t\t\t\t")])]:2===n.token.type?e("ActionButton",{attrs:{icon:"icon-delete",title:n.t("settings","Revoke")},on:{click:function(t){return t.stopPropagation(),t.preventDefault(),n.revoke.apply(null,arguments)}}},[n._v("\n\t\t\t\t\t"+n._s(n.t("settings","Revoking this token might prevent the wiping of your device if it has not started the wipe yet."))+"\n\t\t\t\t")]):n._e()]:n._e()],2)],1)])}),[],!1,null,"6852e55e",null),R={name:"AuthTokenList",components:{AuthToken:E.exports},props:{tokens:{type:Array,required:!0}},computed:{sortedTokens:function(){return this.tokens.slice().sort((function(n,t){var e=parseInt(n.lastActivity,10);return parseInt(t.lastActivity,10)-e}))}},methods:{toggleScope:function(n,t,e){this.$emit("toggle-scope",n,t,e)},rename:function(n,t){this.$emit("rename",n,t)},onDelete:function(n){this.$emit("delete",n)},onWipe:function(n){this.$emit("wipe",n)}}},$=o(52442),U={};U.styleTagTransform=N(),U.setAttributes=_(),U.insert=b().bind(null,"head"),U.domAPI=w(),U.insertStyleElement=O(),C()($.Z,U),$.Z&&$.Z.locals&&$.Z.locals;var Z=o(47719),M={};M.styleTagTransform=N(),M.setAttributes=_(),M.insert=b().bind(null,"head"),M.domAPI=w(),M.insertStyleElement=O(),C()(Z.Z,M),Z.Z&&Z.Z.locals&&Z.Z.locals;var j=(0,D.Z)(R,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("table",{attrs:{id:"app-tokens-table"}},[n.tokens.length?e("thead",[e("tr",[e("th"),n._v(" "),e("th",[n._v(n._s(n.t("settings","Device")))]),n._v(" "),e("th",[n._v(n._s(n.t("settings","Last activity")))]),n._v(" "),e("th")])]):n._e(),n._v(" "),e("tbody",{staticClass:"token-list"},n._l(n.sortedTokens,(function(t){return e("AuthToken",{key:t.id,attrs:{token:t},on:{"toggle-scope":n.toggleScope,rename:n.rename,delete:n.onDelete,wipe:n.onWipe}})})),1)])}),[],!1,null,"4f8ceff3",null).exports,q=o(147),W=o.n(q),G=o(1412),L=o.n(G);function I(n,t){var e=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(n,t).enumerable}))),e.push.apply(e,o)}return e}function z(n){for(var t=1;t<arguments.length;t++){var e=null!=arguments[t]?arguments[t]:{};t%2?I(Object(e),!0).forEach((function(t){F(n,t,e[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(e)):I(Object(e)).forEach((function(t){Object.defineProperty(n,t,Object.getOwnPropertyDescriptor(e,t))}))}return n}function F(n,t,e){return t in n?Object.defineProperty(n,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):n[t]=e,n}var Q={name:"AuthTokenSetupDialogue",components:{QR:W(),Button:L()},props:{add:{type:Function,required:!0}},data:function(){return{adding:!1,loading:!1,deviceName:"",appPassword:"",loginName:"",passwordCopied:!1,showQR:!1,qrUrl:"",hoveringCopyButton:!1}},computed:{copyTooltipOptions:function(){var n={hideOnTargetClick:!1,trigger:"manual"};return this.passwordCopied?z(z({},n),{},{content:t("settings","Copied!"),show:!0}):z(z({},n),{},{content:t("settings","Copy"),show:this.hoveringCopyButton})}},methods:{selectInput:function(n){n.currentTarget.select()},submit:function(){var n=this;d()().then((function(){return n.loading=!0,n.add(n.deviceName)})).then((function(t){n.adding=!0,n.loginName=t.loginName,n.appPassword=t.token;var e=window.location.protocol+"//"+window.location.host+(0,u.getRootUrl)();n.qrUrl="nc://login/user:".concat(t.loginName,"&password:").concat(t.token,"&server:").concat(e),n.$nextTick((function(){n.$refs.appPassword.select()}))})).catch((function(e){console.error("could not create a new app password",e),OC.Notification.showTemporary(t("settings","Error while creating device token")),n.reset()}))},onCopyPassword:function(){var n=this;this.passwordCopied=!0,this.$refs.clipboardButton.blur(),setTimeout((function(){n.passwordCopied=!1}),3e3)},onCopyPasswordFailed:function(){OC.Notification.showTemporary(t("settings","Could not copy app password. Please copy it manually."))},reset:function(){this.adding=!1,this.loading=!1,this.showQR=!1,this.qrUrl="",this.deviceName="",this.appPassword="",this.loginName=""}}},K=o(97127),H={};H.styleTagTransform=N(),H.setAttributes=_(),H.insert=b().bind(null,"head"),H.domAPI=w(),H.insertStyleElement=O(),C()(K.Z,H),K.Z&&K.Z.locals&&K.Z.locals;var X=(0,D.Z)(Q,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return n.adding?e("div",[n._v("\n\t"+n._s(n.t("settings","Use the credentials below to configure your app or device."))+"\n\t"+n._s(n.t("settings","For security reasons this password will only be shown once."))+"\n\t"),e("div",{staticClass:"app-password-row"},[e("span",{staticClass:"app-password-label"},[n._v(n._s(n.t("settings","Username")))]),n._v(" "),e("input",{staticClass:"monospaced",attrs:{type:"text",readonly:"readonly"},domProps:{value:n.loginName},on:{focus:n.selectInput}})]),n._v(" "),e("div",{staticClass:"app-password-row"},[e("span",{staticClass:"app-password-label"},[n._v(n._s(n.t("settings","Password")))]),n._v(" "),e("input",{ref:"appPassword",staticClass:"monospaced",attrs:{type:"text",readonly:"readonly"},domProps:{value:n.appPassword},on:{focus:n.selectInput}}),n._v(" "),e("a",{directives:[{name:"tooltip",rawName:"v-tooltip",value:n.copyTooltipOptions,expression:"copyTooltipOptions"},{name:"clipboard",rawName:"v-clipboard:copy",value:n.appPassword,expression:"appPassword",arg:"copy"},{name:"clipboard",rawName:"v-clipboard:success",value:n.onCopyPassword,expression:"onCopyPassword",arg:"success"},{name:"clipboard",rawName:"v-clipboard:error",value:n.onCopyPasswordFailed,expression:"onCopyPasswordFailed",arg:"error"}],ref:"clipboardButton",staticClass:"icon icon-clippy",on:{mouseover:function(t){n.hoveringCopyButton=!0},mouseleave:function(t){n.hoveringCopyButton=!1}}}),n._v(" "),e("Button",{on:{click:n.reset}},[n._v("\n\t\t\t"+n._s(n.t("settings","Done"))+"\n\t\t")])],1),n._v(" "),e("div",{staticClass:"app-password-row"},[e("span",{staticClass:"app-password-label"}),n._v(" "),n.showQR?e("QR",{attrs:{value:n.qrUrl}}):e("a",{on:{click:function(t){n.showQR=!0}}},[n._v("\n\t\t\t"+n._s(n.t("settings","Show QR code for mobile apps"))+"\n\t\t")])],1)]):e("div",[e("input",{directives:[{name:"model",rawName:"v-model",value:n.deviceName,expression:"deviceName"}],attrs:{type:"text",maxlength:120,disabled:n.loading,placeholder:n.t("settings","App name")},domProps:{value:n.deviceName},on:{keydown:function(t){return!t.type.indexOf("key")&&n._k(t.keyCode,"enter",13,t.key,"Enter")?null:n.submit.apply(null,arguments)},input:function(t){t.target.composing||(n.deviceName=t.target.value)}}}),n._v(" "),e("Button",{attrs:{disabled:n.loading},on:{click:n.submit}},[n._v("\n\t\t"+n._s(n.t("settings","Create new app password"))+"\n\t")])],1)}),[],!1,null,"6a24fa34",null),V=X.exports;function J(n,t,e,o,i,a,r){try{var s=n[a](r),c=s.value}catch(n){return void e(n)}s.done?t(c):Promise.resolve(c).then(o,i)}var Y=function(n){return function(t){return n(t),t}},nn={name:"AuthTokenSection",components:{AuthTokenSetupDialogue:V,AuthTokenList:j},props:{tokens:{type:Array,required:!0},canCreateToken:{type:Boolean,required:!0}},data:function(){return{baseUrl:(0,u.generateUrl)("/settings/personal/authtokens")}},methods:{addNewToken:function(n){var e=this;console.debug("creating a new app token",n);var o={name:n};return p.default.post(this.baseUrl,o).then((function(n){return n.data})).then(Y((function(){return console.debug("app token created")}))).then(Y((function(n){return e.tokens.push(n.deviceToken)}))).catch((function(n){throw console.error.bind("could not create app password",n),OC.Notification.showTemporary(t("settings","Error while creating device token")),n}))},toggleTokenScope:function(n,e,o){console.debug("updating app token scope",n.id,e,o);var i=n.scope[e];return n.scope[e]=o,this.updateToken(n).then(Y((function(){return console.debug("app token scope updated")}))).catch((function(o){throw console.error.bind("could not update app token scope",o),OC.Notification.showTemporary(t("settings","Error while updating device token scope")),n.scope[e]=i,o}))},rename:function(n,e){console.debug("renaming app token",n.id,n.name,e);var o=n.name;return n.name=e,this.updateToken(n).then(Y((function(){return console.debug("app token name updated")}))).catch((function(e){console.error.bind("could not update app token name",e),OC.Notification.showTemporary(t("settings","Error while updating device token name")),n.name=o}))},updateToken:function(n){return p.default.put(this.baseUrl+"/"+n.id,n).then((function(n){return n.data}))},deleteToken:function(n){var e=this;return console.debug("deleting app token",n),this.tokens=this.tokens.filter((function(t){return t!==n})),p.default.delete(this.baseUrl+"/"+n.id).then((function(n){return n.data})).then(Y((function(){return console.debug("app token deleted")}))).catch((function(o){console.error.bind("could not delete app token",o),OC.Notification.showTemporary(t("settings","Error while deleting the token")),e.tokens.push(n)}))},wipeToken:function(n){var e,o=this;return(e=regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return console.debug("wiping app token",n),e.prev=1,e.next=4,d()();case 4:return e.next=6,new Promise((function(n){OC.dialogs.confirm(t("settings","Do you really want to wipe your data from this device?"),t("settings","Confirm wipe"),n,!0)}));case 6:if(e.sent){e.next=9;break}return console.debug("wipe aborted by user"),e.abrupt("return");case 9:return e.next=11,p.default.post(o.baseUrl+"/wipe/"+n.id);case 11:console.debug("app token marked for wipe"),n.type=2,e.next=19;break;case 15:e.prev=15,e.t0=e.catch(1),console.error("could not wipe app token",e.t0),OC.Notification.showTemporary(t("settings","Error while wiping the device with the token"));case 19:case"end":return e.stop()}}),e,null,[[1,15]])})),function(){var n=this,t=arguments;return new Promise((function(o,i){var a=e.apply(n,t);function r(n){J(a,o,i,r,s,"next",n)}function s(n){J(a,o,i,r,s,"throw",n)}r(void 0)}))})()}}},tn=nn,en=(0,D.Z)(tn,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("div",{staticClass:"section",attrs:{id:"security"}},[e("h2",[n._v(n._s(n.t("settings","Devices & sessions",{},void 0,{sanitize:!1})))]),n._v(" "),e("p",{staticClass:"settings-hint hidden-when-empty"},[n._v("\n\t\t"+n._s(n.t("settings","Web, desktop and mobile clients currently logged in to your account."))+"\n\t")]),n._v(" "),e("AuthTokenList",{attrs:{tokens:n.tokens},on:{"toggle-scope":n.toggleTokenScope,rename:n.rename,delete:n.deleteToken,wipe:n.wipeToken}}),n._v(" "),n.canCreateToken?e("AuthTokenSetupDialogue",{attrs:{add:n.addNewToken}}):n._e()],1)}),[],!1,null,"451cdc4a",null).exports;o.nc=btoa(OC.requestToken),a.default.use(s()),a.default.use(c.default,{defaultHtml:!1}),a.default.prototype.t=t,new(a.default.extend(en))({propsData:{tokens:(0,i.loadState)("settings","app_tokens"),canCreateToken:(0,i.loadState)("settings","can_create_app_token")}}).$mount("#security-authtokens")},40708:function(n,t,e){var o=e(87537),i=e.n(o),a=e(23645),r=e.n(a)()(i());r.push([n.id,".wiping[data-v-6852e55e]{background-color:var(--color-background-darker)}td[data-v-6852e55e]{border-top:1px solid var(--color-border);max-width:200px;white-space:normal;vertical-align:middle;position:relative}td.client[data-v-6852e55e],td.more[data-v-6852e55e]{overflow:visible;position:relative;width:44px;height:44px}td.token-name[data-v-6852e55e]{padding:10px 6px}td.token-name.token-rename[data-v-6852e55e]{padding:0}td.token-name input[data-v-6852e55e]{width:100%;margin:0}td.token-name .wiping-warning[data-v-6852e55e]{color:var(--color-text-lighter)}td.more[data-v-6852e55e]{padding:0 10px}td.client div[data-v-6852e55e]{opacity:.57;width:44px;height:44px}","",{version:3,sources:["webpack://./apps/settings/src/components/AuthToken.vue"],names:[],mappings:"AAiQA,yBACC,+CAAA,CAGD,oBACC,wCAAA,CACA,eAAA,CACA,kBAAA,CACA,qBAAA,CACA,iBAAA,CAEA,oDACC,gBAAA,CACA,iBAAA,CACA,UAAA,CACA,WAAA,CAGD,+BACC,gBAAA,CAEA,4CACC,SAAA,CAGD,qCACC,UAAA,CACA,QAAA,CAGF,+CACC,+BAAA,CAGD,yBAEC,cAAA,CAMA,+BACC,WAAA,CACA,UAAA,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\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.wiping {\n\tbackground-color: var(--color-background-darker);\n}\n\ntd {\n\tborder-top: 1px solid var(--color-border);\n\tmax-width: 200px;\n\twhite-space: normal;\n\tvertical-align: middle;\n\tposition: relative;\n\n\t&%icon {\n\t\toverflow: visible;\n\t\tposition: relative;\n\t\twidth: 44px;\n\t\theight: 44px;\n\t}\n\n\t&.token-name {\n\t\tpadding: 10px 6px;\n\n\t\t&.token-rename {\n\t\t\tpadding: 0;\n\t\t}\n\n\t\tinput {\n\t\t\twidth: 100%;\n\t\t\tmargin: 0;\n\t\t}\n\t}\n\t&.token-name .wiping-warning {\n\t\tcolor: var(--color-text-lighter);\n\t}\n\n\t&.more {\n\t\t@extend %icon;\n\t\tpadding: 0 10px;\n\t}\n\n\t&.client {\n\t\t@extend %icon;\n\n\t\tdiv {\n\t\t\topacity: 0.57;\n\t\t\twidth: 44px;\n\t\t\theight: 44px;\n\t\t}\n\t}\n}\n"],sourceRoot:""}]),t.Z=r},52442:function(n,t,e){var o=e(87537),i=e.n(o),a=e(23645),r=e.n(a)()(i());r.push([n.id,"table[data-v-4f8ceff3]{width:100%;min-height:50px;padding-top:5px;max-width:580px}table th[data-v-4f8ceff3]{opacity:.5;padding:10px 0}.token-list td>a.icon-more[data-v-4f8ceff3]{transition:opacity var(--animation-quick)}.token-list a.icon-more[data-v-4f8ceff3]{padding:14px;display:block;width:44px;height:44px;opacity:.5}.token-list tr:hover td>a.icon[data-v-4f8ceff3],.token-list tr td>a.icon[data-v-4f8ceff3]:focus,.token-list tr.active td>a.icon[data-v-4f8ceff3]{opacity:1}","",{version:3,sources:["webpack://./apps/settings/src/components/AuthTokenList.vue"],names:[],mappings:"AAwFA,uBACC,UAAA,CACA,eAAA,CACA,eAAA,CACA,eAAA,CAEA,0BACC,UAAA,CACA,cAAA,CAKD,4CACC,yCAAA,CAGD,yCACC,YAAA,CACA,aAAA,CACA,UAAA,CACA,WAAA,CACA,UAAA,CAIA,iJAGC,SAAA",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\ntable {\n\twidth: 100%;\n\tmin-height: 50px;\n\tpadding-top: 5px;\n\tmax-width: 580px;\n\n\tth {\n\t\topacity: .5;\n\t\tpadding: 10px 0;\n\t}\n}\n\n.token-list {\n\ttd > a.icon-more {\n\t\ttransition: opacity var(--animation-quick);\n\t}\n\n\ta.icon-more {\n\t\tpadding: 14px;\n\t\tdisplay: block;\n\t\twidth: 44px;\n\t\theight: 44px;\n\t\topacity: .5;\n\t}\n\n\ttr {\n\t\t&:hover td > a.icon,\n\t\ttd > a.icon:focus,\n\t\t&.active td > a.icon {\n\t\t\topacity: 1;\n\t\t}\n\t}\n}\n"],sourceRoot:""}]),t.Z=r},47719:function(n,t,e){var o=e(87537),i=e.n(o),a=e(23645),r=e.n(a)()(i());r.push([n.id,"#app-tokens-table tr>*:nth-child(2){padding-left:6px}#app-tokens-table tr>*:nth-child(3){text-align:right}","",{version:3,sources:["webpack://./apps/settings/src/components/AuthTokenList.vue"],names:[],mappings:"AA8HC,oCACC,gBAAA,CAGD,oCACC,gBAAA",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#app-tokens-table {\n\ttr > *:nth-child(2) {\n\t\tpadding-left: 6px;\n\t}\n\n\ttr > *:nth-child(3) {\n\t\ttext-align: right;\n\t}\n}\n"],sourceRoot:""}]),t.Z=r},97127:function(n,t,e){var o=e(87537),i=e.n(o),a=e(23645),r=e.n(a)()(i());r.push([n.id,".app-password-row[data-v-6a24fa34]{display:table-row}.app-password-row .icon[data-v-6a24fa34]{background-size:16px 16px;display:inline-block;position:relative;top:3px;margin-left:5px;margin-right:8px}.app-password-label[data-v-6a24fa34]{display:table-cell;padding-right:1em;text-align:right;vertical-align:middle}.monospaced[data-v-6a24fa34]{width:245px;font-family:monospace}.button-vue[data-v-6a24fa34]{display:inline-block;margin:3px 3px 3px 3px}","",{version:3,sources:["webpack://./apps/settings/src/components/AuthTokenSetupDialogue.vue"],names:[],mappings:"AAqLA,mCACC,iBAAA,CAEA,yCACC,yBAAA,CACA,oBAAA,CACA,iBAAA,CACA,OAAA,CACA,eAAA,CACA,gBAAA,CAKF,qCACC,kBAAA,CACA,iBAAA,CACA,gBAAA,CACA,qBAAA,CAGD,6BACC,WAAA,CACA,qBAAA,CAGD,6BACC,oBAAA,CACA,sBAAA",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.app-password-row {\n\tdisplay: table-row;\n\n\t.icon {\n\t\tbackground-size: 16px 16px;\n\t\tdisplay: inline-block;\n\t\tposition: relative;\n\t\ttop: 3px;\n\t\tmargin-left: 5px;\n\t\tmargin-right: 8px;\n\t}\n\n}\n\n.app-password-label {\n\tdisplay: table-cell;\n\tpadding-right: 1em;\n\ttext-align: right;\n\tvertical-align: middle;\n}\n\n.monospaced {\n\twidth: 245px;\n\tfont-family: monospace;\n}\n\n.button-vue{\n\tdisplay:inline-block;\n\tmargin: 3px 3px 3px 3px;\n}\n\n"],sourceRoot:""}]),t.Z=r}},o={};function i(n){var t=o[n];if(void 0!==t)return t.exports;var a=o[n]={id:n,loaded:!1,exports:{}};return e[n].call(a.exports,a,a.exports,i),a.loaded=!0,a.exports}i.m=e,i.amdD=function(){throw new Error("define cannot be used indirect")},i.amdO={},n=[],i.O=function(t,e,o,a){if(!e){var r=1/0;for(l=0;l<n.length;l++){e=n[l][0],o=n[l][1],a=n[l][2];for(var s=!0,c=0;c<e.length;c++)(!1&a||r>=a)&&Object.keys(i.O).every((function(n){return i.O[n](e[c])}))?e.splice(c--,1):(s=!1,a<r&&(r=a));if(s){n.splice(l--,1);var p=o();void 0!==p&&(t=p)}}return t}a=a||0;for(var l=n.length;l>0&&n[l-1][2]>a;l--)n[l]=n[l-1];n[l]=[e,o,a]},i.n=function(n){var t=n&&n.__esModule?function(){return n.default}:function(){return n};return i.d(t,{a:t}),t},i.d=function(n,t){for(var e in t)i.o(t,e)&&!i.o(n,e)&&Object.defineProperty(n,e,{enumerable:!0,get:t[e]})},i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(n){if("object"==typeof window)return window}}(),i.o=function(n,t){return Object.prototype.hasOwnProperty.call(n,t)},i.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},i.nmd=function(n){return n.paths=[],n.children||(n.children=[]),n},i.j=4783,function(){i.b=document.baseURI||self.location.href;var n={4783:0};i.O.j=function(t){return 0===n[t]};var t=function(t,e){var o,a,r=e[0],s=e[1],c=e[2],p=0;if(r.some((function(t){return 0!==n[t]}))){for(o in s)i.o(s,o)&&(i.m[o]=s[o]);if(c)var l=c(i)}for(t&&t(e);p<r.length;p++)a=r[p],i.o(n,a)&&n[a]&&n[a][0](),n[a]=0;return i.O(l)},e=self.webpackChunknextcloud=self.webpackChunknextcloud||[];e.forEach(t.bind(null,0)),e.push=t.bind(null,e.push.bind(e))}();var a=i.O(void 0,[7874],(function(){return i(73887)}));a=i.O(a)}(); +//# sourceMappingURL=settings-vue-settings-personal-security.js.map?v=3b1e3f5abbf256b27ae0
\ No newline at end of file diff --git a/dist/settings-vue-settings-personal-security.js.map b/dist/settings-vue-settings-personal-security.js.map index 449c7747223..6aa2d958596 100644 --- a/dist/settings-vue-settings-personal-security.js.map +++ b/dist/settings-vue-settings-personal-security.js.map @@ -1 +1 @@ -{"version":3,"file":"settings-vue-settings-personal-security.js?v=6cf20d6b95ebfa4d0b73","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/apps/settings/src/components/AuthToken.vue","webpack:///nextcloud/apps/settings/src/components/AuthToken.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/settings/src/components/AuthToken.vue?a4c8","webpack://nextcloud/./apps/settings/src/components/AuthToken.vue?1338","webpack:///nextcloud/apps/settings/src/components/AuthToken.vue?vue&type=template&id=6852e55e&scoped=true&","webpack:///nextcloud/apps/settings/src/components/AuthTokenList.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/settings/src/components/AuthTokenList.vue","webpack://nextcloud/./apps/settings/src/components/AuthTokenList.vue?f7c9","webpack://nextcloud/./apps/settings/src/components/AuthTokenList.vue?515d","webpack://nextcloud/./apps/settings/src/components/AuthTokenList.vue?90cb","webpack:///nextcloud/apps/settings/src/components/AuthTokenList.vue?vue&type=template&id=4f8ceff3&scoped=true&","webpack:///nextcloud/apps/settings/src/components/AuthTokenSetupDialogue.vue","webpack:///nextcloud/apps/settings/src/components/AuthTokenSetupDialogue.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/settings/src/components/AuthTokenSetupDialogue.vue?8d9e","webpack://nextcloud/./apps/settings/src/components/AuthTokenSetupDialogue.vue?521c","webpack:///nextcloud/apps/settings/src/components/AuthTokenSetupDialogue.vue?vue&type=template&id=c67d1466&scoped=true&","webpack:///nextcloud/apps/settings/src/components/AuthTokenSection.vue","webpack:///nextcloud/apps/settings/src/components/AuthTokenSection.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/settings/src/components/AuthTokenSection.vue?e9d0","webpack:///nextcloud/apps/settings/src/components/AuthTokenSection.vue?vue&type=template&id=451cdc4a&scoped=true&","webpack:///nextcloud/apps/settings/src/main-personal-security.js","webpack:///nextcloud/apps/settings/src/components/AuthToken.vue?vue&type=style&index=0&id=6852e55e&lang=scss&scoped=true&","webpack:///nextcloud/apps/settings/src/components/AuthTokenList.vue?vue&type=style&index=0&id=4f8ceff3&lang=scss&scoped=true&","webpack:///nextcloud/apps/settings/src/components/AuthTokenList.vue?vue&type=style&index=1&lang=scss&","webpack:///nextcloud/apps/settings/src/components/AuthTokenSetupDialogue.vue?vue&type=style&index=0&id=c67d1466&lang=scss&scoped=true&","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/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 2019 Christoph Wurst <christoph@winzerhof-wurst.at>\n -\n - @author 2019 Christoph Wurst <christoph@winzerhof-wurst.at>\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<template>\n\t<tr :data-id=\"token.id\"\n\t\t:class=\"wiping\">\n\t\t<td class=\"client\">\n\t\t\t<div :class=\"iconName.icon\" />\n\t\t</td>\n\t\t<td class=\"token-name\">\n\t\t\t<input v-if=\"token.canRename && renaming\"\n\t\t\t\tref=\"input\"\n\t\t\t\tv-model=\"newName\"\n\t\t\t\ttype=\"text\"\n\t\t\t\t@keyup.enter=\"rename\"\n\t\t\t\t@blur=\"cancelRename\"\n\t\t\t\t@keyup.esc=\"cancelRename\">\n\t\t\t<span v-else>{{ iconName.name }}</span>\n\t\t\t<span v-if=\"wiping\" class=\"wiping-warning\">({{ t('settings', 'Marked for remote wipe') }})</span>\n\t\t</td>\n\t\t<td>\n\t\t\t<span v-tooltip=\"lastActivity\" class=\"last-activity\">{{ lastActivityRelative }}</span>\n\t\t</td>\n\t\t<td class=\"more\">\n\t\t\t<Actions v-if=\"!token.current\"\n\t\t\t\tv-tooltip.auto=\"{\n\t\t\t\t\tcontent: t('settings', 'Device settings'),\n\t\t\t\t\tcontainer: 'body'\n\t\t\t\t}\"\n\t\t\t\t:open.sync=\"actionOpen\">\n\t\t\t\t<ActionCheckbox v-if=\"token.type === 1\"\n\t\t\t\t\t:checked=\"token.scope.filesystem\"\n\t\t\t\t\t@change.stop.prevent=\"$emit('toggle-scope', token, 'filesystem', !token.scope.filesystem)\">\n\t\t\t\t\t<!-- TODO: add text/longtext with some description -->\n\t\t\t\t\t{{ t('settings', 'Allow filesystem access') }}\n\t\t\t\t</ActionCheckbox>\n\t\t\t\t<ActionButton v-if=\"token.canRename\"\n\t\t\t\t\ticon=\"icon-rename\"\n\t\t\t\t\t@click.stop.prevent=\"startRename\">\n\t\t\t\t\t<!-- TODO: add text/longtext with some description -->\n\t\t\t\t\t{{ t('settings', 'Rename') }}\n\t\t\t\t</ActionButton>\n\n\t\t\t\t<!-- revoke & wipe -->\n\t\t\t\t<template v-if=\"token.canDelete\">\n\t\t\t\t\t<template v-if=\"token.type !== 2\">\n\t\t\t\t\t\t<ActionButton icon=\"icon-delete\"\n\t\t\t\t\t\t\t@click.stop.prevent=\"revoke\">\n\t\t\t\t\t\t\t<!-- TODO: add text/longtext with some description -->\n\t\t\t\t\t\t\t{{ t('settings', 'Revoke') }}\n\t\t\t\t\t\t</ActionButton>\n\t\t\t\t\t\t<ActionButton icon=\"icon-delete\"\n\t\t\t\t\t\t\t@click.stop.prevent=\"wipe\">\n\t\t\t\t\t\t\t{{ t('settings', 'Wipe device') }}\n\t\t\t\t\t\t</ActionButton>\n\t\t\t\t\t</template>\n\t\t\t\t\t<ActionButton v-else-if=\"token.type === 2\"\n\t\t\t\t\t\ticon=\"icon-delete\"\n\t\t\t\t\t\t:title=\"t('settings', 'Revoke')\"\n\t\t\t\t\t\t@click.stop.prevent=\"revoke\">\n\t\t\t\t\t\t{{ t('settings', 'Revoking this token might prevent the wiping of your device if it has not started the wipe yet.') }}\n\t\t\t\t\t</ActionButton>\n\t\t\t\t</template>\n\t\t\t</Actions>\n\t\t</td>\n\t</tr>\n</template>\n\n<script>\nimport {\n\tActions,\n\tActionButton,\n\tActionCheckbox,\n} from '@nextcloud/vue'\n\n// When using capture groups the following parts are extracted the first is used as the version number, the second as the OS\nconst userAgentMap = {\n\tie: /(?:MSIE|Trident|Trident\\/7.0; rv)[ :](\\d+)/,\n\t// Microsoft Edge User Agent from https://msdn.microsoft.com/en-us/library/hh869301(v=vs.85).aspx\n\tedge: /^Mozilla\\/5\\.0 \\([^)]+\\) AppleWebKit\\/[0-9.]+ \\(KHTML, like Gecko\\) Chrome\\/[0-9.]+ (?:Mobile Safari|Safari)\\/[0-9.]+ Edge\\/[0-9.]+$/,\n\t// Firefox User Agent from https://developer.mozilla.org/en-US/docs/Web/HTTP/Gecko_user_agent_string_reference\n\tfirefox: /^Mozilla\\/5\\.0 \\([^)]*(Windows|OS X|Linux)[^)]+\\) Gecko\\/[0-9.]+ Firefox\\/(\\d+)(?:\\.\\d)?$/,\n\t// Chrome User Agent from https://developer.chrome.com/multidevice/user-agent\n\tchrome: /^Mozilla\\/5\\.0 \\([^)]*(Windows|OS X|Linux)[^)]+\\) AppleWebKit\\/[0-9.]+ \\(KHTML, like Gecko\\) Chrome\\/(\\d+)[0-9.]+ (?:Mobile Safari|Safari)\\/[0-9.]+$/,\n\t// Safari User Agent from http://www.useragentstring.com/pages/Safari/\n\tsafari: /^Mozilla\\/5\\.0 \\([^)]*(Windows|OS X)[^)]+\\) AppleWebKit\\/[0-9.]+ \\(KHTML, like Gecko\\)(?: Version\\/([0-9]+)[0-9.]+)? Safari\\/[0-9.A-Z]+$/,\n\t// Android Chrome user agent: https://developers.google.com/chrome/mobile/docs/user-agent\n\tandroidChrome: /Android.*(?:; (.*) Build\\/).*Chrome\\/(\\d+)[0-9.]+/,\n\tiphone: / *CPU +iPhone +OS +([0-9]+)_(?:[0-9_])+ +like +Mac +OS +X */,\n\tipad: /\\(iPad; *CPU +OS +([0-9]+)_(?:[0-9_])+ +like +Mac +OS +X */,\n\tiosClient: /^Mozilla\\/5\\.0 \\(iOS\\) (?:ownCloud|Nextcloud)-iOS.*$/,\n\tandroidClient: /^Mozilla\\/5\\.0 \\(Android\\) ownCloud-android.*$/,\n\tiosTalkClient: /^Mozilla\\/5\\.0 \\(iOS\\) Nextcloud-Talk.*$/,\n\tandroidTalkClient: /^Mozilla\\/5\\.0 \\(Android\\) Nextcloud-Talk.*$/,\n\t// DAVx5/3.3.8-beta2-gplay (2021/01/02; dav4jvm; okhttp/4.9.0) Android/10\n\tdavx5: /DAV(?:droid|x5)\\/([^ ]+)/,\n\t// Mozilla/5.0 (U; Linux; Maemo; Jolla; Sailfish; like Android 4.3) AppleWebKit/538.1 (KHTML, like Gecko) WebPirate/2.0 like Mobile Safari/538.1 (compatible)\n\twebPirate: /(Sailfish).*WebPirate\\/(\\d+)/,\n\t// Mozilla/5.0 (Maemo; Linux; U; Jolla; Sailfish; Mobile; rv:31.0) Gecko/31.0 Firefox/31.0 SailfishBrowser/1.0\n\tsailfishBrowser: /(Sailfish).*SailfishBrowser\\/(\\d+)/,\n}\nconst nameMap = {\n\tie: t('setting', 'Internet Explorer'),\n\tedge: t('setting', 'Edge'),\n\tfirefox: t('setting', 'Firefox'),\n\tchrome: t('setting', 'Google Chrome'),\n\tsafari: t('setting', 'Safari'),\n\tandroidChrome: t('setting', 'Google Chrome for Android'),\n\tiphone: t('setting', 'iPhone'),\n\tipad: t('setting', 'iPad'),\n\tiosClient: t('setting', '{productName} iOS app', { productName: window.oc_defaults.productName }),\n\tandroidClient: t('setting', '{productName} Android app', { productName: window.oc_defaults.productName }),\n\tiosTalkClient: t('setting', '{productName} Talk for iOS', { productName: window.oc_defaults.productName }),\n\tandroidTalkClient: t('setting', '{productName} Talk for Android', { productName: window.oc_defaults.productName }),\n\tdavx5: 'DAVx5',\n\twebPirate: 'WebPirate',\n\tsailfishBrowser: 'SailfishBrowser',\n}\nconst iconMap = {\n\tie: 'icon-desktop',\n\tedge: 'icon-desktop',\n\tfirefox: 'icon-desktop',\n\tchrome: 'icon-desktop',\n\tsafari: 'icon-desktop',\n\tandroidChrome: 'icon-phone',\n\tiphone: 'icon-phone',\n\tipad: 'icon-tablet',\n\tiosClient: 'icon-phone',\n\tandroidClient: 'icon-phone',\n\tiosTalkClient: 'icon-phone',\n\tandroidTalkClient: 'icon-phone',\n\tdavx5: 'icon-phone',\n\twebPirate: 'icon-link',\n\tsailfishBrowser: 'icon-link',\n}\n\nexport default {\n\tname: 'AuthToken',\n\tcomponents: {\n\t\tActions,\n\t\tActionButton,\n\t\tActionCheckbox,\n\t},\n\tprops: {\n\t\ttoken: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tshowMore: this.token.canScope || this.token.canDelete,\n\t\t\trenaming: false,\n\t\t\tnewName: '',\n\t\t\tactionOpen: false,\n\t\t}\n\t},\n\tcomputed: {\n\t\tlastActivityRelative() {\n\t\t\treturn OC.Util.relativeModifiedDate(this.token.lastActivity * 1000)\n\t\t},\n\t\tlastActivity() {\n\t\t\treturn OC.Util.formatDate(this.token.lastActivity * 1000, 'LLL')\n\t\t},\n\t\ticonName() {\n\t\t\t// pretty format sync client user agent\n\t\t\tconst matches = this.token.name.match(/Mozilla\\/5\\.0 \\((\\w+)\\) (?:mirall|csyncoC)\\/(\\d+\\.\\d+\\.\\d+)/)\n\n\t\t\tlet icon = ''\n\t\t\tif (matches) {\n\t\t\t\t/* eslint-disable-next-line */\n\t\t\t\tthis.token.name = t('settings', 'Sync client - {os}', {\n\t\t\t\t\tos: matches[1],\n\t\t\t\t\tversion: matches[2],\n\t\t\t\t})\n\t\t\t\ticon = 'icon-desktop'\n\t\t\t}\n\n\t\t\t// preserve title for cases where we format it further\n\t\t\tconst title = this.token.name\n\t\t\tlet name = this.token.name\n\t\t\tfor (const client in userAgentMap) {\n\t\t\t\tconst matches = title.match(userAgentMap[client])\n\t\t\t\tif (matches) {\n\t\t\t\t\tif (matches[2] && matches[1]) { // version number and os\n\t\t\t\t\t\tname = nameMap[client] + ' ' + matches[2] + ' - ' + matches[1]\n\t\t\t\t\t} else if (matches[1]) { // only version number\n\t\t\t\t\t\tname = nameMap[client] + ' ' + matches[1]\n\t\t\t\t\t} else {\n\t\t\t\t\t\tname = nameMap[client]\n\t\t\t\t\t}\n\n\t\t\t\t\ticon = iconMap[client]\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.token.current) {\n\t\t\t\tname = t('settings', 'This session')\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ticon,\n\t\t\t\tname,\n\t\t\t}\n\t\t},\n\t\twiping() {\n\t\t\treturn this.token.type === 2\n\t\t},\n\t},\n\tmethods: {\n\t\tstartRename() {\n\t\t\t// Close action (popover menu)\n\t\t\tthis.actionOpen = false\n\n\t\t\tthis.newName = this.token.name\n\t\t\tthis.renaming = true\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis.$refs.input.select()\n\t\t\t})\n\t\t},\n\t\tcancelRename() {\n\t\t\tthis.renaming = false\n\t\t},\n\t\trevoke() {\n\t\t\tthis.actionOpen = false\n\t\t\tthis.$emit('delete', this.token)\n\t\t},\n\t\trename() {\n\t\t\tthis.renaming = false\n\t\t\tthis.$emit('rename', this.token, this.newName)\n\t\t},\n\t\twipe() {\n\t\t\tthis.actionOpen = false\n\t\t\tthis.$emit('wipe', this.token)\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n\t.wiping {\n\t\tbackground-color: var(--color-background-darker);\n\t}\n\n\ttd {\n\t\tborder-top: 1px solid var(--color-border);\n\t\tmax-width: 200px;\n\t\twhite-space: normal;\n\t\tvertical-align: middle;\n\t\tposition: relative;\n\n\t\t&%icon {\n\t\t\toverflow: visible;\n\t\t\tposition: relative;\n\t\t\twidth: 44px;\n\t\t\theight: 44px;\n\t\t}\n\n\t\t&.token-name {\n\t\t\tpadding: 10px 6px;\n\n\t\t\t&.token-rename {\n\t\t\t\tpadding: 0;\n\t\t\t}\n\n\t\t\tinput {\n\t\t\t\twidth: 100%;\n\t\t\t\tmargin: 0;\n\t\t\t}\n\t\t}\n\t\t&.token-name .wiping-warning {\n\t\t\tcolor: var(--color-text-lighter);\n\t\t}\n\n\t\t&.more {\n\t\t\t@extend %icon;\n\t\t\tpadding: 0 10px;\n\t\t}\n\n\t\t&.client {\n\t\t\t@extend %icon;\n\n\t\t\tdiv {\n\t\t\t\topacity: 0.57;\n\t\t\t\twidth: 44px;\n\t\t\t\theight: 44px;\n\t\t\t}\n\t\t}\n\t}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AuthToken.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!./AuthToken.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!./AuthToken.vue?vue&type=style&index=0&id=6852e55e&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!./AuthToken.vue?vue&type=style&index=0&id=6852e55e&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AuthToken.vue?vue&type=template&id=6852e55e&scoped=true&\"\nimport script from \"./AuthToken.vue?vue&type=script&lang=js&\"\nexport * from \"./AuthToken.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AuthToken.vue?vue&type=style&index=0&id=6852e55e&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 \"6852e55e\",\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('tr',{class:_vm.wiping,attrs:{\"data-id\":_vm.token.id}},[_c('td',{staticClass:\"client\"},[_c('div',{class:_vm.iconName.icon})]),_vm._v(\" \"),_c('td',{staticClass:\"token-name\"},[(_vm.token.canRename && _vm.renaming)?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.newName),expression:\"newName\"}],ref:\"input\",attrs:{\"type\":\"text\"},domProps:{\"value\":(_vm.newName)},on:{\"keyup\":[function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.rename.apply(null, arguments)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"esc\",27,$event.key,[\"Esc\",\"Escape\"])){ return null; }return _vm.cancelRename.apply(null, arguments)}],\"blur\":_vm.cancelRename,\"input\":function($event){if($event.target.composing){ return; }_vm.newName=$event.target.value}}}):_c('span',[_vm._v(_vm._s(_vm.iconName.name))]),_vm._v(\" \"),(_vm.wiping)?_c('span',{staticClass:\"wiping-warning\"},[_vm._v(\"(\"+_vm._s(_vm.t('settings', 'Marked for remote wipe'))+\")\")]):_vm._e()]),_vm._v(\" \"),_c('td',[_c('span',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.lastActivity),expression:\"lastActivity\"}],staticClass:\"last-activity\"},[_vm._v(_vm._s(_vm.lastActivityRelative))])]),_vm._v(\" \"),_c('td',{staticClass:\"more\"},[(!_vm.token.current)?_c('Actions',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:({\n\t\t\t\tcontent: _vm.t('settings', 'Device settings'),\n\t\t\t\tcontainer: 'body'\n\t\t\t}),expression:\"{\\n\\t\\t\\t\\tcontent: t('settings', 'Device settings'),\\n\\t\\t\\t\\tcontainer: 'body'\\n\\t\\t\\t}\",modifiers:{\"auto\":true}}],attrs:{\"open\":_vm.actionOpen},on:{\"update:open\":function($event){_vm.actionOpen=$event}}},[(_vm.token.type === 1)?_c('ActionCheckbox',{attrs:{\"checked\":_vm.token.scope.filesystem},on:{\"change\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.$emit('toggle-scope', _vm.token, 'filesystem', !_vm.token.scope.filesystem)}}},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Allow filesystem access'))+\"\\n\\t\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.token.canRename)?_c('ActionButton',{attrs:{\"icon\":\"icon-rename\"},on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.startRename.apply(null, arguments)}}},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Rename'))+\"\\n\\t\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.token.canDelete)?[(_vm.token.type !== 2)?[_c('ActionButton',{attrs:{\"icon\":\"icon-delete\"},on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.revoke.apply(null, arguments)}}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Revoke'))+\"\\n\\t\\t\\t\\t\\t\")]),_vm._v(\" \"),_c('ActionButton',{attrs:{\"icon\":\"icon-delete\"},on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.wipe.apply(null, arguments)}}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Wipe device'))+\"\\n\\t\\t\\t\\t\\t\")])]:(_vm.token.type === 2)?_c('ActionButton',{attrs:{\"icon\":\"icon-delete\",\"title\":_vm.t('settings', 'Revoke')},on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.revoke.apply(null, arguments)}}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Revoking this token might prevent the wiping of your device if it has not started the wipe yet.'))+\"\\n\\t\\t\\t\\t\")]):_vm._e()]:_vm._e()],2):_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!./AuthTokenList.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!./AuthTokenList.vue?vue&type=script&lang=js&\"","<!--\n - @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>\n -\n - @author 2019 Christoph Wurst <christoph@winzerhof-wurst.at>\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<template>\n\t<table id=\"app-tokens-table\">\n\t\t<thead v-if=\"tokens.length\">\n\t\t\t<tr>\n\t\t\t\t<th />\n\t\t\t\t<th>{{ t('settings', 'Device') }}</th>\n\t\t\t\t<th>{{ t('settings', 'Last activity') }}</th>\n\t\t\t\t<th />\n\t\t\t</tr>\n\t\t</thead>\n\t\t<tbody class=\"token-list\">\n\t\t\t<AuthToken v-for=\"token in sortedTokens\"\n\t\t\t\t:key=\"token.id\"\n\t\t\t\t:token=\"token\"\n\t\t\t\t@toggle-scope=\"toggleScope\"\n\t\t\t\t@rename=\"rename\"\n\t\t\t\t@delete=\"onDelete\"\n\t\t\t\t@wipe=\"onWipe\" />\n\t\t</tbody>\n\t</table>\n</template>\n\n<script>\nimport AuthToken from './AuthToken'\n\nexport default {\n\tname: 'AuthTokenList',\n\tcomponents: {\n\t\tAuthToken,\n\t},\n\tprops: {\n\t\ttokens: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tcomputed: {\n\t\tsortedTokens() {\n\t\t\treturn this.tokens.slice().sort((t1, t2) => {\n\t\t\t\tconst ts1 = parseInt(t1.lastActivity, 10)\n\t\t\t\tconst ts2 = parseInt(t2.lastActivity, 10)\n\t\t\t\treturn ts2 - ts1\n\t\t\t})\n\t\t},\n\t},\n\tmethods: {\n\t\ttoggleScope(token, scope, value) {\n\t\t\t// Just pass it on\n\t\t\tthis.$emit('toggle-scope', token, scope, value)\n\t\t},\n\t\trename(token, newName) {\n\t\t\t// Just pass it on\n\t\t\tthis.$emit('rename', token, newName)\n\t\t},\n\t\tonDelete(token) {\n\t\t\t// Just pass it on\n\t\t\tthis.$emit('delete', token)\n\t\t},\n\t\tonWipe(token) {\n\t\t\t// Just pass it on\n\t\t\tthis.$emit('wipe', token)\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n\ttable {\n\t\twidth: 100%;\n\t\tmin-height: 50px;\n\t\tpadding-top: 5px;\n\t\tmax-width: 580px;\n\n\t\tth {\n\t\t\topacity: .5;\n\t\t\tpadding: 10px 0;\n\t\t}\n\t}\n\n\t.token-list {\n\t\ttd > a.icon-more {\n\t\t\ttransition: opacity var(--animation-quick);\n\t\t}\n\n\t\ta.icon-more {\n\t\t\tpadding: 14px;\n\t\t\tdisplay: block;\n\t\t\twidth: 44px;\n\t\t\theight: 44px;\n\t\t\topacity: .5;\n\t\t}\n\n\t\ttr {\n\t\t\t&:hover td > a.icon,\n\t\t\ttd > a.icon:focus,\n\t\t\t&.active td > a.icon {\n\t\t\t\topacity: 1;\n\t\t\t}\n\t\t}\n\t}\n</style>\n\n<!-- some styles are not scoped to make them work on subcomponents -->\n<style lang=\"scss\">\n\t#app-tokens-table {\n\t\ttr > *:nth-child(2) {\n\t\t\tpadding-left: 6px;\n\t\t}\n\n\t\ttr > *:nth-child(3) {\n\t\t\ttext-align: right;\n\t\t}\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!./AuthTokenList.vue?vue&type=style&index=0&id=4f8ceff3&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!./AuthTokenList.vue?vue&type=style&index=0&id=4f8ceff3&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\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!./AuthTokenList.vue?vue&type=style&index=1&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!./AuthTokenList.vue?vue&type=style&index=1&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AuthTokenList.vue?vue&type=template&id=4f8ceff3&scoped=true&\"\nimport script from \"./AuthTokenList.vue?vue&type=script&lang=js&\"\nexport * from \"./AuthTokenList.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AuthTokenList.vue?vue&type=style&index=0&id=4f8ceff3&lang=scss&scoped=true&\"\nimport style1 from \"./AuthTokenList.vue?vue&type=style&index=1&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 \"4f8ceff3\",\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('table',{attrs:{\"id\":\"app-tokens-table\"}},[(_vm.tokens.length)?_c('thead',[_c('tr',[_c('th'),_vm._v(\" \"),_c('th',[_vm._v(_vm._s(_vm.t('settings', 'Device')))]),_vm._v(\" \"),_c('th',[_vm._v(_vm._s(_vm.t('settings', 'Last activity')))]),_vm._v(\" \"),_c('th')])]):_vm._e(),_vm._v(\" \"),_c('tbody',{staticClass:\"token-list\"},_vm._l((_vm.sortedTokens),function(token){return _c('AuthToken',{key:token.id,attrs:{\"token\":token},on:{\"toggle-scope\":_vm.toggleScope,\"rename\":_vm.rename,\"delete\":_vm.onDelete,\"wipe\":_vm.onWipe}})}),1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>\n -\n - @author 2019 Christoph Wurst <christoph@winzerhof-wurst.at>\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<template>\n\t<div v-if=\"!adding\">\n\t\t<input v-model=\"deviceName\"\n\t\t\ttype=\"text\"\n\t\t\t:disabled=\"loading\"\n\t\t\t:placeholder=\"t('settings', 'App name')\"\n\t\t\t@keydown.enter=\"submit\">\n\t\t<Button :disabled=\"loading\"\n\t\t\t@click=\"submit\">\n\t\t\t{{ t('settings', 'Create new app password') }}\n\t\t</Button>\n\t</div>\n\t<div v-else>\n\t\t{{ t('settings', 'Use the credentials below to configure your app or device.') }}\n\t\t{{ t('settings', 'For security reasons this password will only be shown once.') }}\n\t\t<div class=\"app-password-row\">\n\t\t\t<span class=\"app-password-label\">{{ t('settings', 'Username') }}</span>\n\t\t\t<input :value=\"loginName\"\n\t\t\t\ttype=\"text\"\n\t\t\t\tclass=\"monospaced\"\n\t\t\t\treadonly=\"readonly\"\n\t\t\t\t@focus=\"selectInput\">\n\t\t</div>\n\t\t<div class=\"app-password-row\">\n\t\t\t<span class=\"app-password-label\">{{ t('settings', 'Password') }}</span>\n\t\t\t<input ref=\"appPassword\"\n\t\t\t\t:value=\"appPassword\"\n\t\t\t\ttype=\"text\"\n\t\t\t\tclass=\"monospaced\"\n\t\t\t\treadonly=\"readonly\"\n\t\t\t\t@focus=\"selectInput\">\n\t\t\t<a ref=\"clipboardButton\"\n\t\t\t\tv-tooltip=\"copyTooltipOptions\"\n\t\t\t\tv-clipboard:copy=\"appPassword\"\n\t\t\t\tv-clipboard:success=\"onCopyPassword\"\n\t\t\t\tv-clipboard:error=\"onCopyPasswordFailed\"\n\t\t\t\tclass=\"icon icon-clippy\"\n\t\t\t\t@mouseover=\"hoveringCopyButton = true\"\n\t\t\t\t@mouseleave=\"hoveringCopyButton = false\" />\n\t\t\t<Button @click=\"reset\">\n\t\t\t\t{{ t('settings', 'Done') }}\n\t\t\t</Button>\n\t\t</div>\n\t\t<div class=\"app-password-row\">\n\t\t\t<span class=\"app-password-label\" />\n\t\t\t<a v-if=\"!showQR\"\n\t\t\t\t@click=\"showQR = true\">\n\t\t\t\t{{ t('settings', 'Show QR code for mobile apps') }}\n\t\t\t</a>\n\t\t\t<QR v-else\n\t\t\t\t:value=\"qrUrl\" />\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport QR from '@chenfengyuan/vue-qrcode'\nimport confirmPassword from '@nextcloud/password-confirmation'\nimport { getRootUrl } from '@nextcloud/router'\nimport Button from '@nextcloud/vue/dist/Components/Button'\n\nexport default {\n\tname: 'AuthTokenSetupDialogue',\n\tcomponents: {\n\t\tQR,\n\t\tButton,\n\t},\n\tprops: {\n\t\tadd: {\n\t\t\ttype: Function,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tadding: false,\n\t\t\tloading: false,\n\t\t\tdeviceName: '',\n\t\t\tappPassword: '',\n\t\t\tloginName: '',\n\t\t\tpasswordCopied: false,\n\t\t\tshowQR: false,\n\t\t\tqrUrl: '',\n\t\t\thoveringCopyButton: false,\n\t\t}\n\t},\n\tcomputed: {\n\t\tcopyTooltipOptions() {\n\t\t\tconst base = {\n\t\t\t\thideOnTargetClick: false,\n\t\t\t\ttrigger: 'manual',\n\t\t\t}\n\n\t\t\tif (this.passwordCopied) {\n\t\t\t\treturn {\n\t\t\t\t\t...base,\n\t\t\t\t\tcontent: t('settings', 'Copied!'),\n\t\t\t\t\tshow: true,\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn {\n\t\t\t\t\t...base,\n\t\t\t\t\tcontent: t('settings', 'Copy'),\n\t\t\t\t\tshow: this.hoveringCopyButton,\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t},\n\tmethods: {\n\t\tselectInput(e) {\n\t\t\te.currentTarget.select()\n\t\t},\n\t\tsubmit() {\n\t\t\tconfirmPassword()\n\t\t\t\t.then(() => {\n\t\t\t\t\tthis.loading = true\n\t\t\t\t\treturn this.add(this.deviceName)\n\t\t\t\t})\n\t\t\t\t.then(token => {\n\t\t\t\t\tthis.adding = true\n\t\t\t\t\tthis.loginName = token.loginName\n\t\t\t\t\tthis.appPassword = token.token\n\n\t\t\t\t\tconst server = window.location.protocol + '//' + window.location.host + getRootUrl()\n\t\t\t\t\tthis.qrUrl = `nc://login/user:${token.loginName}&password:${token.token}&server:${server}`\n\n\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\tthis.$refs.appPassword.select()\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t.catch(err => {\n\t\t\t\t\tconsole.error('could not create a new app password', err)\n\t\t\t\t\tOC.Notification.showTemporary(t('settings', 'Error while creating device token'))\n\n\t\t\t\t\tthis.reset()\n\t\t\t\t})\n\t\t},\n\t\tonCopyPassword() {\n\t\t\tthis.passwordCopied = true\n\t\t\tthis.$refs.clipboardButton.blur()\n\t\t\tsetTimeout(() => { this.passwordCopied = false }, 3000)\n\t\t},\n\t\tonCopyPasswordFailed() {\n\t\t\tOC.Notification.showTemporary(t('settings', 'Could not copy app password. Please copy it manually.'))\n\t\t},\n\t\treset() {\n\t\t\tthis.adding = false\n\t\t\tthis.loading = false\n\t\t\tthis.showQR = false\n\t\t\tthis.qrUrl = ''\n\t\t\tthis.deviceName = ''\n\t\t\tthis.appPassword = ''\n\t\t\tthis.loginName = ''\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n\t.app-password-row {\n\t\tdisplay: table-row;\n\n\t\t.icon {\n\t\t\tbackground-size: 16px 16px;\n\t\t\tdisplay: inline-block;\n\t\t\tposition: relative;\n\t\t\ttop: 3px;\n\t\t\tmargin-left: 5px;\n\t\t\tmargin-right: 8px;\n\t\t}\n\n\t}\n\n\t.app-password-label {\n\t\tdisplay: table-cell;\n\t\tpadding-right: 1em;\n\t\ttext-align: right;\n\t\tvertical-align: middle;\n\t}\n\n\t.monospaced {\n\t\twidth: 245px;\n\t\tfont-family: monospace;\n\t}\n\n\t.button-vue{\n\t\tdisplay:inline-block;\n\t\tmargin: 3px 3px 3px 3px;\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!./AuthTokenSetupDialogue.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!./AuthTokenSetupDialogue.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!./AuthTokenSetupDialogue.vue?vue&type=style&index=0&id=c67d1466&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!./AuthTokenSetupDialogue.vue?vue&type=style&index=0&id=c67d1466&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AuthTokenSetupDialogue.vue?vue&type=template&id=c67d1466&scoped=true&\"\nimport script from \"./AuthTokenSetupDialogue.vue?vue&type=script&lang=js&\"\nexport * from \"./AuthTokenSetupDialogue.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AuthTokenSetupDialogue.vue?vue&type=style&index=0&id=c67d1466&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 \"c67d1466\",\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 (!_vm.adding)?_c('div',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.deviceName),expression:\"deviceName\"}],attrs:{\"type\":\"text\",\"disabled\":_vm.loading,\"placeholder\":_vm.t('settings', 'App name')},domProps:{\"value\":(_vm.deviceName)},on:{\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.submit.apply(null, arguments)},\"input\":function($event){if($event.target.composing){ return; }_vm.deviceName=$event.target.value}}}),_vm._v(\" \"),_c('Button',{attrs:{\"disabled\":_vm.loading},on:{\"click\":_vm.submit}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('settings', 'Create new app password'))+\"\\n\\t\")])],1):_c('div',[_vm._v(\"\\n\\t\"+_vm._s(_vm.t('settings', 'Use the credentials below to configure your app or device.'))+\"\\n\\t\"+_vm._s(_vm.t('settings', 'For security reasons this password will only be shown once.'))+\"\\n\\t\"),_c('div',{staticClass:\"app-password-row\"},[_c('span',{staticClass:\"app-password-label\"},[_vm._v(_vm._s(_vm.t('settings', 'Username')))]),_vm._v(\" \"),_c('input',{staticClass:\"monospaced\",attrs:{\"type\":\"text\",\"readonly\":\"readonly\"},domProps:{\"value\":_vm.loginName},on:{\"focus\":_vm.selectInput}})]),_vm._v(\" \"),_c('div',{staticClass:\"app-password-row\"},[_c('span',{staticClass:\"app-password-label\"},[_vm._v(_vm._s(_vm.t('settings', 'Password')))]),_vm._v(\" \"),_c('input',{ref:\"appPassword\",staticClass:\"monospaced\",attrs:{\"type\":\"text\",\"readonly\":\"readonly\"},domProps:{\"value\":_vm.appPassword},on:{\"focus\":_vm.selectInput}}),_vm._v(\" \"),_c('a',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.copyTooltipOptions),expression:\"copyTooltipOptions\"},{name:\"clipboard\",rawName:\"v-clipboard:copy\",value:(_vm.appPassword),expression:\"appPassword\",arg:\"copy\"},{name:\"clipboard\",rawName:\"v-clipboard:success\",value:(_vm.onCopyPassword),expression:\"onCopyPassword\",arg:\"success\"},{name:\"clipboard\",rawName:\"v-clipboard:error\",value:(_vm.onCopyPasswordFailed),expression:\"onCopyPasswordFailed\",arg:\"error\"}],ref:\"clipboardButton\",staticClass:\"icon icon-clippy\",on:{\"mouseover\":function($event){_vm.hoveringCopyButton = true},\"mouseleave\":function($event){_vm.hoveringCopyButton = false}}}),_vm._v(\" \"),_c('Button',{on:{\"click\":_vm.reset}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Done'))+\"\\n\\t\\t\")])],1),_vm._v(\" \"),_c('div',{staticClass:\"app-password-row\"},[_c('span',{staticClass:\"app-password-label\"}),_vm._v(\" \"),(!_vm.showQR)?_c('a',{on:{\"click\":function($event){_vm.showQR = true}}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Show QR code for mobile apps'))+\"\\n\\t\\t\")]):_c('QR',{attrs:{\"value\":_vm.qrUrl}})],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>\n -\n - @author 2019 Christoph Wurst <christoph@winzerhof-wurst.at>\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<template>\n\t<div id=\"security\" class=\"section\">\n\t\t<h2>{{ t('settings', 'Devices & sessions', {}, undefined, {sanitize: false}) }}</h2>\n\t\t<p class=\"settings-hint hidden-when-empty\">\n\t\t\t{{ t('settings', 'Web, desktop and mobile clients currently logged in to your account.') }}\n\t\t</p>\n\t\t<AuthTokenList :tokens=\"tokens\"\n\t\t\t@toggle-scope=\"toggleTokenScope\"\n\t\t\t@rename=\"rename\"\n\t\t\t@delete=\"deleteToken\"\n\t\t\t@wipe=\"wipeToken\" />\n\t\t<AuthTokenSetupDialogue v-if=\"canCreateToken\" :add=\"addNewToken\" />\n\t</div>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport confirmPassword from '@nextcloud/password-confirmation'\nimport { generateUrl } from '@nextcloud/router'\n\nimport AuthTokenList from './AuthTokenList'\nimport AuthTokenSetupDialogue from './AuthTokenSetupDialogue'\n\nconst confirm = () => {\n\treturn new Promise(resolve => {\n\t\tOC.dialogs.confirm(\n\t\t\tt('settings', 'Do you really want to wipe your data from this device?'),\n\t\t\tt('settings', 'Confirm wipe'),\n\t\t\tresolve,\n\t\t\ttrue\n\t\t)\n\t})\n}\n\n/**\n * Tap into a promise without losing the value\n *\n * @param {Function} cb the callback\n * @return {any} val the value\n */\nconst tap = cb => val => {\n\tcb(val)\n\treturn val\n}\n\nexport default {\n\tname: 'AuthTokenSection',\n\tcomponents: {\n\t\tAuthTokenSetupDialogue,\n\t\tAuthTokenList,\n\t},\n\tprops: {\n\t\ttokens: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t},\n\t\tcanCreateToken: {\n\t\t\ttype: Boolean,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tbaseUrl: generateUrl('/settings/personal/authtokens'),\n\t\t}\n\t},\n\tmethods: {\n\t\taddNewToken(name) {\n\t\t\tconsole.debug('creating a new app token', name)\n\n\t\t\tconst data = {\n\t\t\t\tname,\n\t\t\t}\n\t\t\treturn axios.post(this.baseUrl, data)\n\t\t\t\t.then(resp => resp.data)\n\t\t\t\t.then(tap(() => console.debug('app token created')))\n\t\t\t\t// eslint-disable-next-line vue/no-mutating-props\n\t\t\t\t.then(tap(data => this.tokens.push(data.deviceToken)))\n\t\t\t\t.catch(err => {\n\t\t\t\t\tconsole.error.bind('could not create app password', err)\n\t\t\t\t\tOC.Notification.showTemporary(t('settings', 'Error while creating device token'))\n\t\t\t\t\tthrow err\n\t\t\t\t})\n\t\t},\n\t\ttoggleTokenScope(token, scope, value) {\n\t\t\tconsole.debug('updating app token scope', token.id, scope, value)\n\n\t\t\tconst oldVal = token.scope[scope]\n\t\t\ttoken.scope[scope] = value\n\n\t\t\treturn this.updateToken(token)\n\t\t\t\t.then(tap(() => console.debug('app token scope updated')))\n\t\t\t\t.catch(err => {\n\t\t\t\t\tconsole.error.bind('could not update app token scope', err)\n\t\t\t\t\tOC.Notification.showTemporary(t('settings', 'Error while updating device token scope'))\n\n\t\t\t\t\t// Restore\n\t\t\t\t\ttoken.scope[scope] = oldVal\n\n\t\t\t\t\tthrow err\n\t\t\t\t})\n\t\t},\n\t\trename(token, newName) {\n\t\t\tconsole.debug('renaming app token', token.id, token.name, newName)\n\n\t\t\tconst oldName = token.name\n\t\t\ttoken.name = newName\n\n\t\t\treturn this.updateToken(token)\n\t\t\t\t.then(tap(() => console.debug('app token name updated')))\n\t\t\t\t.catch(err => {\n\t\t\t\t\tconsole.error.bind('could not update app token name', err)\n\t\t\t\t\tOC.Notification.showTemporary(t('settings', 'Error while updating device token name'))\n\n\t\t\t\t\t// Restore\n\t\t\t\t\ttoken.name = oldName\n\t\t\t\t})\n\t\t},\n\t\tupdateToken(token) {\n\t\t\treturn axios.put(this.baseUrl + '/' + token.id, token)\n\t\t\t\t.then(resp => resp.data)\n\t\t},\n\t\tdeleteToken(token) {\n\t\t\tconsole.debug('deleting app token', token)\n\n\t\t\t// eslint-disable-next-line vue/no-mutating-props\n\t\t\tthis.tokens = this.tokens.filter(t => t !== token)\n\n\t\t\treturn axios.delete(this.baseUrl + '/' + token.id)\n\t\t\t\t.then(resp => resp.data)\n\t\t\t\t.then(tap(() => console.debug('app token deleted')))\n\t\t\t\t.catch(err => {\n\t\t\t\t\tconsole.error.bind('could not delete app token', err)\n\t\t\t\t\tOC.Notification.showTemporary(t('settings', 'Error while deleting the token'))\n\n\t\t\t\t\t// Restore\n\t\t\t\t\t// eslint-disable-next-line vue/no-mutating-props\n\t\t\t\t\tthis.tokens.push(token)\n\t\t\t\t})\n\t\t},\n\t\tasync wipeToken(token) {\n\t\t\tconsole.debug('wiping app token', token)\n\n\t\t\ttry {\n\t\t\t\tawait confirmPassword()\n\n\t\t\t\tif (!(await confirm())) {\n\t\t\t\t\tconsole.debug('wipe aborted by user')\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tawait axios.post(this.baseUrl + '/wipe/' + token.id)\n\t\t\t\tconsole.debug('app token marked for wipe')\n\n\t\t\t\ttoken.type = 2\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error('could not wipe app token', err)\n\t\t\t\tOC.Notification.showTemporary(t('settings', 'Error while wiping the device with the token'))\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AuthTokenSection.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!./AuthTokenSection.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./AuthTokenSection.vue?vue&type=template&id=451cdc4a&scoped=true&\"\nimport script from \"./AuthTokenSection.vue?vue&type=script&lang=js&\"\nexport * from \"./AuthTokenSection.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 \"451cdc4a\",\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\",attrs:{\"id\":\"security\"}},[_c('h2',[_vm._v(_vm._s(_vm.t('settings', 'Devices & sessions', {}, undefined, {sanitize: false})))]),_vm._v(\" \"),_c('p',{staticClass:\"settings-hint hidden-when-empty\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('settings', 'Web, desktop and mobile clients currently logged in to your account.'))+\"\\n\\t\")]),_vm._v(\" \"),_c('AuthTokenList',{attrs:{\"tokens\":_vm.tokens},on:{\"toggle-scope\":_vm.toggleTokenScope,\"rename\":_vm.rename,\"delete\":_vm.deleteToken,\"wipe\":_vm.wipeToken}}),_vm._v(\" \"),(_vm.canCreateToken)?_c('AuthTokenSetupDialogue',{attrs:{\"add\":_vm.addNewToken}}):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>\n *\n * @author Christoph Wurst <christoph@winzerhof-wurst.at>\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 { loadState } from '@nextcloud/initial-state'\nimport Vue from 'vue'\nimport VueClipboard from 'vue-clipboard2'\nimport VTooltip from 'v-tooltip'\n\nimport AuthTokenSection from './components/AuthTokenSection'\n\n// eslint-disable-next-line camelcase\n__webpack_nonce__ = btoa(OC.requestToken)\n\nVue.use(VueClipboard)\nVue.use(VTooltip, { defaultHtml: false })\nVue.prototype.t = t\n\nconst View = Vue.extend(AuthTokenSection)\nnew View({\n\tpropsData: {\n\t\ttokens: loadState('settings', 'app_tokens'),\n\t\tcanCreateToken: loadState('settings', 'can_create_app_token'),\n\t},\n}).$mount('#security-authtokens')\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, \".wiping[data-v-6852e55e]{background-color:var(--color-background-darker)}td[data-v-6852e55e]{border-top:1px solid var(--color-border);max-width:200px;white-space:normal;vertical-align:middle;position:relative}td.client[data-v-6852e55e],td.more[data-v-6852e55e]{overflow:visible;position:relative;width:44px;height:44px}td.token-name[data-v-6852e55e]{padding:10px 6px}td.token-name.token-rename[data-v-6852e55e]{padding:0}td.token-name input[data-v-6852e55e]{width:100%;margin:0}td.token-name .wiping-warning[data-v-6852e55e]{color:var(--color-text-lighter)}td.more[data-v-6852e55e]{padding:0 10px}td.client div[data-v-6852e55e]{opacity:.57;width:44px;height:44px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/AuthToken.vue\"],\"names\":[],\"mappings\":\"AAiQA,yBACC,+CAAA,CAGD,oBACC,wCAAA,CACA,eAAA,CACA,kBAAA,CACA,qBAAA,CACA,iBAAA,CAEA,oDACC,gBAAA,CACA,iBAAA,CACA,UAAA,CACA,WAAA,CAGD,+BACC,gBAAA,CAEA,4CACC,SAAA,CAGD,qCACC,UAAA,CACA,QAAA,CAGF,+CACC,+BAAA,CAGD,yBAEC,cAAA,CAMA,+BACC,WAAA,CACA,UAAA,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\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n.wiping {\\n\\tbackground-color: var(--color-background-darker);\\n}\\n\\ntd {\\n\\tborder-top: 1px solid var(--color-border);\\n\\tmax-width: 200px;\\n\\twhite-space: normal;\\n\\tvertical-align: middle;\\n\\tposition: relative;\\n\\n\\t&%icon {\\n\\t\\toverflow: visible;\\n\\t\\tposition: relative;\\n\\t\\twidth: 44px;\\n\\t\\theight: 44px;\\n\\t}\\n\\n\\t&.token-name {\\n\\t\\tpadding: 10px 6px;\\n\\n\\t\\t&.token-rename {\\n\\t\\t\\tpadding: 0;\\n\\t\\t}\\n\\n\\t\\tinput {\\n\\t\\t\\twidth: 100%;\\n\\t\\t\\tmargin: 0;\\n\\t\\t}\\n\\t}\\n\\t&.token-name .wiping-warning {\\n\\t\\tcolor: var(--color-text-lighter);\\n\\t}\\n\\n\\t&.more {\\n\\t\\t@extend %icon;\\n\\t\\tpadding: 0 10px;\\n\\t}\\n\\n\\t&.client {\\n\\t\\t@extend %icon;\\n\\n\\t\\tdiv {\\n\\t\\t\\topacity: 0.57;\\n\\t\\t\\twidth: 44px;\\n\\t\\t\\theight: 44px;\\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, \"table[data-v-4f8ceff3]{width:100%;min-height:50px;padding-top:5px;max-width:580px}table th[data-v-4f8ceff3]{opacity:.5;padding:10px 0}.token-list td>a.icon-more[data-v-4f8ceff3]{transition:opacity var(--animation-quick)}.token-list a.icon-more[data-v-4f8ceff3]{padding:14px;display:block;width:44px;height:44px;opacity:.5}.token-list tr:hover td>a.icon[data-v-4f8ceff3],.token-list tr td>a.icon[data-v-4f8ceff3]:focus,.token-list tr.active td>a.icon[data-v-4f8ceff3]{opacity:1}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/AuthTokenList.vue\"],\"names\":[],\"mappings\":\"AAwFA,uBACC,UAAA,CACA,eAAA,CACA,eAAA,CACA,eAAA,CAEA,0BACC,UAAA,CACA,cAAA,CAKD,4CACC,yCAAA,CAGD,yCACC,YAAA,CACA,aAAA,CACA,UAAA,CACA,WAAA,CACA,UAAA,CAIA,iJAGC,SAAA\",\"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\\ntable {\\n\\twidth: 100%;\\n\\tmin-height: 50px;\\n\\tpadding-top: 5px;\\n\\tmax-width: 580px;\\n\\n\\tth {\\n\\t\\topacity: .5;\\n\\t\\tpadding: 10px 0;\\n\\t}\\n}\\n\\n.token-list {\\n\\ttd > a.icon-more {\\n\\t\\ttransition: opacity var(--animation-quick);\\n\\t}\\n\\n\\ta.icon-more {\\n\\t\\tpadding: 14px;\\n\\t\\tdisplay: block;\\n\\t\\twidth: 44px;\\n\\t\\theight: 44px;\\n\\t\\topacity: .5;\\n\\t}\\n\\n\\ttr {\\n\\t\\t&:hover td > a.icon,\\n\\t\\ttd > a.icon:focus,\\n\\t\\t&.active td > a.icon {\\n\\t\\t\\topacity: 1;\\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, \"#app-tokens-table tr>*:nth-child(2){padding-left:6px}#app-tokens-table tr>*:nth-child(3){text-align:right}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/AuthTokenList.vue\"],\"names\":[],\"mappings\":\"AA8HC,oCACC,gBAAA,CAGD,oCACC,gBAAA\",\"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#app-tokens-table {\\n\\ttr > *:nth-child(2) {\\n\\t\\tpadding-left: 6px;\\n\\t}\\n\\n\\ttr > *:nth-child(3) {\\n\\t\\ttext-align: right;\\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, \".app-password-row[data-v-c67d1466]{display:table-row}.app-password-row .icon[data-v-c67d1466]{background-size:16px 16px;display:inline-block;position:relative;top:3px;margin-left:5px;margin-right:8px}.app-password-label[data-v-c67d1466]{display:table-cell;padding-right:1em;text-align:right;vertical-align:middle}.monospaced[data-v-c67d1466]{width:245px;font-family:monospace}.button-vue[data-v-c67d1466]{display:inline-block;margin:3px 3px 3px 3px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/AuthTokenSetupDialogue.vue\"],\"names\":[],\"mappings\":\"AAoLA,mCACC,iBAAA,CAEA,yCACC,yBAAA,CACA,oBAAA,CACA,iBAAA,CACA,OAAA,CACA,eAAA,CACA,gBAAA,CAKF,qCACC,kBAAA,CACA,iBAAA,CACA,gBAAA,CACA,qBAAA,CAGD,6BACC,WAAA,CACA,qBAAA,CAGD,6BACC,oBAAA,CACA,sBAAA\",\"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.app-password-row {\\n\\tdisplay: table-row;\\n\\n\\t.icon {\\n\\t\\tbackground-size: 16px 16px;\\n\\t\\tdisplay: inline-block;\\n\\t\\tposition: relative;\\n\\t\\ttop: 3px;\\n\\t\\tmargin-left: 5px;\\n\\t\\tmargin-right: 8px;\\n\\t}\\n\\n}\\n\\n.app-password-label {\\n\\tdisplay: table-cell;\\n\\tpadding-right: 1em;\\n\\ttext-align: right;\\n\\tvertical-align: middle;\\n}\\n\\n.monospaced {\\n\\twidth: 245px;\\n\\tfont-family: monospace;\\n}\\n\\n.button-vue{\\n\\tdisplay:inline-block;\\n\\tmargin: 3px 3px 3px 3px;\\n}\\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 = 4783;","__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\t4783: 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));","// 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__(71213); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","component","_vm","this","_h","$createElement","_c","_self","class","wiping","attrs","token","id","staticClass","iconName","icon","_v","canRename","renaming","directives","name","rawName","value","expression","ref","domProps","on","$event","type","indexOf","_k","keyCode","key","rename","apply","arguments","cancelRename","target","composing","newName","_s","t","_e","lastActivityRelative","current","content","container","modifiers","actionOpen","scope","filesystem","stopPropagation","preventDefault","$emit","startRename","revoke","wipe","tokens","_l","toggleScope","onDelete","onWipe","adding","loginName","selectInput","appPassword","arg","hoveringCopyButton","reset","showQR","qrUrl","loading","submit","deviceName","undefined","sanitize","toggleTokenScope","deleteToken","wipeToken","addNewToken","__webpack_nonce__","btoa","OC","requestToken","Vue","VueClipboard","VTooltip","defaultHtml","AuthTokenSection","propsData","loadState","canCreateToken","$mount","___CSS_LOADER_EXPORT___","push","module","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","loaded","__webpack_modules__","call","m","amdD","Error","amdO","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","Object","keys","every","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","g","globalThis","Function","e","window","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","nmd","paths","children","b","document","baseURI","self","location","href","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","some","chunkLoadingGlobal","forEach","bind","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file +{"version":3,"file":"settings-vue-settings-personal-security.js?v=3b1e3f5abbf256b27ae0","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/apps/settings/src/components/AuthToken.vue","webpack:///nextcloud/apps/settings/src/components/AuthToken.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/settings/src/components/AuthToken.vue?a4c8","webpack://nextcloud/./apps/settings/src/components/AuthToken.vue?1338","webpack:///nextcloud/apps/settings/src/components/AuthToken.vue?vue&type=template&id=6852e55e&scoped=true&","webpack:///nextcloud/apps/settings/src/components/AuthTokenList.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/settings/src/components/AuthTokenList.vue","webpack://nextcloud/./apps/settings/src/components/AuthTokenList.vue?f7c9","webpack://nextcloud/./apps/settings/src/components/AuthTokenList.vue?515d","webpack://nextcloud/./apps/settings/src/components/AuthTokenList.vue?90cb","webpack:///nextcloud/apps/settings/src/components/AuthTokenList.vue?vue&type=template&id=4f8ceff3&scoped=true&","webpack:///nextcloud/apps/settings/src/components/AuthTokenSetupDialogue.vue","webpack:///nextcloud/apps/settings/src/components/AuthTokenSetupDialogue.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/settings/src/components/AuthTokenSetupDialogue.vue?e711","webpack://nextcloud/./apps/settings/src/components/AuthTokenSetupDialogue.vue?521c","webpack:///nextcloud/apps/settings/src/components/AuthTokenSetupDialogue.vue?vue&type=template&id=6a24fa34&scoped=true&","webpack:///nextcloud/apps/settings/src/components/AuthTokenSection.vue","webpack:///nextcloud/apps/settings/src/components/AuthTokenSection.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/settings/src/components/AuthTokenSection.vue?e9d0","webpack:///nextcloud/apps/settings/src/components/AuthTokenSection.vue?vue&type=template&id=451cdc4a&scoped=true&","webpack:///nextcloud/apps/settings/src/main-personal-security.js","webpack:///nextcloud/apps/settings/src/components/AuthToken.vue?vue&type=style&index=0&id=6852e55e&lang=scss&scoped=true&","webpack:///nextcloud/apps/settings/src/components/AuthTokenList.vue?vue&type=style&index=0&id=4f8ceff3&lang=scss&scoped=true&","webpack:///nextcloud/apps/settings/src/components/AuthTokenList.vue?vue&type=style&index=1&lang=scss&","webpack:///nextcloud/apps/settings/src/components/AuthTokenSetupDialogue.vue?vue&type=style&index=0&id=6a24fa34&lang=scss&scoped=true&","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/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 2019 Christoph Wurst <christoph@winzerhof-wurst.at>\n -\n - @author 2019 Christoph Wurst <christoph@winzerhof-wurst.at>\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<template>\n\t<tr :data-id=\"token.id\"\n\t\t:class=\"wiping\">\n\t\t<td class=\"client\">\n\t\t\t<div :class=\"iconName.icon\" />\n\t\t</td>\n\t\t<td class=\"token-name\">\n\t\t\t<input v-if=\"token.canRename && renaming\"\n\t\t\t\tref=\"input\"\n\t\t\t\tv-model=\"newName\"\n\t\t\t\ttype=\"text\"\n\t\t\t\t@keyup.enter=\"rename\"\n\t\t\t\t@blur=\"cancelRename\"\n\t\t\t\t@keyup.esc=\"cancelRename\">\n\t\t\t<span v-else>{{ iconName.name }}</span>\n\t\t\t<span v-if=\"wiping\" class=\"wiping-warning\">({{ t('settings', 'Marked for remote wipe') }})</span>\n\t\t</td>\n\t\t<td>\n\t\t\t<span v-tooltip=\"lastActivity\" class=\"last-activity\">{{ lastActivityRelative }}</span>\n\t\t</td>\n\t\t<td class=\"more\">\n\t\t\t<Actions v-if=\"!token.current\"\n\t\t\t\tv-tooltip.auto=\"{\n\t\t\t\t\tcontent: t('settings', 'Device settings'),\n\t\t\t\t\tcontainer: 'body'\n\t\t\t\t}\"\n\t\t\t\t:open.sync=\"actionOpen\">\n\t\t\t\t<ActionCheckbox v-if=\"token.type === 1\"\n\t\t\t\t\t:checked=\"token.scope.filesystem\"\n\t\t\t\t\t@change.stop.prevent=\"$emit('toggle-scope', token, 'filesystem', !token.scope.filesystem)\">\n\t\t\t\t\t<!-- TODO: add text/longtext with some description -->\n\t\t\t\t\t{{ t('settings', 'Allow filesystem access') }}\n\t\t\t\t</ActionCheckbox>\n\t\t\t\t<ActionButton v-if=\"token.canRename\"\n\t\t\t\t\ticon=\"icon-rename\"\n\t\t\t\t\t@click.stop.prevent=\"startRename\">\n\t\t\t\t\t<!-- TODO: add text/longtext with some description -->\n\t\t\t\t\t{{ t('settings', 'Rename') }}\n\t\t\t\t</ActionButton>\n\n\t\t\t\t<!-- revoke & wipe -->\n\t\t\t\t<template v-if=\"token.canDelete\">\n\t\t\t\t\t<template v-if=\"token.type !== 2\">\n\t\t\t\t\t\t<ActionButton icon=\"icon-delete\"\n\t\t\t\t\t\t\t@click.stop.prevent=\"revoke\">\n\t\t\t\t\t\t\t<!-- TODO: add text/longtext with some description -->\n\t\t\t\t\t\t\t{{ t('settings', 'Revoke') }}\n\t\t\t\t\t\t</ActionButton>\n\t\t\t\t\t\t<ActionButton icon=\"icon-delete\"\n\t\t\t\t\t\t\t@click.stop.prevent=\"wipe\">\n\t\t\t\t\t\t\t{{ t('settings', 'Wipe device') }}\n\t\t\t\t\t\t</ActionButton>\n\t\t\t\t\t</template>\n\t\t\t\t\t<ActionButton v-else-if=\"token.type === 2\"\n\t\t\t\t\t\ticon=\"icon-delete\"\n\t\t\t\t\t\t:title=\"t('settings', 'Revoke')\"\n\t\t\t\t\t\t@click.stop.prevent=\"revoke\">\n\t\t\t\t\t\t{{ t('settings', 'Revoking this token might prevent the wiping of your device if it has not started the wipe yet.') }}\n\t\t\t\t\t</ActionButton>\n\t\t\t\t</template>\n\t\t\t</Actions>\n\t\t</td>\n\t</tr>\n</template>\n\n<script>\nimport {\n\tActions,\n\tActionButton,\n\tActionCheckbox,\n} from '@nextcloud/vue'\n\n// When using capture groups the following parts are extracted the first is used as the version number, the second as the OS\nconst userAgentMap = {\n\tie: /(?:MSIE|Trident|Trident\\/7.0; rv)[ :](\\d+)/,\n\t// Microsoft Edge User Agent from https://msdn.microsoft.com/en-us/library/hh869301(v=vs.85).aspx\n\tedge: /^Mozilla\\/5\\.0 \\([^)]+\\) AppleWebKit\\/[0-9.]+ \\(KHTML, like Gecko\\) Chrome\\/[0-9.]+ (?:Mobile Safari|Safari)\\/[0-9.]+ Edge\\/[0-9.]+$/,\n\t// Firefox User Agent from https://developer.mozilla.org/en-US/docs/Web/HTTP/Gecko_user_agent_string_reference\n\tfirefox: /^Mozilla\\/5\\.0 \\([^)]*(Windows|OS X|Linux)[^)]+\\) Gecko\\/[0-9.]+ Firefox\\/(\\d+)(?:\\.\\d)?$/,\n\t// Chrome User Agent from https://developer.chrome.com/multidevice/user-agent\n\tchrome: /^Mozilla\\/5\\.0 \\([^)]*(Windows|OS X|Linux)[^)]+\\) AppleWebKit\\/[0-9.]+ \\(KHTML, like Gecko\\) Chrome\\/(\\d+)[0-9.]+ (?:Mobile Safari|Safari)\\/[0-9.]+$/,\n\t// Safari User Agent from http://www.useragentstring.com/pages/Safari/\n\tsafari: /^Mozilla\\/5\\.0 \\([^)]*(Windows|OS X)[^)]+\\) AppleWebKit\\/[0-9.]+ \\(KHTML, like Gecko\\)(?: Version\\/([0-9]+)[0-9.]+)? Safari\\/[0-9.A-Z]+$/,\n\t// Android Chrome user agent: https://developers.google.com/chrome/mobile/docs/user-agent\n\tandroidChrome: /Android.*(?:; (.*) Build\\/).*Chrome\\/(\\d+)[0-9.]+/,\n\tiphone: / *CPU +iPhone +OS +([0-9]+)_(?:[0-9_])+ +like +Mac +OS +X */,\n\tipad: /\\(iPad; *CPU +OS +([0-9]+)_(?:[0-9_])+ +like +Mac +OS +X */,\n\tiosClient: /^Mozilla\\/5\\.0 \\(iOS\\) (?:ownCloud|Nextcloud)-iOS.*$/,\n\tandroidClient: /^Mozilla\\/5\\.0 \\(Android\\) ownCloud-android.*$/,\n\tiosTalkClient: /^Mozilla\\/5\\.0 \\(iOS\\) Nextcloud-Talk.*$/,\n\tandroidTalkClient: /^Mozilla\\/5\\.0 \\(Android\\) Nextcloud-Talk.*$/,\n\t// DAVx5/3.3.8-beta2-gplay (2021/01/02; dav4jvm; okhttp/4.9.0) Android/10\n\tdavx5: /DAV(?:droid|x5)\\/([^ ]+)/,\n\t// Mozilla/5.0 (U; Linux; Maemo; Jolla; Sailfish; like Android 4.3) AppleWebKit/538.1 (KHTML, like Gecko) WebPirate/2.0 like Mobile Safari/538.1 (compatible)\n\twebPirate: /(Sailfish).*WebPirate\\/(\\d+)/,\n\t// Mozilla/5.0 (Maemo; Linux; U; Jolla; Sailfish; Mobile; rv:31.0) Gecko/31.0 Firefox/31.0 SailfishBrowser/1.0\n\tsailfishBrowser: /(Sailfish).*SailfishBrowser\\/(\\d+)/,\n}\nconst nameMap = {\n\tie: t('setting', 'Internet Explorer'),\n\tedge: t('setting', 'Edge'),\n\tfirefox: t('setting', 'Firefox'),\n\tchrome: t('setting', 'Google Chrome'),\n\tsafari: t('setting', 'Safari'),\n\tandroidChrome: t('setting', 'Google Chrome for Android'),\n\tiphone: t('setting', 'iPhone'),\n\tipad: t('setting', 'iPad'),\n\tiosClient: t('setting', '{productName} iOS app', { productName: window.oc_defaults.productName }),\n\tandroidClient: t('setting', '{productName} Android app', { productName: window.oc_defaults.productName }),\n\tiosTalkClient: t('setting', '{productName} Talk for iOS', { productName: window.oc_defaults.productName }),\n\tandroidTalkClient: t('setting', '{productName} Talk for Android', { productName: window.oc_defaults.productName }),\n\tdavx5: 'DAVx5',\n\twebPirate: 'WebPirate',\n\tsailfishBrowser: 'SailfishBrowser',\n}\nconst iconMap = {\n\tie: 'icon-desktop',\n\tedge: 'icon-desktop',\n\tfirefox: 'icon-desktop',\n\tchrome: 'icon-desktop',\n\tsafari: 'icon-desktop',\n\tandroidChrome: 'icon-phone',\n\tiphone: 'icon-phone',\n\tipad: 'icon-tablet',\n\tiosClient: 'icon-phone',\n\tandroidClient: 'icon-phone',\n\tiosTalkClient: 'icon-phone',\n\tandroidTalkClient: 'icon-phone',\n\tdavx5: 'icon-phone',\n\twebPirate: 'icon-link',\n\tsailfishBrowser: 'icon-link',\n}\n\nexport default {\n\tname: 'AuthToken',\n\tcomponents: {\n\t\tActions,\n\t\tActionButton,\n\t\tActionCheckbox,\n\t},\n\tprops: {\n\t\ttoken: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tshowMore: this.token.canScope || this.token.canDelete,\n\t\t\trenaming: false,\n\t\t\tnewName: '',\n\t\t\tactionOpen: false,\n\t\t}\n\t},\n\tcomputed: {\n\t\tlastActivityRelative() {\n\t\t\treturn OC.Util.relativeModifiedDate(this.token.lastActivity * 1000)\n\t\t},\n\t\tlastActivity() {\n\t\t\treturn OC.Util.formatDate(this.token.lastActivity * 1000, 'LLL')\n\t\t},\n\t\ticonName() {\n\t\t\t// pretty format sync client user agent\n\t\t\tconst matches = this.token.name.match(/Mozilla\\/5\\.0 \\((\\w+)\\) (?:mirall|csyncoC)\\/(\\d+\\.\\d+\\.\\d+)/)\n\n\t\t\tlet icon = ''\n\t\t\tif (matches) {\n\t\t\t\t/* eslint-disable-next-line */\n\t\t\t\tthis.token.name = t('settings', 'Sync client - {os}', {\n\t\t\t\t\tos: matches[1],\n\t\t\t\t\tversion: matches[2],\n\t\t\t\t})\n\t\t\t\ticon = 'icon-desktop'\n\t\t\t}\n\n\t\t\t// preserve title for cases where we format it further\n\t\t\tconst title = this.token.name\n\t\t\tlet name = this.token.name\n\t\t\tfor (const client in userAgentMap) {\n\t\t\t\tconst matches = title.match(userAgentMap[client])\n\t\t\t\tif (matches) {\n\t\t\t\t\tif (matches[2] && matches[1]) { // version number and os\n\t\t\t\t\t\tname = nameMap[client] + ' ' + matches[2] + ' - ' + matches[1]\n\t\t\t\t\t} else if (matches[1]) { // only version number\n\t\t\t\t\t\tname = nameMap[client] + ' ' + matches[1]\n\t\t\t\t\t} else {\n\t\t\t\t\t\tname = nameMap[client]\n\t\t\t\t\t}\n\n\t\t\t\t\ticon = iconMap[client]\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.token.current) {\n\t\t\t\tname = t('settings', 'This session')\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ticon,\n\t\t\t\tname,\n\t\t\t}\n\t\t},\n\t\twiping() {\n\t\t\treturn this.token.type === 2\n\t\t},\n\t},\n\tmethods: {\n\t\tstartRename() {\n\t\t\t// Close action (popover menu)\n\t\t\tthis.actionOpen = false\n\n\t\t\tthis.newName = this.token.name\n\t\t\tthis.renaming = true\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis.$refs.input.select()\n\t\t\t})\n\t\t},\n\t\tcancelRename() {\n\t\t\tthis.renaming = false\n\t\t},\n\t\trevoke() {\n\t\t\tthis.actionOpen = false\n\t\t\tthis.$emit('delete', this.token)\n\t\t},\n\t\trename() {\n\t\t\tthis.renaming = false\n\t\t\tthis.$emit('rename', this.token, this.newName)\n\t\t},\n\t\twipe() {\n\t\t\tthis.actionOpen = false\n\t\t\tthis.$emit('wipe', this.token)\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n\t.wiping {\n\t\tbackground-color: var(--color-background-darker);\n\t}\n\n\ttd {\n\t\tborder-top: 1px solid var(--color-border);\n\t\tmax-width: 200px;\n\t\twhite-space: normal;\n\t\tvertical-align: middle;\n\t\tposition: relative;\n\n\t\t&%icon {\n\t\t\toverflow: visible;\n\t\t\tposition: relative;\n\t\t\twidth: 44px;\n\t\t\theight: 44px;\n\t\t}\n\n\t\t&.token-name {\n\t\t\tpadding: 10px 6px;\n\n\t\t\t&.token-rename {\n\t\t\t\tpadding: 0;\n\t\t\t}\n\n\t\t\tinput {\n\t\t\t\twidth: 100%;\n\t\t\t\tmargin: 0;\n\t\t\t}\n\t\t}\n\t\t&.token-name .wiping-warning {\n\t\t\tcolor: var(--color-text-lighter);\n\t\t}\n\n\t\t&.more {\n\t\t\t@extend %icon;\n\t\t\tpadding: 0 10px;\n\t\t}\n\n\t\t&.client {\n\t\t\t@extend %icon;\n\n\t\t\tdiv {\n\t\t\t\topacity: 0.57;\n\t\t\t\twidth: 44px;\n\t\t\t\theight: 44px;\n\t\t\t}\n\t\t}\n\t}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AuthToken.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!./AuthToken.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!./AuthToken.vue?vue&type=style&index=0&id=6852e55e&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!./AuthToken.vue?vue&type=style&index=0&id=6852e55e&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AuthToken.vue?vue&type=template&id=6852e55e&scoped=true&\"\nimport script from \"./AuthToken.vue?vue&type=script&lang=js&\"\nexport * from \"./AuthToken.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AuthToken.vue?vue&type=style&index=0&id=6852e55e&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 \"6852e55e\",\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('tr',{class:_vm.wiping,attrs:{\"data-id\":_vm.token.id}},[_c('td',{staticClass:\"client\"},[_c('div',{class:_vm.iconName.icon})]),_vm._v(\" \"),_c('td',{staticClass:\"token-name\"},[(_vm.token.canRename && _vm.renaming)?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.newName),expression:\"newName\"}],ref:\"input\",attrs:{\"type\":\"text\"},domProps:{\"value\":(_vm.newName)},on:{\"keyup\":[function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.rename.apply(null, arguments)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"esc\",27,$event.key,[\"Esc\",\"Escape\"])){ return null; }return _vm.cancelRename.apply(null, arguments)}],\"blur\":_vm.cancelRename,\"input\":function($event){if($event.target.composing){ return; }_vm.newName=$event.target.value}}}):_c('span',[_vm._v(_vm._s(_vm.iconName.name))]),_vm._v(\" \"),(_vm.wiping)?_c('span',{staticClass:\"wiping-warning\"},[_vm._v(\"(\"+_vm._s(_vm.t('settings', 'Marked for remote wipe'))+\")\")]):_vm._e()]),_vm._v(\" \"),_c('td',[_c('span',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.lastActivity),expression:\"lastActivity\"}],staticClass:\"last-activity\"},[_vm._v(_vm._s(_vm.lastActivityRelative))])]),_vm._v(\" \"),_c('td',{staticClass:\"more\"},[(!_vm.token.current)?_c('Actions',{directives:[{name:\"tooltip\",rawName:\"v-tooltip.auto\",value:({\n\t\t\t\tcontent: _vm.t('settings', 'Device settings'),\n\t\t\t\tcontainer: 'body'\n\t\t\t}),expression:\"{\\n\\t\\t\\t\\tcontent: t('settings', 'Device settings'),\\n\\t\\t\\t\\tcontainer: 'body'\\n\\t\\t\\t}\",modifiers:{\"auto\":true}}],attrs:{\"open\":_vm.actionOpen},on:{\"update:open\":function($event){_vm.actionOpen=$event}}},[(_vm.token.type === 1)?_c('ActionCheckbox',{attrs:{\"checked\":_vm.token.scope.filesystem},on:{\"change\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.$emit('toggle-scope', _vm.token, 'filesystem', !_vm.token.scope.filesystem)}}},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Allow filesystem access'))+\"\\n\\t\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.token.canRename)?_c('ActionButton',{attrs:{\"icon\":\"icon-rename\"},on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.startRename.apply(null, arguments)}}},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Rename'))+\"\\n\\t\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.token.canDelete)?[(_vm.token.type !== 2)?[_c('ActionButton',{attrs:{\"icon\":\"icon-delete\"},on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.revoke.apply(null, arguments)}}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Revoke'))+\"\\n\\t\\t\\t\\t\\t\")]),_vm._v(\" \"),_c('ActionButton',{attrs:{\"icon\":\"icon-delete\"},on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.wipe.apply(null, arguments)}}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Wipe device'))+\"\\n\\t\\t\\t\\t\\t\")])]:(_vm.token.type === 2)?_c('ActionButton',{attrs:{\"icon\":\"icon-delete\",\"title\":_vm.t('settings', 'Revoke')},on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.revoke.apply(null, arguments)}}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Revoking this token might prevent the wiping of your device if it has not started the wipe yet.'))+\"\\n\\t\\t\\t\\t\")]):_vm._e()]:_vm._e()],2):_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!./AuthTokenList.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!./AuthTokenList.vue?vue&type=script&lang=js&\"","<!--\n - @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>\n -\n - @author 2019 Christoph Wurst <christoph@winzerhof-wurst.at>\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<template>\n\t<table id=\"app-tokens-table\">\n\t\t<thead v-if=\"tokens.length\">\n\t\t\t<tr>\n\t\t\t\t<th />\n\t\t\t\t<th>{{ t('settings', 'Device') }}</th>\n\t\t\t\t<th>{{ t('settings', 'Last activity') }}</th>\n\t\t\t\t<th />\n\t\t\t</tr>\n\t\t</thead>\n\t\t<tbody class=\"token-list\">\n\t\t\t<AuthToken v-for=\"token in sortedTokens\"\n\t\t\t\t:key=\"token.id\"\n\t\t\t\t:token=\"token\"\n\t\t\t\t@toggle-scope=\"toggleScope\"\n\t\t\t\t@rename=\"rename\"\n\t\t\t\t@delete=\"onDelete\"\n\t\t\t\t@wipe=\"onWipe\" />\n\t\t</tbody>\n\t</table>\n</template>\n\n<script>\nimport AuthToken from './AuthToken'\n\nexport default {\n\tname: 'AuthTokenList',\n\tcomponents: {\n\t\tAuthToken,\n\t},\n\tprops: {\n\t\ttokens: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tcomputed: {\n\t\tsortedTokens() {\n\t\t\treturn this.tokens.slice().sort((t1, t2) => {\n\t\t\t\tconst ts1 = parseInt(t1.lastActivity, 10)\n\t\t\t\tconst ts2 = parseInt(t2.lastActivity, 10)\n\t\t\t\treturn ts2 - ts1\n\t\t\t})\n\t\t},\n\t},\n\tmethods: {\n\t\ttoggleScope(token, scope, value) {\n\t\t\t// Just pass it on\n\t\t\tthis.$emit('toggle-scope', token, scope, value)\n\t\t},\n\t\trename(token, newName) {\n\t\t\t// Just pass it on\n\t\t\tthis.$emit('rename', token, newName)\n\t\t},\n\t\tonDelete(token) {\n\t\t\t// Just pass it on\n\t\t\tthis.$emit('delete', token)\n\t\t},\n\t\tonWipe(token) {\n\t\t\t// Just pass it on\n\t\t\tthis.$emit('wipe', token)\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n\ttable {\n\t\twidth: 100%;\n\t\tmin-height: 50px;\n\t\tpadding-top: 5px;\n\t\tmax-width: 580px;\n\n\t\tth {\n\t\t\topacity: .5;\n\t\t\tpadding: 10px 0;\n\t\t}\n\t}\n\n\t.token-list {\n\t\ttd > a.icon-more {\n\t\t\ttransition: opacity var(--animation-quick);\n\t\t}\n\n\t\ta.icon-more {\n\t\t\tpadding: 14px;\n\t\t\tdisplay: block;\n\t\t\twidth: 44px;\n\t\t\theight: 44px;\n\t\t\topacity: .5;\n\t\t}\n\n\t\ttr {\n\t\t\t&:hover td > a.icon,\n\t\t\ttd > a.icon:focus,\n\t\t\t&.active td > a.icon {\n\t\t\t\topacity: 1;\n\t\t\t}\n\t\t}\n\t}\n</style>\n\n<!-- some styles are not scoped to make them work on subcomponents -->\n<style lang=\"scss\">\n\t#app-tokens-table {\n\t\ttr > *:nth-child(2) {\n\t\t\tpadding-left: 6px;\n\t\t}\n\n\t\ttr > *:nth-child(3) {\n\t\t\ttext-align: right;\n\t\t}\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!./AuthTokenList.vue?vue&type=style&index=0&id=4f8ceff3&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!./AuthTokenList.vue?vue&type=style&index=0&id=4f8ceff3&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\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!./AuthTokenList.vue?vue&type=style&index=1&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!./AuthTokenList.vue?vue&type=style&index=1&lang=scss&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AuthTokenList.vue?vue&type=template&id=4f8ceff3&scoped=true&\"\nimport script from \"./AuthTokenList.vue?vue&type=script&lang=js&\"\nexport * from \"./AuthTokenList.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AuthTokenList.vue?vue&type=style&index=0&id=4f8ceff3&lang=scss&scoped=true&\"\nimport style1 from \"./AuthTokenList.vue?vue&type=style&index=1&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 \"4f8ceff3\",\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('table',{attrs:{\"id\":\"app-tokens-table\"}},[(_vm.tokens.length)?_c('thead',[_c('tr',[_c('th'),_vm._v(\" \"),_c('th',[_vm._v(_vm._s(_vm.t('settings', 'Device')))]),_vm._v(\" \"),_c('th',[_vm._v(_vm._s(_vm.t('settings', 'Last activity')))]),_vm._v(\" \"),_c('th')])]):_vm._e(),_vm._v(\" \"),_c('tbody',{staticClass:\"token-list\"},_vm._l((_vm.sortedTokens),function(token){return _c('AuthToken',{key:token.id,attrs:{\"token\":token},on:{\"toggle-scope\":_vm.toggleScope,\"rename\":_vm.rename,\"delete\":_vm.onDelete,\"wipe\":_vm.onWipe}})}),1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>\n -\n - @author 2019 Christoph Wurst <christoph@winzerhof-wurst.at>\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<template>\n\t<div v-if=\"!adding\">\n\t\t<input v-model=\"deviceName\"\n\t\t\ttype=\"text\"\n\t\t\t:maxlength=\"120\"\n\t\t\t:disabled=\"loading\"\n\t\t\t:placeholder=\"t('settings', 'App name')\"\n\t\t\t@keydown.enter=\"submit\">\n\t\t<Button :disabled=\"loading\"\n\t\t\t@click=\"submit\">\n\t\t\t{{ t('settings', 'Create new app password') }}\n\t\t</Button>\n\t</div>\n\t<div v-else>\n\t\t{{ t('settings', 'Use the credentials below to configure your app or device.') }}\n\t\t{{ t('settings', 'For security reasons this password will only be shown once.') }}\n\t\t<div class=\"app-password-row\">\n\t\t\t<span class=\"app-password-label\">{{ t('settings', 'Username') }}</span>\n\t\t\t<input :value=\"loginName\"\n\t\t\t\ttype=\"text\"\n\t\t\t\tclass=\"monospaced\"\n\t\t\t\treadonly=\"readonly\"\n\t\t\t\t@focus=\"selectInput\">\n\t\t</div>\n\t\t<div class=\"app-password-row\">\n\t\t\t<span class=\"app-password-label\">{{ t('settings', 'Password') }}</span>\n\t\t\t<input ref=\"appPassword\"\n\t\t\t\t:value=\"appPassword\"\n\t\t\t\ttype=\"text\"\n\t\t\t\tclass=\"monospaced\"\n\t\t\t\treadonly=\"readonly\"\n\t\t\t\t@focus=\"selectInput\">\n\t\t\t<a ref=\"clipboardButton\"\n\t\t\t\tv-tooltip=\"copyTooltipOptions\"\n\t\t\t\tv-clipboard:copy=\"appPassword\"\n\t\t\t\tv-clipboard:success=\"onCopyPassword\"\n\t\t\t\tv-clipboard:error=\"onCopyPasswordFailed\"\n\t\t\t\tclass=\"icon icon-clippy\"\n\t\t\t\t@mouseover=\"hoveringCopyButton = true\"\n\t\t\t\t@mouseleave=\"hoveringCopyButton = false\" />\n\t\t\t<Button @click=\"reset\">\n\t\t\t\t{{ t('settings', 'Done') }}\n\t\t\t</Button>\n\t\t</div>\n\t\t<div class=\"app-password-row\">\n\t\t\t<span class=\"app-password-label\" />\n\t\t\t<a v-if=\"!showQR\"\n\t\t\t\t@click=\"showQR = true\">\n\t\t\t\t{{ t('settings', 'Show QR code for mobile apps') }}\n\t\t\t</a>\n\t\t\t<QR v-else\n\t\t\t\t:value=\"qrUrl\" />\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport QR from '@chenfengyuan/vue-qrcode'\nimport confirmPassword from '@nextcloud/password-confirmation'\nimport { getRootUrl } from '@nextcloud/router'\nimport Button from '@nextcloud/vue/dist/Components/Button'\n\nexport default {\n\tname: 'AuthTokenSetupDialogue',\n\tcomponents: {\n\t\tQR,\n\t\tButton,\n\t},\n\tprops: {\n\t\tadd: {\n\t\t\ttype: Function,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tadding: false,\n\t\t\tloading: false,\n\t\t\tdeviceName: '',\n\t\t\tappPassword: '',\n\t\t\tloginName: '',\n\t\t\tpasswordCopied: false,\n\t\t\tshowQR: false,\n\t\t\tqrUrl: '',\n\t\t\thoveringCopyButton: false,\n\t\t}\n\t},\n\tcomputed: {\n\t\tcopyTooltipOptions() {\n\t\t\tconst base = {\n\t\t\t\thideOnTargetClick: false,\n\t\t\t\ttrigger: 'manual',\n\t\t\t}\n\n\t\t\tif (this.passwordCopied) {\n\t\t\t\treturn {\n\t\t\t\t\t...base,\n\t\t\t\t\tcontent: t('settings', 'Copied!'),\n\t\t\t\t\tshow: true,\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn {\n\t\t\t\t\t...base,\n\t\t\t\t\tcontent: t('settings', 'Copy'),\n\t\t\t\t\tshow: this.hoveringCopyButton,\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t},\n\tmethods: {\n\t\tselectInput(e) {\n\t\t\te.currentTarget.select()\n\t\t},\n\t\tsubmit() {\n\t\t\tconfirmPassword()\n\t\t\t\t.then(() => {\n\t\t\t\t\tthis.loading = true\n\t\t\t\t\treturn this.add(this.deviceName)\n\t\t\t\t})\n\t\t\t\t.then(token => {\n\t\t\t\t\tthis.adding = true\n\t\t\t\t\tthis.loginName = token.loginName\n\t\t\t\t\tthis.appPassword = token.token\n\n\t\t\t\t\tconst server = window.location.protocol + '//' + window.location.host + getRootUrl()\n\t\t\t\t\tthis.qrUrl = `nc://login/user:${token.loginName}&password:${token.token}&server:${server}`\n\n\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\tthis.$refs.appPassword.select()\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t.catch(err => {\n\t\t\t\t\tconsole.error('could not create a new app password', err)\n\t\t\t\t\tOC.Notification.showTemporary(t('settings', 'Error while creating device token'))\n\n\t\t\t\t\tthis.reset()\n\t\t\t\t})\n\t\t},\n\t\tonCopyPassword() {\n\t\t\tthis.passwordCopied = true\n\t\t\tthis.$refs.clipboardButton.blur()\n\t\t\tsetTimeout(() => { this.passwordCopied = false }, 3000)\n\t\t},\n\t\tonCopyPasswordFailed() {\n\t\t\tOC.Notification.showTemporary(t('settings', 'Could not copy app password. Please copy it manually.'))\n\t\t},\n\t\treset() {\n\t\t\tthis.adding = false\n\t\t\tthis.loading = false\n\t\t\tthis.showQR = false\n\t\t\tthis.qrUrl = ''\n\t\t\tthis.deviceName = ''\n\t\t\tthis.appPassword = ''\n\t\t\tthis.loginName = ''\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n\t.app-password-row {\n\t\tdisplay: table-row;\n\n\t\t.icon {\n\t\t\tbackground-size: 16px 16px;\n\t\t\tdisplay: inline-block;\n\t\t\tposition: relative;\n\t\t\ttop: 3px;\n\t\t\tmargin-left: 5px;\n\t\t\tmargin-right: 8px;\n\t\t}\n\n\t}\n\n\t.app-password-label {\n\t\tdisplay: table-cell;\n\t\tpadding-right: 1em;\n\t\ttext-align: right;\n\t\tvertical-align: middle;\n\t}\n\n\t.monospaced {\n\t\twidth: 245px;\n\t\tfont-family: monospace;\n\t}\n\n\t.button-vue{\n\t\tdisplay:inline-block;\n\t\tmargin: 3px 3px 3px 3px;\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!./AuthTokenSetupDialogue.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!./AuthTokenSetupDialogue.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!./AuthTokenSetupDialogue.vue?vue&type=style&index=0&id=6a24fa34&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!./AuthTokenSetupDialogue.vue?vue&type=style&index=0&id=6a24fa34&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AuthTokenSetupDialogue.vue?vue&type=template&id=6a24fa34&scoped=true&\"\nimport script from \"./AuthTokenSetupDialogue.vue?vue&type=script&lang=js&\"\nexport * from \"./AuthTokenSetupDialogue.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AuthTokenSetupDialogue.vue?vue&type=style&index=0&id=6a24fa34&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 \"6a24fa34\",\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 (!_vm.adding)?_c('div',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.deviceName),expression:\"deviceName\"}],attrs:{\"type\":\"text\",\"maxlength\":120,\"disabled\":_vm.loading,\"placeholder\":_vm.t('settings', 'App name')},domProps:{\"value\":(_vm.deviceName)},on:{\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.submit.apply(null, arguments)},\"input\":function($event){if($event.target.composing){ return; }_vm.deviceName=$event.target.value}}}),_vm._v(\" \"),_c('Button',{attrs:{\"disabled\":_vm.loading},on:{\"click\":_vm.submit}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('settings', 'Create new app password'))+\"\\n\\t\")])],1):_c('div',[_vm._v(\"\\n\\t\"+_vm._s(_vm.t('settings', 'Use the credentials below to configure your app or device.'))+\"\\n\\t\"+_vm._s(_vm.t('settings', 'For security reasons this password will only be shown once.'))+\"\\n\\t\"),_c('div',{staticClass:\"app-password-row\"},[_c('span',{staticClass:\"app-password-label\"},[_vm._v(_vm._s(_vm.t('settings', 'Username')))]),_vm._v(\" \"),_c('input',{staticClass:\"monospaced\",attrs:{\"type\":\"text\",\"readonly\":\"readonly\"},domProps:{\"value\":_vm.loginName},on:{\"focus\":_vm.selectInput}})]),_vm._v(\" \"),_c('div',{staticClass:\"app-password-row\"},[_c('span',{staticClass:\"app-password-label\"},[_vm._v(_vm._s(_vm.t('settings', 'Password')))]),_vm._v(\" \"),_c('input',{ref:\"appPassword\",staticClass:\"monospaced\",attrs:{\"type\":\"text\",\"readonly\":\"readonly\"},domProps:{\"value\":_vm.appPassword},on:{\"focus\":_vm.selectInput}}),_vm._v(\" \"),_c('a',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.copyTooltipOptions),expression:\"copyTooltipOptions\"},{name:\"clipboard\",rawName:\"v-clipboard:copy\",value:(_vm.appPassword),expression:\"appPassword\",arg:\"copy\"},{name:\"clipboard\",rawName:\"v-clipboard:success\",value:(_vm.onCopyPassword),expression:\"onCopyPassword\",arg:\"success\"},{name:\"clipboard\",rawName:\"v-clipboard:error\",value:(_vm.onCopyPasswordFailed),expression:\"onCopyPasswordFailed\",arg:\"error\"}],ref:\"clipboardButton\",staticClass:\"icon icon-clippy\",on:{\"mouseover\":function($event){_vm.hoveringCopyButton = true},\"mouseleave\":function($event){_vm.hoveringCopyButton = false}}}),_vm._v(\" \"),_c('Button',{on:{\"click\":_vm.reset}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Done'))+\"\\n\\t\\t\")])],1),_vm._v(\" \"),_c('div',{staticClass:\"app-password-row\"},[_c('span',{staticClass:\"app-password-label\"}),_vm._v(\" \"),(!_vm.showQR)?_c('a',{on:{\"click\":function($event){_vm.showQR = true}}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Show QR code for mobile apps'))+\"\\n\\t\\t\")]):_c('QR',{attrs:{\"value\":_vm.qrUrl}})],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>\n -\n - @author 2019 Christoph Wurst <christoph@winzerhof-wurst.at>\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<template>\n\t<div id=\"security\" class=\"section\">\n\t\t<h2>{{ t('settings', 'Devices & sessions', {}, undefined, {sanitize: false}) }}</h2>\n\t\t<p class=\"settings-hint hidden-when-empty\">\n\t\t\t{{ t('settings', 'Web, desktop and mobile clients currently logged in to your account.') }}\n\t\t</p>\n\t\t<AuthTokenList :tokens=\"tokens\"\n\t\t\t@toggle-scope=\"toggleTokenScope\"\n\t\t\t@rename=\"rename\"\n\t\t\t@delete=\"deleteToken\"\n\t\t\t@wipe=\"wipeToken\" />\n\t\t<AuthTokenSetupDialogue v-if=\"canCreateToken\" :add=\"addNewToken\" />\n\t</div>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport confirmPassword from '@nextcloud/password-confirmation'\nimport { generateUrl } from '@nextcloud/router'\n\nimport AuthTokenList from './AuthTokenList'\nimport AuthTokenSetupDialogue from './AuthTokenSetupDialogue'\n\nconst confirm = () => {\n\treturn new Promise(resolve => {\n\t\tOC.dialogs.confirm(\n\t\t\tt('settings', 'Do you really want to wipe your data from this device?'),\n\t\t\tt('settings', 'Confirm wipe'),\n\t\t\tresolve,\n\t\t\ttrue\n\t\t)\n\t})\n}\n\n/**\n * Tap into a promise without losing the value\n *\n * @param {Function} cb the callback\n * @return {any} val the value\n */\nconst tap = cb => val => {\n\tcb(val)\n\treturn val\n}\n\nexport default {\n\tname: 'AuthTokenSection',\n\tcomponents: {\n\t\tAuthTokenSetupDialogue,\n\t\tAuthTokenList,\n\t},\n\tprops: {\n\t\ttokens: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t},\n\t\tcanCreateToken: {\n\t\t\ttype: Boolean,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tbaseUrl: generateUrl('/settings/personal/authtokens'),\n\t\t}\n\t},\n\tmethods: {\n\t\taddNewToken(name) {\n\t\t\tconsole.debug('creating a new app token', name)\n\n\t\t\tconst data = {\n\t\t\t\tname,\n\t\t\t}\n\t\t\treturn axios.post(this.baseUrl, data)\n\t\t\t\t.then(resp => resp.data)\n\t\t\t\t.then(tap(() => console.debug('app token created')))\n\t\t\t\t// eslint-disable-next-line vue/no-mutating-props\n\t\t\t\t.then(tap(data => this.tokens.push(data.deviceToken)))\n\t\t\t\t.catch(err => {\n\t\t\t\t\tconsole.error.bind('could not create app password', err)\n\t\t\t\t\tOC.Notification.showTemporary(t('settings', 'Error while creating device token'))\n\t\t\t\t\tthrow err\n\t\t\t\t})\n\t\t},\n\t\ttoggleTokenScope(token, scope, value) {\n\t\t\tconsole.debug('updating app token scope', token.id, scope, value)\n\n\t\t\tconst oldVal = token.scope[scope]\n\t\t\ttoken.scope[scope] = value\n\n\t\t\treturn this.updateToken(token)\n\t\t\t\t.then(tap(() => console.debug('app token scope updated')))\n\t\t\t\t.catch(err => {\n\t\t\t\t\tconsole.error.bind('could not update app token scope', err)\n\t\t\t\t\tOC.Notification.showTemporary(t('settings', 'Error while updating device token scope'))\n\n\t\t\t\t\t// Restore\n\t\t\t\t\ttoken.scope[scope] = oldVal\n\n\t\t\t\t\tthrow err\n\t\t\t\t})\n\t\t},\n\t\trename(token, newName) {\n\t\t\tconsole.debug('renaming app token', token.id, token.name, newName)\n\n\t\t\tconst oldName = token.name\n\t\t\ttoken.name = newName\n\n\t\t\treturn this.updateToken(token)\n\t\t\t\t.then(tap(() => console.debug('app token name updated')))\n\t\t\t\t.catch(err => {\n\t\t\t\t\tconsole.error.bind('could not update app token name', err)\n\t\t\t\t\tOC.Notification.showTemporary(t('settings', 'Error while updating device token name'))\n\n\t\t\t\t\t// Restore\n\t\t\t\t\ttoken.name = oldName\n\t\t\t\t})\n\t\t},\n\t\tupdateToken(token) {\n\t\t\treturn axios.put(this.baseUrl + '/' + token.id, token)\n\t\t\t\t.then(resp => resp.data)\n\t\t},\n\t\tdeleteToken(token) {\n\t\t\tconsole.debug('deleting app token', token)\n\n\t\t\t// eslint-disable-next-line vue/no-mutating-props\n\t\t\tthis.tokens = this.tokens.filter(t => t !== token)\n\n\t\t\treturn axios.delete(this.baseUrl + '/' + token.id)\n\t\t\t\t.then(resp => resp.data)\n\t\t\t\t.then(tap(() => console.debug('app token deleted')))\n\t\t\t\t.catch(err => {\n\t\t\t\t\tconsole.error.bind('could not delete app token', err)\n\t\t\t\t\tOC.Notification.showTemporary(t('settings', 'Error while deleting the token'))\n\n\t\t\t\t\t// Restore\n\t\t\t\t\t// eslint-disable-next-line vue/no-mutating-props\n\t\t\t\t\tthis.tokens.push(token)\n\t\t\t\t})\n\t\t},\n\t\tasync wipeToken(token) {\n\t\t\tconsole.debug('wiping app token', token)\n\n\t\t\ttry {\n\t\t\t\tawait confirmPassword()\n\n\t\t\t\tif (!(await confirm())) {\n\t\t\t\t\tconsole.debug('wipe aborted by user')\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tawait axios.post(this.baseUrl + '/wipe/' + token.id)\n\t\t\t\tconsole.debug('app token marked for wipe')\n\n\t\t\t\ttoken.type = 2\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error('could not wipe app token', err)\n\t\t\t\tOC.Notification.showTemporary(t('settings', 'Error while wiping the device with the token'))\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AuthTokenSection.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!./AuthTokenSection.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./AuthTokenSection.vue?vue&type=template&id=451cdc4a&scoped=true&\"\nimport script from \"./AuthTokenSection.vue?vue&type=script&lang=js&\"\nexport * from \"./AuthTokenSection.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 \"451cdc4a\",\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\",attrs:{\"id\":\"security\"}},[_c('h2',[_vm._v(_vm._s(_vm.t('settings', 'Devices & sessions', {}, undefined, {sanitize: false})))]),_vm._v(\" \"),_c('p',{staticClass:\"settings-hint hidden-when-empty\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('settings', 'Web, desktop and mobile clients currently logged in to your account.'))+\"\\n\\t\")]),_vm._v(\" \"),_c('AuthTokenList',{attrs:{\"tokens\":_vm.tokens},on:{\"toggle-scope\":_vm.toggleTokenScope,\"rename\":_vm.rename,\"delete\":_vm.deleteToken,\"wipe\":_vm.wipeToken}}),_vm._v(\" \"),(_vm.canCreateToken)?_c('AuthTokenSetupDialogue',{attrs:{\"add\":_vm.addNewToken}}):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>\n *\n * @author Christoph Wurst <christoph@winzerhof-wurst.at>\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 { loadState } from '@nextcloud/initial-state'\nimport Vue from 'vue'\nimport VueClipboard from 'vue-clipboard2'\nimport VTooltip from 'v-tooltip'\n\nimport AuthTokenSection from './components/AuthTokenSection'\n\n// eslint-disable-next-line camelcase\n__webpack_nonce__ = btoa(OC.requestToken)\n\nVue.use(VueClipboard)\nVue.use(VTooltip, { defaultHtml: false })\nVue.prototype.t = t\n\nconst View = Vue.extend(AuthTokenSection)\nnew View({\n\tpropsData: {\n\t\ttokens: loadState('settings', 'app_tokens'),\n\t\tcanCreateToken: loadState('settings', 'can_create_app_token'),\n\t},\n}).$mount('#security-authtokens')\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, \".wiping[data-v-6852e55e]{background-color:var(--color-background-darker)}td[data-v-6852e55e]{border-top:1px solid var(--color-border);max-width:200px;white-space:normal;vertical-align:middle;position:relative}td.client[data-v-6852e55e],td.more[data-v-6852e55e]{overflow:visible;position:relative;width:44px;height:44px}td.token-name[data-v-6852e55e]{padding:10px 6px}td.token-name.token-rename[data-v-6852e55e]{padding:0}td.token-name input[data-v-6852e55e]{width:100%;margin:0}td.token-name .wiping-warning[data-v-6852e55e]{color:var(--color-text-lighter)}td.more[data-v-6852e55e]{padding:0 10px}td.client div[data-v-6852e55e]{opacity:.57;width:44px;height:44px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/AuthToken.vue\"],\"names\":[],\"mappings\":\"AAiQA,yBACC,+CAAA,CAGD,oBACC,wCAAA,CACA,eAAA,CACA,kBAAA,CACA,qBAAA,CACA,iBAAA,CAEA,oDACC,gBAAA,CACA,iBAAA,CACA,UAAA,CACA,WAAA,CAGD,+BACC,gBAAA,CAEA,4CACC,SAAA,CAGD,qCACC,UAAA,CACA,QAAA,CAGF,+CACC,+BAAA,CAGD,yBAEC,cAAA,CAMA,+BACC,WAAA,CACA,UAAA,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\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n.wiping {\\n\\tbackground-color: var(--color-background-darker);\\n}\\n\\ntd {\\n\\tborder-top: 1px solid var(--color-border);\\n\\tmax-width: 200px;\\n\\twhite-space: normal;\\n\\tvertical-align: middle;\\n\\tposition: relative;\\n\\n\\t&%icon {\\n\\t\\toverflow: visible;\\n\\t\\tposition: relative;\\n\\t\\twidth: 44px;\\n\\t\\theight: 44px;\\n\\t}\\n\\n\\t&.token-name {\\n\\t\\tpadding: 10px 6px;\\n\\n\\t\\t&.token-rename {\\n\\t\\t\\tpadding: 0;\\n\\t\\t}\\n\\n\\t\\tinput {\\n\\t\\t\\twidth: 100%;\\n\\t\\t\\tmargin: 0;\\n\\t\\t}\\n\\t}\\n\\t&.token-name .wiping-warning {\\n\\t\\tcolor: var(--color-text-lighter);\\n\\t}\\n\\n\\t&.more {\\n\\t\\t@extend %icon;\\n\\t\\tpadding: 0 10px;\\n\\t}\\n\\n\\t&.client {\\n\\t\\t@extend %icon;\\n\\n\\t\\tdiv {\\n\\t\\t\\topacity: 0.57;\\n\\t\\t\\twidth: 44px;\\n\\t\\t\\theight: 44px;\\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, \"table[data-v-4f8ceff3]{width:100%;min-height:50px;padding-top:5px;max-width:580px}table th[data-v-4f8ceff3]{opacity:.5;padding:10px 0}.token-list td>a.icon-more[data-v-4f8ceff3]{transition:opacity var(--animation-quick)}.token-list a.icon-more[data-v-4f8ceff3]{padding:14px;display:block;width:44px;height:44px;opacity:.5}.token-list tr:hover td>a.icon[data-v-4f8ceff3],.token-list tr td>a.icon[data-v-4f8ceff3]:focus,.token-list tr.active td>a.icon[data-v-4f8ceff3]{opacity:1}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/AuthTokenList.vue\"],\"names\":[],\"mappings\":\"AAwFA,uBACC,UAAA,CACA,eAAA,CACA,eAAA,CACA,eAAA,CAEA,0BACC,UAAA,CACA,cAAA,CAKD,4CACC,yCAAA,CAGD,yCACC,YAAA,CACA,aAAA,CACA,UAAA,CACA,WAAA,CACA,UAAA,CAIA,iJAGC,SAAA\",\"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\\ntable {\\n\\twidth: 100%;\\n\\tmin-height: 50px;\\n\\tpadding-top: 5px;\\n\\tmax-width: 580px;\\n\\n\\tth {\\n\\t\\topacity: .5;\\n\\t\\tpadding: 10px 0;\\n\\t}\\n}\\n\\n.token-list {\\n\\ttd > a.icon-more {\\n\\t\\ttransition: opacity var(--animation-quick);\\n\\t}\\n\\n\\ta.icon-more {\\n\\t\\tpadding: 14px;\\n\\t\\tdisplay: block;\\n\\t\\twidth: 44px;\\n\\t\\theight: 44px;\\n\\t\\topacity: .5;\\n\\t}\\n\\n\\ttr {\\n\\t\\t&:hover td > a.icon,\\n\\t\\ttd > a.icon:focus,\\n\\t\\t&.active td > a.icon {\\n\\t\\t\\topacity: 1;\\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, \"#app-tokens-table tr>*:nth-child(2){padding-left:6px}#app-tokens-table tr>*:nth-child(3){text-align:right}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/AuthTokenList.vue\"],\"names\":[],\"mappings\":\"AA8HC,oCACC,gBAAA,CAGD,oCACC,gBAAA\",\"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#app-tokens-table {\\n\\ttr > *:nth-child(2) {\\n\\t\\tpadding-left: 6px;\\n\\t}\\n\\n\\ttr > *:nth-child(3) {\\n\\t\\ttext-align: right;\\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, \".app-password-row[data-v-6a24fa34]{display:table-row}.app-password-row .icon[data-v-6a24fa34]{background-size:16px 16px;display:inline-block;position:relative;top:3px;margin-left:5px;margin-right:8px}.app-password-label[data-v-6a24fa34]{display:table-cell;padding-right:1em;text-align:right;vertical-align:middle}.monospaced[data-v-6a24fa34]{width:245px;font-family:monospace}.button-vue[data-v-6a24fa34]{display:inline-block;margin:3px 3px 3px 3px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/AuthTokenSetupDialogue.vue\"],\"names\":[],\"mappings\":\"AAqLA,mCACC,iBAAA,CAEA,yCACC,yBAAA,CACA,oBAAA,CACA,iBAAA,CACA,OAAA,CACA,eAAA,CACA,gBAAA,CAKF,qCACC,kBAAA,CACA,iBAAA,CACA,gBAAA,CACA,qBAAA,CAGD,6BACC,WAAA,CACA,qBAAA,CAGD,6BACC,oBAAA,CACA,sBAAA\",\"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.app-password-row {\\n\\tdisplay: table-row;\\n\\n\\t.icon {\\n\\t\\tbackground-size: 16px 16px;\\n\\t\\tdisplay: inline-block;\\n\\t\\tposition: relative;\\n\\t\\ttop: 3px;\\n\\t\\tmargin-left: 5px;\\n\\t\\tmargin-right: 8px;\\n\\t}\\n\\n}\\n\\n.app-password-label {\\n\\tdisplay: table-cell;\\n\\tpadding-right: 1em;\\n\\ttext-align: right;\\n\\tvertical-align: middle;\\n}\\n\\n.monospaced {\\n\\twidth: 245px;\\n\\tfont-family: monospace;\\n}\\n\\n.button-vue{\\n\\tdisplay:inline-block;\\n\\tmargin: 3px 3px 3px 3px;\\n}\\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 = 4783;","__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\t4783: 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));","// 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__(73887); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","component","_vm","this","_h","$createElement","_c","_self","class","wiping","attrs","token","id","staticClass","iconName","icon","_v","canRename","renaming","directives","name","rawName","value","expression","ref","domProps","on","$event","type","indexOf","_k","keyCode","key","rename","apply","arguments","cancelRename","target","composing","newName","_s","t","_e","lastActivityRelative","current","content","container","modifiers","actionOpen","scope","filesystem","stopPropagation","preventDefault","$emit","startRename","revoke","wipe","tokens","_l","toggleScope","onDelete","onWipe","adding","loginName","selectInput","appPassword","arg","hoveringCopyButton","reset","showQR","qrUrl","loading","submit","deviceName","undefined","sanitize","toggleTokenScope","deleteToken","wipeToken","addNewToken","__webpack_nonce__","btoa","OC","requestToken","Vue","VueClipboard","VTooltip","defaultHtml","AuthTokenSection","propsData","loadState","canCreateToken","$mount","___CSS_LOADER_EXPORT___","push","module","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","loaded","__webpack_modules__","call","m","amdD","Error","amdO","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","Object","keys","every","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","g","globalThis","Function","e","window","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","nmd","paths","children","b","document","baseURI","self","location","href","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","some","chunkLoadingGlobal","forEach","bind","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file diff --git a/dist/user_status-menu.js b/dist/user_status-menu.js index e3dd26ac06c..285f2e376a6 100644 --- a/dist/user_status-menu.js +++ b/dist/user_status-menu.js @@ -1,3 +1,3 @@ /*! For license information please see user_status-menu.js.LICENSE.txt */ -!function(){var e,n,r,s={82205:function(e,n,r){"use strict";var s=r(20144),a=r(22200),o=r(79753),i=r(16453),u=r(74854),c=r(20296),l=r.n(c),d=r(4820);function m(t,e,n,r,s,a,o){try{var i=t[a](o),u=i.value}catch(t){return void n(t)}i.done?e(u):Promise.resolve(u).then(r,s)}var f=function(){var t,e=(t=regeneratorRuntime.mark((function t(e){var n,r;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return n=(0,o.generateUrl)("/apps/user_status/heartbeat"),t.next=3,d.default.put(n,{status:e?"away":"online"});case 3:return r=t.sent,t.abrupt("return",r.data);case 5:case"end":return t.stop()}}),t)})),function(){var e=this,n=arguments;return new Promise((function(r,s){var a=t.apply(e,n);function o(t){m(a,r,s,o,i,"next",t)}function i(t){m(a,r,s,o,i,"throw",t)}o(void 0)}))});return function(t){return e.apply(this,arguments)}}(),p=r(84387);function h(t,e,n,r,s,a,o){try{var i=t[a](o),u=i.value}catch(t){return void n(t)}i.done?e(u):Promise.resolve(u).then(r,s)}var v=(0,i.loadState)("user_status","profileEnabled",!1).profileEnabled,g={name:"UserStatus",components:{SetStatusModal:function(){return Promise.all([r.e(7874),r.e(8299)]).then(r.bind(r,21516))}},mixins:[p.Z],props:{inline:{type:Boolean,default:!1}},data:function(){return{displayName:(0,a.getCurrentUser)().displayName,heartbeatInterval:null,isAway:!1,isModalOpen:!1,loadingProfilePage:!1,mouseMoveListener:null,profileEnabled:v,setAwayTimeout:null}},computed:{profilePageLink:function(){return this.profileEnabled?(0,o.generateUrl)("/u/{userId}",{userId:(0,a.getCurrentUser)().uid}):null}},mounted:function(){var t=this;(0,u.subscribe)("settings:display-name:updated",this.handleDisplayNameUpdate),(0,u.subscribe)("settings:profile-enabled:updated",this.handleProfileEnabledUpdate),this.$store.dispatch("loadStatusFromInitialState"),OC.config.session_keepalive&&(this.heartbeatInterval=setInterval(this._backgroundHeartbeat.bind(this),3e5),this.setAwayTimeout=function(){t.isAway=!0},this.mouseMoveListener=l()((function(){var e=t.isAway;t.isAway=!1,clearTimeout(t.setAwayTimeout),setTimeout(t.setAwayTimeout,12e4),e&&t._backgroundHeartbeat()}),2e3,!0),window.addEventListener("mousemove",this.mouseMoveListener,{capture:!0,passive:!0}),this._backgroundHeartbeat()),(0,u.subscribe)("user_status:status.updated",this.handleUserStatusUpdated)},beforeDestroy:function(){(0,u.unsubscribe)("settings:display-name:updated",this.handleDisplayNameUpdate),(0,u.unsubscribe)("settings:profile-enabled:updated",this.handleProfileEnabledUpdate),window.removeEventListener("mouseMove",this.mouseMoveListener),clearInterval(this.heartbeatInterval),(0,u.unsubscribe)("user_status:status.updated",this.handleUserStatusUpdated)},methods:{handleDisplayNameUpdate:function(t){this.displayName=t},handleProfileEnabledUpdate:function(t){this.profileEnabled=t},loadProfilePage:function(){this.profileEnabled&&(this.loadingProfilePage=!0)},openModal:function(){this.isModalOpen=!0},closeModal:function(){this.isModalOpen=!1},_backgroundHeartbeat:function(){var t,e=this;return(t=regeneratorRuntime.mark((function t(){var n,r;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,f(e.isAway);case 3:if(null==(n=t.sent)||!n.userId){t.next=8;break}e.$store.dispatch("setStatusFromHeartbeat",n),t.next=10;break;case 8:return t.next=10,e.$store.dispatch("reFetchStatusFromServer");case 10:t.next=15;break;case 12:t.prev=12,t.t0=t.catch(0),console.debug("Failed sending heartbeat, got: "+(null===(r=t.t0.response)||void 0===r?void 0:r.status));case 15:case"end":return t.stop()}}),t,null,[[0,12]])})),function(){var e=this,n=arguments;return new Promise((function(r,s){var a=t.apply(e,n);function o(t){h(a,r,s,o,i,"next",t)}function i(t){h(a,r,s,o,i,"throw",t)}o(void 0)}))})()},handleUserStatusUpdated:function(t){OC.getCurrentUser().uid===t.userId&&this.$store.dispatch("setStatusFromObject",{status:t.status,icon:t.icon,message:t.message})}}},A=g,b=r(93379),j=r.n(b),y=r(7795),w=r.n(y),C=r(90569),x=r.n(C),_=r(3565),k=r.n(_),S=r(19216),P=r.n(S),O=r(44589),I=r.n(O),U=r(45347),M={};M.styleTagTransform=I(),M.setAttributes=k(),M.insert=x().bind(null,"head"),M.domAPI=w(),M.insertStyleElement=P(),j()(U.Z,M),U.Z&&U.Z.locals&&U.Z.locals;var D=(0,r(51900).Z)(A,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("li",[n("div",{staticClass:"user-status-menu-item"},[t.inline?t._e():n("a",{staticClass:"user-status-menu-item__header",attrs:{href:t.profilePageLink},on:{click:t.loadProfilePage}},[n("div",{staticClass:"user-status-menu-item__header-content"},[n("div",{staticClass:"user-status-menu-item__header-content-displayname"},[t._v(t._s(t.displayName))]),t._v(" "),t.loadingProfilePage?n("div",{staticClass:"icon-loading-small"}):n("div",{staticClass:"user-status-menu-item__header-content-placeholder"})]),t._v(" "),t.profileEnabled?n("div",[t._v("\n\t\t\t\t"+t._s(t.t("user_status","View profile"))+"\n\t\t\t")]):t._e()]),t._v(" "),n(t.inline?"button":"a",{tag:"toggle",staticClass:"user-status-menu-item__toggle",class:{"user-status-menu-item__toggle--inline":t.inline},attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),e.stopPropagation(),t.openModal.apply(null,arguments)}}},[n("span",{staticClass:"user-status-menu-item__toggle-icon",class:t.statusIcon}),t._v("\n\t\t\t"+t._s(t.visibleMessage)+"\n\t\t")])],1),t._v(" "),t.isModalOpen?n("SetStatusModal",{on:{close:t.closeModal}}):t._e()],1)}),[],!1,null,"e652bbe6",null),E=D.exports,R=r(20629);function T(t,e,n,r,s,a,o){try{var i=t[a](o),u=i.value}catch(t){return void n(t)}i.done?e(u):Promise.resolve(u).then(r,s)}var z=function(){var t,e=(t=regeneratorRuntime.mark((function t(){var e,n;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return e=(0,o.generateOcsUrl)("apps/user_status/api/v1/predefined_statuses?format=json"),t.next=3,d.default.get(e);case 3:return n=t.sent,t.abrupt("return",n.data.ocs.data);case 5:case"end":return t.stop()}}),t)})),function(){var e=this,n=arguments;return new Promise((function(r,s){var a=t.apply(e,n);function o(t){T(a,r,s,o,i,"next",t)}function i(t){T(a,r,s,o,i,"throw",t)}o(void 0)}))});return function(){return e.apply(this,arguments)}}();function B(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=function(t,e){if(t){if("string"==typeof t)return F(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?F(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var r=0,s=function(){};return{s:s,n:function(){return r>=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:s}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,o=!0,i=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return o=t.done,t},e:function(t){i=!0,a=t},f:function(){try{o||null==n.return||n.return()}finally{if(i)throw a}}}}function F(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n<e;n++)r[n]=t[n];return r}function $(t,e,n,r,s,a,o){try{var i=t[a](o),u=i.value}catch(t){return void n(t)}i.done?e(u):Promise.resolve(u).then(r,s)}var N={loadAllPredefinedStatuses:function(t){return(e=regeneratorRuntime.mark((function e(){var n,r,s,a,o,i;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=t.state,r=t.commit,!(n.predefinedStatuses.length>0)){e.next=3;break}return e.abrupt("return");case 3:return e.next=5,z();case 5:s=e.sent,a=B(s);try{for(a.s();!(o=a.n()).done;)i=o.value,r("addPredefinedStatus",i)}catch(t){a.e(t)}finally{a.f()}case 8:case"end":return e.stop()}}),e)})),function(){var t=this,n=arguments;return new Promise((function(r,s){var a=e.apply(t,n);function o(t){$(a,r,s,o,i,"next",t)}function i(t){$(a,r,s,o,i,"throw",t)}o(void 0)}))})();var e}},L={state:{predefinedStatuses:[]},mutations:{addPredefinedStatus:function(t,e){t.predefinedStatuses.push(e)}},getters:{},actions:N};function q(t,e,n,r,s,a,o){try{var i=t[a](o),u=i.value}catch(t){return void n(t)}i.done?e(u):Promise.resolve(u).then(r,s)}function Z(t){return function(){var e=this,n=arguments;return new Promise((function(r,s){var a=t.apply(e,n);function o(t){q(a,r,s,o,i,"next",t)}function i(t){q(a,r,s,o,i,"throw",t)}o(void 0)}))}}var H=function(){var t=Z(regeneratorRuntime.mark((function t(){var e,n;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return e=(0,o.generateOcsUrl)("apps/user_status/api/v1/user_status"),t.next=3,d.default.get(e);case 3:return n=t.sent,t.abrupt("return",n.data.ocs.data);case 5:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}}(),G=function(){var t=Z(regeneratorRuntime.mark((function t(e){var n;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return n=(0,o.generateOcsUrl)("apps/user_status/api/v1/user_status/status"),t.next=3,d.default.put(n,{statusType:e});case 3:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}(),Q=function(){var t=Z(regeneratorRuntime.mark((function t(e){var n,r,s=arguments;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return n=s.length>1&&void 0!==s[1]?s[1]:null,r=(0,o.generateOcsUrl)("apps/user_status/api/v1/user_status/message/predefined?format=json"),t.next=4,d.default.put(r,{messageId:e,clearAt:n});case 4:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}(),W=function(){var t=Z(regeneratorRuntime.mark((function t(e){var n,r,s,a=arguments;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return n=a.length>1&&void 0!==a[1]?a[1]:null,r=a.length>2&&void 0!==a[2]?a[2]:null,s=(0,o.generateOcsUrl)("apps/user_status/api/v1/user_status/message/custom?format=json"),t.next=5,d.default.put(s,{message:e,statusIcon:n,clearAt:r});case 5:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}(),J=function(){var t=Z(regeneratorRuntime.mark((function t(){var e;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return e=(0,o.generateOcsUrl)("apps/user_status/api/v1/user_status/message?format=json"),t.next=3,d.default.delete(e);case 3:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}}(),K=r(64039),V=r(80351),X=r.n(V),Y=function(t){if(null===t)return null;var e=(0,K.n)();if("period"===t.type)return e.setSeconds(e.getSeconds()+t.time),Math.floor(e.getTime()/1e3);if("end-of"===t.type)switch(t.time){case"day":case"week":return Number(X()(e).endOf(t.time).format("X"))}return"_time"===t.type?t.time:null};function tt(t,e,n,r,s,a,o){try{var i=t[a](o),u=i.value}catch(t){return void n(t)}i.done?e(u):Promise.resolve(u).then(r,s)}function et(t){return function(){var e=this,n=arguments;return new Promise((function(r,s){var a=t.apply(e,n);function o(t){tt(a,r,s,o,i,"next",t)}function i(t){tt(a,r,s,o,i,"throw",t)}o(void 0)}))}}var nt={state:{status:null,statusIsUserDefined:null,message:null,icon:null,clearAt:null,messageIsPredefined:null,messageId:null},mutations:{setStatus:function(t,e){var n=e.statusType;t.status=n,t.statusIsUserDefined=!0},setPredefinedMessage:function(t,e){var n=e.messageId,r=e.clearAt,s=e.message,a=e.icon;t.messageId=n,t.messageIsPredefined=!0,t.message=s,t.icon=a,t.clearAt=r},setCustomMessage:function(t,e){var n=e.message,r=e.icon,s=e.clearAt;t.messageId=null,t.messageIsPredefined=!1,t.message=n,t.icon=r,t.clearAt=s},clearMessage:function(t){t.messageId=null,t.messageIsPredefined=!1,t.message=null,t.icon=null,t.clearAt=null},loadStatusFromServer:function(t,e){var n=e.status,r=e.statusIsUserDefined,s=e.message,a=e.icon,o=e.clearAt,i=e.messageIsPredefined,u=e.messageId;t.status=n,t.statusIsUserDefined=r,t.message=s,t.icon=a,t.clearAt=o,t.messageIsPredefined=i,t.messageId=u}},getters:{},actions:{setStatus:function(t,e){return et(regeneratorRuntime.mark((function n(){var r,s,o,i;return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return s=t.commit,o=t.state,i=e.statusType,n.next=4,G(i);case 4:s("setStatus",{statusType:i}),(0,u.emit)("user_status:status.updated",{status:o.status,message:o.message,icon:o.icon,clearAt:o.clearAt,userId:null===(r=(0,a.getCurrentUser)())||void 0===r?void 0:r.uid});case 6:case"end":return n.stop()}}),n)})))()},setStatusFromObject:function(t,e){return et(regeneratorRuntime.mark((function n(){var r;return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:r=t.commit,t.state,r("loadStatusFromServer",e);case 2:case"end":return n.stop()}}),n)})))()},setPredefinedMessage:function(t,e){return et(regeneratorRuntime.mark((function n(){var r,s,o,i,c,l,d,m,f,p;return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return s=t.commit,o=t.rootState,i=t.state,c=e.messageId,l=e.clearAt,d=Y(l),n.next=5,Q(c,d);case 5:m=o.predefinedStatuses.predefinedStatuses.find((function(t){return t.id===c})),f=m.message,p=m.icon,s("setPredefinedMessage",{messageId:c,clearAt:d,message:f,icon:p}),(0,u.emit)("user_status:status.updated",{status:i.status,message:i.message,icon:i.icon,clearAt:i.clearAt,userId:null===(r=(0,a.getCurrentUser)())||void 0===r?void 0:r.uid});case 9:case"end":return n.stop()}}),n)})))()},setCustomMessage:function(t,e){return et(regeneratorRuntime.mark((function n(){var r,s,o,i,c,l,d;return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return s=t.commit,o=t.state,i=e.message,c=e.icon,l=e.clearAt,d=Y(l),n.next=5,W(i,c,d);case 5:s("setCustomMessage",{message:i,icon:c,clearAt:d}),(0,u.emit)("user_status:status.updated",{status:o.status,message:o.message,icon:o.icon,clearAt:o.clearAt,userId:null===(r=(0,a.getCurrentUser)())||void 0===r?void 0:r.uid});case 7:case"end":return n.stop()}}),n)})))()},clearMessage:function(t){return et(regeneratorRuntime.mark((function e(){var n,r,s;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=t.commit,s=t.state,e.next=3,J();case 3:r("clearMessage"),(0,u.emit)("user_status:status.updated",{status:s.status,message:s.message,icon:s.icon,clearAt:s.clearAt,userId:null===(n=(0,a.getCurrentUser)())||void 0===n?void 0:n.uid});case 5:case"end":return e.stop()}}),e)})))()},reFetchStatusFromServer:function(t){return et(regeneratorRuntime.mark((function e(){var n,r;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.commit,e.next=3,H();case 3:r=e.sent,n("loadStatusFromServer",r);case 5:case"end":return e.stop()}}),e)})))()},setStatusFromHeartbeat:function(t,e){return et(regeneratorRuntime.mark((function n(){return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:(0,t.commit)("loadStatusFromServer",e);case 2:case"end":return n.stop()}}),n)})))()},loadStatusFromInitialState:function(t){(0,t.commit)("loadStatusFromServer",(0,i.loadState)("user_status","status"))}}};s.default.use(R.ZP);var rt=new R.yh({modules:{predefinedStatuses:L,userStatus:nt},strict:!0}),st=r(28017),at=r.n(st);r.nc=btoa((0,a.getRequestToken)()),s.default.prototype.t=t,s.default.prototype.$t=t;var ot=document.getElementById("avatardiv-menu"),it={preloadedUserStatus:{message:ot.dataset.userstatus_message,icon:ot.dataset.userstatus_icon,status:ot.dataset.userstatus},user:ot.dataset.user,displayName:ot.dataset.displayname,url:ot.dataset.avatar,disableMenu:!0,disableTooltip:!0};new(s.default.extend(at()))({propsData:it}).$mount("#avatardiv-menu"),new s.default({el:'li[data-id="user_status-menuitem"]',name:"UserStatusRoot",render:function(t){return t(E)},store:rt}),document.addEventListener("DOMContentLoaded",(function(){OCA.Dashboard&&OCA.Dashboard.registerStatus("status",(function(t){return new(s.default.extend(E))({propsData:{inline:!0},store:rt}).$mount(t)}))}))},84387:function(t,e,n){"use strict";var r=n(20629),s=n(26932);function a(t,e,n,r,s,a,o){try{var i=t[a](o),u=i.value}catch(t){return void n(t)}i.done?e(u):Promise.resolve(u).then(r,s)}function o(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function i(t){for(var e=1;e<arguments.length;e++){var n=null!=arguments[e]?arguments[e]:{};e%2?o(Object(n),!0).forEach((function(e){u(t,e,n[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))}))}return t}function u(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}e.Z={computed:i(i({},(0,r.rn)({statusType:function(t){return t.userStatus.status},statusIsUserDefined:function(t){return t.userStatus.statusIsUserDefined},customIcon:function(t){return t.userStatus.icon},customMessage:function(t){return t.userStatus.message}})),{},{visibleMessage:function(){if(this.customIcon&&this.customMessage)return"".concat(this.customIcon," ").concat(this.customMessage);if(this.customMessage)return this.customMessage;if(this.statusIsUserDefined)switch(this.statusType){case"online":return this.$t("user_status","Online");case"away":return this.$t("user_status","Away");case"dnd":return this.$t("user_status","Do not disturb");case"invisible":return this.$t("user_status","Invisible");case"offline":return this.$t("user_status","Offline")}return this.$t("user_status","Set status")},statusIcon:function(){switch(this.statusType){case"online":return"icon-user-status-online";case"away":return"icon-user-status-away";case"dnd":return"icon-user-status-dnd";case"invisible":case"offline":return"icon-user-status-invisible"}return""}}),methods:{changeStatus:function(t){var e,n=this;return(e=regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,n.$store.dispatch("setStatus",{statusType:t});case 3:e.next=9;break;case 5:e.prev=5,e.t0=e.catch(0),(0,s.x2)(n.$t("user_status","There was an error saving the new status")),console.debug(e.t0);case 9:case"end":return e.stop()}}),e,null,[[0,5]])})),function(){var t=this,n=arguments;return new Promise((function(r,s){var o=e.apply(t,n);function i(t){a(o,r,s,i,u,"next",t)}function u(t){a(o,r,s,i,u,"throw",t)}i(void 0)}))})()}}}},64039:function(t,e,n){"use strict";n.d(e,{n:function(){return r}});var r=function(){return new Date}},45347:function(t,e,n){"use strict";var r=n(87537),s=n.n(r),a=n(23645),o=n.n(a)()(s());o.push([t.id,".user-status-menu-item__header[data-v-e652bbe6]{display:flex !important;flex-direction:column !important;width:auto !important;height:66px !important;padding:10px 12px 5px 12px !important;align-items:flex-start !important;color:var(--color-main-text) !important}.user-status-menu-item__header[data-v-e652bbe6]:not([href]){height:var(--header-menu-item-height) !important;color:var(--color-text-maxcontrast) !important;cursor:default !important}.user-status-menu-item__header:not([href]) *[data-v-e652bbe6]{cursor:default !important}.user-status-menu-item__header[data-v-e652bbe6]:not([href]):hover{background-color:transparent !important}.user-status-menu-item__header-content[data-v-e652bbe6]{display:inline-flex !important;font-weight:bold !important;gap:0 10px !important;width:auto}.user-status-menu-item__header-content-displayname[data-v-e652bbe6]{width:auto}.user-status-menu-item__header-content-placeholder[data-v-e652bbe6]{width:16px !important;height:24px !important;margin-right:10px !important;visibility:hidden !important}.user-status-menu-item__header span[data-v-e652bbe6]{color:var(--color-text-maxcontrast) !important}.user-status-menu-item__toggle-icon[data-v-e652bbe6]{width:16px;height:16px;margin-right:10px;opacity:1 !important;background-size:16px}.user-status-menu-item__toggle--inline[data-v-e652bbe6]{width:auto;min-width:44px;height:44px;margin:0;border:0;border-radius:var(--border-radius-pill);background-color:var(--color-background-translucent);font-size:inherit;font-weight:normal;-webkit-backdrop-filter:var(--background-blur);backdrop-filter:var(--background-blur)}.user-status-menu-item__toggle--inline[data-v-e652bbe6]:active,.user-status-menu-item__toggle--inline[data-v-e652bbe6]:hover,.user-status-menu-item__toggle--inline[data-v-e652bbe6]:focus{background-color:var(--color-background-hover)}li[data-v-e652bbe6]{list-style-type:none}","",{version:3,sources:["webpack://./apps/user_status/src/UserStatus.vue"],names:[],mappings:"AAgOC,gDACC,uBAAA,CACA,gCAAA,CACA,qBAAA,CACA,sBAAA,CACA,qCAAA,CACA,iCAAA,CACA,uCAAA,CAEA,4DACC,gDAAA,CACA,8CAAA,CACA,yBAAA,CAEA,8DACC,yBAAA,CAGD,kEACC,uCAAA,CAIF,wDACC,8BAAA,CACA,2BAAA,CACA,qBAAA,CACA,UAAA,CAEA,oEACC,UAAA,CAGD,oEACC,qBAAA,CACA,sBAAA,CACA,4BAAA,CACA,4BAAA,CAIF,qDACC,8CAAA,CAKD,qDACC,UAAA,CACA,WAAA,CACA,iBAAA,CACA,oBAAA,CACA,oBAAA,CAID,wDACC,UAAA,CACA,cAAA,CACA,WAAA,CACA,QAAA,CACA,QAAA,CACA,uCAAA,CACA,oDAAA,CACA,iBAAA,CACA,kBAAA,CAEA,8CAAA,CACA,sCAAA,CAEA,2LAGC,8CAAA,CAMJ,oBACC,oBAAA",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.user-status-menu-item {\n\t&__header {\n\t\tdisplay: flex !important;\n\t\tflex-direction: column !important;\n\t\twidth: auto !important;\n\t\theight: 44px * 1.5 !important;\n\t\tpadding: 10px 12px 5px 12px !important;\n\t\talign-items: flex-start !important;\n\t\tcolor: var(--color-main-text) !important;\n\n\t\t&:not([href]) {\n\t\t\theight: var(--header-menu-item-height) !important;\n\t\t\tcolor: var(--color-text-maxcontrast) !important;\n\t\t\tcursor: default !important;\n\n\t\t\t& * {\n\t\t\t\tcursor: default !important;\n\t\t\t}\n\n\t\t\t&:hover {\n\t\t\t\tbackground-color: transparent !important;\n\t\t\t}\n\t\t}\n\n\t\t&-content {\n\t\t\tdisplay: inline-flex !important;\n\t\t\tfont-weight: bold !important;\n\t\t\tgap: 0 10px !important;\n\t\t\twidth: auto;\n\n\t\t\t&-displayname {\n\t\t\t\twidth: auto;\n\t\t\t}\n\n\t\t\t&-placeholder {\n\t\t\t\twidth: 16px !important;\n\t\t\t\theight: 24px !important;\n\t\t\t\tmargin-right: 10px !important;\n\t\t\t\tvisibility: hidden !important;\n\t\t\t}\n\t\t}\n\n\t\tspan {\n\t\t\tcolor: var(--color-text-maxcontrast) !important;\n\t\t}\n\t}\n\n\t&__toggle {\n\t\t&-icon {\n\t\t\twidth: 16px;\n\t\t\theight: 16px;\n\t\t\tmargin-right: 10px;\n\t\t\topacity: 1 !important;\n\t\t\tbackground-size: 16px;\n\t\t}\n\n\t\t// In dashboard\n\t\t&--inline {\n\t\t\twidth: auto;\n\t\t\tmin-width: 44px;\n\t\t\theight: 44px;\n\t\t\tmargin: 0;\n\t\t\tborder: 0;\n\t\t\tborder-radius: var(--border-radius-pill);\n\t\t\tbackground-color: var(--color-background-translucent);\n\t\t\tfont-size: inherit;\n\t\t\tfont-weight: normal;\n\n\t\t\t-webkit-backdrop-filter: var(--background-blur);\n\t\t\tbackdrop-filter: var(--background-blur);\n\n\t\t\t&:active,\n\t\t\t&:hover,\n\t\t\t&:focus {\n\t\t\t\tbackground-color: var(--color-background-hover);\n\t\t\t}\n\t\t}\n\t}\n}\n\nli {\n\tlist-style-type: none;\n}\n\n"],sourceRoot:""}]),e.Z=o},46700:function(t,e,n){var r={"./af":42786,"./af.js":42786,"./ar":30867,"./ar-dz":14130,"./ar-dz.js":14130,"./ar-kw":96135,"./ar-kw.js":96135,"./ar-ly":56440,"./ar-ly.js":56440,"./ar-ma":47702,"./ar-ma.js":47702,"./ar-sa":16040,"./ar-sa.js":16040,"./ar-tn":37100,"./ar-tn.js":37100,"./ar.js":30867,"./az":31083,"./az.js":31083,"./be":9808,"./be.js":9808,"./bg":68338,"./bg.js":68338,"./bm":67438,"./bm.js":67438,"./bn":8905,"./bn-bd":76225,"./bn-bd.js":76225,"./bn.js":8905,"./bo":11560,"./bo.js":11560,"./br":1278,"./br.js":1278,"./bs":80622,"./bs.js":80622,"./ca":2468,"./ca.js":2468,"./cs":5822,"./cs.js":5822,"./cv":50877,"./cv.js":50877,"./cy":47373,"./cy.js":47373,"./da":24780,"./da.js":24780,"./de":59740,"./de-at":60217,"./de-at.js":60217,"./de-ch":60894,"./de-ch.js":60894,"./de.js":59740,"./dv":5300,"./dv.js":5300,"./el":50837,"./el.js":50837,"./en-au":78348,"./en-au.js":78348,"./en-ca":77925,"./en-ca.js":77925,"./en-gb":22243,"./en-gb.js":22243,"./en-ie":46436,"./en-ie.js":46436,"./en-il":47207,"./en-il.js":47207,"./en-in":44175,"./en-in.js":44175,"./en-nz":76319,"./en-nz.js":76319,"./en-sg":31662,"./en-sg.js":31662,"./eo":92915,"./eo.js":92915,"./es":55655,"./es-do":55251,"./es-do.js":55251,"./es-mx":96112,"./es-mx.js":96112,"./es-us":71146,"./es-us.js":71146,"./es.js":55655,"./et":5603,"./et.js":5603,"./eu":77763,"./eu.js":77763,"./fa":76959,"./fa.js":76959,"./fi":11897,"./fi.js":11897,"./fil":42549,"./fil.js":42549,"./fo":94694,"./fo.js":94694,"./fr":94470,"./fr-ca":63049,"./fr-ca.js":63049,"./fr-ch":52330,"./fr-ch.js":52330,"./fr.js":94470,"./fy":5044,"./fy.js":5044,"./ga":29295,"./ga.js":29295,"./gd":2101,"./gd.js":2101,"./gl":38794,"./gl.js":38794,"./gom-deva":27884,"./gom-deva.js":27884,"./gom-latn":23168,"./gom-latn.js":23168,"./gu":95349,"./gu.js":95349,"./he":24206,"./he.js":24206,"./hi":30094,"./hi.js":30094,"./hr":30316,"./hr.js":30316,"./hu":22138,"./hu.js":22138,"./hy-am":11423,"./hy-am.js":11423,"./id":29218,"./id.js":29218,"./is":90135,"./is.js":90135,"./it":90626,"./it-ch":10150,"./it-ch.js":10150,"./it.js":90626,"./ja":39183,"./ja.js":39183,"./jv":24286,"./jv.js":24286,"./ka":12105,"./ka.js":12105,"./kk":47772,"./kk.js":47772,"./km":18758,"./km.js":18758,"./kn":79282,"./kn.js":79282,"./ko":33730,"./ko.js":33730,"./ku":1408,"./ku.js":1408,"./ky":33291,"./ky.js":33291,"./lb":36841,"./lb.js":36841,"./lo":55466,"./lo.js":55466,"./lt":57010,"./lt.js":57010,"./lv":37595,"./lv.js":37595,"./me":39861,"./me.js":39861,"./mi":35493,"./mi.js":35493,"./mk":95966,"./mk.js":95966,"./ml":87341,"./ml.js":87341,"./mn":5115,"./mn.js":5115,"./mr":10370,"./mr.js":10370,"./ms":9847,"./ms-my":41237,"./ms-my.js":41237,"./ms.js":9847,"./mt":72126,"./mt.js":72126,"./my":56165,"./my.js":56165,"./nb":64924,"./nb.js":64924,"./ne":16744,"./ne.js":16744,"./nl":93901,"./nl-be":59814,"./nl-be.js":59814,"./nl.js":93901,"./nn":83877,"./nn.js":83877,"./oc-lnc":92135,"./oc-lnc.js":92135,"./pa-in":15858,"./pa-in.js":15858,"./pl":64495,"./pl.js":64495,"./pt":89520,"./pt-br":57971,"./pt-br.js":57971,"./pt.js":89520,"./ro":96459,"./ro.js":96459,"./ru":21793,"./ru.js":21793,"./sd":40950,"./sd.js":40950,"./se":10490,"./se.js":10490,"./si":90124,"./si.js":90124,"./sk":64249,"./sk.js":64249,"./sl":14985,"./sl.js":14985,"./sq":51104,"./sq.js":51104,"./sr":49131,"./sr-cyrl":79915,"./sr-cyrl.js":79915,"./sr.js":49131,"./ss":85893,"./ss.js":85893,"./sv":98760,"./sv.js":98760,"./sw":91172,"./sw.js":91172,"./ta":27333,"./ta.js":27333,"./te":23110,"./te.js":23110,"./tet":52095,"./tet.js":52095,"./tg":27321,"./tg.js":27321,"./th":9041,"./th.js":9041,"./tk":19005,"./tk.js":19005,"./tl-ph":75768,"./tl-ph.js":75768,"./tlh":89444,"./tlh.js":89444,"./tr":72397,"./tr.js":72397,"./tzl":28254,"./tzl.js":28254,"./tzm":51106,"./tzm-latn":30699,"./tzm-latn.js":30699,"./tzm.js":51106,"./ug-cn":9288,"./ug-cn.js":9288,"./uk":67691,"./uk.js":67691,"./ur":13795,"./ur.js":13795,"./uz":6791,"./uz-latn":60588,"./uz-latn.js":60588,"./uz.js":6791,"./vi":65666,"./vi.js":65666,"./x-pseudo":14378,"./x-pseudo.js":14378,"./yo":75805,"./yo.js":75805,"./zh-cn":83839,"./zh-cn.js":83839,"./zh-hk":55726,"./zh-hk.js":55726,"./zh-mo":99807,"./zh-mo.js":99807,"./zh-tw":74152,"./zh-tw.js":74152};function s(t){var e=a(t);return n(e)}function a(t){if(!n.o(r,t)){var e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}return r[t]}s.keys=function(){return Object.keys(r)},s.resolve=a,t.exports=s,s.id=46700}},a={};function o(t){var e=a[t];if(void 0!==e)return e.exports;var n=a[t]={id:t,loaded:!1,exports:{}};return s[t].call(n.exports,n,n.exports,o),n.loaded=!0,n.exports}o.m=s,o.amdD=function(){throw new Error("define cannot be used indirect")},o.amdO={},e=[],o.O=function(t,n,r,s){if(!n){var a=1/0;for(l=0;l<e.length;l++){n=e[l][0],r=e[l][1],s=e[l][2];for(var i=!0,u=0;u<n.length;u++)(!1&s||a>=s)&&Object.keys(o.O).every((function(t){return o.O[t](n[u])}))?n.splice(u--,1):(i=!1,s<a&&(a=s));if(i){e.splice(l--,1);var c=r();void 0!==c&&(t=c)}}return t}s=s||0;for(var l=e.length;l>0&&e[l-1][2]>s;l--)e[l]=e[l-1];e[l]=[n,r,s]},o.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return o.d(e,{a:e}),e},o.d=function(t,e){for(var n in e)o.o(e,n)&&!o.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},o.f={},o.e=function(t){return Promise.all(Object.keys(o.f).reduce((function(e,n){return o.f[n](t,e),e}),[]))},o.u=function(t){return"user-status-modal-"+t+".js?v=3f331fd4343acdf15116"},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,e){return Object.prototype.hasOwnProperty.call(t,e)},n={},r="nextcloud:",o.l=function(t,e,s,a){if(n[t])n[t].push(e);else{var i,u;if(void 0!==s)for(var c=document.getElementsByTagName("script"),l=0;l<c.length;l++){var d=c[l];if(d.getAttribute("src")==t||d.getAttribute("data-webpack")==r+s){i=d;break}}i||(u=!0,(i=document.createElement("script")).charset="utf-8",i.timeout=120,o.nc&&i.setAttribute("nonce",o.nc),i.setAttribute("data-webpack",r+s),i.src=t),n[t]=[e];var m=function(e,r){i.onerror=i.onload=null,clearTimeout(f);var s=n[t];if(delete n[t],i.parentNode&&i.parentNode.removeChild(i),s&&s.forEach((function(t){return t(r)})),e)return e(r)},f=setTimeout(m.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=m.bind(null,i.onerror),i.onload=m.bind(null,i.onload),u&&document.head.appendChild(i)}},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=2613,function(){var t;o.g.importScripts&&(t=o.g.location+"");var e=o.g.document;if(!t&&e&&(e.currentScript&&(t=e.currentScript.src),!t)){var n=e.getElementsByTagName("script");n.length&&(t=n[n.length-1].src)}if(!t)throw new Error("Automatic publicPath is not supported in this browser");t=t.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),o.p=t}(),function(){o.b=document.baseURI||self.location.href;var t={2613:0};o.f.j=function(e,n){var r=o.o(t,e)?t[e]:void 0;if(0!==r)if(r)n.push(r[2]);else{var s=new Promise((function(n,s){r=t[e]=[n,s]}));n.push(r[2]=s);var a=o.p+o.u(e),i=new Error;o.l(a,(function(n){if(o.o(t,e)&&(0!==(r=t[e])&&(t[e]=void 0),r)){var s=n&&("load"===n.type?"missing":n.type),a=n&&n.target&&n.target.src;i.message="Loading chunk "+e+" failed.\n("+s+": "+a+")",i.name="ChunkLoadError",i.type=s,i.request=a,r[1](i)}}),"chunk-"+e,e)}},o.O.j=function(e){return 0===t[e]};var e=function(e,n){var r,s,a=n[0],i=n[1],u=n[2],c=0;if(a.some((function(e){return 0!==t[e]}))){for(r in i)o.o(i,r)&&(o.m[r]=i[r]);if(u)var l=u(o)}for(e&&e(n);c<a.length;c++)s=a[c],o.o(t,s)&&t[s]&&t[s][0](),t[s]=0;return o.O(l)},n=self.webpackChunknextcloud=self.webpackChunknextcloud||[];n.forEach(e.bind(null,0)),n.push=e.bind(null,n.push.bind(n))}();var i=o.O(void 0,[7874],(function(){return o(82205)}));i=o.O(i)}(); -//# sourceMappingURL=user_status-menu.js.map?v=cf2db141b48e020e780d
\ No newline at end of file +!function(){var e,n,r,s={40814:function(e,n,r){"use strict";var s=r(20144),a=r(22200),o=r(79753),i=r(16453),u=r(74854),c=r(20296),l=r.n(c),d=r(4820);function m(t,e,n,r,s,a,o){try{var i=t[a](o),u=i.value}catch(t){return void n(t)}i.done?e(u):Promise.resolve(u).then(r,s)}var f=function(){var t,e=(t=regeneratorRuntime.mark((function t(e){var n,r;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return n=(0,o.generateUrl)("/apps/user_status/heartbeat"),t.next=3,d.default.put(n,{status:e?"away":"online"});case 3:return r=t.sent,t.abrupt("return",r.data);case 5:case"end":return t.stop()}}),t)})),function(){var e=this,n=arguments;return new Promise((function(r,s){var a=t.apply(e,n);function o(t){m(a,r,s,o,i,"next",t)}function i(t){m(a,r,s,o,i,"throw",t)}o(void 0)}))});return function(t){return e.apply(this,arguments)}}(),p=r(84387);function v(t,e,n,r,s,a,o){try{var i=t[a](o),u=i.value}catch(t){return void n(t)}i.done?e(u):Promise.resolve(u).then(r,s)}var h=(0,i.loadState)("user_status","profileEnabled",!1).profileEnabled,g={name:"UserStatus",components:{SetStatusModal:function(){return Promise.all([r.e(7874),r.e(8299)]).then(r.bind(r,21516))}},mixins:[p.Z],props:{inline:{type:Boolean,default:!1}},data:function(){return{displayName:(0,a.getCurrentUser)().displayName,heartbeatInterval:null,isAway:!1,isModalOpen:!1,loadingProfilePage:!1,mouseMoveListener:null,profileEnabled:h,setAwayTimeout:null}},computed:{profilePageLink:function(){return this.profileEnabled?(0,o.generateUrl)("/u/{userId}",{userId:(0,a.getCurrentUser)().uid}):null}},mounted:function(){var t=this;(0,u.subscribe)("settings:display-name:updated",this.handleDisplayNameUpdate),(0,u.subscribe)("settings:profile-enabled:updated",this.handleProfileEnabledUpdate),this.$store.dispatch("loadStatusFromInitialState"),OC.config.session_keepalive&&(this.heartbeatInterval=setInterval(this._backgroundHeartbeat.bind(this),3e5),this.setAwayTimeout=function(){t.isAway=!0},this.mouseMoveListener=l()((function(){var e=t.isAway;t.isAway=!1,clearTimeout(t.setAwayTimeout),setTimeout(t.setAwayTimeout,12e4),e&&t._backgroundHeartbeat()}),2e3,!0),window.addEventListener("mousemove",this.mouseMoveListener,{capture:!0,passive:!0}),this._backgroundHeartbeat()),(0,u.subscribe)("user_status:status.updated",this.handleUserStatusUpdated)},beforeDestroy:function(){(0,u.unsubscribe)("settings:display-name:updated",this.handleDisplayNameUpdate),(0,u.unsubscribe)("settings:profile-enabled:updated",this.handleProfileEnabledUpdate),window.removeEventListener("mouseMove",this.mouseMoveListener),clearInterval(this.heartbeatInterval),(0,u.unsubscribe)("user_status:status.updated",this.handleUserStatusUpdated)},methods:{handleDisplayNameUpdate:function(t){this.displayName=t},handleProfileEnabledUpdate:function(t){this.profileEnabled=t},loadProfilePage:function(){this.profileEnabled&&(this.loadingProfilePage=!0)},openModal:function(){this.isModalOpen=!0},closeModal:function(){this.isModalOpen=!1},_backgroundHeartbeat:function(){var t,e=this;return(t=regeneratorRuntime.mark((function t(){var n,r;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,f(e.isAway);case 3:if(null==(n=t.sent)||!n.userId){t.next=8;break}e.$store.dispatch("setStatusFromHeartbeat",n),t.next=10;break;case 8:return t.next=10,e.$store.dispatch("reFetchStatusFromServer");case 10:t.next=15;break;case 12:t.prev=12,t.t0=t.catch(0),console.debug("Failed sending heartbeat, got: "+(null===(r=t.t0.response)||void 0===r?void 0:r.status));case 15:case"end":return t.stop()}}),t,null,[[0,12]])})),function(){var e=this,n=arguments;return new Promise((function(r,s){var a=t.apply(e,n);function o(t){v(a,r,s,o,i,"next",t)}function i(t){v(a,r,s,o,i,"throw",t)}o(void 0)}))})()},handleUserStatusUpdated:function(t){OC.getCurrentUser().uid===t.userId&&this.$store.dispatch("setStatusFromObject",{status:t.status,icon:t.icon,message:t.message})}}},A=g,b=r(93379),j=r.n(b),y=r(7795),w=r.n(y),C=r(90569),x=r.n(C),_=r(3565),k=r.n(_),S=r(19216),P=r.n(S),O=r(44589),I=r.n(O),U=r(79483),D={};D.styleTagTransform=I(),D.setAttributes=k(),D.insert=x().bind(null,"head"),D.domAPI=w(),D.insertStyleElement=P(),j()(U.Z,D),U.Z&&U.Z.locals&&U.Z.locals;var M=(0,r(51900).Z)(A,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("li",[n("div",{staticClass:"user-status-menu-item"},[t.inline?t._e():n("a",{staticClass:"user-status-menu-item__header",attrs:{href:t.profilePageLink},on:{click:t.loadProfilePage}},[n("div",{staticClass:"user-status-menu-item__header-content"},[n("div",{staticClass:"user-status-menu-item__header-content-displayname"},[t._v(t._s(t.displayName))]),t._v(" "),t.loadingProfilePage?n("div",{staticClass:"icon-loading-small"}):n("div",{staticClass:"user-status-menu-item__header-content-placeholder"})]),t._v(" "),t.profileEnabled?n("div",[t._v("\n\t\t\t\t"+t._s(t.t("user_status","View profile"))+"\n\t\t\t")]):t._e()]),t._v(" "),n(t.inline?"button":"a",{tag:"toggle",staticClass:"user-status-menu-item__toggle",class:{"user-status-menu-item__toggle--inline":t.inline},attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),e.stopPropagation(),t.openModal.apply(null,arguments)}}},[n("span",{staticClass:"user-status-menu-item__toggle-icon",class:t.statusIcon}),t._v("\n\t\t\t"+t._s(t.visibleMessage)+"\n\t\t")])],1),t._v(" "),t.isModalOpen?n("SetStatusModal",{on:{close:t.closeModal}}):t._e()],1)}),[],!1,null,"5879d4bb",null),E=M.exports,R=r(20629);function T(t,e,n,r,s,a,o){try{var i=t[a](o),u=i.value}catch(t){return void n(t)}i.done?e(u):Promise.resolve(u).then(r,s)}var z=function(){var t,e=(t=regeneratorRuntime.mark((function t(){var e,n;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return e=(0,o.generateOcsUrl)("apps/user_status/api/v1/predefined_statuses?format=json"),t.next=3,d.default.get(e);case 3:return n=t.sent,t.abrupt("return",n.data.ocs.data);case 5:case"end":return t.stop()}}),t)})),function(){var e=this,n=arguments;return new Promise((function(r,s){var a=t.apply(e,n);function o(t){T(a,r,s,o,i,"next",t)}function i(t){T(a,r,s,o,i,"throw",t)}o(void 0)}))});return function(){return e.apply(this,arguments)}}();function B(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=function(t,e){if(t){if("string"==typeof t)return F(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?F(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var r=0,s=function(){};return{s:s,n:function(){return r>=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:s}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,o=!0,i=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return o=t.done,t},e:function(t){i=!0,a=t},f:function(){try{o||null==n.return||n.return()}finally{if(i)throw a}}}}function F(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n<e;n++)r[n]=t[n];return r}function $(t,e,n,r,s,a,o){try{var i=t[a](o),u=i.value}catch(t){return void n(t)}i.done?e(u):Promise.resolve(u).then(r,s)}var N={loadAllPredefinedStatuses:function(t){return(e=regeneratorRuntime.mark((function e(){var n,r,s,a,o,i;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=t.state,r=t.commit,!(n.predefinedStatuses.length>0)){e.next=3;break}return e.abrupt("return");case 3:return e.next=5,z();case 5:s=e.sent,a=B(s);try{for(a.s();!(o=a.n()).done;)i=o.value,r("addPredefinedStatus",i)}catch(t){a.e(t)}finally{a.f()}case 8:case"end":return e.stop()}}),e)})),function(){var t=this,n=arguments;return new Promise((function(r,s){var a=e.apply(t,n);function o(t){$(a,r,s,o,i,"next",t)}function i(t){$(a,r,s,o,i,"throw",t)}o(void 0)}))})();var e}},L={state:{predefinedStatuses:[]},mutations:{addPredefinedStatus:function(t,e){t.predefinedStatuses.push(e)}},getters:{},actions:N};function q(t,e,n,r,s,a,o){try{var i=t[a](o),u=i.value}catch(t){return void n(t)}i.done?e(u):Promise.resolve(u).then(r,s)}function Z(t){return function(){var e=this,n=arguments;return new Promise((function(r,s){var a=t.apply(e,n);function o(t){q(a,r,s,o,i,"next",t)}function i(t){q(a,r,s,o,i,"throw",t)}o(void 0)}))}}var H=function(){var t=Z(regeneratorRuntime.mark((function t(){var e,n;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return e=(0,o.generateOcsUrl)("apps/user_status/api/v1/user_status"),t.next=3,d.default.get(e);case 3:return n=t.sent,t.abrupt("return",n.data.ocs.data);case 5:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}}(),G=function(){var t=Z(regeneratorRuntime.mark((function t(e){var n;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return n=(0,o.generateOcsUrl)("apps/user_status/api/v1/user_status/status"),t.next=3,d.default.put(n,{statusType:e});case 3:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}(),Q=function(){var t=Z(regeneratorRuntime.mark((function t(e){var n,r,s=arguments;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return n=s.length>1&&void 0!==s[1]?s[1]:null,r=(0,o.generateOcsUrl)("apps/user_status/api/v1/user_status/message/predefined?format=json"),t.next=4,d.default.put(r,{messageId:e,clearAt:n});case 4:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}(),W=function(){var t=Z(regeneratorRuntime.mark((function t(e){var n,r,s,a=arguments;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return n=a.length>1&&void 0!==a[1]?a[1]:null,r=a.length>2&&void 0!==a[2]?a[2]:null,s=(0,o.generateOcsUrl)("apps/user_status/api/v1/user_status/message/custom?format=json"),t.next=5,d.default.put(s,{message:e,statusIcon:n,clearAt:r});case 5:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}(),J=function(){var t=Z(regeneratorRuntime.mark((function t(){var e;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return e=(0,o.generateOcsUrl)("apps/user_status/api/v1/user_status/message?format=json"),t.next=3,d.default.delete(e);case 3:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}}(),K=r(64039),V=r(80351),X=r.n(V),Y=function(t){if(null===t)return null;var e=(0,K.n)();if("period"===t.type)return e.setSeconds(e.getSeconds()+t.time),Math.floor(e.getTime()/1e3);if("end-of"===t.type)switch(t.time){case"day":case"week":return Number(X()(e).endOf(t.time).format("X"))}return"_time"===t.type?t.time:null};function tt(t,e,n,r,s,a,o){try{var i=t[a](o),u=i.value}catch(t){return void n(t)}i.done?e(u):Promise.resolve(u).then(r,s)}function et(t){return function(){var e=this,n=arguments;return new Promise((function(r,s){var a=t.apply(e,n);function o(t){tt(a,r,s,o,i,"next",t)}function i(t){tt(a,r,s,o,i,"throw",t)}o(void 0)}))}}var nt={state:{status:null,statusIsUserDefined:null,message:null,icon:null,clearAt:null,messageIsPredefined:null,messageId:null},mutations:{setStatus:function(t,e){var n=e.statusType;t.status=n,t.statusIsUserDefined=!0},setPredefinedMessage:function(t,e){var n=e.messageId,r=e.clearAt,s=e.message,a=e.icon;t.messageId=n,t.messageIsPredefined=!0,t.message=s,t.icon=a,t.clearAt=r},setCustomMessage:function(t,e){var n=e.message,r=e.icon,s=e.clearAt;t.messageId=null,t.messageIsPredefined=!1,t.message=n,t.icon=r,t.clearAt=s},clearMessage:function(t){t.messageId=null,t.messageIsPredefined=!1,t.message=null,t.icon=null,t.clearAt=null},loadStatusFromServer:function(t,e){var n=e.status,r=e.statusIsUserDefined,s=e.message,a=e.icon,o=e.clearAt,i=e.messageIsPredefined,u=e.messageId;t.status=n,t.statusIsUserDefined=r,t.message=s,t.icon=a,t.clearAt=o,t.messageIsPredefined=i,t.messageId=u}},getters:{},actions:{setStatus:function(t,e){return et(regeneratorRuntime.mark((function n(){var r,s,o,i;return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return s=t.commit,o=t.state,i=e.statusType,n.next=4,G(i);case 4:s("setStatus",{statusType:i}),(0,u.emit)("user_status:status.updated",{status:o.status,message:o.message,icon:o.icon,clearAt:o.clearAt,userId:null===(r=(0,a.getCurrentUser)())||void 0===r?void 0:r.uid});case 6:case"end":return n.stop()}}),n)})))()},setStatusFromObject:function(t,e){return et(regeneratorRuntime.mark((function n(){var r;return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:r=t.commit,t.state,r("loadStatusFromServer",e);case 2:case"end":return n.stop()}}),n)})))()},setPredefinedMessage:function(t,e){return et(regeneratorRuntime.mark((function n(){var r,s,o,i,c,l,d,m,f,p;return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return s=t.commit,o=t.rootState,i=t.state,c=e.messageId,l=e.clearAt,d=Y(l),n.next=5,Q(c,d);case 5:m=o.predefinedStatuses.predefinedStatuses.find((function(t){return t.id===c})),f=m.message,p=m.icon,s("setPredefinedMessage",{messageId:c,clearAt:d,message:f,icon:p}),(0,u.emit)("user_status:status.updated",{status:i.status,message:i.message,icon:i.icon,clearAt:i.clearAt,userId:null===(r=(0,a.getCurrentUser)())||void 0===r?void 0:r.uid});case 9:case"end":return n.stop()}}),n)})))()},setCustomMessage:function(t,e){return et(regeneratorRuntime.mark((function n(){var r,s,o,i,c,l,d;return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return s=t.commit,o=t.state,i=e.message,c=e.icon,l=e.clearAt,d=Y(l),n.next=5,W(i,c,d);case 5:s("setCustomMessage",{message:i,icon:c,clearAt:d}),(0,u.emit)("user_status:status.updated",{status:o.status,message:o.message,icon:o.icon,clearAt:o.clearAt,userId:null===(r=(0,a.getCurrentUser)())||void 0===r?void 0:r.uid});case 7:case"end":return n.stop()}}),n)})))()},clearMessage:function(t){return et(regeneratorRuntime.mark((function e(){var n,r,s;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=t.commit,s=t.state,e.next=3,J();case 3:r("clearMessage"),(0,u.emit)("user_status:status.updated",{status:s.status,message:s.message,icon:s.icon,clearAt:s.clearAt,userId:null===(n=(0,a.getCurrentUser)())||void 0===n?void 0:n.uid});case 5:case"end":return e.stop()}}),e)})))()},reFetchStatusFromServer:function(t){return et(regeneratorRuntime.mark((function e(){var n,r;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.commit,e.next=3,H();case 3:r=e.sent,n("loadStatusFromServer",r);case 5:case"end":return e.stop()}}),e)})))()},setStatusFromHeartbeat:function(t,e){return et(regeneratorRuntime.mark((function n(){return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:(0,t.commit)("loadStatusFromServer",e);case 2:case"end":return n.stop()}}),n)})))()},loadStatusFromInitialState:function(t){(0,t.commit)("loadStatusFromServer",(0,i.loadState)("user_status","status"))}}};s.default.use(R.ZP);var rt=new R.yh({modules:{predefinedStatuses:L,userStatus:nt},strict:!0}),st=r(28017),at=r.n(st);r.nc=btoa((0,a.getRequestToken)()),s.default.prototype.t=t,s.default.prototype.$t=t;var ot=document.getElementById("avatardiv-menu"),it={preloadedUserStatus:{message:ot.dataset.userstatus_message,icon:ot.dataset.userstatus_icon,status:ot.dataset.userstatus},user:ot.dataset.user,displayName:ot.dataset.displayname,url:ot.dataset.avatar,disableMenu:!0,disableTooltip:!0};new(s.default.extend(at()))({propsData:it}).$mount("#avatardiv-menu"),new s.default({el:'li[data-id="user_status-menuitem"]',name:"UserStatusRoot",render:function(t){return t(E)},store:rt}),document.addEventListener("DOMContentLoaded",(function(){OCA.Dashboard&&OCA.Dashboard.registerStatus("status",(function(t){return new(s.default.extend(E))({propsData:{inline:!0},store:rt}).$mount(t)}))}))},84387:function(t,e,n){"use strict";var r=n(20629),s=n(26932);function a(t,e,n,r,s,a,o){try{var i=t[a](o),u=i.value}catch(t){return void n(t)}i.done?e(u):Promise.resolve(u).then(r,s)}function o(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function i(t){for(var e=1;e<arguments.length;e++){var n=null!=arguments[e]?arguments[e]:{};e%2?o(Object(n),!0).forEach((function(e){u(t,e,n[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))}))}return t}function u(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}e.Z={computed:i(i({},(0,r.rn)({statusType:function(t){return t.userStatus.status},statusIsUserDefined:function(t){return t.userStatus.statusIsUserDefined},customIcon:function(t){return t.userStatus.icon},customMessage:function(t){return t.userStatus.message}})),{},{visibleMessage:function(){if(this.customIcon&&this.customMessage)return"".concat(this.customIcon," ").concat(this.customMessage);if(this.customMessage)return this.customMessage;if(this.statusIsUserDefined)switch(this.statusType){case"online":return this.$t("user_status","Online");case"away":return this.$t("user_status","Away");case"dnd":return this.$t("user_status","Do not disturb");case"invisible":return this.$t("user_status","Invisible");case"offline":return this.$t("user_status","Offline")}return this.$t("user_status","Set status")},statusIcon:function(){switch(this.statusType){case"online":return"icon-user-status-online";case"away":return"icon-user-status-away";case"dnd":return"icon-user-status-dnd";case"invisible":case"offline":return"icon-user-status-invisible"}return""}}),methods:{changeStatus:function(t){var e,n=this;return(e=regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,n.$store.dispatch("setStatus",{statusType:t});case 3:e.next=9;break;case 5:e.prev=5,e.t0=e.catch(0),(0,s.x2)(n.$t("user_status","There was an error saving the new status")),console.debug(e.t0);case 9:case"end":return e.stop()}}),e,null,[[0,5]])})),function(){var t=this,n=arguments;return new Promise((function(r,s){var o=e.apply(t,n);function i(t){a(o,r,s,i,u,"next",t)}function u(t){a(o,r,s,i,u,"throw",t)}i(void 0)}))})()}}}},64039:function(t,e,n){"use strict";n.d(e,{n:function(){return r}});var r=function(){return new Date}},79483:function(t,e,n){"use strict";var r=n(87537),s=n.n(r),a=n(23645),o=n.n(a)()(s());o.push([t.id,".user-status-menu-item__header[data-v-5879d4bb]{display:flex !important;flex-direction:column !important;width:auto !important;height:66px !important;padding:10px 12px 5px 12px !important;align-items:flex-start !important;color:var(--color-main-text) !important}.user-status-menu-item__header[data-v-5879d4bb]:not([href]){height:var(--header-menu-item-height) !important;color:var(--color-text-maxcontrast) !important;cursor:default !important}.user-status-menu-item__header:not([href]) *[data-v-5879d4bb]{cursor:default !important}.user-status-menu-item__header[data-v-5879d4bb]:not([href]):hover{background-color:transparent !important}.user-status-menu-item__header-content[data-v-5879d4bb]{display:inline-flex !important;font-weight:bold !important;gap:0 10px !important;width:auto}.user-status-menu-item__header-content-displayname[data-v-5879d4bb]{width:auto}.user-status-menu-item__header-content-placeholder[data-v-5879d4bb]{width:16px !important;height:24px !important;margin-right:10px !important;visibility:hidden !important}.user-status-menu-item__header span[data-v-5879d4bb]{color:var(--color-text-maxcontrast) !important}.user-status-menu-item__toggle-icon[data-v-5879d4bb]{width:16px;height:16px;margin-right:10px;opacity:1 !important;background-size:16px}.user-status-menu-item__toggle--inline[data-v-5879d4bb]{width:auto;min-width:44px;height:44px;margin:0;border:0;border-radius:var(--border-radius-pill);background-color:var(--color-background-translucent);font-size:inherit;font-weight:normal;-webkit-backdrop-filter:var(--background-blur);backdrop-filter:var(--background-blur)}.user-status-menu-item__toggle--inline[data-v-5879d4bb]:active,.user-status-menu-item__toggle--inline[data-v-5879d4bb]:hover,.user-status-menu-item__toggle--inline[data-v-5879d4bb]:focus{background-color:var(--color-background-hover)}.user-status-menu-item__toggle--inline[data-v-5879d4bb]:focus{border:2px solid var(--color-main-text) !important}li[data-v-5879d4bb]{list-style-type:none}","",{version:3,sources:["webpack://./apps/user_status/src/UserStatus.vue"],names:[],mappings:"AAgOC,gDACC,uBAAA,CACA,gCAAA,CACA,qBAAA,CACA,sBAAA,CACA,qCAAA,CACA,iCAAA,CACA,uCAAA,CAEA,4DACC,gDAAA,CACA,8CAAA,CACA,yBAAA,CAEA,8DACC,yBAAA,CAGD,kEACC,uCAAA,CAIF,wDACC,8BAAA,CACA,2BAAA,CACA,qBAAA,CACA,UAAA,CAEA,oEACC,UAAA,CAGD,oEACC,qBAAA,CACA,sBAAA,CACA,4BAAA,CACA,4BAAA,CAIF,qDACC,8CAAA,CAKD,qDACC,UAAA,CACA,WAAA,CACA,iBAAA,CACA,oBAAA,CACA,oBAAA,CAID,wDACC,UAAA,CACA,cAAA,CACA,WAAA,CACA,QAAA,CACA,QAAA,CACA,uCAAA,CACA,oDAAA,CACA,iBAAA,CACA,kBAAA,CAEA,8CAAA,CACA,sCAAA,CAEA,2LAGC,8CAAA,CAED,8DACC,kDAAA,CAMJ,oBACC,oBAAA",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.user-status-menu-item {\n\t&__header {\n\t\tdisplay: flex !important;\n\t\tflex-direction: column !important;\n\t\twidth: auto !important;\n\t\theight: 44px * 1.5 !important;\n\t\tpadding: 10px 12px 5px 12px !important;\n\t\talign-items: flex-start !important;\n\t\tcolor: var(--color-main-text) !important;\n\n\t\t&:not([href]) {\n\t\t\theight: var(--header-menu-item-height) !important;\n\t\t\tcolor: var(--color-text-maxcontrast) !important;\n\t\t\tcursor: default !important;\n\n\t\t\t& * {\n\t\t\t\tcursor: default !important;\n\t\t\t}\n\n\t\t\t&:hover {\n\t\t\t\tbackground-color: transparent !important;\n\t\t\t}\n\t\t}\n\n\t\t&-content {\n\t\t\tdisplay: inline-flex !important;\n\t\t\tfont-weight: bold !important;\n\t\t\tgap: 0 10px !important;\n\t\t\twidth: auto;\n\n\t\t\t&-displayname {\n\t\t\t\twidth: auto;\n\t\t\t}\n\n\t\t\t&-placeholder {\n\t\t\t\twidth: 16px !important;\n\t\t\t\theight: 24px !important;\n\t\t\t\tmargin-right: 10px !important;\n\t\t\t\tvisibility: hidden !important;\n\t\t\t}\n\t\t}\n\n\t\tspan {\n\t\t\tcolor: var(--color-text-maxcontrast) !important;\n\t\t}\n\t}\n\n\t&__toggle {\n\t\t&-icon {\n\t\t\twidth: 16px;\n\t\t\theight: 16px;\n\t\t\tmargin-right: 10px;\n\t\t\topacity: 1 !important;\n\t\t\tbackground-size: 16px;\n\t\t}\n\n\t\t// In dashboard\n\t\t&--inline {\n\t\t\twidth: auto;\n\t\t\tmin-width: 44px;\n\t\t\theight: 44px;\n\t\t\tmargin: 0;\n\t\t\tborder: 0;\n\t\t\tborder-radius: var(--border-radius-pill);\n\t\t\tbackground-color: var(--color-background-translucent);\n\t\t\tfont-size: inherit;\n\t\t\tfont-weight: normal;\n\n\t\t\t-webkit-backdrop-filter: var(--background-blur);\n\t\t\tbackdrop-filter: var(--background-blur);\n\n\t\t\t&:active,\n\t\t\t&:hover,\n\t\t\t&:focus {\n\t\t\t\tbackground-color: var(--color-background-hover);\n\t\t\t}\n\t\t\t&:focus {\n\t\t\t\tborder: 2px solid var(--color-main-text)!important;\n\t\t\t}\n\t\t}\n\t}\n}\n\nli {\n\tlist-style-type: none;\n}\n\n"],sourceRoot:""}]),e.Z=o},46700:function(t,e,n){var r={"./af":42786,"./af.js":42786,"./ar":30867,"./ar-dz":14130,"./ar-dz.js":14130,"./ar-kw":96135,"./ar-kw.js":96135,"./ar-ly":56440,"./ar-ly.js":56440,"./ar-ma":47702,"./ar-ma.js":47702,"./ar-sa":16040,"./ar-sa.js":16040,"./ar-tn":37100,"./ar-tn.js":37100,"./ar.js":30867,"./az":31083,"./az.js":31083,"./be":9808,"./be.js":9808,"./bg":68338,"./bg.js":68338,"./bm":67438,"./bm.js":67438,"./bn":8905,"./bn-bd":76225,"./bn-bd.js":76225,"./bn.js":8905,"./bo":11560,"./bo.js":11560,"./br":1278,"./br.js":1278,"./bs":80622,"./bs.js":80622,"./ca":2468,"./ca.js":2468,"./cs":5822,"./cs.js":5822,"./cv":50877,"./cv.js":50877,"./cy":47373,"./cy.js":47373,"./da":24780,"./da.js":24780,"./de":59740,"./de-at":60217,"./de-at.js":60217,"./de-ch":60894,"./de-ch.js":60894,"./de.js":59740,"./dv":5300,"./dv.js":5300,"./el":50837,"./el.js":50837,"./en-au":78348,"./en-au.js":78348,"./en-ca":77925,"./en-ca.js":77925,"./en-gb":22243,"./en-gb.js":22243,"./en-ie":46436,"./en-ie.js":46436,"./en-il":47207,"./en-il.js":47207,"./en-in":44175,"./en-in.js":44175,"./en-nz":76319,"./en-nz.js":76319,"./en-sg":31662,"./en-sg.js":31662,"./eo":92915,"./eo.js":92915,"./es":55655,"./es-do":55251,"./es-do.js":55251,"./es-mx":96112,"./es-mx.js":96112,"./es-us":71146,"./es-us.js":71146,"./es.js":55655,"./et":5603,"./et.js":5603,"./eu":77763,"./eu.js":77763,"./fa":76959,"./fa.js":76959,"./fi":11897,"./fi.js":11897,"./fil":42549,"./fil.js":42549,"./fo":94694,"./fo.js":94694,"./fr":94470,"./fr-ca":63049,"./fr-ca.js":63049,"./fr-ch":52330,"./fr-ch.js":52330,"./fr.js":94470,"./fy":5044,"./fy.js":5044,"./ga":29295,"./ga.js":29295,"./gd":2101,"./gd.js":2101,"./gl":38794,"./gl.js":38794,"./gom-deva":27884,"./gom-deva.js":27884,"./gom-latn":23168,"./gom-latn.js":23168,"./gu":95349,"./gu.js":95349,"./he":24206,"./he.js":24206,"./hi":30094,"./hi.js":30094,"./hr":30316,"./hr.js":30316,"./hu":22138,"./hu.js":22138,"./hy-am":11423,"./hy-am.js":11423,"./id":29218,"./id.js":29218,"./is":90135,"./is.js":90135,"./it":90626,"./it-ch":10150,"./it-ch.js":10150,"./it.js":90626,"./ja":39183,"./ja.js":39183,"./jv":24286,"./jv.js":24286,"./ka":12105,"./ka.js":12105,"./kk":47772,"./kk.js":47772,"./km":18758,"./km.js":18758,"./kn":79282,"./kn.js":79282,"./ko":33730,"./ko.js":33730,"./ku":1408,"./ku.js":1408,"./ky":33291,"./ky.js":33291,"./lb":36841,"./lb.js":36841,"./lo":55466,"./lo.js":55466,"./lt":57010,"./lt.js":57010,"./lv":37595,"./lv.js":37595,"./me":39861,"./me.js":39861,"./mi":35493,"./mi.js":35493,"./mk":95966,"./mk.js":95966,"./ml":87341,"./ml.js":87341,"./mn":5115,"./mn.js":5115,"./mr":10370,"./mr.js":10370,"./ms":9847,"./ms-my":41237,"./ms-my.js":41237,"./ms.js":9847,"./mt":72126,"./mt.js":72126,"./my":56165,"./my.js":56165,"./nb":64924,"./nb.js":64924,"./ne":16744,"./ne.js":16744,"./nl":93901,"./nl-be":59814,"./nl-be.js":59814,"./nl.js":93901,"./nn":83877,"./nn.js":83877,"./oc-lnc":92135,"./oc-lnc.js":92135,"./pa-in":15858,"./pa-in.js":15858,"./pl":64495,"./pl.js":64495,"./pt":89520,"./pt-br":57971,"./pt-br.js":57971,"./pt.js":89520,"./ro":96459,"./ro.js":96459,"./ru":21793,"./ru.js":21793,"./sd":40950,"./sd.js":40950,"./se":10490,"./se.js":10490,"./si":90124,"./si.js":90124,"./sk":64249,"./sk.js":64249,"./sl":14985,"./sl.js":14985,"./sq":51104,"./sq.js":51104,"./sr":49131,"./sr-cyrl":79915,"./sr-cyrl.js":79915,"./sr.js":49131,"./ss":85893,"./ss.js":85893,"./sv":98760,"./sv.js":98760,"./sw":91172,"./sw.js":91172,"./ta":27333,"./ta.js":27333,"./te":23110,"./te.js":23110,"./tet":52095,"./tet.js":52095,"./tg":27321,"./tg.js":27321,"./th":9041,"./th.js":9041,"./tk":19005,"./tk.js":19005,"./tl-ph":75768,"./tl-ph.js":75768,"./tlh":89444,"./tlh.js":89444,"./tr":72397,"./tr.js":72397,"./tzl":28254,"./tzl.js":28254,"./tzm":51106,"./tzm-latn":30699,"./tzm-latn.js":30699,"./tzm.js":51106,"./ug-cn":9288,"./ug-cn.js":9288,"./uk":67691,"./uk.js":67691,"./ur":13795,"./ur.js":13795,"./uz":6791,"./uz-latn":60588,"./uz-latn.js":60588,"./uz.js":6791,"./vi":65666,"./vi.js":65666,"./x-pseudo":14378,"./x-pseudo.js":14378,"./yo":75805,"./yo.js":75805,"./zh-cn":83839,"./zh-cn.js":83839,"./zh-hk":55726,"./zh-hk.js":55726,"./zh-mo":99807,"./zh-mo.js":99807,"./zh-tw":74152,"./zh-tw.js":74152};function s(t){var e=a(t);return n(e)}function a(t){if(!n.o(r,t)){var e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}return r[t]}s.keys=function(){return Object.keys(r)},s.resolve=a,t.exports=s,s.id=46700}},a={};function o(t){var e=a[t];if(void 0!==e)return e.exports;var n=a[t]={id:t,loaded:!1,exports:{}};return s[t].call(n.exports,n,n.exports,o),n.loaded=!0,n.exports}o.m=s,o.amdD=function(){throw new Error("define cannot be used indirect")},o.amdO={},e=[],o.O=function(t,n,r,s){if(!n){var a=1/0;for(l=0;l<e.length;l++){n=e[l][0],r=e[l][1],s=e[l][2];for(var i=!0,u=0;u<n.length;u++)(!1&s||a>=s)&&Object.keys(o.O).every((function(t){return o.O[t](n[u])}))?n.splice(u--,1):(i=!1,s<a&&(a=s));if(i){e.splice(l--,1);var c=r();void 0!==c&&(t=c)}}return t}s=s||0;for(var l=e.length;l>0&&e[l-1][2]>s;l--)e[l]=e[l-1];e[l]=[n,r,s]},o.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return o.d(e,{a:e}),e},o.d=function(t,e){for(var n in e)o.o(e,n)&&!o.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},o.f={},o.e=function(t){return Promise.all(Object.keys(o.f).reduce((function(e,n){return o.f[n](t,e),e}),[]))},o.u=function(t){return"user-status-modal-"+t+".js?v=3f331fd4343acdf15116"},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,e){return Object.prototype.hasOwnProperty.call(t,e)},n={},r="nextcloud:",o.l=function(t,e,s,a){if(n[t])n[t].push(e);else{var i,u;if(void 0!==s)for(var c=document.getElementsByTagName("script"),l=0;l<c.length;l++){var d=c[l];if(d.getAttribute("src")==t||d.getAttribute("data-webpack")==r+s){i=d;break}}i||(u=!0,(i=document.createElement("script")).charset="utf-8",i.timeout=120,o.nc&&i.setAttribute("nonce",o.nc),i.setAttribute("data-webpack",r+s),i.src=t),n[t]=[e];var m=function(e,r){i.onerror=i.onload=null,clearTimeout(f);var s=n[t];if(delete n[t],i.parentNode&&i.parentNode.removeChild(i),s&&s.forEach((function(t){return t(r)})),e)return e(r)},f=setTimeout(m.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=m.bind(null,i.onerror),i.onload=m.bind(null,i.onload),u&&document.head.appendChild(i)}},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=2613,function(){var t;o.g.importScripts&&(t=o.g.location+"");var e=o.g.document;if(!t&&e&&(e.currentScript&&(t=e.currentScript.src),!t)){var n=e.getElementsByTagName("script");n.length&&(t=n[n.length-1].src)}if(!t)throw new Error("Automatic publicPath is not supported in this browser");t=t.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),o.p=t}(),function(){o.b=document.baseURI||self.location.href;var t={2613:0};o.f.j=function(e,n){var r=o.o(t,e)?t[e]:void 0;if(0!==r)if(r)n.push(r[2]);else{var s=new Promise((function(n,s){r=t[e]=[n,s]}));n.push(r[2]=s);var a=o.p+o.u(e),i=new Error;o.l(a,(function(n){if(o.o(t,e)&&(0!==(r=t[e])&&(t[e]=void 0),r)){var s=n&&("load"===n.type?"missing":n.type),a=n&&n.target&&n.target.src;i.message="Loading chunk "+e+" failed.\n("+s+": "+a+")",i.name="ChunkLoadError",i.type=s,i.request=a,r[1](i)}}),"chunk-"+e,e)}},o.O.j=function(e){return 0===t[e]};var e=function(e,n){var r,s,a=n[0],i=n[1],u=n[2],c=0;if(a.some((function(e){return 0!==t[e]}))){for(r in i)o.o(i,r)&&(o.m[r]=i[r]);if(u)var l=u(o)}for(e&&e(n);c<a.length;c++)s=a[c],o.o(t,s)&&t[s]&&t[s][0](),t[s]=0;return o.O(l)},n=self.webpackChunknextcloud=self.webpackChunknextcloud||[];n.forEach(e.bind(null,0)),n.push=e.bind(null,n.push.bind(n))}();var i=o.O(void 0,[7874],(function(){return o(40814)}));i=o.O(i)}(); +//# sourceMappingURL=user_status-menu.js.map?v=9510cc8bbba1b7cfe4a3
\ No newline at end of file diff --git a/dist/user_status-menu.js.map b/dist/user_status-menu.js.map index 0f4566368ea..587237ca77a 100644 --- a/dist/user_status-menu.js.map +++ b/dist/user_status-menu.js.map @@ -1 +1 @@ -{"version":3,"file":"user_status-menu.js?v=cf2db141b48e020e780d","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/webpack/runtime/load script","webpack:///nextcloud/apps/user_status/src/services/heartbeatService.js","webpack:///nextcloud/apps/user_status/src/UserStatus.vue","webpack:///nextcloud/apps/user_status/src/UserStatus.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/user_status/src/UserStatus.vue?a54b","webpack://nextcloud/./apps/user_status/src/UserStatus.vue?d74a","webpack:///nextcloud/apps/user_status/src/UserStatus.vue?vue&type=template&id=e652bbe6&scoped=true&","webpack:///nextcloud/apps/user_status/src/services/predefinedStatusService.js","webpack:///nextcloud/apps/user_status/src/store/predefinedStatuses.js","webpack:///nextcloud/apps/user_status/src/services/statusService.js","webpack:///nextcloud/apps/user_status/src/services/clearAtService.js","webpack:///nextcloud/apps/user_status/src/store/userStatus.js","webpack:///nextcloud/apps/user_status/src/store/index.js","webpack:///nextcloud/apps/user_status/src/menu.js","webpack:///nextcloud/apps/user_status/src/mixins/OnlineStatusMixin.js","webpack:///nextcloud/apps/user_status/src/services/dateService.js","webpack:///nextcloud/apps/user_status/src/UserStatus.vue?vue&type=style&index=0&id=e652bbe6&lang=scss&scoped=true&","webpack:///nextcloud/node_modules/moment/locale|sync|/^\\.\\/.*$","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/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};","/**\n * @copyright Copyright (c) 2020 Georg Ehrke\n *\n * @author Georg Ehrke <oc.list@georgehrke.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 HttpClient from '@nextcloud/axios'\nimport { generateUrl } from '@nextcloud/router'\n\n/**\n * Sends a heartbeat\n *\n * @param {boolean} isAway Whether or not the user is active\n * @return {Promise<void>}\n */\nconst sendHeartbeat = async (isAway) => {\n\tconst url = generateUrl('/apps/user_status/heartbeat')\n\tconst response = await HttpClient.put(url, {\n\t\tstatus: isAway ? 'away' : 'online',\n\t})\n\treturn response.data\n}\n\nexport {\n\tsendHeartbeat,\n}\n","<!--\n - @copyright Copyright (c) 2020 Georg Ehrke <oc.list@georgehrke.com>\n - @author Georg Ehrke <oc.list@georgehrke.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<li>\n\t\t<div class=\"user-status-menu-item\">\n\t\t\t<!-- Username display -->\n\t\t\t<a v-if=\"!inline\"\n\t\t\t\tclass=\"user-status-menu-item__header\"\n\t\t\t\t:href=\"profilePageLink\"\n\t\t\t\t@click=\"loadProfilePage\">\n\t\t\t\t<div class=\"user-status-menu-item__header-content\">\n\t\t\t\t\t<div class=\"user-status-menu-item__header-content-displayname\">{{ displayName }}</div>\n\t\t\t\t\t<div v-if=\"!loadingProfilePage\" class=\"user-status-menu-item__header-content-placeholder\" />\n\t\t\t\t\t<div v-else class=\"icon-loading-small\" />\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"profileEnabled\">\n\t\t\t\t\t{{ t('user_status', 'View profile') }}\n\t\t\t\t</div>\n\t\t\t</a>\n\n\t\t\t<!-- Status modal toggle -->\n\t\t\t<toggle :is=\"inline ? 'button' : 'a'\"\n\t\t\t\t:class=\"{'user-status-menu-item__toggle--inline': inline}\"\n\t\t\t\tclass=\"user-status-menu-item__toggle\"\n\t\t\t\thref=\"#\"\n\t\t\t\t@click.prevent.stop=\"openModal\">\n\t\t\t\t<span :class=\"statusIcon\" class=\"user-status-menu-item__toggle-icon\" />\n\t\t\t\t{{ visibleMessage }}\n\t\t\t</toggle>\n\t\t</div>\n\n\t\t<!-- Status management modal -->\n\t\t<SetStatusModal v-if=\"isModalOpen\"\n\t\t\t@close=\"closeModal\" />\n\t</li>\n</template>\n\n<script>\nimport { generateUrl } from '@nextcloud/router'\nimport { getCurrentUser } from '@nextcloud/auth'\nimport { loadState } from '@nextcloud/initial-state'\nimport { subscribe, unsubscribe } from '@nextcloud/event-bus'\nimport debounce from 'debounce'\n\nimport { sendHeartbeat } from './services/heartbeatService'\nimport OnlineStatusMixin from './mixins/OnlineStatusMixin'\n\nconst { profileEnabled } = loadState('user_status', 'profileEnabled', false)\n\nexport default {\n\tname: 'UserStatus',\n\n\tcomponents: {\n\t\tSetStatusModal: () => import(/* webpackChunkName: 'user-status-modal' */'./components/SetStatusModal'),\n\t},\n\tmixins: [OnlineStatusMixin],\n\n\tprops: {\n\t\tinline: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tdisplayName: getCurrentUser().displayName,\n\t\t\theartbeatInterval: null,\n\t\t\tisAway: false,\n\t\t\tisModalOpen: false,\n\t\t\tloadingProfilePage: false,\n\t\t\tmouseMoveListener: null,\n\t\t\tprofileEnabled,\n\t\t\tsetAwayTimeout: null,\n\t\t}\n\t},\n\tcomputed: {\n\t\t/**\n\t\t * The profile page link\n\t\t *\n\t\t * @return {string | null}\n\t\t */\n\t\tprofilePageLink() {\n\t\t\tif (this.profileEnabled) {\n\t\t\t\treturn generateUrl('/u/{userId}', { userId: getCurrentUser().uid })\n\t\t\t}\n\t\t\t// Since an anchor element is used rather than a button,\n\t\t\t// this hack removes href if the profile is disabled so that disabling pointer-events is not needed to prevent a click from opening a page\n\t\t\t// and to allow the hover event for styling\n\t\t\treturn null\n\t\t},\n\t},\n\n\t/**\n\t * Loads the current user's status from initial state\n\t * and stores it in Vuex\n\t */\n\tmounted() {\n\t\tsubscribe('settings:display-name:updated', this.handleDisplayNameUpdate)\n\t\tsubscribe('settings:profile-enabled:updated', this.handleProfileEnabledUpdate)\n\n\t\tthis.$store.dispatch('loadStatusFromInitialState')\n\n\t\tif (OC.config.session_keepalive) {\n\t\t\t// Send the latest status to the server every 5 minutes\n\t\t\tthis.heartbeatInterval = setInterval(this._backgroundHeartbeat.bind(this), 1000 * 60 * 5)\n\t\t\tthis.setAwayTimeout = () => {\n\t\t\t\tthis.isAway = true\n\t\t\t}\n\t\t\t// Catch mouse movements, but debounce to once every 30 seconds\n\t\t\tthis.mouseMoveListener = debounce(() => {\n\t\t\t\tconst wasAway = this.isAway\n\t\t\t\tthis.isAway = false\n\t\t\t\t// Reset the two minute counter\n\t\t\t\tclearTimeout(this.setAwayTimeout)\n\t\t\t\t// If the user did not move the mouse within two minutes,\n\t\t\t\t// mark them as away\n\t\t\t\tsetTimeout(this.setAwayTimeout, 1000 * 60 * 2)\n\n\t\t\t\tif (wasAway) {\n\t\t\t\t\tthis._backgroundHeartbeat()\n\t\t\t\t}\n\t\t\t}, 1000 * 2, true)\n\t\t\twindow.addEventListener('mousemove', this.mouseMoveListener, {\n\t\t\t\tcapture: true,\n\t\t\t\tpassive: true,\n\t\t\t})\n\n\t\t\tthis._backgroundHeartbeat()\n\t\t}\n\t\tsubscribe('user_status:status.updated', this.handleUserStatusUpdated)\n\t},\n\n\t/**\n\t * Some housekeeping before destroying the component\n\t */\n\tbeforeDestroy() {\n\t\tunsubscribe('settings:display-name:updated', this.handleDisplayNameUpdate)\n\t\tunsubscribe('settings:profile-enabled:updated', this.handleProfileEnabledUpdate)\n\t\twindow.removeEventListener('mouseMove', this.mouseMoveListener)\n\t\tclearInterval(this.heartbeatInterval)\n\t\tunsubscribe('user_status:status.updated', this.handleUserStatusUpdated)\n\t},\n\n\tmethods: {\n\t\thandleDisplayNameUpdate(displayName) {\n\t\t\tthis.displayName = displayName\n\t\t},\n\n\t\thandleProfileEnabledUpdate(profileEnabled) {\n\t\t\tthis.profileEnabled = profileEnabled\n\t\t},\n\n\t\tloadProfilePage() {\n\t\t\tif (this.profileEnabled) {\n\t\t\t\tthis.loadingProfilePage = true\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Opens the modal to set a custom status\n\t\t */\n\t\topenModal() {\n\t\t\tthis.isModalOpen = true\n\t\t},\n\t\t/**\n\t\t * Closes the modal\n\t\t */\n\t\tcloseModal() {\n\t\t\tthis.isModalOpen = false\n\t\t},\n\n\t\t/**\n\t\t * Sends the status heartbeat to the server\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t * @private\n\t\t */\n\t\tasync _backgroundHeartbeat() {\n\t\t\ttry {\n\t\t\t\tconst status = await sendHeartbeat(this.isAway)\n\t\t\t\tif (status?.userId) {\n\t\t\t\t\tthis.$store.dispatch('setStatusFromHeartbeat', status)\n\t\t\t\t} else {\n\t\t\t\t\tawait this.$store.dispatch('reFetchStatusFromServer')\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.debug('Failed sending heartbeat, got: ' + error.response?.status)\n\t\t\t}\n\t\t},\n\t\thandleUserStatusUpdated(state) {\n\t\t\tif (OC.getCurrentUser().uid === state.userId) {\n\t\t\t\tthis.$store.dispatch('setStatusFromObject', {\n\t\t\t\t\tstatus: state.status,\n\t\t\t\t\ticon: state.icon,\n\t\t\t\t\tmessage: state.message,\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.user-status-menu-item {\n\t&__header {\n\t\tdisplay: flex !important;\n\t\tflex-direction: column !important;\n\t\twidth: auto !important;\n\t\theight: 44px * 1.5 !important;\n\t\tpadding: 10px 12px 5px 12px !important;\n\t\talign-items: flex-start !important;\n\t\tcolor: var(--color-main-text) !important;\n\n\t\t&:not([href]) {\n\t\t\theight: var(--header-menu-item-height) !important;\n\t\t\tcolor: var(--color-text-maxcontrast) !important;\n\t\t\tcursor: default !important;\n\n\t\t\t& * {\n\t\t\t\tcursor: default !important;\n\t\t\t}\n\n\t\t\t&:hover {\n\t\t\t\tbackground-color: transparent !important;\n\t\t\t}\n\t\t}\n\n\t\t&-content {\n\t\t\tdisplay: inline-flex !important;\n\t\t\tfont-weight: bold !important;\n\t\t\tgap: 0 10px !important;\n\t\t\twidth: auto;\n\n\t\t\t&-displayname {\n\t\t\t\twidth: auto;\n\t\t\t}\n\n\t\t\t&-placeholder {\n\t\t\t\twidth: 16px !important;\n\t\t\t\theight: 24px !important;\n\t\t\t\tmargin-right: 10px !important;\n\t\t\t\tvisibility: hidden !important;\n\t\t\t}\n\t\t}\n\n\t\tspan {\n\t\t\tcolor: var(--color-text-maxcontrast) !important;\n\t\t}\n\t}\n\n\t&__toggle {\n\t\t&-icon {\n\t\t\twidth: 16px;\n\t\t\theight: 16px;\n\t\t\tmargin-right: 10px;\n\t\t\topacity: 1 !important;\n\t\t\tbackground-size: 16px;\n\t\t}\n\n\t\t// In dashboard\n\t\t&--inline {\n\t\t\twidth: auto;\n\t\t\tmin-width: 44px;\n\t\t\theight: 44px;\n\t\t\tmargin: 0;\n\t\t\tborder: 0;\n\t\t\tborder-radius: var(--border-radius-pill);\n\t\t\tbackground-color: var(--color-background-translucent);\n\t\t\tfont-size: inherit;\n\t\t\tfont-weight: normal;\n\n\t\t\t-webkit-backdrop-filter: var(--background-blur);\n\t\t\tbackdrop-filter: var(--background-blur);\n\n\t\t\t&:active,\n\t\t\t&:hover,\n\t\t\t&:focus {\n\t\t\t\tbackground-color: var(--color-background-hover);\n\t\t\t}\n\t\t}\n\t}\n}\n\nli {\n\tlist-style-type: none;\n}\n\n</style>\n","import mod from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserStatus.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!./UserStatus.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!./UserStatus.vue?vue&type=style&index=0&id=e652bbe6&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!./UserStatus.vue?vue&type=style&index=0&id=e652bbe6&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./UserStatus.vue?vue&type=template&id=e652bbe6&scoped=true&\"\nimport script from \"./UserStatus.vue?vue&type=script&lang=js&\"\nexport * from \"./UserStatus.vue?vue&type=script&lang=js&\"\nimport style0 from \"./UserStatus.vue?vue&type=style&index=0&id=e652bbe6&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 \"e652bbe6\",\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('li',[_c('div',{staticClass:\"user-status-menu-item\"},[(!_vm.inline)?_c('a',{staticClass:\"user-status-menu-item__header\",attrs:{\"href\":_vm.profilePageLink},on:{\"click\":_vm.loadProfilePage}},[_c('div',{staticClass:\"user-status-menu-item__header-content\"},[_c('div',{staticClass:\"user-status-menu-item__header-content-displayname\"},[_vm._v(_vm._s(_vm.displayName))]),_vm._v(\" \"),(!_vm.loadingProfilePage)?_c('div',{staticClass:\"user-status-menu-item__header-content-placeholder\"}):_c('div',{staticClass:\"icon-loading-small\"})]),_vm._v(\" \"),(_vm.profileEnabled)?_c('div',[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('user_status', 'View profile'))+\"\\n\\t\\t\\t\")]):_vm._e()]):_vm._e(),_vm._v(\" \"),_c(_vm.inline ? 'button' : 'a',{tag:\"toggle\",staticClass:\"user-status-menu-item__toggle\",class:{'user-status-menu-item__toggle--inline': _vm.inline},attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();$event.stopPropagation();return _vm.openModal.apply(null, arguments)}}},[_c('span',{staticClass:\"user-status-menu-item__toggle-icon\",class:_vm.statusIcon}),_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.visibleMessage)+\"\\n\\t\\t\")])],1),_vm._v(\" \"),(_vm.isModalOpen)?_c('SetStatusModal',{on:{\"close\":_vm.closeModal}}):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2020 Georg Ehrke\n *\n * @author Georg Ehrke <oc.list@georgehrke.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 HttpClient from '@nextcloud/axios'\nimport { generateOcsUrl } from '@nextcloud/router'\n\n/**\n * Fetches all predefined statuses from the server\n *\n * @return {Promise<void>}\n */\nconst fetchAllPredefinedStatuses = async () => {\n\tconst url = generateOcsUrl('apps/user_status/api/v1/predefined_statuses?format=json')\n\tconst response = await HttpClient.get(url)\n\n\treturn response.data.ocs.data\n}\n\nexport {\n\tfetchAllPredefinedStatuses,\n}\n","/**\n * @copyright Copyright (c) 2020 Georg Ehrke\n *\n * @author Georg Ehrke <oc.list@georgehrke.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 { fetchAllPredefinedStatuses } from '../services/predefinedStatusService'\n\nconst state = {\n\tpredefinedStatuses: [],\n}\n\nconst mutations = {\n\n\t/**\n\t * Adds a predefined status to the state\n\t *\n\t * @param {object} state The Vuex state\n\t * @param {object} status The status to add\n\t */\n\taddPredefinedStatus(state, status) {\n\t\tstate.predefinedStatuses.push(status)\n\t},\n}\n\nconst getters = {}\n\nconst actions = {\n\n\t/**\n\t * Loads all predefined statuses from the server\n\t *\n\t * @param {object} vuex The Vuex components\n\t * @param {Function} vuex.commit The Vuex commit function\n\t * @param {object} vuex.state -\n\t */\n\tasync loadAllPredefinedStatuses({ state, commit }) {\n\t\tif (state.predefinedStatuses.length > 0) {\n\t\t\treturn\n\t\t}\n\n\t\tconst statuses = await fetchAllPredefinedStatuses()\n\t\tfor (const status of statuses) {\n\t\t\tcommit('addPredefinedStatus', status)\n\t\t}\n\t},\n\n}\n\nexport default { state, mutations, getters, actions }\n","/**\n * @copyright Copyright (c) 2020 Georg Ehrke\n *\n * @author Georg Ehrke <oc.list@georgehrke.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 HttpClient from '@nextcloud/axios'\nimport { generateOcsUrl } from '@nextcloud/router'\n\n/**\n * Fetches the current user-status\n *\n * @return {Promise<object>}\n */\nconst fetchCurrentStatus = async () => {\n\tconst url = generateOcsUrl('apps/user_status/api/v1/user_status')\n\tconst response = await HttpClient.get(url)\n\n\treturn response.data.ocs.data\n}\n\n/**\n * Sets the status\n *\n * @param {string} statusType The status (online / away / dnd / invisible)\n * @return {Promise<void>}\n */\nconst setStatus = async (statusType) => {\n\tconst url = generateOcsUrl('apps/user_status/api/v1/user_status/status')\n\tawait HttpClient.put(url, {\n\t\tstatusType,\n\t})\n}\n\n/**\n * Sets a message based on our predefined statuses\n *\n * @param {string} messageId The id of the message, taken from predefined status service\n * @param {number | null} clearAt When to automatically clean the status\n * @return {Promise<void>}\n */\nconst setPredefinedMessage = async (messageId, clearAt = null) => {\n\tconst url = generateOcsUrl('apps/user_status/api/v1/user_status/message/predefined?format=json')\n\tawait HttpClient.put(url, {\n\t\tmessageId,\n\t\tclearAt,\n\t})\n}\n\n/**\n * Sets a custom message\n *\n * @param {string} message The user-defined message\n * @param {string | null} statusIcon The user-defined icon\n * @param {number | null} clearAt When to automatically clean the status\n * @return {Promise<void>}\n */\nconst setCustomMessage = async (message, statusIcon = null, clearAt = null) => {\n\tconst url = generateOcsUrl('apps/user_status/api/v1/user_status/message/custom?format=json')\n\tawait HttpClient.put(url, {\n\t\tmessage,\n\t\tstatusIcon,\n\t\tclearAt,\n\t})\n}\n\n/**\n * Clears the current status of the user\n *\n * @return {Promise<void>}\n */\nconst clearMessage = async () => {\n\tconst url = generateOcsUrl('apps/user_status/api/v1/user_status/message?format=json')\n\tawait HttpClient.delete(url)\n}\n\nexport {\n\tfetchCurrentStatus,\n\tsetStatus,\n\tsetCustomMessage,\n\tsetPredefinedMessage,\n\tclearMessage,\n}\n","/**\n * @copyright Copyright (c) 2020 Georg Ehrke\n *\n * @author Georg Ehrke <oc.list@georgehrke.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 {\n\tdateFactory,\n} from './dateService'\nimport moment from '@nextcloud/moment'\n\n/**\n * Calculates the actual clearAt timestamp\n *\n * @param {object | null} clearAt The clear-at config\n * @return {number | null}\n */\nconst getTimestampForClearAt = (clearAt) => {\n\tif (clearAt === null) {\n\t\treturn null\n\t}\n\n\tconst date = dateFactory()\n\n\tif (clearAt.type === 'period') {\n\t\tdate.setSeconds(date.getSeconds() + clearAt.time)\n\t\treturn Math.floor(date.getTime() / 1000)\n\t}\n\tif (clearAt.type === 'end-of') {\n\t\tswitch (clearAt.time) {\n\t\tcase 'day':\n\t\tcase 'week':\n\t\t\treturn Number(moment(date).endOf(clearAt.time).format('X'))\n\t\t}\n\t}\n\t// This is not an officially supported type\n\t// but only used internally to show the remaining time\n\t// in the Set Status Modal\n\tif (clearAt.type === '_time') {\n\t\treturn clearAt.time\n\t}\n\n\treturn null\n}\n\nexport {\n\tgetTimestampForClearAt,\n}\n","/**\n * @copyright Copyright (c) 2020 Georg Ehrke\n *\n * @author Georg Ehrke <oc.list@georgehrke.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 {\n\tfetchCurrentStatus,\n\tsetStatus,\n\tsetPredefinedMessage,\n\tsetCustomMessage,\n\tclearMessage,\n} from '../services/statusService'\nimport { loadState } from '@nextcloud/initial-state'\nimport { getCurrentUser } from '@nextcloud/auth'\nimport { getTimestampForClearAt } from '../services/clearAtService'\nimport { emit } from '@nextcloud/event-bus'\n\nconst state = {\n\t// Status (online / away / dnd / invisible / offline)\n\tstatus: null,\n\t// Whether or not the status is user-defined\n\tstatusIsUserDefined: null,\n\t// A custom message set by the user\n\tmessage: null,\n\t// The icon selected by the user\n\ticon: null,\n\t// When to automatically clean the status\n\tclearAt: null,\n\t// Whether or not the message is predefined\n\t// (and can automatically be translated by Nextcloud)\n\tmessageIsPredefined: null,\n\t// The id of the message in case it's predefined\n\tmessageId: null,\n}\n\nconst mutations = {\n\n\t/**\n\t * Sets a new status\n\t *\n\t * @param {object} state The Vuex state\n\t * @param {object} data The destructuring object\n\t * @param {string} data.statusType The new status type\n\t */\n\tsetStatus(state, { statusType }) {\n\t\tstate.status = statusType\n\t\tstate.statusIsUserDefined = true\n\t},\n\n\t/**\n\t * Sets a message using a predefined message\n\t *\n\t * @param {object} state The Vuex state\n\t * @param {object} data The destructuring object\n\t * @param {string} data.messageId The messageId\n\t * @param {number | null} data.clearAt When to automatically clear the status\n\t * @param {string} data.message The message\n\t * @param {string} data.icon The icon\n\t */\n\tsetPredefinedMessage(state, { messageId, clearAt, message, icon }) {\n\t\tstate.messageId = messageId\n\t\tstate.messageIsPredefined = true\n\n\t\tstate.message = message\n\t\tstate.icon = icon\n\t\tstate.clearAt = clearAt\n\t},\n\n\t/**\n\t * Sets a custom message\n\t *\n\t * @param {object} state The Vuex state\n\t * @param {object} data The destructuring object\n\t * @param {string} data.message The message\n\t * @param {string} data.icon The icon\n\t * @param {number} data.clearAt When to automatically clear the status\n\t */\n\tsetCustomMessage(state, { message, icon, clearAt }) {\n\t\tstate.messageId = null\n\t\tstate.messageIsPredefined = false\n\n\t\tstate.message = message\n\t\tstate.icon = icon\n\t\tstate.clearAt = clearAt\n\t},\n\n\t/**\n\t * Clears the status\n\t *\n\t * @param {object} state The Vuex state\n\t */\n\tclearMessage(state) {\n\t\tstate.messageId = null\n\t\tstate.messageIsPredefined = false\n\n\t\tstate.message = null\n\t\tstate.icon = null\n\t\tstate.clearAt = null\n\t},\n\n\t/**\n\t * Loads the status from initial state\n\t *\n\t * @param {object} state The Vuex state\n\t * @param {object} data The destructuring object\n\t * @param {string} data.status The status type\n\t * @param {boolean} data.statusIsUserDefined Whether or not this status is user-defined\n\t * @param {string} data.message The message\n\t * @param {string} data.icon The icon\n\t * @param {number} data.clearAt When to automatically clear the status\n\t * @param {boolean} data.messageIsPredefined Whether or not the message is predefined\n\t * @param {string} data.messageId The id of the predefined message\n\t */\n\tloadStatusFromServer(state, { status, statusIsUserDefined, message, icon, clearAt, messageIsPredefined, messageId }) {\n\t\tstate.status = status\n\t\tstate.statusIsUserDefined = statusIsUserDefined\n\t\tstate.message = message\n\t\tstate.icon = icon\n\t\tstate.clearAt = clearAt\n\t\tstate.messageIsPredefined = messageIsPredefined\n\t\tstate.messageId = messageId\n\t},\n}\n\nconst getters = {}\n\nconst actions = {\n\n\t/**\n\t * Sets a new status\n\t *\n\t * @param {object} vuex The Vuex destructuring object\n\t * @param {Function} vuex.commit The Vuex commit function\n\t * @param {object} vuex.state The Vuex state object\n\t * @param {object} data The data destructuring object\n\t * @param {string} data.statusType The new status type\n\t * @return {Promise<void>}\n\t */\n\tasync setStatus({ commit, state }, { statusType }) {\n\t\tawait setStatus(statusType)\n\t\tcommit('setStatus', { statusType })\n\t\temit('user_status:status.updated', {\n\t\t\tstatus: state.status,\n\t\t\tmessage: state.message,\n\t\t\ticon: state.icon,\n\t\t\tclearAt: state.clearAt,\n\t\t\tuserId: getCurrentUser()?.uid,\n\t\t})\n\t},\n\n\t/**\n\t * Update status from 'user_status:status.updated' update.\n\t * This doesn't trigger another 'user_status:status.updated'\n\t * event.\n\t *\n\t * @param {object} vuex The Vuex destructuring object\n\t * @param {Function} vuex.commit The Vuex commit function\n\t * @param {object} vuex.state The Vuex state object\n\t * @param {string} status The new status\n\t * @return {Promise<void>}\n\t */\n\tasync setStatusFromObject({ commit, state }, status) {\n\t\tcommit('loadStatusFromServer', status)\n\t},\n\n\t/**\n\t * Sets a message using a predefined message\n\t *\n\t * @param {object} vuex The Vuex destructuring object\n\t * @param {Function} vuex.commit The Vuex commit function\n\t * @param {object} vuex.state The Vuex state object\n\t * @param {object} vuex.rootState The Vuex root state\n\t * @param {object} data The data destructuring object\n\t * @param {string} data.messageId The messageId\n\t * @param {object | null} data.clearAt When to automatically clear the status\n\t * @return {Promise<void>}\n\t */\n\tasync setPredefinedMessage({ commit, rootState, state }, { messageId, clearAt }) {\n\t\tconst resolvedClearAt = getTimestampForClearAt(clearAt)\n\n\t\tawait setPredefinedMessage(messageId, resolvedClearAt)\n\t\tconst status = rootState.predefinedStatuses.predefinedStatuses.find((status) => status.id === messageId)\n\t\tconst { message, icon } = status\n\n\t\tcommit('setPredefinedMessage', { messageId, clearAt: resolvedClearAt, message, icon })\n\t\temit('user_status:status.updated', {\n\t\t\tstatus: state.status,\n\t\t\tmessage: state.message,\n\t\t\ticon: state.icon,\n\t\t\tclearAt: state.clearAt,\n\t\t\tuserId: getCurrentUser()?.uid,\n\t\t})\n\t},\n\n\t/**\n\t * Sets a custom message\n\t *\n\t * @param {object} vuex The Vuex destructuring object\n\t * @param {Function} vuex.commit The Vuex commit function\n\t * @param {object} vuex.state The Vuex state object\n\t * @param {object} data The data destructuring object\n\t * @param {string} data.message The message\n\t * @param {string} data.icon The icon\n\t * @param {object | null} data.clearAt When to automatically clear the status\n\t * @return {Promise<void>}\n\t */\n\tasync setCustomMessage({ commit, state }, { message, icon, clearAt }) {\n\t\tconst resolvedClearAt = getTimestampForClearAt(clearAt)\n\n\t\tawait setCustomMessage(message, icon, resolvedClearAt)\n\t\tcommit('setCustomMessage', { message, icon, clearAt: resolvedClearAt })\n\t\temit('user_status:status.updated', {\n\t\t\tstatus: state.status,\n\t\t\tmessage: state.message,\n\t\t\ticon: state.icon,\n\t\t\tclearAt: state.clearAt,\n\t\t\tuserId: getCurrentUser()?.uid,\n\t\t})\n\t},\n\n\t/**\n\t * Clears the status\n\t *\n\t * @param {object} vuex The Vuex destructuring object\n\t * @param {Function} vuex.commit The Vuex commit function\n\t * @param {object} vuex.state The Vuex state object\n\t * @return {Promise<void>}\n\t */\n\tasync clearMessage({ commit, state }) {\n\t\tawait clearMessage()\n\t\tcommit('clearMessage')\n\t\temit('user_status:status.updated', {\n\t\t\tstatus: state.status,\n\t\t\tmessage: state.message,\n\t\t\ticon: state.icon,\n\t\t\tclearAt: state.clearAt,\n\t\t\tuserId: getCurrentUser()?.uid,\n\t\t})\n\t},\n\n\t/**\n\t * Re-fetches the status from the server\n\t *\n\t * @param {object} vuex The Vuex destructuring object\n\t * @param {Function} vuex.commit The Vuex commit function\n\t * @return {Promise<void>}\n\t */\n\tasync reFetchStatusFromServer({ commit }) {\n\t\tconst status = await fetchCurrentStatus()\n\t\tcommit('loadStatusFromServer', status)\n\t},\n\n\t/**\n\t * Stores the status we got in the reply of the heartbeat\n\t *\n\t * @param {object} vuex The Vuex destructuring object\n\t * @param {Function} vuex.commit The Vuex commit function\n\t * @param {object} status The data destructuring object\n\t * @param {string} status.status The status type\n\t * @param {boolean} status.statusIsUserDefined Whether or not this status is user-defined\n\t * @param {string} status.message The message\n\t * @param {string} status.icon The icon\n\t * @param {number} status.clearAt When to automatically clear the status\n\t * @param {boolean} status.messageIsPredefined Whether or not the message is predefined\n\t * @param {string} status.messageId The id of the predefined message\n\t * @return {Promise<void>}\n\t */\n\tasync setStatusFromHeartbeat({ commit }, status) {\n\t\tcommit('loadStatusFromServer', status)\n\t},\n\n\t/**\n\t * Loads the server from the initial state\n\t *\n\t * @param {object} vuex The Vuex destructuring object\n\t * @param {Function} vuex.commit The Vuex commit function\n\t */\n\tloadStatusFromInitialState({ commit }) {\n\t\tconst status = loadState('user_status', 'status')\n\t\tcommit('loadStatusFromServer', status)\n\t},\n}\n\nexport default { state, mutations, getters, actions }\n","/**\n * @copyright Copyright (c) 2020 Georg Ehrke\n *\n * @author Georg Ehrke <oc.list@georgehrke.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 Vue from 'vue'\nimport Vuex, { Store } from 'vuex'\nimport predefinedStatuses from './predefinedStatuses'\nimport userStatus from './userStatus'\n\nVue.use(Vuex)\n\nexport default new Store({\n\tmodules: {\n\t\tpredefinedStatuses,\n\t\tuserStatus,\n\t},\n\tstrict: true,\n})\n","/**\n * @copyright Copyright (c) 2020 Georg Ehrke\n *\n * @author Georg Ehrke <oc.list@georgehrke.com>\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 { getRequestToken } from '@nextcloud/auth'\nimport UserStatus from './UserStatus'\nimport store from './store'\nimport Avatar from '@nextcloud/vue/dist/Components/Avatar'\n\n// eslint-disable-next-line camelcase\n__webpack_nonce__ = btoa(getRequestToken())\n\nVue.prototype.t = t\nVue.prototype.$t = t\n\nconst avatarDiv = document.getElementById('avatardiv-menu')\nconst propsData = {\n\tpreloadedUserStatus: {\n\t\tmessage: avatarDiv.dataset.userstatus_message,\n\t\ticon: avatarDiv.dataset.userstatus_icon,\n\t\tstatus: avatarDiv.dataset.userstatus,\n\t},\n\tuser: avatarDiv.dataset.user,\n\tdisplayName: avatarDiv.dataset.displayname,\n\turl: avatarDiv.dataset.avatar,\n\tdisableMenu: true,\n\tdisableTooltip: true,\n}\n\nconst AvatarInMenu = Vue.extend(Avatar)\nnew AvatarInMenu({ propsData }).$mount('#avatardiv-menu')\n\n// Register settings menu entry\nexport default new Vue({\n\tel: 'li[data-id=\"user_status-menuitem\"]',\n\t// eslint-disable-next-line vue/match-component-file-name\n\tname: 'UserStatusRoot',\n\trender: h => h(UserStatus),\n\tstore,\n})\n\n// Register dashboard status\ndocument.addEventListener('DOMContentLoaded', function() {\n\tif (!OCA.Dashboard) {\n\t\treturn\n\t}\n\n\tOCA.Dashboard.registerStatus('status', (el) => {\n\t\tconst Dashboard = Vue.extend(UserStatus)\n\t\treturn new Dashboard({\n\t\t\tpropsData: {\n\t\t\t\tinline: true,\n\t\t\t},\n\t\t\tstore,\n\t\t}).$mount(el)\n\t})\n})\n","/**\n * @copyright Copyright (c) 2020 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\nimport { mapState } from 'vuex'\nimport { showError } from '@nextcloud/dialogs'\n\nexport default {\n\tcomputed: {\n\t\t...mapState({\n\t\t\tstatusType: state => state.userStatus.status,\n\t\t\tstatusIsUserDefined: state => state.userStatus.statusIsUserDefined,\n\t\t\tcustomIcon: state => state.userStatus.icon,\n\t\t\tcustomMessage: state => state.userStatus.message,\n\t\t}),\n\n\t\t/**\n\t\t * The message displayed in the top right corner\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tvisibleMessage() {\n\t\t\tif (this.customIcon && this.customMessage) {\n\t\t\t\treturn `${this.customIcon} ${this.customMessage}`\n\t\t\t}\n\n\t\t\tif (this.customMessage) {\n\t\t\t\treturn this.customMessage\n\t\t\t}\n\n\t\t\tif (this.statusIsUserDefined) {\n\t\t\t\tswitch (this.statusType) {\n\t\t\t\tcase 'online':\n\t\t\t\t\treturn this.$t('user_status', 'Online')\n\n\t\t\t\tcase 'away':\n\t\t\t\t\treturn this.$t('user_status', 'Away')\n\n\t\t\t\tcase 'dnd':\n\t\t\t\t\treturn this.$t('user_status', 'Do not disturb')\n\n\t\t\t\tcase 'invisible':\n\t\t\t\t\treturn this.$t('user_status', 'Invisible')\n\n\t\t\t\tcase 'offline':\n\t\t\t\t\treturn this.$t('user_status', 'Offline')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this.$t('user_status', 'Set status')\n\t\t},\n\n\t\t/**\n\t\t * The status indicator icon\n\t\t *\n\t\t * @return {string | null}\n\t\t */\n\t\tstatusIcon() {\n\t\t\tswitch (this.statusType) {\n\t\t\tcase 'online':\n\t\t\t\treturn 'icon-user-status-online'\n\n\t\t\tcase 'away':\n\t\t\t\treturn 'icon-user-status-away'\n\n\t\t\tcase 'dnd':\n\t\t\t\treturn 'icon-user-status-dnd'\n\n\t\t\tcase 'invisible':\n\t\t\tcase 'offline':\n\t\t\t\treturn 'icon-user-status-invisible'\n\t\t\t}\n\n\t\t\treturn ''\n\t\t},\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Changes the user-status\n\t\t *\n\t\t * @param {string} statusType (online / away / dnd / invisible)\n\t\t */\n\t\tasync changeStatus(statusType) {\n\t\t\ttry {\n\t\t\t\tawait this.$store.dispatch('setStatus', { statusType })\n\t\t\t} catch (err) {\n\t\t\t\tshowError(this.$t('user_status', 'There was an error saving the new status'))\n\t\t\t\tconsole.debug(err)\n\t\t\t}\n\t\t},\n\t},\n}\n","/**\n * @copyright Copyright (c) 2020 Georg Ehrke\n *\n * @author Georg Ehrke <oc.list@georgehrke.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 dateFactory = () => {\n\treturn new Date()\n}\n\nexport {\n\tdateFactory,\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, \".user-status-menu-item__header[data-v-e652bbe6]{display:flex !important;flex-direction:column !important;width:auto !important;height:66px !important;padding:10px 12px 5px 12px !important;align-items:flex-start !important;color:var(--color-main-text) !important}.user-status-menu-item__header[data-v-e652bbe6]:not([href]){height:var(--header-menu-item-height) !important;color:var(--color-text-maxcontrast) !important;cursor:default !important}.user-status-menu-item__header:not([href]) *[data-v-e652bbe6]{cursor:default !important}.user-status-menu-item__header[data-v-e652bbe6]:not([href]):hover{background-color:transparent !important}.user-status-menu-item__header-content[data-v-e652bbe6]{display:inline-flex !important;font-weight:bold !important;gap:0 10px !important;width:auto}.user-status-menu-item__header-content-displayname[data-v-e652bbe6]{width:auto}.user-status-menu-item__header-content-placeholder[data-v-e652bbe6]{width:16px !important;height:24px !important;margin-right:10px !important;visibility:hidden !important}.user-status-menu-item__header span[data-v-e652bbe6]{color:var(--color-text-maxcontrast) !important}.user-status-menu-item__toggle-icon[data-v-e652bbe6]{width:16px;height:16px;margin-right:10px;opacity:1 !important;background-size:16px}.user-status-menu-item__toggle--inline[data-v-e652bbe6]{width:auto;min-width:44px;height:44px;margin:0;border:0;border-radius:var(--border-radius-pill);background-color:var(--color-background-translucent);font-size:inherit;font-weight:normal;-webkit-backdrop-filter:var(--background-blur);backdrop-filter:var(--background-blur)}.user-status-menu-item__toggle--inline[data-v-e652bbe6]:active,.user-status-menu-item__toggle--inline[data-v-e652bbe6]:hover,.user-status-menu-item__toggle--inline[data-v-e652bbe6]:focus{background-color:var(--color-background-hover)}li[data-v-e652bbe6]{list-style-type:none}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/user_status/src/UserStatus.vue\"],\"names\":[],\"mappings\":\"AAgOC,gDACC,uBAAA,CACA,gCAAA,CACA,qBAAA,CACA,sBAAA,CACA,qCAAA,CACA,iCAAA,CACA,uCAAA,CAEA,4DACC,gDAAA,CACA,8CAAA,CACA,yBAAA,CAEA,8DACC,yBAAA,CAGD,kEACC,uCAAA,CAIF,wDACC,8BAAA,CACA,2BAAA,CACA,qBAAA,CACA,UAAA,CAEA,oEACC,UAAA,CAGD,oEACC,qBAAA,CACA,sBAAA,CACA,4BAAA,CACA,4BAAA,CAIF,qDACC,8CAAA,CAKD,qDACC,UAAA,CACA,WAAA,CACA,iBAAA,CACA,oBAAA,CACA,oBAAA,CAID,wDACC,UAAA,CACA,cAAA,CACA,WAAA,CACA,QAAA,CACA,QAAA,CACA,uCAAA,CACA,oDAAA,CACA,iBAAA,CACA,kBAAA,CAEA,8CAAA,CACA,sCAAA,CAEA,2LAGC,8CAAA,CAMJ,oBACC,oBAAA\",\"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.user-status-menu-item {\\n\\t&__header {\\n\\t\\tdisplay: flex !important;\\n\\t\\tflex-direction: column !important;\\n\\t\\twidth: auto !important;\\n\\t\\theight: 44px * 1.5 !important;\\n\\t\\tpadding: 10px 12px 5px 12px !important;\\n\\t\\talign-items: flex-start !important;\\n\\t\\tcolor: var(--color-main-text) !important;\\n\\n\\t\\t&:not([href]) {\\n\\t\\t\\theight: var(--header-menu-item-height) !important;\\n\\t\\t\\tcolor: var(--color-text-maxcontrast) !important;\\n\\t\\t\\tcursor: default !important;\\n\\n\\t\\t\\t& * {\\n\\t\\t\\t\\tcursor: default !important;\\n\\t\\t\\t}\\n\\n\\t\\t\\t&:hover {\\n\\t\\t\\t\\tbackground-color: transparent !important;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t&-content {\\n\\t\\t\\tdisplay: inline-flex !important;\\n\\t\\t\\tfont-weight: bold !important;\\n\\t\\t\\tgap: 0 10px !important;\\n\\t\\t\\twidth: auto;\\n\\n\\t\\t\\t&-displayname {\\n\\t\\t\\t\\twidth: auto;\\n\\t\\t\\t}\\n\\n\\t\\t\\t&-placeholder {\\n\\t\\t\\t\\twidth: 16px !important;\\n\\t\\t\\t\\theight: 24px !important;\\n\\t\\t\\t\\tmargin-right: 10px !important;\\n\\t\\t\\t\\tvisibility: hidden !important;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tspan {\\n\\t\\t\\tcolor: var(--color-text-maxcontrast) !important;\\n\\t\\t}\\n\\t}\\n\\n\\t&__toggle {\\n\\t\\t&-icon {\\n\\t\\t\\twidth: 16px;\\n\\t\\t\\theight: 16px;\\n\\t\\t\\tmargin-right: 10px;\\n\\t\\t\\topacity: 1 !important;\\n\\t\\t\\tbackground-size: 16px;\\n\\t\\t}\\n\\n\\t\\t// In dashboard\\n\\t\\t&--inline {\\n\\t\\t\\twidth: auto;\\n\\t\\t\\tmin-width: 44px;\\n\\t\\t\\theight: 44px;\\n\\t\\t\\tmargin: 0;\\n\\t\\t\\tborder: 0;\\n\\t\\t\\tborder-radius: var(--border-radius-pill);\\n\\t\\t\\tbackground-color: var(--color-background-translucent);\\n\\t\\t\\tfont-size: inherit;\\n\\t\\t\\tfont-weight: normal;\\n\\n\\t\\t\\t-webkit-backdrop-filter: var(--background-blur);\\n\\t\\t\\tbackdrop-filter: var(--background-blur);\\n\\n\\t\\t\\t&:active,\\n\\t\\t\\t&:hover,\\n\\t\\t\\t&:focus {\\n\\t\\t\\t\\tbackground-color: var(--color-background-hover);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\\nli {\\n\\tlist-style-type: none;\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","var map = {\n\t\"./af\": 42786,\n\t\"./af.js\": 42786,\n\t\"./ar\": 30867,\n\t\"./ar-dz\": 14130,\n\t\"./ar-dz.js\": 14130,\n\t\"./ar-kw\": 96135,\n\t\"./ar-kw.js\": 96135,\n\t\"./ar-ly\": 56440,\n\t\"./ar-ly.js\": 56440,\n\t\"./ar-ma\": 47702,\n\t\"./ar-ma.js\": 47702,\n\t\"./ar-sa\": 16040,\n\t\"./ar-sa.js\": 16040,\n\t\"./ar-tn\": 37100,\n\t\"./ar-tn.js\": 37100,\n\t\"./ar.js\": 30867,\n\t\"./az\": 31083,\n\t\"./az.js\": 31083,\n\t\"./be\": 9808,\n\t\"./be.js\": 9808,\n\t\"./bg\": 68338,\n\t\"./bg.js\": 68338,\n\t\"./bm\": 67438,\n\t\"./bm.js\": 67438,\n\t\"./bn\": 8905,\n\t\"./bn-bd\": 76225,\n\t\"./bn-bd.js\": 76225,\n\t\"./bn.js\": 8905,\n\t\"./bo\": 11560,\n\t\"./bo.js\": 11560,\n\t\"./br\": 1278,\n\t\"./br.js\": 1278,\n\t\"./bs\": 80622,\n\t\"./bs.js\": 80622,\n\t\"./ca\": 2468,\n\t\"./ca.js\": 2468,\n\t\"./cs\": 5822,\n\t\"./cs.js\": 5822,\n\t\"./cv\": 50877,\n\t\"./cv.js\": 50877,\n\t\"./cy\": 47373,\n\t\"./cy.js\": 47373,\n\t\"./da\": 24780,\n\t\"./da.js\": 24780,\n\t\"./de\": 59740,\n\t\"./de-at\": 60217,\n\t\"./de-at.js\": 60217,\n\t\"./de-ch\": 60894,\n\t\"./de-ch.js\": 60894,\n\t\"./de.js\": 59740,\n\t\"./dv\": 5300,\n\t\"./dv.js\": 5300,\n\t\"./el\": 50837,\n\t\"./el.js\": 50837,\n\t\"./en-au\": 78348,\n\t\"./en-au.js\": 78348,\n\t\"./en-ca\": 77925,\n\t\"./en-ca.js\": 77925,\n\t\"./en-gb\": 22243,\n\t\"./en-gb.js\": 22243,\n\t\"./en-ie\": 46436,\n\t\"./en-ie.js\": 46436,\n\t\"./en-il\": 47207,\n\t\"./en-il.js\": 47207,\n\t\"./en-in\": 44175,\n\t\"./en-in.js\": 44175,\n\t\"./en-nz\": 76319,\n\t\"./en-nz.js\": 76319,\n\t\"./en-sg\": 31662,\n\t\"./en-sg.js\": 31662,\n\t\"./eo\": 92915,\n\t\"./eo.js\": 92915,\n\t\"./es\": 55655,\n\t\"./es-do\": 55251,\n\t\"./es-do.js\": 55251,\n\t\"./es-mx\": 96112,\n\t\"./es-mx.js\": 96112,\n\t\"./es-us\": 71146,\n\t\"./es-us.js\": 71146,\n\t\"./es.js\": 55655,\n\t\"./et\": 5603,\n\t\"./et.js\": 5603,\n\t\"./eu\": 77763,\n\t\"./eu.js\": 77763,\n\t\"./fa\": 76959,\n\t\"./fa.js\": 76959,\n\t\"./fi\": 11897,\n\t\"./fi.js\": 11897,\n\t\"./fil\": 42549,\n\t\"./fil.js\": 42549,\n\t\"./fo\": 94694,\n\t\"./fo.js\": 94694,\n\t\"./fr\": 94470,\n\t\"./fr-ca\": 63049,\n\t\"./fr-ca.js\": 63049,\n\t\"./fr-ch\": 52330,\n\t\"./fr-ch.js\": 52330,\n\t\"./fr.js\": 94470,\n\t\"./fy\": 5044,\n\t\"./fy.js\": 5044,\n\t\"./ga\": 29295,\n\t\"./ga.js\": 29295,\n\t\"./gd\": 2101,\n\t\"./gd.js\": 2101,\n\t\"./gl\": 38794,\n\t\"./gl.js\": 38794,\n\t\"./gom-deva\": 27884,\n\t\"./gom-deva.js\": 27884,\n\t\"./gom-latn\": 23168,\n\t\"./gom-latn.js\": 23168,\n\t\"./gu\": 95349,\n\t\"./gu.js\": 95349,\n\t\"./he\": 24206,\n\t\"./he.js\": 24206,\n\t\"./hi\": 30094,\n\t\"./hi.js\": 30094,\n\t\"./hr\": 30316,\n\t\"./hr.js\": 30316,\n\t\"./hu\": 22138,\n\t\"./hu.js\": 22138,\n\t\"./hy-am\": 11423,\n\t\"./hy-am.js\": 11423,\n\t\"./id\": 29218,\n\t\"./id.js\": 29218,\n\t\"./is\": 90135,\n\t\"./is.js\": 90135,\n\t\"./it\": 90626,\n\t\"./it-ch\": 10150,\n\t\"./it-ch.js\": 10150,\n\t\"./it.js\": 90626,\n\t\"./ja\": 39183,\n\t\"./ja.js\": 39183,\n\t\"./jv\": 24286,\n\t\"./jv.js\": 24286,\n\t\"./ka\": 12105,\n\t\"./ka.js\": 12105,\n\t\"./kk\": 47772,\n\t\"./kk.js\": 47772,\n\t\"./km\": 18758,\n\t\"./km.js\": 18758,\n\t\"./kn\": 79282,\n\t\"./kn.js\": 79282,\n\t\"./ko\": 33730,\n\t\"./ko.js\": 33730,\n\t\"./ku\": 1408,\n\t\"./ku.js\": 1408,\n\t\"./ky\": 33291,\n\t\"./ky.js\": 33291,\n\t\"./lb\": 36841,\n\t\"./lb.js\": 36841,\n\t\"./lo\": 55466,\n\t\"./lo.js\": 55466,\n\t\"./lt\": 57010,\n\t\"./lt.js\": 57010,\n\t\"./lv\": 37595,\n\t\"./lv.js\": 37595,\n\t\"./me\": 39861,\n\t\"./me.js\": 39861,\n\t\"./mi\": 35493,\n\t\"./mi.js\": 35493,\n\t\"./mk\": 95966,\n\t\"./mk.js\": 95966,\n\t\"./ml\": 87341,\n\t\"./ml.js\": 87341,\n\t\"./mn\": 5115,\n\t\"./mn.js\": 5115,\n\t\"./mr\": 10370,\n\t\"./mr.js\": 10370,\n\t\"./ms\": 9847,\n\t\"./ms-my\": 41237,\n\t\"./ms-my.js\": 41237,\n\t\"./ms.js\": 9847,\n\t\"./mt\": 72126,\n\t\"./mt.js\": 72126,\n\t\"./my\": 56165,\n\t\"./my.js\": 56165,\n\t\"./nb\": 64924,\n\t\"./nb.js\": 64924,\n\t\"./ne\": 16744,\n\t\"./ne.js\": 16744,\n\t\"./nl\": 93901,\n\t\"./nl-be\": 59814,\n\t\"./nl-be.js\": 59814,\n\t\"./nl.js\": 93901,\n\t\"./nn\": 83877,\n\t\"./nn.js\": 83877,\n\t\"./oc-lnc\": 92135,\n\t\"./oc-lnc.js\": 92135,\n\t\"./pa-in\": 15858,\n\t\"./pa-in.js\": 15858,\n\t\"./pl\": 64495,\n\t\"./pl.js\": 64495,\n\t\"./pt\": 89520,\n\t\"./pt-br\": 57971,\n\t\"./pt-br.js\": 57971,\n\t\"./pt.js\": 89520,\n\t\"./ro\": 96459,\n\t\"./ro.js\": 96459,\n\t\"./ru\": 21793,\n\t\"./ru.js\": 21793,\n\t\"./sd\": 40950,\n\t\"./sd.js\": 40950,\n\t\"./se\": 10490,\n\t\"./se.js\": 10490,\n\t\"./si\": 90124,\n\t\"./si.js\": 90124,\n\t\"./sk\": 64249,\n\t\"./sk.js\": 64249,\n\t\"./sl\": 14985,\n\t\"./sl.js\": 14985,\n\t\"./sq\": 51104,\n\t\"./sq.js\": 51104,\n\t\"./sr\": 49131,\n\t\"./sr-cyrl\": 79915,\n\t\"./sr-cyrl.js\": 79915,\n\t\"./sr.js\": 49131,\n\t\"./ss\": 85893,\n\t\"./ss.js\": 85893,\n\t\"./sv\": 98760,\n\t\"./sv.js\": 98760,\n\t\"./sw\": 91172,\n\t\"./sw.js\": 91172,\n\t\"./ta\": 27333,\n\t\"./ta.js\": 27333,\n\t\"./te\": 23110,\n\t\"./te.js\": 23110,\n\t\"./tet\": 52095,\n\t\"./tet.js\": 52095,\n\t\"./tg\": 27321,\n\t\"./tg.js\": 27321,\n\t\"./th\": 9041,\n\t\"./th.js\": 9041,\n\t\"./tk\": 19005,\n\t\"./tk.js\": 19005,\n\t\"./tl-ph\": 75768,\n\t\"./tl-ph.js\": 75768,\n\t\"./tlh\": 89444,\n\t\"./tlh.js\": 89444,\n\t\"./tr\": 72397,\n\t\"./tr.js\": 72397,\n\t\"./tzl\": 28254,\n\t\"./tzl.js\": 28254,\n\t\"./tzm\": 51106,\n\t\"./tzm-latn\": 30699,\n\t\"./tzm-latn.js\": 30699,\n\t\"./tzm.js\": 51106,\n\t\"./ug-cn\": 9288,\n\t\"./ug-cn.js\": 9288,\n\t\"./uk\": 67691,\n\t\"./uk.js\": 67691,\n\t\"./ur\": 13795,\n\t\"./ur.js\": 13795,\n\t\"./uz\": 6791,\n\t\"./uz-latn\": 60588,\n\t\"./uz-latn.js\": 60588,\n\t\"./uz.js\": 6791,\n\t\"./vi\": 65666,\n\t\"./vi.js\": 65666,\n\t\"./x-pseudo\": 14378,\n\t\"./x-pseudo.js\": 14378,\n\t\"./yo\": 75805,\n\t\"./yo.js\": 75805,\n\t\"./zh-cn\": 83839,\n\t\"./zh-cn.js\": 83839,\n\t\"./zh-hk\": 55726,\n\t\"./zh-hk.js\": 55726,\n\t\"./zh-mo\": 99807,\n\t\"./zh-mo.js\": 99807,\n\t\"./zh-tw\": 74152,\n\t\"./zh-tw.js\": 74152\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 46700;","// 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 \"\" + \"user-status-modal\" + \"-\" + chunkId + \".js?v=\" + \"3f331fd4343acdf15116\" + \"\";\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 = 2613;","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\t2613: 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));","// 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__(82205); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","inProgress","dataWebpackPrefix","sendHeartbeat","isAway","url","generateUrl","HttpClient","status","response","data","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","component","_vm","this","_h","$createElement","_c","_self","staticClass","inline","_e","attrs","profilePageLink","on","loadProfilePage","_v","_s","displayName","loadingProfilePage","t","tag","class","$event","preventDefault","stopPropagation","openModal","apply","arguments","statusIcon","visibleMessage","closeModal","fetchAllPredefinedStatuses","generateOcsUrl","ocs","actions","loadAllPredefinedStatuses","state","commit","predefinedStatuses","length","statuses","mutations","addPredefinedStatus","push","getters","fetchCurrentStatus","setStatus","statusType","setPredefinedMessage","messageId","clearAt","setCustomMessage","message","clearMessage","getTimestampForClearAt","date","dateFactory","type","setSeconds","getSeconds","time","Math","floor","getTime","Number","moment","endOf","format","statusIsUserDefined","icon","messageIsPredefined","loadStatusFromServer","emit","userId","getCurrentUser","uid","setStatusFromObject","rootState","resolvedClearAt","find","id","reFetchStatusFromServer","setStatusFromHeartbeat","loadStatusFromInitialState","loadState","Vue","Vuex","Store","modules","userStatus","strict","__webpack_nonce__","btoa","getRequestToken","avatarDiv","document","getElementById","propsData","preloadedUserStatus","dataset","userstatus_message","userstatus_icon","userstatus","user","displayname","avatar","disableMenu","disableTooltip","Avatar","$mount","el","name","render","h","UserStatus","store","addEventListener","OCA","Dashboard","registerStatus","computed","mapState","customIcon","customMessage","$t","methods","changeStatus","$store","dispatch","showError","console","debug","Date","___CSS_LOADER_EXPORT___","module","map","webpackContext","req","webpackContextResolve","__webpack_require__","o","e","Error","code","keys","Object","resolve","exports","__webpack_module_cache__","moduleId","cachedModule","undefined","loaded","__webpack_modules__","call","m","amdD","amdO","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","fulfilled","j","every","key","splice","r","n","getter","__esModule","d","a","definition","defineProperty","enumerable","get","f","chunkId","Promise","all","reduce","promises","u","g","globalThis","Function","window","obj","prop","prototype","hasOwnProperty","l","done","script","needAttach","scripts","getElementsByTagName","s","getAttribute","createElement","charset","timeout","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","forEach","setTimeout","bind","target","head","appendChild","Symbol","toStringTag","value","nmd","paths","children","scriptUrl","importScripts","location","currentScript","replace","p","b","baseURI","self","href","installedChunks","installedChunkData","promise","reject","error","errorType","realSrc","request","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file +{"version":3,"file":"user_status-menu.js?v=9510cc8bbba1b7cfe4a3","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/webpack/runtime/load script","webpack:///nextcloud/apps/user_status/src/services/heartbeatService.js","webpack:///nextcloud/apps/user_status/src/UserStatus.vue","webpack:///nextcloud/apps/user_status/src/UserStatus.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/user_status/src/UserStatus.vue?b527","webpack://nextcloud/./apps/user_status/src/UserStatus.vue?d74a","webpack:///nextcloud/apps/user_status/src/UserStatus.vue?vue&type=template&id=5879d4bb&scoped=true&","webpack:///nextcloud/apps/user_status/src/services/predefinedStatusService.js","webpack:///nextcloud/apps/user_status/src/store/predefinedStatuses.js","webpack:///nextcloud/apps/user_status/src/services/statusService.js","webpack:///nextcloud/apps/user_status/src/services/clearAtService.js","webpack:///nextcloud/apps/user_status/src/store/userStatus.js","webpack:///nextcloud/apps/user_status/src/store/index.js","webpack:///nextcloud/apps/user_status/src/menu.js","webpack:///nextcloud/apps/user_status/src/mixins/OnlineStatusMixin.js","webpack:///nextcloud/apps/user_status/src/services/dateService.js","webpack:///nextcloud/apps/user_status/src/UserStatus.vue?vue&type=style&index=0&id=5879d4bb&lang=scss&scoped=true&","webpack:///nextcloud/node_modules/moment/locale|sync|/^\\.\\/.*$","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/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};","/**\n * @copyright Copyright (c) 2020 Georg Ehrke\n *\n * @author Georg Ehrke <oc.list@georgehrke.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 HttpClient from '@nextcloud/axios'\nimport { generateUrl } from '@nextcloud/router'\n\n/**\n * Sends a heartbeat\n *\n * @param {boolean} isAway Whether or not the user is active\n * @return {Promise<void>}\n */\nconst sendHeartbeat = async (isAway) => {\n\tconst url = generateUrl('/apps/user_status/heartbeat')\n\tconst response = await HttpClient.put(url, {\n\t\tstatus: isAway ? 'away' : 'online',\n\t})\n\treturn response.data\n}\n\nexport {\n\tsendHeartbeat,\n}\n","<!--\n - @copyright Copyright (c) 2020 Georg Ehrke <oc.list@georgehrke.com>\n - @author Georg Ehrke <oc.list@georgehrke.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<li>\n\t\t<div class=\"user-status-menu-item\">\n\t\t\t<!-- Username display -->\n\t\t\t<a v-if=\"!inline\"\n\t\t\t\tclass=\"user-status-menu-item__header\"\n\t\t\t\t:href=\"profilePageLink\"\n\t\t\t\t@click=\"loadProfilePage\">\n\t\t\t\t<div class=\"user-status-menu-item__header-content\">\n\t\t\t\t\t<div class=\"user-status-menu-item__header-content-displayname\">{{ displayName }}</div>\n\t\t\t\t\t<div v-if=\"!loadingProfilePage\" class=\"user-status-menu-item__header-content-placeholder\" />\n\t\t\t\t\t<div v-else class=\"icon-loading-small\" />\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"profileEnabled\">\n\t\t\t\t\t{{ t('user_status', 'View profile') }}\n\t\t\t\t</div>\n\t\t\t</a>\n\n\t\t\t<!-- Status modal toggle -->\n\t\t\t<toggle :is=\"inline ? 'button' : 'a'\"\n\t\t\t\t:class=\"{'user-status-menu-item__toggle--inline': inline}\"\n\t\t\t\tclass=\"user-status-menu-item__toggle\"\n\t\t\t\thref=\"#\"\n\t\t\t\t@click.prevent.stop=\"openModal\">\n\t\t\t\t<span :class=\"statusIcon\" class=\"user-status-menu-item__toggle-icon\" />\n\t\t\t\t{{ visibleMessage }}\n\t\t\t</toggle>\n\t\t</div>\n\n\t\t<!-- Status management modal -->\n\t\t<SetStatusModal v-if=\"isModalOpen\"\n\t\t\t@close=\"closeModal\" />\n\t</li>\n</template>\n\n<script>\nimport { generateUrl } from '@nextcloud/router'\nimport { getCurrentUser } from '@nextcloud/auth'\nimport { loadState } from '@nextcloud/initial-state'\nimport { subscribe, unsubscribe } from '@nextcloud/event-bus'\nimport debounce from 'debounce'\n\nimport { sendHeartbeat } from './services/heartbeatService'\nimport OnlineStatusMixin from './mixins/OnlineStatusMixin'\n\nconst { profileEnabled } = loadState('user_status', 'profileEnabled', false)\n\nexport default {\n\tname: 'UserStatus',\n\n\tcomponents: {\n\t\tSetStatusModal: () => import(/* webpackChunkName: 'user-status-modal' */'./components/SetStatusModal'),\n\t},\n\tmixins: [OnlineStatusMixin],\n\n\tprops: {\n\t\tinline: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tdisplayName: getCurrentUser().displayName,\n\t\t\theartbeatInterval: null,\n\t\t\tisAway: false,\n\t\t\tisModalOpen: false,\n\t\t\tloadingProfilePage: false,\n\t\t\tmouseMoveListener: null,\n\t\t\tprofileEnabled,\n\t\t\tsetAwayTimeout: null,\n\t\t}\n\t},\n\tcomputed: {\n\t\t/**\n\t\t * The profile page link\n\t\t *\n\t\t * @return {string | null}\n\t\t */\n\t\tprofilePageLink() {\n\t\t\tif (this.profileEnabled) {\n\t\t\t\treturn generateUrl('/u/{userId}', { userId: getCurrentUser().uid })\n\t\t\t}\n\t\t\t// Since an anchor element is used rather than a button,\n\t\t\t// this hack removes href if the profile is disabled so that disabling pointer-events is not needed to prevent a click from opening a page\n\t\t\t// and to allow the hover event for styling\n\t\t\treturn null\n\t\t},\n\t},\n\n\t/**\n\t * Loads the current user's status from initial state\n\t * and stores it in Vuex\n\t */\n\tmounted() {\n\t\tsubscribe('settings:display-name:updated', this.handleDisplayNameUpdate)\n\t\tsubscribe('settings:profile-enabled:updated', this.handleProfileEnabledUpdate)\n\n\t\tthis.$store.dispatch('loadStatusFromInitialState')\n\n\t\tif (OC.config.session_keepalive) {\n\t\t\t// Send the latest status to the server every 5 minutes\n\t\t\tthis.heartbeatInterval = setInterval(this._backgroundHeartbeat.bind(this), 1000 * 60 * 5)\n\t\t\tthis.setAwayTimeout = () => {\n\t\t\t\tthis.isAway = true\n\t\t\t}\n\t\t\t// Catch mouse movements, but debounce to once every 30 seconds\n\t\t\tthis.mouseMoveListener = debounce(() => {\n\t\t\t\tconst wasAway = this.isAway\n\t\t\t\tthis.isAway = false\n\t\t\t\t// Reset the two minute counter\n\t\t\t\tclearTimeout(this.setAwayTimeout)\n\t\t\t\t// If the user did not move the mouse within two minutes,\n\t\t\t\t// mark them as away\n\t\t\t\tsetTimeout(this.setAwayTimeout, 1000 * 60 * 2)\n\n\t\t\t\tif (wasAway) {\n\t\t\t\t\tthis._backgroundHeartbeat()\n\t\t\t\t}\n\t\t\t}, 1000 * 2, true)\n\t\t\twindow.addEventListener('mousemove', this.mouseMoveListener, {\n\t\t\t\tcapture: true,\n\t\t\t\tpassive: true,\n\t\t\t})\n\n\t\t\tthis._backgroundHeartbeat()\n\t\t}\n\t\tsubscribe('user_status:status.updated', this.handleUserStatusUpdated)\n\t},\n\n\t/**\n\t * Some housekeeping before destroying the component\n\t */\n\tbeforeDestroy() {\n\t\tunsubscribe('settings:display-name:updated', this.handleDisplayNameUpdate)\n\t\tunsubscribe('settings:profile-enabled:updated', this.handleProfileEnabledUpdate)\n\t\twindow.removeEventListener('mouseMove', this.mouseMoveListener)\n\t\tclearInterval(this.heartbeatInterval)\n\t\tunsubscribe('user_status:status.updated', this.handleUserStatusUpdated)\n\t},\n\n\tmethods: {\n\t\thandleDisplayNameUpdate(displayName) {\n\t\t\tthis.displayName = displayName\n\t\t},\n\n\t\thandleProfileEnabledUpdate(profileEnabled) {\n\t\t\tthis.profileEnabled = profileEnabled\n\t\t},\n\n\t\tloadProfilePage() {\n\t\t\tif (this.profileEnabled) {\n\t\t\t\tthis.loadingProfilePage = true\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Opens the modal to set a custom status\n\t\t */\n\t\topenModal() {\n\t\t\tthis.isModalOpen = true\n\t\t},\n\t\t/**\n\t\t * Closes the modal\n\t\t */\n\t\tcloseModal() {\n\t\t\tthis.isModalOpen = false\n\t\t},\n\n\t\t/**\n\t\t * Sends the status heartbeat to the server\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t * @private\n\t\t */\n\t\tasync _backgroundHeartbeat() {\n\t\t\ttry {\n\t\t\t\tconst status = await sendHeartbeat(this.isAway)\n\t\t\t\tif (status?.userId) {\n\t\t\t\t\tthis.$store.dispatch('setStatusFromHeartbeat', status)\n\t\t\t\t} else {\n\t\t\t\t\tawait this.$store.dispatch('reFetchStatusFromServer')\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.debug('Failed sending heartbeat, got: ' + error.response?.status)\n\t\t\t}\n\t\t},\n\t\thandleUserStatusUpdated(state) {\n\t\t\tif (OC.getCurrentUser().uid === state.userId) {\n\t\t\t\tthis.$store.dispatch('setStatusFromObject', {\n\t\t\t\t\tstatus: state.status,\n\t\t\t\t\ticon: state.icon,\n\t\t\t\t\tmessage: state.message,\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.user-status-menu-item {\n\t&__header {\n\t\tdisplay: flex !important;\n\t\tflex-direction: column !important;\n\t\twidth: auto !important;\n\t\theight: 44px * 1.5 !important;\n\t\tpadding: 10px 12px 5px 12px !important;\n\t\talign-items: flex-start !important;\n\t\tcolor: var(--color-main-text) !important;\n\n\t\t&:not([href]) {\n\t\t\theight: var(--header-menu-item-height) !important;\n\t\t\tcolor: var(--color-text-maxcontrast) !important;\n\t\t\tcursor: default !important;\n\n\t\t\t& * {\n\t\t\t\tcursor: default !important;\n\t\t\t}\n\n\t\t\t&:hover {\n\t\t\t\tbackground-color: transparent !important;\n\t\t\t}\n\t\t}\n\n\t\t&-content {\n\t\t\tdisplay: inline-flex !important;\n\t\t\tfont-weight: bold !important;\n\t\t\tgap: 0 10px !important;\n\t\t\twidth: auto;\n\n\t\t\t&-displayname {\n\t\t\t\twidth: auto;\n\t\t\t}\n\n\t\t\t&-placeholder {\n\t\t\t\twidth: 16px !important;\n\t\t\t\theight: 24px !important;\n\t\t\t\tmargin-right: 10px !important;\n\t\t\t\tvisibility: hidden !important;\n\t\t\t}\n\t\t}\n\n\t\tspan {\n\t\t\tcolor: var(--color-text-maxcontrast) !important;\n\t\t}\n\t}\n\n\t&__toggle {\n\t\t&-icon {\n\t\t\twidth: 16px;\n\t\t\theight: 16px;\n\t\t\tmargin-right: 10px;\n\t\t\topacity: 1 !important;\n\t\t\tbackground-size: 16px;\n\t\t}\n\n\t\t// In dashboard\n\t\t&--inline {\n\t\t\twidth: auto;\n\t\t\tmin-width: 44px;\n\t\t\theight: 44px;\n\t\t\tmargin: 0;\n\t\t\tborder: 0;\n\t\t\tborder-radius: var(--border-radius-pill);\n\t\t\tbackground-color: var(--color-background-translucent);\n\t\t\tfont-size: inherit;\n\t\t\tfont-weight: normal;\n\n\t\t\t-webkit-backdrop-filter: var(--background-blur);\n\t\t\tbackdrop-filter: var(--background-blur);\n\n\t\t\t&:active,\n\t\t\t&:hover,\n\t\t\t&:focus {\n\t\t\t\tbackground-color: var(--color-background-hover);\n\t\t\t}\n\t\t\t&:focus {\n\t\t\t\tborder: 2px solid var(--color-main-text)!important;\n\t\t\t}\n\t\t}\n\t}\n}\n\nli {\n\tlist-style-type: none;\n}\n\n</style>\n","import mod from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserStatus.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!./UserStatus.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!./UserStatus.vue?vue&type=style&index=0&id=5879d4bb&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!./UserStatus.vue?vue&type=style&index=0&id=5879d4bb&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./UserStatus.vue?vue&type=template&id=5879d4bb&scoped=true&\"\nimport script from \"./UserStatus.vue?vue&type=script&lang=js&\"\nexport * from \"./UserStatus.vue?vue&type=script&lang=js&\"\nimport style0 from \"./UserStatus.vue?vue&type=style&index=0&id=5879d4bb&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 \"5879d4bb\",\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('li',[_c('div',{staticClass:\"user-status-menu-item\"},[(!_vm.inline)?_c('a',{staticClass:\"user-status-menu-item__header\",attrs:{\"href\":_vm.profilePageLink},on:{\"click\":_vm.loadProfilePage}},[_c('div',{staticClass:\"user-status-menu-item__header-content\"},[_c('div',{staticClass:\"user-status-menu-item__header-content-displayname\"},[_vm._v(_vm._s(_vm.displayName))]),_vm._v(\" \"),(!_vm.loadingProfilePage)?_c('div',{staticClass:\"user-status-menu-item__header-content-placeholder\"}):_c('div',{staticClass:\"icon-loading-small\"})]),_vm._v(\" \"),(_vm.profileEnabled)?_c('div',[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('user_status', 'View profile'))+\"\\n\\t\\t\\t\")]):_vm._e()]):_vm._e(),_vm._v(\" \"),_c(_vm.inline ? 'button' : 'a',{tag:\"toggle\",staticClass:\"user-status-menu-item__toggle\",class:{'user-status-menu-item__toggle--inline': _vm.inline},attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();$event.stopPropagation();return _vm.openModal.apply(null, arguments)}}},[_c('span',{staticClass:\"user-status-menu-item__toggle-icon\",class:_vm.statusIcon}),_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.visibleMessage)+\"\\n\\t\\t\")])],1),_vm._v(\" \"),(_vm.isModalOpen)?_c('SetStatusModal',{on:{\"close\":_vm.closeModal}}):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2020 Georg Ehrke\n *\n * @author Georg Ehrke <oc.list@georgehrke.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 HttpClient from '@nextcloud/axios'\nimport { generateOcsUrl } from '@nextcloud/router'\n\n/**\n * Fetches all predefined statuses from the server\n *\n * @return {Promise<void>}\n */\nconst fetchAllPredefinedStatuses = async () => {\n\tconst url = generateOcsUrl('apps/user_status/api/v1/predefined_statuses?format=json')\n\tconst response = await HttpClient.get(url)\n\n\treturn response.data.ocs.data\n}\n\nexport {\n\tfetchAllPredefinedStatuses,\n}\n","/**\n * @copyright Copyright (c) 2020 Georg Ehrke\n *\n * @author Georg Ehrke <oc.list@georgehrke.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 { fetchAllPredefinedStatuses } from '../services/predefinedStatusService'\n\nconst state = {\n\tpredefinedStatuses: [],\n}\n\nconst mutations = {\n\n\t/**\n\t * Adds a predefined status to the state\n\t *\n\t * @param {object} state The Vuex state\n\t * @param {object} status The status to add\n\t */\n\taddPredefinedStatus(state, status) {\n\t\tstate.predefinedStatuses.push(status)\n\t},\n}\n\nconst getters = {}\n\nconst actions = {\n\n\t/**\n\t * Loads all predefined statuses from the server\n\t *\n\t * @param {object} vuex The Vuex components\n\t * @param {Function} vuex.commit The Vuex commit function\n\t * @param {object} vuex.state -\n\t */\n\tasync loadAllPredefinedStatuses({ state, commit }) {\n\t\tif (state.predefinedStatuses.length > 0) {\n\t\t\treturn\n\t\t}\n\n\t\tconst statuses = await fetchAllPredefinedStatuses()\n\t\tfor (const status of statuses) {\n\t\t\tcommit('addPredefinedStatus', status)\n\t\t}\n\t},\n\n}\n\nexport default { state, mutations, getters, actions }\n","/**\n * @copyright Copyright (c) 2020 Georg Ehrke\n *\n * @author Georg Ehrke <oc.list@georgehrke.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 HttpClient from '@nextcloud/axios'\nimport { generateOcsUrl } from '@nextcloud/router'\n\n/**\n * Fetches the current user-status\n *\n * @return {Promise<object>}\n */\nconst fetchCurrentStatus = async () => {\n\tconst url = generateOcsUrl('apps/user_status/api/v1/user_status')\n\tconst response = await HttpClient.get(url)\n\n\treturn response.data.ocs.data\n}\n\n/**\n * Sets the status\n *\n * @param {string} statusType The status (online / away / dnd / invisible)\n * @return {Promise<void>}\n */\nconst setStatus = async (statusType) => {\n\tconst url = generateOcsUrl('apps/user_status/api/v1/user_status/status')\n\tawait HttpClient.put(url, {\n\t\tstatusType,\n\t})\n}\n\n/**\n * Sets a message based on our predefined statuses\n *\n * @param {string} messageId The id of the message, taken from predefined status service\n * @param {number | null} clearAt When to automatically clean the status\n * @return {Promise<void>}\n */\nconst setPredefinedMessage = async (messageId, clearAt = null) => {\n\tconst url = generateOcsUrl('apps/user_status/api/v1/user_status/message/predefined?format=json')\n\tawait HttpClient.put(url, {\n\t\tmessageId,\n\t\tclearAt,\n\t})\n}\n\n/**\n * Sets a custom message\n *\n * @param {string} message The user-defined message\n * @param {string | null} statusIcon The user-defined icon\n * @param {number | null} clearAt When to automatically clean the status\n * @return {Promise<void>}\n */\nconst setCustomMessage = async (message, statusIcon = null, clearAt = null) => {\n\tconst url = generateOcsUrl('apps/user_status/api/v1/user_status/message/custom?format=json')\n\tawait HttpClient.put(url, {\n\t\tmessage,\n\t\tstatusIcon,\n\t\tclearAt,\n\t})\n}\n\n/**\n * Clears the current status of the user\n *\n * @return {Promise<void>}\n */\nconst clearMessage = async () => {\n\tconst url = generateOcsUrl('apps/user_status/api/v1/user_status/message?format=json')\n\tawait HttpClient.delete(url)\n}\n\nexport {\n\tfetchCurrentStatus,\n\tsetStatus,\n\tsetCustomMessage,\n\tsetPredefinedMessage,\n\tclearMessage,\n}\n","/**\n * @copyright Copyright (c) 2020 Georg Ehrke\n *\n * @author Georg Ehrke <oc.list@georgehrke.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 {\n\tdateFactory,\n} from './dateService'\nimport moment from '@nextcloud/moment'\n\n/**\n * Calculates the actual clearAt timestamp\n *\n * @param {object | null} clearAt The clear-at config\n * @return {number | null}\n */\nconst getTimestampForClearAt = (clearAt) => {\n\tif (clearAt === null) {\n\t\treturn null\n\t}\n\n\tconst date = dateFactory()\n\n\tif (clearAt.type === 'period') {\n\t\tdate.setSeconds(date.getSeconds() + clearAt.time)\n\t\treturn Math.floor(date.getTime() / 1000)\n\t}\n\tif (clearAt.type === 'end-of') {\n\t\tswitch (clearAt.time) {\n\t\tcase 'day':\n\t\tcase 'week':\n\t\t\treturn Number(moment(date).endOf(clearAt.time).format('X'))\n\t\t}\n\t}\n\t// This is not an officially supported type\n\t// but only used internally to show the remaining time\n\t// in the Set Status Modal\n\tif (clearAt.type === '_time') {\n\t\treturn clearAt.time\n\t}\n\n\treturn null\n}\n\nexport {\n\tgetTimestampForClearAt,\n}\n","/**\n * @copyright Copyright (c) 2020 Georg Ehrke\n *\n * @author Georg Ehrke <oc.list@georgehrke.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 {\n\tfetchCurrentStatus,\n\tsetStatus,\n\tsetPredefinedMessage,\n\tsetCustomMessage,\n\tclearMessage,\n} from '../services/statusService'\nimport { loadState } from '@nextcloud/initial-state'\nimport { getCurrentUser } from '@nextcloud/auth'\nimport { getTimestampForClearAt } from '../services/clearAtService'\nimport { emit } from '@nextcloud/event-bus'\n\nconst state = {\n\t// Status (online / away / dnd / invisible / offline)\n\tstatus: null,\n\t// Whether or not the status is user-defined\n\tstatusIsUserDefined: null,\n\t// A custom message set by the user\n\tmessage: null,\n\t// The icon selected by the user\n\ticon: null,\n\t// When to automatically clean the status\n\tclearAt: null,\n\t// Whether or not the message is predefined\n\t// (and can automatically be translated by Nextcloud)\n\tmessageIsPredefined: null,\n\t// The id of the message in case it's predefined\n\tmessageId: null,\n}\n\nconst mutations = {\n\n\t/**\n\t * Sets a new status\n\t *\n\t * @param {object} state The Vuex state\n\t * @param {object} data The destructuring object\n\t * @param {string} data.statusType The new status type\n\t */\n\tsetStatus(state, { statusType }) {\n\t\tstate.status = statusType\n\t\tstate.statusIsUserDefined = true\n\t},\n\n\t/**\n\t * Sets a message using a predefined message\n\t *\n\t * @param {object} state The Vuex state\n\t * @param {object} data The destructuring object\n\t * @param {string} data.messageId The messageId\n\t * @param {number | null} data.clearAt When to automatically clear the status\n\t * @param {string} data.message The message\n\t * @param {string} data.icon The icon\n\t */\n\tsetPredefinedMessage(state, { messageId, clearAt, message, icon }) {\n\t\tstate.messageId = messageId\n\t\tstate.messageIsPredefined = true\n\n\t\tstate.message = message\n\t\tstate.icon = icon\n\t\tstate.clearAt = clearAt\n\t},\n\n\t/**\n\t * Sets a custom message\n\t *\n\t * @param {object} state The Vuex state\n\t * @param {object} data The destructuring object\n\t * @param {string} data.message The message\n\t * @param {string} data.icon The icon\n\t * @param {number} data.clearAt When to automatically clear the status\n\t */\n\tsetCustomMessage(state, { message, icon, clearAt }) {\n\t\tstate.messageId = null\n\t\tstate.messageIsPredefined = false\n\n\t\tstate.message = message\n\t\tstate.icon = icon\n\t\tstate.clearAt = clearAt\n\t},\n\n\t/**\n\t * Clears the status\n\t *\n\t * @param {object} state The Vuex state\n\t */\n\tclearMessage(state) {\n\t\tstate.messageId = null\n\t\tstate.messageIsPredefined = false\n\n\t\tstate.message = null\n\t\tstate.icon = null\n\t\tstate.clearAt = null\n\t},\n\n\t/**\n\t * Loads the status from initial state\n\t *\n\t * @param {object} state The Vuex state\n\t * @param {object} data The destructuring object\n\t * @param {string} data.status The status type\n\t * @param {boolean} data.statusIsUserDefined Whether or not this status is user-defined\n\t * @param {string} data.message The message\n\t * @param {string} data.icon The icon\n\t * @param {number} data.clearAt When to automatically clear the status\n\t * @param {boolean} data.messageIsPredefined Whether or not the message is predefined\n\t * @param {string} data.messageId The id of the predefined message\n\t */\n\tloadStatusFromServer(state, { status, statusIsUserDefined, message, icon, clearAt, messageIsPredefined, messageId }) {\n\t\tstate.status = status\n\t\tstate.statusIsUserDefined = statusIsUserDefined\n\t\tstate.message = message\n\t\tstate.icon = icon\n\t\tstate.clearAt = clearAt\n\t\tstate.messageIsPredefined = messageIsPredefined\n\t\tstate.messageId = messageId\n\t},\n}\n\nconst getters = {}\n\nconst actions = {\n\n\t/**\n\t * Sets a new status\n\t *\n\t * @param {object} vuex The Vuex destructuring object\n\t * @param {Function} vuex.commit The Vuex commit function\n\t * @param {object} vuex.state The Vuex state object\n\t * @param {object} data The data destructuring object\n\t * @param {string} data.statusType The new status type\n\t * @return {Promise<void>}\n\t */\n\tasync setStatus({ commit, state }, { statusType }) {\n\t\tawait setStatus(statusType)\n\t\tcommit('setStatus', { statusType })\n\t\temit('user_status:status.updated', {\n\t\t\tstatus: state.status,\n\t\t\tmessage: state.message,\n\t\t\ticon: state.icon,\n\t\t\tclearAt: state.clearAt,\n\t\t\tuserId: getCurrentUser()?.uid,\n\t\t})\n\t},\n\n\t/**\n\t * Update status from 'user_status:status.updated' update.\n\t * This doesn't trigger another 'user_status:status.updated'\n\t * event.\n\t *\n\t * @param {object} vuex The Vuex destructuring object\n\t * @param {Function} vuex.commit The Vuex commit function\n\t * @param {object} vuex.state The Vuex state object\n\t * @param {string} status The new status\n\t * @return {Promise<void>}\n\t */\n\tasync setStatusFromObject({ commit, state }, status) {\n\t\tcommit('loadStatusFromServer', status)\n\t},\n\n\t/**\n\t * Sets a message using a predefined message\n\t *\n\t * @param {object} vuex The Vuex destructuring object\n\t * @param {Function} vuex.commit The Vuex commit function\n\t * @param {object} vuex.state The Vuex state object\n\t * @param {object} vuex.rootState The Vuex root state\n\t * @param {object} data The data destructuring object\n\t * @param {string} data.messageId The messageId\n\t * @param {object | null} data.clearAt When to automatically clear the status\n\t * @return {Promise<void>}\n\t */\n\tasync setPredefinedMessage({ commit, rootState, state }, { messageId, clearAt }) {\n\t\tconst resolvedClearAt = getTimestampForClearAt(clearAt)\n\n\t\tawait setPredefinedMessage(messageId, resolvedClearAt)\n\t\tconst status = rootState.predefinedStatuses.predefinedStatuses.find((status) => status.id === messageId)\n\t\tconst { message, icon } = status\n\n\t\tcommit('setPredefinedMessage', { messageId, clearAt: resolvedClearAt, message, icon })\n\t\temit('user_status:status.updated', {\n\t\t\tstatus: state.status,\n\t\t\tmessage: state.message,\n\t\t\ticon: state.icon,\n\t\t\tclearAt: state.clearAt,\n\t\t\tuserId: getCurrentUser()?.uid,\n\t\t})\n\t},\n\n\t/**\n\t * Sets a custom message\n\t *\n\t * @param {object} vuex The Vuex destructuring object\n\t * @param {Function} vuex.commit The Vuex commit function\n\t * @param {object} vuex.state The Vuex state object\n\t * @param {object} data The data destructuring object\n\t * @param {string} data.message The message\n\t * @param {string} data.icon The icon\n\t * @param {object | null} data.clearAt When to automatically clear the status\n\t * @return {Promise<void>}\n\t */\n\tasync setCustomMessage({ commit, state }, { message, icon, clearAt }) {\n\t\tconst resolvedClearAt = getTimestampForClearAt(clearAt)\n\n\t\tawait setCustomMessage(message, icon, resolvedClearAt)\n\t\tcommit('setCustomMessage', { message, icon, clearAt: resolvedClearAt })\n\t\temit('user_status:status.updated', {\n\t\t\tstatus: state.status,\n\t\t\tmessage: state.message,\n\t\t\ticon: state.icon,\n\t\t\tclearAt: state.clearAt,\n\t\t\tuserId: getCurrentUser()?.uid,\n\t\t})\n\t},\n\n\t/**\n\t * Clears the status\n\t *\n\t * @param {object} vuex The Vuex destructuring object\n\t * @param {Function} vuex.commit The Vuex commit function\n\t * @param {object} vuex.state The Vuex state object\n\t * @return {Promise<void>}\n\t */\n\tasync clearMessage({ commit, state }) {\n\t\tawait clearMessage()\n\t\tcommit('clearMessage')\n\t\temit('user_status:status.updated', {\n\t\t\tstatus: state.status,\n\t\t\tmessage: state.message,\n\t\t\ticon: state.icon,\n\t\t\tclearAt: state.clearAt,\n\t\t\tuserId: getCurrentUser()?.uid,\n\t\t})\n\t},\n\n\t/**\n\t * Re-fetches the status from the server\n\t *\n\t * @param {object} vuex The Vuex destructuring object\n\t * @param {Function} vuex.commit The Vuex commit function\n\t * @return {Promise<void>}\n\t */\n\tasync reFetchStatusFromServer({ commit }) {\n\t\tconst status = await fetchCurrentStatus()\n\t\tcommit('loadStatusFromServer', status)\n\t},\n\n\t/**\n\t * Stores the status we got in the reply of the heartbeat\n\t *\n\t * @param {object} vuex The Vuex destructuring object\n\t * @param {Function} vuex.commit The Vuex commit function\n\t * @param {object} status The data destructuring object\n\t * @param {string} status.status The status type\n\t * @param {boolean} status.statusIsUserDefined Whether or not this status is user-defined\n\t * @param {string} status.message The message\n\t * @param {string} status.icon The icon\n\t * @param {number} status.clearAt When to automatically clear the status\n\t * @param {boolean} status.messageIsPredefined Whether or not the message is predefined\n\t * @param {string} status.messageId The id of the predefined message\n\t * @return {Promise<void>}\n\t */\n\tasync setStatusFromHeartbeat({ commit }, status) {\n\t\tcommit('loadStatusFromServer', status)\n\t},\n\n\t/**\n\t * Loads the server from the initial state\n\t *\n\t * @param {object} vuex The Vuex destructuring object\n\t * @param {Function} vuex.commit The Vuex commit function\n\t */\n\tloadStatusFromInitialState({ commit }) {\n\t\tconst status = loadState('user_status', 'status')\n\t\tcommit('loadStatusFromServer', status)\n\t},\n}\n\nexport default { state, mutations, getters, actions }\n","/**\n * @copyright Copyright (c) 2020 Georg Ehrke\n *\n * @author Georg Ehrke <oc.list@georgehrke.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 Vue from 'vue'\nimport Vuex, { Store } from 'vuex'\nimport predefinedStatuses from './predefinedStatuses'\nimport userStatus from './userStatus'\n\nVue.use(Vuex)\n\nexport default new Store({\n\tmodules: {\n\t\tpredefinedStatuses,\n\t\tuserStatus,\n\t},\n\tstrict: true,\n})\n","/**\n * @copyright Copyright (c) 2020 Georg Ehrke\n *\n * @author Georg Ehrke <oc.list@georgehrke.com>\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 { getRequestToken } from '@nextcloud/auth'\nimport UserStatus from './UserStatus'\nimport store from './store'\nimport Avatar from '@nextcloud/vue/dist/Components/Avatar'\n\n// eslint-disable-next-line camelcase\n__webpack_nonce__ = btoa(getRequestToken())\n\nVue.prototype.t = t\nVue.prototype.$t = t\n\nconst avatarDiv = document.getElementById('avatardiv-menu')\nconst propsData = {\n\tpreloadedUserStatus: {\n\t\tmessage: avatarDiv.dataset.userstatus_message,\n\t\ticon: avatarDiv.dataset.userstatus_icon,\n\t\tstatus: avatarDiv.dataset.userstatus,\n\t},\n\tuser: avatarDiv.dataset.user,\n\tdisplayName: avatarDiv.dataset.displayname,\n\turl: avatarDiv.dataset.avatar,\n\tdisableMenu: true,\n\tdisableTooltip: true,\n}\n\nconst AvatarInMenu = Vue.extend(Avatar)\nnew AvatarInMenu({ propsData }).$mount('#avatardiv-menu')\n\n// Register settings menu entry\nexport default new Vue({\n\tel: 'li[data-id=\"user_status-menuitem\"]',\n\t// eslint-disable-next-line vue/match-component-file-name\n\tname: 'UserStatusRoot',\n\trender: h => h(UserStatus),\n\tstore,\n})\n\n// Register dashboard status\ndocument.addEventListener('DOMContentLoaded', function() {\n\tif (!OCA.Dashboard) {\n\t\treturn\n\t}\n\n\tOCA.Dashboard.registerStatus('status', (el) => {\n\t\tconst Dashboard = Vue.extend(UserStatus)\n\t\treturn new Dashboard({\n\t\t\tpropsData: {\n\t\t\t\tinline: true,\n\t\t\t},\n\t\t\tstore,\n\t\t}).$mount(el)\n\t})\n})\n","/**\n * @copyright Copyright (c) 2020 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\nimport { mapState } from 'vuex'\nimport { showError } from '@nextcloud/dialogs'\n\nexport default {\n\tcomputed: {\n\t\t...mapState({\n\t\t\tstatusType: state => state.userStatus.status,\n\t\t\tstatusIsUserDefined: state => state.userStatus.statusIsUserDefined,\n\t\t\tcustomIcon: state => state.userStatus.icon,\n\t\t\tcustomMessage: state => state.userStatus.message,\n\t\t}),\n\n\t\t/**\n\t\t * The message displayed in the top right corner\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tvisibleMessage() {\n\t\t\tif (this.customIcon && this.customMessage) {\n\t\t\t\treturn `${this.customIcon} ${this.customMessage}`\n\t\t\t}\n\n\t\t\tif (this.customMessage) {\n\t\t\t\treturn this.customMessage\n\t\t\t}\n\n\t\t\tif (this.statusIsUserDefined) {\n\t\t\t\tswitch (this.statusType) {\n\t\t\t\tcase 'online':\n\t\t\t\t\treturn this.$t('user_status', 'Online')\n\n\t\t\t\tcase 'away':\n\t\t\t\t\treturn this.$t('user_status', 'Away')\n\n\t\t\t\tcase 'dnd':\n\t\t\t\t\treturn this.$t('user_status', 'Do not disturb')\n\n\t\t\t\tcase 'invisible':\n\t\t\t\t\treturn this.$t('user_status', 'Invisible')\n\n\t\t\t\tcase 'offline':\n\t\t\t\t\treturn this.$t('user_status', 'Offline')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this.$t('user_status', 'Set status')\n\t\t},\n\n\t\t/**\n\t\t * The status indicator icon\n\t\t *\n\t\t * @return {string | null}\n\t\t */\n\t\tstatusIcon() {\n\t\t\tswitch (this.statusType) {\n\t\t\tcase 'online':\n\t\t\t\treturn 'icon-user-status-online'\n\n\t\t\tcase 'away':\n\t\t\t\treturn 'icon-user-status-away'\n\n\t\t\tcase 'dnd':\n\t\t\t\treturn 'icon-user-status-dnd'\n\n\t\t\tcase 'invisible':\n\t\t\tcase 'offline':\n\t\t\t\treturn 'icon-user-status-invisible'\n\t\t\t}\n\n\t\t\treturn ''\n\t\t},\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Changes the user-status\n\t\t *\n\t\t * @param {string} statusType (online / away / dnd / invisible)\n\t\t */\n\t\tasync changeStatus(statusType) {\n\t\t\ttry {\n\t\t\t\tawait this.$store.dispatch('setStatus', { statusType })\n\t\t\t} catch (err) {\n\t\t\t\tshowError(this.$t('user_status', 'There was an error saving the new status'))\n\t\t\t\tconsole.debug(err)\n\t\t\t}\n\t\t},\n\t},\n}\n","/**\n * @copyright Copyright (c) 2020 Georg Ehrke\n *\n * @author Georg Ehrke <oc.list@georgehrke.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 dateFactory = () => {\n\treturn new Date()\n}\n\nexport {\n\tdateFactory,\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, \".user-status-menu-item__header[data-v-5879d4bb]{display:flex !important;flex-direction:column !important;width:auto !important;height:66px !important;padding:10px 12px 5px 12px !important;align-items:flex-start !important;color:var(--color-main-text) !important}.user-status-menu-item__header[data-v-5879d4bb]:not([href]){height:var(--header-menu-item-height) !important;color:var(--color-text-maxcontrast) !important;cursor:default !important}.user-status-menu-item__header:not([href]) *[data-v-5879d4bb]{cursor:default !important}.user-status-menu-item__header[data-v-5879d4bb]:not([href]):hover{background-color:transparent !important}.user-status-menu-item__header-content[data-v-5879d4bb]{display:inline-flex !important;font-weight:bold !important;gap:0 10px !important;width:auto}.user-status-menu-item__header-content-displayname[data-v-5879d4bb]{width:auto}.user-status-menu-item__header-content-placeholder[data-v-5879d4bb]{width:16px !important;height:24px !important;margin-right:10px !important;visibility:hidden !important}.user-status-menu-item__header span[data-v-5879d4bb]{color:var(--color-text-maxcontrast) !important}.user-status-menu-item__toggle-icon[data-v-5879d4bb]{width:16px;height:16px;margin-right:10px;opacity:1 !important;background-size:16px}.user-status-menu-item__toggle--inline[data-v-5879d4bb]{width:auto;min-width:44px;height:44px;margin:0;border:0;border-radius:var(--border-radius-pill);background-color:var(--color-background-translucent);font-size:inherit;font-weight:normal;-webkit-backdrop-filter:var(--background-blur);backdrop-filter:var(--background-blur)}.user-status-menu-item__toggle--inline[data-v-5879d4bb]:active,.user-status-menu-item__toggle--inline[data-v-5879d4bb]:hover,.user-status-menu-item__toggle--inline[data-v-5879d4bb]:focus{background-color:var(--color-background-hover)}.user-status-menu-item__toggle--inline[data-v-5879d4bb]:focus{border:2px solid var(--color-main-text) !important}li[data-v-5879d4bb]{list-style-type:none}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/user_status/src/UserStatus.vue\"],\"names\":[],\"mappings\":\"AAgOC,gDACC,uBAAA,CACA,gCAAA,CACA,qBAAA,CACA,sBAAA,CACA,qCAAA,CACA,iCAAA,CACA,uCAAA,CAEA,4DACC,gDAAA,CACA,8CAAA,CACA,yBAAA,CAEA,8DACC,yBAAA,CAGD,kEACC,uCAAA,CAIF,wDACC,8BAAA,CACA,2BAAA,CACA,qBAAA,CACA,UAAA,CAEA,oEACC,UAAA,CAGD,oEACC,qBAAA,CACA,sBAAA,CACA,4BAAA,CACA,4BAAA,CAIF,qDACC,8CAAA,CAKD,qDACC,UAAA,CACA,WAAA,CACA,iBAAA,CACA,oBAAA,CACA,oBAAA,CAID,wDACC,UAAA,CACA,cAAA,CACA,WAAA,CACA,QAAA,CACA,QAAA,CACA,uCAAA,CACA,oDAAA,CACA,iBAAA,CACA,kBAAA,CAEA,8CAAA,CACA,sCAAA,CAEA,2LAGC,8CAAA,CAED,8DACC,kDAAA,CAMJ,oBACC,oBAAA\",\"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.user-status-menu-item {\\n\\t&__header {\\n\\t\\tdisplay: flex !important;\\n\\t\\tflex-direction: column !important;\\n\\t\\twidth: auto !important;\\n\\t\\theight: 44px * 1.5 !important;\\n\\t\\tpadding: 10px 12px 5px 12px !important;\\n\\t\\talign-items: flex-start !important;\\n\\t\\tcolor: var(--color-main-text) !important;\\n\\n\\t\\t&:not([href]) {\\n\\t\\t\\theight: var(--header-menu-item-height) !important;\\n\\t\\t\\tcolor: var(--color-text-maxcontrast) !important;\\n\\t\\t\\tcursor: default !important;\\n\\n\\t\\t\\t& * {\\n\\t\\t\\t\\tcursor: default !important;\\n\\t\\t\\t}\\n\\n\\t\\t\\t&:hover {\\n\\t\\t\\t\\tbackground-color: transparent !important;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t&-content {\\n\\t\\t\\tdisplay: inline-flex !important;\\n\\t\\t\\tfont-weight: bold !important;\\n\\t\\t\\tgap: 0 10px !important;\\n\\t\\t\\twidth: auto;\\n\\n\\t\\t\\t&-displayname {\\n\\t\\t\\t\\twidth: auto;\\n\\t\\t\\t}\\n\\n\\t\\t\\t&-placeholder {\\n\\t\\t\\t\\twidth: 16px !important;\\n\\t\\t\\t\\theight: 24px !important;\\n\\t\\t\\t\\tmargin-right: 10px !important;\\n\\t\\t\\t\\tvisibility: hidden !important;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tspan {\\n\\t\\t\\tcolor: var(--color-text-maxcontrast) !important;\\n\\t\\t}\\n\\t}\\n\\n\\t&__toggle {\\n\\t\\t&-icon {\\n\\t\\t\\twidth: 16px;\\n\\t\\t\\theight: 16px;\\n\\t\\t\\tmargin-right: 10px;\\n\\t\\t\\topacity: 1 !important;\\n\\t\\t\\tbackground-size: 16px;\\n\\t\\t}\\n\\n\\t\\t// In dashboard\\n\\t\\t&--inline {\\n\\t\\t\\twidth: auto;\\n\\t\\t\\tmin-width: 44px;\\n\\t\\t\\theight: 44px;\\n\\t\\t\\tmargin: 0;\\n\\t\\t\\tborder: 0;\\n\\t\\t\\tborder-radius: var(--border-radius-pill);\\n\\t\\t\\tbackground-color: var(--color-background-translucent);\\n\\t\\t\\tfont-size: inherit;\\n\\t\\t\\tfont-weight: normal;\\n\\n\\t\\t\\t-webkit-backdrop-filter: var(--background-blur);\\n\\t\\t\\tbackdrop-filter: var(--background-blur);\\n\\n\\t\\t\\t&:active,\\n\\t\\t\\t&:hover,\\n\\t\\t\\t&:focus {\\n\\t\\t\\t\\tbackground-color: var(--color-background-hover);\\n\\t\\t\\t}\\n\\t\\t\\t&:focus {\\n\\t\\t\\t\\tborder: 2px solid var(--color-main-text)!important;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\\nli {\\n\\tlist-style-type: none;\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","var map = {\n\t\"./af\": 42786,\n\t\"./af.js\": 42786,\n\t\"./ar\": 30867,\n\t\"./ar-dz\": 14130,\n\t\"./ar-dz.js\": 14130,\n\t\"./ar-kw\": 96135,\n\t\"./ar-kw.js\": 96135,\n\t\"./ar-ly\": 56440,\n\t\"./ar-ly.js\": 56440,\n\t\"./ar-ma\": 47702,\n\t\"./ar-ma.js\": 47702,\n\t\"./ar-sa\": 16040,\n\t\"./ar-sa.js\": 16040,\n\t\"./ar-tn\": 37100,\n\t\"./ar-tn.js\": 37100,\n\t\"./ar.js\": 30867,\n\t\"./az\": 31083,\n\t\"./az.js\": 31083,\n\t\"./be\": 9808,\n\t\"./be.js\": 9808,\n\t\"./bg\": 68338,\n\t\"./bg.js\": 68338,\n\t\"./bm\": 67438,\n\t\"./bm.js\": 67438,\n\t\"./bn\": 8905,\n\t\"./bn-bd\": 76225,\n\t\"./bn-bd.js\": 76225,\n\t\"./bn.js\": 8905,\n\t\"./bo\": 11560,\n\t\"./bo.js\": 11560,\n\t\"./br\": 1278,\n\t\"./br.js\": 1278,\n\t\"./bs\": 80622,\n\t\"./bs.js\": 80622,\n\t\"./ca\": 2468,\n\t\"./ca.js\": 2468,\n\t\"./cs\": 5822,\n\t\"./cs.js\": 5822,\n\t\"./cv\": 50877,\n\t\"./cv.js\": 50877,\n\t\"./cy\": 47373,\n\t\"./cy.js\": 47373,\n\t\"./da\": 24780,\n\t\"./da.js\": 24780,\n\t\"./de\": 59740,\n\t\"./de-at\": 60217,\n\t\"./de-at.js\": 60217,\n\t\"./de-ch\": 60894,\n\t\"./de-ch.js\": 60894,\n\t\"./de.js\": 59740,\n\t\"./dv\": 5300,\n\t\"./dv.js\": 5300,\n\t\"./el\": 50837,\n\t\"./el.js\": 50837,\n\t\"./en-au\": 78348,\n\t\"./en-au.js\": 78348,\n\t\"./en-ca\": 77925,\n\t\"./en-ca.js\": 77925,\n\t\"./en-gb\": 22243,\n\t\"./en-gb.js\": 22243,\n\t\"./en-ie\": 46436,\n\t\"./en-ie.js\": 46436,\n\t\"./en-il\": 47207,\n\t\"./en-il.js\": 47207,\n\t\"./en-in\": 44175,\n\t\"./en-in.js\": 44175,\n\t\"./en-nz\": 76319,\n\t\"./en-nz.js\": 76319,\n\t\"./en-sg\": 31662,\n\t\"./en-sg.js\": 31662,\n\t\"./eo\": 92915,\n\t\"./eo.js\": 92915,\n\t\"./es\": 55655,\n\t\"./es-do\": 55251,\n\t\"./es-do.js\": 55251,\n\t\"./es-mx\": 96112,\n\t\"./es-mx.js\": 96112,\n\t\"./es-us\": 71146,\n\t\"./es-us.js\": 71146,\n\t\"./es.js\": 55655,\n\t\"./et\": 5603,\n\t\"./et.js\": 5603,\n\t\"./eu\": 77763,\n\t\"./eu.js\": 77763,\n\t\"./fa\": 76959,\n\t\"./fa.js\": 76959,\n\t\"./fi\": 11897,\n\t\"./fi.js\": 11897,\n\t\"./fil\": 42549,\n\t\"./fil.js\": 42549,\n\t\"./fo\": 94694,\n\t\"./fo.js\": 94694,\n\t\"./fr\": 94470,\n\t\"./fr-ca\": 63049,\n\t\"./fr-ca.js\": 63049,\n\t\"./fr-ch\": 52330,\n\t\"./fr-ch.js\": 52330,\n\t\"./fr.js\": 94470,\n\t\"./fy\": 5044,\n\t\"./fy.js\": 5044,\n\t\"./ga\": 29295,\n\t\"./ga.js\": 29295,\n\t\"./gd\": 2101,\n\t\"./gd.js\": 2101,\n\t\"./gl\": 38794,\n\t\"./gl.js\": 38794,\n\t\"./gom-deva\": 27884,\n\t\"./gom-deva.js\": 27884,\n\t\"./gom-latn\": 23168,\n\t\"./gom-latn.js\": 23168,\n\t\"./gu\": 95349,\n\t\"./gu.js\": 95349,\n\t\"./he\": 24206,\n\t\"./he.js\": 24206,\n\t\"./hi\": 30094,\n\t\"./hi.js\": 30094,\n\t\"./hr\": 30316,\n\t\"./hr.js\": 30316,\n\t\"./hu\": 22138,\n\t\"./hu.js\": 22138,\n\t\"./hy-am\": 11423,\n\t\"./hy-am.js\": 11423,\n\t\"./id\": 29218,\n\t\"./id.js\": 29218,\n\t\"./is\": 90135,\n\t\"./is.js\": 90135,\n\t\"./it\": 90626,\n\t\"./it-ch\": 10150,\n\t\"./it-ch.js\": 10150,\n\t\"./it.js\": 90626,\n\t\"./ja\": 39183,\n\t\"./ja.js\": 39183,\n\t\"./jv\": 24286,\n\t\"./jv.js\": 24286,\n\t\"./ka\": 12105,\n\t\"./ka.js\": 12105,\n\t\"./kk\": 47772,\n\t\"./kk.js\": 47772,\n\t\"./km\": 18758,\n\t\"./km.js\": 18758,\n\t\"./kn\": 79282,\n\t\"./kn.js\": 79282,\n\t\"./ko\": 33730,\n\t\"./ko.js\": 33730,\n\t\"./ku\": 1408,\n\t\"./ku.js\": 1408,\n\t\"./ky\": 33291,\n\t\"./ky.js\": 33291,\n\t\"./lb\": 36841,\n\t\"./lb.js\": 36841,\n\t\"./lo\": 55466,\n\t\"./lo.js\": 55466,\n\t\"./lt\": 57010,\n\t\"./lt.js\": 57010,\n\t\"./lv\": 37595,\n\t\"./lv.js\": 37595,\n\t\"./me\": 39861,\n\t\"./me.js\": 39861,\n\t\"./mi\": 35493,\n\t\"./mi.js\": 35493,\n\t\"./mk\": 95966,\n\t\"./mk.js\": 95966,\n\t\"./ml\": 87341,\n\t\"./ml.js\": 87341,\n\t\"./mn\": 5115,\n\t\"./mn.js\": 5115,\n\t\"./mr\": 10370,\n\t\"./mr.js\": 10370,\n\t\"./ms\": 9847,\n\t\"./ms-my\": 41237,\n\t\"./ms-my.js\": 41237,\n\t\"./ms.js\": 9847,\n\t\"./mt\": 72126,\n\t\"./mt.js\": 72126,\n\t\"./my\": 56165,\n\t\"./my.js\": 56165,\n\t\"./nb\": 64924,\n\t\"./nb.js\": 64924,\n\t\"./ne\": 16744,\n\t\"./ne.js\": 16744,\n\t\"./nl\": 93901,\n\t\"./nl-be\": 59814,\n\t\"./nl-be.js\": 59814,\n\t\"./nl.js\": 93901,\n\t\"./nn\": 83877,\n\t\"./nn.js\": 83877,\n\t\"./oc-lnc\": 92135,\n\t\"./oc-lnc.js\": 92135,\n\t\"./pa-in\": 15858,\n\t\"./pa-in.js\": 15858,\n\t\"./pl\": 64495,\n\t\"./pl.js\": 64495,\n\t\"./pt\": 89520,\n\t\"./pt-br\": 57971,\n\t\"./pt-br.js\": 57971,\n\t\"./pt.js\": 89520,\n\t\"./ro\": 96459,\n\t\"./ro.js\": 96459,\n\t\"./ru\": 21793,\n\t\"./ru.js\": 21793,\n\t\"./sd\": 40950,\n\t\"./sd.js\": 40950,\n\t\"./se\": 10490,\n\t\"./se.js\": 10490,\n\t\"./si\": 90124,\n\t\"./si.js\": 90124,\n\t\"./sk\": 64249,\n\t\"./sk.js\": 64249,\n\t\"./sl\": 14985,\n\t\"./sl.js\": 14985,\n\t\"./sq\": 51104,\n\t\"./sq.js\": 51104,\n\t\"./sr\": 49131,\n\t\"./sr-cyrl\": 79915,\n\t\"./sr-cyrl.js\": 79915,\n\t\"./sr.js\": 49131,\n\t\"./ss\": 85893,\n\t\"./ss.js\": 85893,\n\t\"./sv\": 98760,\n\t\"./sv.js\": 98760,\n\t\"./sw\": 91172,\n\t\"./sw.js\": 91172,\n\t\"./ta\": 27333,\n\t\"./ta.js\": 27333,\n\t\"./te\": 23110,\n\t\"./te.js\": 23110,\n\t\"./tet\": 52095,\n\t\"./tet.js\": 52095,\n\t\"./tg\": 27321,\n\t\"./tg.js\": 27321,\n\t\"./th\": 9041,\n\t\"./th.js\": 9041,\n\t\"./tk\": 19005,\n\t\"./tk.js\": 19005,\n\t\"./tl-ph\": 75768,\n\t\"./tl-ph.js\": 75768,\n\t\"./tlh\": 89444,\n\t\"./tlh.js\": 89444,\n\t\"./tr\": 72397,\n\t\"./tr.js\": 72397,\n\t\"./tzl\": 28254,\n\t\"./tzl.js\": 28254,\n\t\"./tzm\": 51106,\n\t\"./tzm-latn\": 30699,\n\t\"./tzm-latn.js\": 30699,\n\t\"./tzm.js\": 51106,\n\t\"./ug-cn\": 9288,\n\t\"./ug-cn.js\": 9288,\n\t\"./uk\": 67691,\n\t\"./uk.js\": 67691,\n\t\"./ur\": 13795,\n\t\"./ur.js\": 13795,\n\t\"./uz\": 6791,\n\t\"./uz-latn\": 60588,\n\t\"./uz-latn.js\": 60588,\n\t\"./uz.js\": 6791,\n\t\"./vi\": 65666,\n\t\"./vi.js\": 65666,\n\t\"./x-pseudo\": 14378,\n\t\"./x-pseudo.js\": 14378,\n\t\"./yo\": 75805,\n\t\"./yo.js\": 75805,\n\t\"./zh-cn\": 83839,\n\t\"./zh-cn.js\": 83839,\n\t\"./zh-hk\": 55726,\n\t\"./zh-hk.js\": 55726,\n\t\"./zh-mo\": 99807,\n\t\"./zh-mo.js\": 99807,\n\t\"./zh-tw\": 74152,\n\t\"./zh-tw.js\": 74152\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 46700;","// 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 \"\" + \"user-status-modal\" + \"-\" + chunkId + \".js?v=\" + \"3f331fd4343acdf15116\" + \"\";\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 = 2613;","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\t2613: 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));","// 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__(40814); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","inProgress","dataWebpackPrefix","sendHeartbeat","isAway","url","generateUrl","HttpClient","status","response","data","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","component","_vm","this","_h","$createElement","_c","_self","staticClass","inline","_e","attrs","profilePageLink","on","loadProfilePage","_v","_s","displayName","loadingProfilePage","t","tag","class","$event","preventDefault","stopPropagation","openModal","apply","arguments","statusIcon","visibleMessage","closeModal","fetchAllPredefinedStatuses","generateOcsUrl","ocs","actions","loadAllPredefinedStatuses","state","commit","predefinedStatuses","length","statuses","mutations","addPredefinedStatus","push","getters","fetchCurrentStatus","setStatus","statusType","setPredefinedMessage","messageId","clearAt","setCustomMessage","message","clearMessage","getTimestampForClearAt","date","dateFactory","type","setSeconds","getSeconds","time","Math","floor","getTime","Number","moment","endOf","format","statusIsUserDefined","icon","messageIsPredefined","loadStatusFromServer","emit","userId","getCurrentUser","uid","setStatusFromObject","rootState","resolvedClearAt","find","id","reFetchStatusFromServer","setStatusFromHeartbeat","loadStatusFromInitialState","loadState","Vue","Vuex","Store","modules","userStatus","strict","__webpack_nonce__","btoa","getRequestToken","avatarDiv","document","getElementById","propsData","preloadedUserStatus","dataset","userstatus_message","userstatus_icon","userstatus","user","displayname","avatar","disableMenu","disableTooltip","Avatar","$mount","el","name","render","h","UserStatus","store","addEventListener","OCA","Dashboard","registerStatus","computed","mapState","customIcon","customMessage","$t","methods","changeStatus","$store","dispatch","showError","console","debug","Date","___CSS_LOADER_EXPORT___","module","map","webpackContext","req","webpackContextResolve","__webpack_require__","o","e","Error","code","keys","Object","resolve","exports","__webpack_module_cache__","moduleId","cachedModule","undefined","loaded","__webpack_modules__","call","m","amdD","amdO","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","fulfilled","j","every","key","splice","r","n","getter","__esModule","d","a","definition","defineProperty","enumerable","get","f","chunkId","Promise","all","reduce","promises","u","g","globalThis","Function","window","obj","prop","prototype","hasOwnProperty","l","done","script","needAttach","scripts","getElementsByTagName","s","getAttribute","createElement","charset","timeout","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","forEach","setTimeout","bind","target","head","appendChild","Symbol","toStringTag","value","nmd","paths","children","scriptUrl","importScripts","location","currentScript","replace","p","b","baseURI","self","href","installedChunks","installedChunkData","promise","reject","error","errorType","realSrc","request","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index 51257da5497..69cd3b1116e 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -260,6 +260,7 @@ return array( 'OCP\\Files\\Events\\FileCacheUpdated' => $baseDir . '/lib/public/Files/Events/FileCacheUpdated.php', 'OCP\\Files\\Events\\FileScannedEvent' => $baseDir . '/lib/public/Files/Events/FileScannedEvent.php', 'OCP\\Files\\Events\\FolderScannedEvent' => $baseDir . '/lib/public/Files/Events/FolderScannedEvent.php', + 'OCP\\Files\\Events\\InvalidateMountCacheEvent' => $baseDir . '/lib/public/Files/Events/InvalidateMountCacheEvent.php', 'OCP\\Files\\Events\\NodeAddedToCache' => $baseDir . '/lib/public/Files/Events/NodeAddedToCache.php', 'OCP\\Files\\Events\\NodeRemovedFromCache' => $baseDir . '/lib/public/Files/Events/NodeRemovedFromCache.php', 'OCP\\Files\\Events\\Node\\AbstractNodeEvent' => $baseDir . '/lib/public/Files/Events/Node/AbstractNodeEvent.php', @@ -808,6 +809,7 @@ return array( 'OC\\Command\\FileAccess' => $baseDir . '/lib/private/Command/FileAccess.php', 'OC\\Command\\QueueBus' => $baseDir . '/lib/private/Command/QueueBus.php', 'OC\\Comments\\Comment' => $baseDir . '/lib/private/Comments/Comment.php', + 'OC\\Comments\\EmojiHelper' => $baseDir . '/lib/private/Comments/EmojiHelper.php', 'OC\\Comments\\Manager' => $baseDir . '/lib/private/Comments/Manager.php', 'OC\\Comments\\ManagerFactory' => $baseDir . '/lib/private/Comments/ManagerFactory.php', 'OC\\Config' => $baseDir . '/lib/private/Config.php', @@ -1140,6 +1142,7 @@ return array( 'OC\\Files\\Node\\HookConnector' => $baseDir . '/lib/private/Files/Node/HookConnector.php', 'OC\\Files\\Node\\LazyFolder' => $baseDir . '/lib/private/Files/Node/LazyFolder.php', 'OC\\Files\\Node\\LazyRoot' => $baseDir . '/lib/private/Files/Node/LazyRoot.php', + 'OC\\Files\\Node\\LazyUserFolder' => $baseDir . '/lib/private/Files/Node/LazyUserFolder.php', 'OC\\Files\\Node\\Node' => $baseDir . '/lib/private/Files/Node/Node.php', 'OC\\Files\\Node\\NonExistingFile' => $baseDir . '/lib/private/Files/Node/NonExistingFile.php', 'OC\\Files\\Node\\NonExistingFolder' => $baseDir . '/lib/private/Files/Node/NonExistingFolder.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index dafddd063c2..fbf1281cdf8 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -289,6 +289,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OCP\\Files\\Events\\FileCacheUpdated' => __DIR__ . '/../../..' . '/lib/public/Files/Events/FileCacheUpdated.php', 'OCP\\Files\\Events\\FileScannedEvent' => __DIR__ . '/../../..' . '/lib/public/Files/Events/FileScannedEvent.php', 'OCP\\Files\\Events\\FolderScannedEvent' => __DIR__ . '/../../..' . '/lib/public/Files/Events/FolderScannedEvent.php', + 'OCP\\Files\\Events\\InvalidateMountCacheEvent' => __DIR__ . '/../../..' . '/lib/public/Files/Events/InvalidateMountCacheEvent.php', 'OCP\\Files\\Events\\NodeAddedToCache' => __DIR__ . '/../../..' . '/lib/public/Files/Events/NodeAddedToCache.php', 'OCP\\Files\\Events\\NodeRemovedFromCache' => __DIR__ . '/../../..' . '/lib/public/Files/Events/NodeRemovedFromCache.php', 'OCP\\Files\\Events\\Node\\AbstractNodeEvent' => __DIR__ . '/../../..' . '/lib/public/Files/Events/Node/AbstractNodeEvent.php', @@ -837,6 +838,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OC\\Command\\FileAccess' => __DIR__ . '/../../..' . '/lib/private/Command/FileAccess.php', 'OC\\Command\\QueueBus' => __DIR__ . '/../../..' . '/lib/private/Command/QueueBus.php', 'OC\\Comments\\Comment' => __DIR__ . '/../../..' . '/lib/private/Comments/Comment.php', + 'OC\\Comments\\EmojiHelper' => __DIR__ . '/../../..' . '/lib/private/Comments/EmojiHelper.php', 'OC\\Comments\\Manager' => __DIR__ . '/../../..' . '/lib/private/Comments/Manager.php', 'OC\\Comments\\ManagerFactory' => __DIR__ . '/../../..' . '/lib/private/Comments/ManagerFactory.php', 'OC\\Config' => __DIR__ . '/../../..' . '/lib/private/Config.php', @@ -1169,6 +1171,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OC\\Files\\Node\\HookConnector' => __DIR__ . '/../../..' . '/lib/private/Files/Node/HookConnector.php', 'OC\\Files\\Node\\LazyFolder' => __DIR__ . '/../../..' . '/lib/private/Files/Node/LazyFolder.php', 'OC\\Files\\Node\\LazyRoot' => __DIR__ . '/../../..' . '/lib/private/Files/Node/LazyRoot.php', + 'OC\\Files\\Node\\LazyUserFolder' => __DIR__ . '/../../..' . '/lib/private/Files/Node/LazyUserFolder.php', 'OC\\Files\\Node\\Node' => __DIR__ . '/../../..' . '/lib/private/Files/Node/Node.php', 'OC\\Files\\Node\\NonExistingFile' => __DIR__ . '/../../..' . '/lib/private/Files/Node/NonExistingFile.php', 'OC\\Files\\Node\\NonExistingFolder' => __DIR__ . '/../../..' . '/lib/private/Files/Node/NonExistingFolder.php', diff --git a/lib/private/Comments/EmojiHelper.php b/lib/private/Comments/EmojiHelper.php new file mode 100644 index 00000000000..a75919edbc9 --- /dev/null +++ b/lib/private/Comments/EmojiHelper.php @@ -0,0 +1,101 @@ +<?php + +declare(strict_types=1); + +/** + * @copyright Copyright (c) 2020, Georg Ehrke + * + * @author Georg Ehrke <oc.list@georgehrke.com> + * @author Joas Schilling <coding@schilljs.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ +namespace OC\Comments; + +use OCP\IDBConnection; + +/** + * Copied OCA\UserStatus\Service\EmojiService + * Needs to be unified later + */ +class EmojiHelper { + + /** @var IDBConnection */ + private $db; + + /** + * EmojiService constructor. + * + * @param IDBConnection $db + */ + public function __construct(IDBConnection $db) { + $this->db = $db; + } + + /** + * @return bool + */ + public function doesPlatformSupportEmoji(): bool { + return $this->db->supports4ByteText() && + \class_exists(\IntlBreakIterator::class); + } + + /** + * @param string $emoji + * @return bool + */ + public function isValidEmoji(string $emoji): bool { + $intlBreakIterator = \IntlBreakIterator::createCharacterInstance(); + $intlBreakIterator->setText($emoji); + + $characterCount = 0; + while ($intlBreakIterator->next() !== \IntlBreakIterator::DONE) { + $characterCount++; + } + + if ($characterCount !== 1) { + return false; + } + + $codePointIterator = \IntlBreakIterator::createCodePointInstance(); + $codePointIterator->setText($emoji); + + foreach ($codePointIterator->getPartsIterator() as $codePoint) { + $codePointType = \IntlChar::charType($codePoint); + + // If the current code-point is an emoji or a modifier (like a skin-tone) + // just continue and check the next character + if ($codePointType === \IntlChar::CHAR_CATEGORY_MODIFIER_SYMBOL || + $codePointType === \IntlChar::CHAR_CATEGORY_MODIFIER_LETTER || + $codePointType === \IntlChar::CHAR_CATEGORY_OTHER_SYMBOL || + $codePointType === \IntlChar::CHAR_CATEGORY_GENERAL_OTHER_TYPES) { + continue; + } + + // If it's neither a modifier nor an emoji, we only allow + // a zero-width-joiner or a variation selector 16 + $codePointValue = \IntlChar::ord($codePoint); + if ($codePointValue === 8205 || $codePointValue === 65039) { + continue; + } + + return false; + } + + return true; + } +} diff --git a/lib/private/Comments/Manager.php b/lib/private/Comments/Manager.php index 384187accf3..123e4f6988d 100644 --- a/lib/private/Comments/Manager.php +++ b/lib/private/Comments/Manager.php @@ -59,6 +59,9 @@ class Manager implements ICommentsManager { /** @var ITimeFactory */ protected $timeFactory; + /** @var EmojiHelper */ + protected $emojiHelper; + /** @var IInitialStateService */ protected $initialStateService; @@ -78,11 +81,13 @@ class Manager implements ICommentsManager { LoggerInterface $logger, IConfig $config, ITimeFactory $timeFactory, + EmojiHelper $emojiHelper, IInitialStateService $initialStateService) { $this->dbConn = $dbConn; $this->logger = $logger; $this->config = $config; $this->timeFactory = $timeFactory; + $this->emojiHelper = $emojiHelper; $this->initialStateService = $initialStateService; } @@ -148,8 +153,9 @@ class Manager implements ICommentsManager { throw new \UnexpectedValueException('Actor, Object and Verb information must be provided for saving'); } - if ($comment->getVerb() === 'reaction' && mb_strlen($comment->getMessage()) > 2) { - throw new \UnexpectedValueException('Reactions cannot be longer than 2 chars (emoji with skin tone have two chars)'); + if ($comment->getVerb() === 'reaction' && !$this->emojiHelper->isValidEmoji($comment->getMessage())) { + // 4 characters: laptop + person + gender + skin color => "🧑🏽💻" is a single emoji from the picker + throw new \UnexpectedValueException('Reactions can only be a single emoji'); } if ($comment->getId() === '') { diff --git a/lib/private/Contacts/ContactsMenu/ContactsStore.php b/lib/private/Contacts/ContactsMenu/ContactsStore.php index 5b7a942a244..0ac388ce00a 100644 --- a/lib/private/Contacts/ContactsMenu/ContactsStore.php +++ b/lib/private/Contacts/ContactsMenu/ContactsStore.php @@ -107,7 +107,7 @@ class ContactsStore implements IContactsStore { } $allContacts = $this->contactsManager->search( - $filter ?: '', + $filter ?? '', [ 'FN', 'EMAIL' @@ -146,7 +146,7 @@ class ContactsStore implements IContactsStore { * * @param IUser $self * @param Entry[] $entries - * @param string $filter + * @param string|null $filter * @return Entry[] the filtered contacts */ private function filterContacts( diff --git a/lib/private/Contacts/ContactsMenu/Manager.php b/lib/private/Contacts/ContactsMenu/Manager.php index cea67735da5..73a5a475d85 100644 --- a/lib/private/Contacts/ContactsMenu/Manager.php +++ b/lib/private/Contacts/ContactsMenu/Manager.php @@ -59,14 +59,14 @@ class Manager { /** * @param IUser $user - * @param string $filter + * @param string|null $filter * @return array */ public function getEntries(IUser $user, $filter) { $maxAutocompleteResults = max(0, $this->config->getSystemValueInt('sharing.maxAutocompleteResults', Constants::SHARING_MAX_AUTOCOMPLETE_RESULTS_DEFAULT)); $minSearchStringLength = $this->config->getSystemValueInt('sharing.minSearchStringLength', 0); $topEntries = []; - if (strlen($filter) >= $minSearchStringLength) { + if (strlen($filter ?? '') >= $minSearchStringLength) { $entries = $this->store->getContacts($user, $filter, $maxAutocompleteResults); $sortedEntries = $this->sortEntries($entries); diff --git a/lib/private/Files/Config/MountProviderCollection.php b/lib/private/Files/Config/MountProviderCollection.php index cd8a2a2e29f..2b0acf7d69d 100644 --- a/lib/private/Files/Config/MountProviderCollection.php +++ b/lib/private/Files/Config/MountProviderCollection.php @@ -75,16 +75,15 @@ class MountProviderCollection implements IMountProviderCollection, Emitter { } /** - * Get all configured mount points for the user - * - * @param \OCP\IUser $user - * @return \OCP\Files\Mount\IMountPoint[] + * @param IUser $user + * @param IMountProvider[] $providers + * @return IMountPoint[] */ - public function getMountsForUser(IUser $user) { + private function getUserMountsForProviders(IUser $user, array $providers): array { $loader = $this->loader; $mounts = array_map(function (IMountProvider $provider) use ($user, $loader) { return $provider->getMountsForUser($user, $loader); - }, $this->providers); + }, $providers); $mounts = array_filter($mounts, function ($result) { return is_array($result); }); @@ -94,14 +93,31 @@ class MountProviderCollection implements IMountProviderCollection, Emitter { return $this->filterMounts($user, $mounts); } - public function addMountForUser(IUser $user, IMountManager $mountManager) { + public function getMountsForUser(IUser $user): array { + return $this->getUserMountsForProviders($user, $this->providers); + } + + public function getUserMountsForProviderClass(IUser $user, string $mountProviderClass): array { + $providers = array_filter( + $this->providers, + fn (IMountProvider $mountProvider) => (get_class($mountProvider) === $mountProviderClass) + ); + return $this->getUserMountsForProviders($user, $providers); + } + + public function addMountForUser(IUser $user, IMountManager $mountManager, callable $providerFilter = null) { // shared mount provider gets to go last since it needs to know existing files // to check for name collisions $firstMounts = []; - $firstProviders = array_filter($this->providers, function (IMountProvider $provider) { + if ($providerFilter) { + $providers = array_filter($this->providers, $providerFilter); + } else { + $providers = $this->providers; + } + $firstProviders = array_filter($providers, function (IMountProvider $provider) { return (get_class($provider) !== 'OCA\Files_Sharing\MountProvider'); }); - $lastProviders = array_filter($this->providers, function (IMountProvider $provider) { + $lastProviders = array_filter($providers, function (IMountProvider $provider) { return (get_class($provider) === 'OCA\Files_Sharing\MountProvider'); }); foreach ($firstProviders as $provider) { diff --git a/lib/private/Files/Config/UserMountCache.php b/lib/private/Files/Config/UserMountCache.php index dc2640361e7..9a5eddc4878 100644 --- a/lib/private/Files/Config/UserMountCache.php +++ b/lib/private/Files/Config/UserMountCache.php @@ -89,7 +89,7 @@ class UserMountCache implements IUserMountCache { $this->mountsForUsers = new CappedMemoryCache(); } - public function registerMounts(IUser $user, array $mounts) { + public function registerMounts(IUser $user, array $mounts, array $mountProviderClasses = null) { // filter out non-proper storages coming from unit tests $mounts = array_filter($mounts, function (IMountPoint $mount) { return $mount instanceof SharedMount || $mount->getStorage() && $mount->getStorage()->getCache(); @@ -110,6 +110,11 @@ class UserMountCache implements IUserMountCache { $newMounts = array_combine($newMountRootIds, $newMounts); $cachedMounts = $this->getMountsForUser($user); + if (is_array($mountProviderClasses)) { + $cachedMounts = array_filter($cachedMounts, function (ICachedMountInfo $mountInfo) use ($mountProviderClasses) { + return in_array($mountInfo->getMountProvider(), $mountProviderClasses); + }); + } $cachedMountRootIds = array_map(function (ICachedMountInfo $mount) { return $mount->getRootId(); }, $cachedMounts); @@ -446,4 +451,39 @@ class UserMountCache implements IUserMountCache { $this->cacheInfoCache = new CappedMemoryCache(); $this->mountsForUsers = new CappedMemoryCache(); } + + public function getMountForPath(IUser $user, string $path): ICachedMountInfo { + $mounts = $this->getMountsForUser($user); + $mountPoints = array_map(function (ICachedMountInfo $mount) { + return $mount->getMountPoint(); + }, $mounts); + $mounts = array_combine($mountPoints, $mounts); + + $current = $path; + // walk up the directory tree until we find a path that has a mountpoint set + // the loop will return if a mountpoint is found or break if none are found + while (true) { + $mountPoint = $current . '/'; + if (isset($mounts[$mountPoint])) { + return $mounts[$mountPoint]; + } elseif ($current === '') { + break; + } + + $current = dirname($current); + if ($current === '.' || $current === '/') { + $current = ''; + } + } + + throw new NotFoundException("No cached mount for path " . $path); + } + + public function getMountsInPath(IUser $user, string $path): array { + $path = rtrim($path, '/') . '/'; + $mounts = $this->getMountsForUser($user); + return array_filter($mounts, function (ICachedMountInfo $mount) use ($path) { + return $mount->getMountPoint() !== $path && strpos($mount->getMountPoint(), $path) === 0; + }); + } } diff --git a/lib/private/Files/Filesystem.php b/lib/private/Files/Filesystem.php index 9db9252037f..20b44e2736a 100644 --- a/lib/private/Files/Filesystem.php +++ b/lib/private/Files/Filesystem.php @@ -46,6 +46,7 @@ use OCP\Files\NotFoundException; use OCP\Files\Storage\IStorageFactory; use OCP\IUser; use OCP\IUserManager; +use OCP\IUserSession; class Filesystem { @@ -324,6 +325,18 @@ class Filesystem { if (self::$defaultInstance) { return false; } + self::initInternal($root); + + //load custom mount config + self::initMountPoints($user); + + return true; + } + + public static function initInternal($root) { + if (self::$defaultInstance) { + return false; + } self::getLoader(); self::$defaultInstance = new View($root); /** @var IEventDispatcher $eventDispatcher */ @@ -338,9 +351,6 @@ class Filesystem { self::$mounts = \OC::$server->getMountManager(); } - //load custom mount config - self::initMountPoints($user); - self::$loaded = true; return true; @@ -378,6 +388,15 @@ class Filesystem { * @return View */ public static function getView() { + if (!self::$defaultInstance) { + /** @var IUserSession $session */ + $session = \OC::$server->get(IUserSession::class); + $user = $session->getUser(); + if ($user) { + $userDir = '/' . $user->getUID() . '/files'; + self::initInternal($userDir); + } + } return self::$defaultInstance; } @@ -736,7 +755,7 @@ class Filesystem { * @return \OC\Files\FileInfo|false False if file does not exist */ public static function getFileInfo($path, $includeMountPoints = true) { - return self::$defaultInstance->getFileInfo($path, $includeMountPoints); + return self::getView()->getFileInfo($path, $includeMountPoints); } /** diff --git a/lib/private/Files/Mount/Manager.php b/lib/private/Files/Mount/Manager.php index 66832690363..ecd97760f17 100644 --- a/lib/private/Files/Mount/Manager.php +++ b/lib/private/Files/Mount/Manager.php @@ -125,7 +125,7 @@ class Manager implements IMountManager { * @return IMountPoint[] */ public function findIn(string $path): array { - $this->setupManager->setupForPath($path); + $this->setupManager->setupForPath($path, true); $path = $this->formatPath($path); if (isset($this->inPathCache[$path])) { diff --git a/lib/private/Files/Node/LazyFolder.php b/lib/private/Files/Node/LazyFolder.php index bfdaeeccff7..45451e5c53c 100644 --- a/lib/private/Files/Node/LazyFolder.php +++ b/lib/private/Files/Node/LazyFolder.php @@ -25,6 +25,8 @@ declare(strict_types=1); */ namespace OC\Files\Node; +use OCP\Constants; + /** * Class LazyFolder * @@ -40,13 +42,16 @@ class LazyFolder implements \OCP\Files\Folder { /** @var LazyFolder | null */ protected $folder = null; + protected array $data; + /** * LazyFolder constructor. * * @param \Closure $folderClosure */ - public function __construct(\Closure $folderClosure) { + public function __construct(\Closure $folderClosure, array $data = []) { $this->folderClosure = $folderClosure; + $this->data = $data; } /** @@ -181,6 +186,9 @@ class LazyFolder implements \OCP\Files\Folder { * @inheritDoc */ public function getPath() { + if (isset($this->data['path'])) { + return $this->data['path']; + } return $this->__call(__FUNCTION__, func_get_args()); } @@ -230,6 +238,9 @@ class LazyFolder implements \OCP\Files\Folder { * @inheritDoc */ public function getPermissions() { + if (isset($this->data['permissions'])) { + return $this->data['permissions']; + } return $this->__call(__FUNCTION__, func_get_args()); } @@ -237,6 +248,9 @@ class LazyFolder implements \OCP\Files\Folder { * @inheritDoc */ public function isReadable() { + if (isset($this->data['permissions'])) { + return ($this->data['permissions'] & Constants::PERMISSION_READ) == Constants::PERMISSION_READ; + } return $this->__call(__FUNCTION__, func_get_args()); } @@ -244,6 +258,9 @@ class LazyFolder implements \OCP\Files\Folder { * @inheritDoc */ public function isUpdateable() { + if (isset($this->data['permissions'])) { + return ($this->data['permissions'] & Constants::PERMISSION_UPDATE) == Constants::PERMISSION_UPDATE; + } return $this->__call(__FUNCTION__, func_get_args()); } @@ -251,6 +268,9 @@ class LazyFolder implements \OCP\Files\Folder { * @inheritDoc */ public function isDeletable() { + if (isset($this->data['permissions'])) { + return ($this->data['permissions'] & Constants::PERMISSION_DELETE) == Constants::PERMISSION_DELETE; + } return $this->__call(__FUNCTION__, func_get_args()); } @@ -258,6 +278,9 @@ class LazyFolder implements \OCP\Files\Folder { * @inheritDoc */ public function isShareable() { + if (isset($this->data['permissions'])) { + return ($this->data['permissions'] & Constants::PERMISSION_SHARE) == Constants::PERMISSION_SHARE; + } return $this->__call(__FUNCTION__, func_get_args()); } diff --git a/lib/private/Files/Node/LazyUserFolder.php b/lib/private/Files/Node/LazyUserFolder.php new file mode 100644 index 00000000000..4c9e89ce233 --- /dev/null +++ b/lib/private/Files/Node/LazyUserFolder.php @@ -0,0 +1,56 @@ +<?php + +declare(strict_types=1); +/** + * @copyright Copyright (c) 2022 Robin Appelman <robin@icewind.nl> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OC\Files\Node; + +use OCP\Constants; +use OCP\Files\IRootFolder; +use OCP\Files\NotFoundException; +use OCP\IUser; + +class LazyUserFolder extends LazyFolder { + private IRootFolder $rootFolder; + private IUser $user; + + public function __construct(IRootFolder $rootFolder, IUser $user) { + $this->rootFolder = $rootFolder; + $this->user = $user; + parent::__construct(function () use ($user) { + try { + return $this->rootFolder->get('/' . $user->getUID() . '/files'); + } catch (NotFoundException $e) { + if (!$this->rootFolder->nodeExists('/' . $user->getUID())) { + $this->rootFolder->newFolder('/' . $user->getUID()); + } + return $this->rootFolder->newFolder('/' . $user->getUID() . '/files'); + } + }, [ + 'path' => '/' . $user->getUID() . '/files', + 'permissions' => Constants::PERMISSION_ALL, + ]); + } + + public function get($path) { + return $this->rootFolder->get('/' . $this->user->getUID() . '/files/' . rtrim($path, '/')); + } +} diff --git a/lib/private/Files/Node/Root.php b/lib/private/Files/Node/Root.php index 88ac4a31d34..53162737b6f 100644 --- a/lib/private/Files/Node/Root.php +++ b/lib/private/Files/Node/Root.php @@ -380,15 +380,20 @@ class Root extends Folder implements IRootFolder { $userId = $userObject->getUID(); if (!$this->userFolderCache->hasKey($userId)) { - \OC\Files\Filesystem::initMountPoints($userId); - - try { - $folder = $this->get('/' . $userId . '/files'); - } catch (NotFoundException $e) { - if (!$this->nodeExists('/' . $userId)) { - $this->newFolder('/' . $userId); + if ($this->mountManager->getSetupManager()->isSetupComplete($userObject)) { + try { + $folder = $this->get('/' . $userId . '/files'); + if (!$folder instanceof \OCP\Files\Folder) { + throw new \Exception("User folder for $userId exists as a file"); + } + } catch (NotFoundException $e) { + if (!$this->nodeExists('/' . $userId)) { + $this->newFolder('/' . $userId); + } + $folder = $this->newFolder('/' . $userId . '/files'); } - $folder = $this->newFolder('/' . $userId . '/files'); + } else { + $folder = new LazyUserFolder($this, $userObject); } $this->userFolderCache->set($userId, $folder); diff --git a/lib/private/Files/SetupManager.php b/lib/private/Files/SetupManager.php index 9726fbef428..da50983da32 100644 --- a/lib/private/Files/SetupManager.php +++ b/lib/private/Files/SetupManager.php @@ -42,14 +42,23 @@ use OCP\Diagnostics\IEventLogger; use OCP\EventDispatcher\IEventDispatcher; use OCP\Files\Config\IMountProvider; use OCP\Files\Config\IUserMountCache; +use OCP\Files\Events\InvalidateMountCacheEvent; use OCP\Files\Events\Node\FilesystemTornDownEvent; use OCP\Files\Mount\IMountManager; use OCP\Files\Mount\IMountPoint; +use OCP\Files\NotFoundException; use OCP\Files\Storage\IStorage; +use OCP\Group\Events\UserAddedEvent; +use OCP\Group\Events\UserRemovedEvent; +use OCP\ICache; +use OCP\ICacheFactory; +use OCP\IConfig; use OCP\IUser; use OCP\IUserManager; use OCP\IUserSession; use OCP\Lockdown\ILockdownManager; +use OCP\Share\Events\ShareCreatedEvent; +use Psr\Log\LoggerInterface; class SetupManager { private bool $rootSetup = false; @@ -57,11 +66,19 @@ class SetupManager { private MountProviderCollection $mountProviderCollection; private IMountManager $mountManager; private IUserManager $userManager; + // List of users for which at least one mount is setup private array $setupUsers = []; + // List of users for which all mounts are setup + private array $setupUsersComplete = []; + /** @var array<string, string[]> */ + private array $setupUserMountProviders = []; private IEventDispatcher $eventDispatcher; private IUserMountCache $userMountCache; private ILockdownManager $lockdownManager; private IUserSession $userSession; + private ICache $cache; + private LoggerInterface $logger; + private IConfig $config; private bool $listeningForProviders; public function __construct( @@ -72,7 +89,10 @@ class SetupManager { IEventDispatcher $eventDispatcher, IUserMountCache $userMountCache, ILockdownManager $lockdownManager, - IUserSession $userSession + IUserSession $userSession, + ICacheFactory $cacheFactory, + LoggerInterface $logger, + IConfig $config ) { $this->eventLogger = $eventLogger; $this->mountProviderCollection = $mountProviderCollection; @@ -81,8 +101,21 @@ class SetupManager { $this->eventDispatcher = $eventDispatcher; $this->userMountCache = $userMountCache; $this->lockdownManager = $lockdownManager; + $this->logger = $logger; $this->userSession = $userSession; + $this->cache = $cacheFactory->createDistributed('setupmanager::'); $this->listeningForProviders = false; + $this->config = $config; + + $this->setupListeners(); + } + + private function isSetupStarted(IUser $user): bool { + return in_array($user->getUID(), $this->setupUsers, true); + } + + public function isSetupComplete(IUser $user): bool { + return in_array($user->getUID(), $this->setupUsersComplete, true); } private function setupBuiltinWrappers() { @@ -159,15 +192,33 @@ class SetupManager { * Setup the full filesystem for the specified user */ public function setupForUser(IUser $user): void { - $this->setupRoot(); + if ($this->isSetupComplete($user)) { + return; + } + $this->setupUsersComplete[] = $user->getUID(); + + if (!isset($this->setupUserMountProviders[$user->getUID()])) { + $this->setupUserMountProviders[$user->getUID()] = []; + } + $this->setupForUserWith($user, function () use ($user) { + $this->mountProviderCollection->addMountForUser($user, $this->mountManager, function ( + IMountProvider $provider + ) use ($user) { + return !in_array(get_class($provider), $this->setupUserMountProviders[$user->getUID()]); + }); + }); + $this->afterUserFullySetup($user); + } + + /** + * part of the user setup that is run only once per user + */ + private function oneTimeUserSetup(IUser $user) { if (in_array($user->getUID(), $this->setupUsers, true)) { return; } $this->setupUsers[] = $user->getUID(); - - $this->eventLogger->start('setup_fs', 'Setup filesystem'); - $prevLogging = Filesystem::logWarningWhenAddingStorageWrapper(false); OC_Hook::emit('OC_Filesystem', 'preSetup', ['user' => $user->getUID()]); @@ -176,7 +227,7 @@ class SetupManager { $userDir = '/' . $user->getUID() . '/files'; - Filesystem::init($user, $userDir); + Filesystem::initInternal($userDir); if ($this->lockdownManager->canAccessFilesystem()) { // home mounts are handled separate since we need to ensure this is mounted before we call the other mount providers @@ -187,13 +238,6 @@ class SetupManager { $homeMount->getStorage()->mkdir(''); $homeMount->getStorage()->getScanner()->scan(''); } - - // Chance to mount for other storages - $mounts = $this->mountProviderCollection->addMountForUser($user, $this->mountManager); - $mounts[] = $homeMount; - $this->userMountCache->registerMounts($user, $mounts); - - $this->listenForNewMountProviders(); } else { $this->mountManager->addMount(new MountPoint( new NullStorage([]), @@ -203,9 +247,46 @@ class SetupManager { new NullStorage([]), '/' . $user->getUID() . '/files' )); + $this->setupUsersComplete[] = $user->getUID(); + } + + $this->listenForNewMountProviders(); + } + + /** + * Final housekeeping after a user has been fully setup + */ + private function afterUserFullySetup(IUser $user): void { + $userRoot = '/' . $user->getUID() . '/'; + $mounts = $this->mountManager->getAll(); + $mounts = array_filter($mounts, function (IMountPoint $mount) use ($userRoot) { + return strpos($mount->getMountPoint(), $userRoot) === 0; + }); + $this->userMountCache->registerMounts($user, $mounts); + } + + /** + * @param IUser $user + * @param IMountPoint $mounts + * @return void + * @throws \OCP\HintException + * @throws \OC\ServerNotAvailableException + */ + private function setupForUserWith(IUser $user, callable $mountCallback): void { + $this->setupRoot(); + + if (!$this->isSetupStarted($user)) { + $this->oneTimeUserSetup($user); + } + + $this->eventLogger->start('setup_fs', 'Setup filesystem'); + + if ($this->lockdownManager->canAccessFilesystem()) { + $mountCallback(); } \OC_Hook::emit('OC_Filesystem', 'post_initMountPoints', ['user' => $user->getUID()]); + $userDir = '/' . $user->getUID() . '/files'; OC_Hook::emit('OC_Filesystem', 'setup', ['user' => $user->getUID(), 'user_dir' => $userDir]); $this->eventLogger->end('setup_fs'); @@ -242,7 +323,7 @@ class SetupManager { /** * Set up the filesystem for the specified path */ - public function setupForPath(string $path): void { + public function setupForPath(string $path, bool $includeChildren = false): void { if (substr_count($path, '/') < 2) { if ($user = $this->userSession->getUser()) { $this->setupForUser($user); @@ -264,11 +345,81 @@ class SetupManager { return; } - $this->setupForUser($user); + if ($this->isSetupComplete($user)) { + return; + } + + // we perform a "cached" setup only after having done the full setup recently + // this is also used to trigger a full setup after handling events that are likely + // to change the available mounts + $cachedSetup = $this->cache->get($user->getUID()); + if (!$cachedSetup) { + $this->setupForUser($user); + + $cacheDuration = $this->config->getSystemValueInt('fs_mount_cache_duration', 5 * 60); + if ($cacheDuration > 0) { + $this->cache->set($user->getUID(), true, $cacheDuration); + } + return; + } + + if (!isset($this->setupUserMountProviders[$user->getUID()])) { + $this->setupUserMountProviders[$user->getUID()] = []; + } + $setupProviders = &$this->setupUserMountProviders[$user->getUID()]; + $currentProviders = []; + + try { + $cachedMount = $this->userMountCache->getMountForPath($user, $path); + } catch (NotFoundException $e) { + $this->setupForUser($user); + return; + } + + $mounts = []; + if (!in_array($cachedMount->getMountProvider(), $setupProviders)) { + $setupProviders[] = $cachedMount->getMountProvider(); + $currentProviders[] = $cachedMount->getMountProvider(); + if ($cachedMount->getMountProvider()) { + $mounts = $this->mountProviderCollection->getUserMountsForProviderClass($user, $cachedMount->getMountProvider()); + } else { + $this->logger->debug("mount at " . $cachedMount->getMountPoint() . " has no provider set, performing full setup"); + $this->setupForUser($user); + return; + } + } + + if ($includeChildren) { + $subCachedMounts = $this->userMountCache->getMountsInPath($user, $path); + foreach ($subCachedMounts as $cachedMount) { + if (!in_array($cachedMount->getMountProvider(), $setupProviders)) { + $setupProviders[] = $cachedMount->getMountProvider(); + $currentProviders[] = $cachedMount->getMountProvider(); + if ($cachedMount->getMountProvider()) { + $mounts = array_merge($mounts, $this->mountProviderCollection->getUserMountsForProviderClass($user, $cachedMount->getMountProvider())); + } else { + $this->logger->debug("mount at " . $cachedMount->getMountPoint() . " has no provider set, performing full setup"); + $this->setupForUser($user); + return; + } + } + } + } + + if (count($mounts)) { + $this->userMountCache->registerMounts($user, $mounts, $currentProviders); + $this->setupForUserWith($user, function () use ($mounts) { + array_walk($mounts, [$this->mountManager, 'addMount']); + }); + } elseif (!$this->isSetupStarted($user)) { + $this->oneTimeUserSetup($user); + } } public function tearDown() { $this->setupUsers = []; + $this->setupUsersComplete = []; + $this->setupUserMountProviders = []; $this->rootSetup = false; $this->mountManager->clear(); $this->eventDispatcher->dispatchTyped(new FilesystemTornDownEvent()); @@ -280,7 +431,9 @@ class SetupManager { private function listenForNewMountProviders() { if (!$this->listeningForProviders) { $this->listeningForProviders = true; - $this->mountProviderCollection->listen('\OC\Files\Config', 'registerMountProvider', function (IMountProvider $provider) { + $this->mountProviderCollection->listen('\OC\Files\Config', 'registerMountProvider', function ( + IMountProvider $provider + ) { foreach ($this->setupUsers as $userId) { $user = $this->userManager->get($userId); if ($user) { @@ -291,4 +444,40 @@ class SetupManager { }); } } + + private function setupListeners() { + // note that this event handling is intentionally pessimistic + // clearing the cache to often is better than not enough + + $this->eventDispatcher->addListener(UserAddedEvent::class, function (UserAddedEvent $event) { + $this->cache->remove($event->getUser()->getUID()); + }); + $this->eventDispatcher->addListener(UserRemovedEvent::class, function (UserRemovedEvent $event) { + $this->cache->remove($event->getUser()->getUID()); + }); + $this->eventDispatcher->addListener(ShareCreatedEvent::class, function (ShareCreatedEvent $event) { + $this->cache->remove($event->getShare()->getSharedWith()); + }); + $this->eventDispatcher->addListener(InvalidateMountCacheEvent::class, function (InvalidateMountCacheEvent $event + ) { + if ($user = $event->getUser()) { + $this->cache->remove($user->getUID()); + } else { + $this->cache->clear(); + } + }); + + $genericEvents = [ + '\OCA\Circles::onCircleCreation', + '\OCA\Circles::onCircleDestruction', + '\OCA\Circles::onMemberNew', + '\OCA\Circles::onMemberLeaving', + ]; + + foreach ($genericEvents as $genericEvent) { + $this->eventDispatcher->addListener($genericEvent, function ($event) { + $this->cache->clear(); + }); + } + } } diff --git a/lib/private/Files/SetupManagerFactory.php b/lib/private/Files/SetupManagerFactory.php index 56e70d09961..1d9efbd411f 100644 --- a/lib/private/Files/SetupManagerFactory.php +++ b/lib/private/Files/SetupManagerFactory.php @@ -28,9 +28,12 @@ use OCP\EventDispatcher\IEventDispatcher; use OCP\Files\Config\IMountProviderCollection; use OCP\Files\Config\IUserMountCache; use OCP\Files\Mount\IMountManager; +use OCP\ICacheFactory; +use OCP\IConfig; use OCP\IUserManager; use OCP\IUserSession; use OCP\Lockdown\ILockdownManager; +use Psr\Log\LoggerInterface; class SetupManagerFactory { private IEventLogger $eventLogger; @@ -41,6 +44,9 @@ class SetupManagerFactory { private ILockdownManager $lockdownManager; private IUserSession $userSession; private ?SetupManager $setupManager; + private ICacheFactory $cacheFactory; + private LoggerInterface $logger; + private IConfig $config; public function __construct( IEventLogger $eventLogger, @@ -49,7 +55,10 @@ class SetupManagerFactory { IEventDispatcher $eventDispatcher, IUserMountCache $userMountCache, ILockdownManager $lockdownManager, - IUserSession $userSession + IUserSession $userSession, + ICacheFactory $cacheFactory, + LoggerInterface $logger, + IConfig $config ) { $this->eventLogger = $eventLogger; $this->mountProviderCollection = $mountProviderCollection; @@ -58,6 +67,9 @@ class SetupManagerFactory { $this->userMountCache = $userMountCache; $this->lockdownManager = $lockdownManager; $this->userSession = $userSession; + $this->cacheFactory = $cacheFactory; + $this->logger = $logger; + $this->config = $config; $this->setupManager = null; } @@ -72,6 +84,9 @@ class SetupManagerFactory { $this->userMountCache, $this->lockdownManager, $this->userSession, + $this->cacheFactory, + $this->logger, + $this->config ); } return $this->setupManager; diff --git a/lib/public/Files/Config/IMountProviderCollection.php b/lib/public/Files/Config/IMountProviderCollection.php index f845d72cee6..5894d06a388 100644 --- a/lib/public/Files/Config/IMountProviderCollection.php +++ b/lib/public/Files/Config/IMountProviderCollection.php @@ -39,6 +39,16 @@ interface IMountProviderCollection { public function getMountsForUser(IUser $user); /** + * Get the configured mount points for the user from a specific mount provider + * + * @param \OCP\IUser $user + * @param class-string<IMountProvider> $mountProviderClass + * @return \OCP\Files\Mount\IMountPoint[] + * @since 24.0.0 + */ + public function getUserMountsForProviderClass(IUser $user, string $mountProviderClass); + + /** * Get the configured home mount for this user * * @param \OCP\IUser $user diff --git a/lib/public/Files/Config/IUserMountCache.php b/lib/public/Files/Config/IUserMountCache.php index 08f95990d3c..4411200c7ae 100644 --- a/lib/public/Files/Config/IUserMountCache.php +++ b/lib/public/Files/Config/IUserMountCache.php @@ -25,6 +25,7 @@ namespace OCP\Files\Config; use OCP\Files\Mount\IMountPoint; +use OCP\Files\NotFoundException; use OCP\IUser; /** @@ -38,9 +39,10 @@ interface IUserMountCache { * * @param IUser $user * @param IMountPoint[] $mounts + * @param array|null $mountProviderClasses * @since 9.0.0 */ - public function registerMounts(IUser $user, array $mounts); + public function registerMounts(IUser $user, array $mounts, array $mountProviderClasses = null); /** * Get all cached mounts for a user @@ -125,4 +127,26 @@ interface IUserMountCache { * @since 20.0.0 */ public function clear(): void; + + /** + * Get all cached mounts for a user + * + * @param IUser $user + * @param string $path + * @return ICachedMountInfo + * @throws NotFoundException + * @since 24.0.0 + */ + public function getMountForPath(IUser $user, string $path): ICachedMountInfo; + + /** + * Get all cached mounts for a user inside a path + * + * @param IUser $user + * @param string $path + * @return ICachedMountInfo[] + * @throws NotFoundException + * @since 24.0.0 + */ + public function getMountsInPath(IUser $user, string $path): array; } diff --git a/lib/public/Files/Events/InvalidateMountCacheEvent.php b/lib/public/Files/Events/InvalidateMountCacheEvent.php new file mode 100644 index 00000000000..6508e168d4c --- /dev/null +++ b/lib/public/Files/Events/InvalidateMountCacheEvent.php @@ -0,0 +1,55 @@ +<?php + +declare(strict_types=1); +/** + * @copyright Copyright (c) 2022 Robin Appelman <robin@icewind.nl> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCP\Files\Events; + +use OCP\EventDispatcher\Event; +use OCP\IUser; + +/** + * Used to notify the filesystem setup manager that the available mounts for a user have changed + * + * @since 24.0.0 + */ +class InvalidateMountCacheEvent extends Event { + private ?IUser $user; + + /** + * @param IUser|null $user user + * + * @since 24.0.0 + */ + public function __construct(?IUser $user) { + parent::__construct(); + $this->user = $user; + } + + /** + * @return IUser|null user + * + * @since 24.0.0 + */ + public function getUser(): ?IUser { + return $this->user; + } +} diff --git a/package-lock.json b/package-lock.json index 765df4f2cee..8e8194b024d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -88,7 +88,7 @@ "@testing-library/user-event": "^13.5.0", "@testing-library/vue": "^5.8.2", "@vue/test-utils": "^1.3.0", - "babel-loader": "^8.2.3", + "babel-loader": "^8.2.4", "babel-loader-exclude-node-modules-except": "^1.2.1", "css-loader": "^6.7.1", "eslint-plugin-es": "^4.1.0", @@ -4959,13 +4959,13 @@ } }, "node_modules/babel-loader": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", - "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.4.tgz", + "integrity": "sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==", "dev": true, "dependencies": { "find-cache-dir": "^3.3.1", - "loader-utils": "^1.4.0", + "loader-utils": "^2.0.0", "make-dir": "^3.1.0", "schema-utils": "^2.6.5" }, @@ -4986,6 +4986,20 @@ "escape-string-regexp": "2.0.0" } }, + "node_modules/babel-loader/node_modules/loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, "node_modules/babel-loader/node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -13674,9 +13688,9 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "node_modules/minimist-options": { "version": "4.1.0", @@ -23488,17 +23502,28 @@ } }, "babel-loader": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", - "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.4.tgz", + "integrity": "sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==", "dev": true, "requires": { "find-cache-dir": "^3.3.1", - "loader-utils": "^1.4.0", + "loader-utils": "^2.0.0", "make-dir": "^3.1.0", "schema-utils": "^2.6.5" }, "dependencies": { + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -30160,9 +30185,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "minimist-options": { "version": "4.1.0", diff --git a/package.json b/package.json index ef5ef3fd69a..9358ba6c85d 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "@testing-library/user-event": "^13.5.0", "@testing-library/vue": "^5.8.2", "@vue/test-utils": "^1.3.0", - "babel-loader": "^8.2.3", + "babel-loader": "^8.2.4", "babel-loader-exclude-node-modules-except": "^1.2.1", "css-loader": "^6.7.1", "eslint-plugin-es": "^4.1.0", diff --git a/tests/lib/Comments/ManagerTest.php b/tests/lib/Comments/ManagerTest.php index 23a9346909a..961f8dfdd41 100644 --- a/tests/lib/Comments/ManagerTest.php +++ b/tests/lib/Comments/ManagerTest.php @@ -3,6 +3,7 @@ namespace Test\Comments; use OC\Comments\Comment; +use OC\Comments\EmojiHelper; use OC\Comments\Manager; use OCP\AppFramework\Utility\ITimeFactory; use OCP\Comments\IComment; @@ -74,6 +75,7 @@ class ManagerTest extends TestCase { $this->createMock(LoggerInterface::class), $this->createMock(IConfig::class), $this->createMock(ITimeFactory::class), + new EmojiHelper($this->connection), $this->createMock(IInitialStateService::class) ); } @@ -1181,15 +1183,13 @@ class ManagerTest extends TestCase { public function providerTestReactionMessageSize(): array { return [ - ['a', true], - ['1', true], - ['12', true], - ['123', false], + ['a', false], + ['1', false], ['👍', true], - ['👍👍', true], + ['👍👍', false], ['👍🏽', true], - ['👍🏽👍', false], - ['👍🏽👍🏽', false], + ['👨🏽💻', true], + ['👨🏽💻👍', false], ]; } diff --git a/version.php b/version.php index 37a10a2c51b..8eb364be40a 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 = [24, 0, 0, 5]; +$OC_Version = [24, 0, 0, 6]; // The human readable string -$OC_VersionString = '24.0.0 dev'; +$OC_VersionString = '24.0.0 beta 1'; $OC_VersionCanBeUpgradedFrom = [ 'nextcloud' => [ |