diff options
66 files changed, 531 insertions, 156 deletions
diff --git a/apps/admin_audit/l10n/fr.js b/apps/admin_audit/l10n/fr.js index 3599a488350..142ba8eb8e0 100644 --- a/apps/admin_audit/l10n/fr.js +++ b/apps/admin_audit/l10n/fr.js @@ -2,6 +2,6 @@ OC.L10N.register( "admin_audit", { "Auditing / Logging" : "Audit / Journalisation", - "Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Fournit des capacités de traçage à NextCloud telles que les accès aux fichiers ou d'autres actions sensibles." + "Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Fournit des capacités de traçage à NextCloud telles que l'accès aux fichiers d'identifications ou autres actions sensibles." }, "nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/admin_audit/l10n/fr.json b/apps/admin_audit/l10n/fr.json index b0f0d976c60..2ea232bca3d 100644 --- a/apps/admin_audit/l10n/fr.json +++ b/apps/admin_audit/l10n/fr.json @@ -1,5 +1,5 @@ { "translations": { "Auditing / Logging" : "Audit / Journalisation", - "Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Fournit des capacités de traçage à NextCloud telles que les accès aux fichiers ou d'autres actions sensibles." + "Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Fournit des capacités de traçage à NextCloud telles que l'accès aux fichiers d'identifications ou autres actions sensibles." },"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/ca.js b/apps/dashboard/l10n/ca.js index f45ea85238a..4ca59635572 100644 --- a/apps/dashboard/l10n/ca.js +++ b/apps/dashboard/l10n/ca.js @@ -1,15 +1,15 @@ OC.L10N.register( "dashboard", { - "Dashboard" : "Panell de control", - "Dashboard app" : "Aplicació tauler", - "Start your day informed\n\nThe Nextcloud Dashboard is your starting point of the day, giving you an overview of your upcoming appointments, urgent emails, chat messages, incoming tickets, latest tweets and much more! Users can add the widgets they 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, que us ofereix una visió general de les vostres properes cites, correus electrònics urgents, missatges de xat, tickets entrants, els últims tuits i molt més! Els usuaris poden afegir els ginys que els agradin i canviar el fons al seu gust.", - "\"{title} icon\"" : "\"icona {title}\"", + "Dashboard" : "Tauler", + "Dashboard app" : "Aplicació Tauler", + "Start your day informed\n\nThe Nextcloud Dashboard is your starting point of the day, giving you an overview of your upcoming appointments, urgent emails, chat messages, incoming tickets, latest tweets and much more! Users can add the widgets they like and change the background to their liking." : "Comenceu el dia amb tota la informació actualitzada\n\nEl tauler del Nextcloud és el punt de partida del dia i us ofereix una visió general de les pròximes cites, correus electrònics urgents, missatges de xat, informes d'errors rebuts, els tuits més recents i molt més! Els usuaris poden afegir els ginys que els agradin i canviar el fons al seu gust.", + "\"{title} icon\"" : "«icona de {title}»", "Customize" : "Personalitza", "Edit widgets" : "Edita els ginys", - "Get more widgets from the App Store" : "Aconseguiu més widgets de la botiga d'aplicacions", + "Get more widgets from the App Store" : "Obtén més ginys a la botiga d'aplicacions", "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 privadesa, 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.", + "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 vostra privadesa, les dades meteorològiques les sol·licita el servidor del Nextcloud en nom vostre perquè el servei meteorològic no rebi cap informació personal.", "Weather data from Met.no" : "Dades meteorològiques de Met.no", "geocoding with Nominatim" : "codis geogràfics amb Nominatim", "elevation data from OpenTopoData" : "dades d'altitud d'OpenTopoData", @@ -19,13 +19,13 @@ OC.L10N.register( "Good morning, {name}" : "Bon dia, {name}", "Good afternoon" : "Bona tarda", "Good afternoon, {name}" : "Bona tarda, {name}", - "Good evening" : "Bona tarda", + "Good evening" : "Bona nit", "Good evening, {name}" : "Bona nit, {name}", "Hello" : "Hola", - "Hello, {name}" : "Hola {name}", - "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.", + "Hello, {name}" : "Hola, {name}", + "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." : "Comenceu el dia amb tota la informació actualitzada\n\nEl tauler del Nextcloud és el punt de partida del dia i us ofereix\nuna visió general de les pròximes cites, correus electrònics urgents, missatges de xat,\ninformes d'errors rebuts, els tuits més recents i molt més! Els usuaris poden afegir\nels ginys que els agradin i canviar el fons al seu gust.", "Change background image" : "Canvia la imatge de fons", - "Pick from Files" : "Trieu dels fitxers", + "Pick from Files" : "Tria dels fitxers", "Default images" : "Imatges per defecte", "Plain background" : "Fons senzill", "Insert from {productName}" : "Insereix des de {productName}" diff --git a/apps/dashboard/l10n/ca.json b/apps/dashboard/l10n/ca.json index b7ea8884857..c694e54194a 100644 --- a/apps/dashboard/l10n/ca.json +++ b/apps/dashboard/l10n/ca.json @@ -1,13 +1,13 @@ { "translations": { - "Dashboard" : "Panell de control", - "Dashboard app" : "Aplicació tauler", - "Start your day informed\n\nThe Nextcloud Dashboard is your starting point of the day, giving you an overview of your upcoming appointments, urgent emails, chat messages, incoming tickets, latest tweets and much more! Users can add the widgets they 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, que us ofereix una visió general de les vostres properes cites, correus electrònics urgents, missatges de xat, tickets entrants, els últims tuits i molt més! Els usuaris poden afegir els ginys que els agradin i canviar el fons al seu gust.", - "\"{title} icon\"" : "\"icona {title}\"", + "Dashboard" : "Tauler", + "Dashboard app" : "Aplicació Tauler", + "Start your day informed\n\nThe Nextcloud Dashboard is your starting point of the day, giving you an overview of your upcoming appointments, urgent emails, chat messages, incoming tickets, latest tweets and much more! Users can add the widgets they like and change the background to their liking." : "Comenceu el dia amb tota la informació actualitzada\n\nEl tauler del Nextcloud és el punt de partida del dia i us ofereix una visió general de les pròximes cites, correus electrònics urgents, missatges de xat, informes d'errors rebuts, els tuits més recents i molt més! Els usuaris poden afegir els ginys que els agradin i canviar el fons al seu gust.", + "\"{title} icon\"" : "«icona de {title}»", "Customize" : "Personalitza", "Edit widgets" : "Edita els ginys", - "Get more widgets from the App Store" : "Aconseguiu més widgets de la botiga d'aplicacions", + "Get more widgets from the App Store" : "Obtén més ginys a la botiga d'aplicacions", "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 privadesa, 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.", + "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 vostra privadesa, les dades meteorològiques les sol·licita el servidor del Nextcloud en nom vostre perquè el servei meteorològic no rebi cap informació personal.", "Weather data from Met.no" : "Dades meteorològiques de Met.no", "geocoding with Nominatim" : "codis geogràfics amb Nominatim", "elevation data from OpenTopoData" : "dades d'altitud d'OpenTopoData", @@ -17,13 +17,13 @@ "Good morning, {name}" : "Bon dia, {name}", "Good afternoon" : "Bona tarda", "Good afternoon, {name}" : "Bona tarda, {name}", - "Good evening" : "Bona tarda", + "Good evening" : "Bona nit", "Good evening, {name}" : "Bona nit, {name}", "Hello" : "Hola", - "Hello, {name}" : "Hola {name}", - "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.", + "Hello, {name}" : "Hola, {name}", + "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." : "Comenceu el dia amb tota la informació actualitzada\n\nEl tauler del Nextcloud és el punt de partida del dia i us ofereix\nuna visió general de les pròximes cites, correus electrònics urgents, missatges de xat,\ninformes d'errors rebuts, els tuits més recents i molt més! Els usuaris poden afegir\nels ginys que els agradin i canviar el fons al seu gust.", "Change background image" : "Canvia la imatge de fons", - "Pick from Files" : "Trieu dels fitxers", + "Pick from Files" : "Tria dels fitxers", "Default images" : "Imatges per defecte", "Plain background" : "Fons senzill", "Insert from {productName}" : "Insereix des de {productName}" diff --git a/apps/dav/composer/composer/autoload_classmap.php b/apps/dav/composer/composer/autoload_classmap.php index d3290c4e792..a29e7e72327 100644 --- a/apps/dav/composer/composer/autoload_classmap.php +++ b/apps/dav/composer/composer/autoload_classmap.php @@ -301,6 +301,7 @@ return array( 'OCA\\DAV\\SystemTag\\SystemTagNode' => $baseDir . '/../lib/SystemTag/SystemTagNode.php', 'OCA\\DAV\\SystemTag\\SystemTagPlugin' => $baseDir . '/../lib/SystemTag/SystemTagPlugin.php', 'OCA\\DAV\\SystemTag\\SystemTagsByIdCollection' => $baseDir . '/../lib/SystemTag/SystemTagsByIdCollection.php', + 'OCA\\DAV\\SystemTag\\SystemTagsInUseCollection' => $baseDir . '/../lib/SystemTag/SystemTagsInUseCollection.php', 'OCA\\DAV\\SystemTag\\SystemTagsObjectMappingCollection' => $baseDir . '/../lib/SystemTag/SystemTagsObjectMappingCollection.php', 'OCA\\DAV\\SystemTag\\SystemTagsObjectTypeCollection' => $baseDir . '/../lib/SystemTag/SystemTagsObjectTypeCollection.php', 'OCA\\DAV\\SystemTag\\SystemTagsRelationsCollection' => $baseDir . '/../lib/SystemTag/SystemTagsRelationsCollection.php', diff --git a/apps/dav/composer/composer/autoload_static.php b/apps/dav/composer/composer/autoload_static.php index 4d425f70f3b..1a7e239acd1 100644 --- a/apps/dav/composer/composer/autoload_static.php +++ b/apps/dav/composer/composer/autoload_static.php @@ -316,6 +316,7 @@ class ComposerStaticInitDAV 'OCA\\DAV\\SystemTag\\SystemTagNode' => __DIR__ . '/..' . '/../lib/SystemTag/SystemTagNode.php', 'OCA\\DAV\\SystemTag\\SystemTagPlugin' => __DIR__ . '/..' . '/../lib/SystemTag/SystemTagPlugin.php', 'OCA\\DAV\\SystemTag\\SystemTagsByIdCollection' => __DIR__ . '/..' . '/../lib/SystemTag/SystemTagsByIdCollection.php', + 'OCA\\DAV\\SystemTag\\SystemTagsInUseCollection' => __DIR__ . '/..' . '/../lib/SystemTag/SystemTagsInUseCollection.php', 'OCA\\DAV\\SystemTag\\SystemTagsObjectMappingCollection' => __DIR__ . '/..' . '/../lib/SystemTag/SystemTagsObjectMappingCollection.php', 'OCA\\DAV\\SystemTag\\SystemTagsObjectTypeCollection' => __DIR__ . '/..' . '/../lib/SystemTag/SystemTagsObjectTypeCollection.php', 'OCA\\DAV\\SystemTag\\SystemTagsRelationsCollection' => __DIR__ . '/..' . '/../lib/SystemTag/SystemTagsRelationsCollection.php', diff --git a/apps/dav/l10n/de.js b/apps/dav/l10n/de.js index d4a916aa742..7d6f604ab6d 100644 --- a/apps/dav/l10n/de.js +++ b/apps/dav/l10n/de.js @@ -119,6 +119,7 @@ OC.L10N.register( "You updated contact {card} in address book {addressbook}" : "Du hast den Kontakt {card} im Adressbuch {addressbook} aktualisiert", "A <strong>contact</strong> or <strong>address book</strong> was modified" : "Ein <strong>Kontakt</strong> oder ein <strong>Adressbuch</strong> wurde geändert", "Accounts" : "Konten", + "System address book which holds all accounts" : "Systemadressbuch, das alle Konten enthält", "File is not updatable: %1$s" : "Datei kann nicht aktualisiert werden: %1$s", "Could not write to final file, canceled by hook" : "In die endgültige Datei konnte nicht geschrieben werden, wurde durch einen Hook abgebrochen", "Could not write file contents" : "Dateiinhalt konnte nicht geschrieben werden", diff --git a/apps/dav/l10n/de.json b/apps/dav/l10n/de.json index 3f3169348d9..7bf4c2d3a4c 100644 --- a/apps/dav/l10n/de.json +++ b/apps/dav/l10n/de.json @@ -117,6 +117,7 @@ "You updated contact {card} in address book {addressbook}" : "Du hast den Kontakt {card} im Adressbuch {addressbook} aktualisiert", "A <strong>contact</strong> or <strong>address book</strong> was modified" : "Ein <strong>Kontakt</strong> oder ein <strong>Adressbuch</strong> wurde geändert", "Accounts" : "Konten", + "System address book which holds all accounts" : "Systemadressbuch, das alle Konten enthält", "File is not updatable: %1$s" : "Datei kann nicht aktualisiert werden: %1$s", "Could not write to final file, canceled by hook" : "In die endgültige Datei konnte nicht geschrieben werden, wurde durch einen Hook abgebrochen", "Could not write file contents" : "Dateiinhalt konnte nicht geschrieben werden", diff --git a/apps/dav/lib/CalDAV/CalDavBackend.php b/apps/dav/lib/CalDAV/CalDavBackend.php index 709f625afb3..b38858976ff 100644 --- a/apps/dav/lib/CalDAV/CalDavBackend.php +++ b/apps/dav/lib/CalDAV/CalDavBackend.php @@ -1236,17 +1236,19 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription } // For a more specific error message we also try to explicitly look up the UID but as a deleted entry $qbDel = $this->db->getQueryBuilder(); - $qbDel->select($qb->func()->count('*')) + $qbDel->select('*') ->from('calendarobjects') ->where($qbDel->expr()->eq('calendarid', $qbDel->createNamedParameter($calendarId))) ->andWhere($qbDel->expr()->eq('uid', $qbDel->createNamedParameter($extraData['uid']))) ->andWhere($qbDel->expr()->eq('calendartype', $qbDel->createNamedParameter($calendarType))) ->andWhere($qbDel->expr()->isNotNull('deleted_at')); $result = $qbDel->executeQuery(); - $count = (int) $result->fetchOne(); + $found = $result->fetch(); $result->closeCursor(); - if ($count !== 0) { - throw new BadRequest('Deleted calendar object with uid already exists in this calendar collection.'); + if ($found !== false) { + // the object existed previously but has been deleted + // remove the trashbin entry and continue as if it was a new object + $this->deleteCalendarObject($calendarId, $found['uri']); } $query = $this->db->getQueryBuilder(); diff --git a/apps/dav/lib/CalDAV/Reminder/INotificationProvider.php b/apps/dav/lib/CalDAV/Reminder/INotificationProvider.php index 505960ed662..e8cbfdd0ab3 100644 --- a/apps/dav/lib/CalDAV/Reminder/INotificationProvider.php +++ b/apps/dav/lib/CalDAV/Reminder/INotificationProvider.php @@ -42,13 +42,13 @@ interface INotificationProvider { * Send notification * * @param VEvent $vevent - * @param string $calendarDisplayName + * @param string|null $calendarDisplayName * @param string[] $principalEmailAddresses All email addresses associated to the principal owning the calendar object * @param IUser[] $users * @return void */ public function send(VEvent $vevent, - string $calendarDisplayName, + ?string $calendarDisplayName, array $principalEmailAddresses, array $users = []): void; } diff --git a/apps/dav/lib/CalDAV/Reminder/NotificationProvider/AbstractProvider.php b/apps/dav/lib/CalDAV/Reminder/NotificationProvider/AbstractProvider.php index 6986328facd..bccbec5fe3c 100644 --- a/apps/dav/lib/CalDAV/Reminder/NotificationProvider/AbstractProvider.php +++ b/apps/dav/lib/CalDAV/Reminder/NotificationProvider/AbstractProvider.php @@ -82,13 +82,13 @@ abstract class AbstractProvider implements INotificationProvider { * Send notification * * @param VEvent $vevent - * @param string $calendarDisplayName + * @param string|null $calendarDisplayName * @param string[] $principalEmailAddresses * @param IUser[] $users * @return void */ abstract public function send(VEvent $vevent, - string $calendarDisplayName, + ?string $calendarDisplayName, array $principalEmailAddresses, array $users = []): void; @@ -185,4 +185,8 @@ abstract class AbstractProvider implements INotificationProvider { return clone $vevent->DTSTART; } + + protected function getCalendarDisplayNameFallback(string $lang): string { + return $this->getL10NForLang($lang)->t('Untitled calendar'); + } } diff --git a/apps/dav/lib/CalDAV/Reminder/NotificationProvider/EmailProvider.php b/apps/dav/lib/CalDAV/Reminder/NotificationProvider/EmailProvider.php index c2e68605d17..96cbc650006 100644 --- a/apps/dav/lib/CalDAV/Reminder/NotificationProvider/EmailProvider.php +++ b/apps/dav/lib/CalDAV/Reminder/NotificationProvider/EmailProvider.php @@ -70,13 +70,13 @@ class EmailProvider extends AbstractProvider { * Send out notification via email * * @param VEvent $vevent - * @param string $calendarDisplayName + * @param string|null $calendarDisplayName * @param string[] $principalEmailAddresses * @param array $users * @throws \Exception */ public function send(VEvent $vevent, - string $calendarDisplayName, + ?string $calendarDisplayName, array $principalEmailAddresses, array $users = []):void { $fallbackLanguage = $this->getFallbackLanguage(); @@ -115,7 +115,7 @@ class EmailProvider extends AbstractProvider { $template = $this->mailer->createEMailTemplate('dav.calendarReminder'); $template->addHeader(); $this->addSubjectAndHeading($template, $l10n, $vevent); - $this->addBulletList($template, $l10n, $calendarDisplayName, $vevent); + $this->addBulletList($template, $l10n, $calendarDisplayName ?? $this->getCalendarDisplayNameFallback($lang), $vevent); $template->addFooter(); foreach ($emailAddresses as $emailAddress) { diff --git a/apps/dav/lib/CalDAV/Reminder/NotificationProvider/PushProvider.php b/apps/dav/lib/CalDAV/Reminder/NotificationProvider/PushProvider.php index 833d74079aa..be8bafd2f35 100644 --- a/apps/dav/lib/CalDAV/Reminder/NotificationProvider/PushProvider.php +++ b/apps/dav/lib/CalDAV/Reminder/NotificationProvider/PushProvider.php @@ -73,13 +73,13 @@ class PushProvider extends AbstractProvider { * Send push notification to all users. * * @param VEvent $vevent - * @param string $calendarDisplayName + * @param string|null $calendarDisplayName * @param string[] $principalEmailAddresses * @param IUser[] $users * @throws \Exception */ public function send(VEvent $vevent, - string $calendarDisplayName, + ?string $calendarDisplayName, array $principalEmailAddresses, array $users = []):void { if ($this->config->getAppValue('dav', 'sendEventRemindersPush', 'no') !== 'yes') { @@ -87,7 +87,6 @@ class PushProvider extends AbstractProvider { } $eventDetails = $this->extractEventDetails($vevent); - $eventDetails['calendar_displayname'] = $calendarDisplayName; $eventUUID = (string) $vevent->UID; if (!$eventUUID) { return; @@ -95,6 +94,8 @@ class PushProvider extends AbstractProvider { $eventUUIDHash = hash('sha256', $eventUUID, false); foreach ($users as $user) { + $eventDetails['calendar_displayname'] = $calendarDisplayName ?? $this->getCalendarDisplayNameFallback($this->l10nFactory->getUserLanguage($user)); + /** @var INotification $notification */ $notification = $this->manager->createNotification(); $notification->setApp(Application::APP_ID) diff --git a/apps/dav/lib/CardDAV/SystemAddressbook.php b/apps/dav/lib/CardDAV/SystemAddressbook.php index 502e353acb3..1c78e03162e 100644 --- a/apps/dav/lib/CardDAV/SystemAddressbook.php +++ b/apps/dav/lib/CardDAV/SystemAddressbook.php @@ -30,6 +30,7 @@ namespace OCA\DAV\CardDAV; use OCP\IConfig; use OCP\IL10N; use Sabre\CardDAV\Backend\BackendInterface; +use function array_filter; class SystemAddressbook extends AddressBook { /** @var IConfig */ @@ -50,4 +51,13 @@ class SystemAddressbook extends AddressBook { return parent::getChildren(); } + + public function getACL() { + return array_filter(parent::getACL(), function($acl) { + if (in_array($acl['privilege'], ['{DAV:}write', '{DAV:}all'], true)) { + return false; + } + return true; + }); + } } diff --git a/apps/dav/lib/RootCollection.php b/apps/dav/lib/RootCollection.php index 29ab65d46a9..a1d32fdb72e 100644 --- a/apps/dav/lib/RootCollection.php +++ b/apps/dav/lib/RootCollection.php @@ -48,6 +48,7 @@ use OCP\Accounts\IAccountManager; use OCP\App\IAppManager; use OCP\AppFramework\Utility\ITimeFactory; use OCP\EventDispatcher\IEventDispatcher; +use OCP\Files\IRootFolder; use OCP\IConfig; use Psr\Log\LoggerInterface; use Sabre\DAV\SimpleCollection; @@ -65,6 +66,7 @@ class RootCollection extends SimpleCollection { $dispatcher = \OC::$server->get(IEventDispatcher::class); $config = \OC::$server->get(IConfig::class); $proxyMapper = \OC::$server->query(ProxyMapper::class); + $rootFolder = \OCP\Server::get(IRootFolder::class); $userPrincipalBackend = new Principal( $userManager, @@ -132,6 +134,7 @@ class RootCollection extends SimpleCollection { $groupManager, \OC::$server->getEventDispatcher() ); + $systemTagInUseCollection = \OCP\Server::get(SystemTag\SystemTagsInUseCollection::class); $commentsCollection = new Comments\RootCollection( \OC::$server->getCommentsManager(), $userManager, @@ -180,6 +183,7 @@ class RootCollection extends SimpleCollection { $systemAddressBookRoot]), $systemTagCollection, $systemTagRelationsCollection, + $systemTagInUseCollection, $commentsCollection, $uploadCollection, $avatarCollection, diff --git a/apps/dav/lib/SystemTag/SystemTagNode.php b/apps/dav/lib/SystemTag/SystemTagNode.php index a31deb59a93..597aff84203 100644 --- a/apps/dav/lib/SystemTag/SystemTagNode.php +++ b/apps/dav/lib/SystemTag/SystemTagNode.php @@ -64,6 +64,9 @@ class SystemTagNode implements \Sabre\DAV\INode { */ protected $isAdmin; + protected int $numberOfFiles = -1; + protected int $referenceFileId = -1; + /** * Sets up the node, expects a full path name * @@ -172,4 +175,20 @@ class SystemTagNode implements \Sabre\DAV\INode { throw new NotFound('Tag with id ' . $this->tag->getId() . ' not found', 0, $e); } } + + public function getNumberOfFiles(): int { + return $this->numberOfFiles; + } + + public function setNumberOfFiles(int $numberOfFiles): void { + $this->numberOfFiles = $numberOfFiles; + } + + public function getReferenceFileId(): int { + return $this->referenceFileId; + } + + public function setReferenceFileId(int $referenceFileId): void { + $this->referenceFileId = $referenceFileId; + } } diff --git a/apps/dav/lib/SystemTag/SystemTagPlugin.php b/apps/dav/lib/SystemTag/SystemTagPlugin.php index b6bd7d3b7cd..4f1d6d48239 100644 --- a/apps/dav/lib/SystemTag/SystemTagPlugin.php +++ b/apps/dav/lib/SystemTag/SystemTagPlugin.php @@ -56,6 +56,8 @@ class SystemTagPlugin extends \Sabre\DAV\ServerPlugin { public const USERASSIGNABLE_PROPERTYNAME = '{http://owncloud.org/ns}user-assignable'; public const GROUPS_PROPERTYNAME = '{http://owncloud.org/ns}groups'; public const CANASSIGN_PROPERTYNAME = '{http://owncloud.org/ns}can-assign'; + public const NUM_FILES_PROPERTYNAME = '{http://nextcloud.org/ns}files-assigned'; + public const FILEID_PROPERTYNAME = '{http://nextcloud.org/ns}reference-fileid'; /** * @var \Sabre\DAV\Server $server @@ -224,6 +226,11 @@ class SystemTagPlugin extends \Sabre\DAV\ServerPlugin { return; } + // child nodes from systemtags-assigned should point to normal tag endpoint + if (preg_match('/^systemtags-assigned\/[0-9]+/', $propFind->getPath())) { + $propFind->setPath(str_replace('systemtags-assigned/', 'systemtags/', $propFind->getPath())); + } + $propFind->handle(self::ID_PROPERTYNAME, function () use ($node) { return $node->getSystemTag()->getId(); }); @@ -258,6 +265,16 @@ class SystemTagPlugin extends \Sabre\DAV\ServerPlugin { } return implode('|', $groups); }); + + if ($node instanceof SystemTagNode) { + $propFind->handle(self::NUM_FILES_PROPERTYNAME, function () use ($node): int { + return $node->getNumberOfFiles(); + }); + + $propFind->handle(self::FILEID_PROPERTYNAME, function () use ($node): int { + return $node->getReferenceFileId(); + }); + } } /** @@ -279,6 +296,8 @@ class SystemTagPlugin extends \Sabre\DAV\ServerPlugin { self::USERVISIBLE_PROPERTYNAME, self::USERASSIGNABLE_PROPERTYNAME, self::GROUPS_PROPERTYNAME, + self::NUM_FILES_PROPERTYNAME, + self::FILEID_PROPERTYNAME, ], function ($props) use ($node) { $tag = $node->getSystemTag(); $name = $tag->getName(); @@ -315,6 +334,11 @@ class SystemTagPlugin extends \Sabre\DAV\ServerPlugin { $this->tagManager->setTagGroups($tag, $groupIds); } + if (isset($props[self::NUM_FILES_PROPERTYNAME]) || isset($props[self::FILEID_PROPERTYNAME])) { + // read-only properties + throw new Forbidden(); + } + if ($updateTag) { $node->update($name, $userVisible, $userAssignable); } diff --git a/apps/dav/lib/SystemTag/SystemTagsInUseCollection.php b/apps/dav/lib/SystemTag/SystemTagsInUseCollection.php new file mode 100644 index 00000000000..4f1d6c58566 --- /dev/null +++ b/apps/dav/lib/SystemTag/SystemTagsInUseCollection.php @@ -0,0 +1,108 @@ +<?php + +declare(strict_types=1); + +/** + * @copyright Copyright (c) 2023 Arthur Schiwon <blizzz@arthur-schiwon.de> + * + * @author Arthur Schiwon <blizzz@arthur-schiwon.de> + * + * @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 <https://www.gnu.org/licenses/>. + * + */ + +namespace OCA\DAV\SystemTag; + +use OC\SystemTag\SystemTag; +use OC\SystemTag\SystemTagsInFilesDetector; +use OC\User\NoUserException; +use OCP\Files\IRootFolder; +use OCP\Files\NotPermittedException; +use OCP\IUserSession; +use OCP\SystemTag\ISystemTagManager; +use Sabre\DAV\Exception\Forbidden; +use Sabre\DAV\Exception\NotFound; +use Sabre\DAV\SimpleCollection; + +class SystemTagsInUseCollection extends SimpleCollection { + protected IUserSession $userSession; + protected IRootFolder $rootFolder; + protected string $mediaType; + protected ISystemTagManager $systemTagManager; + protected SystemTagsInFilesDetector $systemTagsInFilesDetector; + + /** @noinspection PhpMissingParentConstructorInspection */ + public function __construct( + IUserSession $userSession, + IRootFolder $rootFolder, + ISystemTagManager $systemTagManager, + SystemTagsInFilesDetector $systemTagsInFilesDetector, + string $mediaType = '' + ) { + $this->userSession = $userSession; + $this->rootFolder = $rootFolder; + $this->systemTagManager = $systemTagManager; + $this->mediaType = $mediaType; + $this->systemTagsInFilesDetector = $systemTagsInFilesDetector; + $this->name = 'systemtags-assigned'; + if ($this->mediaType != '') { + $this->name .= '/' . $this->mediaType; + } + } + + public function setName($name): void { + throw new Forbidden('Permission denied to rename this collection'); + } + + public function getChild($name): self { + if ($this->mediaType !== '') { + throw new NotFound('Invalid media type'); + } + return new self($this->userSession, $this->rootFolder, $this->systemTagManager, $this->systemTagsInFilesDetector, $name); + } + + /** + * @return SystemTagNode[] + * @throws NotPermittedException + * @throws Forbidden + */ + public function getChildren(): array { + $user = $this->userSession->getUser(); + $userFolder = null; + try { + if ($user) { + $userFolder = $this->rootFolder->getUserFolder($user->getUID()); + } + } catch (NoUserException $e) { + // will throw a Sabre exception in the next step. + } + if ($user === null || $userFolder === null) { + throw new Forbidden('Permission denied to read this collection'); + } + + $result = $this->systemTagsInFilesDetector->detectAssignedSystemTagsIn($userFolder, $this->mediaType); + $children = []; + foreach ($result as $tagData) { + $tag = new SystemTag((string)$tagData['id'], $tagData['name'], (bool)$tagData['visibility'], (bool)$tagData['editable']); + // read only, so we can submit the isAdmin parameter as false generally + $node = new SystemTagNode($tag, $user, false, $this->systemTagManager); + $node->setNumberOfFiles($tagData['number_files']); + $node->setReferenceFileId($tagData['ref_file_id']); + $children[] = $node; + } + return $children; + } +} diff --git a/apps/encryption/l10n/fr.js b/apps/encryption/l10n/fr.js index 96084049a02..7d510bafc0e 100644 --- a/apps/encryption/l10n/fr.js +++ b/apps/encryption/l10n/fr.js @@ -29,6 +29,9 @@ OC.L10N.register( "Missing Signature" : "Signature manquante", "one-time password for server-side-encryption" : "Mot de passe à usage unique pour le chiffrement côté serveur", "Encryption password" : "Mot de passe de chiffrement", + "The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>." : "L'administration a activé le chiffrement côté serveur. Vos fichiers ont été chiffrés en utilisant le mot de passe <strong>%s</strong>.", + "The administration enabled server-side-encryption. Your files were encrypted using the password \"%s\"." : "L'administration a activé le chiffrement côté serveur. Vos fichiers ont été chiffrés en utilisant le mot de passe \"%s\".", + "Please login to the web interface, go to the \"Security\" section of your personal settings and update your encryption password by entering this password into the \"Old log-in password\" field and your current login-password." : "Connectez-vous depuis l'interface web, allez dans la section \"sécurité\" de vos paramètres personnels et mettez à jour votre mot de passe de chiffrement en entrant ce mot de passe dans le champ \"Ancien mot de passe de connexion\" et dans votre mot de passe de connexion actuel.", "Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de décrypter ce fichier, ceci est probablement un fichier partagé. Merci de demander à son propriétaire de repartager le fichier avec vous.", "Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de lire ce fichier, ceci est probablement un fichier partagé. Merci de demander à son propriétaire de repartager le fichier avec vous.", "Default encryption module" : "Module de chiffrement par défaut", diff --git a/apps/encryption/l10n/fr.json b/apps/encryption/l10n/fr.json index 7eff4c17649..df3c7fbb965 100644 --- a/apps/encryption/l10n/fr.json +++ b/apps/encryption/l10n/fr.json @@ -27,6 +27,9 @@ "Missing Signature" : "Signature manquante", "one-time password for server-side-encryption" : "Mot de passe à usage unique pour le chiffrement côté serveur", "Encryption password" : "Mot de passe de chiffrement", + "The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>." : "L'administration a activé le chiffrement côté serveur. Vos fichiers ont été chiffrés en utilisant le mot de passe <strong>%s</strong>.", + "The administration enabled server-side-encryption. Your files were encrypted using the password \"%s\"." : "L'administration a activé le chiffrement côté serveur. Vos fichiers ont été chiffrés en utilisant le mot de passe \"%s\".", + "Please login to the web interface, go to the \"Security\" section of your personal settings and update your encryption password by entering this password into the \"Old log-in password\" field and your current login-password." : "Connectez-vous depuis l'interface web, allez dans la section \"sécurité\" de vos paramètres personnels et mettez à jour votre mot de passe de chiffrement en entrant ce mot de passe dans le champ \"Ancien mot de passe de connexion\" et dans votre mot de passe de connexion actuel.", "Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de décrypter ce fichier, ceci est probablement un fichier partagé. Merci de demander à son propriétaire de repartager le fichier avec vous.", "Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de lire ce fichier, ceci est probablement un fichier partagé. Merci de demander à son propriétaire de repartager le fichier avec vous.", "Default encryption module" : "Module de chiffrement par défaut", diff --git a/apps/federatedfilesharing/js/external.js b/apps/federatedfilesharing/js/external.js index 577fed21bac..ecec4d038b2 100644 --- a/apps/federatedfilesharing/js/external.js +++ b/apps/federatedfilesharing/js/external.js @@ -65,8 +65,8 @@ var $buttons = $dialog.find('button'); // hack the buttons $dialog.find('.ui-icon').remove(); - $buttons.eq(0).text(t('core', 'Cancel')); - $buttons.eq(1).text(t('files_sharing', 'Add remote share')); + $buttons.eq(1).text(t('core', 'Cancel')); + $buttons.eq(2).text(t('files_sharing', 'Add remote share')); }; OCA.Sharing.ExternalShareDialogPlugin = { diff --git a/apps/files/js/app.js b/apps/files/js/app.js index 1806a13da19..f6cd12cab2a 100644 --- a/apps/files/js/app.js +++ b/apps/files/js/app.js @@ -371,9 +371,9 @@ this.navigation.setActiveItem(params.view, {silent: true}); if (lastId !== this.navigation.getActiveItem()) { this.navigation.getActiveContainer().trigger(new $.Event('show')); + window._nc_event_bus.emit('files:navigation:changed') } this.navigation.getActiveContainer().trigger(new $.Event('urlChanged', params)); - window._nc_event_bus.emit('files:navigation:changed') }, /** diff --git a/apps/files/src/files-app-settings.js b/apps/files/src/files-app-settings.js index 491ea127ccd..e38600feebe 100644 --- a/apps/files/src/files-app-settings.js +++ b/apps/files/src/files-app-settings.js @@ -52,6 +52,7 @@ window.addEventListener('DOMContentLoaded', function() { appSettingsHeader.addEventListener('click', e => { const opened = e.currentTarget.children[0].classList.contains('opened') OCA.Files.Settings.settings.forEach(e => opened ? e.close() : e.open()) + e.currentTarget?.children?.[0]?.setAttribute?.('aria-expanded', opened ? 'false' : 'true') }) } }) diff --git a/apps/files/templates/appnavigation.php b/apps/files/templates/appnavigation.php index 5684c3d0d32..c3448afdef2 100644 --- a/apps/files/templates/appnavigation.php +++ b/apps/files/templates/appnavigation.php @@ -30,11 +30,13 @@ <div id="app-settings"> <div id="app-settings-header"> <button class="settings-button" + aria-expanded="false" + aria-controls="app-settings-content" data-apps-slide-toggle="#app-settings-content"> <?php p($l->t('Files settings')); ?> </button> </div> - <div id="app-settings-content"> + <div id="app-settings-content" role="region" aria-labelledby="app-settings-header"> <div id="files-app-settings"></div> <div id="files-setting-showhidden"> <input class="checkbox" id="showhiddenfilesToggle" diff --git a/apps/files_external/css/external.css b/apps/files_external/css/external.css index 489cd630fb9..ea26e879a0f 100644 --- a/apps/files_external/css/external.css +++ b/apps/files_external/css/external.css @@ -1,3 +1,4 @@ .files-filestable tbody tr.externalErroredRow { - background-color: #F2DEDE; + /* TODO: As soon as firefox supports it: color-mix(in srgb, var(--color-error) 15%, var(--color-main-background)) */ + background-color: rgba(255, 0, 0, 0.13); } diff --git a/apps/files_external/lib/Command/Notify.php b/apps/files_external/lib/Command/Notify.php index 340dd2fdca1..9b7bf656d7f 100644 --- a/apps/files_external/lib/Command/Notify.php +++ b/apps/files_external/lib/Command/Notify.php @@ -333,7 +333,10 @@ class Notify extends Base { private function selfTest(IStorage $storage, INotifyHandler $notifyHandler, OutputInterface $output) { usleep(100 * 1000); //give time for the notify to start - $storage->file_put_contents('/.nc_test_file.txt', 'test content'); + if (!$storage->file_put_contents('/.nc_test_file.txt', 'test content')) { + $output->writeln("Failed to create test file for self-test"); + return; + } $storage->mkdir('/.nc_test_folder'); $storage->file_put_contents('/.nc_test_folder/subfile.txt', 'test content'); diff --git a/apps/settings/l10n/es.js b/apps/settings/l10n/es.js index 43e54e37e1c..792d0bd63fb 100644 --- a/apps/settings/l10n/es.js +++ b/apps/settings/l10n/es.js @@ -45,8 +45,8 @@ OC.L10N.register( "You granted filesystem access to app password \"{token}\"" : "Has concedido acceso al sistema de archivos a la contraseña de app \"{token}\"", "You revoked filesystem access from app password \"{token}\"" : "Has revocado el acceso al sistema de archivos a la contraseña de app \"{token}\"", "Security" : "Seguridad", - "You successfully logged in using two-factor authentication (%1$s)" : "Has iniciado sesión usando la verificación en dos pasos (%1$s)", - "A login attempt using two-factor authentication failed (%1$s)" : "El intento de inicio de sesión usando la autenticación en dos pasos (%1$s) ha fallado", + "You successfully logged in using two-factor authentication (%1$s)" : "Has iniciado sesión usando autenticación de dos factores (%1$s)", + "A login attempt using two-factor authentication failed (%1$s)" : "El intento de inicio de sesión usando autenticación de dos factores (%1$s) ha fallado", "Remote wipe was started on %1$s" : "El borrado remoto se inició en %1$s", "Remote wipe has finished on %1$s" : "El borrado remoto finalizó en %1$s", "Your <strong>password</strong> or <strong>email</strong> was modified" : "Tu <strong>contraseña</strong> o <strong>dirección de correo</strong> fue modificada", @@ -151,14 +151,14 @@ OC.L10N.register( "Here you can decide which group can access certain sections of the administration settings." : "Aquí puedes decidir qué grupo puede acceder a determinadas secciones de la configuración de administración.", "None" : "Ninguno", "Unable to modify setting" : "No se ha podido modificar la configuración", - "Two-Factor Authentication" : "Verificación en dos pasos", - "Two-factor authentication can be enforced for all users and specific groups. If they do not have a two-factor provider configured, they will be unable to log into the system." : "La verificación en dos pasos se puede aplicar para todos los usuarios y grupos específicos. Si no tienen configurado un proveedor de dos pasos, no podrán iniciar sesión en el sistema.", - "Enforce two-factor authentication" : "Imponer verificación en dos pasos", + "Two-Factor Authentication" : "Autenticación de dos factores", + "Two-factor authentication can be enforced for all users and specific groups. If they do not have a two-factor provider configured, they will be unable to log into the system." : "La autenticación de dos factores se puede aplicar para todos los usuarios y grupos específicos. Si no tienen configurado un proveedor de dos factores, no podrán iniciar sesión en el sistema.", + "Enforce two-factor authentication" : "Hacer obligatoria la autenticación de dos factores", "Limit to groups" : "Límite para grupos", - "Enforcement of two-factor authentication can be set for certain groups only." : "La obligatoriedad de la autenticación de dos pasos puede establecerse solo para ciertos grupos.", - "Two-factor authentication is enforced for all members of the following groups." : "La autenticación de dos pasos es obligatoria para todos los miembros de los siguientes grupos.", + "Enforcement of two-factor authentication can be set for certain groups only." : "La obligatoriedad de la autenticación de dos factores puede establecerse solo para ciertos grupos.", + "Two-factor authentication is enforced for all members of the following groups." : "La autenticación de dos factores es obligatoria para todos los miembros de los siguientes grupos.", "Enforced groups" : "Grupos obligados", - "Two-factor authentication is not enforced for members of the following groups." : "La autenticación de dos pasos no es obligatoria para los miembros de los siguientes grupos.", + "Two-factor authentication is not enforced for members of the following groups." : "La autenticación de dos factores no es obligatoria para los miembros de los siguientes grupos.", "Excluded groups" : "Grupos excluidos", "When groups are selected/excluded, they use the following logic to determine if a user has 2FA enforced: If no groups are selected, 2FA is enabled for everyone except members of the excluded groups. If groups are selected, 2FA is enabled for all members of these. If a user is both in a selected and excluded group, the selected takes precedence and 2FA is enforced." : "Cuando los grupos se seleccionan/excluyen, usan la siguiente lógica para determinar si un usuario tiene obligada la 2FA: si no hay grupos seleccionados, 2FA está activa para todos excepto los miembros de los grupos excluidos. Si hay grupos seleccionados, 2FA está activa para todos los miembros de estos. Si un usuaro está a la vez en un grupo seleccionado y otro excluido, el seleccionado tiene preferencia y se obliga la 2FA.", "Save changes" : "Guardar cambios", @@ -314,7 +314,7 @@ OC.L10N.register( "No language set" : "No se ha marcado idioma", "Locale" : "Región", "Week starts on {firstDayOfWeek}" : "La semana comienza en {firstDayOfWeek}", - "Unable to update locale" : "Imposible actualizar el idioma", + "Unable to update locale" : "No fue posible actualizar el idioma", "No locale set" : "No se ha establecido el idioma", "Your location" : "Su ubicación", "Your organisation" : "Tu organización", diff --git a/apps/settings/l10n/es.json b/apps/settings/l10n/es.json index f28883bb8b0..2748f2daf6b 100644 --- a/apps/settings/l10n/es.json +++ b/apps/settings/l10n/es.json @@ -43,8 +43,8 @@ "You granted filesystem access to app password \"{token}\"" : "Has concedido acceso al sistema de archivos a la contraseña de app \"{token}\"", "You revoked filesystem access from app password \"{token}\"" : "Has revocado el acceso al sistema de archivos a la contraseña de app \"{token}\"", "Security" : "Seguridad", - "You successfully logged in using two-factor authentication (%1$s)" : "Has iniciado sesión usando la verificación en dos pasos (%1$s)", - "A login attempt using two-factor authentication failed (%1$s)" : "El intento de inicio de sesión usando la autenticación en dos pasos (%1$s) ha fallado", + "You successfully logged in using two-factor authentication (%1$s)" : "Has iniciado sesión usando autenticación de dos factores (%1$s)", + "A login attempt using two-factor authentication failed (%1$s)" : "El intento de inicio de sesión usando autenticación de dos factores (%1$s) ha fallado", "Remote wipe was started on %1$s" : "El borrado remoto se inició en %1$s", "Remote wipe has finished on %1$s" : "El borrado remoto finalizó en %1$s", "Your <strong>password</strong> or <strong>email</strong> was modified" : "Tu <strong>contraseña</strong> o <strong>dirección de correo</strong> fue modificada", @@ -149,14 +149,14 @@ "Here you can decide which group can access certain sections of the administration settings." : "Aquí puedes decidir qué grupo puede acceder a determinadas secciones de la configuración de administración.", "None" : "Ninguno", "Unable to modify setting" : "No se ha podido modificar la configuración", - "Two-Factor Authentication" : "Verificación en dos pasos", - "Two-factor authentication can be enforced for all users and specific groups. If they do not have a two-factor provider configured, they will be unable to log into the system." : "La verificación en dos pasos se puede aplicar para todos los usuarios y grupos específicos. Si no tienen configurado un proveedor de dos pasos, no podrán iniciar sesión en el sistema.", - "Enforce two-factor authentication" : "Imponer verificación en dos pasos", + "Two-Factor Authentication" : "Autenticación de dos factores", + "Two-factor authentication can be enforced for all users and specific groups. If they do not have a two-factor provider configured, they will be unable to log into the system." : "La autenticación de dos factores se puede aplicar para todos los usuarios y grupos específicos. Si no tienen configurado un proveedor de dos factores, no podrán iniciar sesión en el sistema.", + "Enforce two-factor authentication" : "Hacer obligatoria la autenticación de dos factores", "Limit to groups" : "Límite para grupos", - "Enforcement of two-factor authentication can be set for certain groups only." : "La obligatoriedad de la autenticación de dos pasos puede establecerse solo para ciertos grupos.", - "Two-factor authentication is enforced for all members of the following groups." : "La autenticación de dos pasos es obligatoria para todos los miembros de los siguientes grupos.", + "Enforcement of two-factor authentication can be set for certain groups only." : "La obligatoriedad de la autenticación de dos factores puede establecerse solo para ciertos grupos.", + "Two-factor authentication is enforced for all members of the following groups." : "La autenticación de dos factores es obligatoria para todos los miembros de los siguientes grupos.", "Enforced groups" : "Grupos obligados", - "Two-factor authentication is not enforced for members of the following groups." : "La autenticación de dos pasos no es obligatoria para los miembros de los siguientes grupos.", + "Two-factor authentication is not enforced for members of the following groups." : "La autenticación de dos factores no es obligatoria para los miembros de los siguientes grupos.", "Excluded groups" : "Grupos excluidos", "When groups are selected/excluded, they use the following logic to determine if a user has 2FA enforced: If no groups are selected, 2FA is enabled for everyone except members of the excluded groups. If groups are selected, 2FA is enabled for all members of these. If a user is both in a selected and excluded group, the selected takes precedence and 2FA is enforced." : "Cuando los grupos se seleccionan/excluyen, usan la siguiente lógica para determinar si un usuario tiene obligada la 2FA: si no hay grupos seleccionados, 2FA está activa para todos excepto los miembros de los grupos excluidos. Si hay grupos seleccionados, 2FA está activa para todos los miembros de estos. Si un usuaro está a la vez en un grupo seleccionado y otro excluido, el seleccionado tiene preferencia y se obliga la 2FA.", "Save changes" : "Guardar cambios", @@ -312,7 +312,7 @@ "No language set" : "No se ha marcado idioma", "Locale" : "Región", "Week starts on {firstDayOfWeek}" : "La semana comienza en {firstDayOfWeek}", - "Unable to update locale" : "Imposible actualizar el idioma", + "Unable to update locale" : "No fue posible actualizar el idioma", "No locale set" : "No se ha establecido el idioma", "Your location" : "Su ubicación", "Your organisation" : "Tu organización", diff --git a/apps/settings/l10n/sv.js b/apps/settings/l10n/sv.js index c2236592032..98a5db52ad3 100644 --- a/apps/settings/l10n/sv.js +++ b/apps/settings/l10n/sv.js @@ -342,6 +342,7 @@ OC.L10N.register( "Set user as admin for" : "Gör användare till admin för", "Select user quota" : "Välj användarens quota", "Set the language" : "Ställ in språk", + "Select manager" : "Välj chef", "Delete user" : "Ta bort användare", "Wipe all devices" : "Rensa alla enheter", "Disable user" : "Stäng av användare", @@ -369,6 +370,7 @@ OC.L10N.register( "User backend" : "Användarbackend", "Storage location" : "Lagringsplats", "Last login" : "Senaste inloggning", + "Manager" : "Chef", "No users in here" : "Inga användare här", "Default quota" : "Standard kvot", "Common languages" : "Vanliga språk", diff --git a/apps/settings/l10n/sv.json b/apps/settings/l10n/sv.json index 61a0478a1ae..c1e8bdae1e5 100644 --- a/apps/settings/l10n/sv.json +++ b/apps/settings/l10n/sv.json @@ -340,6 +340,7 @@ "Set user as admin for" : "Gör användare till admin för", "Select user quota" : "Välj användarens quota", "Set the language" : "Ställ in språk", + "Select manager" : "Välj chef", "Delete user" : "Ta bort användare", "Wipe all devices" : "Rensa alla enheter", "Disable user" : "Stäng av användare", @@ -367,6 +368,7 @@ "User backend" : "Användarbackend", "Storage location" : "Lagringsplats", "Last login" : "Senaste inloggning", + "Manager" : "Chef", "No users in here" : "Inga användare här", "Default quota" : "Standard kvot", "Common languages" : "Vanliga språk", diff --git a/apps/twofactor_backupcodes/l10n/es.js b/apps/twofactor_backupcodes/l10n/es.js index 5e1b832c9df..e62371145da 100644 --- a/apps/twofactor_backupcodes/l10n/es.js +++ b/apps/twofactor_backupcodes/l10n/es.js @@ -1,14 +1,14 @@ OC.L10N.register( "twofactor_backupcodes", { - "You created two-factor backup codes for your account" : "Has creado códigos de respaldo para la verificación en dos pasos de tu cuenta", + "You created two-factor backup codes for your account" : "Has creado códigos de respaldo para la autenticación de dos factores para tu cuenta", "Second-factor backup codes" : "Códigos de respaldo para verificación en dos pasos", "Generate backup codes" : "Generar códigos de respaldo", - "You enabled two-factor authentication but did not generate backup codes yet. They are needed to restore access to your account in case you lose your second factor." : "Has habilitado la verificación en dos pasos pero no has generado aún los códigos de respaldo. Son necesarios para acceder a tu cuenta en caso de pérdida del segundo paso.", + "You enabled two-factor authentication but did not generate backup codes yet. They are needed to restore access to your account in case you lose your second factor." : "Ha habilitado la autenticación de dos factores pero no ha generado aún los códigos de respaldo. Estos son necesarios para acceder a su cuenta en caso de pérdida del segundo factor.", "Backup code" : "Código de respaldo", "Use backup code" : "Usar código de respaldo", "Two factor backup codes" : "Códigos de respaldo de la verificación en dos pasos", - "A two-factor auth backup codes provider" : "Un proveedor de códigos respaldo para verificación en dos pasos", + "A two-factor auth backup codes provider" : "Un proveedor de códigos respaldo para autenticación de dos factores", "Backup codes have been generated. {used} of {total} codes have been used." : "Se han generado códigos de respaldo. Se han usado {used} de {total} códigos.", "These are your backup codes. Please save and/or print them as you will not be able to read the codes again later" : "Estos son sus códigos de respaldo. Por favor guardelos y/o imprimalos ya que no podrá obtenerlos de nuevo.", "Save backup codes" : "Guardar códigos de respaldo", @@ -17,7 +17,7 @@ OC.L10N.register( "If you regenerate backup codes, you automatically invalidate old codes." : "Si regenera los códigos de respaldo, automáticamente invalidarás los antiguos.", "An error occurred while generating your backup codes" : "Ha ocurrido un error mientras se generaban los códigos de respaldo.", "{name} backup codes" : "Códigos de respaldo {name}", - "Use one of the backup codes you saved when setting up two-factor authentication." : "Usa uno de los códigos de respaldo que guardaste cuando activaste la verificación en dos pasos.", + "Use one of the backup codes you saved when setting up two-factor authentication." : "Usa uno de los códigos de respaldo que guardaste cuando activaste la autenticación de dos factores.", "Submit" : "Enviar" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/twofactor_backupcodes/l10n/es.json b/apps/twofactor_backupcodes/l10n/es.json index f57e5baabd4..e67750ab28f 100644 --- a/apps/twofactor_backupcodes/l10n/es.json +++ b/apps/twofactor_backupcodes/l10n/es.json @@ -1,12 +1,12 @@ { "translations": { - "You created two-factor backup codes for your account" : "Has creado códigos de respaldo para la verificación en dos pasos de tu cuenta", + "You created two-factor backup codes for your account" : "Has creado códigos de respaldo para la autenticación de dos factores para tu cuenta", "Second-factor backup codes" : "Códigos de respaldo para verificación en dos pasos", "Generate backup codes" : "Generar códigos de respaldo", - "You enabled two-factor authentication but did not generate backup codes yet. They are needed to restore access to your account in case you lose your second factor." : "Has habilitado la verificación en dos pasos pero no has generado aún los códigos de respaldo. Son necesarios para acceder a tu cuenta en caso de pérdida del segundo paso.", + "You enabled two-factor authentication but did not generate backup codes yet. They are needed to restore access to your account in case you lose your second factor." : "Ha habilitado la autenticación de dos factores pero no ha generado aún los códigos de respaldo. Estos son necesarios para acceder a su cuenta en caso de pérdida del segundo factor.", "Backup code" : "Código de respaldo", "Use backup code" : "Usar código de respaldo", "Two factor backup codes" : "Códigos de respaldo de la verificación en dos pasos", - "A two-factor auth backup codes provider" : "Un proveedor de códigos respaldo para verificación en dos pasos", + "A two-factor auth backup codes provider" : "Un proveedor de códigos respaldo para autenticación de dos factores", "Backup codes have been generated. {used} of {total} codes have been used." : "Se han generado códigos de respaldo. Se han usado {used} de {total} códigos.", "These are your backup codes. Please save and/or print them as you will not be able to read the codes again later" : "Estos son sus códigos de respaldo. Por favor guardelos y/o imprimalos ya que no podrá obtenerlos de nuevo.", "Save backup codes" : "Guardar códigos de respaldo", @@ -15,7 +15,7 @@ "If you regenerate backup codes, you automatically invalidate old codes." : "Si regenera los códigos de respaldo, automáticamente invalidarás los antiguos.", "An error occurred while generating your backup codes" : "Ha ocurrido un error mientras se generaban los códigos de respaldo.", "{name} backup codes" : "Códigos de respaldo {name}", - "Use one of the backup codes you saved when setting up two-factor authentication." : "Usa uno de los códigos de respaldo que guardaste cuando activaste la verificación en dos pasos.", + "Use one of the backup codes you saved when setting up two-factor authentication." : "Usa uno de los códigos de respaldo que guardaste cuando activaste la autenticación de dos factores.", "Submit" : "Enviar" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/user_ldap/lib/User_LDAP.php b/apps/user_ldap/lib/User_LDAP.php index 650c974da81..85c67ac55eb 100644 --- a/apps/user_ldap/lib/User_LDAP.php +++ b/apps/user_ldap/lib/User_LDAP.php @@ -335,8 +335,6 @@ class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, I return false; } $this->access->getUserMapper()->setDNbyUUID($newDn, $uuid); - $this->access->connection->writeToCache($cacheKey, true); - return true; } catch (ServerNotAvailableException $e) { throw $e; } catch (\Exception $e) { diff --git a/apps/user_status/l10n/cs.js b/apps/user_status/l10n/cs.js index 4849b1682ec..b53b7ec69ff 100644 --- a/apps/user_status/l10n/cs.js +++ b/apps/user_status/l10n/cs.js @@ -11,7 +11,9 @@ OC.L10N.register( "User status" : "Stav uživatele", "View profile" : "Zobrazit profil ", "Clear status after" : "Vyčistit stav po uplynutí", + "Emoji for your status message" : "Emotikona pro vaší stavovou zprávu", "What is your status?" : "Jaký je váš stav?", + "Predefined statuses" : "Předdefinované stavy", "Previously set" : "Dříve nastavené", "Set status" : "Nastavit stav", "Online status" : "Stav online", diff --git a/apps/user_status/l10n/cs.json b/apps/user_status/l10n/cs.json index 16331053d55..9f52e343949 100644 --- a/apps/user_status/l10n/cs.json +++ b/apps/user_status/l10n/cs.json @@ -9,7 +9,9 @@ "User status" : "Stav uživatele", "View profile" : "Zobrazit profil ", "Clear status after" : "Vyčistit stav po uplynutí", + "Emoji for your status message" : "Emotikona pro vaší stavovou zprávu", "What is your status?" : "Jaký je váš stav?", + "Predefined statuses" : "Předdefinované stavy", "Previously set" : "Dříve nastavené", "Set status" : "Nastavit stav", "Online status" : "Stav online", diff --git a/apps/user_status/l10n/de_DE.js b/apps/user_status/l10n/de_DE.js index 32c8fee517a..ff7d5472090 100644 --- a/apps/user_status/l10n/de_DE.js +++ b/apps/user_status/l10n/de_DE.js @@ -11,7 +11,9 @@ OC.L10N.register( "User status" : "Benutzerstatus", "View profile" : "Profil ansehen", "Clear status after" : "Status löschen nach", + "Emoji for your status message" : "Emoji für Ihre Statusnachricht", "What is your status?" : "Wie ist Ihr Status?", + "Predefined statuses" : "Vordefinierte Status", "Previously set" : "Zuvor eingestellt", "Reset status" : "Status zurücksetzen", "Set status" : "Status setzen", diff --git a/apps/user_status/l10n/de_DE.json b/apps/user_status/l10n/de_DE.json index badb4dc7e34..3b5f14a8d1f 100644 --- a/apps/user_status/l10n/de_DE.json +++ b/apps/user_status/l10n/de_DE.json @@ -9,7 +9,9 @@ "User status" : "Benutzerstatus", "View profile" : "Profil ansehen", "Clear status after" : "Status löschen nach", + "Emoji for your status message" : "Emoji für Ihre Statusnachricht", "What is your status?" : "Wie ist Ihr Status?", + "Predefined statuses" : "Vordefinierte Status", "Previously set" : "Zuvor eingestellt", "Reset status" : "Status zurücksetzen", "Set status" : "Status setzen", diff --git a/apps/user_status/l10n/es.js b/apps/user_status/l10n/es.js index 86fdd4d3fef..bf6bf17c949 100644 --- a/apps/user_status/l10n/es.js +++ b/apps/user_status/l10n/es.js @@ -11,7 +11,9 @@ OC.L10N.register( "User status" : "Estado del usuario", "View profile" : "Ver perfil", "Clear status after" : "Eliminar el estado después de", + "Emoji for your status message" : "Emoji para sus mensaje de estado", "What is your status?" : "¿Cuál es su estado?", + "Predefined statuses" : "Estados predefinidos", "Previously set" : "Previamente definido", "Reset status" : "Re-inicializar estado", "Set status" : "Configurar estado", diff --git a/apps/user_status/l10n/es.json b/apps/user_status/l10n/es.json index 8d759ff6e44..5a47dd2a512 100644 --- a/apps/user_status/l10n/es.json +++ b/apps/user_status/l10n/es.json @@ -9,7 +9,9 @@ "User status" : "Estado del usuario", "View profile" : "Ver perfil", "Clear status after" : "Eliminar el estado después de", + "Emoji for your status message" : "Emoji para sus mensaje de estado", "What is your status?" : "¿Cuál es su estado?", + "Predefined statuses" : "Estados predefinidos", "Previously set" : "Previamente definido", "Reset status" : "Re-inicializar estado", "Set status" : "Configurar estado", diff --git a/apps/user_status/l10n/fi.js b/apps/user_status/l10n/fi.js index 8196a40797a..ea0df4e35c3 100644 --- a/apps/user_status/l10n/fi.js +++ b/apps/user_status/l10n/fi.js @@ -11,14 +11,23 @@ OC.L10N.register( "User status" : "Käyttäjän tilatieto", "View profile" : "Näytä profiili", "Clear status after" : "Tyhjennä tilatieto", + "Emoji for your status message" : "Emoji tilaviestiisi", "What is your status?" : "Mikä on tilatietosi?", + "Predefined statuses" : "Ennalta määritellyt tilatiedot", + "Previously set" : "Aiemmin asetettu", + "Reset status" : "Palauta tilatieto", "Set status" : "Aseta tilatieto", "Online status" : "Online-tila", "Status message" : "Tilaviesti", + "Your status was set automatically" : "Tilatietosi asetettiin automaattisesti", "Clear status message" : "Tyhjennä tilaviesti", "Set status message" : "Aseta tilaviesti", + "Reset status to \"{icon} {message}\"" : "Palauta tilatiedoksi \"{icon} {message}\"", + "Reset status to \"{message}\"" : "Palauta tilatiedoksi \"{message}\"", + "Reset status to \"{icon}\"" : "Palauta tilatiedoksi \"{icon}\"", "There was an error saving the status" : "Tilatiedon tallentamisessa tapahtui virhe", "There was an error clearing the status" : "Tilatietoa tyhjentäessä tapahtui virhe", + "There was an error reverting the status" : "Tilatietoa palauttaessa tapahtui virhe", "No recent status changes" : "Ei viimeisimpiä tilatietomuutoksia", "Away" : "Poissa", "Do not disturb" : "Älä häiritse", diff --git a/apps/user_status/l10n/fi.json b/apps/user_status/l10n/fi.json index 5b732504549..57089a67d68 100644 --- a/apps/user_status/l10n/fi.json +++ b/apps/user_status/l10n/fi.json @@ -9,14 +9,23 @@ "User status" : "Käyttäjän tilatieto", "View profile" : "Näytä profiili", "Clear status after" : "Tyhjennä tilatieto", + "Emoji for your status message" : "Emoji tilaviestiisi", "What is your status?" : "Mikä on tilatietosi?", + "Predefined statuses" : "Ennalta määritellyt tilatiedot", + "Previously set" : "Aiemmin asetettu", + "Reset status" : "Palauta tilatieto", "Set status" : "Aseta tilatieto", "Online status" : "Online-tila", "Status message" : "Tilaviesti", + "Your status was set automatically" : "Tilatietosi asetettiin automaattisesti", "Clear status message" : "Tyhjennä tilaviesti", "Set status message" : "Aseta tilaviesti", + "Reset status to \"{icon} {message}\"" : "Palauta tilatiedoksi \"{icon} {message}\"", + "Reset status to \"{message}\"" : "Palauta tilatiedoksi \"{message}\"", + "Reset status to \"{icon}\"" : "Palauta tilatiedoksi \"{icon}\"", "There was an error saving the status" : "Tilatiedon tallentamisessa tapahtui virhe", "There was an error clearing the status" : "Tilatietoa tyhjentäessä tapahtui virhe", + "There was an error reverting the status" : "Tilatietoa palauttaessa tapahtui virhe", "No recent status changes" : "Ei viimeisimpiä tilatietomuutoksia", "Away" : "Poissa", "Do not disturb" : "Älä häiritse", diff --git a/apps/user_status/l10n/fr.js b/apps/user_status/l10n/fr.js index a9194f4da65..d1f23ce3022 100644 --- a/apps/user_status/l10n/fr.js +++ b/apps/user_status/l10n/fr.js @@ -12,11 +12,17 @@ OC.L10N.register( "View profile" : "Voir le profil", "Clear status after" : "Effacer l'état après", "What is your status?" : "Quel est votre statut ?", + "Previously set" : "Précédemment défini", + "Reset status" : "Réinitialiser l'état", "Set status" : "Définir le statut", "Online status" : "Statut en ligne", "Status message" : "Message d'état", + "Your status was set automatically" : "Votre état a été automatiquement défini", "Clear status message" : "Effacer le message d'état", "Set status message" : "Enregistrer le message d'état", + "Reset status to \"{icon} {message}\"" : "Réinitialiser l'état en \"{icon} {message}\"", + "Reset status to \"{message}\"" : "Réinitialiser l'état en \"{message}\"", + "Reset status to \"{icon}\"" : "Réinitialiser l'état en \"{icon}\"", "There was an error saving the status" : "Une erreur s'est produite lors de l'enregistrement de l'état", "There was an error clearing the status" : "Une erreur s'est produite lors de l'effacement de l'état", "No recent status changes" : "Aucun changement de statut récent", diff --git a/apps/user_status/l10n/fr.json b/apps/user_status/l10n/fr.json index 5ab97c90ad7..207bf27c43f 100644 --- a/apps/user_status/l10n/fr.json +++ b/apps/user_status/l10n/fr.json @@ -10,11 +10,17 @@ "View profile" : "Voir le profil", "Clear status after" : "Effacer l'état après", "What is your status?" : "Quel est votre statut ?", + "Previously set" : "Précédemment défini", + "Reset status" : "Réinitialiser l'état", "Set status" : "Définir le statut", "Online status" : "Statut en ligne", "Status message" : "Message d'état", + "Your status was set automatically" : "Votre état a été automatiquement défini", "Clear status message" : "Effacer le message d'état", "Set status message" : "Enregistrer le message d'état", + "Reset status to \"{icon} {message}\"" : "Réinitialiser l'état en \"{icon} {message}\"", + "Reset status to \"{message}\"" : "Réinitialiser l'état en \"{message}\"", + "Reset status to \"{icon}\"" : "Réinitialiser l'état en \"{icon}\"", "There was an error saving the status" : "Une erreur s'est produite lors de l'enregistrement de l'état", "There was an error clearing the status" : "Une erreur s'est produite lors de l'effacement de l'état", "No recent status changes" : "Aucun changement de statut récent", diff --git a/apps/user_status/l10n/sr.js b/apps/user_status/l10n/sr.js index 7fe50e8e8d2..9ce5af4950b 100644 --- a/apps/user_status/l10n/sr.js +++ b/apps/user_status/l10n/sr.js @@ -11,7 +11,9 @@ OC.L10N.register( "User status" : "Корисников статус", "View profile" : "Погледај профил", "Clear status after" : "Обриши статус након", + "Emoji for your status message" : "Емођи за вашу статусну поруку", "What is your status?" : "Који је ваш статус?", + "Predefined statuses" : "Предефинисани статуси", "Previously set" : "Претходно постављено", "Reset status" : "Ресетуј статус", "Set status" : "Постави статус", diff --git a/apps/user_status/l10n/sr.json b/apps/user_status/l10n/sr.json index 40e0d5b2753..39930a039c6 100644 --- a/apps/user_status/l10n/sr.json +++ b/apps/user_status/l10n/sr.json @@ -9,7 +9,9 @@ "User status" : "Корисников статус", "View profile" : "Погледај профил", "Clear status after" : "Обриши статус након", + "Emoji for your status message" : "Емођи за вашу статусну поруку", "What is your status?" : "Који је ваш статус?", + "Predefined statuses" : "Предефинисани статуси", "Previously set" : "Претходно постављено", "Reset status" : "Ресетуј статус", "Set status" : "Постави статус", diff --git a/apps/user_status/l10n/sv.js b/apps/user_status/l10n/sv.js index 1b843f10a61..a014e72cc71 100644 --- a/apps/user_status/l10n/sv.js +++ b/apps/user_status/l10n/sv.js @@ -11,7 +11,9 @@ OC.L10N.register( "User status" : "Användarstatus", "View profile" : "Visa profil", "Clear status after" : "Rensa status efter", + "Emoji for your status message" : "Emoji för ditt statusmeddelande", "What is your status?" : "Vad är din status?", + "Predefined statuses" : "Fördefinierade statusar", "Previously set" : "Tidigare inställd", "Reset status" : "Återställ status", "Set status" : "Sätt status", diff --git a/apps/user_status/l10n/sv.json b/apps/user_status/l10n/sv.json index 7ef6eac4f9a..6892f70e86c 100644 --- a/apps/user_status/l10n/sv.json +++ b/apps/user_status/l10n/sv.json @@ -9,7 +9,9 @@ "User status" : "Användarstatus", "View profile" : "Visa profil", "Clear status after" : "Rensa status efter", + "Emoji for your status message" : "Emoji för ditt statusmeddelande", "What is your status?" : "Vad är din status?", + "Predefined statuses" : "Fördefinierade statusar", "Previously set" : "Tidigare inställd", "Reset status" : "Återställ status", "Set status" : "Sätt status", diff --git a/core/l10n/es.js b/core/l10n/es.js index 4fc69495dcd..2e69632d692 100644 --- a/core/l10n/es.js +++ b/core/l10n/es.js @@ -381,13 +381,13 @@ OC.L10N.register( "Email address" : "Dirección de correo", "Password sent!" : "¡Contraseña enviada!", "You are not authorized to request a password for this share" : "No está autorizado a solicitar una contraseña para esta acción", - "Two-factor authentication" : "Verificación en dos pasos", + "Two-factor authentication" : "Autenticación de dos factores", "Enhanced security is enabled for your account. Choose a second factor for authentication:" : "La seguridad mejorada está habilitada para su cuenta. Elija una segunda forma de autenticación:", - "Could not load at least one of your enabled two-factor auth methods. Please contact your admin." : "No se pudo cargar al menos uno de sus métodos de autenticación de segundo paso. Por favor, póngase en contacto con un administrador.", - "Two-factor authentication is enforced but has not been configured on your account. Contact your admin for assistance." : "La autenticación en dos pasos es obligatoria pero no se ha configurado en su cuenta. Póngase en contacto con su administrador para obtener ayuda.", + "Could not load at least one of your enabled two-factor auth methods. Please contact your admin." : "No se pudo cargar al menos uno de sus métodos de autenticación de dos factores. Por favor, póngase en contacto con un administrador.", + "Two-factor authentication is enforced but has not been configured on your account. Contact your admin for assistance." : "La autenticación de dos factores es obligatoria pero no se ha configurado en su cuenta. Póngase en contacto con su administrador para obtener ayuda.", "Two-factor authentication is enforced but has not been configured on your account. Please continue to setup two-factor authentication." : "La autenticación de dos factores es obligatoria pero no se ha configurado en tu cuenta. Por favor, continúa para configurar la autenticación de dos factores.", "Set up two-factor authentication" : "Configurar autenticación de dos factores", - "Two-factor authentication is enforced but has not been configured on your account. Use one of your backup codes to log in or contact your admin for assistance." : "La autenticación en dos pasos es obligatoria pero no se ha configurado en su cuenta. Use uno de sus códigos de respaldo para iniciar sesión o comuníquese con su administrador para obtener ayuda.", + "Two-factor authentication is enforced but has not been configured on your account. Use one of your backup codes to log in or contact your admin for assistance." : "La autenticación de dos factores es obligatoria pero no se ha configurado en su cuenta. Use uno de sus códigos de respaldo para iniciar sesión o comuníquese con su administrador para obtener ayuda.", "Use backup code" : "Usar código de respaldo", "Cancel login" : "Cancelar inicio de sesión", "Enhanced security is enforced for your account. Choose which provider to set up:" : "Es obligatorio usar la seguridad mejorada en tu cuenta. Escoge qué proveedor configurar:", diff --git a/core/l10n/es.json b/core/l10n/es.json index c4c57512f99..1372dec361c 100644 --- a/core/l10n/es.json +++ b/core/l10n/es.json @@ -379,13 +379,13 @@ "Email address" : "Dirección de correo", "Password sent!" : "¡Contraseña enviada!", "You are not authorized to request a password for this share" : "No está autorizado a solicitar una contraseña para esta acción", - "Two-factor authentication" : "Verificación en dos pasos", + "Two-factor authentication" : "Autenticación de dos factores", "Enhanced security is enabled for your account. Choose a second factor for authentication:" : "La seguridad mejorada está habilitada para su cuenta. Elija una segunda forma de autenticación:", - "Could not load at least one of your enabled two-factor auth methods. Please contact your admin." : "No se pudo cargar al menos uno de sus métodos de autenticación de segundo paso. Por favor, póngase en contacto con un administrador.", - "Two-factor authentication is enforced but has not been configured on your account. Contact your admin for assistance." : "La autenticación en dos pasos es obligatoria pero no se ha configurado en su cuenta. Póngase en contacto con su administrador para obtener ayuda.", + "Could not load at least one of your enabled two-factor auth methods. Please contact your admin." : "No se pudo cargar al menos uno de sus métodos de autenticación de dos factores. Por favor, póngase en contacto con un administrador.", + "Two-factor authentication is enforced but has not been configured on your account. Contact your admin for assistance." : "La autenticación de dos factores es obligatoria pero no se ha configurado en su cuenta. Póngase en contacto con su administrador para obtener ayuda.", "Two-factor authentication is enforced but has not been configured on your account. Please continue to setup two-factor authentication." : "La autenticación de dos factores es obligatoria pero no se ha configurado en tu cuenta. Por favor, continúa para configurar la autenticación de dos factores.", "Set up two-factor authentication" : "Configurar autenticación de dos factores", - "Two-factor authentication is enforced but has not been configured on your account. Use one of your backup codes to log in or contact your admin for assistance." : "La autenticación en dos pasos es obligatoria pero no se ha configurado en su cuenta. Use uno de sus códigos de respaldo para iniciar sesión o comuníquese con su administrador para obtener ayuda.", + "Two-factor authentication is enforced but has not been configured on your account. Use one of your backup codes to log in or contact your admin for assistance." : "La autenticación de dos factores es obligatoria pero no se ha configurado en su cuenta. Use uno de sus códigos de respaldo para iniciar sesión o comuníquese con su administrador para obtener ayuda.", "Use backup code" : "Usar código de respaldo", "Cancel login" : "Cancelar inicio de sesión", "Enhanced security is enforced for your account. Choose which provider to set up:" : "Es obligatorio usar la seguridad mejorada en tu cuenta. Escoge qué proveedor configurar:", diff --git a/core/src/views/UnifiedSearch.vue b/core/src/views/UnifiedSearch.vue index 62b5d034038..53b0fe8adbd 100644 --- a/core/src/views/UnifiedSearch.vue +++ b/core/src/views/UnifiedSearch.vue @@ -145,7 +145,7 @@ ? t('core', 'Loading more results …') : t('core', 'Load more results')" :icon-class="loading[type] ? 'icon-loading-small' : ''" - @click.stop="loadMore(type)" + @click.prevent.stop="loadMore(type)" @focus="setFocusedIndex" /> </li> </ul> @@ -335,13 +335,13 @@ export default { }, async created() { - subscribe('files:navigation:changed', this.resetForm) + subscribe('files:navigation:changed', this.onNavigationChange) this.types = await getTypes() this.logger.debug('Unified Search initialized with the following providers', this.types) }, beforeDestroy() { - unsubscribe('files:navigation:changed', this.resetForm) + unsubscribe('files:navigation:changed', this.onNavigationChange) }, mounted() { @@ -380,7 +380,7 @@ export default { emit('nextcloud:unified-search.close') }, - resetForm() { + onNavigationChange() { this.$el.querySelector('form[role="search"]').reset() }, diff --git a/dist/core-unified-search.js b/dist/core-unified-search.js index 6964937ecab..4cf9cf89b43 100644 --- a/dist/core-unified-search.js +++ b/dist/core-unified-search.js @@ -1,3 +1,3 @@ /*! For license information please see core-unified-search.js.LICENSE.txt */ -!function(){"use strict";var e,n={25160:function(e,n,r){var i=r(17499),a=r(22200),s=r(9944),o=r(20144),c=r(20296),u=r.n(c),l=r(74854),d=r(64024),A=r(45400),h=r.n(A),f=r(12945),p=r.n(f),g=r(93455),m=r.n(g),C=r(85750),v=r.n(C),b=r(72875),_=r.n(b),y=r(68589),x={name:"SearchResult",components:{NcHighlight:_()},props:{thumbnailUrl:{type:String,default:null},title:{type:String,required:!0},subline:{type:String,default:null},resourceUrl:{type:String,default:null},icon:{type:String,default:""},rounded:{type:Boolean,default:!1},query:{type:String,default:""},focused:{type:Boolean,default:!1}},data:function(){return{hasValidThumbnail:this.thumbnailUrl&&""!==this.thumbnailUrl.trim(),loaded:!1}},computed:{isIconUrl:function(){if(this.icon.startsWith("/"))return!0;try{new URL(this.icon)}catch(t){return!1}return!0}},watch:{thumbnailUrl:function(){this.hasValidThumbnail=this.thumbnailUrl&&""!==this.thumbnailUrl.trim(),this.loaded=!1}},methods:{reEmitEvent:function(t){this.$emit(t.type,t)},onError:function(){this.hasValidThumbnail=!1},onLoad:function(){this.loaded=!0}}},w=r(93379),k=r.n(w),S=r(7795),D=r.n(S),$=r(90569),B=r.n($),I=r(3565),R=r.n(I),q=r(19216),E=r.n(q),U=r(44589),P=r.n(U),L=r(80850),O={};O.styleTagTransform=P(),O.setAttributes=R(),O.insert=B().bind(null,"head"),O.domAPI=D(),O.insertStyleElement=E(),k()(L.Z,O),L.Z&&L.Z.locals&&L.Z.locals;var F=r(51900),j=(0,F.Z)(x,(function(){var t,e,n,r=this,i=r._self._c;return i("a",{staticClass:"unified-search__result",class:{"unified-search__result--focused":r.focused},attrs:{href:r.resourceUrl||"#"},on:{click:r.reEmitEvent,focus:r.reEmitEvent}},[i("div",{staticClass:"unified-search__result-icon",class:(t={"unified-search__result-icon--rounded":r.rounded,"unified-search__result-icon--no-preview":!r.hasValidThumbnail&&!r.loaded,"unified-search__result-icon--with-thumbnail":r.hasValidThumbnail&&r.loaded},e=r.icon,n=!r.loaded&&!r.isIconUrl,e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t),style:{backgroundImage:r.isIconUrl?"url(".concat(r.icon,")"):""}},[r.hasValidThumbnail?i("img",{directives:[{name:"show",rawName:"v-show",value:r.loaded,expression:"loaded"}],attrs:{src:r.thumbnailUrl,alt:""},on:{error:r.onError,load:r.onLoad}}):r._e()]),r._v(" "),i("span",{staticClass:"unified-search__result-content"},[i("span",{staticClass:"unified-search__result-line-one",attrs:{title:r.title}},[i("NcHighlight",{attrs:{text:r.title,search:r.query}})],1),r._v(" "),r.subline?i("span",{staticClass:"unified-search__result-line-two",attrs:{title:r.subline}},[r._v(r._s(r.subline))]):r._e()])])}),[],!1,null,"4805be6c",null).exports,N={name:"SearchResultPlaceholders",data:function(){return{light:null,dark:null}},mounted:function(){var t=getComputedStyle(document.documentElement);this.dark=t.getPropertyValue("--color-placeholder-dark"),this.light=t.getPropertyValue("--color-placeholder-light")},methods:{randWidth:function(){return Math.floor(20*Math.random())+30}}},z=r(78033),M={};M.styleTagTransform=P(),M.setAttributes=R(),M.insert=B().bind(null,"head"),M.domAPI=D(),M.insertStyleElement=E(),k()(z.Z,M),z.Z&&z.Z.locals&&z.Z.locals;var T=(0,F.Z)(N,(function(){var t=this,e=t._self._c;return e("ul",[e("svg",{staticClass:"unified-search__result-placeholder-gradient"},[e("defs",[e("linearGradient",{attrs:{id:"unified-search__result-placeholder-gradient"}},[e("stop",{attrs:{offset:"0%","stop-color":t.light}},[e("animate",{attrs:{attributeName:"stop-color",values:"".concat(t.light,"; ").concat(t.light,"; ").concat(t.dark,"; ").concat(t.dark,"; ").concat(t.light),dur:"2s",repeatCount:"indefinite"}})]),t._v(" "),e("stop",{attrs:{offset:"100%","stop-color":t.dark}},[e("animate",{attrs:{attributeName:"stop-color",values:"".concat(t.dark,"; ").concat(t.light,"; ").concat(t.light,"; ").concat(t.dark,"; ").concat(t.dark),dur:"2s",repeatCount:"indefinite"}})])],1)],1)]),t._v(" "),t._l([1,2,3],(function(n){return e("li",{key:n},[e("svg",{staticClass:"unified-search__result-placeholder",attrs:{xmlns:"http://www.w3.org/2000/svg",fill:"url(#unified-search__result-placeholder-gradient)"}},[e("rect",{staticClass:"unified-search__result-placeholder-icon"}),t._v(" "),e("rect",{staticClass:"unified-search__result-placeholder-line-one"}),t._v(" "),e("rect",{staticClass:"unified-search__result-placeholder-line-two",style:{width:"calc(".concat(t.randWidth(),"%)")}})])])}))],2)}),[],!1,null,"9ed03c40",null).exports,Z=r(79753),G=r(16453),W=r(4820),H=r(25108);function Q(t,e,n,r,i,a,s){try{var o=t[a](s),c=o.value}catch(t){return void n(t)}o.done?e(c):Promise.resolve(c).then(r,i)}function V(t){return function(){var e=this,n=arguments;return new Promise((function(r,i){var a=t.apply(e,n);function s(t){Q(a,r,i,s,o,"next",t)}function o(t){Q(a,r,i,s,o,"throw",t)}s(void 0)}))}}var Y=(0,G.loadState)("unified-search","limit-default"),K=(0,G.loadState)("unified-search","min-search-length",1),X=(0,G.loadState)("unified-search","live-search",!0),J=/(^|\s)in:([a-z_-]+)/gi,tt=/(^|\s)-in:([a-z_-]+)/gi;function et(){return nt.apply(this,arguments)}function nt(){return(nt=V(regeneratorRuntime.mark((function t(){var e,n;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,W.default.get((0,Z.generateOcsUrl)("search/providers"),{params:{from:window.location.pathname.replace("/index.php","")+window.location.search}});case 3:if(e=t.sent,!("ocs"in(n=e.data)&&"data"in n.ocs&&Array.isArray(n.ocs.data)&&n.ocs.data.length>0)){t.next=7;break}return t.abrupt("return",n.ocs.data);case 7:t.next=12;break;case 9:t.prev=9,t.t0=t.catch(0),H.error(t.t0);case 12:return t.abrupt("return",[]);case 13:case"end":return t.stop()}}),t,null,[[0,9]])})))).apply(this,arguments)}function rt(t){var e=t.type,n=t.query,r=t.cursor,i=W.default.CancelToken.source(),a=function(){var t=V(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",W.default.get((0,Z.generateOcsUrl)("search/providers/{type}/search",{type:e}),{cancelToken:i.token,params:{term:n,cursor:r,from:window.location.pathname.replace("/index.php","")+window.location.search}}));case 1:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}}();return{request:a,cancel:i.cancel}}function it(t){return function(t){if(Array.isArray(t))return ot(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||st(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function at(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=st(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var r=0,i=function(){};return{s:i,n:function(){return r>=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}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,s=!0,o=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){o=!0,a=t},f:function(){try{s||null==n.return||n.return()}finally{if(o)throw a}}}}function st(t,e){if(t){if("string"==typeof t)return ot(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)?ot(t,e):void 0}}function ot(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 ct(t,e,n,r,i,a,s){try{var o=t[a](s),c=o.value}catch(t){return void n(t)}o.done?e(c):Promise.resolve(c).then(r,i)}function ut(t){return function(){var e=this,n=arguments;return new Promise((function(r,i){var a=t.apply(e,n);function s(t){ct(a,r,i,s,o,"next",t)}function o(t){ct(a,r,i,s,o,"throw",t)}s(void 0)}))}}var lt={name:"UnifiedSearch",components:{Magnify:y.default,NcActionButton:h(),NcActions:p(),NcEmptyContent:m(),NcHeaderMenu:v(),NcHighlight:_(),SearchResult:j,SearchResultPlaceholders:T},data:function(){return{types:[],cursors:{},limits:{},loading:{},reached:{},requests:[],results:{},query:"",focused:null,triggered:!1,defaultLimit:Y,minSearchLength:K,enableLiveSearch:X,open:!1}},computed:{typesIDs:function(){return this.types.map((function(t){return t.id}))},typesNames:function(){return this.types.map((function(t){return t.name}))},typesMap:function(){return this.types.reduce((function(t,e){return t[e.id]=e.name,t}),{})},ariaLabel:function(){return t("core","Search")},hasResults:function(){return 0!==Object.keys(this.results).length},orderedResults:function(){var t=this;return this.typesIDs.filter((function(e){return e in t.results})).map((function(e){return{type:e,list:t.results[e]}}))},availableFilters:function(){return Object.keys(this.results)},usedFiltersIn:function(){for(var t,e=[];null!==(t=J.exec(this.query));)e.push(t[2]);return e},usedFiltersNot:function(){for(var t,e=[];null!==(t=tt.exec(this.query));)e.push(t[2]);return e},isShortQuery:function(){return this.query&&this.query.trim().length<K},isValidQuery:function(){return this.query&&""!==this.query.trim()&&!this.isShortQuery},isDoneSearching:function(){return Object.values(this.reached).every((function(t){return!1===t}))},isLoading:function(){return Object.values(this.loading).some((function(t){return!0===t}))}},created:function(){var t=this;return ut(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return(0,l.Ld)("files:navigation:changed",t.resetForm),e.next=3,et();case 3:t.types=e.sent,t.logger.debug("Unified Search initialized with the following providers",t.types);case 5:case"end":return e.stop()}}),e)})))()},beforeDestroy:function(){(0,l.r1)("files:navigation:changed",this.resetForm)},mounted:function(){var t=this;OCP.Accessibility.disableKeyboardShortcuts()||document.addEventListener("keydown",(function(e){e.ctrlKey&&"f"===e.key&&!t.open&&(e.preventDefault(),t.open=!0),t.open&&("ArrowDown"===e.key&&t.focusNext(e),"ArrowUp"===e.key&&t.focusPrev(e))}))},methods:{onOpen:function(){var t=this;return ut(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,et();case 2:t.types=e.sent;case 3:case"end":return e.stop()}}),e)})))()},onClose:function(){(0,l.j8)("nextcloud:unified-search.close")},resetForm:function(){this.$el.querySelector('form[role="search"]').reset()},onReset:function(){(0,l.j8)("nextcloud:unified-search.reset"),this.logger.debug("Search reset"),this.query="",this.resetState(),this.focusInput()},resetState:function(){var t=this;return ut(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t.cursors={},t.limits={},t.reached={},t.results={},t.focused=null,t.triggered=!1,e.next=8,t.cancelPendingRequests();case 8:case"end":return e.stop()}}),e)})))()},cancelPendingRequests:function(){var t=this;return ut(regeneratorRuntime.mark((function e(){var n;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.requests.slice(0),t.requests=[],e.next=4,Promise.all(n.map((function(t){return t()})));case 4:case"end":return e.stop()}}),e)})))()},focusInput:function(){var t=this;this.$nextTick((function(){t.$refs.input.focus(),t.$refs.input.select()}))},onInputEnter:function(){this.hasResults?this.getResultsList()[0].click():this.onInput()},onInput:function(){var t=this;return ut(regeneratorRuntime.mark((function e(){var n,r,i,a,s;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if((0,l.j8)("nextcloud:unified-search.search",{query:t.query}),""!==t.query.trim()&&!t.isShortQuery){e.next=5;break}n=at(t.typesIDs);try{for(n.s();!(r=n.n()).done;)i=r.value,t.$delete(t.results,i)}catch(t){n.e(t)}finally{n.f()}return e.abrupt("return");case 5:return a=t.typesIDs,s=t.query,t.usedFiltersNot.length>0&&(a=t.typesIDs.filter((function(e){return-1===t.usedFiltersNot.indexOf(e)}))),t.usedFiltersIn.length>0&&(a=t.typesIDs.filter((function(e){return t.usedFiltersIn.indexOf(e)>-1}))),s=s.replace(J,"").replace(tt,""),e.next=12,t.resetState();case 12:if(t.triggered=!0,a.length){e.next=16;break}return t.logger.error("No types to search in"),e.abrupt("return");case 16:t.$set(t.loading,"all",!0),t.logger.debug("Searching ".concat(s," in"),a),Promise.all(a.map(function(){var e=ut(regeneratorRuntime.mark((function e(n){var r,i,a,o,c;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,r=rt({type:n,query:s}),i=r.request,a=r.cancel,t.requests.push(a),e.next=5,i();case 5:return o=e.sent,(c=o.data).ocs.data.entries.length>0?t.$set(t.results,n,c.ocs.data.entries):t.$delete(t.results,n),c.ocs.data.cursor?t.$set(t.cursors,n,c.ocs.data.cursor):c.ocs.data.isPaginated||t.$set(t.limits,n,t.defaultLimit),c.ocs.data.entries.length<t.defaultLimit&&t.$set(t.reached,n,!0),null===t.focused&&(t.focused=0),e.abrupt("return",1);case 14:if(e.prev=14,e.t0=e.catch(0),t.$delete(t.results,n),!e.t0.response||!e.t0.response.status){e.next=21;break}return t.logger.error("Error searching for ".concat(t.typesMap[n]),e.t0),(0,d.x2)(t.t("core","An error occurred while searching for {type}",{type:t.typesMap[n]})),e.abrupt("return",0);case 21:return e.abrupt("return",2);case 22:case"end":return e.stop()}}),e,null,[[0,14]])})));return function(t){return e.apply(this,arguments)}}())).then((function(e){e.some((function(t){return 2===t}))||(t.loading={})}));case 19:case"end":return e.stop()}}),e)})))()},onInputDebounced:X?u()((function(t){this.onInput(t)}),500):function(){this.triggered=!1},loadMore:function(t){var e=this;return ut(regeneratorRuntime.mark((function n(){var r,i,a,s,o,c;return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if(!e.loading[t]){n.next=2;break}return n.abrupt("return");case 2:if(!e.cursors[t]){n.next=14;break}return r=rt({type:t,query:e.query,cursor:e.cursors[t]}),i=r.request,a=r.cancel,e.requests.push(a),n.next=7,i();case 7:s=n.sent,(o=s.data).ocs.data.cursor&&e.$set(e.cursors,t,o.ocs.data.cursor),o.ocs.data.entries.length>0&&(c=e.results[t]).push.apply(c,it(o.ocs.data.entries)),o.ocs.data.entries.length<e.defaultLimit&&e.$set(e.reached,t,!0),n.next=15;break;case 14:e.limits[t]&&e.limits[t]>=0&&(e.limits[t]+=e.defaultLimit,e.limits[t]>=e.results[t].length&&e.$set(e.reached,t,!0));case 15:null!==e.focused&&e.$nextTick((function(){e.focusIndex(e.focused)}));case 16:case"end":return n.stop()}}),n)})))()},limitIfAny:function(t,e){return e in this.limits?t.slice(0,this.limits[e]):t},getResultsList:function(){return this.$el.querySelectorAll(".unified-search__results .unified-search__result")},focusFirst:function(t){var e=this.getResultsList();e&&e.length>0&&(t&&t.preventDefault(),this.focused=0,this.focusIndex(this.focused))},focusNext:function(t){if(null!==this.focused){var e=this.getResultsList();e&&e.length>0&&this.focused+1<e.length&&(t.preventDefault(),this.focused++,this.focusIndex(this.focused))}else this.focusFirst(t)},focusPrev:function(t){if(null!==this.focused){var e=this.getResultsList();e&&e.length>0&&this.focused>0&&(t.preventDefault(),this.focused--,this.focusIndex(this.focused))}else this.focusFirst(t)},focusIndex:function(t){var e=this.getResultsList();e&&e[t]&&e[t].focus()},setFocusedIndex:function(t){var e=t.target,n=it(this.getResultsList()).findIndex((function(t){return t===e}));n>-1&&(this.focused=n)},onClickFilter:function(t){this.query="".concat(this.query," ").concat(t).replace(/ {2}/g," ").trim(),this.onInput()}}},dt=lt,At=r(79468),ht={};ht.styleTagTransform=P(),ht.setAttributes=R(),ht.insert=B().bind(null,"head"),ht.domAPI=D(),ht.insertStyleElement=E(),k()(At.Z,ht),At.Z&&At.Z.locals&&At.Z.locals;var ft=(0,F.Z)(dt,(function(){var t=this,e=t._self._c;return e("NcHeaderMenu",{staticClass:"unified-search",attrs:{id:"unified-search","exclude-click-outside-classes":"popover",open:t.open,"aria-label":t.ariaLabel},on:{"update:open":function(e){t.open=e},open:t.onOpen,close:t.onClose},scopedSlots:t._u([{key:"trigger",fn:function(){return[e("Magnify",{staticClass:"unified-search__trigger",attrs:{size:22,"fill-color":"var(--color-primary-text)"}})]},proxy:!0}])},[t._v(" "),e("div",{staticClass:"unified-search__input-wrapper"},[e("label",{attrs:{for:"unified-search__input"}},[t._v(t._s(t.ariaLabel))]),t._v(" "),e("div",{staticClass:"unified-search__input-row"},[e("form",{staticClass:"unified-search__form",class:{"icon-loading-small":t.isLoading},attrs:{role:"search"},on:{submit:function(e){return e.preventDefault(),e.stopPropagation(),t.onInputEnter.apply(null,arguments)},reset:function(e){return e.preventDefault(),e.stopPropagation(),t.onReset.apply(null,arguments)}}},[e("input",{directives:[{name:"model",rawName:"v-model",value:t.query,expression:"query"}],ref:"input",staticClass:"unified-search__form-input",class:{"unified-search__form-input--with-reset":!!t.query},attrs:{id:"unified-search__input",type:"search",placeholder:t.t("core","Search {types} …",{types:t.typesNames.join(", ")}),"aria-describedby":"unified-search-desc"},domProps:{value:t.query},on:{input:[function(e){e.target.composing||(t.query=e.target.value)},t.onInputDebounced],keypress:function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"enter",13,e.key,"Enter")?null:(e.preventDefault(),e.stopPropagation(),t.onInputEnter.apply(null,arguments))}}}),t._v(" "),e("p",{staticClass:"hidden-visually",attrs:{id:"unified-search-desc"}},[t._v("\n\t\t\t\t\t"+t._s(t.t("core","Search starts once you start typing and results may be reached with the arrow keys"))+"\n\t\t\t\t")]),t._v(" "),t.query&&!t.isLoading?e("input",{staticClass:"unified-search__form-reset icon-close",attrs:{type:"reset","aria-label":t.t("core","Reset search"),value:""}}):t._e(),t._v(" "),!t.query||t.isLoading||t.enableLiveSearch?t._e():e("input",{staticClass:"unified-search__form-submit icon-confirm",attrs:{type:"submit","aria-label":t.t("core","Start search"),value:""}})]),t._v(" "),t.availableFilters.length>1?e("NcActions",{staticClass:"unified-search__filters",attrs:{placement:"bottom",container:".unified-search__input-wrapper"}},t._l(t.availableFilters,(function(n){return e("NcActionButton",{key:n,attrs:{icon:"icon-filter",title:t.t("core","Search for {name} only",{name:t.typesMap[n]})},on:{click:function(e){return e.stopPropagation(),t.onClickFilter("in:".concat(n))}}},[t._v("\n\t\t\t\t\t"+t._s("in:".concat(n))+"\n\t\t\t\t")])})),1):t._e()],1)]),t._v(" "),t.hasResults?t._l(t.orderedResults,(function(n,r){var i=n.list,a=n.type;return e("ul",{key:a,staticClass:"unified-search__results",class:"unified-search__results-".concat(a),attrs:{"aria-label":t.typesMap[a]}},[e("h2",{staticClass:"unified-search__results-header"},[t._v("\n\t\t\t\t"+t._s(t.typesMap[a])+"\n\t\t\t")]),t._v(" "),t._l(t.limitIfAny(i,a),(function(n,i){return e("li",{key:n.resourceUrl},[e("SearchResult",t._b({attrs:{query:t.query,focused:0===t.focused&&0===r&&0===i},on:{focus:t.setFocusedIndex}},"SearchResult",n,!1))],1)})),t._v(" "),e("li",[t.reached[a]?t._e():e("SearchResult",{staticClass:"unified-search__result-more",attrs:{title:t.loading[a]?t.t("core","Loading more results …"):t.t("core","Load more results"),"icon-class":t.loading[a]?"icon-loading-small":""},on:{click:function(e){return e.stopPropagation(),t.loadMore(a)},focus:t.setFocusedIndex}})],1)],2)})):[t.isLoading?e("SearchResultPlaceholders"):t.isValidQuery?e("NcEmptyContent",{scopedSlots:t._u([{key:"icon",fn:function(){return[e("Magnify")]},proxy:!0}],null,!1,931131664)},[t.triggered?e("NcHighlight",{attrs:{text:t.t("core","No results for {query}",{query:t.query}),search:t.query}}):e("div",[t._v("\n\t\t\t\t"+t._s(t.t("core","Press enter to start searching"))+"\n\t\t\t")])],1):!t.isLoading||t.isShortQuery?e("NcEmptyContent",{scopedSlots:t._u([{key:"icon",fn:function(){return[e("Magnify")]},proxy:!0},t.isShortQuery?{key:"desc",fn:function(){return[t._v("\n\t\t\t\t"+t._s(t.n("core","Please enter {minSearchLength} character or more to search","Please enter {minSearchLength} characters or more to search",t.minSearchLength,{minSearchLength:t.minSearchLength}))+"\n\t\t\t")]},proxy:!0}:null],null,!0)},[t._v("\n\t\t\t"+t._s(t.t("core","Start typing to search"))+"\n\t\t\t")]):t._e()]],2)}),[],!1,null,"7bce572d",null),pt=ft.exports;r.nc=btoa((0,a.getRequestToken)());var gt=(0,i.IY)().setApp("unified-search").detectUser().build();o.ZP.mixin({data:function(){return{logger:gt}},methods:{t:s.translate,n:s.translatePlural}}),new o.ZP({el:"#unified-search",name:"UnifiedSearchRoot",render:function(t){return t(pt)}})},80850:function(t,e,n){var r=n(87537),i=n.n(r),a=n(23645),s=n.n(a)()(i());s.push([t.id,".unified-search__result[data-v-4805be6c]{display:flex;align-items:center;height:44px;padding:10px;border:2px solid rgba(0,0,0,0);border-radius:var(--border-radius-large) !important}.unified-search__result--focused[data-v-4805be6c]{background-color:var(--color-background-hover)}.unified-search__result[data-v-4805be6c]:active,.unified-search__result[data-v-4805be6c]:hover,.unified-search__result[data-v-4805be6c]:focus{background-color:var(--color-background-hover);border:2px solid var(--color-border-maxcontrast)}.unified-search__result *[data-v-4805be6c]{cursor:pointer}.unified-search__result-icon[data-v-4805be6c]{overflow:hidden;width:44px;height:44px;border-radius:var(--border-radius);background-repeat:no-repeat;background-position:center center;background-size:32px}.unified-search__result-icon--rounded[data-v-4805be6c]{border-radius:22px}.unified-search__result-icon--no-preview[data-v-4805be6c]{background-size:32px}.unified-search__result-icon--with-thumbnail[data-v-4805be6c]{background-size:cover}.unified-search__result-icon--with-thumbnail[data-v-4805be6c]:not(.unified-search__result-icon--rounded){max-width:42px;max-height:42px;border:1px solid var(--color-border)}.unified-search__result-icon img[data-v-4805be6c]{width:100%;height:100%;object-fit:cover;object-position:center}.unified-search__result-icon[data-v-4805be6c],.unified-search__result-actions[data-v-4805be6c]{flex:0 0 44px}.unified-search__result-content[data-v-4805be6c]{display:flex;align-items:center;flex:1 1 100%;flex-wrap:wrap;min-width:0;padding-left:10px}.unified-search__result-line-one[data-v-4805be6c],.unified-search__result-line-two[data-v-4805be6c]{overflow:hidden;flex:1 1 100%;margin:1px 0;white-space:nowrap;text-overflow:ellipsis;color:inherit;font-size:inherit}.unified-search__result-line-two[data-v-4805be6c]{opacity:.7;font-size:var(--default-font-size)}","",{version:3,sources:["webpack://./core/src/components/UnifiedSearch/SearchResult.vue"],names:[],mappings:"AAMA,yCACC,YAAA,CACA,kBAAA,CACA,WANgB,CAOhB,YANQ,CAOR,8BAAA,CACA,mDAAA,CAEA,kDACC,8CAAA,CAGD,8IAGC,8CAAA,CACA,gDAAA,CAGD,2CACC,cAAA,CAGD,8CACC,eAAA,CACA,UA5Be,CA6Bf,WA7Be,CA8Bf,kCAAA,CACA,2BAAA,CACA,iCAAA,CACA,oBAAA,CACA,uDACC,kBAAA,CAED,0DACC,oBAAA,CAED,8DACC,qBAAA,CAED,yGAEC,cAAA,CACA,eAAA,CACA,oCAAA,CAGD,kDAEC,UAAA,CACA,WAAA,CAEA,gBAAA,CACA,sBAAA,CAIF,+FAEC,aAAA,CAGD,iDACC,YAAA,CACA,kBAAA,CACA,aAAA,CACA,cAAA,CAEA,WAAA,CACA,iBAvEO,CA0ER,oGAEC,eAAA,CACA,aAAA,CACA,YAAA,CACA,kBAAA,CACA,sBAAA,CAEA,aAAA,CACA,iBAAA,CAED,kDACC,UAAA,CACA,kCAAA",sourcesContent:['\n@use "sass:math";\n\n$clickable-area: 44px;\n$margin: 10px;\n\n.unified-search__result {\n\tdisplay: flex;\n\talign-items: center;\n\theight: $clickable-area;\n\tpadding: $margin;\n\tborder: 2px solid transparent;\n\tborder-radius: var(--border-radius-large) !important;\n\n\t&--focused {\n\t\tbackground-color: var(--color-background-hover);\n\t}\n\n\t&:active,\n\t&:hover,\n\t&:focus {\n\t\tbackground-color: var(--color-background-hover);\n\t\tborder: 2px solid var(--color-border-maxcontrast);\n\t}\n\n\t* {\n\t\tcursor: pointer;\n\t}\n\n\t&-icon {\n\t\toverflow: hidden;\n\t\twidth: $clickable-area;\n\t\theight: $clickable-area;\n\t\tborder-radius: var(--border-radius);\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position: center center;\n\t\tbackground-size: 32px;\n\t\t&--rounded {\n\t\t\tborder-radius: math.div($clickable-area, 2);\n\t\t}\n\t\t&--no-preview {\n\t\t\tbackground-size: 32px;\n\t\t}\n\t\t&--with-thumbnail {\n\t\t\tbackground-size: cover;\n\t\t}\n\t\t&--with-thumbnail:not(&--rounded) {\n\t\t\t// compensate for border\n\t\t\tmax-width: $clickable-area - 2px;\n\t\t\tmax-height: $clickable-area - 2px;\n\t\t\tborder: 1px solid var(--color-border);\n\t\t}\n\n\t\timg {\n\t\t\t// Make sure to keep ratio\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\n\t\t\tobject-fit: cover;\n\t\t\tobject-position: center;\n\t\t}\n\t}\n\n\t&-icon,\n\t&-actions {\n\t\tflex: 0 0 $clickable-area;\n\t}\n\n\t&-content {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tflex: 1 1 100%;\n\t\tflex-wrap: wrap;\n\t\t// Set to minimum and gro from it\n\t\tmin-width: 0;\n\t\tpadding-left: $margin;\n\t}\n\n\t&-line-one,\n\t&-line-two {\n\t\toverflow: hidden;\n\t\tflex: 1 1 100%;\n\t\tmargin: 1px 0;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t\t// Use the same color as the `a`\n\t\tcolor: inherit;\n\t\tfont-size: inherit;\n\t}\n\t&-line-two {\n\t\topacity: .7;\n\t\tfont-size: var(--default-font-size);\n\t}\n}\n\n'],sourceRoot:""}]),e.Z=s},78033:function(t,e,n){var r=n(87537),i=n.n(r),a=n(23645),s=n.n(a)()(i());s.push([t.id,".unified-search__result-placeholder-gradient[data-v-9ed03c40]{position:fixed;height:0;width:0;z-index:-1}.unified-search__result-placeholder[data-v-9ed03c40]{width:calc(100% - 2 * 10px);height:44px;margin:10px}.unified-search__result-placeholder-icon[data-v-9ed03c40]{width:44px;height:44px;rx:var(--border-radius);ry:var(--border-radius)}.unified-search__result-placeholder-line-one[data-v-9ed03c40],.unified-search__result-placeholder-line-two[data-v-9ed03c40]{width:calc(100% - 54px);height:1em;x:54px}.unified-search__result-placeholder-line-one[data-v-9ed03c40]{y:5px}.unified-search__result-placeholder-line-two[data-v-9ed03c40]{y:25px}","",{version:3,sources:["webpack://./core/src/components/UnifiedSearch/SearchResultPlaceholders.vue"],names:[],mappings:"AAIA,8DACC,cAAA,CACA,QAAA,CACA,OAAA,CACA,UAAA,CAGD,qDACC,2BAAA,CACA,WAZgB,CAahB,WAZQ,CAcR,0DACC,UAhBe,CAiBf,WAjBe,CAkBf,uBAAA,CACA,uBAAA,CAGD,4HAEC,uBAAA,CACA,UAAA,CACA,MAAA,CAGD,8DACC,KAAA,CAGD,8DACC,MAAA",sourcesContent:["\n$clickable-area: 44px;\n$margin: 10px;\n\n.unified-search__result-placeholder-gradient {\n\tposition: fixed;\n\theight: 0;\n\twidth: 0;\n\tz-index: -1;\n}\n\n.unified-search__result-placeholder {\n\twidth: calc(100% - 2 * #{$margin});\n\theight: $clickable-area;\n\tmargin: $margin;\n\n\t&-icon {\n\t\twidth: $clickable-area;\n\t\theight: $clickable-area;\n\t\trx: var(--border-radius);\n\t\try: var(--border-radius);\n\t}\n\n\t&-line-one,\n\t&-line-two {\n\t\twidth: calc(100% - #{$margin + $clickable-area});\n\t\theight: 1em;\n\t\tx: $margin + $clickable-area;\n\t}\n\n\t&-line-one {\n\t\ty: 5px;\n\t}\n\n\t&-line-two {\n\t\ty: 25px;\n\t}\n}\n\n"],sourceRoot:""}]),e.Z=s},79468:function(t,e,n){var r=n(87537),i=n.n(r),a=n(23645),s=n.n(a)()(i());s.push([t.id,".unified-search__trigger[data-v-7bce572d]{filter:var(--background-image-invert-if-bright)}.unified-search__input-wrapper[data-v-7bce572d]{position:sticky;z-index:2;top:0;display:inline-flex;flex-direction:column;align-items:center;width:100%;background-color:var(--color-main-background)}.unified-search__input-wrapper label[for=unified-search__input][data-v-7bce572d]{align-self:flex-start;font-weight:bold;font-size:19px;margin-left:13px}.unified-search__form-input[data-v-7bce572d]{margin:0 !important}.unified-search__input-row[data-v-7bce572d]{display:flex;width:100%;align-items:center}.unified-search__filters[data-v-7bce572d]{margin:10px 0 10px 5px}.unified-search__filters ul[data-v-7bce572d]{display:inline-flex;justify-content:space-between}.unified-search__form[data-v-7bce572d]{position:relative;width:100%;margin:10px 0}.unified-search__form[data-v-7bce572d]::after{right:6px;left:auto}.unified-search__form-input[data-v-7bce572d],.unified-search__form-reset[data-v-7bce572d]{margin:3px}.unified-search__form-input[data-v-7bce572d]{width:100%;height:34px;padding:6px}.unified-search__form-input[data-v-7bce572d],.unified-search__form-input[placeholder][data-v-7bce572d],.unified-search__form-input[data-v-7bce572d]::placeholder{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.unified-search__form-input[data-v-7bce572d]::-webkit-search-decoration,.unified-search__form-input[data-v-7bce572d]::-webkit-search-cancel-button,.unified-search__form-input[data-v-7bce572d]::-webkit-search-results-button,.unified-search__form-input[data-v-7bce572d]::-webkit-search-results-decoration{-webkit-appearance:none}.icon-loading-small .unified-search__form-input[data-v-7bce572d],.unified-search__form-input--with-reset[data-v-7bce572d]{padding-right:34px}.unified-search__form-reset[data-v-7bce572d],.unified-search__form-submit[data-v-7bce572d]{position:absolute;top:0;right:4px;width:28px;height:28px;min-height:30px;padding:0;opacity:.5;border:none;background-color:rgba(0,0,0,0);margin-right:0}.unified-search__form-reset[data-v-7bce572d]:hover,.unified-search__form-reset[data-v-7bce572d]:focus,.unified-search__form-reset[data-v-7bce572d]:active,.unified-search__form-submit[data-v-7bce572d]:hover,.unified-search__form-submit[data-v-7bce572d]:focus,.unified-search__form-submit[data-v-7bce572d]:active{opacity:1}.unified-search__form-submit[data-v-7bce572d]{right:28px}.unified-search__results[data-v-7bce572d]{display:flex;flex-direction:column;gap:4px}.unified-search__results-header[data-v-7bce572d]{display:block;margin:10px;margin-bottom:6px;margin-left:13px;color:var(--color-primary-element);font-size:19px;font-weight:bold}.unified-search .unified-search__result-more[data-v-7bce572d]{color:var(--color-text-maxcontrast)}.unified-search .empty-content[data-v-7bce572d]{margin:10vh 0}.unified-search .empty-content[data-v-7bce572d] .empty-content__title{font-weight:normal;font-size:var(--default-font-size);padding:0 15px;text-align:center}","",{version:3,sources:["webpack://./core/src/views/UnifiedSearch.vue"],names:[],mappings:"AAQC,0CACC,+CAAA,CAGD,gDACC,eAAA,CAEA,SAAA,CACA,KAAA,CACA,mBAAA,CACA,qBAAA,CACA,kBAAA,CACA,UAAA,CACA,6CAAA,CAEA,iFACC,qBAAA,CACA,gBAAA,CACA,cAAA,CACA,gBAAA,CAIF,6CACC,mBAAA,CAGD,4CACC,YAAA,CACA,UAAA,CACA,kBAAA,CAGD,0CACC,sBAAA,CACA,6CACC,mBAAA,CACA,6BAAA,CAIF,uCACC,iBAAA,CACA,UAAA,CACA,aAAA,CAGA,8CACC,SAnDa,CAoDb,SAAA,CAGD,0FAEC,UAAA,CAGD,6CACC,UAAA,CACA,WA/DY,CAgEZ,WA/Da,CAiEb,iKAGC,eAAA,CACA,kBAAA,CACA,sBAAA,CAID,+SAIC,uBAAA,CAID,0HAEC,kBArFW,CAyFb,2FACC,iBAAA,CACA,KAAA,CACA,SAAA,CACA,UAAA,CACA,WAAA,CACA,eAAA,CACA,SAAA,CACA,UAAA,CACA,WAAA,CACA,8BAAA,CACA,cAAA,CAEA,uTAGC,SAAA,CAIF,8CACC,UAAA,CAIF,0CAUC,YAAA,CACA,qBAAA,CACA,OAAA,CAXA,iDACC,aAAA,CACA,WAtHM,CAuHN,iBAAA,CACA,gBAAA,CACA,kCAAA,CACA,cAAA,CACA,gBAAA,CAOF,8DACC,mCAAA,CAGD,gDACC,aAAA,CAEA,sEACC,kBAAA,CACS,kCAAA,CACT,cAAA,CACA,iBAAA",sourcesContent:['\n@use "sass:math";\n\n$margin: 10px;\n$input-height: 34px;\n$input-padding: 6px;\n\n.unified-search {\n\t&__trigger {\n\t\tfilter: var(--background-image-invert-if-bright);\n\t}\n\n\t&__input-wrapper {\n\t\tposition: sticky;\n\t\t// above search results\n\t\tz-index: 2;\n\t\ttop: 0;\n\t\tdisplay: inline-flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\twidth: 100%;\n\t\tbackground-color: var(--color-main-background);\n\n\t\tlabel[for="unified-search__input"] {\n\t\t\talign-self: flex-start;\n\t\t\tfont-weight: bold;\n\t\t\tfont-size: 19px;\n\t\t\tmargin-left: 13px;\n\t\t}\n\t}\n\n\t&__form-input {\n\t\tmargin: 0 !important;\n\t}\n\n\t&__input-row {\n\t\tdisplay: flex;\n\t\twidth: 100%;\n\t\talign-items: center;\n\t}\n\n\t&__filters {\n\t\tmargin: $margin 0 $margin math.div($margin, 2);\n\t\tul {\n\t\t\tdisplay: inline-flex;\n\t\t\tjustify-content: space-between;\n\t\t}\n\t}\n\n\t&__form {\n\t\tposition: relative;\n\t\twidth: 100%;\n\t\tmargin: $margin 0;\n\n\t\t// Loading spinner\n\t\t&::after {\n\t\t\tright: $input-padding;\n\t\t\tleft: auto;\n\t\t}\n\n\t\t&-input,\n\t\t&-reset {\n\t\t\tmargin: math.div($input-padding, 2);\n\t\t}\n\n\t\t&-input {\n\t\t\twidth: 100%;\n\t\t\theight: $input-height;\n\t\t\tpadding: $input-padding;\n\n\t\t\t&,\n\t\t\t&[placeholder],\n\t\t\t&::placeholder {\n\t\t\t\toverflow: hidden;\n\t\t\t\twhite-space: nowrap;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t}\n\n\t\t\t// Hide webkit clear search\n\t\t\t&::-webkit-search-decoration,\n\t\t\t&::-webkit-search-cancel-button,\n\t\t\t&::-webkit-search-results-button,\n\t\t\t&::-webkit-search-results-decoration {\n\t\t\t\t-webkit-appearance: none;\n\t\t\t}\n\n\t\t\t// Ellipsis earlier if reset button is here\n\t\t\t.icon-loading-small &,\n\t\t\t&--with-reset {\n\t\t\t\tpadding-right: $input-height;\n\t\t\t}\n\t\t}\n\n\t\t&-reset, &-submit {\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tright: 4px;\n\t\t\twidth: $input-height - $input-padding;\n\t\t\theight: $input-height - $input-padding;\n\t\t\tmin-height: 30px;\n\t\t\tpadding: 0;\n\t\t\topacity: .5;\n\t\t\tborder: none;\n\t\t\tbackground-color: transparent;\n\t\t\tmargin-right: 0;\n\n\t\t\t&:hover,\n\t\t\t&:focus,\n\t\t\t&:active {\n\t\t\t\topacity: 1;\n\t\t\t}\n\t\t}\n\n\t\t&-submit {\n\t\t\tright: 28px;\n\t\t}\n\t}\n\n\t&__results {\n\t\t&-header {\n\t\t\tdisplay: block;\n\t\t\tmargin: $margin;\n\t\t\tmargin-bottom: $margin - 4px;\n\t\t\tmargin-left: 13px;\n\t\t\tcolor: var(--color-primary-element);\n\t\t\tfont-size: 19px;\n\t\t\tfont-weight: bold;\n\t\t}\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 4px;\n\t}\n\n\t.unified-search__result-more::v-deep {\n\t\tcolor: var(--color-text-maxcontrast);\n\t}\n\n\t.empty-content {\n\t\tmargin: 10vh 0;\n\n\t\t::v-deep .empty-content__title {\n\t\t\tfont-weight: normal;\n font-size: var(--default-font-size);\n\t\t\tpadding: 0 15px;\n\t\t\ttext-align: center;\n\t\t}\n\t}\n}\n\n'],sourceRoot:""}]),e.Z=s}},r={};function i(t){var e=r[t];if(void 0!==e)return e.exports;var a=r[t]={id:t,loaded:!1,exports:{}};return n[t].call(a.exports,a,a.exports,i),a.loaded=!0,a.exports}i.m=n,i.amdD=function(){throw new Error("define cannot be used indirect")},i.amdO={},e=[],i.O=function(t,n,r,a){if(!n){var s=1/0;for(l=0;l<e.length;l++){n=e[l][0],r=e[l][1],a=e[l][2];for(var o=!0,c=0;c<n.length;c++)(!1&a||s>=a)&&Object.keys(i.O).every((function(t){return i.O[t](n[c])}))?n.splice(c--,1):(o=!1,a<s&&(s=a));if(o){e.splice(l--,1);var u=r();void 0!==u&&(t=u)}}return t}a=a||0;for(var l=e.length;l>0&&e[l-1][2]>a;l--)e[l]=e[l-1];e[l]=[n,r,a]},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,{a:e}),e},i.d=function(t,e){for(var n in e)i.o(e,n)&&!i.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},i.nmd=function(t){return t.paths=[],t.children||(t.children=[]),t},i.j=9671,function(){i.b=document.baseURI||self.location.href;var t={9671:0};i.O.j=function(e){return 0===t[e]};var e=function(e,n){var r,a,s=n[0],o=n[1],c=n[2],u=0;if(s.some((function(e){return 0!==t[e]}))){for(r in o)i.o(o,r)&&(i.m[r]=o[r]);if(c)var l=c(i)}for(e&&e(n);u<s.length;u++)a=s[u],i.o(t,a)&&t[a]&&t[a][0](),t[a]=0;return i.O(l)},n=self.webpackChunknextcloud=self.webpackChunknextcloud||[];n.forEach(e.bind(null,0)),n.push=e.bind(null,n.push.bind(n))}(),i.nc=void 0;var a=i.O(void 0,[7874],(function(){return i(25160)}));a=i.O(a)}(); -//# sourceMappingURL=core-unified-search.js.map?v=3432fb5fc2328df258e0
\ No newline at end of file +!function(){"use strict";var e,n={56874:function(e,n,r){var i=r(17499),a=r(22200),o=r(9944),s=r(20144),c=r(20296),u=r.n(c),l=r(74854),d=r(64024),f=r(45400),h=r.n(f),A=r(12945),p=r.n(A),g=r(93455),m=r.n(g),C=r(85750),v=r.n(C),_=r(72875),b=r.n(_),y=r(68589),x={name:"SearchResult",components:{NcHighlight:b()},props:{thumbnailUrl:{type:String,default:null},title:{type:String,required:!0},subline:{type:String,default:null},resourceUrl:{type:String,default:null},icon:{type:String,default:""},rounded:{type:Boolean,default:!1},query:{type:String,default:""},focused:{type:Boolean,default:!1}},data:function(){return{hasValidThumbnail:this.thumbnailUrl&&""!==this.thumbnailUrl.trim(),loaded:!1}},computed:{isIconUrl:function(){if(this.icon.startsWith("/"))return!0;try{new URL(this.icon)}catch(t){return!1}return!0}},watch:{thumbnailUrl:function(){this.hasValidThumbnail=this.thumbnailUrl&&""!==this.thumbnailUrl.trim(),this.loaded=!1}},methods:{reEmitEvent:function(t){this.$emit(t.type,t)},onError:function(){this.hasValidThumbnail=!1},onLoad:function(){this.loaded=!0}}},w=r(93379),k=r.n(w),S=r(7795),D=r.n(S),$=r(90569),B=r.n($),I=r(3565),R=r.n(I),q=r(19216),E=r.n(q),U=r(44589),P=r.n(U),L=r(80850),O={};O.styleTagTransform=P(),O.setAttributes=R(),O.insert=B().bind(null,"head"),O.domAPI=D(),O.insertStyleElement=E(),k()(L.Z,O),L.Z&&L.Z.locals&&L.Z.locals;var N=r(51900),F=(0,N.Z)(x,(function(){var t,e,n,r=this,i=r._self._c;return i("a",{staticClass:"unified-search__result",class:{"unified-search__result--focused":r.focused},attrs:{href:r.resourceUrl||"#"},on:{click:r.reEmitEvent,focus:r.reEmitEvent}},[i("div",{staticClass:"unified-search__result-icon",class:(t={"unified-search__result-icon--rounded":r.rounded,"unified-search__result-icon--no-preview":!r.hasValidThumbnail&&!r.loaded,"unified-search__result-icon--with-thumbnail":r.hasValidThumbnail&&r.loaded},e=r.icon,n=!r.loaded&&!r.isIconUrl,e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t),style:{backgroundImage:r.isIconUrl?"url(".concat(r.icon,")"):""}},[r.hasValidThumbnail?i("img",{directives:[{name:"show",rawName:"v-show",value:r.loaded,expression:"loaded"}],attrs:{src:r.thumbnailUrl,alt:""},on:{error:r.onError,load:r.onLoad}}):r._e()]),r._v(" "),i("span",{staticClass:"unified-search__result-content"},[i("span",{staticClass:"unified-search__result-line-one",attrs:{title:r.title}},[i("NcHighlight",{attrs:{text:r.title,search:r.query}})],1),r._v(" "),r.subline?i("span",{staticClass:"unified-search__result-line-two",attrs:{title:r.subline}},[r._v(r._s(r.subline))]):r._e()])])}),[],!1,null,"4805be6c",null).exports,j={name:"SearchResultPlaceholders",data:function(){return{light:null,dark:null}},mounted:function(){var t=getComputedStyle(document.documentElement);this.dark=t.getPropertyValue("--color-placeholder-dark"),this.light=t.getPropertyValue("--color-placeholder-light")},methods:{randWidth:function(){return Math.floor(20*Math.random())+30}}},z=r(78033),M={};M.styleTagTransform=P(),M.setAttributes=R(),M.insert=B().bind(null,"head"),M.domAPI=D(),M.insertStyleElement=E(),k()(z.Z,M),z.Z&&z.Z.locals&&z.Z.locals;var T=(0,N.Z)(j,(function(){var t=this,e=t._self._c;return e("ul",[e("svg",{staticClass:"unified-search__result-placeholder-gradient"},[e("defs",[e("linearGradient",{attrs:{id:"unified-search__result-placeholder-gradient"}},[e("stop",{attrs:{offset:"0%","stop-color":t.light}},[e("animate",{attrs:{attributeName:"stop-color",values:"".concat(t.light,"; ").concat(t.light,"; ").concat(t.dark,"; ").concat(t.dark,"; ").concat(t.light),dur:"2s",repeatCount:"indefinite"}})]),t._v(" "),e("stop",{attrs:{offset:"100%","stop-color":t.dark}},[e("animate",{attrs:{attributeName:"stop-color",values:"".concat(t.dark,"; ").concat(t.light,"; ").concat(t.light,"; ").concat(t.dark,"; ").concat(t.dark),dur:"2s",repeatCount:"indefinite"}})])],1)],1)]),t._v(" "),t._l([1,2,3],(function(n){return e("li",{key:n},[e("svg",{staticClass:"unified-search__result-placeholder",attrs:{xmlns:"http://www.w3.org/2000/svg",fill:"url(#unified-search__result-placeholder-gradient)"}},[e("rect",{staticClass:"unified-search__result-placeholder-icon"}),t._v(" "),e("rect",{staticClass:"unified-search__result-placeholder-line-one"}),t._v(" "),e("rect",{staticClass:"unified-search__result-placeholder-line-two",style:{width:"calc(".concat(t.randWidth(),"%)")}})])])}))],2)}),[],!1,null,"9ed03c40",null).exports,Z=r(79753),G=r(16453),W=r(4820),H=r(25108);function Q(t,e,n,r,i,a,o){try{var s=t[a](o),c=s.value}catch(t){return void n(t)}s.done?e(c):Promise.resolve(c).then(r,i)}function V(t){return function(){var e=this,n=arguments;return new Promise((function(r,i){var a=t.apply(e,n);function o(t){Q(a,r,i,o,s,"next",t)}function s(t){Q(a,r,i,o,s,"throw",t)}o(void 0)}))}}var Y=(0,G.loadState)("unified-search","limit-default"),K=(0,G.loadState)("unified-search","min-search-length",1),X=(0,G.loadState)("unified-search","live-search",!0),J=/(^|\s)in:([a-z_-]+)/gi,tt=/(^|\s)-in:([a-z_-]+)/gi;function et(){return nt.apply(this,arguments)}function nt(){return(nt=V(regeneratorRuntime.mark((function t(){var e,n;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,W.default.get((0,Z.generateOcsUrl)("search/providers"),{params:{from:window.location.pathname.replace("/index.php","")+window.location.search}});case 3:if(e=t.sent,!("ocs"in(n=e.data)&&"data"in n.ocs&&Array.isArray(n.ocs.data)&&n.ocs.data.length>0)){t.next=7;break}return t.abrupt("return",n.ocs.data);case 7:t.next=12;break;case 9:t.prev=9,t.t0=t.catch(0),H.error(t.t0);case 12:return t.abrupt("return",[]);case 13:case"end":return t.stop()}}),t,null,[[0,9]])})))).apply(this,arguments)}function rt(t){var e=t.type,n=t.query,r=t.cursor,i=W.default.CancelToken.source(),a=function(){var t=V(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",W.default.get((0,Z.generateOcsUrl)("search/providers/{type}/search",{type:e}),{cancelToken:i.token,params:{term:n,cursor:r,from:window.location.pathname.replace("/index.php","")+window.location.search}}));case 1:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}}();return{request:a,cancel:i.cancel}}function it(t){return function(t){if(Array.isArray(t))return st(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||ot(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function at(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=ot(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var r=0,i=function(){};return{s:i,n:function(){return r>=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}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,s=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return o=t.done,t},e:function(t){s=!0,a=t},f:function(){try{o||null==n.return||n.return()}finally{if(s)throw a}}}}function ot(t,e){if(t){if("string"==typeof t)return st(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)?st(t,e):void 0}}function st(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 ct(t,e,n,r,i,a,o){try{var s=t[a](o),c=s.value}catch(t){return void n(t)}s.done?e(c):Promise.resolve(c).then(r,i)}function ut(t){return function(){var e=this,n=arguments;return new Promise((function(r,i){var a=t.apply(e,n);function o(t){ct(a,r,i,o,s,"next",t)}function s(t){ct(a,r,i,o,s,"throw",t)}o(void 0)}))}}var lt={name:"UnifiedSearch",components:{Magnify:y.default,NcActionButton:h(),NcActions:p(),NcEmptyContent:m(),NcHeaderMenu:v(),NcHighlight:b(),SearchResult:F,SearchResultPlaceholders:T},data:function(){return{types:[],cursors:{},limits:{},loading:{},reached:{},requests:[],results:{},query:"",focused:null,triggered:!1,defaultLimit:Y,minSearchLength:K,enableLiveSearch:X,open:!1}},computed:{typesIDs:function(){return this.types.map((function(t){return t.id}))},typesNames:function(){return this.types.map((function(t){return t.name}))},typesMap:function(){return this.types.reduce((function(t,e){return t[e.id]=e.name,t}),{})},ariaLabel:function(){return t("core","Search")},hasResults:function(){return 0!==Object.keys(this.results).length},orderedResults:function(){var t=this;return this.typesIDs.filter((function(e){return e in t.results})).map((function(e){return{type:e,list:t.results[e]}}))},availableFilters:function(){return Object.keys(this.results)},usedFiltersIn:function(){for(var t,e=[];null!==(t=J.exec(this.query));)e.push(t[2]);return e},usedFiltersNot:function(){for(var t,e=[];null!==(t=tt.exec(this.query));)e.push(t[2]);return e},isShortQuery:function(){return this.query&&this.query.trim().length<K},isValidQuery:function(){return this.query&&""!==this.query.trim()&&!this.isShortQuery},isDoneSearching:function(){return Object.values(this.reached).every((function(t){return!1===t}))},isLoading:function(){return Object.values(this.loading).some((function(t){return!0===t}))}},created:function(){var t=this;return ut(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return(0,l.Ld)("files:navigation:changed",t.onNavigationChange),e.next=3,et();case 3:t.types=e.sent,t.logger.debug("Unified Search initialized with the following providers",t.types);case 5:case"end":return e.stop()}}),e)})))()},beforeDestroy:function(){(0,l.r1)("files:navigation:changed",this.onNavigationChange)},mounted:function(){var t=this;OCP.Accessibility.disableKeyboardShortcuts()||document.addEventListener("keydown",(function(e){e.ctrlKey&&"f"===e.key&&!t.open&&(e.preventDefault(),t.open=!0),t.open&&("ArrowDown"===e.key&&t.focusNext(e),"ArrowUp"===e.key&&t.focusPrev(e))}))},methods:{onOpen:function(){var t=this;return ut(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,et();case 2:t.types=e.sent;case 3:case"end":return e.stop()}}),e)})))()},onClose:function(){(0,l.j8)("nextcloud:unified-search.close")},onNavigationChange:function(){this.$el.querySelector('form[role="search"]').reset()},onReset:function(){(0,l.j8)("nextcloud:unified-search.reset"),this.logger.debug("Search reset"),this.query="",this.resetState(),this.focusInput()},resetState:function(){var t=this;return ut(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t.cursors={},t.limits={},t.reached={},t.results={},t.focused=null,t.triggered=!1,e.next=8,t.cancelPendingRequests();case 8:case"end":return e.stop()}}),e)})))()},cancelPendingRequests:function(){var t=this;return ut(regeneratorRuntime.mark((function e(){var n;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.requests.slice(0),t.requests=[],e.next=4,Promise.all(n.map((function(t){return t()})));case 4:case"end":return e.stop()}}),e)})))()},focusInput:function(){var t=this;this.$nextTick((function(){t.$refs.input.focus(),t.$refs.input.select()}))},onInputEnter:function(){this.hasResults?this.getResultsList()[0].click():this.onInput()},onInput:function(){var t=this;return ut(regeneratorRuntime.mark((function e(){var n,r,i,a,o;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if((0,l.j8)("nextcloud:unified-search.search",{query:t.query}),""!==t.query.trim()&&!t.isShortQuery){e.next=5;break}n=at(t.typesIDs);try{for(n.s();!(r=n.n()).done;)i=r.value,t.$delete(t.results,i)}catch(t){n.e(t)}finally{n.f()}return e.abrupt("return");case 5:return a=t.typesIDs,o=t.query,t.usedFiltersNot.length>0&&(a=t.typesIDs.filter((function(e){return-1===t.usedFiltersNot.indexOf(e)}))),t.usedFiltersIn.length>0&&(a=t.typesIDs.filter((function(e){return t.usedFiltersIn.indexOf(e)>-1}))),o=o.replace(J,"").replace(tt,""),e.next=12,t.resetState();case 12:if(t.triggered=!0,a.length){e.next=16;break}return t.logger.error("No types to search in"),e.abrupt("return");case 16:t.$set(t.loading,"all",!0),t.logger.debug("Searching ".concat(o," in"),a),Promise.all(a.map(function(){var e=ut(regeneratorRuntime.mark((function e(n){var r,i,a,s,c;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,r=rt({type:n,query:o}),i=r.request,a=r.cancel,t.requests.push(a),e.next=5,i();case 5:return s=e.sent,(c=s.data).ocs.data.entries.length>0?t.$set(t.results,n,c.ocs.data.entries):t.$delete(t.results,n),c.ocs.data.cursor?t.$set(t.cursors,n,c.ocs.data.cursor):c.ocs.data.isPaginated||t.$set(t.limits,n,t.defaultLimit),c.ocs.data.entries.length<t.defaultLimit&&t.$set(t.reached,n,!0),null===t.focused&&(t.focused=0),e.abrupt("return",1);case 14:if(e.prev=14,e.t0=e.catch(0),t.$delete(t.results,n),!e.t0.response||!e.t0.response.status){e.next=21;break}return t.logger.error("Error searching for ".concat(t.typesMap[n]),e.t0),(0,d.x2)(t.t("core","An error occurred while searching for {type}",{type:t.typesMap[n]})),e.abrupt("return",0);case 21:return e.abrupt("return",2);case 22:case"end":return e.stop()}}),e,null,[[0,14]])})));return function(t){return e.apply(this,arguments)}}())).then((function(e){e.some((function(t){return 2===t}))||(t.loading={})}));case 19:case"end":return e.stop()}}),e)})))()},onInputDebounced:X?u()((function(t){this.onInput(t)}),500):function(){this.triggered=!1},loadMore:function(t){var e=this;return ut(regeneratorRuntime.mark((function n(){var r,i,a,o,s,c;return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if(!e.loading[t]){n.next=2;break}return n.abrupt("return");case 2:if(!e.cursors[t]){n.next=14;break}return r=rt({type:t,query:e.query,cursor:e.cursors[t]}),i=r.request,a=r.cancel,e.requests.push(a),n.next=7,i();case 7:o=n.sent,(s=o.data).ocs.data.cursor&&e.$set(e.cursors,t,s.ocs.data.cursor),s.ocs.data.entries.length>0&&(c=e.results[t]).push.apply(c,it(s.ocs.data.entries)),s.ocs.data.entries.length<e.defaultLimit&&e.$set(e.reached,t,!0),n.next=15;break;case 14:e.limits[t]&&e.limits[t]>=0&&(e.limits[t]+=e.defaultLimit,e.limits[t]>=e.results[t].length&&e.$set(e.reached,t,!0));case 15:null!==e.focused&&e.$nextTick((function(){e.focusIndex(e.focused)}));case 16:case"end":return n.stop()}}),n)})))()},limitIfAny:function(t,e){return e in this.limits?t.slice(0,this.limits[e]):t},getResultsList:function(){return this.$el.querySelectorAll(".unified-search__results .unified-search__result")},focusFirst:function(t){var e=this.getResultsList();e&&e.length>0&&(t&&t.preventDefault(),this.focused=0,this.focusIndex(this.focused))},focusNext:function(t){if(null!==this.focused){var e=this.getResultsList();e&&e.length>0&&this.focused+1<e.length&&(t.preventDefault(),this.focused++,this.focusIndex(this.focused))}else this.focusFirst(t)},focusPrev:function(t){if(null!==this.focused){var e=this.getResultsList();e&&e.length>0&&this.focused>0&&(t.preventDefault(),this.focused--,this.focusIndex(this.focused))}else this.focusFirst(t)},focusIndex:function(t){var e=this.getResultsList();e&&e[t]&&e[t].focus()},setFocusedIndex:function(t){var e=t.target,n=it(this.getResultsList()).findIndex((function(t){return t===e}));n>-1&&(this.focused=n)},onClickFilter:function(t){this.query="".concat(this.query," ").concat(t).replace(/ {2}/g," ").trim(),this.onInput()}}},dt=lt,ft=r(10437),ht={};ht.styleTagTransform=P(),ht.setAttributes=R(),ht.insert=B().bind(null,"head"),ht.domAPI=D(),ht.insertStyleElement=E(),k()(ft.Z,ht),ft.Z&&ft.Z.locals&&ft.Z.locals;var At=(0,N.Z)(dt,(function(){var t=this,e=t._self._c;return e("NcHeaderMenu",{staticClass:"unified-search",attrs:{id:"unified-search","exclude-click-outside-classes":"popover",open:t.open,"aria-label":t.ariaLabel},on:{"update:open":function(e){t.open=e},open:t.onOpen,close:t.onClose},scopedSlots:t._u([{key:"trigger",fn:function(){return[e("Magnify",{staticClass:"unified-search__trigger",attrs:{size:22,"fill-color":"var(--color-primary-text)"}})]},proxy:!0}])},[t._v(" "),e("div",{staticClass:"unified-search__input-wrapper"},[e("label",{attrs:{for:"unified-search__input"}},[t._v(t._s(t.ariaLabel))]),t._v(" "),e("div",{staticClass:"unified-search__input-row"},[e("form",{staticClass:"unified-search__form",class:{"icon-loading-small":t.isLoading},attrs:{role:"search"},on:{submit:function(e){return e.preventDefault(),e.stopPropagation(),t.onInputEnter.apply(null,arguments)},reset:function(e){return e.preventDefault(),e.stopPropagation(),t.onReset.apply(null,arguments)}}},[e("input",{directives:[{name:"model",rawName:"v-model",value:t.query,expression:"query"}],ref:"input",staticClass:"unified-search__form-input",class:{"unified-search__form-input--with-reset":!!t.query},attrs:{id:"unified-search__input",type:"search",placeholder:t.t("core","Search {types} …",{types:t.typesNames.join(", ")}),"aria-describedby":"unified-search-desc"},domProps:{value:t.query},on:{input:[function(e){e.target.composing||(t.query=e.target.value)},t.onInputDebounced],keypress:function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"enter",13,e.key,"Enter")?null:(e.preventDefault(),e.stopPropagation(),t.onInputEnter.apply(null,arguments))}}}),t._v(" "),e("p",{staticClass:"hidden-visually",attrs:{id:"unified-search-desc"}},[t._v("\n\t\t\t\t\t"+t._s(t.t("core","Search starts once you start typing and results may be reached with the arrow keys"))+"\n\t\t\t\t")]),t._v(" "),t.query&&!t.isLoading?e("input",{staticClass:"unified-search__form-reset icon-close",attrs:{type:"reset","aria-label":t.t("core","Reset search"),value:""}}):t._e(),t._v(" "),!t.query||t.isLoading||t.enableLiveSearch?t._e():e("input",{staticClass:"unified-search__form-submit icon-confirm",attrs:{type:"submit","aria-label":t.t("core","Start search"),value:""}})]),t._v(" "),t.availableFilters.length>1?e("NcActions",{staticClass:"unified-search__filters",attrs:{placement:"bottom",container:".unified-search__input-wrapper"}},t._l(t.availableFilters,(function(n){return e("NcActionButton",{key:n,attrs:{icon:"icon-filter",title:t.t("core","Search for {name} only",{name:t.typesMap[n]})},on:{click:function(e){return e.stopPropagation(),t.onClickFilter("in:".concat(n))}}},[t._v("\n\t\t\t\t\t"+t._s("in:".concat(n))+"\n\t\t\t\t")])})),1):t._e()],1)]),t._v(" "),t.hasResults?t._l(t.orderedResults,(function(n,r){var i=n.list,a=n.type;return e("ul",{key:a,staticClass:"unified-search__results",class:"unified-search__results-".concat(a),attrs:{"aria-label":t.typesMap[a]}},[e("h2",{staticClass:"unified-search__results-header"},[t._v("\n\t\t\t\t"+t._s(t.typesMap[a])+"\n\t\t\t")]),t._v(" "),t._l(t.limitIfAny(i,a),(function(n,i){return e("li",{key:n.resourceUrl},[e("SearchResult",t._b({attrs:{query:t.query,focused:0===t.focused&&0===r&&0===i},on:{focus:t.setFocusedIndex}},"SearchResult",n,!1))],1)})),t._v(" "),e("li",[t.reached[a]?t._e():e("SearchResult",{staticClass:"unified-search__result-more",attrs:{title:t.loading[a]?t.t("core","Loading more results …"):t.t("core","Load more results"),"icon-class":t.loading[a]?"icon-loading-small":""},on:{click:function(e){return e.preventDefault(),e.stopPropagation(),t.loadMore(a)},focus:t.setFocusedIndex}})],1)],2)})):[t.isLoading?e("SearchResultPlaceholders"):t.isValidQuery?e("NcEmptyContent",{scopedSlots:t._u([{key:"icon",fn:function(){return[e("Magnify")]},proxy:!0}],null,!1,931131664)},[t.triggered?e("NcHighlight",{attrs:{text:t.t("core","No results for {query}",{query:t.query}),search:t.query}}):e("div",[t._v("\n\t\t\t\t"+t._s(t.t("core","Press enter to start searching"))+"\n\t\t\t")])],1):!t.isLoading||t.isShortQuery?e("NcEmptyContent",{scopedSlots:t._u([{key:"icon",fn:function(){return[e("Magnify")]},proxy:!0},t.isShortQuery?{key:"desc",fn:function(){return[t._v("\n\t\t\t\t"+t._s(t.n("core","Please enter {minSearchLength} character or more to search","Please enter {minSearchLength} characters or more to search",t.minSearchLength,{minSearchLength:t.minSearchLength}))+"\n\t\t\t")]},proxy:!0}:null],null,!0)},[t._v("\n\t\t\t"+t._s(t.t("core","Start typing to search"))+"\n\t\t\t")]):t._e()]],2)}),[],!1,null,"fdcf2fa2",null),pt=At.exports;r.nc=btoa((0,a.getRequestToken)());var gt=(0,i.IY)().setApp("unified-search").detectUser().build();s.ZP.mixin({data:function(){return{logger:gt}},methods:{t:o.translate,n:o.translatePlural}}),new s.ZP({el:"#unified-search",name:"UnifiedSearchRoot",render:function(t){return t(pt)}})},80850:function(t,e,n){var r=n(87537),i=n.n(r),a=n(23645),o=n.n(a)()(i());o.push([t.id,".unified-search__result[data-v-4805be6c]{display:flex;align-items:center;height:44px;padding:10px;border:2px solid rgba(0,0,0,0);border-radius:var(--border-radius-large) !important}.unified-search__result--focused[data-v-4805be6c]{background-color:var(--color-background-hover)}.unified-search__result[data-v-4805be6c]:active,.unified-search__result[data-v-4805be6c]:hover,.unified-search__result[data-v-4805be6c]:focus{background-color:var(--color-background-hover);border:2px solid var(--color-border-maxcontrast)}.unified-search__result *[data-v-4805be6c]{cursor:pointer}.unified-search__result-icon[data-v-4805be6c]{overflow:hidden;width:44px;height:44px;border-radius:var(--border-radius);background-repeat:no-repeat;background-position:center center;background-size:32px}.unified-search__result-icon--rounded[data-v-4805be6c]{border-radius:22px}.unified-search__result-icon--no-preview[data-v-4805be6c]{background-size:32px}.unified-search__result-icon--with-thumbnail[data-v-4805be6c]{background-size:cover}.unified-search__result-icon--with-thumbnail[data-v-4805be6c]:not(.unified-search__result-icon--rounded){max-width:42px;max-height:42px;border:1px solid var(--color-border)}.unified-search__result-icon img[data-v-4805be6c]{width:100%;height:100%;object-fit:cover;object-position:center}.unified-search__result-icon[data-v-4805be6c],.unified-search__result-actions[data-v-4805be6c]{flex:0 0 44px}.unified-search__result-content[data-v-4805be6c]{display:flex;align-items:center;flex:1 1 100%;flex-wrap:wrap;min-width:0;padding-left:10px}.unified-search__result-line-one[data-v-4805be6c],.unified-search__result-line-two[data-v-4805be6c]{overflow:hidden;flex:1 1 100%;margin:1px 0;white-space:nowrap;text-overflow:ellipsis;color:inherit;font-size:inherit}.unified-search__result-line-two[data-v-4805be6c]{opacity:.7;font-size:var(--default-font-size)}","",{version:3,sources:["webpack://./core/src/components/UnifiedSearch/SearchResult.vue"],names:[],mappings:"AAMA,yCACC,YAAA,CACA,kBAAA,CACA,WANgB,CAOhB,YANQ,CAOR,8BAAA,CACA,mDAAA,CAEA,kDACC,8CAAA,CAGD,8IAGC,8CAAA,CACA,gDAAA,CAGD,2CACC,cAAA,CAGD,8CACC,eAAA,CACA,UA5Be,CA6Bf,WA7Be,CA8Bf,kCAAA,CACA,2BAAA,CACA,iCAAA,CACA,oBAAA,CACA,uDACC,kBAAA,CAED,0DACC,oBAAA,CAED,8DACC,qBAAA,CAED,yGAEC,cAAA,CACA,eAAA,CACA,oCAAA,CAGD,kDAEC,UAAA,CACA,WAAA,CAEA,gBAAA,CACA,sBAAA,CAIF,+FAEC,aAAA,CAGD,iDACC,YAAA,CACA,kBAAA,CACA,aAAA,CACA,cAAA,CAEA,WAAA,CACA,iBAvEO,CA0ER,oGAEC,eAAA,CACA,aAAA,CACA,YAAA,CACA,kBAAA,CACA,sBAAA,CAEA,aAAA,CACA,iBAAA,CAED,kDACC,UAAA,CACA,kCAAA",sourcesContent:['\n@use "sass:math";\n\n$clickable-area: 44px;\n$margin: 10px;\n\n.unified-search__result {\n\tdisplay: flex;\n\talign-items: center;\n\theight: $clickable-area;\n\tpadding: $margin;\n\tborder: 2px solid transparent;\n\tborder-radius: var(--border-radius-large) !important;\n\n\t&--focused {\n\t\tbackground-color: var(--color-background-hover);\n\t}\n\n\t&:active,\n\t&:hover,\n\t&:focus {\n\t\tbackground-color: var(--color-background-hover);\n\t\tborder: 2px solid var(--color-border-maxcontrast);\n\t}\n\n\t* {\n\t\tcursor: pointer;\n\t}\n\n\t&-icon {\n\t\toverflow: hidden;\n\t\twidth: $clickable-area;\n\t\theight: $clickable-area;\n\t\tborder-radius: var(--border-radius);\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position: center center;\n\t\tbackground-size: 32px;\n\t\t&--rounded {\n\t\t\tborder-radius: math.div($clickable-area, 2);\n\t\t}\n\t\t&--no-preview {\n\t\t\tbackground-size: 32px;\n\t\t}\n\t\t&--with-thumbnail {\n\t\t\tbackground-size: cover;\n\t\t}\n\t\t&--with-thumbnail:not(&--rounded) {\n\t\t\t// compensate for border\n\t\t\tmax-width: $clickable-area - 2px;\n\t\t\tmax-height: $clickable-area - 2px;\n\t\t\tborder: 1px solid var(--color-border);\n\t\t}\n\n\t\timg {\n\t\t\t// Make sure to keep ratio\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\n\t\t\tobject-fit: cover;\n\t\t\tobject-position: center;\n\t\t}\n\t}\n\n\t&-icon,\n\t&-actions {\n\t\tflex: 0 0 $clickable-area;\n\t}\n\n\t&-content {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tflex: 1 1 100%;\n\t\tflex-wrap: wrap;\n\t\t// Set to minimum and gro from it\n\t\tmin-width: 0;\n\t\tpadding-left: $margin;\n\t}\n\n\t&-line-one,\n\t&-line-two {\n\t\toverflow: hidden;\n\t\tflex: 1 1 100%;\n\t\tmargin: 1px 0;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t\t// Use the same color as the `a`\n\t\tcolor: inherit;\n\t\tfont-size: inherit;\n\t}\n\t&-line-two {\n\t\topacity: .7;\n\t\tfont-size: var(--default-font-size);\n\t}\n}\n\n'],sourceRoot:""}]),e.Z=o},78033:function(t,e,n){var r=n(87537),i=n.n(r),a=n(23645),o=n.n(a)()(i());o.push([t.id,".unified-search__result-placeholder-gradient[data-v-9ed03c40]{position:fixed;height:0;width:0;z-index:-1}.unified-search__result-placeholder[data-v-9ed03c40]{width:calc(100% - 2 * 10px);height:44px;margin:10px}.unified-search__result-placeholder-icon[data-v-9ed03c40]{width:44px;height:44px;rx:var(--border-radius);ry:var(--border-radius)}.unified-search__result-placeholder-line-one[data-v-9ed03c40],.unified-search__result-placeholder-line-two[data-v-9ed03c40]{width:calc(100% - 54px);height:1em;x:54px}.unified-search__result-placeholder-line-one[data-v-9ed03c40]{y:5px}.unified-search__result-placeholder-line-two[data-v-9ed03c40]{y:25px}","",{version:3,sources:["webpack://./core/src/components/UnifiedSearch/SearchResultPlaceholders.vue"],names:[],mappings:"AAIA,8DACC,cAAA,CACA,QAAA,CACA,OAAA,CACA,UAAA,CAGD,qDACC,2BAAA,CACA,WAZgB,CAahB,WAZQ,CAcR,0DACC,UAhBe,CAiBf,WAjBe,CAkBf,uBAAA,CACA,uBAAA,CAGD,4HAEC,uBAAA,CACA,UAAA,CACA,MAAA,CAGD,8DACC,KAAA,CAGD,8DACC,MAAA",sourcesContent:["\n$clickable-area: 44px;\n$margin: 10px;\n\n.unified-search__result-placeholder-gradient {\n\tposition: fixed;\n\theight: 0;\n\twidth: 0;\n\tz-index: -1;\n}\n\n.unified-search__result-placeholder {\n\twidth: calc(100% - 2 * #{$margin});\n\theight: $clickable-area;\n\tmargin: $margin;\n\n\t&-icon {\n\t\twidth: $clickable-area;\n\t\theight: $clickable-area;\n\t\trx: var(--border-radius);\n\t\try: var(--border-radius);\n\t}\n\n\t&-line-one,\n\t&-line-two {\n\t\twidth: calc(100% - #{$margin + $clickable-area});\n\t\theight: 1em;\n\t\tx: $margin + $clickable-area;\n\t}\n\n\t&-line-one {\n\t\ty: 5px;\n\t}\n\n\t&-line-two {\n\t\ty: 25px;\n\t}\n}\n\n"],sourceRoot:""}]),e.Z=o},10437:function(t,e,n){var r=n(87537),i=n.n(r),a=n(23645),o=n.n(a)()(i());o.push([t.id,".unified-search__trigger[data-v-fdcf2fa2]{filter:var(--background-image-invert-if-bright)}.unified-search__input-wrapper[data-v-fdcf2fa2]{position:sticky;z-index:2;top:0;display:inline-flex;flex-direction:column;align-items:center;width:100%;background-color:var(--color-main-background)}.unified-search__input-wrapper label[for=unified-search__input][data-v-fdcf2fa2]{align-self:flex-start;font-weight:bold;font-size:19px;margin-left:13px}.unified-search__form-input[data-v-fdcf2fa2]{margin:0 !important}.unified-search__input-row[data-v-fdcf2fa2]{display:flex;width:100%;align-items:center}.unified-search__filters[data-v-fdcf2fa2]{margin:10px 0 10px 5px}.unified-search__filters ul[data-v-fdcf2fa2]{display:inline-flex;justify-content:space-between}.unified-search__form[data-v-fdcf2fa2]{position:relative;width:100%;margin:10px 0}.unified-search__form[data-v-fdcf2fa2]::after{right:6px;left:auto}.unified-search__form-input[data-v-fdcf2fa2],.unified-search__form-reset[data-v-fdcf2fa2]{margin:3px}.unified-search__form-input[data-v-fdcf2fa2]{width:100%;height:34px;padding:6px}.unified-search__form-input[data-v-fdcf2fa2],.unified-search__form-input[placeholder][data-v-fdcf2fa2],.unified-search__form-input[data-v-fdcf2fa2]::placeholder{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.unified-search__form-input[data-v-fdcf2fa2]::-webkit-search-decoration,.unified-search__form-input[data-v-fdcf2fa2]::-webkit-search-cancel-button,.unified-search__form-input[data-v-fdcf2fa2]::-webkit-search-results-button,.unified-search__form-input[data-v-fdcf2fa2]::-webkit-search-results-decoration{-webkit-appearance:none}.icon-loading-small .unified-search__form-input[data-v-fdcf2fa2],.unified-search__form-input--with-reset[data-v-fdcf2fa2]{padding-right:34px}.unified-search__form-reset[data-v-fdcf2fa2],.unified-search__form-submit[data-v-fdcf2fa2]{position:absolute;top:0;right:4px;width:28px;height:28px;min-height:30px;padding:0;opacity:.5;border:none;background-color:rgba(0,0,0,0);margin-right:0}.unified-search__form-reset[data-v-fdcf2fa2]:hover,.unified-search__form-reset[data-v-fdcf2fa2]:focus,.unified-search__form-reset[data-v-fdcf2fa2]:active,.unified-search__form-submit[data-v-fdcf2fa2]:hover,.unified-search__form-submit[data-v-fdcf2fa2]:focus,.unified-search__form-submit[data-v-fdcf2fa2]:active{opacity:1}.unified-search__form-submit[data-v-fdcf2fa2]{right:28px}.unified-search__results[data-v-fdcf2fa2]{display:flex;flex-direction:column;gap:4px}.unified-search__results-header[data-v-fdcf2fa2]{display:block;margin:10px;margin-bottom:6px;margin-left:13px;color:var(--color-primary-element);font-size:19px;font-weight:bold}.unified-search .unified-search__result-more[data-v-fdcf2fa2]{color:var(--color-text-maxcontrast)}.unified-search .empty-content[data-v-fdcf2fa2]{margin:10vh 0}.unified-search .empty-content[data-v-fdcf2fa2] .empty-content__title{font-weight:normal;font-size:var(--default-font-size);padding:0 15px;text-align:center}","",{version:3,sources:["webpack://./core/src/views/UnifiedSearch.vue"],names:[],mappings:"AAQC,0CACC,+CAAA,CAGD,gDACC,eAAA,CAEA,SAAA,CACA,KAAA,CACA,mBAAA,CACA,qBAAA,CACA,kBAAA,CACA,UAAA,CACA,6CAAA,CAEA,iFACC,qBAAA,CACA,gBAAA,CACA,cAAA,CACA,gBAAA,CAIF,6CACC,mBAAA,CAGD,4CACC,YAAA,CACA,UAAA,CACA,kBAAA,CAGD,0CACC,sBAAA,CACA,6CACC,mBAAA,CACA,6BAAA,CAIF,uCACC,iBAAA,CACA,UAAA,CACA,aAAA,CAGA,8CACC,SAnDa,CAoDb,SAAA,CAGD,0FAEC,UAAA,CAGD,6CACC,UAAA,CACA,WA/DY,CAgEZ,WA/Da,CAiEb,iKAGC,eAAA,CACA,kBAAA,CACA,sBAAA,CAID,+SAIC,uBAAA,CAID,0HAEC,kBArFW,CAyFb,2FACC,iBAAA,CACA,KAAA,CACA,SAAA,CACA,UAAA,CACA,WAAA,CACA,eAAA,CACA,SAAA,CACA,UAAA,CACA,WAAA,CACA,8BAAA,CACA,cAAA,CAEA,uTAGC,SAAA,CAIF,8CACC,UAAA,CAIF,0CAUC,YAAA,CACA,qBAAA,CACA,OAAA,CAXA,iDACC,aAAA,CACA,WAtHM,CAuHN,iBAAA,CACA,gBAAA,CACA,kCAAA,CACA,cAAA,CACA,gBAAA,CAOF,8DACC,mCAAA,CAGD,gDACC,aAAA,CAEA,sEACC,kBAAA,CACS,kCAAA,CACT,cAAA,CACA,iBAAA",sourcesContent:['\n@use "sass:math";\n\n$margin: 10px;\n$input-height: 34px;\n$input-padding: 6px;\n\n.unified-search {\n\t&__trigger {\n\t\tfilter: var(--background-image-invert-if-bright);\n\t}\n\n\t&__input-wrapper {\n\t\tposition: sticky;\n\t\t// above search results\n\t\tz-index: 2;\n\t\ttop: 0;\n\t\tdisplay: inline-flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\twidth: 100%;\n\t\tbackground-color: var(--color-main-background);\n\n\t\tlabel[for="unified-search__input"] {\n\t\t\talign-self: flex-start;\n\t\t\tfont-weight: bold;\n\t\t\tfont-size: 19px;\n\t\t\tmargin-left: 13px;\n\t\t}\n\t}\n\n\t&__form-input {\n\t\tmargin: 0 !important;\n\t}\n\n\t&__input-row {\n\t\tdisplay: flex;\n\t\twidth: 100%;\n\t\talign-items: center;\n\t}\n\n\t&__filters {\n\t\tmargin: $margin 0 $margin math.div($margin, 2);\n\t\tul {\n\t\t\tdisplay: inline-flex;\n\t\t\tjustify-content: space-between;\n\t\t}\n\t}\n\n\t&__form {\n\t\tposition: relative;\n\t\twidth: 100%;\n\t\tmargin: $margin 0;\n\n\t\t// Loading spinner\n\t\t&::after {\n\t\t\tright: $input-padding;\n\t\t\tleft: auto;\n\t\t}\n\n\t\t&-input,\n\t\t&-reset {\n\t\t\tmargin: math.div($input-padding, 2);\n\t\t}\n\n\t\t&-input {\n\t\t\twidth: 100%;\n\t\t\theight: $input-height;\n\t\t\tpadding: $input-padding;\n\n\t\t\t&,\n\t\t\t&[placeholder],\n\t\t\t&::placeholder {\n\t\t\t\toverflow: hidden;\n\t\t\t\twhite-space: nowrap;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t}\n\n\t\t\t// Hide webkit clear search\n\t\t\t&::-webkit-search-decoration,\n\t\t\t&::-webkit-search-cancel-button,\n\t\t\t&::-webkit-search-results-button,\n\t\t\t&::-webkit-search-results-decoration {\n\t\t\t\t-webkit-appearance: none;\n\t\t\t}\n\n\t\t\t// Ellipsis earlier if reset button is here\n\t\t\t.icon-loading-small &,\n\t\t\t&--with-reset {\n\t\t\t\tpadding-right: $input-height;\n\t\t\t}\n\t\t}\n\n\t\t&-reset, &-submit {\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tright: 4px;\n\t\t\twidth: $input-height - $input-padding;\n\t\t\theight: $input-height - $input-padding;\n\t\t\tmin-height: 30px;\n\t\t\tpadding: 0;\n\t\t\topacity: .5;\n\t\t\tborder: none;\n\t\t\tbackground-color: transparent;\n\t\t\tmargin-right: 0;\n\n\t\t\t&:hover,\n\t\t\t&:focus,\n\t\t\t&:active {\n\t\t\t\topacity: 1;\n\t\t\t}\n\t\t}\n\n\t\t&-submit {\n\t\t\tright: 28px;\n\t\t}\n\t}\n\n\t&__results {\n\t\t&-header {\n\t\t\tdisplay: block;\n\t\t\tmargin: $margin;\n\t\t\tmargin-bottom: $margin - 4px;\n\t\t\tmargin-left: 13px;\n\t\t\tcolor: var(--color-primary-element);\n\t\t\tfont-size: 19px;\n\t\t\tfont-weight: bold;\n\t\t}\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 4px;\n\t}\n\n\t.unified-search__result-more::v-deep {\n\t\tcolor: var(--color-text-maxcontrast);\n\t}\n\n\t.empty-content {\n\t\tmargin: 10vh 0;\n\n\t\t::v-deep .empty-content__title {\n\t\t\tfont-weight: normal;\n font-size: var(--default-font-size);\n\t\t\tpadding: 0 15px;\n\t\t\ttext-align: center;\n\t\t}\n\t}\n}\n\n'],sourceRoot:""}]),e.Z=o}},r={};function i(t){var e=r[t];if(void 0!==e)return e.exports;var a=r[t]={id:t,loaded:!1,exports:{}};return n[t].call(a.exports,a,a.exports,i),a.loaded=!0,a.exports}i.m=n,i.amdD=function(){throw new Error("define cannot be used indirect")},i.amdO={},e=[],i.O=function(t,n,r,a){if(!n){var o=1/0;for(l=0;l<e.length;l++){n=e[l][0],r=e[l][1],a=e[l][2];for(var s=!0,c=0;c<n.length;c++)(!1&a||o>=a)&&Object.keys(i.O).every((function(t){return i.O[t](n[c])}))?n.splice(c--,1):(s=!1,a<o&&(o=a));if(s){e.splice(l--,1);var u=r();void 0!==u&&(t=u)}}return t}a=a||0;for(var l=e.length;l>0&&e[l-1][2]>a;l--)e[l]=e[l-1];e[l]=[n,r,a]},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,{a:e}),e},i.d=function(t,e){for(var n in e)i.o(e,n)&&!i.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},i.nmd=function(t){return t.paths=[],t.children||(t.children=[]),t},i.j=9671,function(){i.b=document.baseURI||self.location.href;var t={9671:0};i.O.j=function(e){return 0===t[e]};var e=function(e,n){var r,a,o=n[0],s=n[1],c=n[2],u=0;if(o.some((function(e){return 0!==t[e]}))){for(r in s)i.o(s,r)&&(i.m[r]=s[r]);if(c)var l=c(i)}for(e&&e(n);u<o.length;u++)a=o[u],i.o(t,a)&&t[a]&&t[a][0](),t[a]=0;return i.O(l)},n=self.webpackChunknextcloud=self.webpackChunknextcloud||[];n.forEach(e.bind(null,0)),n.push=e.bind(null,n.push.bind(n))}(),i.nc=void 0;var a=i.O(void 0,[7874],(function(){return i(56874)}));a=i.O(a)}(); +//# sourceMappingURL=core-unified-search.js.map?v=8382290185d85f72dbc7
\ No newline at end of file diff --git a/dist/core-unified-search.js.map b/dist/core-unified-search.js.map index e41a4dfc45e..987404d1420 100644 --- a/dist/core-unified-search.js.map +++ b/dist/core-unified-search.js.map @@ -1 +1 @@ -{"version":3,"file":"core-unified-search.js?v=3432fb5fc2328df258e0","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/core/src/components/UnifiedSearch/SearchResult.vue?vue&type=script&lang=js&","webpack:///nextcloud/core/src/components/UnifiedSearch/SearchResult.vue","webpack://nextcloud/./core/src/components/UnifiedSearch/SearchResult.vue?c003","webpack://nextcloud/./core/src/components/UnifiedSearch/SearchResult.vue?32d3","webpack://nextcloud/./core/src/components/UnifiedSearch/SearchResult.vue?e4b5","webpack:///nextcloud/core/src/components/UnifiedSearch/SearchResultPlaceholders.vue?vue&type=script&lang=js&","webpack:///nextcloud/core/src/components/UnifiedSearch/SearchResultPlaceholders.vue","webpack://nextcloud/./core/src/components/UnifiedSearch/SearchResultPlaceholders.vue?f8e5","webpack://nextcloud/./core/src/components/UnifiedSearch/SearchResultPlaceholders.vue?7f72","webpack://nextcloud/./core/src/components/UnifiedSearch/SearchResultPlaceholders.vue?cc53","webpack:///nextcloud/core/src/services/UnifiedSearchService.js","webpack:///nextcloud/core/src/views/UnifiedSearch.vue","webpack:///nextcloud/core/src/views/UnifiedSearch.vue?vue&type=script&lang=js&","webpack://nextcloud/./core/src/views/UnifiedSearch.vue?bfda","webpack://nextcloud/./core/src/views/UnifiedSearch.vue?1990","webpack://nextcloud/./core/src/views/UnifiedSearch.vue?adc0","webpack:///nextcloud/core/src/unified-search.js","webpack:///nextcloud/core/src/components/UnifiedSearch/SearchResult.vue?vue&type=style&index=0&id=4805be6c&prod&lang=scss&scoped=true&","webpack:///nextcloud/core/src/components/UnifiedSearch/SearchResultPlaceholders.vue?vue&type=style&index=0&id=9ed03c40&prod&lang=scss&scoped=true&","webpack:///nextcloud/core/src/views/UnifiedSearch.vue?vue&type=style&index=0&id=7bce572d&prod&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/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SearchResult.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!./SearchResult.vue?vue&type=script&lang=js&\""," <!--\n - @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n<template>\n\t<a :href=\"resourceUrl || '#'\"\n\t\tclass=\"unified-search__result\"\n\t\t:class=\"{\n\t\t\t'unified-search__result--focused': focused,\n\t\t}\"\n\t\t@click=\"reEmitEvent\"\n\t\t@focus=\"reEmitEvent\">\n\n\t\t<!-- Icon describing the result -->\n\t\t<div class=\"unified-search__result-icon\"\n\t\t\t:class=\"{\n\t\t\t\t'unified-search__result-icon--rounded': rounded,\n\t\t\t\t'unified-search__result-icon--no-preview': !hasValidThumbnail && !loaded,\n\t\t\t\t'unified-search__result-icon--with-thumbnail': hasValidThumbnail && loaded,\n\t\t\t\t[icon]: !loaded && !isIconUrl,\n\t\t\t}\"\n\t\t\t:style=\"{\n\t\t\t\tbackgroundImage: isIconUrl ? `url(${icon})` : '',\n\t\t\t}\">\n\n\t\t\t<img v-if=\"hasValidThumbnail\"\n\t\t\t\tv-show=\"loaded\"\n\t\t\t\t:src=\"thumbnailUrl\"\n\t\t\t\talt=\"\"\n\t\t\t\t@error=\"onError\"\n\t\t\t\t@load=\"onLoad\">\n\t\t</div>\n\n\t\t<!-- Title and sub-title -->\n\t\t<span class=\"unified-search__result-content\">\n\t\t\t<span class=\"unified-search__result-line-one\" :title=\"title\">\n\t\t\t\t<NcHighlight :text=\"title\" :search=\"query\" />\n\t\t\t</span>\n\t\t\t<span v-if=\"subline\" class=\"unified-search__result-line-two\" :title=\"subline\">{{ subline }}</span>\n\t\t</span>\n\t</a>\n</template>\n\n<script>\nimport NcHighlight from '@nextcloud/vue/dist/Components/NcHighlight'\n\nexport default {\n\tname: 'SearchResult',\n\n\tcomponents: {\n\t\tNcHighlight,\n\t},\n\n\tprops: {\n\t\tthumbnailUrl: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\t\ttitle: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tsubline: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\t\tresourceUrl: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\t\ticon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\trounded: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tquery: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * Only used for the first result as a visual feedback\n\t\t * so we can keep the search input focused but pressing\n\t\t * enter still opens the first result\n\t\t */\n\t\tfocused: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\thasValidThumbnail: this.thumbnailUrl && this.thumbnailUrl.trim() !== '',\n\t\t\tloaded: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tisIconUrl() {\n\t\t\t// If we're facing an absolute url\n\t\t\tif (this.icon.startsWith('/')) {\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\t// Otherwise, let's check if this is a valid url\n\t\t\ttry {\n\t\t\t\t// eslint-disable-next-line no-new\n\t\t\t\tnew URL(this.icon)\n\t\t\t} catch {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn true\n\t\t},\n\t},\n\n\twatch: {\n\t\t// Make sure to reset state on change even when vue recycle the component\n\t\tthumbnailUrl() {\n\t\t\tthis.hasValidThumbnail = this.thumbnailUrl && this.thumbnailUrl.trim() !== ''\n\t\t\tthis.loaded = false\n\t\t},\n\t},\n\n\tmethods: {\n\t\treEmitEvent(e) {\n\t\t\tthis.$emit(e.type, e)\n\t\t},\n\n\t\t/**\n\t\t * If the image fails to load, fallback to iconClass\n\t\t */\n\t\tonError() {\n\t\t\tthis.hasValidThumbnail = false\n\t\t},\n\n\t\tonLoad() {\n\t\t\tthis.loaded = true\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@use \"sass:math\";\n\n$clickable-area: 44px;\n$margin: 10px;\n\n.unified-search__result {\n\tdisplay: flex;\n\talign-items: center;\n\theight: $clickable-area;\n\tpadding: $margin;\n\tborder: 2px solid transparent;\n\tborder-radius: var(--border-radius-large) !important;\n\n\t&--focused {\n\t\tbackground-color: var(--color-background-hover);\n\t}\n\n\t&:active,\n\t&:hover,\n\t&:focus {\n\t\tbackground-color: var(--color-background-hover);\n\t\tborder: 2px solid var(--color-border-maxcontrast);\n\t}\n\n\t* {\n\t\tcursor: pointer;\n\t}\n\n\t&-icon {\n\t\toverflow: hidden;\n\t\twidth: $clickable-area;\n\t\theight: $clickable-area;\n\t\tborder-radius: var(--border-radius);\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position: center center;\n\t\tbackground-size: 32px;\n\t\t&--rounded {\n\t\t\tborder-radius: math.div($clickable-area, 2);\n\t\t}\n\t\t&--no-preview {\n\t\t\tbackground-size: 32px;\n\t\t}\n\t\t&--with-thumbnail {\n\t\t\tbackground-size: cover;\n\t\t}\n\t\t&--with-thumbnail:not(&--rounded) {\n\t\t\t// compensate for border\n\t\t\tmax-width: $clickable-area - 2px;\n\t\t\tmax-height: $clickable-area - 2px;\n\t\t\tborder: 1px solid var(--color-border);\n\t\t}\n\n\t\timg {\n\t\t\t// Make sure to keep ratio\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\n\t\t\tobject-fit: cover;\n\t\t\tobject-position: center;\n\t\t}\n\t}\n\n\t&-icon,\n\t&-actions {\n\t\tflex: 0 0 $clickable-area;\n\t}\n\n\t&-content {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tflex: 1 1 100%;\n\t\tflex-wrap: wrap;\n\t\t// Set to minimum and gro from it\n\t\tmin-width: 0;\n\t\tpadding-left: $margin;\n\t}\n\n\t&-line-one,\n\t&-line-two {\n\t\toverflow: hidden;\n\t\tflex: 1 1 100%;\n\t\tmargin: 1px 0;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t\t// Use the same color as the `a`\n\t\tcolor: inherit;\n\t\tfont-size: inherit;\n\t}\n\t&-line-two {\n\t\topacity: .7;\n\t\tfont-size: var(--default-font-size);\n\t}\n}\n\n</style>\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SearchResult.vue?vue&type=style&index=0&id=4805be6c&prod&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!./SearchResult.vue?vue&type=style&index=0&id=4805be6c&prod&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./SearchResult.vue?vue&type=template&id=4805be6c&scoped=true&\"\nimport script from \"./SearchResult.vue?vue&type=script&lang=js&\"\nexport * from \"./SearchResult.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SearchResult.vue?vue&type=style&index=0&id=4805be6c&prod&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 \"4805be6c\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('a',{staticClass:\"unified-search__result\",class:{\n\t\t'unified-search__result--focused': _vm.focused,\n\t},attrs:{\"href\":_vm.resourceUrl || '#'},on:{\"click\":_vm.reEmitEvent,\"focus\":_vm.reEmitEvent}},[_c('div',{staticClass:\"unified-search__result-icon\",class:{\n\t\t\t'unified-search__result-icon--rounded': _vm.rounded,\n\t\t\t'unified-search__result-icon--no-preview': !_vm.hasValidThumbnail && !_vm.loaded,\n\t\t\t'unified-search__result-icon--with-thumbnail': _vm.hasValidThumbnail && _vm.loaded,\n\t\t\t[_vm.icon]: !_vm.loaded && !_vm.isIconUrl,\n\t\t},style:({\n\t\t\tbackgroundImage: _vm.isIconUrl ? `url(${_vm.icon})` : '',\n\t\t})},[(_vm.hasValidThumbnail)?_c('img',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.loaded),expression:\"loaded\"}],attrs:{\"src\":_vm.thumbnailUrl,\"alt\":\"\"},on:{\"error\":_vm.onError,\"load\":_vm.onLoad}}):_vm._e()]),_vm._v(\" \"),_c('span',{staticClass:\"unified-search__result-content\"},[_c('span',{staticClass:\"unified-search__result-line-one\",attrs:{\"title\":_vm.title}},[_c('NcHighlight',{attrs:{\"text\":_vm.title,\"search\":_vm.query}})],1),_vm._v(\" \"),(_vm.subline)?_c('span',{staticClass:\"unified-search__result-line-two\",attrs:{\"title\":_vm.subline}},[_vm._v(_vm._s(_vm.subline))]):_vm._e()])])\n}\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!./SearchResultPlaceholders.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!./SearchResultPlaceholders.vue?vue&type=script&lang=js&\"","<template>\n\t<ul>\n\t\t<!-- Placeholder animation -->\n\t\t<svg class=\"unified-search__result-placeholder-gradient\">\n\t\t\t<defs>\n\t\t\t\t<linearGradient id=\"unified-search__result-placeholder-gradient\">\n\t\t\t\t\t<stop offset=\"0%\" :stop-color=\"light\">\n\t\t\t\t\t\t<animate attributeName=\"stop-color\"\n\t\t\t\t\t\t\t:values=\"`${light}; ${light}; ${dark}; ${dark}; ${light}`\"\n\t\t\t\t\t\t\tdur=\"2s\"\n\t\t\t\t\t\t\trepeatCount=\"indefinite\" />\n\t\t\t\t\t</stop>\n\t\t\t\t\t<stop offset=\"100%\" :stop-color=\"dark\">\n\t\t\t\t\t\t<animate attributeName=\"stop-color\"\n\t\t\t\t\t\t\t:values=\"`${dark}; ${light}; ${light}; ${dark}; ${dark}`\"\n\t\t\t\t\t\t\tdur=\"2s\"\n\t\t\t\t\t\t\trepeatCount=\"indefinite\" />\n\t\t\t\t\t</stop>\n\t\t\t\t</linearGradient>\n\t\t\t</defs>\n\t\t</svg>\n\n\t\t<!-- Placeholders -->\n\t\t<li v-for=\"placeholder in [1, 2, 3]\" :key=\"placeholder\">\n\t\t\t<svg class=\"unified-search__result-placeholder\"\n\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\tfill=\"url(#unified-search__result-placeholder-gradient)\">\n\t\t\t\t<rect class=\"unified-search__result-placeholder-icon\" />\n\t\t\t\t<rect class=\"unified-search__result-placeholder-line-one\" />\n\t\t\t\t<rect class=\"unified-search__result-placeholder-line-two\" :style=\"{width: `calc(${randWidth()}%)`}\" />\n\t\t\t</svg>\n\t\t</li>\n\t</ul>\n</template>\n\n<script>\nexport default {\n\tname: 'SearchResultPlaceholders',\n\n\tdata() {\n\t\treturn {\n\t\t\tlight: null,\n\t\t\tdark: null,\n\t\t}\n\t},\n\tmounted() {\n\t\tconst styles = getComputedStyle(document.documentElement)\n\t\tthis.dark = styles.getPropertyValue('--color-placeholder-dark')\n\t\tthis.light = styles.getPropertyValue('--color-placeholder-light')\n\t},\n\n\tmethods: {\n\t\trandWidth() {\n\t\t\treturn Math.floor(Math.random() * 20) + 30\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n$clickable-area: 44px;\n$margin: 10px;\n\n.unified-search__result-placeholder-gradient {\n\tposition: fixed;\n\theight: 0;\n\twidth: 0;\n\tz-index: -1;\n}\n\n.unified-search__result-placeholder {\n\twidth: calc(100% - 2 * #{$margin});\n\theight: $clickable-area;\n\tmargin: $margin;\n\n\t&-icon {\n\t\twidth: $clickable-area;\n\t\theight: $clickable-area;\n\t\trx: var(--border-radius);\n\t\try: var(--border-radius);\n\t}\n\n\t&-line-one,\n\t&-line-two {\n\t\twidth: calc(100% - #{$margin + $clickable-area});\n\t\theight: 1em;\n\t\tx: $margin + $clickable-area;\n\t}\n\n\t&-line-one {\n\t\ty: 5px;\n\t}\n\n\t&-line-two {\n\t\ty: 25px;\n\t}\n}\n\n</style>\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SearchResultPlaceholders.vue?vue&type=style&index=0&id=9ed03c40&prod&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!./SearchResultPlaceholders.vue?vue&type=style&index=0&id=9ed03c40&prod&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./SearchResultPlaceholders.vue?vue&type=template&id=9ed03c40&scoped=true&\"\nimport script from \"./SearchResultPlaceholders.vue?vue&type=script&lang=js&\"\nexport * from \"./SearchResultPlaceholders.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SearchResultPlaceholders.vue?vue&type=style&index=0&id=9ed03c40&prod&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 \"9ed03c40\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('ul',[_c('svg',{staticClass:\"unified-search__result-placeholder-gradient\"},[_c('defs',[_c('linearGradient',{attrs:{\"id\":\"unified-search__result-placeholder-gradient\"}},[_c('stop',{attrs:{\"offset\":\"0%\",\"stop-color\":_vm.light}},[_c('animate',{attrs:{\"attributeName\":\"stop-color\",\"values\":`${_vm.light}; ${_vm.light}; ${_vm.dark}; ${_vm.dark}; ${_vm.light}`,\"dur\":\"2s\",\"repeatCount\":\"indefinite\"}})]),_vm._v(\" \"),_c('stop',{attrs:{\"offset\":\"100%\",\"stop-color\":_vm.dark}},[_c('animate',{attrs:{\"attributeName\":\"stop-color\",\"values\":`${_vm.dark}; ${_vm.light}; ${_vm.light}; ${_vm.dark}; ${_vm.dark}`,\"dur\":\"2s\",\"repeatCount\":\"indefinite\"}})])],1)],1)]),_vm._v(\" \"),_vm._l(([1, 2, 3]),function(placeholder){return _c('li',{key:placeholder},[_c('svg',{staticClass:\"unified-search__result-placeholder\",attrs:{\"xmlns\":\"http://www.w3.org/2000/svg\",\"fill\":\"url(#unified-search__result-placeholder-gradient)\"}},[_c('rect',{staticClass:\"unified-search__result-placeholder-icon\"}),_vm._v(\" \"),_c('rect',{staticClass:\"unified-search__result-placeholder-line-one\"}),_vm._v(\" \"),_c('rect',{staticClass:\"unified-search__result-placeholder-line-two\",style:({width: `calc(${_vm.randWidth()}%)`})})])])})],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright 2020, John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author Christoph Wurst <christoph@winzerhof-wurst.at>\n * @author Daniel Calviño Sánchez <danxuliu@gmail.com>\n * @author Joas Schilling <coding@schilljs.com>\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 { generateOcsUrl } from '@nextcloud/router'\nimport { loadState } from '@nextcloud/initial-state'\nimport axios from '@nextcloud/axios'\n\nexport const defaultLimit = loadState('unified-search', 'limit-default')\nexport const minSearchLength = loadState('unified-search', 'min-search-length', 1)\nexport const enableLiveSearch = loadState('unified-search', 'live-search', true)\n\nexport const regexFilterIn = /(^|\\s)in:([a-z_-]+)/ig\nexport const regexFilterNot = /(^|\\s)-in:([a-z_-]+)/ig\n\n/**\n * Create a cancel token\n *\n * @return {import('axios').CancelTokenSource}\n */\nconst createCancelToken = () => axios.CancelToken.source()\n\n/**\n * Get the list of available search providers\n *\n * @return {Promise<Array>}\n */\nexport async function getTypes() {\n\ttry {\n\t\tconst { data } = await axios.get(generateOcsUrl('search/providers'), {\n\t\t\tparams: {\n\t\t\t\t// Sending which location we're currently at\n\t\t\t\tfrom: window.location.pathname.replace('/index.php', '') + window.location.search,\n\t\t\t},\n\t\t})\n\t\tif ('ocs' in data && 'data' in data.ocs && Array.isArray(data.ocs.data) && data.ocs.data.length > 0) {\n\t\t\t// Providers are sorted by the api based on their order key\n\t\t\treturn data.ocs.data\n\t\t}\n\t} catch (error) {\n\t\tconsole.error(error)\n\t}\n\treturn []\n}\n\n/**\n * Get the list of available search providers\n *\n * @param {object} options destructuring object\n * @param {string} options.type the type to search\n * @param {string} options.query the search\n * @param {number|string|undefined} options.cursor the offset for paginated searches\n * @return {object} {request: Promise, cancel: Promise}\n */\nexport function search({ type, query, cursor }) {\n\t/**\n\t * Generate an axios cancel token\n\t */\n\tconst cancelToken = createCancelToken()\n\n\tconst request = async () => axios.get(generateOcsUrl('search/providers/{type}/search', { type }), {\n\t\tcancelToken: cancelToken.token,\n\t\tparams: {\n\t\t\tterm: query,\n\t\t\tcursor,\n\t\t\t// Sending which location we're currently at\n\t\t\tfrom: window.location.pathname.replace('/index.php', '') + window.location.search,\n\t\t},\n\t})\n\n\treturn {\n\t\trequest,\n\t\tcancel: cancelToken.cancel,\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 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<NcHeaderMenu id=\"unified-search\"\n\t\tclass=\"unified-search\"\n\t\texclude-click-outside-classes=\"popover\"\n\t\t:open.sync=\"open\"\n\t\t:aria-label=\"ariaLabel\"\n\t\t@open=\"onOpen\"\n\t\t@close=\"onClose\">\n\t\t<!-- Header icon -->\n\t\t<template #trigger>\n\t\t\t<Magnify class=\"unified-search__trigger\"\n\t\t\t\t:size=\"22/* fit better next to other 20px icons */\"\n\t\t\t\tfill-color=\"var(--color-primary-text)\" />\n\t\t</template>\n\n\t\t<!-- Search form & filters wrapper -->\n\t\t<div class=\"unified-search__input-wrapper\">\n\t\t\t<label for=\"unified-search__input\">{{ ariaLabel }}</label>\n\t\t\t<div class=\"unified-search__input-row\">\n\t\t\t\t<form class=\"unified-search__form\"\n\t\t\t\t\trole=\"search\"\n\t\t\t\t\t:class=\"{'icon-loading-small': isLoading}\"\n\t\t\t\t\t@submit.prevent.stop=\"onInputEnter\"\n\t\t\t\t\t@reset.prevent.stop=\"onReset\">\n\t\t\t\t\t<!-- Search input -->\n\t\t\t\t\t<input ref=\"input\"\n\t\t\t\t\t\tid=\"unified-search__input\"\n\t\t\t\t\t\tv-model=\"query\"\n\t\t\t\t\t\tclass=\"unified-search__form-input\"\n\t\t\t\t\t\ttype=\"search\"\n\t\t\t\t\t\t:class=\"{'unified-search__form-input--with-reset': !!query}\"\n\t\t\t\t\t\t:placeholder=\"t('core', 'Search {types} …', { types: typesNames.join(', ') })\"\n\t\t\t\t\t\taria-describedby=\"unified-search-desc\"\n\t\t\t\t\t\t@input=\"onInputDebounced\"\n\t\t\t\t\t\t@keypress.enter.prevent.stop=\"onInputEnter\">\n\t\t\t\t\t<p id=\"unified-search-desc\" class=\"hidden-visually\">\n\t\t\t\t\t\t{{ t('core', 'Search starts once you start typing and results may be reached with the arrow keys') }}\n\t\t\t\t\t</p>\n\n\t\t\t\t\t<!-- Reset search button -->\n\t\t\t\t\t<input v-if=\"!!query && !isLoading\"\n\t\t\t\t\t\ttype=\"reset\"\n\t\t\t\t\t\tclass=\"unified-search__form-reset icon-close\"\n\t\t\t\t\t\t:aria-label=\"t('core','Reset search')\"\n\t\t\t\t\t\tvalue=\"\">\n\n\t\t\t\t\t<input v-if=\"!!query && !isLoading && !enableLiveSearch\"\n\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\tclass=\"unified-search__form-submit icon-confirm\"\n\t\t\t\t\t\t:aria-label=\"t('core','Start search')\"\n\t\t\t\t\t\tvalue=\"\">\n\t\t\t\t</form>\n\n\t\t\t\t<!-- Search filters -->\n\t\t\t\t<NcActions v-if=\"availableFilters.length > 1\"\n\t\t\t\t\tclass=\"unified-search__filters\"\n\t\t\t\t\tplacement=\"bottom\"\n\t\t\t\t\tcontainer=\".unified-search__input-wrapper\">\n\t\t\t\t\t<!-- FIXME use element ref for container after https://github.com/nextcloud/nextcloud-vue/pull/3462 -->\n\t\t\t\t\t<NcActionButton v-for=\"type in availableFilters\"\n\t\t\t\t\t\t:key=\"type\"\n\t\t\t\t\t\ticon=\"icon-filter\"\n\t\t\t\t\t\t:title=\"t('core', 'Search for {name} only', { name: typesMap[type] })\"\n\t\t\t\t\t\t@click.stop=\"onClickFilter(`in:${type}`)\">\n\t\t\t\t\t\t{{ `in:${type}` }}\n\t\t\t\t\t</NcActionButton>\n\t\t\t\t</NcActions>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<template v-if=\"!hasResults\">\n\t\t\t<!-- Loading placeholders -->\n\t\t\t<SearchResultPlaceholders v-if=\"isLoading\" />\n\n\t\t\t<NcEmptyContent v-else-if=\"isValidQuery\">\n\t\t\t\t<NcHighlight v-if=\"triggered\" :text=\"t('core', 'No results for {query}', { query })\" :search=\"query\" />\n\t\t\t\t<div v-else>\n\t\t\t\t\t{{ t('core', 'Press enter to start searching') }}\n\t\t\t\t</div>\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Magnify />\n\t\t\t\t</template>\n\t\t\t</NcEmptyContent>\n\n\t\t\t<NcEmptyContent v-else-if=\"!isLoading || isShortQuery\">\n\t\t\t\t{{ t('core', 'Start typing to search') }}\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Magnify />\n\t\t\t\t</template>\n\t\t\t\t<template v-if=\"isShortQuery\" #desc>\n\t\t\t\t\t{{ n('core',\n\t\t\t\t\t\t'Please enter {minSearchLength} character or more to search',\n\t\t\t\t\t\t'Please enter {minSearchLength} characters or more to search',\n\t\t\t\t\t\tminSearchLength,\n\t\t\t\t\t\t{minSearchLength}) }}\n\t\t\t\t</template>\n\t\t\t</NcEmptyContent>\n\t\t</template>\n\n\t\t<!-- Grouped search results -->\n\t\t<template v-else>\n\t\t\t<ul v-for=\"({list, type}, typesIndex) in orderedResults\"\n\t\t\t\t:key=\"type\"\n\t\t\t\tclass=\"unified-search__results\"\n\t\t\t\t:class=\"`unified-search__results-${type}`\"\n\t\t\t\t:aria-label=\"typesMap[type]\">\n\t\t\t\t<h2 class=\"unified-search__results-header\">\n\t\t\t\t\t{{ typesMap[type] }}\n\t\t\t\t</h2>\n\n\t\t\t\t<!-- Search results -->\n\t\t\t\t<li v-for=\"(result, index) in limitIfAny(list, type)\" :key=\"result.resourceUrl\">\n\t\t\t\t\t<SearchResult v-bind=\"result\"\n\t\t\t\t\t\t:query=\"query\"\n\t\t\t\t\t\t:focused=\"focused === 0 && typesIndex === 0 && index === 0\"\n\t\t\t\t\t\t@focus=\"setFocusedIndex\" />\n\t\t\t\t</li>\n\n\t\t\t\t<!-- Load more button -->\n\t\t\t\t<li>\n\t\t\t\t\t<SearchResult v-if=\"!reached[type]\"\n\t\t\t\t\t\tclass=\"unified-search__result-more\"\n\t\t\t\t\t\t:title=\"loading[type]\n\t\t\t\t\t\t\t? t('core', 'Loading more results …')\n\t\t\t\t\t\t\t: t('core', 'Load more results')\"\n\t\t\t\t\t\t:icon-class=\"loading[type] ? 'icon-loading-small' : ''\"\n\t\t\t\t\t\t@click.stop=\"loadMore(type)\"\n\t\t\t\t\t\t@focus=\"setFocusedIndex\" />\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t</template>\n\t</NcHeaderMenu>\n</template>\n\n<script>\nimport debounce from 'debounce'\nimport { emit, subscribe, unsubscribe } from '@nextcloud/event-bus'\nimport { showError } from '@nextcloud/dialogs'\n\nimport NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton.js'\nimport NcActions from '@nextcloud/vue/dist/Components/NcActions.js'\nimport NcEmptyContent from '@nextcloud/vue/dist/Components/NcEmptyContent.js'\nimport NcHeaderMenu from '@nextcloud/vue/dist/Components/NcHeaderMenu.js'\nimport NcHighlight from '@nextcloud/vue/dist/Components/NcHighlight.js'\n\nimport Magnify from 'vue-material-design-icons/Magnify.vue'\n\nimport SearchResult from '../components/UnifiedSearch/SearchResult.vue'\nimport SearchResultPlaceholders from '../components/UnifiedSearch/SearchResultPlaceholders.vue'\n\nimport { minSearchLength, getTypes, search, defaultLimit, regexFilterIn, regexFilterNot, enableLiveSearch } from '../services/UnifiedSearchService.js'\n\nconst REQUEST_FAILED = 0\nconst REQUEST_OK = 1\nconst REQUEST_CANCELED = 2\n\nexport default {\n\tname: 'UnifiedSearch',\n\n\tcomponents: {\n\t\tMagnify,\n\t\tNcActionButton,\n\t\tNcActions,\n\t\tNcEmptyContent,\n\t\tNcHeaderMenu,\n\t\tNcHighlight,\n\t\tSearchResult,\n\t\tSearchResultPlaceholders,\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\ttypes: [],\n\n\t\t\t// Cursors per types\n\t\t\tcursors: {},\n\t\t\t// Various search limits per types\n\t\t\tlimits: {},\n\t\t\t// Loading types\n\t\t\tloading: {},\n\t\t\t// Reached search types\n\t\t\treached: {},\n\t\t\t// Pending cancellable requests\n\t\t\trequests: [],\n\t\t\t// List of all results\n\t\t\tresults: {},\n\n\t\t\tquery: '',\n\t\t\tfocused: null,\n\t\t\ttriggered: false,\n\n\t\t\tdefaultLimit,\n\t\t\tminSearchLength,\n\t\t\tenableLiveSearch,\n\n\t\t\topen: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\ttypesIDs() {\n\t\t\treturn this.types.map(type => type.id)\n\t\t},\n\t\ttypesNames() {\n\t\t\treturn this.types.map(type => type.name)\n\t\t},\n\t\ttypesMap() {\n\t\t\treturn this.types.reduce((prev, curr) => {\n\t\t\t\tprev[curr.id] = curr.name\n\t\t\t\treturn prev\n\t\t\t}, {})\n\t\t},\n\n\t\tariaLabel() {\n\t\t\treturn t('core', 'Search')\n\t\t},\n\n\t\t/**\n\t\t * Is there any result to display\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\thasResults() {\n\t\t\treturn Object.keys(this.results).length !== 0\n\t\t},\n\n\t\t/**\n\t\t * Return ordered results\n\t\t *\n\t\t * @return {Array}\n\t\t */\n\t\torderedResults() {\n\t\t\treturn this.typesIDs\n\t\t\t\t.filter(type => type in this.results)\n\t\t\t\t.map(type => ({\n\t\t\t\t\ttype,\n\t\t\t\t\tlist: this.results[type],\n\t\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * Available filters\n\t\t * We only show filters that are available on the results\n\t\t *\n\t\t * @return {string[]}\n\t\t */\n\t\tavailableFilters() {\n\t\t\treturn Object.keys(this.results)\n\t\t},\n\n\t\t/**\n\t\t * Applied filters\n\t\t *\n\t\t * @return {string[]}\n\t\t */\n\t\tusedFiltersIn() {\n\t\t\tlet match\n\t\t\tconst filters = []\n\t\t\twhile ((match = regexFilterIn.exec(this.query)) !== null) {\n\t\t\t\tfilters.push(match[2])\n\t\t\t}\n\t\t\treturn filters\n\t\t},\n\n\t\t/**\n\t\t * Applied anti filters\n\t\t *\n\t\t * @return {string[]}\n\t\t */\n\t\tusedFiltersNot() {\n\t\t\tlet match\n\t\t\tconst filters = []\n\t\t\twhile ((match = regexFilterNot.exec(this.query)) !== null) {\n\t\t\t\tfilters.push(match[2])\n\t\t\t}\n\t\t\treturn filters\n\t\t},\n\n\t\t/**\n\t\t * Is the current search too short\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisShortQuery() {\n\t\t\treturn this.query && this.query.trim().length < minSearchLength\n\t\t},\n\n\t\t/**\n\t\t * Is the current search valid\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisValidQuery() {\n\t\t\treturn this.query && this.query.trim() !== '' && !this.isShortQuery\n\t\t},\n\n\t\t/**\n\t\t * Have we reached the end of all types searches\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisDoneSearching() {\n\t\t\treturn Object.values(this.reached).every(state => state === false)\n\t\t},\n\n\t\t/**\n\t\t * Is there any search in progress\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisLoading() {\n\t\t\treturn Object.values(this.loading).some(state => state === true)\n\t\t},\n\t},\n\n\tasync created() {\n\t\tsubscribe('files:navigation:changed', this.resetForm)\n\t\tthis.types = await getTypes()\n\t\tthis.logger.debug('Unified Search initialized with the following providers', this.types)\n\t},\n\n\tbeforeDestroy() {\n\t\tunsubscribe('files:navigation:changed', this.resetForm)\n\t},\n\n\tmounted() {\n\t\tif (OCP.Accessibility.disableKeyboardShortcuts()) {\n\t\t\treturn\n\t\t}\n\n\t\tdocument.addEventListener('keydown', (event) => {\n\t\t\t// if not already opened, allows us to trigger default browser on second keydown\n\t\t\tif (event.ctrlKey && event.key === 'f' && !this.open) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tthis.open = true\n\t\t\t}\n\n\t\t\t// https://www.w3.org/WAI/GL/wiki/Using_ARIA_menus\n\t\t\tif (this.open) {\n\t\t\t\t// If arrow down, focus next result\n\t\t\t\tif (event.key === 'ArrowDown') {\n\t\t\t\t\tthis.focusNext(event)\n\t\t\t\t}\n\n\t\t\t\t// If arrow up, focus prev result\n\t\t\t\tif (event.key === 'ArrowUp') {\n\t\t\t\t\tthis.focusPrev(event)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t},\n\n\tmethods: {\n\t\tasync onOpen() {\n\t\t\t// Update types list in the background\n\t\t\tthis.types = await getTypes()\n\t\t},\n\t\tonClose() {\n\t\t\temit('nextcloud:unified-search.close')\n\t\t},\n\n\t\tresetForm() {\n\t\t\tthis.$el.querySelector('form[role=\"search\"]').reset()\n\t\t},\n\n\t\t/**\n\t\t * Reset the search state\n\t\t */\n\t\tonReset() {\n\t\t\temit('nextcloud:unified-search.reset')\n\t\t\tthis.logger.debug('Search reset')\n\t\t\tthis.query = ''\n\t\t\tthis.resetState()\n\t\t\tthis.focusInput()\n\t\t},\n\t\tasync resetState() {\n\t\t\tthis.cursors = {}\n\t\t\tthis.limits = {}\n\t\t\tthis.reached = {}\n\t\t\tthis.results = {}\n\t\t\tthis.focused = null\n\t\t\tthis.triggered = false\n\t\t\tawait this.cancelPendingRequests()\n\t\t},\n\n\t\t/**\n\t\t * Cancel any ongoing searches\n\t\t */\n\t\tasync cancelPendingRequests() {\n\t\t\t// Cloning so we can keep processing other requests\n\t\t\tconst requests = this.requests.slice(0)\n\t\t\tthis.requests = []\n\n\t\t\t// Cancel all pending requests\n\t\t\tawait Promise.all(requests.map(cancel => cancel()))\n\t\t},\n\n\t\t/**\n\t\t * Focus the search input on next tick\n\t\t */\n\t\tfocusInput() {\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis.$refs.input.focus()\n\t\t\t\tthis.$refs.input.select()\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * If we have results already, open first one\n\t\t * If not, trigger the search again\n\t\t */\n\t\tonInputEnter() {\n\t\t\tif (this.hasResults) {\n\t\t\t\tconst results = this.getResultsList()\n\t\t\t\tresults[0].click()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.onInput()\n\t\t},\n\n\t\t/**\n\t\t * Start searching on input\n\t\t */\n\t\tasync onInput() {\n\t\t\t// emit the search query\n\t\t\temit('nextcloud:unified-search.search', { query: this.query })\n\n\t\t\t// Do not search if not long enough\n\t\t\tif (this.query.trim() === '' || this.isShortQuery) {\n\t\t\t\tfor (const type of this.typesIDs) {\n\t\t\t\t\tthis.$delete(this.results, type)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tlet types = this.typesIDs\n\t\t\tlet query = this.query\n\n\t\t\t// Filter out types\n\t\t\tif (this.usedFiltersNot.length > 0) {\n\t\t\t\ttypes = this.typesIDs.filter(type => this.usedFiltersNot.indexOf(type) === -1)\n\t\t\t}\n\n\t\t\t// Only use those filters if any and check if they are valid\n\t\t\tif (this.usedFiltersIn.length > 0) {\n\t\t\t\ttypes = this.typesIDs.filter(type => this.usedFiltersIn.indexOf(type) > -1)\n\t\t\t}\n\n\t\t\t// Remove any filters from the query\n\t\t\tquery = query.replace(regexFilterIn, '').replace(regexFilterNot, '')\n\n\t\t\t// Reset search if the query changed\n\t\t\tawait this.resetState()\n\t\t\tthis.triggered = true\n\n\t\t\tif (!types.length) {\n\t\t\t\t// no results since no types were selected\n\t\t\t\tthis.logger.error('No types to search in')\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tthis.$set(this.loading, 'all', true)\n\t\t\tthis.logger.debug(`Searching ${query} in`, types)\n\n\t\t\tPromise.all(types.map(async type => {\n\t\t\t\ttry {\n\t\t\t\t\t// Init cancellable request\n\t\t\t\t\tconst { request, cancel } = search({ type, query })\n\t\t\t\t\tthis.requests.push(cancel)\n\n\t\t\t\t\t// Fetch results\n\t\t\t\t\tconst { data } = await request()\n\n\t\t\t\t\t// Process results\n\t\t\t\t\tif (data.ocs.data.entries.length > 0) {\n\t\t\t\t\t\tthis.$set(this.results, type, data.ocs.data.entries)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.$delete(this.results, type)\n\t\t\t\t\t}\n\n\t\t\t\t\t// Save cursor if any\n\t\t\t\t\tif (data.ocs.data.cursor) {\n\t\t\t\t\t\tthis.$set(this.cursors, type, data.ocs.data.cursor)\n\t\t\t\t\t} else if (!data.ocs.data.isPaginated) {\n\t\t\t\t\t// If no cursor and no pagination, we save the default amount\n\t\t\t\t\t// provided by server's initial state `defaultLimit`\n\t\t\t\t\t\tthis.$set(this.limits, type, this.defaultLimit)\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check if we reached end of pagination\n\t\t\t\t\tif (data.ocs.data.entries.length < this.defaultLimit) {\n\t\t\t\t\t\tthis.$set(this.reached, type, true)\n\t\t\t\t\t}\n\n\t\t\t\t\t// If none already focused, focus the first rendered result\n\t\t\t\t\tif (this.focused === null) {\n\t\t\t\t\t\tthis.focused = 0\n\t\t\t\t\t}\n\t\t\t\t\treturn REQUEST_OK\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.$delete(this.results, type)\n\n\t\t\t\t\t// If this is not a cancelled throw\n\t\t\t\t\tif (error.response && error.response.status) {\n\t\t\t\t\t\tthis.logger.error(`Error searching for ${this.typesMap[type]}`, error)\n\t\t\t\t\t\tshowError(this.t('core', 'An error occurred while searching for {type}', { type: this.typesMap[type] }))\n\t\t\t\t\t\treturn REQUEST_FAILED\n\t\t\t\t\t}\n\t\t\t\t\treturn REQUEST_CANCELED\n\t\t\t\t}\n\t\t\t})).then(results => {\n\t\t\t\t// Do not declare loading finished if the request have been cancelled\n\t\t\t\t// This means another search was triggered and we're therefore still loading\n\t\t\t\tif (results.some(result => result === REQUEST_CANCELED)) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t// We finished all searches\n\t\t\t\tthis.loading = {}\n\t\t\t})\n\t\t},\n\t\tonInputDebounced: enableLiveSearch\n\t\t\t? debounce(function(e) {\n\t\t\t\tthis.onInput(e)\n\t\t\t}, 500)\n\t\t\t: function() {\n\t\t\t\tthis.triggered = false\n\t\t\t},\n\n\t\t/**\n\t\t * Load more results for the provided type\n\t\t *\n\t\t * @param {string} type type\n\t\t */\n\t\tasync loadMore(type) {\n\t\t\t// If already loading, ignore\n\t\t\tif (this.loading[type]) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (this.cursors[type]) {\n\t\t\t\t// Init cancellable request\n\t\t\t\tconst { request, cancel } = search({ type, query: this.query, cursor: this.cursors[type] })\n\t\t\t\tthis.requests.push(cancel)\n\n\t\t\t\t// Fetch results\n\t\t\t\tconst { data } = await request()\n\n\t\t\t\t// Save cursor if any\n\t\t\t\tif (data.ocs.data.cursor) {\n\t\t\t\t\tthis.$set(this.cursors, type, data.ocs.data.cursor)\n\t\t\t\t}\n\n\t\t\t\t// Process results\n\t\t\t\tif (data.ocs.data.entries.length > 0) {\n\t\t\t\t\tthis.results[type].push(...data.ocs.data.entries)\n\t\t\t\t}\n\n\t\t\t\t// Check if we reached end of pagination\n\t\t\t\tif (data.ocs.data.entries.length < this.defaultLimit) {\n\t\t\t\t\tthis.$set(this.reached, type, true)\n\t\t\t\t}\n\t\t\t} else\n\n\t\t\t// If no cursor, we might have all the results already,\n\t\t\t// let's fake pagination and show the next xxx entries\n\t\t\tif (this.limits[type] && this.limits[type] >= 0) {\n\t\t\t\tthis.limits[type] += this.defaultLimit\n\n\t\t\t\t// Check if we reached end of pagination\n\t\t\t\tif (this.limits[type] >= this.results[type].length) {\n\t\t\t\t\tthis.$set(this.reached, type, true)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Focus result after render\n\t\t\tif (this.focused !== null) {\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\tthis.focusIndex(this.focused)\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Return a subset of the array if the search provider\n\t\t * doesn't supports pagination\n\t\t *\n\t\t * @param {Array} list the results\n\t\t * @param {string} type the type\n\t\t * @return {Array}\n\t\t */\n\t\tlimitIfAny(list, type) {\n\t\t\tif (type in this.limits) {\n\t\t\t\treturn list.slice(0, this.limits[type])\n\t\t\t}\n\t\t\treturn list\n\t\t},\n\n\t\tgetResultsList() {\n\t\t\treturn this.$el.querySelectorAll('.unified-search__results .unified-search__result')\n\t\t},\n\n\t\t/**\n\t\t * Focus the first result if any\n\t\t *\n\t\t * @param {Event} event the keydown event\n\t\t */\n\t\tfocusFirst(event) {\n\t\t\tconst results = this.getResultsList()\n\t\t\tif (results && results.length > 0) {\n\t\t\t\tif (event) {\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t}\n\t\t\t\tthis.focused = 0\n\t\t\t\tthis.focusIndex(this.focused)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Focus the next result if any\n\t\t *\n\t\t * @param {Event} event the keydown event\n\t\t */\n\t\tfocusNext(event) {\n\t\t\tif (this.focused === null) {\n\t\t\t\tthis.focusFirst(event)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst results = this.getResultsList()\n\t\t\t// If we're not focusing the last, focus the next one\n\t\t\tif (results && results.length > 0 && this.focused + 1 < results.length) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tthis.focused++\n\t\t\t\tthis.focusIndex(this.focused)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Focus the previous result if any\n\t\t *\n\t\t * @param {Event} event the keydown event\n\t\t */\n\t\tfocusPrev(event) {\n\t\t\tif (this.focused === null) {\n\t\t\t\tthis.focusFirst(event)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst results = this.getResultsList()\n\t\t\t// If we're not focusing the first, focus the previous one\n\t\t\tif (results && results.length > 0 && this.focused > 0) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tthis.focused--\n\t\t\t\tthis.focusIndex(this.focused)\n\t\t\t}\n\n\t\t},\n\n\t\t/**\n\t\t * Focus the specified result index if it exists\n\t\t *\n\t\t * @param {number} index the result index\n\t\t */\n\t\tfocusIndex(index) {\n\t\t\tconst results = this.getResultsList()\n\t\t\tif (results && results[index]) {\n\t\t\t\tresults[index].focus()\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Set the current focused element based on the target\n\t\t *\n\t\t * @param {Event} event the focus event\n\t\t */\n\t\tsetFocusedIndex(event) {\n\t\t\tconst entry = event.target\n\t\t\tconst results = this.getResultsList()\n\t\t\tconst index = [...results].findIndex(search => search === entry)\n\t\t\tif (index > -1) {\n\t\t\t\t// let's not use focusIndex as the entry is already focused\n\t\t\t\tthis.focused = index\n\t\t\t}\n\t\t},\n\n\t\tonClickFilter(filter) {\n\t\t\tthis.query = `${this.query} ${filter}`\n\t\t\t\t.replace(/ {2}/g, ' ')\n\t\t\t\t.trim()\n\t\t\tthis.onInput()\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@use \"sass:math\";\n\n$margin: 10px;\n$input-height: 34px;\n$input-padding: 6px;\n\n.unified-search {\n\t&__trigger {\n\t\tfilter: var(--background-image-invert-if-bright);\n\t}\n\n\t&__input-wrapper {\n\t\tposition: sticky;\n\t\t// above search results\n\t\tz-index: 2;\n\t\ttop: 0;\n\t\tdisplay: inline-flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\twidth: 100%;\n\t\tbackground-color: var(--color-main-background);\n\n\t\tlabel[for=\"unified-search__input\"] {\n\t\t\talign-self: flex-start;\n\t\t\tfont-weight: bold;\n\t\t\tfont-size: 19px;\n\t\t\tmargin-left: 13px;\n\t\t}\n\t}\n\n\t&__form-input {\n\t\tmargin: 0 !important;\n\t}\n\n\t&__input-row {\n\t\tdisplay: flex;\n\t\twidth: 100%;\n\t\talign-items: center;\n\t}\n\n\t&__filters {\n\t\tmargin: $margin 0 $margin math.div($margin, 2);\n\t\tul {\n\t\t\tdisplay: inline-flex;\n\t\t\tjustify-content: space-between;\n\t\t}\n\t}\n\n\t&__form {\n\t\tposition: relative;\n\t\twidth: 100%;\n\t\tmargin: $margin 0;\n\n\t\t// Loading spinner\n\t\t&::after {\n\t\t\tright: $input-padding;\n\t\t\tleft: auto;\n\t\t}\n\n\t\t&-input,\n\t\t&-reset {\n\t\t\tmargin: math.div($input-padding, 2);\n\t\t}\n\n\t\t&-input {\n\t\t\twidth: 100%;\n\t\t\theight: $input-height;\n\t\t\tpadding: $input-padding;\n\n\t\t\t&,\n\t\t\t&[placeholder],\n\t\t\t&::placeholder {\n\t\t\t\toverflow: hidden;\n\t\t\t\twhite-space: nowrap;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t}\n\n\t\t\t// Hide webkit clear search\n\t\t\t&::-webkit-search-decoration,\n\t\t\t&::-webkit-search-cancel-button,\n\t\t\t&::-webkit-search-results-button,\n\t\t\t&::-webkit-search-results-decoration {\n\t\t\t\t-webkit-appearance: none;\n\t\t\t}\n\n\t\t\t// Ellipsis earlier if reset button is here\n\t\t\t.icon-loading-small &,\n\t\t\t&--with-reset {\n\t\t\t\tpadding-right: $input-height;\n\t\t\t}\n\t\t}\n\n\t\t&-reset, &-submit {\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tright: 4px;\n\t\t\twidth: $input-height - $input-padding;\n\t\t\theight: $input-height - $input-padding;\n\t\t\tmin-height: 30px;\n\t\t\tpadding: 0;\n\t\t\topacity: .5;\n\t\t\tborder: none;\n\t\t\tbackground-color: transparent;\n\t\t\tmargin-right: 0;\n\n\t\t\t&:hover,\n\t\t\t&:focus,\n\t\t\t&:active {\n\t\t\t\topacity: 1;\n\t\t\t}\n\t\t}\n\n\t\t&-submit {\n\t\t\tright: 28px;\n\t\t}\n\t}\n\n\t&__results {\n\t\t&-header {\n\t\t\tdisplay: block;\n\t\t\tmargin: $margin;\n\t\t\tmargin-bottom: $margin - 4px;\n\t\t\tmargin-left: 13px;\n\t\t\tcolor: var(--color-primary-element);\n\t\t\tfont-size: 19px;\n\t\t\tfont-weight: bold;\n\t\t}\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 4px;\n\t}\n\n\t.unified-search__result-more::v-deep {\n\t\tcolor: var(--color-text-maxcontrast);\n\t}\n\n\t.empty-content {\n\t\tmargin: 10vh 0;\n\n\t\t::v-deep .empty-content__title {\n\t\t\tfont-weight: normal;\n font-size: var(--default-font-size);\n\t\t\tpadding: 0 15px;\n\t\t\ttext-align: center;\n\t\t}\n\t}\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!./UnifiedSearch.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!./UnifiedSearch.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!./UnifiedSearch.vue?vue&type=style&index=0&id=7bce572d&prod&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!./UnifiedSearch.vue?vue&type=style&index=0&id=7bce572d&prod&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./UnifiedSearch.vue?vue&type=template&id=7bce572d&scoped=true&\"\nimport script from \"./UnifiedSearch.vue?vue&type=script&lang=js&\"\nexport * from \"./UnifiedSearch.vue?vue&type=script&lang=js&\"\nimport style0 from \"./UnifiedSearch.vue?vue&type=style&index=0&id=7bce572d&prod&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 \"7bce572d\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('NcHeaderMenu',{staticClass:\"unified-search\",attrs:{\"id\":\"unified-search\",\"exclude-click-outside-classes\":\"popover\",\"open\":_vm.open,\"aria-label\":_vm.ariaLabel},on:{\"update:open\":function($event){_vm.open=$event},\"open\":_vm.onOpen,\"close\":_vm.onClose},scopedSlots:_vm._u([{key:\"trigger\",fn:function(){return [_c('Magnify',{staticClass:\"unified-search__trigger\",attrs:{\"size\":22/* fit better next to other 20px icons */,\"fill-color\":\"var(--color-primary-text)\"}})]},proxy:true}])},[_vm._v(\" \"),_c('div',{staticClass:\"unified-search__input-wrapper\"},[_c('label',{attrs:{\"for\":\"unified-search__input\"}},[_vm._v(_vm._s(_vm.ariaLabel))]),_vm._v(\" \"),_c('div',{staticClass:\"unified-search__input-row\"},[_c('form',{staticClass:\"unified-search__form\",class:{'icon-loading-small': _vm.isLoading},attrs:{\"role\":\"search\"},on:{\"submit\":function($event){$event.preventDefault();$event.stopPropagation();return _vm.onInputEnter.apply(null, arguments)},\"reset\":function($event){$event.preventDefault();$event.stopPropagation();return _vm.onReset.apply(null, arguments)}}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.query),expression:\"query\"}],ref:\"input\",staticClass:\"unified-search__form-input\",class:{'unified-search__form-input--with-reset': !!_vm.query},attrs:{\"id\":\"unified-search__input\",\"type\":\"search\",\"placeholder\":_vm.t('core', 'Search {types} …', { types: _vm.typesNames.join(', ') }),\"aria-describedby\":\"unified-search-desc\"},domProps:{\"value\":(_vm.query)},on:{\"input\":[function($event){if($event.target.composing)return;_vm.query=$event.target.value},_vm.onInputDebounced],\"keypress\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\"))return null;$event.preventDefault();$event.stopPropagation();return _vm.onInputEnter.apply(null, arguments)}}}),_vm._v(\" \"),_c('p',{staticClass:\"hidden-visually\",attrs:{\"id\":\"unified-search-desc\"}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'Search starts once you start typing and results may be reached with the arrow keys'))+\"\\n\\t\\t\\t\\t\")]),_vm._v(\" \"),(!!_vm.query && !_vm.isLoading)?_c('input',{staticClass:\"unified-search__form-reset icon-close\",attrs:{\"type\":\"reset\",\"aria-label\":_vm.t('core','Reset search'),\"value\":\"\"}}):_vm._e(),_vm._v(\" \"),(!!_vm.query && !_vm.isLoading && !_vm.enableLiveSearch)?_c('input',{staticClass:\"unified-search__form-submit icon-confirm\",attrs:{\"type\":\"submit\",\"aria-label\":_vm.t('core','Start search'),\"value\":\"\"}}):_vm._e()]),_vm._v(\" \"),(_vm.availableFilters.length > 1)?_c('NcActions',{staticClass:\"unified-search__filters\",attrs:{\"placement\":\"bottom\",\"container\":\".unified-search__input-wrapper\"}},_vm._l((_vm.availableFilters),function(type){return _c('NcActionButton',{key:type,attrs:{\"icon\":\"icon-filter\",\"title\":_vm.t('core', 'Search for {name} only', { name: _vm.typesMap[type] })},on:{\"click\":function($event){$event.stopPropagation();return _vm.onClickFilter(`in:${type}`)}}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(`in:${type}`)+\"\\n\\t\\t\\t\\t\")])}),1):_vm._e()],1)]),_vm._v(\" \"),(!_vm.hasResults)?[(_vm.isLoading)?_c('SearchResultPlaceholders'):(_vm.isValidQuery)?_c('NcEmptyContent',{scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('Magnify')]},proxy:true}],null,false,931131664)},[(_vm.triggered)?_c('NcHighlight',{attrs:{\"text\":_vm.t('core', 'No results for {query}', { query: _vm.query }),\"search\":_vm.query}}):_c('div',[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'Press enter to start searching'))+\"\\n\\t\\t\\t\")])],1):(!_vm.isLoading || _vm.isShortQuery)?_c('NcEmptyContent',{scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('Magnify')]},proxy:true},(_vm.isShortQuery)?{key:\"desc\",fn:function(){return [_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.n('core',\n\t\t\t\t\t'Please enter {minSearchLength} character or more to search',\n\t\t\t\t\t'Please enter {minSearchLength} characters or more to search',\n\t\t\t\t\t_vm.minSearchLength,\n\t\t\t\t\t{minSearchLength: _vm.minSearchLength}))+\"\\n\\t\\t\\t\")]},proxy:true}:null],null,true)},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('core', 'Start typing to search'))+\"\\n\\t\\t\\t\")]):_vm._e()]:_vm._l((_vm.orderedResults),function({list, type},typesIndex){return _c('ul',{key:type,staticClass:\"unified-search__results\",class:`unified-search__results-${type}`,attrs:{\"aria-label\":_vm.typesMap[type]}},[_c('h2',{staticClass:\"unified-search__results-header\"},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.typesMap[type])+\"\\n\\t\\t\\t\")]),_vm._v(\" \"),_vm._l((_vm.limitIfAny(list, type)),function(result,index){return _c('li',{key:result.resourceUrl},[_c('SearchResult',_vm._b({attrs:{\"query\":_vm.query,\"focused\":_vm.focused === 0 && typesIndex === 0 && index === 0},on:{\"focus\":_vm.setFocusedIndex}},'SearchResult',result,false))],1)}),_vm._v(\" \"),_c('li',[(!_vm.reached[type])?_c('SearchResult',{staticClass:\"unified-search__result-more\",attrs:{\"title\":_vm.loading[type]\n\t\t\t\t\t\t? _vm.t('core', 'Loading more results …')\n\t\t\t\t\t\t: _vm.t('core', 'Load more results'),\"icon-class\":_vm.loading[type] ? 'icon-loading-small' : ''},on:{\"click\":function($event){$event.stopPropagation();return _vm.loadMore(type)},\"focus\":_vm.setFocusedIndex}}):_vm._e()],1)],2)})],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\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 { getLoggerBuilder } from '@nextcloud/logger'\nimport { getRequestToken } from '@nextcloud/auth'\nimport { translate as t, translatePlural as n } from '@nextcloud/l10n'\nimport Vue from 'vue'\n\nimport UnifiedSearch from './views/UnifiedSearch.vue'\n\n// eslint-disable-next-line camelcase\n__webpack_nonce__ = btoa(getRequestToken())\n\nconst logger = getLoggerBuilder()\n\t.setApp('unified-search')\n\t.detectUser()\n\t.build()\n\nVue.mixin({\n\tdata() {\n\t\treturn {\n\t\t\tlogger,\n\t\t}\n\t},\n\tmethods: {\n\t\tt,\n\t\tn,\n\t},\n})\n\nexport default new Vue({\n\tel: '#unified-search',\n\t// eslint-disable-next-line vue/match-component-file-name\n\tname: 'UnifiedSearchRoot',\n\trender: h => h(UnifiedSearch),\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, \".unified-search__result[data-v-4805be6c]{display:flex;align-items:center;height:44px;padding:10px;border:2px solid rgba(0,0,0,0);border-radius:var(--border-radius-large) !important}.unified-search__result--focused[data-v-4805be6c]{background-color:var(--color-background-hover)}.unified-search__result[data-v-4805be6c]:active,.unified-search__result[data-v-4805be6c]:hover,.unified-search__result[data-v-4805be6c]:focus{background-color:var(--color-background-hover);border:2px solid var(--color-border-maxcontrast)}.unified-search__result *[data-v-4805be6c]{cursor:pointer}.unified-search__result-icon[data-v-4805be6c]{overflow:hidden;width:44px;height:44px;border-radius:var(--border-radius);background-repeat:no-repeat;background-position:center center;background-size:32px}.unified-search__result-icon--rounded[data-v-4805be6c]{border-radius:22px}.unified-search__result-icon--no-preview[data-v-4805be6c]{background-size:32px}.unified-search__result-icon--with-thumbnail[data-v-4805be6c]{background-size:cover}.unified-search__result-icon--with-thumbnail[data-v-4805be6c]:not(.unified-search__result-icon--rounded){max-width:42px;max-height:42px;border:1px solid var(--color-border)}.unified-search__result-icon img[data-v-4805be6c]{width:100%;height:100%;object-fit:cover;object-position:center}.unified-search__result-icon[data-v-4805be6c],.unified-search__result-actions[data-v-4805be6c]{flex:0 0 44px}.unified-search__result-content[data-v-4805be6c]{display:flex;align-items:center;flex:1 1 100%;flex-wrap:wrap;min-width:0;padding-left:10px}.unified-search__result-line-one[data-v-4805be6c],.unified-search__result-line-two[data-v-4805be6c]{overflow:hidden;flex:1 1 100%;margin:1px 0;white-space:nowrap;text-overflow:ellipsis;color:inherit;font-size:inherit}.unified-search__result-line-two[data-v-4805be6c]{opacity:.7;font-size:var(--default-font-size)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./core/src/components/UnifiedSearch/SearchResult.vue\"],\"names\":[],\"mappings\":\"AAMA,yCACC,YAAA,CACA,kBAAA,CACA,WANgB,CAOhB,YANQ,CAOR,8BAAA,CACA,mDAAA,CAEA,kDACC,8CAAA,CAGD,8IAGC,8CAAA,CACA,gDAAA,CAGD,2CACC,cAAA,CAGD,8CACC,eAAA,CACA,UA5Be,CA6Bf,WA7Be,CA8Bf,kCAAA,CACA,2BAAA,CACA,iCAAA,CACA,oBAAA,CACA,uDACC,kBAAA,CAED,0DACC,oBAAA,CAED,8DACC,qBAAA,CAED,yGAEC,cAAA,CACA,eAAA,CACA,oCAAA,CAGD,kDAEC,UAAA,CACA,WAAA,CAEA,gBAAA,CACA,sBAAA,CAIF,+FAEC,aAAA,CAGD,iDACC,YAAA,CACA,kBAAA,CACA,aAAA,CACA,cAAA,CAEA,WAAA,CACA,iBAvEO,CA0ER,oGAEC,eAAA,CACA,aAAA,CACA,YAAA,CACA,kBAAA,CACA,sBAAA,CAEA,aAAA,CACA,iBAAA,CAED,kDACC,UAAA,CACA,kCAAA\",\"sourcesContent\":[\"\\n@use \\\"sass:math\\\";\\n\\n$clickable-area: 44px;\\n$margin: 10px;\\n\\n.unified-search__result {\\n\\tdisplay: flex;\\n\\talign-items: center;\\n\\theight: $clickable-area;\\n\\tpadding: $margin;\\n\\tborder: 2px solid transparent;\\n\\tborder-radius: var(--border-radius-large) !important;\\n\\n\\t&--focused {\\n\\t\\tbackground-color: var(--color-background-hover);\\n\\t}\\n\\n\\t&:active,\\n\\t&:hover,\\n\\t&:focus {\\n\\t\\tbackground-color: var(--color-background-hover);\\n\\t\\tborder: 2px solid var(--color-border-maxcontrast);\\n\\t}\\n\\n\\t* {\\n\\t\\tcursor: pointer;\\n\\t}\\n\\n\\t&-icon {\\n\\t\\toverflow: hidden;\\n\\t\\twidth: $clickable-area;\\n\\t\\theight: $clickable-area;\\n\\t\\tborder-radius: var(--border-radius);\\n\\t\\tbackground-repeat: no-repeat;\\n\\t\\tbackground-position: center center;\\n\\t\\tbackground-size: 32px;\\n\\t\\t&--rounded {\\n\\t\\t\\tborder-radius: math.div($clickable-area, 2);\\n\\t\\t}\\n\\t\\t&--no-preview {\\n\\t\\t\\tbackground-size: 32px;\\n\\t\\t}\\n\\t\\t&--with-thumbnail {\\n\\t\\t\\tbackground-size: cover;\\n\\t\\t}\\n\\t\\t&--with-thumbnail:not(&--rounded) {\\n\\t\\t\\t// compensate for border\\n\\t\\t\\tmax-width: $clickable-area - 2px;\\n\\t\\t\\tmax-height: $clickable-area - 2px;\\n\\t\\t\\tborder: 1px solid var(--color-border);\\n\\t\\t}\\n\\n\\t\\timg {\\n\\t\\t\\t// Make sure to keep ratio\\n\\t\\t\\twidth: 100%;\\n\\t\\t\\theight: 100%;\\n\\n\\t\\t\\tobject-fit: cover;\\n\\t\\t\\tobject-position: center;\\n\\t\\t}\\n\\t}\\n\\n\\t&-icon,\\n\\t&-actions {\\n\\t\\tflex: 0 0 $clickable-area;\\n\\t}\\n\\n\\t&-content {\\n\\t\\tdisplay: flex;\\n\\t\\talign-items: center;\\n\\t\\tflex: 1 1 100%;\\n\\t\\tflex-wrap: wrap;\\n\\t\\t// Set to minimum and gro from it\\n\\t\\tmin-width: 0;\\n\\t\\tpadding-left: $margin;\\n\\t}\\n\\n\\t&-line-one,\\n\\t&-line-two {\\n\\t\\toverflow: hidden;\\n\\t\\tflex: 1 1 100%;\\n\\t\\tmargin: 1px 0;\\n\\t\\twhite-space: nowrap;\\n\\t\\ttext-overflow: ellipsis;\\n\\t\\t// Use the same color as the `a`\\n\\t\\tcolor: inherit;\\n\\t\\tfont-size: inherit;\\n\\t}\\n\\t&-line-two {\\n\\t\\topacity: .7;\\n\\t\\tfont-size: var(--default-font-size);\\n\\t}\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".unified-search__result-placeholder-gradient[data-v-9ed03c40]{position:fixed;height:0;width:0;z-index:-1}.unified-search__result-placeholder[data-v-9ed03c40]{width:calc(100% - 2 * 10px);height:44px;margin:10px}.unified-search__result-placeholder-icon[data-v-9ed03c40]{width:44px;height:44px;rx:var(--border-radius);ry:var(--border-radius)}.unified-search__result-placeholder-line-one[data-v-9ed03c40],.unified-search__result-placeholder-line-two[data-v-9ed03c40]{width:calc(100% - 54px);height:1em;x:54px}.unified-search__result-placeholder-line-one[data-v-9ed03c40]{y:5px}.unified-search__result-placeholder-line-two[data-v-9ed03c40]{y:25px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./core/src/components/UnifiedSearch/SearchResultPlaceholders.vue\"],\"names\":[],\"mappings\":\"AAIA,8DACC,cAAA,CACA,QAAA,CACA,OAAA,CACA,UAAA,CAGD,qDACC,2BAAA,CACA,WAZgB,CAahB,WAZQ,CAcR,0DACC,UAhBe,CAiBf,WAjBe,CAkBf,uBAAA,CACA,uBAAA,CAGD,4HAEC,uBAAA,CACA,UAAA,CACA,MAAA,CAGD,8DACC,KAAA,CAGD,8DACC,MAAA\",\"sourcesContent\":[\"\\n$clickable-area: 44px;\\n$margin: 10px;\\n\\n.unified-search__result-placeholder-gradient {\\n\\tposition: fixed;\\n\\theight: 0;\\n\\twidth: 0;\\n\\tz-index: -1;\\n}\\n\\n.unified-search__result-placeholder {\\n\\twidth: calc(100% - 2 * #{$margin});\\n\\theight: $clickable-area;\\n\\tmargin: $margin;\\n\\n\\t&-icon {\\n\\t\\twidth: $clickable-area;\\n\\t\\theight: $clickable-area;\\n\\t\\trx: var(--border-radius);\\n\\t\\try: var(--border-radius);\\n\\t}\\n\\n\\t&-line-one,\\n\\t&-line-two {\\n\\t\\twidth: calc(100% - #{$margin + $clickable-area});\\n\\t\\theight: 1em;\\n\\t\\tx: $margin + $clickable-area;\\n\\t}\\n\\n\\t&-line-one {\\n\\t\\ty: 5px;\\n\\t}\\n\\n\\t&-line-two {\\n\\t\\ty: 25px;\\n\\t}\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".unified-search__trigger[data-v-7bce572d]{filter:var(--background-image-invert-if-bright)}.unified-search__input-wrapper[data-v-7bce572d]{position:sticky;z-index:2;top:0;display:inline-flex;flex-direction:column;align-items:center;width:100%;background-color:var(--color-main-background)}.unified-search__input-wrapper label[for=unified-search__input][data-v-7bce572d]{align-self:flex-start;font-weight:bold;font-size:19px;margin-left:13px}.unified-search__form-input[data-v-7bce572d]{margin:0 !important}.unified-search__input-row[data-v-7bce572d]{display:flex;width:100%;align-items:center}.unified-search__filters[data-v-7bce572d]{margin:10px 0 10px 5px}.unified-search__filters ul[data-v-7bce572d]{display:inline-flex;justify-content:space-between}.unified-search__form[data-v-7bce572d]{position:relative;width:100%;margin:10px 0}.unified-search__form[data-v-7bce572d]::after{right:6px;left:auto}.unified-search__form-input[data-v-7bce572d],.unified-search__form-reset[data-v-7bce572d]{margin:3px}.unified-search__form-input[data-v-7bce572d]{width:100%;height:34px;padding:6px}.unified-search__form-input[data-v-7bce572d],.unified-search__form-input[placeholder][data-v-7bce572d],.unified-search__form-input[data-v-7bce572d]::placeholder{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.unified-search__form-input[data-v-7bce572d]::-webkit-search-decoration,.unified-search__form-input[data-v-7bce572d]::-webkit-search-cancel-button,.unified-search__form-input[data-v-7bce572d]::-webkit-search-results-button,.unified-search__form-input[data-v-7bce572d]::-webkit-search-results-decoration{-webkit-appearance:none}.icon-loading-small .unified-search__form-input[data-v-7bce572d],.unified-search__form-input--with-reset[data-v-7bce572d]{padding-right:34px}.unified-search__form-reset[data-v-7bce572d],.unified-search__form-submit[data-v-7bce572d]{position:absolute;top:0;right:4px;width:28px;height:28px;min-height:30px;padding:0;opacity:.5;border:none;background-color:rgba(0,0,0,0);margin-right:0}.unified-search__form-reset[data-v-7bce572d]:hover,.unified-search__form-reset[data-v-7bce572d]:focus,.unified-search__form-reset[data-v-7bce572d]:active,.unified-search__form-submit[data-v-7bce572d]:hover,.unified-search__form-submit[data-v-7bce572d]:focus,.unified-search__form-submit[data-v-7bce572d]:active{opacity:1}.unified-search__form-submit[data-v-7bce572d]{right:28px}.unified-search__results[data-v-7bce572d]{display:flex;flex-direction:column;gap:4px}.unified-search__results-header[data-v-7bce572d]{display:block;margin:10px;margin-bottom:6px;margin-left:13px;color:var(--color-primary-element);font-size:19px;font-weight:bold}.unified-search .unified-search__result-more[data-v-7bce572d]{color:var(--color-text-maxcontrast)}.unified-search .empty-content[data-v-7bce572d]{margin:10vh 0}.unified-search .empty-content[data-v-7bce572d] .empty-content__title{font-weight:normal;font-size:var(--default-font-size);padding:0 15px;text-align:center}\", \"\",{\"version\":3,\"sources\":[\"webpack://./core/src/views/UnifiedSearch.vue\"],\"names\":[],\"mappings\":\"AAQC,0CACC,+CAAA,CAGD,gDACC,eAAA,CAEA,SAAA,CACA,KAAA,CACA,mBAAA,CACA,qBAAA,CACA,kBAAA,CACA,UAAA,CACA,6CAAA,CAEA,iFACC,qBAAA,CACA,gBAAA,CACA,cAAA,CACA,gBAAA,CAIF,6CACC,mBAAA,CAGD,4CACC,YAAA,CACA,UAAA,CACA,kBAAA,CAGD,0CACC,sBAAA,CACA,6CACC,mBAAA,CACA,6BAAA,CAIF,uCACC,iBAAA,CACA,UAAA,CACA,aAAA,CAGA,8CACC,SAnDa,CAoDb,SAAA,CAGD,0FAEC,UAAA,CAGD,6CACC,UAAA,CACA,WA/DY,CAgEZ,WA/Da,CAiEb,iKAGC,eAAA,CACA,kBAAA,CACA,sBAAA,CAID,+SAIC,uBAAA,CAID,0HAEC,kBArFW,CAyFb,2FACC,iBAAA,CACA,KAAA,CACA,SAAA,CACA,UAAA,CACA,WAAA,CACA,eAAA,CACA,SAAA,CACA,UAAA,CACA,WAAA,CACA,8BAAA,CACA,cAAA,CAEA,uTAGC,SAAA,CAIF,8CACC,UAAA,CAIF,0CAUC,YAAA,CACA,qBAAA,CACA,OAAA,CAXA,iDACC,aAAA,CACA,WAtHM,CAuHN,iBAAA,CACA,gBAAA,CACA,kCAAA,CACA,cAAA,CACA,gBAAA,CAOF,8DACC,mCAAA,CAGD,gDACC,aAAA,CAEA,sEACC,kBAAA,CACS,kCAAA,CACT,cAAA,CACA,iBAAA\",\"sourcesContent\":[\"\\n@use \\\"sass:math\\\";\\n\\n$margin: 10px;\\n$input-height: 34px;\\n$input-padding: 6px;\\n\\n.unified-search {\\n\\t&__trigger {\\n\\t\\tfilter: var(--background-image-invert-if-bright);\\n\\t}\\n\\n\\t&__input-wrapper {\\n\\t\\tposition: sticky;\\n\\t\\t// above search results\\n\\t\\tz-index: 2;\\n\\t\\ttop: 0;\\n\\t\\tdisplay: inline-flex;\\n\\t\\tflex-direction: column;\\n\\t\\talign-items: center;\\n\\t\\twidth: 100%;\\n\\t\\tbackground-color: var(--color-main-background);\\n\\n\\t\\tlabel[for=\\\"unified-search__input\\\"] {\\n\\t\\t\\talign-self: flex-start;\\n\\t\\t\\tfont-weight: bold;\\n\\t\\t\\tfont-size: 19px;\\n\\t\\t\\tmargin-left: 13px;\\n\\t\\t}\\n\\t}\\n\\n\\t&__form-input {\\n\\t\\tmargin: 0 !important;\\n\\t}\\n\\n\\t&__input-row {\\n\\t\\tdisplay: flex;\\n\\t\\twidth: 100%;\\n\\t\\talign-items: center;\\n\\t}\\n\\n\\t&__filters {\\n\\t\\tmargin: $margin 0 $margin math.div($margin, 2);\\n\\t\\tul {\\n\\t\\t\\tdisplay: inline-flex;\\n\\t\\t\\tjustify-content: space-between;\\n\\t\\t}\\n\\t}\\n\\n\\t&__form {\\n\\t\\tposition: relative;\\n\\t\\twidth: 100%;\\n\\t\\tmargin: $margin 0;\\n\\n\\t\\t// Loading spinner\\n\\t\\t&::after {\\n\\t\\t\\tright: $input-padding;\\n\\t\\t\\tleft: auto;\\n\\t\\t}\\n\\n\\t\\t&-input,\\n\\t\\t&-reset {\\n\\t\\t\\tmargin: math.div($input-padding, 2);\\n\\t\\t}\\n\\n\\t\\t&-input {\\n\\t\\t\\twidth: 100%;\\n\\t\\t\\theight: $input-height;\\n\\t\\t\\tpadding: $input-padding;\\n\\n\\t\\t\\t&,\\n\\t\\t\\t&[placeholder],\\n\\t\\t\\t&::placeholder {\\n\\t\\t\\t\\toverflow: hidden;\\n\\t\\t\\t\\twhite-space: nowrap;\\n\\t\\t\\t\\ttext-overflow: ellipsis;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Hide webkit clear search\\n\\t\\t\\t&::-webkit-search-decoration,\\n\\t\\t\\t&::-webkit-search-cancel-button,\\n\\t\\t\\t&::-webkit-search-results-button,\\n\\t\\t\\t&::-webkit-search-results-decoration {\\n\\t\\t\\t\\t-webkit-appearance: none;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Ellipsis earlier if reset button is here\\n\\t\\t\\t.icon-loading-small &,\\n\\t\\t\\t&--with-reset {\\n\\t\\t\\t\\tpadding-right: $input-height;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t&-reset, &-submit {\\n\\t\\t\\tposition: absolute;\\n\\t\\t\\ttop: 0;\\n\\t\\t\\tright: 4px;\\n\\t\\t\\twidth: $input-height - $input-padding;\\n\\t\\t\\theight: $input-height - $input-padding;\\n\\t\\t\\tmin-height: 30px;\\n\\t\\t\\tpadding: 0;\\n\\t\\t\\topacity: .5;\\n\\t\\t\\tborder: none;\\n\\t\\t\\tbackground-color: transparent;\\n\\t\\t\\tmargin-right: 0;\\n\\n\\t\\t\\t&:hover,\\n\\t\\t\\t&:focus,\\n\\t\\t\\t&:active {\\n\\t\\t\\t\\topacity: 1;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t&-submit {\\n\\t\\t\\tright: 28px;\\n\\t\\t}\\n\\t}\\n\\n\\t&__results {\\n\\t\\t&-header {\\n\\t\\t\\tdisplay: block;\\n\\t\\t\\tmargin: $margin;\\n\\t\\t\\tmargin-bottom: $margin - 4px;\\n\\t\\t\\tmargin-left: 13px;\\n\\t\\t\\tcolor: var(--color-primary-element);\\n\\t\\t\\tfont-size: 19px;\\n\\t\\t\\tfont-weight: bold;\\n\\t\\t}\\n\\t\\tdisplay: flex;\\n\\t\\tflex-direction: column;\\n\\t\\tgap: 4px;\\n\\t}\\n\\n\\t.unified-search__result-more::v-deep {\\n\\t\\tcolor: var(--color-text-maxcontrast);\\n\\t}\\n\\n\\t.empty-content {\\n\\t\\tmargin: 10vh 0;\\n\\n\\t\\t::v-deep .empty-content__title {\\n\\t\\t\\tfont-weight: normal;\\n font-size: var(--default-font-size);\\n\\t\\t\\tpadding: 0 15px;\\n\\t\\t\\ttext-align: center;\\n\\t\\t}\\n\\t}\\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 = 9671;","__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\t9671: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [7874], function() { return __webpack_require__(25160); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","_vm","this","_c","_self","staticClass","class","focused","attrs","resourceUrl","on","reEmitEvent","rounded","hasValidThumbnail","loaded","icon","isIconUrl","style","backgroundImage","directives","name","rawName","value","expression","thumbnailUrl","onError","onLoad","_e","_v","title","query","subline","_s","light","dark","_l","placeholder","key","width","randWidth","defaultLimit","loadState","minSearchLength","enableLiveSearch","regexFilterIn","regexFilterNot","getTypes","axios","generateOcsUrl","params","from","window","location","pathname","replace","search","data","ocs","Array","isArray","length","console","error","type","cursor","cancelToken","request","token","term","cancel","open","ariaLabel","$event","onOpen","onClose","scopedSlots","_u","fn","proxy","isLoading","preventDefault","stopPropagation","onInputEnter","apply","arguments","onReset","ref","t","types","typesNames","join","domProps","target","composing","onInputDebounced","indexOf","_k","keyCode","availableFilters","typesMap","onClickFilter","hasResults","orderedResults","typesIndex","list","limitIfAny","result","index","_b","setFocusedIndex","reached","loading","loadMore","isValidQuery","triggered","isShortQuery","n","__webpack_nonce__","btoa","getRequestToken","logger","getLoggerBuilder","setApp","detectUser","build","Vue","methods","el","render","h","UnifiedSearch","___CSS_LOADER_EXPORT___","push","module","id","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","__webpack_modules__","call","m","amdD","Error","amdO","O","chunkIds","priority","notFulfilled","Infinity","i","fulfilled","j","Object","keys","every","splice","r","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","g","globalThis","Function","e","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","nmd","paths","children","b","document","baseURI","self","href","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","forEach","bind","nc","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file +{"version":3,"file":"core-unified-search.js?v=8382290185d85f72dbc7","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/core/src/components/UnifiedSearch/SearchResult.vue?vue&type=script&lang=js&","webpack:///nextcloud/core/src/components/UnifiedSearch/SearchResult.vue","webpack://nextcloud/./core/src/components/UnifiedSearch/SearchResult.vue?c003","webpack://nextcloud/./core/src/components/UnifiedSearch/SearchResult.vue?32d3","webpack://nextcloud/./core/src/components/UnifiedSearch/SearchResult.vue?e4b5","webpack:///nextcloud/core/src/components/UnifiedSearch/SearchResultPlaceholders.vue?vue&type=script&lang=js&","webpack:///nextcloud/core/src/components/UnifiedSearch/SearchResultPlaceholders.vue","webpack://nextcloud/./core/src/components/UnifiedSearch/SearchResultPlaceholders.vue?f8e5","webpack://nextcloud/./core/src/components/UnifiedSearch/SearchResultPlaceholders.vue?7f72","webpack://nextcloud/./core/src/components/UnifiedSearch/SearchResultPlaceholders.vue?cc53","webpack:///nextcloud/core/src/services/UnifiedSearchService.js","webpack:///nextcloud/core/src/views/UnifiedSearch.vue","webpack:///nextcloud/core/src/views/UnifiedSearch.vue?vue&type=script&lang=js&","webpack://nextcloud/./core/src/views/UnifiedSearch.vue?cd77","webpack://nextcloud/./core/src/views/UnifiedSearch.vue?1990","webpack://nextcloud/./core/src/views/UnifiedSearch.vue?adc0","webpack:///nextcloud/core/src/unified-search.js","webpack:///nextcloud/core/src/components/UnifiedSearch/SearchResult.vue?vue&type=style&index=0&id=4805be6c&prod&lang=scss&scoped=true&","webpack:///nextcloud/core/src/components/UnifiedSearch/SearchResultPlaceholders.vue?vue&type=style&index=0&id=9ed03c40&prod&lang=scss&scoped=true&","webpack:///nextcloud/core/src/views/UnifiedSearch.vue?vue&type=style&index=0&id=fdcf2fa2&prod&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/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SearchResult.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!./SearchResult.vue?vue&type=script&lang=js&\""," <!--\n - @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n<template>\n\t<a :href=\"resourceUrl || '#'\"\n\t\tclass=\"unified-search__result\"\n\t\t:class=\"{\n\t\t\t'unified-search__result--focused': focused,\n\t\t}\"\n\t\t@click=\"reEmitEvent\"\n\t\t@focus=\"reEmitEvent\">\n\n\t\t<!-- Icon describing the result -->\n\t\t<div class=\"unified-search__result-icon\"\n\t\t\t:class=\"{\n\t\t\t\t'unified-search__result-icon--rounded': rounded,\n\t\t\t\t'unified-search__result-icon--no-preview': !hasValidThumbnail && !loaded,\n\t\t\t\t'unified-search__result-icon--with-thumbnail': hasValidThumbnail && loaded,\n\t\t\t\t[icon]: !loaded && !isIconUrl,\n\t\t\t}\"\n\t\t\t:style=\"{\n\t\t\t\tbackgroundImage: isIconUrl ? `url(${icon})` : '',\n\t\t\t}\">\n\n\t\t\t<img v-if=\"hasValidThumbnail\"\n\t\t\t\tv-show=\"loaded\"\n\t\t\t\t:src=\"thumbnailUrl\"\n\t\t\t\talt=\"\"\n\t\t\t\t@error=\"onError\"\n\t\t\t\t@load=\"onLoad\">\n\t\t</div>\n\n\t\t<!-- Title and sub-title -->\n\t\t<span class=\"unified-search__result-content\">\n\t\t\t<span class=\"unified-search__result-line-one\" :title=\"title\">\n\t\t\t\t<NcHighlight :text=\"title\" :search=\"query\" />\n\t\t\t</span>\n\t\t\t<span v-if=\"subline\" class=\"unified-search__result-line-two\" :title=\"subline\">{{ subline }}</span>\n\t\t</span>\n\t</a>\n</template>\n\n<script>\nimport NcHighlight from '@nextcloud/vue/dist/Components/NcHighlight'\n\nexport default {\n\tname: 'SearchResult',\n\n\tcomponents: {\n\t\tNcHighlight,\n\t},\n\n\tprops: {\n\t\tthumbnailUrl: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\t\ttitle: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tsubline: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\t\tresourceUrl: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\t\ticon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\trounded: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tquery: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * Only used for the first result as a visual feedback\n\t\t * so we can keep the search input focused but pressing\n\t\t * enter still opens the first result\n\t\t */\n\t\tfocused: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\thasValidThumbnail: this.thumbnailUrl && this.thumbnailUrl.trim() !== '',\n\t\t\tloaded: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tisIconUrl() {\n\t\t\t// If we're facing an absolute url\n\t\t\tif (this.icon.startsWith('/')) {\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\t// Otherwise, let's check if this is a valid url\n\t\t\ttry {\n\t\t\t\t// eslint-disable-next-line no-new\n\t\t\t\tnew URL(this.icon)\n\t\t\t} catch {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn true\n\t\t},\n\t},\n\n\twatch: {\n\t\t// Make sure to reset state on change even when vue recycle the component\n\t\tthumbnailUrl() {\n\t\t\tthis.hasValidThumbnail = this.thumbnailUrl && this.thumbnailUrl.trim() !== ''\n\t\t\tthis.loaded = false\n\t\t},\n\t},\n\n\tmethods: {\n\t\treEmitEvent(e) {\n\t\t\tthis.$emit(e.type, e)\n\t\t},\n\n\t\t/**\n\t\t * If the image fails to load, fallback to iconClass\n\t\t */\n\t\tonError() {\n\t\t\tthis.hasValidThumbnail = false\n\t\t},\n\n\t\tonLoad() {\n\t\t\tthis.loaded = true\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@use \"sass:math\";\n\n$clickable-area: 44px;\n$margin: 10px;\n\n.unified-search__result {\n\tdisplay: flex;\n\talign-items: center;\n\theight: $clickable-area;\n\tpadding: $margin;\n\tborder: 2px solid transparent;\n\tborder-radius: var(--border-radius-large) !important;\n\n\t&--focused {\n\t\tbackground-color: var(--color-background-hover);\n\t}\n\n\t&:active,\n\t&:hover,\n\t&:focus {\n\t\tbackground-color: var(--color-background-hover);\n\t\tborder: 2px solid var(--color-border-maxcontrast);\n\t}\n\n\t* {\n\t\tcursor: pointer;\n\t}\n\n\t&-icon {\n\t\toverflow: hidden;\n\t\twidth: $clickable-area;\n\t\theight: $clickable-area;\n\t\tborder-radius: var(--border-radius);\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position: center center;\n\t\tbackground-size: 32px;\n\t\t&--rounded {\n\t\t\tborder-radius: math.div($clickable-area, 2);\n\t\t}\n\t\t&--no-preview {\n\t\t\tbackground-size: 32px;\n\t\t}\n\t\t&--with-thumbnail {\n\t\t\tbackground-size: cover;\n\t\t}\n\t\t&--with-thumbnail:not(&--rounded) {\n\t\t\t// compensate for border\n\t\t\tmax-width: $clickable-area - 2px;\n\t\t\tmax-height: $clickable-area - 2px;\n\t\t\tborder: 1px solid var(--color-border);\n\t\t}\n\n\t\timg {\n\t\t\t// Make sure to keep ratio\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\n\t\t\tobject-fit: cover;\n\t\t\tobject-position: center;\n\t\t}\n\t}\n\n\t&-icon,\n\t&-actions {\n\t\tflex: 0 0 $clickable-area;\n\t}\n\n\t&-content {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tflex: 1 1 100%;\n\t\tflex-wrap: wrap;\n\t\t// Set to minimum and gro from it\n\t\tmin-width: 0;\n\t\tpadding-left: $margin;\n\t}\n\n\t&-line-one,\n\t&-line-two {\n\t\toverflow: hidden;\n\t\tflex: 1 1 100%;\n\t\tmargin: 1px 0;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t\t// Use the same color as the `a`\n\t\tcolor: inherit;\n\t\tfont-size: inherit;\n\t}\n\t&-line-two {\n\t\topacity: .7;\n\t\tfont-size: var(--default-font-size);\n\t}\n}\n\n</style>\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SearchResult.vue?vue&type=style&index=0&id=4805be6c&prod&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!./SearchResult.vue?vue&type=style&index=0&id=4805be6c&prod&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./SearchResult.vue?vue&type=template&id=4805be6c&scoped=true&\"\nimport script from \"./SearchResult.vue?vue&type=script&lang=js&\"\nexport * from \"./SearchResult.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SearchResult.vue?vue&type=style&index=0&id=4805be6c&prod&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 \"4805be6c\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('a',{staticClass:\"unified-search__result\",class:{\n\t\t'unified-search__result--focused': _vm.focused,\n\t},attrs:{\"href\":_vm.resourceUrl || '#'},on:{\"click\":_vm.reEmitEvent,\"focus\":_vm.reEmitEvent}},[_c('div',{staticClass:\"unified-search__result-icon\",class:{\n\t\t\t'unified-search__result-icon--rounded': _vm.rounded,\n\t\t\t'unified-search__result-icon--no-preview': !_vm.hasValidThumbnail && !_vm.loaded,\n\t\t\t'unified-search__result-icon--with-thumbnail': _vm.hasValidThumbnail && _vm.loaded,\n\t\t\t[_vm.icon]: !_vm.loaded && !_vm.isIconUrl,\n\t\t},style:({\n\t\t\tbackgroundImage: _vm.isIconUrl ? `url(${_vm.icon})` : '',\n\t\t})},[(_vm.hasValidThumbnail)?_c('img',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.loaded),expression:\"loaded\"}],attrs:{\"src\":_vm.thumbnailUrl,\"alt\":\"\"},on:{\"error\":_vm.onError,\"load\":_vm.onLoad}}):_vm._e()]),_vm._v(\" \"),_c('span',{staticClass:\"unified-search__result-content\"},[_c('span',{staticClass:\"unified-search__result-line-one\",attrs:{\"title\":_vm.title}},[_c('NcHighlight',{attrs:{\"text\":_vm.title,\"search\":_vm.query}})],1),_vm._v(\" \"),(_vm.subline)?_c('span',{staticClass:\"unified-search__result-line-two\",attrs:{\"title\":_vm.subline}},[_vm._v(_vm._s(_vm.subline))]):_vm._e()])])\n}\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!./SearchResultPlaceholders.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!./SearchResultPlaceholders.vue?vue&type=script&lang=js&\"","<template>\n\t<ul>\n\t\t<!-- Placeholder animation -->\n\t\t<svg class=\"unified-search__result-placeholder-gradient\">\n\t\t\t<defs>\n\t\t\t\t<linearGradient id=\"unified-search__result-placeholder-gradient\">\n\t\t\t\t\t<stop offset=\"0%\" :stop-color=\"light\">\n\t\t\t\t\t\t<animate attributeName=\"stop-color\"\n\t\t\t\t\t\t\t:values=\"`${light}; ${light}; ${dark}; ${dark}; ${light}`\"\n\t\t\t\t\t\t\tdur=\"2s\"\n\t\t\t\t\t\t\trepeatCount=\"indefinite\" />\n\t\t\t\t\t</stop>\n\t\t\t\t\t<stop offset=\"100%\" :stop-color=\"dark\">\n\t\t\t\t\t\t<animate attributeName=\"stop-color\"\n\t\t\t\t\t\t\t:values=\"`${dark}; ${light}; ${light}; ${dark}; ${dark}`\"\n\t\t\t\t\t\t\tdur=\"2s\"\n\t\t\t\t\t\t\trepeatCount=\"indefinite\" />\n\t\t\t\t\t</stop>\n\t\t\t\t</linearGradient>\n\t\t\t</defs>\n\t\t</svg>\n\n\t\t<!-- Placeholders -->\n\t\t<li v-for=\"placeholder in [1, 2, 3]\" :key=\"placeholder\">\n\t\t\t<svg class=\"unified-search__result-placeholder\"\n\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\tfill=\"url(#unified-search__result-placeholder-gradient)\">\n\t\t\t\t<rect class=\"unified-search__result-placeholder-icon\" />\n\t\t\t\t<rect class=\"unified-search__result-placeholder-line-one\" />\n\t\t\t\t<rect class=\"unified-search__result-placeholder-line-two\" :style=\"{width: `calc(${randWidth()}%)`}\" />\n\t\t\t</svg>\n\t\t</li>\n\t</ul>\n</template>\n\n<script>\nexport default {\n\tname: 'SearchResultPlaceholders',\n\n\tdata() {\n\t\treturn {\n\t\t\tlight: null,\n\t\t\tdark: null,\n\t\t}\n\t},\n\tmounted() {\n\t\tconst styles = getComputedStyle(document.documentElement)\n\t\tthis.dark = styles.getPropertyValue('--color-placeholder-dark')\n\t\tthis.light = styles.getPropertyValue('--color-placeholder-light')\n\t},\n\n\tmethods: {\n\t\trandWidth() {\n\t\t\treturn Math.floor(Math.random() * 20) + 30\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n$clickable-area: 44px;\n$margin: 10px;\n\n.unified-search__result-placeholder-gradient {\n\tposition: fixed;\n\theight: 0;\n\twidth: 0;\n\tz-index: -1;\n}\n\n.unified-search__result-placeholder {\n\twidth: calc(100% - 2 * #{$margin});\n\theight: $clickable-area;\n\tmargin: $margin;\n\n\t&-icon {\n\t\twidth: $clickable-area;\n\t\theight: $clickable-area;\n\t\trx: var(--border-radius);\n\t\try: var(--border-radius);\n\t}\n\n\t&-line-one,\n\t&-line-two {\n\t\twidth: calc(100% - #{$margin + $clickable-area});\n\t\theight: 1em;\n\t\tx: $margin + $clickable-area;\n\t}\n\n\t&-line-one {\n\t\ty: 5px;\n\t}\n\n\t&-line-two {\n\t\ty: 25px;\n\t}\n}\n\n</style>\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SearchResultPlaceholders.vue?vue&type=style&index=0&id=9ed03c40&prod&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!./SearchResultPlaceholders.vue?vue&type=style&index=0&id=9ed03c40&prod&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./SearchResultPlaceholders.vue?vue&type=template&id=9ed03c40&scoped=true&\"\nimport script from \"./SearchResultPlaceholders.vue?vue&type=script&lang=js&\"\nexport * from \"./SearchResultPlaceholders.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SearchResultPlaceholders.vue?vue&type=style&index=0&id=9ed03c40&prod&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 \"9ed03c40\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('ul',[_c('svg',{staticClass:\"unified-search__result-placeholder-gradient\"},[_c('defs',[_c('linearGradient',{attrs:{\"id\":\"unified-search__result-placeholder-gradient\"}},[_c('stop',{attrs:{\"offset\":\"0%\",\"stop-color\":_vm.light}},[_c('animate',{attrs:{\"attributeName\":\"stop-color\",\"values\":`${_vm.light}; ${_vm.light}; ${_vm.dark}; ${_vm.dark}; ${_vm.light}`,\"dur\":\"2s\",\"repeatCount\":\"indefinite\"}})]),_vm._v(\" \"),_c('stop',{attrs:{\"offset\":\"100%\",\"stop-color\":_vm.dark}},[_c('animate',{attrs:{\"attributeName\":\"stop-color\",\"values\":`${_vm.dark}; ${_vm.light}; ${_vm.light}; ${_vm.dark}; ${_vm.dark}`,\"dur\":\"2s\",\"repeatCount\":\"indefinite\"}})])],1)],1)]),_vm._v(\" \"),_vm._l(([1, 2, 3]),function(placeholder){return _c('li',{key:placeholder},[_c('svg',{staticClass:\"unified-search__result-placeholder\",attrs:{\"xmlns\":\"http://www.w3.org/2000/svg\",\"fill\":\"url(#unified-search__result-placeholder-gradient)\"}},[_c('rect',{staticClass:\"unified-search__result-placeholder-icon\"}),_vm._v(\" \"),_c('rect',{staticClass:\"unified-search__result-placeholder-line-one\"}),_vm._v(\" \"),_c('rect',{staticClass:\"unified-search__result-placeholder-line-two\",style:({width: `calc(${_vm.randWidth()}%)`})})])])})],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright 2020, John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author Christoph Wurst <christoph@winzerhof-wurst.at>\n * @author Daniel Calviño Sánchez <danxuliu@gmail.com>\n * @author Joas Schilling <coding@schilljs.com>\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 { generateOcsUrl } from '@nextcloud/router'\nimport { loadState } from '@nextcloud/initial-state'\nimport axios from '@nextcloud/axios'\n\nexport const defaultLimit = loadState('unified-search', 'limit-default')\nexport const minSearchLength = loadState('unified-search', 'min-search-length', 1)\nexport const enableLiveSearch = loadState('unified-search', 'live-search', true)\n\nexport const regexFilterIn = /(^|\\s)in:([a-z_-]+)/ig\nexport const regexFilterNot = /(^|\\s)-in:([a-z_-]+)/ig\n\n/**\n * Create a cancel token\n *\n * @return {import('axios').CancelTokenSource}\n */\nconst createCancelToken = () => axios.CancelToken.source()\n\n/**\n * Get the list of available search providers\n *\n * @return {Promise<Array>}\n */\nexport async function getTypes() {\n\ttry {\n\t\tconst { data } = await axios.get(generateOcsUrl('search/providers'), {\n\t\t\tparams: {\n\t\t\t\t// Sending which location we're currently at\n\t\t\t\tfrom: window.location.pathname.replace('/index.php', '') + window.location.search,\n\t\t\t},\n\t\t})\n\t\tif ('ocs' in data && 'data' in data.ocs && Array.isArray(data.ocs.data) && data.ocs.data.length > 0) {\n\t\t\t// Providers are sorted by the api based on their order key\n\t\t\treturn data.ocs.data\n\t\t}\n\t} catch (error) {\n\t\tconsole.error(error)\n\t}\n\treturn []\n}\n\n/**\n * Get the list of available search providers\n *\n * @param {object} options destructuring object\n * @param {string} options.type the type to search\n * @param {string} options.query the search\n * @param {number|string|undefined} options.cursor the offset for paginated searches\n * @return {object} {request: Promise, cancel: Promise}\n */\nexport function search({ type, query, cursor }) {\n\t/**\n\t * Generate an axios cancel token\n\t */\n\tconst cancelToken = createCancelToken()\n\n\tconst request = async () => axios.get(generateOcsUrl('search/providers/{type}/search', { type }), {\n\t\tcancelToken: cancelToken.token,\n\t\tparams: {\n\t\t\tterm: query,\n\t\t\tcursor,\n\t\t\t// Sending which location we're currently at\n\t\t\tfrom: window.location.pathname.replace('/index.php', '') + window.location.search,\n\t\t},\n\t})\n\n\treturn {\n\t\trequest,\n\t\tcancel: cancelToken.cancel,\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 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<NcHeaderMenu id=\"unified-search\"\n\t\tclass=\"unified-search\"\n\t\texclude-click-outside-classes=\"popover\"\n\t\t:open.sync=\"open\"\n\t\t:aria-label=\"ariaLabel\"\n\t\t@open=\"onOpen\"\n\t\t@close=\"onClose\">\n\t\t<!-- Header icon -->\n\t\t<template #trigger>\n\t\t\t<Magnify class=\"unified-search__trigger\"\n\t\t\t\t:size=\"22/* fit better next to other 20px icons */\"\n\t\t\t\tfill-color=\"var(--color-primary-text)\" />\n\t\t</template>\n\n\t\t<!-- Search form & filters wrapper -->\n\t\t<div class=\"unified-search__input-wrapper\">\n\t\t\t<label for=\"unified-search__input\">{{ ariaLabel }}</label>\n\t\t\t<div class=\"unified-search__input-row\">\n\t\t\t\t<form class=\"unified-search__form\"\n\t\t\t\t\trole=\"search\"\n\t\t\t\t\t:class=\"{'icon-loading-small': isLoading}\"\n\t\t\t\t\t@submit.prevent.stop=\"onInputEnter\"\n\t\t\t\t\t@reset.prevent.stop=\"onReset\">\n\t\t\t\t\t<!-- Search input -->\n\t\t\t\t\t<input ref=\"input\"\n\t\t\t\t\t\tid=\"unified-search__input\"\n\t\t\t\t\t\tv-model=\"query\"\n\t\t\t\t\t\tclass=\"unified-search__form-input\"\n\t\t\t\t\t\ttype=\"search\"\n\t\t\t\t\t\t:class=\"{'unified-search__form-input--with-reset': !!query}\"\n\t\t\t\t\t\t:placeholder=\"t('core', 'Search {types} …', { types: typesNames.join(', ') })\"\n\t\t\t\t\t\taria-describedby=\"unified-search-desc\"\n\t\t\t\t\t\t@input=\"onInputDebounced\"\n\t\t\t\t\t\t@keypress.enter.prevent.stop=\"onInputEnter\">\n\t\t\t\t\t<p id=\"unified-search-desc\" class=\"hidden-visually\">\n\t\t\t\t\t\t{{ t('core', 'Search starts once you start typing and results may be reached with the arrow keys') }}\n\t\t\t\t\t</p>\n\n\t\t\t\t\t<!-- Reset search button -->\n\t\t\t\t\t<input v-if=\"!!query && !isLoading\"\n\t\t\t\t\t\ttype=\"reset\"\n\t\t\t\t\t\tclass=\"unified-search__form-reset icon-close\"\n\t\t\t\t\t\t:aria-label=\"t('core','Reset search')\"\n\t\t\t\t\t\tvalue=\"\">\n\n\t\t\t\t\t<input v-if=\"!!query && !isLoading && !enableLiveSearch\"\n\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\tclass=\"unified-search__form-submit icon-confirm\"\n\t\t\t\t\t\t:aria-label=\"t('core','Start search')\"\n\t\t\t\t\t\tvalue=\"\">\n\t\t\t\t</form>\n\n\t\t\t\t<!-- Search filters -->\n\t\t\t\t<NcActions v-if=\"availableFilters.length > 1\"\n\t\t\t\t\tclass=\"unified-search__filters\"\n\t\t\t\t\tplacement=\"bottom\"\n\t\t\t\t\tcontainer=\".unified-search__input-wrapper\">\n\t\t\t\t\t<!-- FIXME use element ref for container after https://github.com/nextcloud/nextcloud-vue/pull/3462 -->\n\t\t\t\t\t<NcActionButton v-for=\"type in availableFilters\"\n\t\t\t\t\t\t:key=\"type\"\n\t\t\t\t\t\ticon=\"icon-filter\"\n\t\t\t\t\t\t:title=\"t('core', 'Search for {name} only', { name: typesMap[type] })\"\n\t\t\t\t\t\t@click.stop=\"onClickFilter(`in:${type}`)\">\n\t\t\t\t\t\t{{ `in:${type}` }}\n\t\t\t\t\t</NcActionButton>\n\t\t\t\t</NcActions>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<template v-if=\"!hasResults\">\n\t\t\t<!-- Loading placeholders -->\n\t\t\t<SearchResultPlaceholders v-if=\"isLoading\" />\n\n\t\t\t<NcEmptyContent v-else-if=\"isValidQuery\">\n\t\t\t\t<NcHighlight v-if=\"triggered\" :text=\"t('core', 'No results for {query}', { query })\" :search=\"query\" />\n\t\t\t\t<div v-else>\n\t\t\t\t\t{{ t('core', 'Press enter to start searching') }}\n\t\t\t\t</div>\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Magnify />\n\t\t\t\t</template>\n\t\t\t</NcEmptyContent>\n\n\t\t\t<NcEmptyContent v-else-if=\"!isLoading || isShortQuery\">\n\t\t\t\t{{ t('core', 'Start typing to search') }}\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Magnify />\n\t\t\t\t</template>\n\t\t\t\t<template v-if=\"isShortQuery\" #desc>\n\t\t\t\t\t{{ n('core',\n\t\t\t\t\t\t'Please enter {minSearchLength} character or more to search',\n\t\t\t\t\t\t'Please enter {minSearchLength} characters or more to search',\n\t\t\t\t\t\tminSearchLength,\n\t\t\t\t\t\t{minSearchLength}) }}\n\t\t\t\t</template>\n\t\t\t</NcEmptyContent>\n\t\t</template>\n\n\t\t<!-- Grouped search results -->\n\t\t<template v-else>\n\t\t\t<ul v-for=\"({list, type}, typesIndex) in orderedResults\"\n\t\t\t\t:key=\"type\"\n\t\t\t\tclass=\"unified-search__results\"\n\t\t\t\t:class=\"`unified-search__results-${type}`\"\n\t\t\t\t:aria-label=\"typesMap[type]\">\n\t\t\t\t<h2 class=\"unified-search__results-header\">\n\t\t\t\t\t{{ typesMap[type] }}\n\t\t\t\t</h2>\n\n\t\t\t\t<!-- Search results -->\n\t\t\t\t<li v-for=\"(result, index) in limitIfAny(list, type)\" :key=\"result.resourceUrl\">\n\t\t\t\t\t<SearchResult v-bind=\"result\"\n\t\t\t\t\t\t:query=\"query\"\n\t\t\t\t\t\t:focused=\"focused === 0 && typesIndex === 0 && index === 0\"\n\t\t\t\t\t\t@focus=\"setFocusedIndex\" />\n\t\t\t\t</li>\n\n\t\t\t\t<!-- Load more button -->\n\t\t\t\t<li>\n\t\t\t\t\t<SearchResult v-if=\"!reached[type]\"\n\t\t\t\t\t\tclass=\"unified-search__result-more\"\n\t\t\t\t\t\t:title=\"loading[type]\n\t\t\t\t\t\t\t? t('core', 'Loading more results …')\n\t\t\t\t\t\t\t: t('core', 'Load more results')\"\n\t\t\t\t\t\t:icon-class=\"loading[type] ? 'icon-loading-small' : ''\"\n\t\t\t\t\t\t@click.prevent.stop=\"loadMore(type)\"\n\t\t\t\t\t\t@focus=\"setFocusedIndex\" />\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t</template>\n\t</NcHeaderMenu>\n</template>\n\n<script>\nimport debounce from 'debounce'\nimport { emit, subscribe, unsubscribe } from '@nextcloud/event-bus'\nimport { showError } from '@nextcloud/dialogs'\n\nimport NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton.js'\nimport NcActions from '@nextcloud/vue/dist/Components/NcActions.js'\nimport NcEmptyContent from '@nextcloud/vue/dist/Components/NcEmptyContent.js'\nimport NcHeaderMenu from '@nextcloud/vue/dist/Components/NcHeaderMenu.js'\nimport NcHighlight from '@nextcloud/vue/dist/Components/NcHighlight.js'\n\nimport Magnify from 'vue-material-design-icons/Magnify.vue'\n\nimport SearchResult from '../components/UnifiedSearch/SearchResult.vue'\nimport SearchResultPlaceholders from '../components/UnifiedSearch/SearchResultPlaceholders.vue'\n\nimport { minSearchLength, getTypes, search, defaultLimit, regexFilterIn, regexFilterNot, enableLiveSearch } from '../services/UnifiedSearchService.js'\n\nconst REQUEST_FAILED = 0\nconst REQUEST_OK = 1\nconst REQUEST_CANCELED = 2\n\nexport default {\n\tname: 'UnifiedSearch',\n\n\tcomponents: {\n\t\tMagnify,\n\t\tNcActionButton,\n\t\tNcActions,\n\t\tNcEmptyContent,\n\t\tNcHeaderMenu,\n\t\tNcHighlight,\n\t\tSearchResult,\n\t\tSearchResultPlaceholders,\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\ttypes: [],\n\n\t\t\t// Cursors per types\n\t\t\tcursors: {},\n\t\t\t// Various search limits per types\n\t\t\tlimits: {},\n\t\t\t// Loading types\n\t\t\tloading: {},\n\t\t\t// Reached search types\n\t\t\treached: {},\n\t\t\t// Pending cancellable requests\n\t\t\trequests: [],\n\t\t\t// List of all results\n\t\t\tresults: {},\n\n\t\t\tquery: '',\n\t\t\tfocused: null,\n\t\t\ttriggered: false,\n\n\t\t\tdefaultLimit,\n\t\t\tminSearchLength,\n\t\t\tenableLiveSearch,\n\n\t\t\topen: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\ttypesIDs() {\n\t\t\treturn this.types.map(type => type.id)\n\t\t},\n\t\ttypesNames() {\n\t\t\treturn this.types.map(type => type.name)\n\t\t},\n\t\ttypesMap() {\n\t\t\treturn this.types.reduce((prev, curr) => {\n\t\t\t\tprev[curr.id] = curr.name\n\t\t\t\treturn prev\n\t\t\t}, {})\n\t\t},\n\n\t\tariaLabel() {\n\t\t\treturn t('core', 'Search')\n\t\t},\n\n\t\t/**\n\t\t * Is there any result to display\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\thasResults() {\n\t\t\treturn Object.keys(this.results).length !== 0\n\t\t},\n\n\t\t/**\n\t\t * Return ordered results\n\t\t *\n\t\t * @return {Array}\n\t\t */\n\t\torderedResults() {\n\t\t\treturn this.typesIDs\n\t\t\t\t.filter(type => type in this.results)\n\t\t\t\t.map(type => ({\n\t\t\t\t\ttype,\n\t\t\t\t\tlist: this.results[type],\n\t\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * Available filters\n\t\t * We only show filters that are available on the results\n\t\t *\n\t\t * @return {string[]}\n\t\t */\n\t\tavailableFilters() {\n\t\t\treturn Object.keys(this.results)\n\t\t},\n\n\t\t/**\n\t\t * Applied filters\n\t\t *\n\t\t * @return {string[]}\n\t\t */\n\t\tusedFiltersIn() {\n\t\t\tlet match\n\t\t\tconst filters = []\n\t\t\twhile ((match = regexFilterIn.exec(this.query)) !== null) {\n\t\t\t\tfilters.push(match[2])\n\t\t\t}\n\t\t\treturn filters\n\t\t},\n\n\t\t/**\n\t\t * Applied anti filters\n\t\t *\n\t\t * @return {string[]}\n\t\t */\n\t\tusedFiltersNot() {\n\t\t\tlet match\n\t\t\tconst filters = []\n\t\t\twhile ((match = regexFilterNot.exec(this.query)) !== null) {\n\t\t\t\tfilters.push(match[2])\n\t\t\t}\n\t\t\treturn filters\n\t\t},\n\n\t\t/**\n\t\t * Is the current search too short\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisShortQuery() {\n\t\t\treturn this.query && this.query.trim().length < minSearchLength\n\t\t},\n\n\t\t/**\n\t\t * Is the current search valid\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisValidQuery() {\n\t\t\treturn this.query && this.query.trim() !== '' && !this.isShortQuery\n\t\t},\n\n\t\t/**\n\t\t * Have we reached the end of all types searches\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisDoneSearching() {\n\t\t\treturn Object.values(this.reached).every(state => state === false)\n\t\t},\n\n\t\t/**\n\t\t * Is there any search in progress\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisLoading() {\n\t\t\treturn Object.values(this.loading).some(state => state === true)\n\t\t},\n\t},\n\n\tasync created() {\n\t\tsubscribe('files:navigation:changed', this.onNavigationChange)\n\t\tthis.types = await getTypes()\n\t\tthis.logger.debug('Unified Search initialized with the following providers', this.types)\n\t},\n\n\tbeforeDestroy() {\n\t\tunsubscribe('files:navigation:changed', this.onNavigationChange)\n\t},\n\n\tmounted() {\n\t\tif (OCP.Accessibility.disableKeyboardShortcuts()) {\n\t\t\treturn\n\t\t}\n\n\t\tdocument.addEventListener('keydown', (event) => {\n\t\t\t// if not already opened, allows us to trigger default browser on second keydown\n\t\t\tif (event.ctrlKey && event.key === 'f' && !this.open) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tthis.open = true\n\t\t\t}\n\n\t\t\t// https://www.w3.org/WAI/GL/wiki/Using_ARIA_menus\n\t\t\tif (this.open) {\n\t\t\t\t// If arrow down, focus next result\n\t\t\t\tif (event.key === 'ArrowDown') {\n\t\t\t\t\tthis.focusNext(event)\n\t\t\t\t}\n\n\t\t\t\t// If arrow up, focus prev result\n\t\t\t\tif (event.key === 'ArrowUp') {\n\t\t\t\t\tthis.focusPrev(event)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t},\n\n\tmethods: {\n\t\tasync onOpen() {\n\t\t\t// Update types list in the background\n\t\t\tthis.types = await getTypes()\n\t\t},\n\t\tonClose() {\n\t\t\temit('nextcloud:unified-search.close')\n\t\t},\n\n\t\tonNavigationChange() {\n\t\t\tthis.$el.querySelector('form[role=\"search\"]').reset()\n\t\t},\n\n\t\t/**\n\t\t * Reset the search state\n\t\t */\n\t\tonReset() {\n\t\t\temit('nextcloud:unified-search.reset')\n\t\t\tthis.logger.debug('Search reset')\n\t\t\tthis.query = ''\n\t\t\tthis.resetState()\n\t\t\tthis.focusInput()\n\t\t},\n\t\tasync resetState() {\n\t\t\tthis.cursors = {}\n\t\t\tthis.limits = {}\n\t\t\tthis.reached = {}\n\t\t\tthis.results = {}\n\t\t\tthis.focused = null\n\t\t\tthis.triggered = false\n\t\t\tawait this.cancelPendingRequests()\n\t\t},\n\n\t\t/**\n\t\t * Cancel any ongoing searches\n\t\t */\n\t\tasync cancelPendingRequests() {\n\t\t\t// Cloning so we can keep processing other requests\n\t\t\tconst requests = this.requests.slice(0)\n\t\t\tthis.requests = []\n\n\t\t\t// Cancel all pending requests\n\t\t\tawait Promise.all(requests.map(cancel => cancel()))\n\t\t},\n\n\t\t/**\n\t\t * Focus the search input on next tick\n\t\t */\n\t\tfocusInput() {\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis.$refs.input.focus()\n\t\t\t\tthis.$refs.input.select()\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * If we have results already, open first one\n\t\t * If not, trigger the search again\n\t\t */\n\t\tonInputEnter() {\n\t\t\tif (this.hasResults) {\n\t\t\t\tconst results = this.getResultsList()\n\t\t\t\tresults[0].click()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.onInput()\n\t\t},\n\n\t\t/**\n\t\t * Start searching on input\n\t\t */\n\t\tasync onInput() {\n\t\t\t// emit the search query\n\t\t\temit('nextcloud:unified-search.search', { query: this.query })\n\n\t\t\t// Do not search if not long enough\n\t\t\tif (this.query.trim() === '' || this.isShortQuery) {\n\t\t\t\tfor (const type of this.typesIDs) {\n\t\t\t\t\tthis.$delete(this.results, type)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tlet types = this.typesIDs\n\t\t\tlet query = this.query\n\n\t\t\t// Filter out types\n\t\t\tif (this.usedFiltersNot.length > 0) {\n\t\t\t\ttypes = this.typesIDs.filter(type => this.usedFiltersNot.indexOf(type) === -1)\n\t\t\t}\n\n\t\t\t// Only use those filters if any and check if they are valid\n\t\t\tif (this.usedFiltersIn.length > 0) {\n\t\t\t\ttypes = this.typesIDs.filter(type => this.usedFiltersIn.indexOf(type) > -1)\n\t\t\t}\n\n\t\t\t// Remove any filters from the query\n\t\t\tquery = query.replace(regexFilterIn, '').replace(regexFilterNot, '')\n\n\t\t\t// Reset search if the query changed\n\t\t\tawait this.resetState()\n\t\t\tthis.triggered = true\n\n\t\t\tif (!types.length) {\n\t\t\t\t// no results since no types were selected\n\t\t\t\tthis.logger.error('No types to search in')\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tthis.$set(this.loading, 'all', true)\n\t\t\tthis.logger.debug(`Searching ${query} in`, types)\n\n\t\t\tPromise.all(types.map(async type => {\n\t\t\t\ttry {\n\t\t\t\t\t// Init cancellable request\n\t\t\t\t\tconst { request, cancel } = search({ type, query })\n\t\t\t\t\tthis.requests.push(cancel)\n\n\t\t\t\t\t// Fetch results\n\t\t\t\t\tconst { data } = await request()\n\n\t\t\t\t\t// Process results\n\t\t\t\t\tif (data.ocs.data.entries.length > 0) {\n\t\t\t\t\t\tthis.$set(this.results, type, data.ocs.data.entries)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.$delete(this.results, type)\n\t\t\t\t\t}\n\n\t\t\t\t\t// Save cursor if any\n\t\t\t\t\tif (data.ocs.data.cursor) {\n\t\t\t\t\t\tthis.$set(this.cursors, type, data.ocs.data.cursor)\n\t\t\t\t\t} else if (!data.ocs.data.isPaginated) {\n\t\t\t\t\t// If no cursor and no pagination, we save the default amount\n\t\t\t\t\t// provided by server's initial state `defaultLimit`\n\t\t\t\t\t\tthis.$set(this.limits, type, this.defaultLimit)\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check if we reached end of pagination\n\t\t\t\t\tif (data.ocs.data.entries.length < this.defaultLimit) {\n\t\t\t\t\t\tthis.$set(this.reached, type, true)\n\t\t\t\t\t}\n\n\t\t\t\t\t// If none already focused, focus the first rendered result\n\t\t\t\t\tif (this.focused === null) {\n\t\t\t\t\t\tthis.focused = 0\n\t\t\t\t\t}\n\t\t\t\t\treturn REQUEST_OK\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.$delete(this.results, type)\n\n\t\t\t\t\t// If this is not a cancelled throw\n\t\t\t\t\tif (error.response && error.response.status) {\n\t\t\t\t\t\tthis.logger.error(`Error searching for ${this.typesMap[type]}`, error)\n\t\t\t\t\t\tshowError(this.t('core', 'An error occurred while searching for {type}', { type: this.typesMap[type] }))\n\t\t\t\t\t\treturn REQUEST_FAILED\n\t\t\t\t\t}\n\t\t\t\t\treturn REQUEST_CANCELED\n\t\t\t\t}\n\t\t\t})).then(results => {\n\t\t\t\t// Do not declare loading finished if the request have been cancelled\n\t\t\t\t// This means another search was triggered and we're therefore still loading\n\t\t\t\tif (results.some(result => result === REQUEST_CANCELED)) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t// We finished all searches\n\t\t\t\tthis.loading = {}\n\t\t\t})\n\t\t},\n\t\tonInputDebounced: enableLiveSearch\n\t\t\t? debounce(function(e) {\n\t\t\t\tthis.onInput(e)\n\t\t\t}, 500)\n\t\t\t: function() {\n\t\t\t\tthis.triggered = false\n\t\t\t},\n\n\t\t/**\n\t\t * Load more results for the provided type\n\t\t *\n\t\t * @param {string} type type\n\t\t */\n\t\tasync loadMore(type) {\n\t\t\t// If already loading, ignore\n\t\t\tif (this.loading[type]) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (this.cursors[type]) {\n\t\t\t\t// Init cancellable request\n\t\t\t\tconst { request, cancel } = search({ type, query: this.query, cursor: this.cursors[type] })\n\t\t\t\tthis.requests.push(cancel)\n\n\t\t\t\t// Fetch results\n\t\t\t\tconst { data } = await request()\n\n\t\t\t\t// Save cursor if any\n\t\t\t\tif (data.ocs.data.cursor) {\n\t\t\t\t\tthis.$set(this.cursors, type, data.ocs.data.cursor)\n\t\t\t\t}\n\n\t\t\t\t// Process results\n\t\t\t\tif (data.ocs.data.entries.length > 0) {\n\t\t\t\t\tthis.results[type].push(...data.ocs.data.entries)\n\t\t\t\t}\n\n\t\t\t\t// Check if we reached end of pagination\n\t\t\t\tif (data.ocs.data.entries.length < this.defaultLimit) {\n\t\t\t\t\tthis.$set(this.reached, type, true)\n\t\t\t\t}\n\t\t\t} else\n\n\t\t\t// If no cursor, we might have all the results already,\n\t\t\t// let's fake pagination and show the next xxx entries\n\t\t\tif (this.limits[type] && this.limits[type] >= 0) {\n\t\t\t\tthis.limits[type] += this.defaultLimit\n\n\t\t\t\t// Check if we reached end of pagination\n\t\t\t\tif (this.limits[type] >= this.results[type].length) {\n\t\t\t\t\tthis.$set(this.reached, type, true)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Focus result after render\n\t\t\tif (this.focused !== null) {\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\tthis.focusIndex(this.focused)\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Return a subset of the array if the search provider\n\t\t * doesn't supports pagination\n\t\t *\n\t\t * @param {Array} list the results\n\t\t * @param {string} type the type\n\t\t * @return {Array}\n\t\t */\n\t\tlimitIfAny(list, type) {\n\t\t\tif (type in this.limits) {\n\t\t\t\treturn list.slice(0, this.limits[type])\n\t\t\t}\n\t\t\treturn list\n\t\t},\n\n\t\tgetResultsList() {\n\t\t\treturn this.$el.querySelectorAll('.unified-search__results .unified-search__result')\n\t\t},\n\n\t\t/**\n\t\t * Focus the first result if any\n\t\t *\n\t\t * @param {Event} event the keydown event\n\t\t */\n\t\tfocusFirst(event) {\n\t\t\tconst results = this.getResultsList()\n\t\t\tif (results && results.length > 0) {\n\t\t\t\tif (event) {\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t}\n\t\t\t\tthis.focused = 0\n\t\t\t\tthis.focusIndex(this.focused)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Focus the next result if any\n\t\t *\n\t\t * @param {Event} event the keydown event\n\t\t */\n\t\tfocusNext(event) {\n\t\t\tif (this.focused === null) {\n\t\t\t\tthis.focusFirst(event)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst results = this.getResultsList()\n\t\t\t// If we're not focusing the last, focus the next one\n\t\t\tif (results && results.length > 0 && this.focused + 1 < results.length) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tthis.focused++\n\t\t\t\tthis.focusIndex(this.focused)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Focus the previous result if any\n\t\t *\n\t\t * @param {Event} event the keydown event\n\t\t */\n\t\tfocusPrev(event) {\n\t\t\tif (this.focused === null) {\n\t\t\t\tthis.focusFirst(event)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst results = this.getResultsList()\n\t\t\t// If we're not focusing the first, focus the previous one\n\t\t\tif (results && results.length > 0 && this.focused > 0) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tthis.focused--\n\t\t\t\tthis.focusIndex(this.focused)\n\t\t\t}\n\n\t\t},\n\n\t\t/**\n\t\t * Focus the specified result index if it exists\n\t\t *\n\t\t * @param {number} index the result index\n\t\t */\n\t\tfocusIndex(index) {\n\t\t\tconst results = this.getResultsList()\n\t\t\tif (results && results[index]) {\n\t\t\t\tresults[index].focus()\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Set the current focused element based on the target\n\t\t *\n\t\t * @param {Event} event the focus event\n\t\t */\n\t\tsetFocusedIndex(event) {\n\t\t\tconst entry = event.target\n\t\t\tconst results = this.getResultsList()\n\t\t\tconst index = [...results].findIndex(search => search === entry)\n\t\t\tif (index > -1) {\n\t\t\t\t// let's not use focusIndex as the entry is already focused\n\t\t\t\tthis.focused = index\n\t\t\t}\n\t\t},\n\n\t\tonClickFilter(filter) {\n\t\t\tthis.query = `${this.query} ${filter}`\n\t\t\t\t.replace(/ {2}/g, ' ')\n\t\t\t\t.trim()\n\t\t\tthis.onInput()\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@use \"sass:math\";\n\n$margin: 10px;\n$input-height: 34px;\n$input-padding: 6px;\n\n.unified-search {\n\t&__trigger {\n\t\tfilter: var(--background-image-invert-if-bright);\n\t}\n\n\t&__input-wrapper {\n\t\tposition: sticky;\n\t\t// above search results\n\t\tz-index: 2;\n\t\ttop: 0;\n\t\tdisplay: inline-flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\twidth: 100%;\n\t\tbackground-color: var(--color-main-background);\n\n\t\tlabel[for=\"unified-search__input\"] {\n\t\t\talign-self: flex-start;\n\t\t\tfont-weight: bold;\n\t\t\tfont-size: 19px;\n\t\t\tmargin-left: 13px;\n\t\t}\n\t}\n\n\t&__form-input {\n\t\tmargin: 0 !important;\n\t}\n\n\t&__input-row {\n\t\tdisplay: flex;\n\t\twidth: 100%;\n\t\talign-items: center;\n\t}\n\n\t&__filters {\n\t\tmargin: $margin 0 $margin math.div($margin, 2);\n\t\tul {\n\t\t\tdisplay: inline-flex;\n\t\t\tjustify-content: space-between;\n\t\t}\n\t}\n\n\t&__form {\n\t\tposition: relative;\n\t\twidth: 100%;\n\t\tmargin: $margin 0;\n\n\t\t// Loading spinner\n\t\t&::after {\n\t\t\tright: $input-padding;\n\t\t\tleft: auto;\n\t\t}\n\n\t\t&-input,\n\t\t&-reset {\n\t\t\tmargin: math.div($input-padding, 2);\n\t\t}\n\n\t\t&-input {\n\t\t\twidth: 100%;\n\t\t\theight: $input-height;\n\t\t\tpadding: $input-padding;\n\n\t\t\t&,\n\t\t\t&[placeholder],\n\t\t\t&::placeholder {\n\t\t\t\toverflow: hidden;\n\t\t\t\twhite-space: nowrap;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t}\n\n\t\t\t// Hide webkit clear search\n\t\t\t&::-webkit-search-decoration,\n\t\t\t&::-webkit-search-cancel-button,\n\t\t\t&::-webkit-search-results-button,\n\t\t\t&::-webkit-search-results-decoration {\n\t\t\t\t-webkit-appearance: none;\n\t\t\t}\n\n\t\t\t// Ellipsis earlier if reset button is here\n\t\t\t.icon-loading-small &,\n\t\t\t&--with-reset {\n\t\t\t\tpadding-right: $input-height;\n\t\t\t}\n\t\t}\n\n\t\t&-reset, &-submit {\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tright: 4px;\n\t\t\twidth: $input-height - $input-padding;\n\t\t\theight: $input-height - $input-padding;\n\t\t\tmin-height: 30px;\n\t\t\tpadding: 0;\n\t\t\topacity: .5;\n\t\t\tborder: none;\n\t\t\tbackground-color: transparent;\n\t\t\tmargin-right: 0;\n\n\t\t\t&:hover,\n\t\t\t&:focus,\n\t\t\t&:active {\n\t\t\t\topacity: 1;\n\t\t\t}\n\t\t}\n\n\t\t&-submit {\n\t\t\tright: 28px;\n\t\t}\n\t}\n\n\t&__results {\n\t\t&-header {\n\t\t\tdisplay: block;\n\t\t\tmargin: $margin;\n\t\t\tmargin-bottom: $margin - 4px;\n\t\t\tmargin-left: 13px;\n\t\t\tcolor: var(--color-primary-element);\n\t\t\tfont-size: 19px;\n\t\t\tfont-weight: bold;\n\t\t}\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 4px;\n\t}\n\n\t.unified-search__result-more::v-deep {\n\t\tcolor: var(--color-text-maxcontrast);\n\t}\n\n\t.empty-content {\n\t\tmargin: 10vh 0;\n\n\t\t::v-deep .empty-content__title {\n\t\t\tfont-weight: normal;\n font-size: var(--default-font-size);\n\t\t\tpadding: 0 15px;\n\t\t\ttext-align: center;\n\t\t}\n\t}\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!./UnifiedSearch.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!./UnifiedSearch.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!./UnifiedSearch.vue?vue&type=style&index=0&id=fdcf2fa2&prod&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!./UnifiedSearch.vue?vue&type=style&index=0&id=fdcf2fa2&prod&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./UnifiedSearch.vue?vue&type=template&id=fdcf2fa2&scoped=true&\"\nimport script from \"./UnifiedSearch.vue?vue&type=script&lang=js&\"\nexport * from \"./UnifiedSearch.vue?vue&type=script&lang=js&\"\nimport style0 from \"./UnifiedSearch.vue?vue&type=style&index=0&id=fdcf2fa2&prod&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 \"fdcf2fa2\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('NcHeaderMenu',{staticClass:\"unified-search\",attrs:{\"id\":\"unified-search\",\"exclude-click-outside-classes\":\"popover\",\"open\":_vm.open,\"aria-label\":_vm.ariaLabel},on:{\"update:open\":function($event){_vm.open=$event},\"open\":_vm.onOpen,\"close\":_vm.onClose},scopedSlots:_vm._u([{key:\"trigger\",fn:function(){return [_c('Magnify',{staticClass:\"unified-search__trigger\",attrs:{\"size\":22/* fit better next to other 20px icons */,\"fill-color\":\"var(--color-primary-text)\"}})]},proxy:true}])},[_vm._v(\" \"),_c('div',{staticClass:\"unified-search__input-wrapper\"},[_c('label',{attrs:{\"for\":\"unified-search__input\"}},[_vm._v(_vm._s(_vm.ariaLabel))]),_vm._v(\" \"),_c('div',{staticClass:\"unified-search__input-row\"},[_c('form',{staticClass:\"unified-search__form\",class:{'icon-loading-small': _vm.isLoading},attrs:{\"role\":\"search\"},on:{\"submit\":function($event){$event.preventDefault();$event.stopPropagation();return _vm.onInputEnter.apply(null, arguments)},\"reset\":function($event){$event.preventDefault();$event.stopPropagation();return _vm.onReset.apply(null, arguments)}}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.query),expression:\"query\"}],ref:\"input\",staticClass:\"unified-search__form-input\",class:{'unified-search__form-input--with-reset': !!_vm.query},attrs:{\"id\":\"unified-search__input\",\"type\":\"search\",\"placeholder\":_vm.t('core', 'Search {types} …', { types: _vm.typesNames.join(', ') }),\"aria-describedby\":\"unified-search-desc\"},domProps:{\"value\":(_vm.query)},on:{\"input\":[function($event){if($event.target.composing)return;_vm.query=$event.target.value},_vm.onInputDebounced],\"keypress\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\"))return null;$event.preventDefault();$event.stopPropagation();return _vm.onInputEnter.apply(null, arguments)}}}),_vm._v(\" \"),_c('p',{staticClass:\"hidden-visually\",attrs:{\"id\":\"unified-search-desc\"}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'Search starts once you start typing and results may be reached with the arrow keys'))+\"\\n\\t\\t\\t\\t\")]),_vm._v(\" \"),(!!_vm.query && !_vm.isLoading)?_c('input',{staticClass:\"unified-search__form-reset icon-close\",attrs:{\"type\":\"reset\",\"aria-label\":_vm.t('core','Reset search'),\"value\":\"\"}}):_vm._e(),_vm._v(\" \"),(!!_vm.query && !_vm.isLoading && !_vm.enableLiveSearch)?_c('input',{staticClass:\"unified-search__form-submit icon-confirm\",attrs:{\"type\":\"submit\",\"aria-label\":_vm.t('core','Start search'),\"value\":\"\"}}):_vm._e()]),_vm._v(\" \"),(_vm.availableFilters.length > 1)?_c('NcActions',{staticClass:\"unified-search__filters\",attrs:{\"placement\":\"bottom\",\"container\":\".unified-search__input-wrapper\"}},_vm._l((_vm.availableFilters),function(type){return _c('NcActionButton',{key:type,attrs:{\"icon\":\"icon-filter\",\"title\":_vm.t('core', 'Search for {name} only', { name: _vm.typesMap[type] })},on:{\"click\":function($event){$event.stopPropagation();return _vm.onClickFilter(`in:${type}`)}}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(`in:${type}`)+\"\\n\\t\\t\\t\\t\")])}),1):_vm._e()],1)]),_vm._v(\" \"),(!_vm.hasResults)?[(_vm.isLoading)?_c('SearchResultPlaceholders'):(_vm.isValidQuery)?_c('NcEmptyContent',{scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('Magnify')]},proxy:true}],null,false,931131664)},[(_vm.triggered)?_c('NcHighlight',{attrs:{\"text\":_vm.t('core', 'No results for {query}', { query: _vm.query }),\"search\":_vm.query}}):_c('div',[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'Press enter to start searching'))+\"\\n\\t\\t\\t\")])],1):(!_vm.isLoading || _vm.isShortQuery)?_c('NcEmptyContent',{scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('Magnify')]},proxy:true},(_vm.isShortQuery)?{key:\"desc\",fn:function(){return [_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.n('core',\n\t\t\t\t\t'Please enter {minSearchLength} character or more to search',\n\t\t\t\t\t'Please enter {minSearchLength} characters or more to search',\n\t\t\t\t\t_vm.minSearchLength,\n\t\t\t\t\t{minSearchLength: _vm.minSearchLength}))+\"\\n\\t\\t\\t\")]},proxy:true}:null],null,true)},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('core', 'Start typing to search'))+\"\\n\\t\\t\\t\")]):_vm._e()]:_vm._l((_vm.orderedResults),function({list, type},typesIndex){return _c('ul',{key:type,staticClass:\"unified-search__results\",class:`unified-search__results-${type}`,attrs:{\"aria-label\":_vm.typesMap[type]}},[_c('h2',{staticClass:\"unified-search__results-header\"},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.typesMap[type])+\"\\n\\t\\t\\t\")]),_vm._v(\" \"),_vm._l((_vm.limitIfAny(list, type)),function(result,index){return _c('li',{key:result.resourceUrl},[_c('SearchResult',_vm._b({attrs:{\"query\":_vm.query,\"focused\":_vm.focused === 0 && typesIndex === 0 && index === 0},on:{\"focus\":_vm.setFocusedIndex}},'SearchResult',result,false))],1)}),_vm._v(\" \"),_c('li',[(!_vm.reached[type])?_c('SearchResult',{staticClass:\"unified-search__result-more\",attrs:{\"title\":_vm.loading[type]\n\t\t\t\t\t\t? _vm.t('core', 'Loading more results …')\n\t\t\t\t\t\t: _vm.t('core', 'Load more results'),\"icon-class\":_vm.loading[type] ? 'icon-loading-small' : ''},on:{\"click\":function($event){$event.preventDefault();$event.stopPropagation();return _vm.loadMore(type)},\"focus\":_vm.setFocusedIndex}}):_vm._e()],1)],2)})],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\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 { getLoggerBuilder } from '@nextcloud/logger'\nimport { getRequestToken } from '@nextcloud/auth'\nimport { translate as t, translatePlural as n } from '@nextcloud/l10n'\nimport Vue from 'vue'\n\nimport UnifiedSearch from './views/UnifiedSearch.vue'\n\n// eslint-disable-next-line camelcase\n__webpack_nonce__ = btoa(getRequestToken())\n\nconst logger = getLoggerBuilder()\n\t.setApp('unified-search')\n\t.detectUser()\n\t.build()\n\nVue.mixin({\n\tdata() {\n\t\treturn {\n\t\t\tlogger,\n\t\t}\n\t},\n\tmethods: {\n\t\tt,\n\t\tn,\n\t},\n})\n\nexport default new Vue({\n\tel: '#unified-search',\n\t// eslint-disable-next-line vue/match-component-file-name\n\tname: 'UnifiedSearchRoot',\n\trender: h => h(UnifiedSearch),\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, \".unified-search__result[data-v-4805be6c]{display:flex;align-items:center;height:44px;padding:10px;border:2px solid rgba(0,0,0,0);border-radius:var(--border-radius-large) !important}.unified-search__result--focused[data-v-4805be6c]{background-color:var(--color-background-hover)}.unified-search__result[data-v-4805be6c]:active,.unified-search__result[data-v-4805be6c]:hover,.unified-search__result[data-v-4805be6c]:focus{background-color:var(--color-background-hover);border:2px solid var(--color-border-maxcontrast)}.unified-search__result *[data-v-4805be6c]{cursor:pointer}.unified-search__result-icon[data-v-4805be6c]{overflow:hidden;width:44px;height:44px;border-radius:var(--border-radius);background-repeat:no-repeat;background-position:center center;background-size:32px}.unified-search__result-icon--rounded[data-v-4805be6c]{border-radius:22px}.unified-search__result-icon--no-preview[data-v-4805be6c]{background-size:32px}.unified-search__result-icon--with-thumbnail[data-v-4805be6c]{background-size:cover}.unified-search__result-icon--with-thumbnail[data-v-4805be6c]:not(.unified-search__result-icon--rounded){max-width:42px;max-height:42px;border:1px solid var(--color-border)}.unified-search__result-icon img[data-v-4805be6c]{width:100%;height:100%;object-fit:cover;object-position:center}.unified-search__result-icon[data-v-4805be6c],.unified-search__result-actions[data-v-4805be6c]{flex:0 0 44px}.unified-search__result-content[data-v-4805be6c]{display:flex;align-items:center;flex:1 1 100%;flex-wrap:wrap;min-width:0;padding-left:10px}.unified-search__result-line-one[data-v-4805be6c],.unified-search__result-line-two[data-v-4805be6c]{overflow:hidden;flex:1 1 100%;margin:1px 0;white-space:nowrap;text-overflow:ellipsis;color:inherit;font-size:inherit}.unified-search__result-line-two[data-v-4805be6c]{opacity:.7;font-size:var(--default-font-size)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./core/src/components/UnifiedSearch/SearchResult.vue\"],\"names\":[],\"mappings\":\"AAMA,yCACC,YAAA,CACA,kBAAA,CACA,WANgB,CAOhB,YANQ,CAOR,8BAAA,CACA,mDAAA,CAEA,kDACC,8CAAA,CAGD,8IAGC,8CAAA,CACA,gDAAA,CAGD,2CACC,cAAA,CAGD,8CACC,eAAA,CACA,UA5Be,CA6Bf,WA7Be,CA8Bf,kCAAA,CACA,2BAAA,CACA,iCAAA,CACA,oBAAA,CACA,uDACC,kBAAA,CAED,0DACC,oBAAA,CAED,8DACC,qBAAA,CAED,yGAEC,cAAA,CACA,eAAA,CACA,oCAAA,CAGD,kDAEC,UAAA,CACA,WAAA,CAEA,gBAAA,CACA,sBAAA,CAIF,+FAEC,aAAA,CAGD,iDACC,YAAA,CACA,kBAAA,CACA,aAAA,CACA,cAAA,CAEA,WAAA,CACA,iBAvEO,CA0ER,oGAEC,eAAA,CACA,aAAA,CACA,YAAA,CACA,kBAAA,CACA,sBAAA,CAEA,aAAA,CACA,iBAAA,CAED,kDACC,UAAA,CACA,kCAAA\",\"sourcesContent\":[\"\\n@use \\\"sass:math\\\";\\n\\n$clickable-area: 44px;\\n$margin: 10px;\\n\\n.unified-search__result {\\n\\tdisplay: flex;\\n\\talign-items: center;\\n\\theight: $clickable-area;\\n\\tpadding: $margin;\\n\\tborder: 2px solid transparent;\\n\\tborder-radius: var(--border-radius-large) !important;\\n\\n\\t&--focused {\\n\\t\\tbackground-color: var(--color-background-hover);\\n\\t}\\n\\n\\t&:active,\\n\\t&:hover,\\n\\t&:focus {\\n\\t\\tbackground-color: var(--color-background-hover);\\n\\t\\tborder: 2px solid var(--color-border-maxcontrast);\\n\\t}\\n\\n\\t* {\\n\\t\\tcursor: pointer;\\n\\t}\\n\\n\\t&-icon {\\n\\t\\toverflow: hidden;\\n\\t\\twidth: $clickable-area;\\n\\t\\theight: $clickable-area;\\n\\t\\tborder-radius: var(--border-radius);\\n\\t\\tbackground-repeat: no-repeat;\\n\\t\\tbackground-position: center center;\\n\\t\\tbackground-size: 32px;\\n\\t\\t&--rounded {\\n\\t\\t\\tborder-radius: math.div($clickable-area, 2);\\n\\t\\t}\\n\\t\\t&--no-preview {\\n\\t\\t\\tbackground-size: 32px;\\n\\t\\t}\\n\\t\\t&--with-thumbnail {\\n\\t\\t\\tbackground-size: cover;\\n\\t\\t}\\n\\t\\t&--with-thumbnail:not(&--rounded) {\\n\\t\\t\\t// compensate for border\\n\\t\\t\\tmax-width: $clickable-area - 2px;\\n\\t\\t\\tmax-height: $clickable-area - 2px;\\n\\t\\t\\tborder: 1px solid var(--color-border);\\n\\t\\t}\\n\\n\\t\\timg {\\n\\t\\t\\t// Make sure to keep ratio\\n\\t\\t\\twidth: 100%;\\n\\t\\t\\theight: 100%;\\n\\n\\t\\t\\tobject-fit: cover;\\n\\t\\t\\tobject-position: center;\\n\\t\\t}\\n\\t}\\n\\n\\t&-icon,\\n\\t&-actions {\\n\\t\\tflex: 0 0 $clickable-area;\\n\\t}\\n\\n\\t&-content {\\n\\t\\tdisplay: flex;\\n\\t\\talign-items: center;\\n\\t\\tflex: 1 1 100%;\\n\\t\\tflex-wrap: wrap;\\n\\t\\t// Set to minimum and gro from it\\n\\t\\tmin-width: 0;\\n\\t\\tpadding-left: $margin;\\n\\t}\\n\\n\\t&-line-one,\\n\\t&-line-two {\\n\\t\\toverflow: hidden;\\n\\t\\tflex: 1 1 100%;\\n\\t\\tmargin: 1px 0;\\n\\t\\twhite-space: nowrap;\\n\\t\\ttext-overflow: ellipsis;\\n\\t\\t// Use the same color as the `a`\\n\\t\\tcolor: inherit;\\n\\t\\tfont-size: inherit;\\n\\t}\\n\\t&-line-two {\\n\\t\\topacity: .7;\\n\\t\\tfont-size: var(--default-font-size);\\n\\t}\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".unified-search__result-placeholder-gradient[data-v-9ed03c40]{position:fixed;height:0;width:0;z-index:-1}.unified-search__result-placeholder[data-v-9ed03c40]{width:calc(100% - 2 * 10px);height:44px;margin:10px}.unified-search__result-placeholder-icon[data-v-9ed03c40]{width:44px;height:44px;rx:var(--border-radius);ry:var(--border-radius)}.unified-search__result-placeholder-line-one[data-v-9ed03c40],.unified-search__result-placeholder-line-two[data-v-9ed03c40]{width:calc(100% - 54px);height:1em;x:54px}.unified-search__result-placeholder-line-one[data-v-9ed03c40]{y:5px}.unified-search__result-placeholder-line-two[data-v-9ed03c40]{y:25px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./core/src/components/UnifiedSearch/SearchResultPlaceholders.vue\"],\"names\":[],\"mappings\":\"AAIA,8DACC,cAAA,CACA,QAAA,CACA,OAAA,CACA,UAAA,CAGD,qDACC,2BAAA,CACA,WAZgB,CAahB,WAZQ,CAcR,0DACC,UAhBe,CAiBf,WAjBe,CAkBf,uBAAA,CACA,uBAAA,CAGD,4HAEC,uBAAA,CACA,UAAA,CACA,MAAA,CAGD,8DACC,KAAA,CAGD,8DACC,MAAA\",\"sourcesContent\":[\"\\n$clickable-area: 44px;\\n$margin: 10px;\\n\\n.unified-search__result-placeholder-gradient {\\n\\tposition: fixed;\\n\\theight: 0;\\n\\twidth: 0;\\n\\tz-index: -1;\\n}\\n\\n.unified-search__result-placeholder {\\n\\twidth: calc(100% - 2 * #{$margin});\\n\\theight: $clickable-area;\\n\\tmargin: $margin;\\n\\n\\t&-icon {\\n\\t\\twidth: $clickable-area;\\n\\t\\theight: $clickable-area;\\n\\t\\trx: var(--border-radius);\\n\\t\\try: var(--border-radius);\\n\\t}\\n\\n\\t&-line-one,\\n\\t&-line-two {\\n\\t\\twidth: calc(100% - #{$margin + $clickable-area});\\n\\t\\theight: 1em;\\n\\t\\tx: $margin + $clickable-area;\\n\\t}\\n\\n\\t&-line-one {\\n\\t\\ty: 5px;\\n\\t}\\n\\n\\t&-line-two {\\n\\t\\ty: 25px;\\n\\t}\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".unified-search__trigger[data-v-fdcf2fa2]{filter:var(--background-image-invert-if-bright)}.unified-search__input-wrapper[data-v-fdcf2fa2]{position:sticky;z-index:2;top:0;display:inline-flex;flex-direction:column;align-items:center;width:100%;background-color:var(--color-main-background)}.unified-search__input-wrapper label[for=unified-search__input][data-v-fdcf2fa2]{align-self:flex-start;font-weight:bold;font-size:19px;margin-left:13px}.unified-search__form-input[data-v-fdcf2fa2]{margin:0 !important}.unified-search__input-row[data-v-fdcf2fa2]{display:flex;width:100%;align-items:center}.unified-search__filters[data-v-fdcf2fa2]{margin:10px 0 10px 5px}.unified-search__filters ul[data-v-fdcf2fa2]{display:inline-flex;justify-content:space-between}.unified-search__form[data-v-fdcf2fa2]{position:relative;width:100%;margin:10px 0}.unified-search__form[data-v-fdcf2fa2]::after{right:6px;left:auto}.unified-search__form-input[data-v-fdcf2fa2],.unified-search__form-reset[data-v-fdcf2fa2]{margin:3px}.unified-search__form-input[data-v-fdcf2fa2]{width:100%;height:34px;padding:6px}.unified-search__form-input[data-v-fdcf2fa2],.unified-search__form-input[placeholder][data-v-fdcf2fa2],.unified-search__form-input[data-v-fdcf2fa2]::placeholder{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.unified-search__form-input[data-v-fdcf2fa2]::-webkit-search-decoration,.unified-search__form-input[data-v-fdcf2fa2]::-webkit-search-cancel-button,.unified-search__form-input[data-v-fdcf2fa2]::-webkit-search-results-button,.unified-search__form-input[data-v-fdcf2fa2]::-webkit-search-results-decoration{-webkit-appearance:none}.icon-loading-small .unified-search__form-input[data-v-fdcf2fa2],.unified-search__form-input--with-reset[data-v-fdcf2fa2]{padding-right:34px}.unified-search__form-reset[data-v-fdcf2fa2],.unified-search__form-submit[data-v-fdcf2fa2]{position:absolute;top:0;right:4px;width:28px;height:28px;min-height:30px;padding:0;opacity:.5;border:none;background-color:rgba(0,0,0,0);margin-right:0}.unified-search__form-reset[data-v-fdcf2fa2]:hover,.unified-search__form-reset[data-v-fdcf2fa2]:focus,.unified-search__form-reset[data-v-fdcf2fa2]:active,.unified-search__form-submit[data-v-fdcf2fa2]:hover,.unified-search__form-submit[data-v-fdcf2fa2]:focus,.unified-search__form-submit[data-v-fdcf2fa2]:active{opacity:1}.unified-search__form-submit[data-v-fdcf2fa2]{right:28px}.unified-search__results[data-v-fdcf2fa2]{display:flex;flex-direction:column;gap:4px}.unified-search__results-header[data-v-fdcf2fa2]{display:block;margin:10px;margin-bottom:6px;margin-left:13px;color:var(--color-primary-element);font-size:19px;font-weight:bold}.unified-search .unified-search__result-more[data-v-fdcf2fa2]{color:var(--color-text-maxcontrast)}.unified-search .empty-content[data-v-fdcf2fa2]{margin:10vh 0}.unified-search .empty-content[data-v-fdcf2fa2] .empty-content__title{font-weight:normal;font-size:var(--default-font-size);padding:0 15px;text-align:center}\", \"\",{\"version\":3,\"sources\":[\"webpack://./core/src/views/UnifiedSearch.vue\"],\"names\":[],\"mappings\":\"AAQC,0CACC,+CAAA,CAGD,gDACC,eAAA,CAEA,SAAA,CACA,KAAA,CACA,mBAAA,CACA,qBAAA,CACA,kBAAA,CACA,UAAA,CACA,6CAAA,CAEA,iFACC,qBAAA,CACA,gBAAA,CACA,cAAA,CACA,gBAAA,CAIF,6CACC,mBAAA,CAGD,4CACC,YAAA,CACA,UAAA,CACA,kBAAA,CAGD,0CACC,sBAAA,CACA,6CACC,mBAAA,CACA,6BAAA,CAIF,uCACC,iBAAA,CACA,UAAA,CACA,aAAA,CAGA,8CACC,SAnDa,CAoDb,SAAA,CAGD,0FAEC,UAAA,CAGD,6CACC,UAAA,CACA,WA/DY,CAgEZ,WA/Da,CAiEb,iKAGC,eAAA,CACA,kBAAA,CACA,sBAAA,CAID,+SAIC,uBAAA,CAID,0HAEC,kBArFW,CAyFb,2FACC,iBAAA,CACA,KAAA,CACA,SAAA,CACA,UAAA,CACA,WAAA,CACA,eAAA,CACA,SAAA,CACA,UAAA,CACA,WAAA,CACA,8BAAA,CACA,cAAA,CAEA,uTAGC,SAAA,CAIF,8CACC,UAAA,CAIF,0CAUC,YAAA,CACA,qBAAA,CACA,OAAA,CAXA,iDACC,aAAA,CACA,WAtHM,CAuHN,iBAAA,CACA,gBAAA,CACA,kCAAA,CACA,cAAA,CACA,gBAAA,CAOF,8DACC,mCAAA,CAGD,gDACC,aAAA,CAEA,sEACC,kBAAA,CACS,kCAAA,CACT,cAAA,CACA,iBAAA\",\"sourcesContent\":[\"\\n@use \\\"sass:math\\\";\\n\\n$margin: 10px;\\n$input-height: 34px;\\n$input-padding: 6px;\\n\\n.unified-search {\\n\\t&__trigger {\\n\\t\\tfilter: var(--background-image-invert-if-bright);\\n\\t}\\n\\n\\t&__input-wrapper {\\n\\t\\tposition: sticky;\\n\\t\\t// above search results\\n\\t\\tz-index: 2;\\n\\t\\ttop: 0;\\n\\t\\tdisplay: inline-flex;\\n\\t\\tflex-direction: column;\\n\\t\\talign-items: center;\\n\\t\\twidth: 100%;\\n\\t\\tbackground-color: var(--color-main-background);\\n\\n\\t\\tlabel[for=\\\"unified-search__input\\\"] {\\n\\t\\t\\talign-self: flex-start;\\n\\t\\t\\tfont-weight: bold;\\n\\t\\t\\tfont-size: 19px;\\n\\t\\t\\tmargin-left: 13px;\\n\\t\\t}\\n\\t}\\n\\n\\t&__form-input {\\n\\t\\tmargin: 0 !important;\\n\\t}\\n\\n\\t&__input-row {\\n\\t\\tdisplay: flex;\\n\\t\\twidth: 100%;\\n\\t\\talign-items: center;\\n\\t}\\n\\n\\t&__filters {\\n\\t\\tmargin: $margin 0 $margin math.div($margin, 2);\\n\\t\\tul {\\n\\t\\t\\tdisplay: inline-flex;\\n\\t\\t\\tjustify-content: space-between;\\n\\t\\t}\\n\\t}\\n\\n\\t&__form {\\n\\t\\tposition: relative;\\n\\t\\twidth: 100%;\\n\\t\\tmargin: $margin 0;\\n\\n\\t\\t// Loading spinner\\n\\t\\t&::after {\\n\\t\\t\\tright: $input-padding;\\n\\t\\t\\tleft: auto;\\n\\t\\t}\\n\\n\\t\\t&-input,\\n\\t\\t&-reset {\\n\\t\\t\\tmargin: math.div($input-padding, 2);\\n\\t\\t}\\n\\n\\t\\t&-input {\\n\\t\\t\\twidth: 100%;\\n\\t\\t\\theight: $input-height;\\n\\t\\t\\tpadding: $input-padding;\\n\\n\\t\\t\\t&,\\n\\t\\t\\t&[placeholder],\\n\\t\\t\\t&::placeholder {\\n\\t\\t\\t\\toverflow: hidden;\\n\\t\\t\\t\\twhite-space: nowrap;\\n\\t\\t\\t\\ttext-overflow: ellipsis;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Hide webkit clear search\\n\\t\\t\\t&::-webkit-search-decoration,\\n\\t\\t\\t&::-webkit-search-cancel-button,\\n\\t\\t\\t&::-webkit-search-results-button,\\n\\t\\t\\t&::-webkit-search-results-decoration {\\n\\t\\t\\t\\t-webkit-appearance: none;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Ellipsis earlier if reset button is here\\n\\t\\t\\t.icon-loading-small &,\\n\\t\\t\\t&--with-reset {\\n\\t\\t\\t\\tpadding-right: $input-height;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t&-reset, &-submit {\\n\\t\\t\\tposition: absolute;\\n\\t\\t\\ttop: 0;\\n\\t\\t\\tright: 4px;\\n\\t\\t\\twidth: $input-height - $input-padding;\\n\\t\\t\\theight: $input-height - $input-padding;\\n\\t\\t\\tmin-height: 30px;\\n\\t\\t\\tpadding: 0;\\n\\t\\t\\topacity: .5;\\n\\t\\t\\tborder: none;\\n\\t\\t\\tbackground-color: transparent;\\n\\t\\t\\tmargin-right: 0;\\n\\n\\t\\t\\t&:hover,\\n\\t\\t\\t&:focus,\\n\\t\\t\\t&:active {\\n\\t\\t\\t\\topacity: 1;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t&-submit {\\n\\t\\t\\tright: 28px;\\n\\t\\t}\\n\\t}\\n\\n\\t&__results {\\n\\t\\t&-header {\\n\\t\\t\\tdisplay: block;\\n\\t\\t\\tmargin: $margin;\\n\\t\\t\\tmargin-bottom: $margin - 4px;\\n\\t\\t\\tmargin-left: 13px;\\n\\t\\t\\tcolor: var(--color-primary-element);\\n\\t\\t\\tfont-size: 19px;\\n\\t\\t\\tfont-weight: bold;\\n\\t\\t}\\n\\t\\tdisplay: flex;\\n\\t\\tflex-direction: column;\\n\\t\\tgap: 4px;\\n\\t}\\n\\n\\t.unified-search__result-more::v-deep {\\n\\t\\tcolor: var(--color-text-maxcontrast);\\n\\t}\\n\\n\\t.empty-content {\\n\\t\\tmargin: 10vh 0;\\n\\n\\t\\t::v-deep .empty-content__title {\\n\\t\\t\\tfont-weight: normal;\\n font-size: var(--default-font-size);\\n\\t\\t\\tpadding: 0 15px;\\n\\t\\t\\ttext-align: center;\\n\\t\\t}\\n\\t}\\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 = 9671;","__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\t9671: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [7874], function() { return __webpack_require__(56874); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","_vm","this","_c","_self","staticClass","class","focused","attrs","resourceUrl","on","reEmitEvent","rounded","hasValidThumbnail","loaded","icon","isIconUrl","style","backgroundImage","directives","name","rawName","value","expression","thumbnailUrl","onError","onLoad","_e","_v","title","query","subline","_s","light","dark","_l","placeholder","key","width","randWidth","defaultLimit","loadState","minSearchLength","enableLiveSearch","regexFilterIn","regexFilterNot","getTypes","axios","generateOcsUrl","params","from","window","location","pathname","replace","search","data","ocs","Array","isArray","length","console","error","type","cursor","cancelToken","request","token","term","cancel","open","ariaLabel","$event","onOpen","onClose","scopedSlots","_u","fn","proxy","isLoading","preventDefault","stopPropagation","onInputEnter","apply","arguments","onReset","ref","t","types","typesNames","join","domProps","target","composing","onInputDebounced","indexOf","_k","keyCode","availableFilters","typesMap","onClickFilter","hasResults","orderedResults","typesIndex","list","limitIfAny","result","index","_b","setFocusedIndex","reached","loading","loadMore","isValidQuery","triggered","isShortQuery","n","__webpack_nonce__","btoa","getRequestToken","logger","getLoggerBuilder","setApp","detectUser","build","Vue","methods","el","render","h","UnifiedSearch","___CSS_LOADER_EXPORT___","push","module","id","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","__webpack_modules__","call","m","amdD","Error","amdO","O","chunkIds","priority","notFulfilled","Infinity","i","fulfilled","j","Object","keys","every","splice","r","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","g","globalThis","Function","e","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","nmd","paths","children","b","document","baseURI","self","href","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","forEach","bind","nc","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file diff --git a/dist/files-main.js b/dist/files-main.js index c011fb8de08..e276382aa5c 100644 --- a/dist/files-main.js +++ b/dist/files-main.js @@ -1,3 +1,3 @@ /*! For license information please see files-main.js.LICENSE.txt */ -!function(){"use strict";var e,n={64382:function(e,n,i){var r=i(20144),a=i(25108);function o(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}var l=function(){function e(){var t,n;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),n=void 0,(t="_settings")in this?Object.defineProperty(this,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):this[t]=n,this._settings=[],a.debug("OCA.Files.Settings initialized")}var t,n;return t=e,(n=[{key:"register",value:function(e){return this._settings.filter((function(t){return t.name===e.name})).length>0?(a.error("A setting with the same name is already registered"),!1):(this._settings.push(e),!0)}},{key:"settings",get:function(){return this._settings}}])&&o(t.prototype,n),Object.defineProperty(t,"prototype",{writable:!1}),e}(),s={name:"Setting",props:{el:{type:Function,required:!0}},mounted:function(){this.$el.appendChild(this.el())}},c=i(51900),d={name:"Settings",components:{Setting:(0,c.Z)(s,(function(){return(0,this._self._c)("div")}),[],!1,null,null,null).exports},data:function(){return{settings:OCA.Files.Settings.settings}}},u=(0,c.Z)(d,(function(){var e=this,t=e._self._c;return t("div",{attrs:{id:"files-app-extra-settings"}},[e._l(e.settings,(function(e){return[t("Setting",{key:e.name,attrs:{el:e.el}})]}))],2)}),[],!1,null,"31c9bb4b",null).exports;function p(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function m(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var f=function(){function e(t,n){var i=n.el,r=n.open,a=n.close;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),m(this,"_close",void 0),m(this,"_el",void 0),m(this,"_name",void 0),m(this,"_open",void 0),this._name=t,this._el=i,this._open=r,this._close=a,"function"!=typeof this._open&&(this._open=function(){}),"function"!=typeof this._close&&(this._close=function(){})}var t,n;return t=e,(n=[{key:"name",get:function(){return this._name}},{key:"el",get:function(){return this._el}},{key:"open",get:function(){return this._open}},{key:"close",get:function(){return this._close}}])&&p(t.prototype,n),Object.defineProperty(t,"prototype",{writable:!1}),e}();r.ZP.prototype.t=t,window.OCA.Files||(window.OCA.Files={}),Object.assign(window.OCA.Files,{Settings:new l}),Object.assign(window.OCA.Files.Settings,{Setting:f}),window.addEventListener("DOMContentLoaded",(function(){if(!window.TESTING){new r.ZP({el:"#files-app-settings",render:function(e){return e(u)}});var e=document.getElementById("app-settings-header");e&&e.addEventListener("click",(function(e){var t=e.currentTarget.children[0].classList.contains("opened");OCA.Files.Settings.settings.forEach((function(e){return t?e.close():e.open()}))}))}}));var A=i(17499),v=i(16453),h=i(9944),g=i(79753),C=i(22200),b=function(){var e,t,n,i,r=(null===(e=OCA)||void 0===e||null===(t=e.Files)||void 0===t||null===(n=t.App)||void 0===n||null===(i=n.currentFileList)||void 0===i?void 0:i.dirInfo)||{path:"/",name:""};return"".concat(r.path,"/").concat(r.name).replace(/\/\//gi,"/")},w=i(4820),y=i(62520),_=i(64024),k=i(93455),x=i.n(k),P=i(70110),O=i.n(P);function E(e,t,n,i,r,a,o){try{var l=e[a](o),s=l.value}catch(e){return void n(e)}l.done?t(s):Promise.resolve(s).then(i,r)}function T(e){return function(){var t=this,n=arguments;return new Promise((function(i,r){var a=e.apply(t,n);function o(e){E(a,i,r,o,l,"next",e)}function l(e){E(a,i,r,o,l,"throw",e)}o(void 0)}))}}var F=function(){var e=T(regeneratorRuntime.mark((function e(){var t;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,w.default.get((0,g.generateOcsUrl)("apps/files/api/v1/templates"));case 2:return t=e.sent,e.abrupt("return",t.data.ocs.data);case 4:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),S=function(){var e=T(regeneratorRuntime.mark((function e(t,n,i){var r;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,w.default.post((0,g.generateOcsUrl)("apps/files/api/v1/templates/create"),{filePath:t,templatePath:n,templateType:i});case 2:return r=e.sent,e.abrupt("return",r.data.ocs.data);case 4:case"end":return e.stop()}}),e)})));return function(t,n,i){return e.apply(this,arguments)}}(),B=256,j={name:"TemplatePreview",inheritAttrs:!1,props:{basename:{type:String,required:!0},checked:{type:Boolean,default:!1},fileid:{type:[String,Number],required:!0},filename:{type:String,required:!0},previewUrl:{type:String,default:null},hasPreview:{type:Boolean,default:!0},mime:{type:String,required:!0},ratio:{type:Number,default:null}},data:function(){return{failedPreview:!1}},computed:{nameWithoutExt:function(){return this.basename.indexOf(".")>-1?this.basename.split(".").slice(0,-1).join("."):this.basename},id:function(){return"template-picker-".concat(this.fileid)},realPreviewUrl:function(){return this.failedPreview&&this.mimeIcon?this.mimeIcon:this.previewUrl?this.previewUrl:(0,C.getCurrentUser)()?(0,g.generateUrl)("/core/preview?fileId=".concat(this.fileid,"&x=").concat(B,"&y=").concat(B,"&a=1")):(0,g.generateUrl)("/apps/files_sharing/publicpreview/".concat(document.getElementById("sharingToken")&&document.getElementById("sharingToken").value,"?fileId=").concat(this.fileid,"&file=").concat(function(e){var t=(e.startsWith("/")?e:"/".concat(e)).split("/"),n="";return t.forEach((function(e){""!==e&&(n+="/"+encodeURIComponent(e))})),n}(this.filename),"&x=").concat(B,"&y=").concat(B,"&a=1"))},mimeIcon:function(){return OC.MimeType.getIconUrl(this.mime)}},methods:{onCheck:function(){this.$emit("check",this.fileid)},onFailure:function(){this.failedPreview=!0}}},I=j,M=i(93379),D=i.n(M),U=i(7795),Z=i.n(U),L=i(90569),R=i.n(L),N=i(3565),q=i.n(N),W=i(19216),G=i.n(W),z=i(44589),Y=i.n(z),Q=i(87027),$={};$.styleTagTransform=Y(),$.setAttributes=q(),$.insert=R().bind(null,"head"),$.domAPI=Z(),$.insertStyleElement=G(),D()(Q.Z,$),Q.Z&&Q.Z.locals&&Q.Z.locals;var H=(0,c.Z)(I,(function(){var e=this,t=e._self._c;return t("li",{staticClass:"template-picker__item"},[t("input",{staticClass:"radio",attrs:{id:e.id,type:"radio",name:"template-picker"},domProps:{checked:e.checked},on:{change:e.onCheck}}),e._v(" "),t("label",{staticClass:"template-picker__label",attrs:{for:e.id}},[t("div",{staticClass:"template-picker__preview",class:e.failedPreview?"template-picker__preview--failed":""},[t("img",{staticClass:"template-picker__image",attrs:{src:e.realPreviewUrl,alt:"",draggable:"false"},on:{error:e.onFailure}})]),e._v(" "),t("span",{staticClass:"template-picker__title"},[e._v("\n\t\t\t"+e._s(e.nameWithoutExt)+"\n\t\t")])])])}),[],!1,null,"440aea22",null).exports,K=i(25108);function J(e,t,n,i,r,a,o){try{var l=e[a](o),s=l.value}catch(e){return void n(e)}l.done?t(s):Promise.resolve(s).then(i,r)}function V(e){return function(){var t=this,n=arguments;return new Promise((function(i,r){var a=e.apply(t,n);function o(e){J(a,i,r,o,l,"next",e)}function l(e){J(a,i,r,o,l,"throw",e)}o(void 0)}))}}var X={name:"TemplatePicker",components:{NcEmptyContent:x(),NcModal:O(),TemplatePreview:H},props:{logger:{type:Object,required:!0}},data:function(){return{checked:-1,loading:!1,name:null,opened:!1,provider:null}},computed:{nameWithoutExt:function(){return this.name.indexOf(".")>-1?this.name.split(".").slice(0,-1).join("."):this.name},emptyTemplate:function(){var e,n;return{basename:t("files","Blank"),fileid:-1,filename:this.t("files","Blank"),hasPreview:!1,mime:(null===(e=this.provider)||void 0===e?void 0:e.mimetypes[0])||(null===(n=this.provider)||void 0===n?void 0:n.mimetypes)}},selectedTemplate:function(){var e=this;return this.provider.templates.find((function(t){return t.fileid===e.checked}))},style:function(){return{"--margin":"8px","--width":"160px","--border":"2px","--fullwidth":"180px","--height":this.provider.ratio?Math.round(160/this.provider.ratio)+"px":null}}},methods:{open:function(e,t){var n=this;return V(regeneratorRuntime.mark((function i(){var r,a;return regeneratorRuntime.wrap((function(i){for(;;)switch(i.prev=i.next){case 0:return n.checked=n.emptyTemplate.fileid,n.name=e,n.provider=t,i.next=5,F();case 5:if(r=i.sent,null!==(a=r.find((function(e){return e.app===t.app&&e.label===t.label})))){i.next=9;break}throw new Error("Failed to match provider in results");case 9:if(n.provider=a,0!==a.templates.length){i.next=13;break}return n.onSubmit(),i.abrupt("return");case 13:n.opened=!0;case 14:case"end":return i.stop()}}),i)})))()},close:function(){this.checked=this.emptyTemplate.fileid,this.loading=!1,this.name=null,this.opened=!1,this.provider=null},onCheck:function(e){this.checked=e},onSubmit:function(){var e=this;return V(regeneratorRuntime.mark((function t(){var n,i,r,a,o,l,s,c,d,u,p,m,f;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return e.loading=!0,a=b(),o=null===(n=OCA)||void 0===n||null===(i=n.Files)||void 0===i||null===(r=i.App)||void 0===r?void 0:r.currentFileList,e.nameWithoutExt===e.name&&(e.logger.debug("Fixed invalid filename",{name:e.name,extension:null===(l=e.provider)||void 0===l?void 0:l.extension}),e.name=e.name+(null===(s=e.provider)||void 0===s?void 0:s.extension)),t.prev=4,t.next=7,S((0,y.normalize)("".concat(a,"/").concat(e.name)),null===(c=e.selectedTemplate)||void 0===c?void 0:c.filename,null===(d=e.selectedTemplate)||void 0===d?void 0:d.templateType);case 7:return u=t.sent,e.logger.debug("Created new file",u),t.next=11,null==o?void 0:o.addAndFetchFileInfo(e.name).then((function(e,t){return t}));case 11:p=t.sent,m=new OCA.Files.FileInfoModel(p,{filesClient:null==o?void 0:o.filesClient}),(f=OCA.Files.fileActions.getDefaultFileAction(u.mime,"file",OC.PERMISSION_ALL))&&f.action(u.basename,{$file:null==o?void 0:o.findFileEl(e.name),dir:a,fileList:o,fileActions:null==o?void 0:o.fileActions,fileInfoModel:m}),e.close(),t.next=23;break;case 18:t.prev=18,t.t0=t.catch(4),e.logger.error("Error while creating the new file from template"),K.error(t.t0),(0,_.x2)(e.t("files","Unable to create new file from template"));case 23:return t.prev=23,e.loading=!1,t.finish(23);case 26:case"end":return t.stop()}}),t,null,[[4,18,23,26]])})))()}}},ee=X,te=i(74502),ne={};ne.styleTagTransform=Y(),ne.setAttributes=q(),ne.insert=R().bind(null,"head"),ne.domAPI=Z(),ne.insertStyleElement=G(),D()(te.Z,ne),te.Z&&te.Z.locals&&te.Z.locals;var ie=(0,c.Z)(ee,(function(){var e=this,t=e._self._c;return e.opened?t("NcModal",{staticClass:"templates-picker",attrs:{"clear-view-delay":-1,size:"normal"},on:{close:e.close}},[t("form",{staticClass:"templates-picker__form",style:e.style,on:{submit:function(t){return t.preventDefault(),t.stopPropagation(),e.onSubmit.apply(null,arguments)}}},[t("h2",[e._v(e._s(e.t("files","Pick a template for {name}",{name:e.nameWithoutExt})))]),e._v(" "),t("ul",{staticClass:"templates-picker__list"},[t("TemplatePreview",e._b({attrs:{checked:e.checked===e.emptyTemplate.fileid},on:{check:e.onCheck}},"TemplatePreview",e.emptyTemplate,!1)),e._v(" "),e._l(e.provider.templates,(function(n){return t("TemplatePreview",e._b({key:n.fileid,attrs:{checked:e.checked===n.fileid,ratio:e.provider.ratio},on:{check:e.onCheck}},"TemplatePreview",n,!1))}))],2),e._v(" "),t("div",{staticClass:"templates-picker__buttons"},[t("button",{on:{click:e.close}},[e._v("\n\t\t\t\t"+e._s(e.t("files","Cancel"))+"\n\t\t\t")]),e._v(" "),t("input",{staticClass:"primary",attrs:{type:"submit","aria-label":e.t("files","Create a new file with the selected template")},domProps:{value:e.t("files","Create")}})])]),e._v(" "),e.loading?t("NcEmptyContent",{staticClass:"templates-picker__loading",attrs:{icon:"icon-loading"}},[e._v("\n\t\t"+e._s(e.t("files","Creating file"))+"\n\t")]):e._e()],1):e._e()}),[],!1,null,"55dd9121",null),re=ie.exports;function ae(e,t,n,i,r,a,o){try{var l=e[a](o),s=l.value}catch(e){return void n(e)}l.done?t(s):Promise.resolve(s).then(i,r)}var oe=(0,A.IY)().setApp("files").detectUser().build();r.ZP.mixin({methods:{t:h.translate,n:h.translatePlural}});var le=document.createElement("div");le.id="template-picker",document.body.appendChild(le);var se=(0,v.loadState)("files","templates",[]),ce=(0,v.loadState)("files","templates_path",!1);oe.debug("Templates providers",se),oe.debug("Templates folder",{templatesPath:ce});var de=new(r.ZP.extend(re))({name:"TemplatePicker",propsData:{logger:oe}});de.$mount("#template-picker"),window.addEventListener("DOMContentLoaded",(function(){if(!ce){oe.debug("Templates folder not initialized");var e={attach:function(e){e.addMenuEntry({id:"template-init",displayName:(0,h.translate)("files","Set up templates folder"),templateName:(0,h.translate)("files","Templates"),iconClass:"icon-template-add",fileType:"file",actionHandler:function(t){pe(t),e.removeMenuEntry("template-init")}})}};OC.Plugins.register("OCA.Files.NewFileMenu",e)}})),se.forEach((function(e,t){var n={attach:function(n){var i=n.fileList;"files"!==i.id&&"files.public"!==i.id||n.addMenuEntry({id:"template-new-".concat(e.app,"-").concat(t),displayName:e.label,templateName:e.label+e.extension,iconClass:e.iconClass||"icon-file",fileType:"file",actionHandler:function(t){de.open(t,e)}})}};OC.Plugins.register("OCA.Files.NewFileMenu",n)}));var ue,pe=function(){var e,t=(e=regeneratorRuntime.mark((function e(t){var n,i;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=(b()+"/".concat(t)).replace("//","/"),e.prev=1,oe.debug("Initializing the templates directory",{templatePath:n}),e.next=5,w.default.post((0,g.generateOcsUrl)("apps/files/api/v1/templates/path"),{templatePath:n,copySystemTemplates:!0});case 5:i=e.sent,OCA.Files.App.currentFileList.changeDirectory(n,!0,!0),se=i.data.ocs.data.templates,ce=i.data.ocs.data.template_path,e.next=15;break;case 11:e.prev=11,e.t0=e.catch(1),oe.error("Unable to initialize the templates directory"),(0,_.x2)((0,h.translate)("files","Unable to initialize the templates directory"));case 15:case"end":return e.stop()}}),e,null,[[1,11]])})),function(){var t=this,n=arguments;return new Promise((function(i,r){var a=e.apply(t,n);function o(e){ae(a,i,r,o,l,"next",e)}function l(e){ae(a,i,r,o,l,"throw",e)}o(void 0)}))});return function(e){return t.apply(this,arguments)}}(),me=i(74854);ue={attach:function(e){var t=this;(0,me.Ld)("nextcloud:unified-search.search",(function(t){var n=t.query;e.setFilter(n)})),(0,me.Ld)("nextcloud:unified-search.reset",(function(){t.query=null,e.setFilter("")}))}},window.OC.Plugins.register("OCA.Files.FileList",ue)},87027:function(e,t,n){var i=n(87537),r=n.n(i),a=n(23645),o=n.n(a)()(r());o.push([e.id,".template-picker__item[data-v-440aea22]{display:flex}.template-picker__label[data-v-440aea22]{display:flex;align-items:center;flex:1 1;flex-direction:column}.template-picker__label[data-v-440aea22],.template-picker__label *[data-v-440aea22]{cursor:pointer;user-select:none}.template-picker__label[data-v-440aea22]::before{display:none !important}.template-picker__preview[data-v-440aea22]{display:block;overflow:hidden;flex:1 1;width:var(--width);min-height:var(--height);max-height:var(--height);padding:0;border:var(--border) solid var(--color-border);border-radius:var(--border-radius-large)}input:checked+label>.template-picker__preview[data-v-440aea22]{border-color:var(--color-primary)}.template-picker__preview--failed[data-v-440aea22]{display:flex}.template-picker__image[data-v-440aea22]{max-width:100%;background-color:var(--color-main-background);object-fit:cover}.template-picker__preview--failed .template-picker__image[data-v-440aea22]{width:calc(var(--margin)*8);margin:auto;background-color:rgba(0,0,0,0) !important;object-fit:initial}.template-picker__title[data-v-440aea22]{overflow:hidden;max-width:calc(var(--width) + 4px);padding:var(--margin);white-space:nowrap;text-overflow:ellipsis}","",{version:3,sources:["webpack://./apps/files/src/components/TemplatePreview.vue"],names:[],mappings:"AAGC,wCACC,YAAA,CAGD,yCACC,YAAA,CAEA,kBAAA,CACA,QAAA,CACA,qBAAA,CAEA,oFACC,cAAA,CACA,gBAAA,CAGD,iDACC,uBAAA,CAIF,2CACC,aAAA,CACA,eAAA,CAEA,QAAA,CACA,kBAAA,CACA,wBAAA,CACA,wBAAA,CACA,SAAA,CACA,8CAAA,CACA,wCAAA,CAEA,+DACC,iCAAA,CAGD,mDAEC,YAAA,CAIF,yCACC,cAAA,CACA,6CAAA,CAEA,gBAAA,CAID,2EACC,2BAAA,CAEA,WAAA,CACA,yCAAA,CAEA,kBAAA,CAGD,yCACC,eAAA,CAEA,kCAAA,CACA,qBAAA,CACA,kBAAA,CACA,sBAAA",sourcesContent:["\n\n.template-picker {\n\t&__item {\n\t\tdisplay: flex;\n\t}\n\n\t&__label {\n\t\tdisplay: flex;\n\t\t// Align in the middle of the grid\n\t\talign-items: center;\n\t\tflex: 1 1;\n\t\tflex-direction: column;\n\n\t\t&, * {\n\t\t\tcursor: pointer;\n\t\t\tuser-select: none;\n\t\t}\n\n\t\t&::before {\n\t\t\tdisplay: none !important;\n\t\t}\n\t}\n\n\t&__preview {\n\t\tdisplay: block;\n\t\toverflow: hidden;\n\t\t// Stretch so all entries are the same width\n\t\tflex: 1 1;\n\t\twidth: var(--width);\n\t\tmin-height: var(--height);\n\t\tmax-height: var(--height);\n\t\tpadding: 0;\n\t\tborder: var(--border) solid var(--color-border);\n\t\tborder-radius: var(--border-radius-large);\n\n\t\tinput:checked + label > & {\n\t\t\tborder-color: var(--color-primary);\n\t\t}\n\n\t\t&--failed {\n\t\t\t// Make sure to properly center fallback icon\n\t\t\tdisplay: flex;\n\t\t}\n\t}\n\n\t&__image {\n\t\tmax-width: 100%;\n\t\tbackground-color: var(--color-main-background);\n\n\t\tobject-fit: cover;\n\t}\n\n\t// Failed preview, fallback to mime icon\n\t&__preview--failed &__image {\n\t\twidth: calc(var(--margin) * 8);\n\t\t// Center mime icon\n\t\tmargin: auto;\n\t\tbackground-color: transparent !important;\n\n\t\tobject-fit: initial;\n\t}\n\n\t&__title {\n\t\toverflow: hidden;\n\t\t// also count preview border\n\t\tmax-width: calc(var(--width) + 2*2px);\n\t\tpadding: var(--margin);\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t}\n}\n\n"],sourceRoot:""}]),t.Z=o},74502:function(e,t,n){var i=n(87537),r=n.n(i),a=n(23645),o=n.n(a)()(r());o.push([e.id,".templates-picker__form[data-v-55dd9121]{padding:calc(var(--margin)*2);padding-bottom:0}.templates-picker__form h2[data-v-55dd9121]{text-align:center;font-weight:bold;margin:var(--margin) 0 calc(var(--margin)*2)}.templates-picker__list[data-v-55dd9121]{display:grid;grid-gap:calc(var(--margin)*2);grid-auto-columns:1fr;max-width:calc(var(--fullwidth)*6);grid-template-columns:repeat(auto-fit, var(--fullwidth));grid-auto-rows:1fr;justify-content:center}.templates-picker__buttons[data-v-55dd9121]{display:flex;justify-content:space-between;padding:calc(var(--margin)*2) var(--margin);position:sticky;bottom:0;background-image:linear-gradient(0, var(--gradient-main-background))}.templates-picker__buttons button[data-v-55dd9121],.templates-picker__buttons input[type=submit][data-v-55dd9121]{height:44px}.templates-picker[data-v-55dd9121] .modal-container{position:relative}.templates-picker__loading[data-v-55dd9121]{position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;margin:0;background-color:var(--color-main-background-translucent)}","",{version:3,sources:["webpack://./apps/files/src/views/TemplatePicker.vue"],names:[],mappings:"AAEC,yCACC,6BAAA,CAEA,gBAAA,CAEA,4CACC,iBAAA,CACA,gBAAA,CACA,4CAAA,CAIF,yCACC,YAAA,CACA,8BAAA,CACA,qBAAA,CAEA,kCAAA,CACA,wDAAA,CAEA,kBAAA,CAEA,sBAAA,CAGD,4CACC,YAAA,CACA,6BAAA,CACA,2CAAA,CACA,eAAA,CACA,QAAA,CACA,oEAAA,CAEA,kHACC,WAAA,CAKF,oDACC,iBAAA,CAGD,4CACC,iBAAA,CACA,KAAA,CACA,MAAA,CACA,sBAAA,CACA,UAAA,CACA,WAAA,CACA,QAAA,CACA,yDAAA",sourcesContent:["\n.templates-picker {\n\t&__form {\n\t\tpadding: calc(var(--margin) * 2);\n\t\t// Will be handled by the buttons\n\t\tpadding-bottom: 0;\n\n\t\th2 {\n\t\t\ttext-align: center;\n\t\t\tfont-weight: bold;\n\t\t\tmargin: var(--margin) 0 calc(var(--margin) * 2);\n\t\t}\n\t}\n\n\t&__list {\n\t\tdisplay: grid;\n\t\tgrid-gap: calc(var(--margin) * 2);\n\t\tgrid-auto-columns: 1fr;\n\t\t// We want maximum 5 columns. Putting 6 as we don't count the grid gap. So it will always be lower than 6\n\t\tmax-width: calc(var(--fullwidth) * 6);\n\t\tgrid-template-columns: repeat(auto-fit, var(--fullwidth));\n\t\t// Make sure all rows are the same height\n\t\tgrid-auto-rows: 1fr;\n\t\t// Center the columns set\n\t\tjustify-content: center;\n\t}\n\n\t&__buttons {\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\tpadding: calc(var(--margin) * 2) var(--margin);\n\t\tposition: sticky;\n\t\tbottom: 0;\n\t\tbackground-image: linear-gradient(0, var(--gradient-main-background));\n\n\t\tbutton, input[type='submit'] {\n\t\t\theight: 44px;\n\t\t}\n\t}\n\n\t// Make sure we're relative for the loading emptycontent on top\n\t::v-deep .modal-container {\n\t\tposition: relative;\n\t}\n\n\t&__loading {\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\tjustify-content: center;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tmargin: 0;\n\t\tbackground-color: var(--color-main-background-translucent);\n\t}\n}\n\n"],sourceRoot:""}]),t.Z=o}},i={};function r(e){var t=i[e];if(void 0!==t)return t.exports;var a=i[e]={id:e,loaded:!1,exports:{}};return n[e].call(a.exports,a,a.exports,r),a.loaded=!0,a.exports}r.m=n,r.amdD=function(){throw new Error("define cannot be used indirect")},r.amdO={},e=[],r.O=function(t,n,i,a){if(!n){var o=1/0;for(d=0;d<e.length;d++){n=e[d][0],i=e[d][1],a=e[d][2];for(var l=!0,s=0;s<n.length;s++)(!1&a||o>=a)&&Object.keys(r.O).every((function(e){return r.O[e](n[s])}))?n.splice(s--,1):(l=!1,a<o&&(o=a));if(l){e.splice(d--,1);var c=i();void 0!==c&&(t=c)}}return t}a=a||0;for(var d=e.length;d>0&&e[d-1][2]>a;d--)e[d]=e[d-1];e[d]=[n,i,a]},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,{a:t}),t},r.d=function(e,t){for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.nmd=function(e){return e.paths=[],e.children||(e.children=[]),e},r.j=2181,function(){r.b=document.baseURI||self.location.href;var e={2181:0};r.O.j=function(t){return 0===e[t]};var t=function(t,n){var i,a,o=n[0],l=n[1],s=n[2],c=0;if(o.some((function(t){return 0!==e[t]}))){for(i in l)r.o(l,i)&&(r.m[i]=l[i]);if(s)var d=s(r)}for(t&&t(n);c<o.length;c++)a=o[c],r.o(e,a)&&e[a]&&e[a][0](),e[a]=0;return r.O(d)},n=self.webpackChunknextcloud=self.webpackChunknextcloud||[];n.forEach(t.bind(null,0)),n.push=t.bind(null,n.push.bind(n))}(),r.nc=void 0;var a=r.O(void 0,[7874],(function(){return r(64382)}));a=r.O(a)}(); -//# sourceMappingURL=files-main.js.map?v=4d4a9dc824683cb45c7b
\ No newline at end of file +!function(){"use strict";var e,n={64382:function(e,n,i){var r=i(20144),a=i(25108);function o(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}var l=function(){function e(){var t,n;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),n=void 0,(t="_settings")in this?Object.defineProperty(this,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):this[t]=n,this._settings=[],a.debug("OCA.Files.Settings initialized")}var t,n;return t=e,(n=[{key:"register",value:function(e){return this._settings.filter((function(t){return t.name===e.name})).length>0?(a.error("A setting with the same name is already registered"),!1):(this._settings.push(e),!0)}},{key:"settings",get:function(){return this._settings}}])&&o(t.prototype,n),Object.defineProperty(t,"prototype",{writable:!1}),e}(),s={name:"Setting",props:{el:{type:Function,required:!0}},mounted:function(){this.$el.appendChild(this.el())}},c=i(51900),d={name:"Settings",components:{Setting:(0,c.Z)(s,(function(){return(0,this._self._c)("div")}),[],!1,null,null,null).exports},data:function(){return{settings:OCA.Files.Settings.settings}}},u=(0,c.Z)(d,(function(){var e=this,t=e._self._c;return t("div",{attrs:{id:"files-app-extra-settings"}},[e._l(e.settings,(function(e){return[t("Setting",{key:e.name,attrs:{el:e.el}})]}))],2)}),[],!1,null,"31c9bb4b",null).exports;function p(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function m(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var f=function(){function e(t,n){var i=n.el,r=n.open,a=n.close;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),m(this,"_close",void 0),m(this,"_el",void 0),m(this,"_name",void 0),m(this,"_open",void 0),this._name=t,this._el=i,this._open=r,this._close=a,"function"!=typeof this._open&&(this._open=function(){}),"function"!=typeof this._close&&(this._close=function(){})}var t,n;return t=e,(n=[{key:"name",get:function(){return this._name}},{key:"el",get:function(){return this._el}},{key:"open",get:function(){return this._open}},{key:"close",get:function(){return this._close}}])&&p(t.prototype,n),Object.defineProperty(t,"prototype",{writable:!1}),e}();r.ZP.prototype.t=t,window.OCA.Files||(window.OCA.Files={}),Object.assign(window.OCA.Files,{Settings:new l}),Object.assign(window.OCA.Files.Settings,{Setting:f}),window.addEventListener("DOMContentLoaded",(function(){if(!window.TESTING){new r.ZP({el:"#files-app-settings",render:function(e){return e(u)}});var e=document.getElementById("app-settings-header");e&&e.addEventListener("click",(function(e){var t,n,i,r,a=e.currentTarget.children[0].classList.contains("opened");OCA.Files.Settings.settings.forEach((function(e){return a?e.close():e.open()})),null===(t=e.currentTarget)||void 0===t||null===(n=t.children)||void 0===n||null===(i=n[0])||void 0===i||null===(r=i.setAttribute)||void 0===r||r.call(i,"aria-expanded",a?"false":"true")}))}}));var A=i(17499),v=i(16453),h=i(9944),g=i(79753),C=i(22200),b=function(){var e,t,n,i,r=(null===(e=OCA)||void 0===e||null===(t=e.Files)||void 0===t||null===(n=t.App)||void 0===n||null===(i=n.currentFileList)||void 0===i?void 0:i.dirInfo)||{path:"/",name:""};return"".concat(r.path,"/").concat(r.name).replace(/\/\//gi,"/")},w=i(4820),y=i(62520),_=i(64024),k=i(93455),x=i.n(k),P=i(70110),O=i.n(P);function E(e,t,n,i,r,a,o){try{var l=e[a](o),s=l.value}catch(e){return void n(e)}l.done?t(s):Promise.resolve(s).then(i,r)}function T(e){return function(){var t=this,n=arguments;return new Promise((function(i,r){var a=e.apply(t,n);function o(e){E(a,i,r,o,l,"next",e)}function l(e){E(a,i,r,o,l,"throw",e)}o(void 0)}))}}var F=function(){var e=T(regeneratorRuntime.mark((function e(){var t;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,w.default.get((0,g.generateOcsUrl)("apps/files/api/v1/templates"));case 2:return t=e.sent,e.abrupt("return",t.data.ocs.data);case 4:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),S=function(){var e=T(regeneratorRuntime.mark((function e(t,n,i){var r;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,w.default.post((0,g.generateOcsUrl)("apps/files/api/v1/templates/create"),{filePath:t,templatePath:n,templateType:i});case 2:return r=e.sent,e.abrupt("return",r.data.ocs.data);case 4:case"end":return e.stop()}}),e)})));return function(t,n,i){return e.apply(this,arguments)}}(),B=256,j={name:"TemplatePreview",inheritAttrs:!1,props:{basename:{type:String,required:!0},checked:{type:Boolean,default:!1},fileid:{type:[String,Number],required:!0},filename:{type:String,required:!0},previewUrl:{type:String,default:null},hasPreview:{type:Boolean,default:!0},mime:{type:String,required:!0},ratio:{type:Number,default:null}},data:function(){return{failedPreview:!1}},computed:{nameWithoutExt:function(){return this.basename.indexOf(".")>-1?this.basename.split(".").slice(0,-1).join("."):this.basename},id:function(){return"template-picker-".concat(this.fileid)},realPreviewUrl:function(){return this.failedPreview&&this.mimeIcon?this.mimeIcon:this.previewUrl?this.previewUrl:(0,C.getCurrentUser)()?(0,g.generateUrl)("/core/preview?fileId=".concat(this.fileid,"&x=").concat(B,"&y=").concat(B,"&a=1")):(0,g.generateUrl)("/apps/files_sharing/publicpreview/".concat(document.getElementById("sharingToken")&&document.getElementById("sharingToken").value,"?fileId=").concat(this.fileid,"&file=").concat(function(e){var t=(e.startsWith("/")?e:"/".concat(e)).split("/"),n="";return t.forEach((function(e){""!==e&&(n+="/"+encodeURIComponent(e))})),n}(this.filename),"&x=").concat(B,"&y=").concat(B,"&a=1"))},mimeIcon:function(){return OC.MimeType.getIconUrl(this.mime)}},methods:{onCheck:function(){this.$emit("check",this.fileid)},onFailure:function(){this.failedPreview=!0}}},I=j,M=i(93379),D=i.n(M),U=i(7795),Z=i.n(U),L=i(90569),R=i.n(L),N=i(3565),q=i.n(N),W=i(19216),G=i.n(W),z=i(44589),Y=i.n(z),Q=i(87027),$={};$.styleTagTransform=Y(),$.setAttributes=q(),$.insert=R().bind(null,"head"),$.domAPI=Z(),$.insertStyleElement=G(),D()(Q.Z,$),Q.Z&&Q.Z.locals&&Q.Z.locals;var H=(0,c.Z)(I,(function(){var e=this,t=e._self._c;return t("li",{staticClass:"template-picker__item"},[t("input",{staticClass:"radio",attrs:{id:e.id,type:"radio",name:"template-picker"},domProps:{checked:e.checked},on:{change:e.onCheck}}),e._v(" "),t("label",{staticClass:"template-picker__label",attrs:{for:e.id}},[t("div",{staticClass:"template-picker__preview",class:e.failedPreview?"template-picker__preview--failed":""},[t("img",{staticClass:"template-picker__image",attrs:{src:e.realPreviewUrl,alt:"",draggable:"false"},on:{error:e.onFailure}})]),e._v(" "),t("span",{staticClass:"template-picker__title"},[e._v("\n\t\t\t"+e._s(e.nameWithoutExt)+"\n\t\t")])])])}),[],!1,null,"440aea22",null).exports,K=i(25108);function J(e,t,n,i,r,a,o){try{var l=e[a](o),s=l.value}catch(e){return void n(e)}l.done?t(s):Promise.resolve(s).then(i,r)}function V(e){return function(){var t=this,n=arguments;return new Promise((function(i,r){var a=e.apply(t,n);function o(e){J(a,i,r,o,l,"next",e)}function l(e){J(a,i,r,o,l,"throw",e)}o(void 0)}))}}var X={name:"TemplatePicker",components:{NcEmptyContent:x(),NcModal:O(),TemplatePreview:H},props:{logger:{type:Object,required:!0}},data:function(){return{checked:-1,loading:!1,name:null,opened:!1,provider:null}},computed:{nameWithoutExt:function(){return this.name.indexOf(".")>-1?this.name.split(".").slice(0,-1).join("."):this.name},emptyTemplate:function(){var e,n;return{basename:t("files","Blank"),fileid:-1,filename:this.t("files","Blank"),hasPreview:!1,mime:(null===(e=this.provider)||void 0===e?void 0:e.mimetypes[0])||(null===(n=this.provider)||void 0===n?void 0:n.mimetypes)}},selectedTemplate:function(){var e=this;return this.provider.templates.find((function(t){return t.fileid===e.checked}))},style:function(){return{"--margin":"8px","--width":"160px","--border":"2px","--fullwidth":"180px","--height":this.provider.ratio?Math.round(160/this.provider.ratio)+"px":null}}},methods:{open:function(e,t){var n=this;return V(regeneratorRuntime.mark((function i(){var r,a;return regeneratorRuntime.wrap((function(i){for(;;)switch(i.prev=i.next){case 0:return n.checked=n.emptyTemplate.fileid,n.name=e,n.provider=t,i.next=5,F();case 5:if(r=i.sent,null!==(a=r.find((function(e){return e.app===t.app&&e.label===t.label})))){i.next=9;break}throw new Error("Failed to match provider in results");case 9:if(n.provider=a,0!==a.templates.length){i.next=13;break}return n.onSubmit(),i.abrupt("return");case 13:n.opened=!0;case 14:case"end":return i.stop()}}),i)})))()},close:function(){this.checked=this.emptyTemplate.fileid,this.loading=!1,this.name=null,this.opened=!1,this.provider=null},onCheck:function(e){this.checked=e},onSubmit:function(){var e=this;return V(regeneratorRuntime.mark((function t(){var n,i,r,a,o,l,s,c,d,u,p,m,f;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return e.loading=!0,a=b(),o=null===(n=OCA)||void 0===n||null===(i=n.Files)||void 0===i||null===(r=i.App)||void 0===r?void 0:r.currentFileList,e.nameWithoutExt===e.name&&(e.logger.debug("Fixed invalid filename",{name:e.name,extension:null===(l=e.provider)||void 0===l?void 0:l.extension}),e.name=e.name+(null===(s=e.provider)||void 0===s?void 0:s.extension)),t.prev=4,t.next=7,S((0,y.normalize)("".concat(a,"/").concat(e.name)),null===(c=e.selectedTemplate)||void 0===c?void 0:c.filename,null===(d=e.selectedTemplate)||void 0===d?void 0:d.templateType);case 7:return u=t.sent,e.logger.debug("Created new file",u),t.next=11,null==o?void 0:o.addAndFetchFileInfo(e.name).then((function(e,t){return t}));case 11:p=t.sent,m=new OCA.Files.FileInfoModel(p,{filesClient:null==o?void 0:o.filesClient}),(f=OCA.Files.fileActions.getDefaultFileAction(u.mime,"file",OC.PERMISSION_ALL))&&f.action(u.basename,{$file:null==o?void 0:o.findFileEl(e.name),dir:a,fileList:o,fileActions:null==o?void 0:o.fileActions,fileInfoModel:m}),e.close(),t.next=23;break;case 18:t.prev=18,t.t0=t.catch(4),e.logger.error("Error while creating the new file from template"),K.error(t.t0),(0,_.x2)(e.t("files","Unable to create new file from template"));case 23:return t.prev=23,e.loading=!1,t.finish(23);case 26:case"end":return t.stop()}}),t,null,[[4,18,23,26]])})))()}}},ee=X,te=i(74502),ne={};ne.styleTagTransform=Y(),ne.setAttributes=q(),ne.insert=R().bind(null,"head"),ne.domAPI=Z(),ne.insertStyleElement=G(),D()(te.Z,ne),te.Z&&te.Z.locals&&te.Z.locals;var ie=(0,c.Z)(ee,(function(){var e=this,t=e._self._c;return e.opened?t("NcModal",{staticClass:"templates-picker",attrs:{"clear-view-delay":-1,size:"normal"},on:{close:e.close}},[t("form",{staticClass:"templates-picker__form",style:e.style,on:{submit:function(t){return t.preventDefault(),t.stopPropagation(),e.onSubmit.apply(null,arguments)}}},[t("h2",[e._v(e._s(e.t("files","Pick a template for {name}",{name:e.nameWithoutExt})))]),e._v(" "),t("ul",{staticClass:"templates-picker__list"},[t("TemplatePreview",e._b({attrs:{checked:e.checked===e.emptyTemplate.fileid},on:{check:e.onCheck}},"TemplatePreview",e.emptyTemplate,!1)),e._v(" "),e._l(e.provider.templates,(function(n){return t("TemplatePreview",e._b({key:n.fileid,attrs:{checked:e.checked===n.fileid,ratio:e.provider.ratio},on:{check:e.onCheck}},"TemplatePreview",n,!1))}))],2),e._v(" "),t("div",{staticClass:"templates-picker__buttons"},[t("button",{on:{click:e.close}},[e._v("\n\t\t\t\t"+e._s(e.t("files","Cancel"))+"\n\t\t\t")]),e._v(" "),t("input",{staticClass:"primary",attrs:{type:"submit","aria-label":e.t("files","Create a new file with the selected template")},domProps:{value:e.t("files","Create")}})])]),e._v(" "),e.loading?t("NcEmptyContent",{staticClass:"templates-picker__loading",attrs:{icon:"icon-loading"}},[e._v("\n\t\t"+e._s(e.t("files","Creating file"))+"\n\t")]):e._e()],1):e._e()}),[],!1,null,"55dd9121",null),re=ie.exports;function ae(e,t,n,i,r,a,o){try{var l=e[a](o),s=l.value}catch(e){return void n(e)}l.done?t(s):Promise.resolve(s).then(i,r)}var oe=(0,A.IY)().setApp("files").detectUser().build();r.ZP.mixin({methods:{t:h.translate,n:h.translatePlural}});var le=document.createElement("div");le.id="template-picker",document.body.appendChild(le);var se=(0,v.loadState)("files","templates",[]),ce=(0,v.loadState)("files","templates_path",!1);oe.debug("Templates providers",se),oe.debug("Templates folder",{templatesPath:ce});var de=new(r.ZP.extend(re))({name:"TemplatePicker",propsData:{logger:oe}});de.$mount("#template-picker"),window.addEventListener("DOMContentLoaded",(function(){if(!ce){oe.debug("Templates folder not initialized");var e={attach:function(e){e.addMenuEntry({id:"template-init",displayName:(0,h.translate)("files","Set up templates folder"),templateName:(0,h.translate)("files","Templates"),iconClass:"icon-template-add",fileType:"file",actionHandler:function(t){pe(t),e.removeMenuEntry("template-init")}})}};OC.Plugins.register("OCA.Files.NewFileMenu",e)}})),se.forEach((function(e,t){var n={attach:function(n){var i=n.fileList;"files"!==i.id&&"files.public"!==i.id||n.addMenuEntry({id:"template-new-".concat(e.app,"-").concat(t),displayName:e.label,templateName:e.label+e.extension,iconClass:e.iconClass||"icon-file",fileType:"file",actionHandler:function(t){de.open(t,e)}})}};OC.Plugins.register("OCA.Files.NewFileMenu",n)}));var ue,pe=function(){var e,t=(e=regeneratorRuntime.mark((function e(t){var n,i;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=(b()+"/".concat(t)).replace("//","/"),e.prev=1,oe.debug("Initializing the templates directory",{templatePath:n}),e.next=5,w.default.post((0,g.generateOcsUrl)("apps/files/api/v1/templates/path"),{templatePath:n,copySystemTemplates:!0});case 5:i=e.sent,OCA.Files.App.currentFileList.changeDirectory(n,!0,!0),se=i.data.ocs.data.templates,ce=i.data.ocs.data.template_path,e.next=15;break;case 11:e.prev=11,e.t0=e.catch(1),oe.error("Unable to initialize the templates directory"),(0,_.x2)((0,h.translate)("files","Unable to initialize the templates directory"));case 15:case"end":return e.stop()}}),e,null,[[1,11]])})),function(){var t=this,n=arguments;return new Promise((function(i,r){var a=e.apply(t,n);function o(e){ae(a,i,r,o,l,"next",e)}function l(e){ae(a,i,r,o,l,"throw",e)}o(void 0)}))});return function(e){return t.apply(this,arguments)}}(),me=i(74854);ue={attach:function(e){var t=this;(0,me.Ld)("nextcloud:unified-search.search",(function(t){var n=t.query;e.setFilter(n)})),(0,me.Ld)("nextcloud:unified-search.reset",(function(){t.query=null,e.setFilter("")}))}},window.OC.Plugins.register("OCA.Files.FileList",ue)},87027:function(e,t,n){var i=n(87537),r=n.n(i),a=n(23645),o=n.n(a)()(r());o.push([e.id,".template-picker__item[data-v-440aea22]{display:flex}.template-picker__label[data-v-440aea22]{display:flex;align-items:center;flex:1 1;flex-direction:column}.template-picker__label[data-v-440aea22],.template-picker__label *[data-v-440aea22]{cursor:pointer;user-select:none}.template-picker__label[data-v-440aea22]::before{display:none !important}.template-picker__preview[data-v-440aea22]{display:block;overflow:hidden;flex:1 1;width:var(--width);min-height:var(--height);max-height:var(--height);padding:0;border:var(--border) solid var(--color-border);border-radius:var(--border-radius-large)}input:checked+label>.template-picker__preview[data-v-440aea22]{border-color:var(--color-primary)}.template-picker__preview--failed[data-v-440aea22]{display:flex}.template-picker__image[data-v-440aea22]{max-width:100%;background-color:var(--color-main-background);object-fit:cover}.template-picker__preview--failed .template-picker__image[data-v-440aea22]{width:calc(var(--margin)*8);margin:auto;background-color:rgba(0,0,0,0) !important;object-fit:initial}.template-picker__title[data-v-440aea22]{overflow:hidden;max-width:calc(var(--width) + 4px);padding:var(--margin);white-space:nowrap;text-overflow:ellipsis}","",{version:3,sources:["webpack://./apps/files/src/components/TemplatePreview.vue"],names:[],mappings:"AAGC,wCACC,YAAA,CAGD,yCACC,YAAA,CAEA,kBAAA,CACA,QAAA,CACA,qBAAA,CAEA,oFACC,cAAA,CACA,gBAAA,CAGD,iDACC,uBAAA,CAIF,2CACC,aAAA,CACA,eAAA,CAEA,QAAA,CACA,kBAAA,CACA,wBAAA,CACA,wBAAA,CACA,SAAA,CACA,8CAAA,CACA,wCAAA,CAEA,+DACC,iCAAA,CAGD,mDAEC,YAAA,CAIF,yCACC,cAAA,CACA,6CAAA,CAEA,gBAAA,CAID,2EACC,2BAAA,CAEA,WAAA,CACA,yCAAA,CAEA,kBAAA,CAGD,yCACC,eAAA,CAEA,kCAAA,CACA,qBAAA,CACA,kBAAA,CACA,sBAAA",sourcesContent:["\n\n.template-picker {\n\t&__item {\n\t\tdisplay: flex;\n\t}\n\n\t&__label {\n\t\tdisplay: flex;\n\t\t// Align in the middle of the grid\n\t\talign-items: center;\n\t\tflex: 1 1;\n\t\tflex-direction: column;\n\n\t\t&, * {\n\t\t\tcursor: pointer;\n\t\t\tuser-select: none;\n\t\t}\n\n\t\t&::before {\n\t\t\tdisplay: none !important;\n\t\t}\n\t}\n\n\t&__preview {\n\t\tdisplay: block;\n\t\toverflow: hidden;\n\t\t// Stretch so all entries are the same width\n\t\tflex: 1 1;\n\t\twidth: var(--width);\n\t\tmin-height: var(--height);\n\t\tmax-height: var(--height);\n\t\tpadding: 0;\n\t\tborder: var(--border) solid var(--color-border);\n\t\tborder-radius: var(--border-radius-large);\n\n\t\tinput:checked + label > & {\n\t\t\tborder-color: var(--color-primary);\n\t\t}\n\n\t\t&--failed {\n\t\t\t// Make sure to properly center fallback icon\n\t\t\tdisplay: flex;\n\t\t}\n\t}\n\n\t&__image {\n\t\tmax-width: 100%;\n\t\tbackground-color: var(--color-main-background);\n\n\t\tobject-fit: cover;\n\t}\n\n\t// Failed preview, fallback to mime icon\n\t&__preview--failed &__image {\n\t\twidth: calc(var(--margin) * 8);\n\t\t// Center mime icon\n\t\tmargin: auto;\n\t\tbackground-color: transparent !important;\n\n\t\tobject-fit: initial;\n\t}\n\n\t&__title {\n\t\toverflow: hidden;\n\t\t// also count preview border\n\t\tmax-width: calc(var(--width) + 2*2px);\n\t\tpadding: var(--margin);\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t}\n}\n\n"],sourceRoot:""}]),t.Z=o},74502:function(e,t,n){var i=n(87537),r=n.n(i),a=n(23645),o=n.n(a)()(r());o.push([e.id,".templates-picker__form[data-v-55dd9121]{padding:calc(var(--margin)*2);padding-bottom:0}.templates-picker__form h2[data-v-55dd9121]{text-align:center;font-weight:bold;margin:var(--margin) 0 calc(var(--margin)*2)}.templates-picker__list[data-v-55dd9121]{display:grid;grid-gap:calc(var(--margin)*2);grid-auto-columns:1fr;max-width:calc(var(--fullwidth)*6);grid-template-columns:repeat(auto-fit, var(--fullwidth));grid-auto-rows:1fr;justify-content:center}.templates-picker__buttons[data-v-55dd9121]{display:flex;justify-content:space-between;padding:calc(var(--margin)*2) var(--margin);position:sticky;bottom:0;background-image:linear-gradient(0, var(--gradient-main-background))}.templates-picker__buttons button[data-v-55dd9121],.templates-picker__buttons input[type=submit][data-v-55dd9121]{height:44px}.templates-picker[data-v-55dd9121] .modal-container{position:relative}.templates-picker__loading[data-v-55dd9121]{position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;margin:0;background-color:var(--color-main-background-translucent)}","",{version:3,sources:["webpack://./apps/files/src/views/TemplatePicker.vue"],names:[],mappings:"AAEC,yCACC,6BAAA,CAEA,gBAAA,CAEA,4CACC,iBAAA,CACA,gBAAA,CACA,4CAAA,CAIF,yCACC,YAAA,CACA,8BAAA,CACA,qBAAA,CAEA,kCAAA,CACA,wDAAA,CAEA,kBAAA,CAEA,sBAAA,CAGD,4CACC,YAAA,CACA,6BAAA,CACA,2CAAA,CACA,eAAA,CACA,QAAA,CACA,oEAAA,CAEA,kHACC,WAAA,CAKF,oDACC,iBAAA,CAGD,4CACC,iBAAA,CACA,KAAA,CACA,MAAA,CACA,sBAAA,CACA,UAAA,CACA,WAAA,CACA,QAAA,CACA,yDAAA",sourcesContent:["\n.templates-picker {\n\t&__form {\n\t\tpadding: calc(var(--margin) * 2);\n\t\t// Will be handled by the buttons\n\t\tpadding-bottom: 0;\n\n\t\th2 {\n\t\t\ttext-align: center;\n\t\t\tfont-weight: bold;\n\t\t\tmargin: var(--margin) 0 calc(var(--margin) * 2);\n\t\t}\n\t}\n\n\t&__list {\n\t\tdisplay: grid;\n\t\tgrid-gap: calc(var(--margin) * 2);\n\t\tgrid-auto-columns: 1fr;\n\t\t// We want maximum 5 columns. Putting 6 as we don't count the grid gap. So it will always be lower than 6\n\t\tmax-width: calc(var(--fullwidth) * 6);\n\t\tgrid-template-columns: repeat(auto-fit, var(--fullwidth));\n\t\t// Make sure all rows are the same height\n\t\tgrid-auto-rows: 1fr;\n\t\t// Center the columns set\n\t\tjustify-content: center;\n\t}\n\n\t&__buttons {\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\tpadding: calc(var(--margin) * 2) var(--margin);\n\t\tposition: sticky;\n\t\tbottom: 0;\n\t\tbackground-image: linear-gradient(0, var(--gradient-main-background));\n\n\t\tbutton, input[type='submit'] {\n\t\t\theight: 44px;\n\t\t}\n\t}\n\n\t// Make sure we're relative for the loading emptycontent on top\n\t::v-deep .modal-container {\n\t\tposition: relative;\n\t}\n\n\t&__loading {\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\tjustify-content: center;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tmargin: 0;\n\t\tbackground-color: var(--color-main-background-translucent);\n\t}\n}\n\n"],sourceRoot:""}]),t.Z=o}},i={};function r(e){var t=i[e];if(void 0!==t)return t.exports;var a=i[e]={id:e,loaded:!1,exports:{}};return n[e].call(a.exports,a,a.exports,r),a.loaded=!0,a.exports}r.m=n,r.amdD=function(){throw new Error("define cannot be used indirect")},r.amdO={},e=[],r.O=function(t,n,i,a){if(!n){var o=1/0;for(d=0;d<e.length;d++){n=e[d][0],i=e[d][1],a=e[d][2];for(var l=!0,s=0;s<n.length;s++)(!1&a||o>=a)&&Object.keys(r.O).every((function(e){return r.O[e](n[s])}))?n.splice(s--,1):(l=!1,a<o&&(o=a));if(l){e.splice(d--,1);var c=i();void 0!==c&&(t=c)}}return t}a=a||0;for(var d=e.length;d>0&&e[d-1][2]>a;d--)e[d]=e[d-1];e[d]=[n,i,a]},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,{a:t}),t},r.d=function(e,t){for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.nmd=function(e){return e.paths=[],e.children||(e.children=[]),e},r.j=2181,function(){r.b=document.baseURI||self.location.href;var e={2181:0};r.O.j=function(t){return 0===e[t]};var t=function(t,n){var i,a,o=n[0],l=n[1],s=n[2],c=0;if(o.some((function(t){return 0!==e[t]}))){for(i in l)r.o(l,i)&&(r.m[i]=l[i]);if(s)var d=s(r)}for(t&&t(n);c<o.length;c++)a=o[c],r.o(e,a)&&e[a]&&e[a][0](),e[a]=0;return r.O(d)},n=self.webpackChunknextcloud=self.webpackChunknextcloud||[];n.forEach(t.bind(null,0)),n.push=t.bind(null,n.push.bind(n))}(),r.nc=void 0;var a=r.O(void 0,[7874],(function(){return r(64382)}));a=r.O(a)}(); +//# sourceMappingURL=files-main.js.map?v=e3325bdf81b97cc91077
\ No newline at end of file diff --git a/dist/files-main.js.map b/dist/files-main.js.map index 1637390b142..a1607847fe9 100644 --- a/dist/files-main.js.map +++ b/dist/files-main.js.map @@ -1 +1 @@ -{"version":3,"file":"files-main.js?v=4d4a9dc824683cb45c7b","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/apps/files/src/services/Settings.js","webpack:///nextcloud/apps/files/src/components/Setting.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/files/src/components/Setting.vue","webpack:///nextcloud/apps/files/src/views/Settings.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/files/src/views/Settings.vue","webpack://nextcloud/./apps/files/src/components/Setting.vue?98ea","webpack://nextcloud/./apps/files/src/components/Setting.vue?8d57","webpack://nextcloud/./apps/files/src/views/Settings.vue?b81b","webpack://nextcloud/./apps/files/src/views/Settings.vue?84f7","webpack:///nextcloud/apps/files/src/models/Setting.js","webpack:///nextcloud/apps/files/src/files-app-settings.js","webpack:///nextcloud/apps/files/src/utils/davUtils.js","webpack:///nextcloud/apps/files/src/services/Templates.js","webpack:///nextcloud/apps/files/src/components/TemplatePreview.vue","webpack:///nextcloud/apps/files/src/utils/fileUtils.js","webpack:///nextcloud/apps/files/src/components/TemplatePreview.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/files/src/components/TemplatePreview.vue?c067","webpack://nextcloud/./apps/files/src/components/TemplatePreview.vue?81db","webpack://nextcloud/./apps/files/src/components/TemplatePreview.vue?c414","webpack:///nextcloud/apps/files/src/views/TemplatePicker.vue","webpack:///nextcloud/apps/files/src/views/TemplatePicker.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/files/src/views/TemplatePicker.vue?023e","webpack://nextcloud/./apps/files/src/views/TemplatePicker.vue?afd8","webpack://nextcloud/./apps/files/src/views/TemplatePicker.vue?1f7b","webpack:///nextcloud/apps/files/src/templates.js","webpack:///nextcloud/apps/files/src/legacy/filelistSearch.js","webpack:///nextcloud/apps/files/src/components/TemplatePreview.vue?vue&type=style&index=0&id=440aea22&prod&lang=scss&scoped=true&","webpack:///nextcloud/apps/files/src/views/TemplatePicker.vue?vue&type=style&index=0&id=55dd9121&prod&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/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","/**\n * @copyright Copyright (c) 2019 Gary Kim <gary@garykim.dev>\n *\n * @author Gary Kim <gary@garykim.dev>\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 class Settings {\n\n\t_settings\n\n\tconstructor() {\n\t\tthis._settings = []\n\t\tconsole.debug('OCA.Files.Settings initialized')\n\t}\n\n\t/**\n\t * Register a new setting\n\t *\n\t * @since 19.0.0\n\t * @param {OCA.Files.Settings.Setting} view element to add to settings\n\t * @return {boolean} whether registering was successful\n\t */\n\tregister(view) {\n\t\tif (this._settings.filter(e => e.name === view.name).length > 0) {\n\t\t\tconsole.error('A setting with the same name is already registered')\n\t\t\treturn false\n\t\t}\n\t\tthis._settings.push(view)\n\t\treturn true\n\t}\n\n\t/**\n\t * All settings elements\n\t *\n\t * @return {OCA.Files.Settings.Setting[]} All currently registered settings\n\t */\n\tget settings() {\n\t\treturn this._settings\n\t}\n\n}\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Setting.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!./Setting.vue?vue&type=script&lang=js&\"","<!--\n - @copyright Copyright (c) 2020 Gary Kim <gary@garykim.dev>\n -\n - @author Gary Kim <gary@garykim.dev>\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 />\n</template>\n<script>\nexport default {\n\tname: 'Setting',\n\tprops: {\n\t\tel: {\n\t\t\ttype: Function,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.$el.appendChild(this.el())\n\t},\n}\n</script>\n<style>\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Settings.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!./Settings.vue?vue&type=script&lang=js&\"","<!--\n - @copyright Copyright (c) 2019 Gary Kim <gary@garykim.dev>\n -\n - @author Gary Kim <gary@garykim.dev>\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=\"files-app-extra-settings\">\n\t\t<template v-for=\"setting in settings\">\n\t\t\t<Setting :key=\"setting.name\" :el=\"setting.el\" />\n\t\t</template>\n\t</div>\n</template>\n\n<script>\nimport Setting from '../components/Setting'\n\nexport default {\n\tname: 'Settings',\n\tcomponents: {\n\t\tSetting,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tsettings: OCA.Files.Settings.settings,\n\t\t}\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n\n</style>\n","import { render, staticRenderFns } from \"./Setting.vue?vue&type=template&id=47cd8aa6&\"\nimport script from \"./Setting.vue?vue&type=script&lang=js&\"\nexport * from \"./Setting.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div')\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./Settings.vue?vue&type=template&id=31c9bb4b&scoped=true&\"\nimport script from \"./Settings.vue?vue&type=script&lang=js&\"\nexport * from \"./Settings.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 \"31c9bb4b\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{attrs:{\"id\":\"files-app-extra-settings\"}},[_vm._l((_vm.settings),function(setting){return [_c('Setting',{key:setting.name,attrs:{\"el\":setting.el}})]})],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2019 Gary Kim <gary@garykim.dev>\n * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author Gary Kim <gary@garykim.dev>\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 class Setting {\n\n\t_close\n\t_el\n\t_name\n\t_open\n\n\t/**\n\t * Create a new files app setting\n\t *\n\t * @since 19.0.0\n\t * @param {string} name the name of this setting\n\t * @param {object} component the component\n\t * @param {Function} component.el function that returns an unmounted dom element to be added\n\t * @param {Function} [component.open] callback for when setting is added\n\t * @param {Function} [component.close] callback for when setting is closed\n\t */\n\tconstructor(name, { el, open, close }) {\n\t\tthis._name = name\n\t\tthis._el = el\n\t\tthis._open = open\n\t\tthis._close = close\n\n\t\tif (typeof this._open !== 'function') {\n\t\t\tthis._open = () => {}\n\t\t}\n\n\t\tif (typeof this._close !== 'function') {\n\t\t\tthis._close = () => {}\n\t\t}\n\t}\n\n\tget name() {\n\t\treturn this._name\n\t}\n\n\tget el() {\n\t\treturn this._el\n\t}\n\n\tget open() {\n\t\treturn this._open\n\t}\n\n\tget close() {\n\t\treturn this._close\n\t}\n\n}\n","/**\n * @copyright Copyright (c) 2019 Gary Kim <gary@garykim.dev>\n * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author Gary Kim <gary@garykim.dev>\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 Vue from 'vue'\nimport Settings from './services/Settings'\nimport SettingsView from './views/Settings'\nimport Setting from './models/Setting'\n\nVue.prototype.t = t\n\n// Init Files App Settings Service\nif (!window.OCA.Files) {\n\twindow.OCA.Files = {}\n}\nObject.assign(window.OCA.Files, { Settings: new Settings() })\nObject.assign(window.OCA.Files.Settings, { Setting })\n\nwindow.addEventListener('DOMContentLoaded', function() {\n\tif (window.TESTING) {\n\t\treturn\n\t}\n\t// Init Vue app\n\t// eslint-disable-next-line\n\tnew Vue({\n\t\tel: '#files-app-settings',\n\t\trender: h => h(SettingsView),\n\t})\n\n\tconst appSettingsHeader = document.getElementById('app-settings-header')\n\tif (appSettingsHeader) {\n\t\tappSettingsHeader.addEventListener('click', e => {\n\t\t\tconst opened = e.currentTarget.children[0].classList.contains('opened')\n\t\t\tOCA.Files.Settings.settings.forEach(e => opened ? e.close() : e.open())\n\t\t})\n\t}\n})\n","/**\n * @copyright Copyright (c) 2019 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 { generateRemoteUrl } from '@nextcloud/router'\nimport { getCurrentUser } from '@nextcloud/auth'\n\nexport const getRootPath = function() {\n\tif (getCurrentUser()) {\n\t\treturn generateRemoteUrl(`dav/files/${getCurrentUser().uid}`)\n\t} else {\n\t\treturn generateRemoteUrl('webdav').replace('/remote.php', '/public.php')\n\t}\n}\n\nexport const isPublic = function() {\n\treturn !getCurrentUser()\n}\n\nexport const getToken = function() {\n\treturn document.getElementById('sharingToken') && document.getElementById('sharingToken').value\n}\n\n/**\n * Return the current directory, fallback to root\n *\n * @return {string}\n */\nexport const getCurrentDirectory = function() {\n\tconst currentDirInfo = OCA?.Files?.App?.currentFileList?.dirInfo\n\t\t|| { path: '/', name: '' }\n\n\t// Make sure we don't have double slashes\n\treturn `${currentDirInfo.path}/${currentDirInfo.name}`.replace(/\\/\\//gi, '/')\n}\n","/**\n * @copyright Copyright (c) 2021 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 { generateOcsUrl } from '@nextcloud/router'\nimport axios from '@nextcloud/axios'\n\nexport const getTemplates = async function() {\n\tconst response = await axios.get(generateOcsUrl('apps/files/api/v1/templates'))\n\treturn response.data.ocs.data\n}\n\n/**\n * Create a new file from a specified template\n *\n * @param {string} filePath The new file destination path\n * @param {string} templatePath The template source path\n * @param {string} templateType The template type e.g 'user'\n */\nexport const createFromTemplate = async function(filePath, templatePath, templateType) {\n\tconst response = await axios.post(generateOcsUrl('apps/files/api/v1/templates/create'), {\n\t\tfilePath,\n\t\ttemplatePath,\n\t\ttemplateType,\n\t})\n\treturn response.data.ocs.data\n}\n","<!--\n - @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<li class=\"template-picker__item\">\n\t\t<input :id=\"id\"\n\t\t\t:checked=\"checked\"\n\t\t\ttype=\"radio\"\n\t\t\tclass=\"radio\"\n\t\t\tname=\"template-picker\"\n\t\t\t@change=\"onCheck\">\n\n\t\t<label :for=\"id\" class=\"template-picker__label\">\n\t\t\t<div class=\"template-picker__preview\"\n\t\t\t\t:class=\"failedPreview ? 'template-picker__preview--failed' : ''\">\n\t\t\t\t<img class=\"template-picker__image\"\n\t\t\t\t\t:src=\"realPreviewUrl\"\n\t\t\t\t\talt=\"\"\n\t\t\t\t\tdraggable=\"false\"\n\t\t\t\t\t@error=\"onFailure\">\n\t\t\t</div>\n\n\t\t\t<span class=\"template-picker__title\">\n\t\t\t\t{{ nameWithoutExt }}\n\t\t\t</span>\n\t\t</label>\n\t</li>\n</template>\n\n<script>\nimport { generateUrl } from '@nextcloud/router'\nimport { encodeFilePath } from '../utils/fileUtils'\nimport { getToken, isPublic } from '../utils/davUtils'\n\n// preview width generation\nconst previewWidth = 256\n\nexport default {\n\tname: 'TemplatePreview',\n\tinheritAttrs: false,\n\n\tprops: {\n\t\tbasename: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tchecked: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tfileid: {\n\t\t\ttype: [String, Number],\n\t\t\trequired: true,\n\t\t},\n\t\tfilename: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tpreviewUrl: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\t\thasPreview: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t\tmime: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tratio: {\n\t\t\ttype: Number,\n\t\t\tdefault: null,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tfailedPreview: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * Strip away extension from name\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tnameWithoutExt() {\n\t\t\treturn this.basename.indexOf('.') > -1 ? this.basename.split('.').slice(0, -1).join('.') : this.basename\n\t\t},\n\n\t\tid() {\n\t\t\treturn `template-picker-${this.fileid}`\n\t\t},\n\n\t\trealPreviewUrl() {\n\t\t\t// If original preview failed, fallback to mime icon\n\t\t\tif (this.failedPreview && this.mimeIcon) {\n\t\t\t\treturn this.mimeIcon\n\t\t\t}\n\n\t\t\tif (this.previewUrl) {\n\t\t\t\treturn this.previewUrl\n\t\t\t}\n\t\t\t// TODO: find a nicer standard way of doing this?\n\t\t\tif (isPublic()) {\n\t\t\t\treturn generateUrl(`/apps/files_sharing/publicpreview/${getToken()}?fileId=${this.fileid}&file=${encodeFilePath(this.filename)}&x=${previewWidth}&y=${previewWidth}&a=1`)\n\t\t\t}\n\t\t\treturn generateUrl(`/core/preview?fileId=${this.fileid}&x=${previewWidth}&y=${previewWidth}&a=1`)\n\t\t},\n\n\t\tmimeIcon() {\n\t\t\treturn OC.MimeType.getIconUrl(this.mime)\n\t\t},\n\t},\n\n\tmethods: {\n\t\tonCheck() {\n\t\t\tthis.$emit('check', this.fileid)\n\t\t},\n\t\tonFailure() {\n\t\t\tthis.failedPreview = true\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n\n.template-picker {\n\t&__item {\n\t\tdisplay: flex;\n\t}\n\n\t&__label {\n\t\tdisplay: flex;\n\t\t// Align in the middle of the grid\n\t\talign-items: center;\n\t\tflex: 1 1;\n\t\tflex-direction: column;\n\n\t\t&, * {\n\t\t\tcursor: pointer;\n\t\t\tuser-select: none;\n\t\t}\n\n\t\t&::before {\n\t\t\tdisplay: none !important;\n\t\t}\n\t}\n\n\t&__preview {\n\t\tdisplay: block;\n\t\toverflow: hidden;\n\t\t// Stretch so all entries are the same width\n\t\tflex: 1 1;\n\t\twidth: var(--width);\n\t\tmin-height: var(--height);\n\t\tmax-height: var(--height);\n\t\tpadding: 0;\n\t\tborder: var(--border) solid var(--color-border);\n\t\tborder-radius: var(--border-radius-large);\n\n\t\tinput:checked + label > & {\n\t\t\tborder-color: var(--color-primary);\n\t\t}\n\n\t\t&--failed {\n\t\t\t// Make sure to properly center fallback icon\n\t\t\tdisplay: flex;\n\t\t}\n\t}\n\n\t&__image {\n\t\tmax-width: 100%;\n\t\tbackground-color: var(--color-main-background);\n\n\t\tobject-fit: cover;\n\t}\n\n\t// Failed preview, fallback to mime icon\n\t&__preview--failed &__image {\n\t\twidth: calc(var(--margin) * 8);\n\t\t// Center mime icon\n\t\tmargin: auto;\n\t\tbackground-color: transparent !important;\n\n\t\tobject-fit: initial;\n\t}\n\n\t&__title {\n\t\toverflow: hidden;\n\t\t// also count preview border\n\t\tmax-width: calc(var(--width) + 2*2px);\n\t\tpadding: var(--margin);\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t}\n}\n\n</style>\n","/**\n * @copyright Copyright (c) 2021 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nconst encodeFilePath = function(path) {\n\tconst pathSections = (path.startsWith('/') ? path : `/${path}`).split('/')\n\tlet relativePath = ''\n\tpathSections.forEach((section) => {\n\t\tif (section !== '') {\n\t\t\trelativePath += '/' + encodeURIComponent(section)\n\t\t}\n\t})\n\treturn relativePath\n}\n\n/**\n * Extract dir and name from file path\n *\n * @param {string} path the full path\n * @return {string[]} [dirPath, fileName]\n */\nconst extractFilePaths = function(path) {\n\tconst pathSections = path.split('/')\n\tconst fileName = pathSections[pathSections.length - 1]\n\tconst dirPath = pathSections.slice(0, pathSections.length - 1).join('/')\n\treturn [dirPath, fileName]\n}\n\nexport { encodeFilePath, extractFilePaths }\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TemplatePreview.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!./TemplatePreview.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!./TemplatePreview.vue?vue&type=style&index=0&id=440aea22&prod&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!./TemplatePreview.vue?vue&type=style&index=0&id=440aea22&prod&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./TemplatePreview.vue?vue&type=template&id=440aea22&scoped=true&\"\nimport script from \"./TemplatePreview.vue?vue&type=script&lang=js&\"\nexport * from \"./TemplatePreview.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TemplatePreview.vue?vue&type=style&index=0&id=440aea22&prod&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 \"440aea22\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('li',{staticClass:\"template-picker__item\"},[_c('input',{staticClass:\"radio\",attrs:{\"id\":_vm.id,\"type\":\"radio\",\"name\":\"template-picker\"},domProps:{\"checked\":_vm.checked},on:{\"change\":_vm.onCheck}}),_vm._v(\" \"),_c('label',{staticClass:\"template-picker__label\",attrs:{\"for\":_vm.id}},[_c('div',{staticClass:\"template-picker__preview\",class:_vm.failedPreview ? 'template-picker__preview--failed' : ''},[_c('img',{staticClass:\"template-picker__image\",attrs:{\"src\":_vm.realPreviewUrl,\"alt\":\"\",\"draggable\":\"false\"},on:{\"error\":_vm.onFailure}})]),_vm._v(\" \"),_c('span',{staticClass:\"template-picker__title\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.nameWithoutExt)+\"\\n\\t\\t\")])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<NcModal v-if=\"opened\"\n\t\t:clear-view-delay=\"-1\"\n\t\tclass=\"templates-picker\"\n\t\tsize=\"normal\"\n\t\t@close=\"close\">\n\t\t<form class=\"templates-picker__form\"\n\t\t\t:style=\"style\"\n\t\t\t@submit.prevent.stop=\"onSubmit\">\n\t\t\t<h2>{{ t('files', 'Pick a template for {name}', { name: nameWithoutExt }) }}</h2>\n\n\t\t\t<!-- Templates list -->\n\t\t\t<ul class=\"templates-picker__list\">\n\t\t\t\t<TemplatePreview v-bind=\"emptyTemplate\"\n\t\t\t\t\t:checked=\"checked === emptyTemplate.fileid\"\n\t\t\t\t\t@check=\"onCheck\" />\n\n\t\t\t\t<TemplatePreview v-for=\"template in provider.templates\"\n\t\t\t\t\t:key=\"template.fileid\"\n\t\t\t\t\tv-bind=\"template\"\n\t\t\t\t\t:checked=\"checked === template.fileid\"\n\t\t\t\t\t:ratio=\"provider.ratio\"\n\t\t\t\t\t@check=\"onCheck\" />\n\t\t\t</ul>\n\n\t\t\t<!-- Cancel and submit -->\n\t\t\t<div class=\"templates-picker__buttons\">\n\t\t\t\t<button @click=\"close\">\n\t\t\t\t\t{{ t('files', 'Cancel') }}\n\t\t\t\t</button>\n\t\t\t\t<input type=\"submit\"\n\t\t\t\t\tclass=\"primary\"\n\t\t\t\t\t:value=\"t('files', 'Create')\"\n\t\t\t\t\t:aria-label=\"t('files', 'Create a new file with the selected template')\">\n\t\t\t</div>\n\t\t</form>\n\n\t\t<NcEmptyContent v-if=\"loading\" class=\"templates-picker__loading\" icon=\"icon-loading\">\n\t\t\t{{ t('files', 'Creating file') }}\n\t\t</NcEmptyContent>\n\t</NcModal>\n</template>\n\n<script>\nimport { normalize } from 'path'\nimport { showError } from '@nextcloud/dialogs'\nimport NcEmptyContent from '@nextcloud/vue/dist/Components/NcEmptyContent'\nimport NcModal from '@nextcloud/vue/dist/Components/NcModal'\n\nimport { getCurrentDirectory } from '../utils/davUtils'\nimport { createFromTemplate, getTemplates } from '../services/Templates'\nimport TemplatePreview from '../components/TemplatePreview'\n\nconst border = 2\nconst margin = 8\nconst width = margin * 20\n\nexport default {\n\tname: 'TemplatePicker',\n\n\tcomponents: {\n\t\tNcEmptyContent,\n\t\tNcModal,\n\t\tTemplatePreview,\n\t},\n\n\tprops: {\n\t\tlogger: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\t// Check empty template by default\n\t\t\tchecked: -1,\n\t\t\tloading: false,\n\t\t\tname: null,\n\t\t\topened: false,\n\t\t\tprovider: null,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * Strip away extension from name\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tnameWithoutExt() {\n\t\t\treturn this.name.indexOf('.') > -1\n\t\t\t\t? this.name.split('.').slice(0, -1).join('.')\n\t\t\t\t: this.name\n\t\t},\n\n\t\temptyTemplate() {\n\t\t\treturn {\n\t\t\t\tbasename: t('files', 'Blank'),\n\t\t\t\tfileid: -1,\n\t\t\t\tfilename: this.t('files', 'Blank'),\n\t\t\t\thasPreview: false,\n\t\t\t\tmime: this.provider?.mimetypes[0] || this.provider?.mimetypes,\n\t\t\t}\n\t\t},\n\n\t\tselectedTemplate() {\n\t\t\treturn this.provider.templates.find(template => template.fileid === this.checked)\n\t\t},\n\n\t\t/**\n\t\t * Style css vars bin,d\n\t\t *\n\t\t * @return {object}\n\t\t */\n\t\tstyle() {\n\t\t\treturn {\n\t\t\t\t'--margin': margin + 'px',\n\t\t\t\t'--width': width + 'px',\n\t\t\t\t'--border': border + 'px',\n\t\t\t\t'--fullwidth': width + 2 * margin + 2 * border + 'px',\n\t\t\t\t'--height': this.provider.ratio ? Math.round(width / this.provider.ratio) + 'px' : null,\n\t\t\t}\n\t\t},\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Open the picker\n\t\t *\n\t\t * @param {string} name the file name to create\n\t\t * @param {object} provider the template provider picked\n\t\t */\n\t\tasync open(name, provider) {\n\n\t\t\tthis.checked = this.emptyTemplate.fileid\n\t\t\tthis.name = name\n\t\t\tthis.provider = provider\n\n\t\t\tconst templates = await getTemplates()\n\t\t\tconst fetchedProvider = templates.find((fetchedProvider) => fetchedProvider.app === provider.app && fetchedProvider.label === provider.label)\n\t\t\tif (fetchedProvider === null) {\n\t\t\t\tthrow new Error('Failed to match provider in results')\n\t\t\t}\n\t\t\tthis.provider = fetchedProvider\n\n\t\t\t// If there is no templates available, just create an empty file\n\t\t\tif (fetchedProvider.templates.length === 0) {\n\t\t\t\tthis.onSubmit()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Else, open the picker\n\t\t\tthis.opened = true\n\t\t},\n\n\t\t/**\n\t\t * Close the picker and reset variables\n\t\t */\n\t\tclose() {\n\t\t\tthis.checked = this.emptyTemplate.fileid\n\t\t\tthis.loading = false\n\t\t\tthis.name = null\n\t\t\tthis.opened = false\n\t\t\tthis.provider = null\n\t\t},\n\n\t\t/**\n\t\t * Manages the radio template picker change\n\t\t *\n\t\t * @param {number} fileid the selected template file id\n\t\t */\n\t\tonCheck(fileid) {\n\t\t\tthis.checked = fileid\n\t\t},\n\n\t\tasync onSubmit() {\n\t\t\tthis.loading = true\n\t\t\tconst currentDirectory = getCurrentDirectory()\n\t\t\tconst fileList = OCA?.Files?.App?.currentFileList\n\n\t\t\t// If the file doesn't have an extension, add the default one\n\t\t\tif (this.nameWithoutExt === this.name) {\n\t\t\t\tthis.logger.debug('Fixed invalid filename', { name: this.name, extension: this.provider?.extension })\n\t\t\t\tthis.name = this.name + this.provider?.extension\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst fileInfo = await createFromTemplate(\n\t\t\t\t\tnormalize(`${currentDirectory}/${this.name}`),\n\t\t\t\t\tthis.selectedTemplate?.filename,\n\t\t\t\t\tthis.selectedTemplate?.templateType,\n\t\t\t\t)\n\t\t\t\tthis.logger.debug('Created new file', fileInfo)\n\n\t\t\t\t// Fetch FileInfo and model\n\t\t\t\tconst data = await fileList?.addAndFetchFileInfo(this.name).then((status, data) => data)\n\t\t\t\tconst model = new OCA.Files.FileInfoModel(data, {\n\t\t\t\t\tfilesClient: fileList?.filesClient,\n\t\t\t\t})\n\n\t\t\t\t// Run default action\n\t\t\t\tconst fileAction = OCA.Files.fileActions.getDefaultFileAction(fileInfo.mime, 'file', OC.PERMISSION_ALL)\n\t\t\t\tif (fileAction) {\n\t\t\t\t\tfileAction.action(fileInfo.basename, {\n\t\t\t\t\t\t$file: fileList?.findFileEl(this.name),\n\t\t\t\t\t\tdir: currentDirectory,\n\t\t\t\t\t\tfileList,\n\t\t\t\t\t\tfileActions: fileList?.fileActions,\n\t\t\t\t\t\tfileInfoModel: model,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tthis.close()\n\t\t\t} catch (error) {\n\t\t\t\tthis.logger.error('Error while creating the new file from template')\n\t\t\t\tconsole.error(error)\n\t\t\t\tshowError(this.t('files', 'Unable to create new file from template'))\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.templates-picker {\n\t&__form {\n\t\tpadding: calc(var(--margin) * 2);\n\t\t// Will be handled by the buttons\n\t\tpadding-bottom: 0;\n\n\t\th2 {\n\t\t\ttext-align: center;\n\t\t\tfont-weight: bold;\n\t\t\tmargin: var(--margin) 0 calc(var(--margin) * 2);\n\t\t}\n\t}\n\n\t&__list {\n\t\tdisplay: grid;\n\t\tgrid-gap: calc(var(--margin) * 2);\n\t\tgrid-auto-columns: 1fr;\n\t\t// We want maximum 5 columns. Putting 6 as we don't count the grid gap. So it will always be lower than 6\n\t\tmax-width: calc(var(--fullwidth) * 6);\n\t\tgrid-template-columns: repeat(auto-fit, var(--fullwidth));\n\t\t// Make sure all rows are the same height\n\t\tgrid-auto-rows: 1fr;\n\t\t// Center the columns set\n\t\tjustify-content: center;\n\t}\n\n\t&__buttons {\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\tpadding: calc(var(--margin) * 2) var(--margin);\n\t\tposition: sticky;\n\t\tbottom: 0;\n\t\tbackground-image: linear-gradient(0, var(--gradient-main-background));\n\n\t\tbutton, input[type='submit'] {\n\t\t\theight: 44px;\n\t\t}\n\t}\n\n\t// Make sure we're relative for the loading emptycontent on top\n\t::v-deep .modal-container {\n\t\tposition: relative;\n\t}\n\n\t&__loading {\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\tjustify-content: center;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tmargin: 0;\n\t\tbackground-color: var(--color-main-background-translucent);\n\t}\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!./TemplatePicker.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!./TemplatePicker.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!./TemplatePicker.vue?vue&type=style&index=0&id=55dd9121&prod&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!./TemplatePicker.vue?vue&type=style&index=0&id=55dd9121&prod&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./TemplatePicker.vue?vue&type=template&id=55dd9121&scoped=true&\"\nimport script from \"./TemplatePicker.vue?vue&type=script&lang=js&\"\nexport * from \"./TemplatePicker.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TemplatePicker.vue?vue&type=style&index=0&id=55dd9121&prod&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 \"55dd9121\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.opened)?_c('NcModal',{staticClass:\"templates-picker\",attrs:{\"clear-view-delay\":-1,\"size\":\"normal\"},on:{\"close\":_vm.close}},[_c('form',{staticClass:\"templates-picker__form\",style:(_vm.style),on:{\"submit\":function($event){$event.preventDefault();$event.stopPropagation();return _vm.onSubmit.apply(null, arguments)}}},[_c('h2',[_vm._v(_vm._s(_vm.t('files', 'Pick a template for {name}', { name: _vm.nameWithoutExt })))]),_vm._v(\" \"),_c('ul',{staticClass:\"templates-picker__list\"},[_c('TemplatePreview',_vm._b({attrs:{\"checked\":_vm.checked === _vm.emptyTemplate.fileid},on:{\"check\":_vm.onCheck}},'TemplatePreview',_vm.emptyTemplate,false)),_vm._v(\" \"),_vm._l((_vm.provider.templates),function(template){return _c('TemplatePreview',_vm._b({key:template.fileid,attrs:{\"checked\":_vm.checked === template.fileid,\"ratio\":_vm.provider.ratio},on:{\"check\":_vm.onCheck}},'TemplatePreview',template,false))})],2),_vm._v(\" \"),_c('div',{staticClass:\"templates-picker__buttons\"},[_c('button',{on:{\"click\":_vm.close}},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('files', 'Cancel'))+\"\\n\\t\\t\\t\")]),_vm._v(\" \"),_c('input',{staticClass:\"primary\",attrs:{\"type\":\"submit\",\"aria-label\":_vm.t('files', 'Create a new file with the selected template')},domProps:{\"value\":_vm.t('files', 'Create')}})])]),_vm._v(\" \"),(_vm.loading)?_c('NcEmptyContent',{staticClass:\"templates-picker__loading\",attrs:{\"icon\":\"icon-loading\"}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('files', 'Creating file'))+\"\\n\\t\")]):_vm._e()],1):_vm._e()\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Julius Härtl <jus@bitgrid.net>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { getLoggerBuilder } from '@nextcloud/logger'\nimport { loadState } from '@nextcloud/initial-state'\nimport { translate as t, translatePlural as n } from '@nextcloud/l10n'\nimport { generateOcsUrl } from '@nextcloud/router'\nimport { getCurrentDirectory } from './utils/davUtils'\nimport axios from '@nextcloud/axios'\nimport Vue from 'vue'\n\nimport TemplatePickerView from './views/TemplatePicker'\nimport { showError } from '@nextcloud/dialogs'\n\n// Set up logger\nconst logger = getLoggerBuilder()\n\t.setApp('files')\n\t.detectUser()\n\t.build()\n\n// Add translates functions\nVue.mixin({\n\tmethods: {\n\t\tt,\n\t\tn,\n\t},\n})\n\n// Create document root\nconst TemplatePickerRoot = document.createElement('div')\nTemplatePickerRoot.id = 'template-picker'\ndocument.body.appendChild(TemplatePickerRoot)\n\n// Retrieve and init templates\nlet templates = loadState('files', 'templates', [])\nlet templatesPath = loadState('files', 'templates_path', false)\nlogger.debug('Templates providers', templates)\nlogger.debug('Templates folder', { templatesPath })\n\n// Init vue app\nconst View = Vue.extend(TemplatePickerView)\nconst TemplatePicker = new View({\n\tname: 'TemplatePicker',\n\tpropsData: {\n\t\tlogger,\n\t},\n})\nTemplatePicker.$mount('#template-picker')\n\n// Init template engine after load to make sure it's the last injected entry\nwindow.addEventListener('DOMContentLoaded', function() {\n\tif (!templatesPath) {\n\t\tlogger.debug('Templates folder not initialized')\n\t\tconst initTemplatesPlugin = {\n\t\t\tattach(menu) {\n\t\t\t\t// register the new menu entry\n\t\t\t\tmenu.addMenuEntry({\n\t\t\t\t\tid: 'template-init',\n\t\t\t\t\tdisplayName: t('files', 'Set up templates folder'),\n\t\t\t\t\ttemplateName: t('files', 'Templates'),\n\t\t\t\t\ticonClass: 'icon-template-add',\n\t\t\t\t\tfileType: 'file',\n\t\t\t\t\tactionHandler(name) {\n\t\t\t\t\t\tinitTemplatesFolder(name)\n\t\t\t\t\t\tmenu.removeMenuEntry('template-init')\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t\tOC.Plugins.register('OCA.Files.NewFileMenu', initTemplatesPlugin)\n\t}\n})\n\n// Init template files menu\ntemplates.forEach((provider, index) => {\n\tconst newTemplatePlugin = {\n\t\tattach(menu) {\n\t\t\tconst fileList = menu.fileList\n\n\t\t\t// only attach to main file list, public view is not supported yet\n\t\t\tif (fileList.id !== 'files' && fileList.id !== 'files.public') {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// register the new menu entry\n\t\t\tmenu.addMenuEntry({\n\t\t\t\tid: `template-new-${provider.app}-${index}`,\n\t\t\t\tdisplayName: provider.label,\n\t\t\t\ttemplateName: provider.label + provider.extension,\n\t\t\t\ticonClass: provider.iconClass || 'icon-file',\n\t\t\t\tfileType: 'file',\n\t\t\t\tactionHandler(name) {\n\t\t\t\t\tTemplatePicker.open(name, provider)\n\t\t\t\t},\n\t\t\t})\n\t\t},\n\t}\n\tOC.Plugins.register('OCA.Files.NewFileMenu', newTemplatePlugin)\n})\n\n/**\n * Init the template directory\n *\n * @param {string} name the templates folder name\n */\nconst initTemplatesFolder = async function(name) {\n\tconst templatePath = (getCurrentDirectory() + `/${name}`).replace('//', '/')\n\ttry {\n\t\tlogger.debug('Initializing the templates directory', { templatePath })\n\t\tconst response = await axios.post(generateOcsUrl('apps/files/api/v1/templates/path'), {\n\t\t\ttemplatePath,\n\t\t\tcopySystemTemplates: true,\n\t\t})\n\n\t\t// Go to template directory\n\t\tOCA.Files.App.currentFileList.changeDirectory(templatePath, true, true)\n\n\t\ttemplates = response.data.ocs.data.templates\n\t\ttemplatesPath = response.data.ocs.data.template_path\n\t} catch (error) {\n\t\tlogger.error('Unable to initialize the templates directory')\n\t\tshowError(t('files', 'Unable to initialize the templates directory'))\n\t}\n}\n","/*\n * @copyright Copyright (c) 2021 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 { subscribe } from '@nextcloud/event-bus'\n\n(function() {\n\n\tconst FilesPlugin = {\n\t\tattach(fileList) {\n\t\t\tsubscribe('nextcloud:unified-search.search', ({ query }) => {\n\t\t\t\tfileList.setFilter(query)\n\t\t\t})\n\t\t\tsubscribe('nextcloud:unified-search.reset', () => {\n\t\t\t\tthis.query = null\n\t\t\t\tfileList.setFilter('')\n\t\t\t})\n\n\t\t},\n\t}\n\n\twindow.OC.Plugins.register('OCA.Files.FileList', FilesPlugin)\n\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, \".template-picker__item[data-v-440aea22]{display:flex}.template-picker__label[data-v-440aea22]{display:flex;align-items:center;flex:1 1;flex-direction:column}.template-picker__label[data-v-440aea22],.template-picker__label *[data-v-440aea22]{cursor:pointer;user-select:none}.template-picker__label[data-v-440aea22]::before{display:none !important}.template-picker__preview[data-v-440aea22]{display:block;overflow:hidden;flex:1 1;width:var(--width);min-height:var(--height);max-height:var(--height);padding:0;border:var(--border) solid var(--color-border);border-radius:var(--border-radius-large)}input:checked+label>.template-picker__preview[data-v-440aea22]{border-color:var(--color-primary)}.template-picker__preview--failed[data-v-440aea22]{display:flex}.template-picker__image[data-v-440aea22]{max-width:100%;background-color:var(--color-main-background);object-fit:cover}.template-picker__preview--failed .template-picker__image[data-v-440aea22]{width:calc(var(--margin)*8);margin:auto;background-color:rgba(0,0,0,0) !important;object-fit:initial}.template-picker__title[data-v-440aea22]{overflow:hidden;max-width:calc(var(--width) + 4px);padding:var(--margin);white-space:nowrap;text-overflow:ellipsis}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/components/TemplatePreview.vue\"],\"names\":[],\"mappings\":\"AAGC,wCACC,YAAA,CAGD,yCACC,YAAA,CAEA,kBAAA,CACA,QAAA,CACA,qBAAA,CAEA,oFACC,cAAA,CACA,gBAAA,CAGD,iDACC,uBAAA,CAIF,2CACC,aAAA,CACA,eAAA,CAEA,QAAA,CACA,kBAAA,CACA,wBAAA,CACA,wBAAA,CACA,SAAA,CACA,8CAAA,CACA,wCAAA,CAEA,+DACC,iCAAA,CAGD,mDAEC,YAAA,CAIF,yCACC,cAAA,CACA,6CAAA,CAEA,gBAAA,CAID,2EACC,2BAAA,CAEA,WAAA,CACA,yCAAA,CAEA,kBAAA,CAGD,yCACC,eAAA,CAEA,kCAAA,CACA,qBAAA,CACA,kBAAA,CACA,sBAAA\",\"sourcesContent\":[\"\\n\\n.template-picker {\\n\\t&__item {\\n\\t\\tdisplay: flex;\\n\\t}\\n\\n\\t&__label {\\n\\t\\tdisplay: flex;\\n\\t\\t// Align in the middle of the grid\\n\\t\\talign-items: center;\\n\\t\\tflex: 1 1;\\n\\t\\tflex-direction: column;\\n\\n\\t\\t&, * {\\n\\t\\t\\tcursor: pointer;\\n\\t\\t\\tuser-select: none;\\n\\t\\t}\\n\\n\\t\\t&::before {\\n\\t\\t\\tdisplay: none !important;\\n\\t\\t}\\n\\t}\\n\\n\\t&__preview {\\n\\t\\tdisplay: block;\\n\\t\\toverflow: hidden;\\n\\t\\t// Stretch so all entries are the same width\\n\\t\\tflex: 1 1;\\n\\t\\twidth: var(--width);\\n\\t\\tmin-height: var(--height);\\n\\t\\tmax-height: var(--height);\\n\\t\\tpadding: 0;\\n\\t\\tborder: var(--border) solid var(--color-border);\\n\\t\\tborder-radius: var(--border-radius-large);\\n\\n\\t\\tinput:checked + label > & {\\n\\t\\t\\tborder-color: var(--color-primary);\\n\\t\\t}\\n\\n\\t\\t&--failed {\\n\\t\\t\\t// Make sure to properly center fallback icon\\n\\t\\t\\tdisplay: flex;\\n\\t\\t}\\n\\t}\\n\\n\\t&__image {\\n\\t\\tmax-width: 100%;\\n\\t\\tbackground-color: var(--color-main-background);\\n\\n\\t\\tobject-fit: cover;\\n\\t}\\n\\n\\t// Failed preview, fallback to mime icon\\n\\t&__preview--failed &__image {\\n\\t\\twidth: calc(var(--margin) * 8);\\n\\t\\t// Center mime icon\\n\\t\\tmargin: auto;\\n\\t\\tbackground-color: transparent !important;\\n\\n\\t\\tobject-fit: initial;\\n\\t}\\n\\n\\t&__title {\\n\\t\\toverflow: hidden;\\n\\t\\t// also count preview border\\n\\t\\tmax-width: calc(var(--width) + 2*2px);\\n\\t\\tpadding: var(--margin);\\n\\t\\twhite-space: nowrap;\\n\\t\\ttext-overflow: ellipsis;\\n\\t}\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".templates-picker__form[data-v-55dd9121]{padding:calc(var(--margin)*2);padding-bottom:0}.templates-picker__form h2[data-v-55dd9121]{text-align:center;font-weight:bold;margin:var(--margin) 0 calc(var(--margin)*2)}.templates-picker__list[data-v-55dd9121]{display:grid;grid-gap:calc(var(--margin)*2);grid-auto-columns:1fr;max-width:calc(var(--fullwidth)*6);grid-template-columns:repeat(auto-fit, var(--fullwidth));grid-auto-rows:1fr;justify-content:center}.templates-picker__buttons[data-v-55dd9121]{display:flex;justify-content:space-between;padding:calc(var(--margin)*2) var(--margin);position:sticky;bottom:0;background-image:linear-gradient(0, var(--gradient-main-background))}.templates-picker__buttons button[data-v-55dd9121],.templates-picker__buttons input[type=submit][data-v-55dd9121]{height:44px}.templates-picker[data-v-55dd9121] .modal-container{position:relative}.templates-picker__loading[data-v-55dd9121]{position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;margin:0;background-color:var(--color-main-background-translucent)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/views/TemplatePicker.vue\"],\"names\":[],\"mappings\":\"AAEC,yCACC,6BAAA,CAEA,gBAAA,CAEA,4CACC,iBAAA,CACA,gBAAA,CACA,4CAAA,CAIF,yCACC,YAAA,CACA,8BAAA,CACA,qBAAA,CAEA,kCAAA,CACA,wDAAA,CAEA,kBAAA,CAEA,sBAAA,CAGD,4CACC,YAAA,CACA,6BAAA,CACA,2CAAA,CACA,eAAA,CACA,QAAA,CACA,oEAAA,CAEA,kHACC,WAAA,CAKF,oDACC,iBAAA,CAGD,4CACC,iBAAA,CACA,KAAA,CACA,MAAA,CACA,sBAAA,CACA,UAAA,CACA,WAAA,CACA,QAAA,CACA,yDAAA\",\"sourcesContent\":[\"\\n.templates-picker {\\n\\t&__form {\\n\\t\\tpadding: calc(var(--margin) * 2);\\n\\t\\t// Will be handled by the buttons\\n\\t\\tpadding-bottom: 0;\\n\\n\\t\\th2 {\\n\\t\\t\\ttext-align: center;\\n\\t\\t\\tfont-weight: bold;\\n\\t\\t\\tmargin: var(--margin) 0 calc(var(--margin) * 2);\\n\\t\\t}\\n\\t}\\n\\n\\t&__list {\\n\\t\\tdisplay: grid;\\n\\t\\tgrid-gap: calc(var(--margin) * 2);\\n\\t\\tgrid-auto-columns: 1fr;\\n\\t\\t// We want maximum 5 columns. Putting 6 as we don't count the grid gap. So it will always be lower than 6\\n\\t\\tmax-width: calc(var(--fullwidth) * 6);\\n\\t\\tgrid-template-columns: repeat(auto-fit, var(--fullwidth));\\n\\t\\t// Make sure all rows are the same height\\n\\t\\tgrid-auto-rows: 1fr;\\n\\t\\t// Center the columns set\\n\\t\\tjustify-content: center;\\n\\t}\\n\\n\\t&__buttons {\\n\\t\\tdisplay: flex;\\n\\t\\tjustify-content: space-between;\\n\\t\\tpadding: calc(var(--margin) * 2) var(--margin);\\n\\t\\tposition: sticky;\\n\\t\\tbottom: 0;\\n\\t\\tbackground-image: linear-gradient(0, var(--gradient-main-background));\\n\\n\\t\\tbutton, input[type='submit'] {\\n\\t\\t\\theight: 44px;\\n\\t\\t}\\n\\t}\\n\\n\\t// Make sure we're relative for the loading emptycontent on top\\n\\t::v-deep .modal-container {\\n\\t\\tposition: relative;\\n\\t}\\n\\n\\t&__loading {\\n\\t\\tposition: absolute;\\n\\t\\ttop: 0;\\n\\t\\tleft: 0;\\n\\t\\tjustify-content: center;\\n\\t\\twidth: 100%;\\n\\t\\theight: 100%;\\n\\t\\tmargin: 0;\\n\\t\\tbackground-color: var(--color-main-background-translucent);\\n\\t}\\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 = 2181;","__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\t2181: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [7874], function() { return __webpack_require__(64382); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","Settings","this","_settings","console","debug","view","filter","e","name","length","error","push","_c","_self","_vm","attrs","_l","settings","setting","key","el","Setting","open","close","_name","_el","_open","_close","Vue","t","window","OCA","Files","Object","assign","addEventListener","TESTING","render","h","SettingsView","appSettingsHeader","document","getElementById","opened","currentTarget","children","classList","contains","forEach","getCurrentDirectory","currentDirInfo","App","currentFileList","dirInfo","path","replace","getTemplates","axios","generateOcsUrl","response","data","ocs","createFromTemplate","filePath","templatePath","templateType","getCurrentUser","value","pathSections","startsWith","split","relativePath","section","encodeURIComponent","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","staticClass","id","domProps","checked","on","onCheck","_v","class","failedPreview","realPreviewUrl","onFailure","_s","nameWithoutExt","style","$event","preventDefault","stopPropagation","onSubmit","apply","arguments","_b","emptyTemplate","fileid","provider","templates","template","ratio","loading","_e","logger","getLoggerBuilder","setApp","detectUser","build","methods","n","TemplatePickerRoot","createElement","body","appendChild","loadState","templatesPath","TemplatePicker","TemplatePickerView","propsData","$mount","initTemplatesPlugin","attach","menu","addMenuEntry","displayName","templateName","iconClass","fileType","actionHandler","initTemplatesFolder","removeMenuEntry","OC","Plugins","register","index","newTemplatePlugin","fileList","app","label","extension","FilesPlugin","copySystemTemplates","changeDirectory","template_path","showError","subscribe","query","setFilter","___CSS_LOADER_EXPORT___","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","fulfilled","j","keys","every","splice","r","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","nmd","paths","b","baseURI","self","location","href","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","bind","nc","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file +{"version":3,"file":"files-main.js?v=e3325bdf81b97cc91077","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/apps/files/src/services/Settings.js","webpack:///nextcloud/apps/files/src/components/Setting.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/files/src/components/Setting.vue","webpack:///nextcloud/apps/files/src/views/Settings.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/files/src/views/Settings.vue","webpack://nextcloud/./apps/files/src/components/Setting.vue?98ea","webpack://nextcloud/./apps/files/src/components/Setting.vue?8d57","webpack://nextcloud/./apps/files/src/views/Settings.vue?b81b","webpack://nextcloud/./apps/files/src/views/Settings.vue?84f7","webpack:///nextcloud/apps/files/src/models/Setting.js","webpack:///nextcloud/apps/files/src/files-app-settings.js","webpack:///nextcloud/apps/files/src/utils/davUtils.js","webpack:///nextcloud/apps/files/src/services/Templates.js","webpack:///nextcloud/apps/files/src/components/TemplatePreview.vue","webpack:///nextcloud/apps/files/src/utils/fileUtils.js","webpack:///nextcloud/apps/files/src/components/TemplatePreview.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/files/src/components/TemplatePreview.vue?c067","webpack://nextcloud/./apps/files/src/components/TemplatePreview.vue?81db","webpack://nextcloud/./apps/files/src/components/TemplatePreview.vue?c414","webpack:///nextcloud/apps/files/src/views/TemplatePicker.vue","webpack:///nextcloud/apps/files/src/views/TemplatePicker.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/files/src/views/TemplatePicker.vue?023e","webpack://nextcloud/./apps/files/src/views/TemplatePicker.vue?afd8","webpack://nextcloud/./apps/files/src/views/TemplatePicker.vue?1f7b","webpack:///nextcloud/apps/files/src/templates.js","webpack:///nextcloud/apps/files/src/legacy/filelistSearch.js","webpack:///nextcloud/apps/files/src/components/TemplatePreview.vue?vue&type=style&index=0&id=440aea22&prod&lang=scss&scoped=true&","webpack:///nextcloud/apps/files/src/views/TemplatePicker.vue?vue&type=style&index=0&id=55dd9121&prod&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/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","/**\n * @copyright Copyright (c) 2019 Gary Kim <gary@garykim.dev>\n *\n * @author Gary Kim <gary@garykim.dev>\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 class Settings {\n\n\t_settings\n\n\tconstructor() {\n\t\tthis._settings = []\n\t\tconsole.debug('OCA.Files.Settings initialized')\n\t}\n\n\t/**\n\t * Register a new setting\n\t *\n\t * @since 19.0.0\n\t * @param {OCA.Files.Settings.Setting} view element to add to settings\n\t * @return {boolean} whether registering was successful\n\t */\n\tregister(view) {\n\t\tif (this._settings.filter(e => e.name === view.name).length > 0) {\n\t\t\tconsole.error('A setting with the same name is already registered')\n\t\t\treturn false\n\t\t}\n\t\tthis._settings.push(view)\n\t\treturn true\n\t}\n\n\t/**\n\t * All settings elements\n\t *\n\t * @return {OCA.Files.Settings.Setting[]} All currently registered settings\n\t */\n\tget settings() {\n\t\treturn this._settings\n\t}\n\n}\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Setting.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!./Setting.vue?vue&type=script&lang=js&\"","<!--\n - @copyright Copyright (c) 2020 Gary Kim <gary@garykim.dev>\n -\n - @author Gary Kim <gary@garykim.dev>\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 />\n</template>\n<script>\nexport default {\n\tname: 'Setting',\n\tprops: {\n\t\tel: {\n\t\t\ttype: Function,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.$el.appendChild(this.el())\n\t},\n}\n</script>\n<style>\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Settings.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!./Settings.vue?vue&type=script&lang=js&\"","<!--\n - @copyright Copyright (c) 2019 Gary Kim <gary@garykim.dev>\n -\n - @author Gary Kim <gary@garykim.dev>\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=\"files-app-extra-settings\">\n\t\t<template v-for=\"setting in settings\">\n\t\t\t<Setting :key=\"setting.name\" :el=\"setting.el\" />\n\t\t</template>\n\t</div>\n</template>\n\n<script>\nimport Setting from '../components/Setting'\n\nexport default {\n\tname: 'Settings',\n\tcomponents: {\n\t\tSetting,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tsettings: OCA.Files.Settings.settings,\n\t\t}\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n\n</style>\n","import { render, staticRenderFns } from \"./Setting.vue?vue&type=template&id=47cd8aa6&\"\nimport script from \"./Setting.vue?vue&type=script&lang=js&\"\nexport * from \"./Setting.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div')\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./Settings.vue?vue&type=template&id=31c9bb4b&scoped=true&\"\nimport script from \"./Settings.vue?vue&type=script&lang=js&\"\nexport * from \"./Settings.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 \"31c9bb4b\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{attrs:{\"id\":\"files-app-extra-settings\"}},[_vm._l((_vm.settings),function(setting){return [_c('Setting',{key:setting.name,attrs:{\"el\":setting.el}})]})],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2019 Gary Kim <gary@garykim.dev>\n * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author Gary Kim <gary@garykim.dev>\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 class Setting {\n\n\t_close\n\t_el\n\t_name\n\t_open\n\n\t/**\n\t * Create a new files app setting\n\t *\n\t * @since 19.0.0\n\t * @param {string} name the name of this setting\n\t * @param {object} component the component\n\t * @param {Function} component.el function that returns an unmounted dom element to be added\n\t * @param {Function} [component.open] callback for when setting is added\n\t * @param {Function} [component.close] callback for when setting is closed\n\t */\n\tconstructor(name, { el, open, close }) {\n\t\tthis._name = name\n\t\tthis._el = el\n\t\tthis._open = open\n\t\tthis._close = close\n\n\t\tif (typeof this._open !== 'function') {\n\t\t\tthis._open = () => {}\n\t\t}\n\n\t\tif (typeof this._close !== 'function') {\n\t\t\tthis._close = () => {}\n\t\t}\n\t}\n\n\tget name() {\n\t\treturn this._name\n\t}\n\n\tget el() {\n\t\treturn this._el\n\t}\n\n\tget open() {\n\t\treturn this._open\n\t}\n\n\tget close() {\n\t\treturn this._close\n\t}\n\n}\n","/**\n * @copyright Copyright (c) 2019 Gary Kim <gary@garykim.dev>\n * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author Gary Kim <gary@garykim.dev>\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 Vue from 'vue'\nimport Settings from './services/Settings'\nimport SettingsView from './views/Settings'\nimport Setting from './models/Setting'\n\nVue.prototype.t = t\n\n// Init Files App Settings Service\nif (!window.OCA.Files) {\n\twindow.OCA.Files = {}\n}\nObject.assign(window.OCA.Files, { Settings: new Settings() })\nObject.assign(window.OCA.Files.Settings, { Setting })\n\nwindow.addEventListener('DOMContentLoaded', function() {\n\tif (window.TESTING) {\n\t\treturn\n\t}\n\t// Init Vue app\n\t// eslint-disable-next-line\n\tnew Vue({\n\t\tel: '#files-app-settings',\n\t\trender: h => h(SettingsView),\n\t})\n\n\tconst appSettingsHeader = document.getElementById('app-settings-header')\n\tif (appSettingsHeader) {\n\t\tappSettingsHeader.addEventListener('click', e => {\n\t\t\tconst opened = e.currentTarget.children[0].classList.contains('opened')\n\t\t\tOCA.Files.Settings.settings.forEach(e => opened ? e.close() : e.open())\n\t\t\te.currentTarget?.children?.[0]?.setAttribute?.('aria-expanded', opened ? 'false' : 'true')\n\t\t})\n\t}\n})\n","/**\n * @copyright Copyright (c) 2019 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 { generateRemoteUrl } from '@nextcloud/router'\nimport { getCurrentUser } from '@nextcloud/auth'\n\nexport const getRootPath = function() {\n\tif (getCurrentUser()) {\n\t\treturn generateRemoteUrl(`dav/files/${getCurrentUser().uid}`)\n\t} else {\n\t\treturn generateRemoteUrl('webdav').replace('/remote.php', '/public.php')\n\t}\n}\n\nexport const isPublic = function() {\n\treturn !getCurrentUser()\n}\n\nexport const getToken = function() {\n\treturn document.getElementById('sharingToken') && document.getElementById('sharingToken').value\n}\n\n/**\n * Return the current directory, fallback to root\n *\n * @return {string}\n */\nexport const getCurrentDirectory = function() {\n\tconst currentDirInfo = OCA?.Files?.App?.currentFileList?.dirInfo\n\t\t|| { path: '/', name: '' }\n\n\t// Make sure we don't have double slashes\n\treturn `${currentDirInfo.path}/${currentDirInfo.name}`.replace(/\\/\\//gi, '/')\n}\n","/**\n * @copyright Copyright (c) 2021 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 { generateOcsUrl } from '@nextcloud/router'\nimport axios from '@nextcloud/axios'\n\nexport const getTemplates = async function() {\n\tconst response = await axios.get(generateOcsUrl('apps/files/api/v1/templates'))\n\treturn response.data.ocs.data\n}\n\n/**\n * Create a new file from a specified template\n *\n * @param {string} filePath The new file destination path\n * @param {string} templatePath The template source path\n * @param {string} templateType The template type e.g 'user'\n */\nexport const createFromTemplate = async function(filePath, templatePath, templateType) {\n\tconst response = await axios.post(generateOcsUrl('apps/files/api/v1/templates/create'), {\n\t\tfilePath,\n\t\ttemplatePath,\n\t\ttemplateType,\n\t})\n\treturn response.data.ocs.data\n}\n","<!--\n - @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<li class=\"template-picker__item\">\n\t\t<input :id=\"id\"\n\t\t\t:checked=\"checked\"\n\t\t\ttype=\"radio\"\n\t\t\tclass=\"radio\"\n\t\t\tname=\"template-picker\"\n\t\t\t@change=\"onCheck\">\n\n\t\t<label :for=\"id\" class=\"template-picker__label\">\n\t\t\t<div class=\"template-picker__preview\"\n\t\t\t\t:class=\"failedPreview ? 'template-picker__preview--failed' : ''\">\n\t\t\t\t<img class=\"template-picker__image\"\n\t\t\t\t\t:src=\"realPreviewUrl\"\n\t\t\t\t\talt=\"\"\n\t\t\t\t\tdraggable=\"false\"\n\t\t\t\t\t@error=\"onFailure\">\n\t\t\t</div>\n\n\t\t\t<span class=\"template-picker__title\">\n\t\t\t\t{{ nameWithoutExt }}\n\t\t\t</span>\n\t\t</label>\n\t</li>\n</template>\n\n<script>\nimport { generateUrl } from '@nextcloud/router'\nimport { encodeFilePath } from '../utils/fileUtils'\nimport { getToken, isPublic } from '../utils/davUtils'\n\n// preview width generation\nconst previewWidth = 256\n\nexport default {\n\tname: 'TemplatePreview',\n\tinheritAttrs: false,\n\n\tprops: {\n\t\tbasename: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tchecked: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tfileid: {\n\t\t\ttype: [String, Number],\n\t\t\trequired: true,\n\t\t},\n\t\tfilename: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tpreviewUrl: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\t\thasPreview: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t\tmime: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tratio: {\n\t\t\ttype: Number,\n\t\t\tdefault: null,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tfailedPreview: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * Strip away extension from name\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tnameWithoutExt() {\n\t\t\treturn this.basename.indexOf('.') > -1 ? this.basename.split('.').slice(0, -1).join('.') : this.basename\n\t\t},\n\n\t\tid() {\n\t\t\treturn `template-picker-${this.fileid}`\n\t\t},\n\n\t\trealPreviewUrl() {\n\t\t\t// If original preview failed, fallback to mime icon\n\t\t\tif (this.failedPreview && this.mimeIcon) {\n\t\t\t\treturn this.mimeIcon\n\t\t\t}\n\n\t\t\tif (this.previewUrl) {\n\t\t\t\treturn this.previewUrl\n\t\t\t}\n\t\t\t// TODO: find a nicer standard way of doing this?\n\t\t\tif (isPublic()) {\n\t\t\t\treturn generateUrl(`/apps/files_sharing/publicpreview/${getToken()}?fileId=${this.fileid}&file=${encodeFilePath(this.filename)}&x=${previewWidth}&y=${previewWidth}&a=1`)\n\t\t\t}\n\t\t\treturn generateUrl(`/core/preview?fileId=${this.fileid}&x=${previewWidth}&y=${previewWidth}&a=1`)\n\t\t},\n\n\t\tmimeIcon() {\n\t\t\treturn OC.MimeType.getIconUrl(this.mime)\n\t\t},\n\t},\n\n\tmethods: {\n\t\tonCheck() {\n\t\t\tthis.$emit('check', this.fileid)\n\t\t},\n\t\tonFailure() {\n\t\t\tthis.failedPreview = true\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n\n.template-picker {\n\t&__item {\n\t\tdisplay: flex;\n\t}\n\n\t&__label {\n\t\tdisplay: flex;\n\t\t// Align in the middle of the grid\n\t\talign-items: center;\n\t\tflex: 1 1;\n\t\tflex-direction: column;\n\n\t\t&, * {\n\t\t\tcursor: pointer;\n\t\t\tuser-select: none;\n\t\t}\n\n\t\t&::before {\n\t\t\tdisplay: none !important;\n\t\t}\n\t}\n\n\t&__preview {\n\t\tdisplay: block;\n\t\toverflow: hidden;\n\t\t// Stretch so all entries are the same width\n\t\tflex: 1 1;\n\t\twidth: var(--width);\n\t\tmin-height: var(--height);\n\t\tmax-height: var(--height);\n\t\tpadding: 0;\n\t\tborder: var(--border) solid var(--color-border);\n\t\tborder-radius: var(--border-radius-large);\n\n\t\tinput:checked + label > & {\n\t\t\tborder-color: var(--color-primary);\n\t\t}\n\n\t\t&--failed {\n\t\t\t// Make sure to properly center fallback icon\n\t\t\tdisplay: flex;\n\t\t}\n\t}\n\n\t&__image {\n\t\tmax-width: 100%;\n\t\tbackground-color: var(--color-main-background);\n\n\t\tobject-fit: cover;\n\t}\n\n\t// Failed preview, fallback to mime icon\n\t&__preview--failed &__image {\n\t\twidth: calc(var(--margin) * 8);\n\t\t// Center mime icon\n\t\tmargin: auto;\n\t\tbackground-color: transparent !important;\n\n\t\tobject-fit: initial;\n\t}\n\n\t&__title {\n\t\toverflow: hidden;\n\t\t// also count preview border\n\t\tmax-width: calc(var(--width) + 2*2px);\n\t\tpadding: var(--margin);\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t}\n}\n\n</style>\n","/**\n * @copyright Copyright (c) 2021 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nconst encodeFilePath = function(path) {\n\tconst pathSections = (path.startsWith('/') ? path : `/${path}`).split('/')\n\tlet relativePath = ''\n\tpathSections.forEach((section) => {\n\t\tif (section !== '') {\n\t\t\trelativePath += '/' + encodeURIComponent(section)\n\t\t}\n\t})\n\treturn relativePath\n}\n\n/**\n * Extract dir and name from file path\n *\n * @param {string} path the full path\n * @return {string[]} [dirPath, fileName]\n */\nconst extractFilePaths = function(path) {\n\tconst pathSections = path.split('/')\n\tconst fileName = pathSections[pathSections.length - 1]\n\tconst dirPath = pathSections.slice(0, pathSections.length - 1).join('/')\n\treturn [dirPath, fileName]\n}\n\nexport { encodeFilePath, extractFilePaths }\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TemplatePreview.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!./TemplatePreview.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!./TemplatePreview.vue?vue&type=style&index=0&id=440aea22&prod&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!./TemplatePreview.vue?vue&type=style&index=0&id=440aea22&prod&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./TemplatePreview.vue?vue&type=template&id=440aea22&scoped=true&\"\nimport script from \"./TemplatePreview.vue?vue&type=script&lang=js&\"\nexport * from \"./TemplatePreview.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TemplatePreview.vue?vue&type=style&index=0&id=440aea22&prod&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 \"440aea22\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('li',{staticClass:\"template-picker__item\"},[_c('input',{staticClass:\"radio\",attrs:{\"id\":_vm.id,\"type\":\"radio\",\"name\":\"template-picker\"},domProps:{\"checked\":_vm.checked},on:{\"change\":_vm.onCheck}}),_vm._v(\" \"),_c('label',{staticClass:\"template-picker__label\",attrs:{\"for\":_vm.id}},[_c('div',{staticClass:\"template-picker__preview\",class:_vm.failedPreview ? 'template-picker__preview--failed' : ''},[_c('img',{staticClass:\"template-picker__image\",attrs:{\"src\":_vm.realPreviewUrl,\"alt\":\"\",\"draggable\":\"false\"},on:{\"error\":_vm.onFailure}})]),_vm._v(\" \"),_c('span',{staticClass:\"template-picker__title\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.nameWithoutExt)+\"\\n\\t\\t\")])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -\n -->\n\n<template>\n\t<NcModal v-if=\"opened\"\n\t\t:clear-view-delay=\"-1\"\n\t\tclass=\"templates-picker\"\n\t\tsize=\"normal\"\n\t\t@close=\"close\">\n\t\t<form class=\"templates-picker__form\"\n\t\t\t:style=\"style\"\n\t\t\t@submit.prevent.stop=\"onSubmit\">\n\t\t\t<h2>{{ t('files', 'Pick a template for {name}', { name: nameWithoutExt }) }}</h2>\n\n\t\t\t<!-- Templates list -->\n\t\t\t<ul class=\"templates-picker__list\">\n\t\t\t\t<TemplatePreview v-bind=\"emptyTemplate\"\n\t\t\t\t\t:checked=\"checked === emptyTemplate.fileid\"\n\t\t\t\t\t@check=\"onCheck\" />\n\n\t\t\t\t<TemplatePreview v-for=\"template in provider.templates\"\n\t\t\t\t\t:key=\"template.fileid\"\n\t\t\t\t\tv-bind=\"template\"\n\t\t\t\t\t:checked=\"checked === template.fileid\"\n\t\t\t\t\t:ratio=\"provider.ratio\"\n\t\t\t\t\t@check=\"onCheck\" />\n\t\t\t</ul>\n\n\t\t\t<!-- Cancel and submit -->\n\t\t\t<div class=\"templates-picker__buttons\">\n\t\t\t\t<button @click=\"close\">\n\t\t\t\t\t{{ t('files', 'Cancel') }}\n\t\t\t\t</button>\n\t\t\t\t<input type=\"submit\"\n\t\t\t\t\tclass=\"primary\"\n\t\t\t\t\t:value=\"t('files', 'Create')\"\n\t\t\t\t\t:aria-label=\"t('files', 'Create a new file with the selected template')\">\n\t\t\t</div>\n\t\t</form>\n\n\t\t<NcEmptyContent v-if=\"loading\" class=\"templates-picker__loading\" icon=\"icon-loading\">\n\t\t\t{{ t('files', 'Creating file') }}\n\t\t</NcEmptyContent>\n\t</NcModal>\n</template>\n\n<script>\nimport { normalize } from 'path'\nimport { showError } from '@nextcloud/dialogs'\nimport NcEmptyContent from '@nextcloud/vue/dist/Components/NcEmptyContent'\nimport NcModal from '@nextcloud/vue/dist/Components/NcModal'\n\nimport { getCurrentDirectory } from '../utils/davUtils'\nimport { createFromTemplate, getTemplates } from '../services/Templates'\nimport TemplatePreview from '../components/TemplatePreview'\n\nconst border = 2\nconst margin = 8\nconst width = margin * 20\n\nexport default {\n\tname: 'TemplatePicker',\n\n\tcomponents: {\n\t\tNcEmptyContent,\n\t\tNcModal,\n\t\tTemplatePreview,\n\t},\n\n\tprops: {\n\t\tlogger: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\t// Check empty template by default\n\t\t\tchecked: -1,\n\t\t\tloading: false,\n\t\t\tname: null,\n\t\t\topened: false,\n\t\t\tprovider: null,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * Strip away extension from name\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tnameWithoutExt() {\n\t\t\treturn this.name.indexOf('.') > -1\n\t\t\t\t? this.name.split('.').slice(0, -1).join('.')\n\t\t\t\t: this.name\n\t\t},\n\n\t\temptyTemplate() {\n\t\t\treturn {\n\t\t\t\tbasename: t('files', 'Blank'),\n\t\t\t\tfileid: -1,\n\t\t\t\tfilename: this.t('files', 'Blank'),\n\t\t\t\thasPreview: false,\n\t\t\t\tmime: this.provider?.mimetypes[0] || this.provider?.mimetypes,\n\t\t\t}\n\t\t},\n\n\t\tselectedTemplate() {\n\t\t\treturn this.provider.templates.find(template => template.fileid === this.checked)\n\t\t},\n\n\t\t/**\n\t\t * Style css vars bin,d\n\t\t *\n\t\t * @return {object}\n\t\t */\n\t\tstyle() {\n\t\t\treturn {\n\t\t\t\t'--margin': margin + 'px',\n\t\t\t\t'--width': width + 'px',\n\t\t\t\t'--border': border + 'px',\n\t\t\t\t'--fullwidth': width + 2 * margin + 2 * border + 'px',\n\t\t\t\t'--height': this.provider.ratio ? Math.round(width / this.provider.ratio) + 'px' : null,\n\t\t\t}\n\t\t},\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Open the picker\n\t\t *\n\t\t * @param {string} name the file name to create\n\t\t * @param {object} provider the template provider picked\n\t\t */\n\t\tasync open(name, provider) {\n\n\t\t\tthis.checked = this.emptyTemplate.fileid\n\t\t\tthis.name = name\n\t\t\tthis.provider = provider\n\n\t\t\tconst templates = await getTemplates()\n\t\t\tconst fetchedProvider = templates.find((fetchedProvider) => fetchedProvider.app === provider.app && fetchedProvider.label === provider.label)\n\t\t\tif (fetchedProvider === null) {\n\t\t\t\tthrow new Error('Failed to match provider in results')\n\t\t\t}\n\t\t\tthis.provider = fetchedProvider\n\n\t\t\t// If there is no templates available, just create an empty file\n\t\t\tif (fetchedProvider.templates.length === 0) {\n\t\t\t\tthis.onSubmit()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Else, open the picker\n\t\t\tthis.opened = true\n\t\t},\n\n\t\t/**\n\t\t * Close the picker and reset variables\n\t\t */\n\t\tclose() {\n\t\t\tthis.checked = this.emptyTemplate.fileid\n\t\t\tthis.loading = false\n\t\t\tthis.name = null\n\t\t\tthis.opened = false\n\t\t\tthis.provider = null\n\t\t},\n\n\t\t/**\n\t\t * Manages the radio template picker change\n\t\t *\n\t\t * @param {number} fileid the selected template file id\n\t\t */\n\t\tonCheck(fileid) {\n\t\t\tthis.checked = fileid\n\t\t},\n\n\t\tasync onSubmit() {\n\t\t\tthis.loading = true\n\t\t\tconst currentDirectory = getCurrentDirectory()\n\t\t\tconst fileList = OCA?.Files?.App?.currentFileList\n\n\t\t\t// If the file doesn't have an extension, add the default one\n\t\t\tif (this.nameWithoutExt === this.name) {\n\t\t\t\tthis.logger.debug('Fixed invalid filename', { name: this.name, extension: this.provider?.extension })\n\t\t\t\tthis.name = this.name + this.provider?.extension\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst fileInfo = await createFromTemplate(\n\t\t\t\t\tnormalize(`${currentDirectory}/${this.name}`),\n\t\t\t\t\tthis.selectedTemplate?.filename,\n\t\t\t\t\tthis.selectedTemplate?.templateType,\n\t\t\t\t)\n\t\t\t\tthis.logger.debug('Created new file', fileInfo)\n\n\t\t\t\t// Fetch FileInfo and model\n\t\t\t\tconst data = await fileList?.addAndFetchFileInfo(this.name).then((status, data) => data)\n\t\t\t\tconst model = new OCA.Files.FileInfoModel(data, {\n\t\t\t\t\tfilesClient: fileList?.filesClient,\n\t\t\t\t})\n\n\t\t\t\t// Run default action\n\t\t\t\tconst fileAction = OCA.Files.fileActions.getDefaultFileAction(fileInfo.mime, 'file', OC.PERMISSION_ALL)\n\t\t\t\tif (fileAction) {\n\t\t\t\t\tfileAction.action(fileInfo.basename, {\n\t\t\t\t\t\t$file: fileList?.findFileEl(this.name),\n\t\t\t\t\t\tdir: currentDirectory,\n\t\t\t\t\t\tfileList,\n\t\t\t\t\t\tfileActions: fileList?.fileActions,\n\t\t\t\t\t\tfileInfoModel: model,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tthis.close()\n\t\t\t} catch (error) {\n\t\t\t\tthis.logger.error('Error while creating the new file from template')\n\t\t\t\tconsole.error(error)\n\t\t\t\tshowError(this.t('files', 'Unable to create new file from template'))\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.templates-picker {\n\t&__form {\n\t\tpadding: calc(var(--margin) * 2);\n\t\t// Will be handled by the buttons\n\t\tpadding-bottom: 0;\n\n\t\th2 {\n\t\t\ttext-align: center;\n\t\t\tfont-weight: bold;\n\t\t\tmargin: var(--margin) 0 calc(var(--margin) * 2);\n\t\t}\n\t}\n\n\t&__list {\n\t\tdisplay: grid;\n\t\tgrid-gap: calc(var(--margin) * 2);\n\t\tgrid-auto-columns: 1fr;\n\t\t// We want maximum 5 columns. Putting 6 as we don't count the grid gap. So it will always be lower than 6\n\t\tmax-width: calc(var(--fullwidth) * 6);\n\t\tgrid-template-columns: repeat(auto-fit, var(--fullwidth));\n\t\t// Make sure all rows are the same height\n\t\tgrid-auto-rows: 1fr;\n\t\t// Center the columns set\n\t\tjustify-content: center;\n\t}\n\n\t&__buttons {\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\tpadding: calc(var(--margin) * 2) var(--margin);\n\t\tposition: sticky;\n\t\tbottom: 0;\n\t\tbackground-image: linear-gradient(0, var(--gradient-main-background));\n\n\t\tbutton, input[type='submit'] {\n\t\t\theight: 44px;\n\t\t}\n\t}\n\n\t// Make sure we're relative for the loading emptycontent on top\n\t::v-deep .modal-container {\n\t\tposition: relative;\n\t}\n\n\t&__loading {\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\tjustify-content: center;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tmargin: 0;\n\t\tbackground-color: var(--color-main-background-translucent);\n\t}\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!./TemplatePicker.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!./TemplatePicker.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!./TemplatePicker.vue?vue&type=style&index=0&id=55dd9121&prod&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!./TemplatePicker.vue?vue&type=style&index=0&id=55dd9121&prod&lang=scss&scoped=true&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./TemplatePicker.vue?vue&type=template&id=55dd9121&scoped=true&\"\nimport script from \"./TemplatePicker.vue?vue&type=script&lang=js&\"\nexport * from \"./TemplatePicker.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TemplatePicker.vue?vue&type=style&index=0&id=55dd9121&prod&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 \"55dd9121\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.opened)?_c('NcModal',{staticClass:\"templates-picker\",attrs:{\"clear-view-delay\":-1,\"size\":\"normal\"},on:{\"close\":_vm.close}},[_c('form',{staticClass:\"templates-picker__form\",style:(_vm.style),on:{\"submit\":function($event){$event.preventDefault();$event.stopPropagation();return _vm.onSubmit.apply(null, arguments)}}},[_c('h2',[_vm._v(_vm._s(_vm.t('files', 'Pick a template for {name}', { name: _vm.nameWithoutExt })))]),_vm._v(\" \"),_c('ul',{staticClass:\"templates-picker__list\"},[_c('TemplatePreview',_vm._b({attrs:{\"checked\":_vm.checked === _vm.emptyTemplate.fileid},on:{\"check\":_vm.onCheck}},'TemplatePreview',_vm.emptyTemplate,false)),_vm._v(\" \"),_vm._l((_vm.provider.templates),function(template){return _c('TemplatePreview',_vm._b({key:template.fileid,attrs:{\"checked\":_vm.checked === template.fileid,\"ratio\":_vm.provider.ratio},on:{\"check\":_vm.onCheck}},'TemplatePreview',template,false))})],2),_vm._v(\" \"),_c('div',{staticClass:\"templates-picker__buttons\"},[_c('button',{on:{\"click\":_vm.close}},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('files', 'Cancel'))+\"\\n\\t\\t\\t\")]),_vm._v(\" \"),_c('input',{staticClass:\"primary\",attrs:{\"type\":\"submit\",\"aria-label\":_vm.t('files', 'Create a new file with the selected template')},domProps:{\"value\":_vm.t('files', 'Create')}})])]),_vm._v(\" \"),(_vm.loading)?_c('NcEmptyContent',{staticClass:\"templates-picker__loading\",attrs:{\"icon\":\"icon-loading\"}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('files', 'Creating file'))+\"\\n\\t\")]):_vm._e()],1):_vm._e()\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Julius Härtl <jus@bitgrid.net>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { getLoggerBuilder } from '@nextcloud/logger'\nimport { loadState } from '@nextcloud/initial-state'\nimport { translate as t, translatePlural as n } from '@nextcloud/l10n'\nimport { generateOcsUrl } from '@nextcloud/router'\nimport { getCurrentDirectory } from './utils/davUtils'\nimport axios from '@nextcloud/axios'\nimport Vue from 'vue'\n\nimport TemplatePickerView from './views/TemplatePicker'\nimport { showError } from '@nextcloud/dialogs'\n\n// Set up logger\nconst logger = getLoggerBuilder()\n\t.setApp('files')\n\t.detectUser()\n\t.build()\n\n// Add translates functions\nVue.mixin({\n\tmethods: {\n\t\tt,\n\t\tn,\n\t},\n})\n\n// Create document root\nconst TemplatePickerRoot = document.createElement('div')\nTemplatePickerRoot.id = 'template-picker'\ndocument.body.appendChild(TemplatePickerRoot)\n\n// Retrieve and init templates\nlet templates = loadState('files', 'templates', [])\nlet templatesPath = loadState('files', 'templates_path', false)\nlogger.debug('Templates providers', templates)\nlogger.debug('Templates folder', { templatesPath })\n\n// Init vue app\nconst View = Vue.extend(TemplatePickerView)\nconst TemplatePicker = new View({\n\tname: 'TemplatePicker',\n\tpropsData: {\n\t\tlogger,\n\t},\n})\nTemplatePicker.$mount('#template-picker')\n\n// Init template engine after load to make sure it's the last injected entry\nwindow.addEventListener('DOMContentLoaded', function() {\n\tif (!templatesPath) {\n\t\tlogger.debug('Templates folder not initialized')\n\t\tconst initTemplatesPlugin = {\n\t\t\tattach(menu) {\n\t\t\t\t// register the new menu entry\n\t\t\t\tmenu.addMenuEntry({\n\t\t\t\t\tid: 'template-init',\n\t\t\t\t\tdisplayName: t('files', 'Set up templates folder'),\n\t\t\t\t\ttemplateName: t('files', 'Templates'),\n\t\t\t\t\ticonClass: 'icon-template-add',\n\t\t\t\t\tfileType: 'file',\n\t\t\t\t\tactionHandler(name) {\n\t\t\t\t\t\tinitTemplatesFolder(name)\n\t\t\t\t\t\tmenu.removeMenuEntry('template-init')\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t\tOC.Plugins.register('OCA.Files.NewFileMenu', initTemplatesPlugin)\n\t}\n})\n\n// Init template files menu\ntemplates.forEach((provider, index) => {\n\tconst newTemplatePlugin = {\n\t\tattach(menu) {\n\t\t\tconst fileList = menu.fileList\n\n\t\t\t// only attach to main file list, public view is not supported yet\n\t\t\tif (fileList.id !== 'files' && fileList.id !== 'files.public') {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// register the new menu entry\n\t\t\tmenu.addMenuEntry({\n\t\t\t\tid: `template-new-${provider.app}-${index}`,\n\t\t\t\tdisplayName: provider.label,\n\t\t\t\ttemplateName: provider.label + provider.extension,\n\t\t\t\ticonClass: provider.iconClass || 'icon-file',\n\t\t\t\tfileType: 'file',\n\t\t\t\tactionHandler(name) {\n\t\t\t\t\tTemplatePicker.open(name, provider)\n\t\t\t\t},\n\t\t\t})\n\t\t},\n\t}\n\tOC.Plugins.register('OCA.Files.NewFileMenu', newTemplatePlugin)\n})\n\n/**\n * Init the template directory\n *\n * @param {string} name the templates folder name\n */\nconst initTemplatesFolder = async function(name) {\n\tconst templatePath = (getCurrentDirectory() + `/${name}`).replace('//', '/')\n\ttry {\n\t\tlogger.debug('Initializing the templates directory', { templatePath })\n\t\tconst response = await axios.post(generateOcsUrl('apps/files/api/v1/templates/path'), {\n\t\t\ttemplatePath,\n\t\t\tcopySystemTemplates: true,\n\t\t})\n\n\t\t// Go to template directory\n\t\tOCA.Files.App.currentFileList.changeDirectory(templatePath, true, true)\n\n\t\ttemplates = response.data.ocs.data.templates\n\t\ttemplatesPath = response.data.ocs.data.template_path\n\t} catch (error) {\n\t\tlogger.error('Unable to initialize the templates directory')\n\t\tshowError(t('files', 'Unable to initialize the templates directory'))\n\t}\n}\n","/*\n * @copyright Copyright (c) 2021 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 { subscribe } from '@nextcloud/event-bus'\n\n(function() {\n\n\tconst FilesPlugin = {\n\t\tattach(fileList) {\n\t\t\tsubscribe('nextcloud:unified-search.search', ({ query }) => {\n\t\t\t\tfileList.setFilter(query)\n\t\t\t})\n\t\t\tsubscribe('nextcloud:unified-search.reset', () => {\n\t\t\t\tthis.query = null\n\t\t\t\tfileList.setFilter('')\n\t\t\t})\n\n\t\t},\n\t}\n\n\twindow.OC.Plugins.register('OCA.Files.FileList', FilesPlugin)\n\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, \".template-picker__item[data-v-440aea22]{display:flex}.template-picker__label[data-v-440aea22]{display:flex;align-items:center;flex:1 1;flex-direction:column}.template-picker__label[data-v-440aea22],.template-picker__label *[data-v-440aea22]{cursor:pointer;user-select:none}.template-picker__label[data-v-440aea22]::before{display:none !important}.template-picker__preview[data-v-440aea22]{display:block;overflow:hidden;flex:1 1;width:var(--width);min-height:var(--height);max-height:var(--height);padding:0;border:var(--border) solid var(--color-border);border-radius:var(--border-radius-large)}input:checked+label>.template-picker__preview[data-v-440aea22]{border-color:var(--color-primary)}.template-picker__preview--failed[data-v-440aea22]{display:flex}.template-picker__image[data-v-440aea22]{max-width:100%;background-color:var(--color-main-background);object-fit:cover}.template-picker__preview--failed .template-picker__image[data-v-440aea22]{width:calc(var(--margin)*8);margin:auto;background-color:rgba(0,0,0,0) !important;object-fit:initial}.template-picker__title[data-v-440aea22]{overflow:hidden;max-width:calc(var(--width) + 4px);padding:var(--margin);white-space:nowrap;text-overflow:ellipsis}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/components/TemplatePreview.vue\"],\"names\":[],\"mappings\":\"AAGC,wCACC,YAAA,CAGD,yCACC,YAAA,CAEA,kBAAA,CACA,QAAA,CACA,qBAAA,CAEA,oFACC,cAAA,CACA,gBAAA,CAGD,iDACC,uBAAA,CAIF,2CACC,aAAA,CACA,eAAA,CAEA,QAAA,CACA,kBAAA,CACA,wBAAA,CACA,wBAAA,CACA,SAAA,CACA,8CAAA,CACA,wCAAA,CAEA,+DACC,iCAAA,CAGD,mDAEC,YAAA,CAIF,yCACC,cAAA,CACA,6CAAA,CAEA,gBAAA,CAID,2EACC,2BAAA,CAEA,WAAA,CACA,yCAAA,CAEA,kBAAA,CAGD,yCACC,eAAA,CAEA,kCAAA,CACA,qBAAA,CACA,kBAAA,CACA,sBAAA\",\"sourcesContent\":[\"\\n\\n.template-picker {\\n\\t&__item {\\n\\t\\tdisplay: flex;\\n\\t}\\n\\n\\t&__label {\\n\\t\\tdisplay: flex;\\n\\t\\t// Align in the middle of the grid\\n\\t\\talign-items: center;\\n\\t\\tflex: 1 1;\\n\\t\\tflex-direction: column;\\n\\n\\t\\t&, * {\\n\\t\\t\\tcursor: pointer;\\n\\t\\t\\tuser-select: none;\\n\\t\\t}\\n\\n\\t\\t&::before {\\n\\t\\t\\tdisplay: none !important;\\n\\t\\t}\\n\\t}\\n\\n\\t&__preview {\\n\\t\\tdisplay: block;\\n\\t\\toverflow: hidden;\\n\\t\\t// Stretch so all entries are the same width\\n\\t\\tflex: 1 1;\\n\\t\\twidth: var(--width);\\n\\t\\tmin-height: var(--height);\\n\\t\\tmax-height: var(--height);\\n\\t\\tpadding: 0;\\n\\t\\tborder: var(--border) solid var(--color-border);\\n\\t\\tborder-radius: var(--border-radius-large);\\n\\n\\t\\tinput:checked + label > & {\\n\\t\\t\\tborder-color: var(--color-primary);\\n\\t\\t}\\n\\n\\t\\t&--failed {\\n\\t\\t\\t// Make sure to properly center fallback icon\\n\\t\\t\\tdisplay: flex;\\n\\t\\t}\\n\\t}\\n\\n\\t&__image {\\n\\t\\tmax-width: 100%;\\n\\t\\tbackground-color: var(--color-main-background);\\n\\n\\t\\tobject-fit: cover;\\n\\t}\\n\\n\\t// Failed preview, fallback to mime icon\\n\\t&__preview--failed &__image {\\n\\t\\twidth: calc(var(--margin) * 8);\\n\\t\\t// Center mime icon\\n\\t\\tmargin: auto;\\n\\t\\tbackground-color: transparent !important;\\n\\n\\t\\tobject-fit: initial;\\n\\t}\\n\\n\\t&__title {\\n\\t\\toverflow: hidden;\\n\\t\\t// also count preview border\\n\\t\\tmax-width: calc(var(--width) + 2*2px);\\n\\t\\tpadding: var(--margin);\\n\\t\\twhite-space: nowrap;\\n\\t\\ttext-overflow: ellipsis;\\n\\t}\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".templates-picker__form[data-v-55dd9121]{padding:calc(var(--margin)*2);padding-bottom:0}.templates-picker__form h2[data-v-55dd9121]{text-align:center;font-weight:bold;margin:var(--margin) 0 calc(var(--margin)*2)}.templates-picker__list[data-v-55dd9121]{display:grid;grid-gap:calc(var(--margin)*2);grid-auto-columns:1fr;max-width:calc(var(--fullwidth)*6);grid-template-columns:repeat(auto-fit, var(--fullwidth));grid-auto-rows:1fr;justify-content:center}.templates-picker__buttons[data-v-55dd9121]{display:flex;justify-content:space-between;padding:calc(var(--margin)*2) var(--margin);position:sticky;bottom:0;background-image:linear-gradient(0, var(--gradient-main-background))}.templates-picker__buttons button[data-v-55dd9121],.templates-picker__buttons input[type=submit][data-v-55dd9121]{height:44px}.templates-picker[data-v-55dd9121] .modal-container{position:relative}.templates-picker__loading[data-v-55dd9121]{position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;margin:0;background-color:var(--color-main-background-translucent)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files/src/views/TemplatePicker.vue\"],\"names\":[],\"mappings\":\"AAEC,yCACC,6BAAA,CAEA,gBAAA,CAEA,4CACC,iBAAA,CACA,gBAAA,CACA,4CAAA,CAIF,yCACC,YAAA,CACA,8BAAA,CACA,qBAAA,CAEA,kCAAA,CACA,wDAAA,CAEA,kBAAA,CAEA,sBAAA,CAGD,4CACC,YAAA,CACA,6BAAA,CACA,2CAAA,CACA,eAAA,CACA,QAAA,CACA,oEAAA,CAEA,kHACC,WAAA,CAKF,oDACC,iBAAA,CAGD,4CACC,iBAAA,CACA,KAAA,CACA,MAAA,CACA,sBAAA,CACA,UAAA,CACA,WAAA,CACA,QAAA,CACA,yDAAA\",\"sourcesContent\":[\"\\n.templates-picker {\\n\\t&__form {\\n\\t\\tpadding: calc(var(--margin) * 2);\\n\\t\\t// Will be handled by the buttons\\n\\t\\tpadding-bottom: 0;\\n\\n\\t\\th2 {\\n\\t\\t\\ttext-align: center;\\n\\t\\t\\tfont-weight: bold;\\n\\t\\t\\tmargin: var(--margin) 0 calc(var(--margin) * 2);\\n\\t\\t}\\n\\t}\\n\\n\\t&__list {\\n\\t\\tdisplay: grid;\\n\\t\\tgrid-gap: calc(var(--margin) * 2);\\n\\t\\tgrid-auto-columns: 1fr;\\n\\t\\t// We want maximum 5 columns. Putting 6 as we don't count the grid gap. So it will always be lower than 6\\n\\t\\tmax-width: calc(var(--fullwidth) * 6);\\n\\t\\tgrid-template-columns: repeat(auto-fit, var(--fullwidth));\\n\\t\\t// Make sure all rows are the same height\\n\\t\\tgrid-auto-rows: 1fr;\\n\\t\\t// Center the columns set\\n\\t\\tjustify-content: center;\\n\\t}\\n\\n\\t&__buttons {\\n\\t\\tdisplay: flex;\\n\\t\\tjustify-content: space-between;\\n\\t\\tpadding: calc(var(--margin) * 2) var(--margin);\\n\\t\\tposition: sticky;\\n\\t\\tbottom: 0;\\n\\t\\tbackground-image: linear-gradient(0, var(--gradient-main-background));\\n\\n\\t\\tbutton, input[type='submit'] {\\n\\t\\t\\theight: 44px;\\n\\t\\t}\\n\\t}\\n\\n\\t// Make sure we're relative for the loading emptycontent on top\\n\\t::v-deep .modal-container {\\n\\t\\tposition: relative;\\n\\t}\\n\\n\\t&__loading {\\n\\t\\tposition: absolute;\\n\\t\\ttop: 0;\\n\\t\\tleft: 0;\\n\\t\\tjustify-content: center;\\n\\t\\twidth: 100%;\\n\\t\\theight: 100%;\\n\\t\\tmargin: 0;\\n\\t\\tbackground-color: var(--color-main-background-translucent);\\n\\t}\\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 = 2181;","__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\t2181: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [7874], function() { return __webpack_require__(64382); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","Settings","this","_settings","console","debug","view","filter","e","name","length","error","push","_c","_self","_vm","attrs","_l","settings","setting","key","el","Setting","open","close","_name","_el","_open","_close","Vue","t","window","OCA","Files","Object","assign","addEventListener","TESTING","render","h","SettingsView","appSettingsHeader","document","getElementById","opened","currentTarget","children","classList","contains","forEach","setAttribute","getCurrentDirectory","currentDirInfo","App","currentFileList","dirInfo","path","replace","getTemplates","axios","generateOcsUrl","response","data","ocs","createFromTemplate","filePath","templatePath","templateType","getCurrentUser","value","pathSections","startsWith","split","relativePath","section","encodeURIComponent","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","staticClass","id","domProps","checked","on","onCheck","_v","class","failedPreview","realPreviewUrl","onFailure","_s","nameWithoutExt","style","$event","preventDefault","stopPropagation","onSubmit","apply","arguments","_b","emptyTemplate","fileid","provider","templates","template","ratio","loading","_e","logger","getLoggerBuilder","setApp","detectUser","build","methods","n","TemplatePickerRoot","createElement","body","appendChild","loadState","templatesPath","TemplatePicker","TemplatePickerView","propsData","$mount","initTemplatesPlugin","attach","menu","addMenuEntry","displayName","templateName","iconClass","fileType","actionHandler","initTemplatesFolder","removeMenuEntry","OC","Plugins","register","index","newTemplatePlugin","fileList","app","label","extension","FilesPlugin","copySystemTemplates","changeDirectory","template_path","showError","subscribe","query","setFilter","___CSS_LOADER_EXPORT___","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","fulfilled","j","keys","every","splice","r","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","nmd","paths","b","baseURI","self","location","href","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","bind","nc","__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 b19ba18d38d..bd2e96a177f 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -1568,6 +1568,7 @@ return array( 'OC\\SystemTag\\SystemTag' => $baseDir . '/lib/private/SystemTag/SystemTag.php', 'OC\\SystemTag\\SystemTagManager' => $baseDir . '/lib/private/SystemTag/SystemTagManager.php', 'OC\\SystemTag\\SystemTagObjectMapper' => $baseDir . '/lib/private/SystemTag/SystemTagObjectMapper.php', + 'OC\\SystemTag\\SystemTagsInFilesDetector' => $baseDir . '/lib/private/SystemTag/SystemTagsInFilesDetector.php', 'OC\\TagManager' => $baseDir . '/lib/private/TagManager.php', 'OC\\Tagging\\Tag' => $baseDir . '/lib/private/Tagging/Tag.php', 'OC\\Tagging\\TagMapper' => $baseDir . '/lib/private/Tagging/TagMapper.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index 0babc7697e9..ffddd772352 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -1601,6 +1601,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2 'OC\\SystemTag\\SystemTag' => __DIR__ . '/../../..' . '/lib/private/SystemTag/SystemTag.php', 'OC\\SystemTag\\SystemTagManager' => __DIR__ . '/../../..' . '/lib/private/SystemTag/SystemTagManager.php', 'OC\\SystemTag\\SystemTagObjectMapper' => __DIR__ . '/../../..' . '/lib/private/SystemTag/SystemTagObjectMapper.php', + 'OC\\SystemTag\\SystemTagsInFilesDetector' => __DIR__ . '/../../..' . '/lib/private/SystemTag/SystemTagsInFilesDetector.php', 'OC\\TagManager' => __DIR__ . '/../../..' . '/lib/private/TagManager.php', 'OC\\Tagging\\Tag' => __DIR__ . '/../../..' . '/lib/private/Tagging/Tag.php', 'OC\\Tagging\\TagMapper' => __DIR__ . '/../../..' . '/lib/private/Tagging/TagMapper.php', diff --git a/lib/private/Avatar/AvatarManager.php b/lib/private/Avatar/AvatarManager.php index ec9bed40850..191a80cb5cc 100644 --- a/lib/private/Avatar/AvatarManager.php +++ b/lib/private/Avatar/AvatarManager.php @@ -161,13 +161,8 @@ class AvatarManager implements IAvatarManager { public function clearCachedAvatars() { $users = $this->config->getUsersForUserValue('avatar', 'generated', 'true'); foreach ($users as $userId) { - try { - $folder = $this->appData->getFolder($userId); - $folder->delete(); - } catch (NotFoundException $e) { - $this->logger->debug("No cache for the user $userId. Ignoring..."); - } - $this->config->setUserValue($userId, 'avatar', 'generated', 'false'); + // This also bumps the avatar version leading to cache invalidation in browsers + $this->getAvatar($userId)->remove(); } } diff --git a/lib/private/Files/Cache/CacheQueryBuilder.php b/lib/private/Files/Cache/CacheQueryBuilder.php index 496a8361d77..34d2177b84e 100644 --- a/lib/private/Files/Cache/CacheQueryBuilder.php +++ b/lib/private/Files/Cache/CacheQueryBuilder.php @@ -41,8 +41,27 @@ class CacheQueryBuilder extends QueryBuilder { parent::__construct($connection, $systemConfig, $logger); } + public function selectTagUsage(): self { + $this + ->select('systemtag.name', 'systemtag.id', 'systemtag.visibility', 'systemtag.editable') + ->selectAlias($this->createFunction('COUNT(filecache.fileid)'), 'number_files') + ->selectAlias($this->createFunction('MAX(filecache.fileid)'), 'ref_file_id') + ->from('filecache', 'filecache') + ->leftJoin('filecache', 'systemtag_object_mapping', 'systemtagmap', $this->expr()->andX( + $this->expr()->eq('filecache.fileid', $this->expr()->castColumn('systemtagmap.objectid', IQueryBuilder::PARAM_INT)), + $this->expr()->eq('systemtagmap.objecttype', $this->createNamedParameter('files')) + )) + ->leftJoin('systemtagmap', 'systemtag', 'systemtag', $this->expr()->andX( + $this->expr()->eq('systemtag.id', 'systemtagmap.systemtagid'), + $this->expr()->eq('systemtag.visibility', $this->createNamedParameter(true)) + )) + ->groupBy('systemtag.name', 'systemtag.id', 'systemtag.visibility', 'systemtag.editable'); + + return $this; + } + public function selectFileCache(string $alias = null, bool $joinExtendedCache = true) { - $name = $alias ? $alias : 'filecache'; + $name = $alias ?: 'filecache'; $this->select("$name.fileid", 'storage', 'path', 'path_hash', "$name.parent", "$name.name", 'mimetype', 'mimepart', 'size', 'mtime', 'storage_mtime', 'encrypted', 'etag', 'permissions', 'checksum', 'unencrypted_size') ->from('filecache', $name); diff --git a/lib/private/Files/Cache/QuerySearchHelper.php b/lib/private/Files/Cache/QuerySearchHelper.php index 3529ede9746..695fbcd0717 100644 --- a/lib/private/Files/Cache/QuerySearchHelper.php +++ b/lib/private/Files/Cache/QuerySearchHelper.php @@ -25,13 +25,17 @@ */ namespace OC\Files\Cache; +use OC\Files\Cache\Wrapper\CacheJail; +use OC\Files\Node\Root; use OC\Files\Search\QueryOptimizer\QueryOptimizer; use OC\Files\Search\SearchBinaryOperator; use OC\SystemConfig; use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\Files\Cache\ICache; use OCP\Files\Cache\ICacheEntry; +use OCP\Files\Folder; use OCP\Files\IMimeTypeLoader; +use OCP\Files\Mount\IMountPoint; use OCP\Files\Search\ISearchBinaryOperator; use OCP\Files\Search\ISearchQuery; use OCP\IDBConnection; @@ -75,6 +79,45 @@ class QuerySearchHelper { ); } + protected function applySearchConstraints(CacheQueryBuilder $query, ISearchQuery $searchQuery, array $caches): void { + $storageFilters = array_values(array_map(function (ICache $cache) { + return $cache->getQueryFilterForStorage(); + }, $caches)); + $storageFilter = new SearchBinaryOperator(ISearchBinaryOperator::OPERATOR_OR, $storageFilters); + $filter = new SearchBinaryOperator(ISearchBinaryOperator::OPERATOR_AND, [$searchQuery->getSearchOperation(), $storageFilter]); + $this->queryOptimizer->processOperator($filter); + + $searchExpr = $this->searchBuilder->searchOperatorToDBExpr($query, $filter); + if ($searchExpr) { + $query->andWhere($searchExpr); + } + + $this->searchBuilder->addSearchOrdersToQuery($query, $searchQuery->getOrder()); + + if ($searchQuery->getLimit()) { + $query->setMaxResults($searchQuery->getLimit()); + } + if ($searchQuery->getOffset()) { + $query->setFirstResult($searchQuery->getOffset()); + } + } + + + /** + * @return array<array-key, array{id: int, name: string, visibility: int, editable: int, ref_file_id: int, number_files: int}> + */ + public function findUsedTagsInCaches(ISearchQuery $searchQuery, array $caches): array { + $query = $this->getQueryBuilder(); + $query->selectTagUsage(); + + $this->applySearchConstraints($query, $searchQuery, $caches); + + $result = $query->execute(); + $tags = $result->fetchAll(); + $result->closeCursor(); + return $tags; + } + /** * Perform a file system search in multiple caches * @@ -128,26 +171,7 @@ class QuerySearchHelper { )); } - $storageFilters = array_values(array_map(function (ICache $cache) { - return $cache->getQueryFilterForStorage(); - }, $caches)); - $storageFilter = new SearchBinaryOperator(ISearchBinaryOperator::OPERATOR_OR, $storageFilters); - $filter = new SearchBinaryOperator(ISearchBinaryOperator::OPERATOR_AND, [$searchQuery->getSearchOperation(), $storageFilter]); - $this->queryOptimizer->processOperator($filter); - - $searchExpr = $this->searchBuilder->searchOperatorToDBExpr($builder, $filter); - if ($searchExpr) { - $query->andWhere($searchExpr); - } - - $this->searchBuilder->addSearchOrdersToQuery($query, $searchQuery->getOrder()); - - if ($searchQuery->getLimit()) { - $query->setMaxResults($searchQuery->getLimit()); - } - if ($searchQuery->getOffset()) { - $query->setFirstResult($searchQuery->getOffset()); - } + $this->applySearchConstraints($query, $searchQuery, $caches); $result = $query->execute(); $files = $result->fetchAll(); @@ -159,7 +183,7 @@ class QuerySearchHelper { $result->closeCursor(); // loop through all caches for each result to see if the result matches that storage - // results are grouped by the same array keys as the caches argument to allow the caller to distringuish the source of the results + // results are grouped by the same array keys as the caches argument to allow the caller to distinguish the source of the results $results = array_fill_keys(array_keys($caches), []); foreach ($rawEntries as $rawEntry) { foreach ($caches as $cacheKey => $cache) { @@ -171,4 +195,37 @@ class QuerySearchHelper { } return $results; } + + /** + * @return array{array<string, ICache>, array<string, IMountPoint>} + */ + public function getCachesAndMountPointsForSearch(Root $root, string $path, bool $limitToHome = false): array { + $rootLength = strlen($path); + $mount = $root->getMount($path); + $storage = $mount->getStorage(); + $internalPath = $mount->getInternalPath($path); + + if ($internalPath !== '') { + // a temporary CacheJail is used to handle filtering down the results to within this folder + $caches = ['' => new CacheJail($storage->getCache(''), $internalPath)]; + } else { + $caches = ['' => $storage->getCache('')]; + } + $mountByMountPoint = ['' => $mount]; + + if (!$limitToHome) { + /** @var IMountPoint[] $mounts */ + $mounts = $root->getMountsIn($path); + foreach ($mounts as $mount) { + $storage = $mount->getStorage(); + if ($storage) { + $relativeMountPoint = ltrim(substr($mount->getMountPoint(), $rootLength), '/'); + $caches[$relativeMountPoint] = $storage->getCache(''); + $mountByMountPoint[$relativeMountPoint] = $mount; + } + } + } + + return [$caches, $mountByMountPoint]; + } } diff --git a/lib/private/Files/Node/Folder.php b/lib/private/Files/Node/Folder.php index bf9ae3c148d..e6bae29807d 100644 --- a/lib/private/Files/Node/Folder.php +++ b/lib/private/Files/Node/Folder.php @@ -32,7 +32,6 @@ namespace OC\Files\Node; use OC\Files\Cache\QuerySearchHelper; use OC\Files\Search\SearchBinaryOperator; -use OC\Files\Cache\Wrapper\CacheJail; use OC\Files\Search\SearchComparison; use OC\Files\Search\SearchOrder; use OC\Files\Search\SearchQuery; @@ -203,7 +202,7 @@ class Folder extends Node implements \OCP\Files\Folder { throw new NotPermittedException('No create permission for path'); } - private function queryFromOperator(ISearchOperator $operator, string $uid = null): ISearchQuery { + private function queryFromOperator(ISearchOperator $operator, string $uid = null, int $limit = 0, int $offset = 0): ISearchQuery { if ($uid === null) { $user = null; } else { @@ -211,7 +210,7 @@ class Folder extends Node implements \OCP\Files\Folder { $userManager = \OC::$server->query(IUserManager::class); $user = $userManager->get($uid); } - return new SearchQuery($operator, 0, 0, [], $user); + return new SearchQuery($operator, $limit, $offset, [], $user); } /** @@ -233,40 +232,13 @@ class Folder extends Node implements \OCP\Files\Folder { throw new \InvalidArgumentException('searching by owner is only allows on the users home folder'); } - $rootLength = strlen($this->path); - $mount = $this->root->getMount($this->path); - $storage = $mount->getStorage(); - $internalPath = $mount->getInternalPath($this->path); - - // collect all caches for this folder, indexed by their mountpoint relative to this folder - // and save the mount which is needed later to construct the FileInfo objects - - if ($internalPath !== '') { - // a temporary CacheJail is used to handle filtering down the results to within this folder - $caches = ['' => new CacheJail($storage->getCache(''), $internalPath)]; - } else { - $caches = ['' => $storage->getCache('')]; - } - $mountByMountPoint = ['' => $mount]; - - if (!$limitToHome) { - $mounts = $this->root->getMountsIn($this->path); - foreach ($mounts as $mount) { - $storage = $mount->getStorage(); - if ($storage) { - $relativeMountPoint = ltrim(substr($mount->getMountPoint(), $rootLength), '/'); - $caches[$relativeMountPoint] = $storage->getCache(''); - $mountByMountPoint[$relativeMountPoint] = $mount; - } - } - } - /** @var QuerySearchHelper $searchHelper */ $searchHelper = \OC::$server->get(QuerySearchHelper::class); + [$caches, $mountByMountPoint] = $searchHelper->getCachesAndMountPointsForSearch($this->root, $this->path, $limitToHome); $resultsPerCache = $searchHelper->searchInCaches($query, $caches); // loop through all results per-cache, constructing the FileInfo object from the CacheEntry and merge them all - $files = array_merge(...array_map(function (array $results, $relativeMountPoint) use ($mountByMountPoint) { + $files = array_merge(...array_map(function (array $results, string $relativeMountPoint) use ($mountByMountPoint) { $mount = $mountByMountPoint[$relativeMountPoint]; return array_map(function (ICacheEntry $result) use ($relativeMountPoint, $mount) { return $this->cacheEntryToFileInfo($mount, $relativeMountPoint, $result); diff --git a/lib/private/Files/Storage/Common.php b/lib/private/Files/Storage/Common.php index 36281d74cf5..541a28a4cd8 100644 --- a/lib/private/Files/Storage/Common.php +++ b/lib/private/Files/Storage/Common.php @@ -207,6 +207,9 @@ abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage { public function file_put_contents($path, $data) { $handle = $this->fopen($path, "w"); + if (!$handle) { + return false; + } $this->removeCachedFile($path); $count = fwrite($handle, $data); fclose($handle); diff --git a/lib/private/IntegrityCheck/Checker.php b/lib/private/IntegrityCheck/Checker.php index ba555cff438..3ec117df997 100644 --- a/lib/private/IntegrityCheck/Checker.php +++ b/lib/private/IntegrityCheck/Checker.php @@ -439,7 +439,7 @@ class Checker { */ public function getResults(): array { $cachedResults = $this->cache->get(self::CACHE_KEY); - if (!\is_null($cachedResults)) { + if (!\is_null($cachedResults) and $cachedResults !== false) { return json_decode($cachedResults, true); } diff --git a/lib/private/Profiler/FileProfilerStorage.php b/lib/private/Profiler/FileProfilerStorage.php index d583549332e..b68038a65c4 100644 --- a/lib/private/Profiler/FileProfilerStorage.php +++ b/lib/private/Profiler/FileProfilerStorage.php @@ -99,7 +99,7 @@ class FileProfilerStorage { $iterator = new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::CHILD_FIRST); foreach ($iterator as $file) { - $file = $file->getPathInfo(); + $file = (string)$file->getPathInfo(); if (is_file($file)) { unlink($file); } else { diff --git a/lib/private/Repair/ClearGeneratedAvatarCache.php b/lib/private/Repair/ClearGeneratedAvatarCache.php index db86d92cd87..930ccae1827 100644 --- a/lib/private/Repair/ClearGeneratedAvatarCache.php +++ b/lib/private/Repair/ClearGeneratedAvatarCache.php @@ -42,7 +42,7 @@ class ClearGeneratedAvatarCache implements IRepairStep { } public function getName(): string { - return 'Clear every generated avatar on major updates'; + return 'Clear every generated avatar'; } /** @@ -51,8 +51,9 @@ class ClearGeneratedAvatarCache implements IRepairStep { private function shouldRun(): bool { $versionFromBeforeUpdate = $this->config->getSystemValue('version', '0.0.0.0'); - // was added to 25.0.0.10 - return version_compare($versionFromBeforeUpdate, '25.0.0.10', '<='); + // This job only runs if the server was on a version lower than or equal to 25.0.7 before the upgrade. + // To clear the avatar cache again, bump the version to the currently released version (and change the operator to <= if it's not the master branch) and wait for the next release. + return version_compare($versionFromBeforeUpdate, '25.0.7', '<'); } public function run(IOutput $output): void { diff --git a/lib/private/Security/CertificateManager.php b/lib/private/Security/CertificateManager.php index fa26c19ceae..6db12f9016b 100644 --- a/lib/private/Security/CertificateManager.php +++ b/lib/private/Security/CertificateManager.php @@ -147,6 +147,10 @@ class CertificateManager implements ICertificateManager { $tmpPath = $certPath . '.tmp' . $this->random->generate(10, ISecureRandom::CHAR_DIGITS); $fhCerts = $this->view->fopen($tmpPath, 'w'); + if (!is_resource($fhCerts)) { + throw new \RuntimeException('Unable to open file handler to create certificate bundle "' . $tmpPath . '".'); + } + // Write user certificates foreach ($certs as $cert) { $file = $path . '/uploads/' . $cert->getName(); @@ -238,7 +242,7 @@ class CertificateManager implements ICertificateManager { */ public function getAbsoluteBundlePath(): string { try { - if (!$this->bundlePath) { + if ($this->bundlePath === null) { if (!$this->hasCertificates()) { $this->bundlePath = \OC::$SERVERROOT . '/resources/config/ca-bundle.crt'; } @@ -247,10 +251,16 @@ class CertificateManager implements ICertificateManager { $this->createCertificateBundle(); } - $this->bundlePath = $this->view->getLocalFile($this->getCertificateBundle()); + $certificateBundle = $this->getCertificateBundle(); + $this->bundlePath = $this->view->getLocalFile($certificateBundle) ?: null; + + if ($this->bundlePath === null) { + throw new \RuntimeException('Unable to get certificate bundle "' . $certificateBundle . '".'); + } } return $this->bundlePath; } catch (\Exception $e) { + $this->logger->error('Failed to get absolute bundle path. Fallback to default ca-bundle.crt', ['exception' => $e]); return \OC::$SERVERROOT . '/resources/config/ca-bundle.crt'; } } diff --git a/lib/private/SystemTag/SystemTagsInFilesDetector.php b/lib/private/SystemTag/SystemTagsInFilesDetector.php new file mode 100644 index 00000000000..a214bd77e7b --- /dev/null +++ b/lib/private/SystemTag/SystemTagsInFilesDetector.php @@ -0,0 +1,75 @@ +<?php + +declare(strict_types=1); + +/** + * @copyright Copyright (c) 2023 Arthur Schiwon <blizzz@arthur-schiwon.de> + * + * @author Arthur Schiwon <blizzz@arthur-schiwon.de> + * + * @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 <https://www.gnu.org/licenses/>. + * + */ + +namespace OC\SystemTag; + +use OC\Files\Cache\QuerySearchHelper; +use OC\Files\Node\Root; +use OC\Files\Search\SearchBinaryOperator; +use OC\Files\Search\SearchComparison; +use OC\Files\Search\SearchQuery; +use OCP\Files\Folder; +use OCP\Files\Search\ISearchBinaryOperator; +use OCP\Files\Search\ISearchComparison; + +class SystemTagsInFilesDetector { + protected QuerySearchHelper $searchHelper; + + public function __construct(QuerySearchHelper $searchHelper) { + $this->searchHelper = $searchHelper; + } + + public function detectAssignedSystemTagsIn( + Folder $folder, + string $filteredMediaType = '', + int $limit = 0, + int $offset = 0 + ): array { + $operator = new SearchComparison(ISearchComparison::COMPARE_LIKE, 'systemtag', '%'); + // Currently query has to have exactly one search condition. If no media type is provided, + // we fall back to the presence of a system tag. + if ($filteredMediaType !== '') { + $mimeOperator = new SearchComparison(ISearchComparison::COMPARE_LIKE, 'mimetype', $filteredMediaType . '/%'); + $operator = new SearchBinaryOperator(ISearchBinaryOperator::OPERATOR_AND, [$operator, $mimeOperator]); + } + + $query = new SearchQuery($operator, $limit, $offset, []); + [$caches, ] = $this->searchHelper->getCachesAndMountPointsForSearch( + $this->getRootFolder($folder), + $folder->getPath(), + ); + return $this->searchHelper->findUsedTagsInCaches($query, $caches); + } + + protected function getRootFolder(?Folder $folder): Root { + if ($folder instanceof Root) { + return $folder; + } elseif ($folder === null) { + throw new \LogicException('Could not climb up to root folder'); + } + return $this->getRootFolder($folder->getParent()); + } +} |