diff --git a/appinfo/routes.php b/appinfo/routes.php index 638f1bf4..261ce7b8 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -38,6 +38,14 @@ return [ 'path' => '', ] ], + ['name' => 'page#index', 'url' => '/folders/{path}', 'verb' => 'GET', 'postfix' => 'folders', + 'requirements' => [ + 'path' => '.*', + ], + 'defaults' => [ + 'path' => '', + ] + ], ['name' => 'page#index', 'url' => '/shared/{path}', 'verb' => 'GET', 'postfix' => 'shared', 'requirements' => [ 'path' => '.*', diff --git a/composer.json b/composer.json index 2b2a5efb..955f5b0a 100644 --- a/composer.json +++ b/composer.json @@ -17,6 +17,11 @@ "require-dev": { "nextcloud/coding-standard": "^0.5.0", "phpunit/phpunit": "^9", - "vimeo/psalm": "^4.22" + "vimeo/psalm": "^4.22", + "christophwurst/nextcloud": "dev-master", + "sabre/dav": "^4.2.1" + }, + "require": { + "doctrine/dbal": "^3.4" } } diff --git a/composer.lock b/composer.lock index d9294fb0..124181f0 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,446 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "99694b1f41a62a2f304c2315774b0fbe", - "packages": [], + "content-hash": "7afcdcaecba8998e1cb6fb2f764b01be", + "packages": [ + { + "name": "doctrine/cache", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", + "shasum": "" + }, + "require": { + "php": "~7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^9", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "symfony/cache": "^4.4 || ^5.4 || ^6", + "symfony/var-exporter": "^4.4 || ^5.4 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", + "homepage": "https://www.doctrine-project.org/projects/cache.html", + "keywords": [ + "abstraction", + "apcu", + "cache", + "caching", + "couchdb", + "memcached", + "php", + "redis", + "xcache" + ], + "support": { + "issues": "https://github.com/doctrine/cache/issues", + "source": "https://github.com/doctrine/cache/tree/2.2.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", + "type": "tidelift" + } + ], + "time": "2022-05-20T20:07:39+00:00" + }, + { + "name": "doctrine/dbal", + "version": "3.4.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "22de295f10edbe00df74f517612f1fbd711131e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/22de295f10edbe00df74f517612f1fbd711131e2", + "reference": "22de295f10edbe00df74f517612f1fbd711131e2", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2", + "doctrine/cache": "^1.11|^2.0", + "doctrine/deprecations": "^0.5.3|^1", + "doctrine/event-manager": "^1.0", + "php": "^7.4 || ^8.0", + "psr/cache": "^1|^2|^3", + "psr/log": "^1|^2|^3" + }, + "require-dev": { + "doctrine/coding-standard": "9.0.0", + "jetbrains/phpstorm-stubs": "2022.1", + "phpstan/phpstan": "1.8.2", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "9.5.21", + "psalm/plugin-phpunit": "0.17.0", + "squizlabs/php_codesniffer": "3.7.1", + "symfony/cache": "^5.4|^6.0", + "symfony/console": "^4.4|^5.4|^6.0", + "vimeo/psalm": "4.24.0" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "bin": [ + "bin/doctrine-dbal" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "keywords": [ + "abstraction", + "database", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlite", + "sqlserver", + "sqlsrv" + ], + "support": { + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/3.4.2" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", + "type": "tidelift" + } + ], + "time": "2022-08-21T14:21:06+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", + "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", + "shasum": "" + }, + "require": { + "php": "^7.1|^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpunit/phpunit": "^7.5|^8.5|^9.5", + "psr/log": "^1|^2|^3" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/v1.0.0" + }, + "time": "2022-05-02T15:47:09+00:00" + }, + { + "name": "doctrine/event-manager", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/event-manager.git", + "reference": "eb2ecf80e3093e8f3c2769ac838e27d8ede8e683" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/eb2ecf80e3093e8f3c2769ac838e27d8ede8e683", + "reference": "eb2ecf80e3093e8f3c2769ac838e27d8ede8e683", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": "<2.9" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "~1.4.10 || ^1.5.4", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.22" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", + "keywords": [ + "event", + "event dispatcher", + "event manager", + "event system", + "events" + ], + "support": { + "issues": "https://github.com/doctrine/event-manager/issues", + "source": "https://github.com/doctrine/event-manager/tree/1.1.2" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", + "type": "tidelift" + } + ], + "time": "2022-07-27T22:18:11+00:00" + }, + { + "name": "psr/cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/master" + }, + "time": "2016-08-06T20:24:11+00:00" + }, + { + "name": "psr/log", + "version": "1.1.4", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.4" + }, + "time": "2021-05-03T11:20:27+00:00" + } + ], "packages-dev": [ { "name": "amphp/amp", @@ -173,6 +611,50 @@ ], "time": "2021-03-30T17:13:30+00:00" }, + { + "name": "christophwurst/nextcloud", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/ChristophWurst/nextcloud_composer.git", + "reference": "ddec3f878b3b71d4f763865dacc95a1d058e5d66" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ChristophWurst/nextcloud_composer/zipball/ddec3f878b3b71d4f763865dacc95a1d058e5d66", + "reference": "ddec3f878b3b71d4f763865dacc95a1d058e5d66", + "shasum": "" + }, + "require": { + "php": "^7.4 || ~8.0 || ~8.1", + "psr/container": "^1.1.1", + "psr/event-dispatcher": "^1.0", + "psr/log": "^1.1" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "25.0.0-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "AGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Christoph Wurst", + "email": "christoph@winzerhof-wurst.at" + } + ], + "description": "Composer package containing Nextcloud's public API (classes, interfaces)", + "support": { + "issues": "https://github.com/ChristophWurst/nextcloud_composer/issues", + "source": "https://github.com/ChristophWurst/nextcloud_composer/tree/master" + }, + "time": "2022-08-22T09:23:37+00:00" + }, { "name": "composer/package-versions-deprecated", "version": "1.11.99.5", @@ -503,16 +985,16 @@ }, { "name": "doctrine/annotations", - "version": "1.13.2", + "version": "1.13.3", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "5b668aef16090008790395c02c893b1ba13f7e08" + "reference": "648b0343343565c4a056bfc8392201385e8d89f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/5b668aef16090008790395c02c893b1ba13f7e08", - "reference": "5b668aef16090008790395c02c893b1ba13f7e08", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/648b0343343565c4a056bfc8392201385e8d89f0", + "reference": "648b0343343565c4a056bfc8392201385e8d89f0", "shasum": "" }, "require": { @@ -524,9 +1006,10 @@ "require-dev": { "doctrine/cache": "^1.11 || ^2.0", "doctrine/coding-standard": "^6.0 || ^8.1", - "phpstan/phpstan": "^0.12.20", + "phpstan/phpstan": "^1.4.10 || ^1.8.0", "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", - "symfony/cache": "^4.4 || ^5.2" + "symfony/cache": "^4.4 || ^5.2", + "vimeo/psalm": "^4.10" }, "type": "library", "autoload": { @@ -569,9 +1052,9 @@ ], "support": { "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.13.2" + "source": "https://github.com/doctrine/annotations/tree/1.13.3" }, - "time": "2021-08-05T19:00:23+00:00" + "time": "2022-07-02T10:48:51+00:00" }, { "name": "doctrine/instantiator", @@ -1515,92 +1998,25 @@ }, "time": "2022-03-15T21:29:03+00:00" }, - { - "name": "phpspec/prophecy", - "version": "v1.15.0", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13", - "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.2", - "phpdocumentor/reflection-docblock": "^5.2", - "sebastian/comparator": "^3.0 || ^4.0", - "sebastian/recursion-context": "^3.0 || ^4.0" - }, - "require-dev": { - "phpspec/phpspec": "^6.0 || ^7.0", - "phpunit/phpunit": "^8.0 || ^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Prophecy\\": "src/Prophecy" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/v1.15.0" - }, - "time": "2021-12-08T12:19:24+00:00" - }, { "name": "phpunit/php-code-coverage", - "version": "9.2.15", + "version": "9.2.16", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f" + "reference": "2593003befdcc10db5e213f9f28814f5aa8ac073" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2e9da11878c4202f97915c1cb4bb1ca318a63f5f", - "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2593003befdcc10db5e213f9f28814f5aa8ac073", + "reference": "2593003befdcc10db5e213f9f28814f5aa8ac073", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.13.0", + "nikic/php-parser": "^4.14", "php": ">=7.3", "phpunit/php-file-iterator": "^3.0.3", "phpunit/php-text-template": "^2.0.2", @@ -1649,7 +2065,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.15" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.16" }, "funding": [ { @@ -1657,7 +2073,7 @@ "type": "github" } ], - "time": "2022-03-07T09:28:20+00:00" + "time": "2022-08-20T05:26:47+00:00" }, { "name": "phpunit/php-file-iterator", @@ -1902,16 +2318,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.21", + "version": "9.5.23", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "0e32b76be457de00e83213528f6bb37e2a38fcb1" + "reference": "888556852e7e9bbeeedb9656afe46118765ade34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0e32b76be457de00e83213528f6bb37e2a38fcb1", - "reference": "0e32b76be457de00e83213528f6bb37e2a38fcb1", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/888556852e7e9bbeeedb9656afe46118765ade34", + "reference": "888556852e7e9bbeeedb9656afe46118765ade34", "shasum": "" }, "require": { @@ -1926,7 +2342,6 @@ "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=7.3", - "phpspec/prophecy": "^1.12.1", "phpunit/php-code-coverage": "^9.2.13", "phpunit/php-file-iterator": "^3.0.5", "phpunit/php-invoker": "^3.1.1", @@ -1944,9 +2359,6 @@ "sebastian/type": "^3.0", "sebastian/version": "^3.0.2" }, - "require-dev": { - "phpspec/prophecy-phpunit": "^2.0.1" - }, "suggest": { "ext-soap": "*", "ext-xdebug": "*" @@ -1988,7 +2400,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.21" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.23" }, "funding": [ { @@ -2000,56 +2412,7 @@ "type": "github" } ], - "time": "2022-06-19T12:14:25+00:00" - }, - { - "name": "psr/cache", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ], - "support": { - "source": "https://github.com/php-fig/cache/tree/master" - }, - "time": "2016-08-06T20:24:11+00:00" + "time": "2022-08-22T14:01:36+00:00" }, { "name": "psr/container", @@ -2150,54 +2513,449 @@ "time": "2019-01-08T18:20:26+00:00" }, { - "name": "psr/log", - "version": "1.1.4", + "name": "sabre/dav", + "version": "4.4.0", "source": { "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + "url": "https://github.com/sabre-io/dav.git", + "reference": "b65362abc926520eda2c57e219f022a6c288069d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "url": "https://api.github.com/repos/sabre-io/dav/zipball/b65362abc926520eda2c57e219f022a6c288069d", + "reference": "b65362abc926520eda2c57e219f022a6c288069d", "shasum": "" }, "require": { - "php": ">=5.3.0" + "ext-ctype": "*", + "ext-date": "*", + "ext-dom": "*", + "ext-iconv": "*", + "ext-json": "*", + "ext-mbstring": "*", + "ext-pcre": "*", + "ext-simplexml": "*", + "ext-spl": "*", + "lib-libxml": ">=2.7.0", + "php": "^7.1.0 || ^8.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "sabre/event": "^5.0", + "sabre/http": "^5.0.5", + "sabre/uri": "^2.0", + "sabre/vobject": "^4.2.1", + "sabre/xml": "^2.0.1" }, + "require-dev": { + "evert/phpdoc-md": "~0.1.0", + "friendsofphp/php-cs-fixer": "^2.17.1", + "monolog/monolog": "^1.18", + "phpstan/phpstan": "^0.12", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.0" + }, + "suggest": { + "ext-curl": "*", + "ext-imap": "*", + "ext-pdo": "*" + }, + "bin": [ + "bin/sabredav", + "bin/naturalselection" + ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, "autoload": { "psr-4": { - "Psr\\Log\\": "Psr/Log/" + "Sabre\\DAV\\": "lib/DAV/", + "Sabre\\CalDAV\\": "lib/CalDAV/", + "Sabre\\DAVACL\\": "lib/DAVACL/", + "Sabre\\CardDAV\\": "lib/CardDAV/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Evert Pot", + "email": "me@evertpot.com", + "homepage": "http://evertpot.com/", + "role": "Developer" } ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", + "description": "WebDAV Framework for PHP", + "homepage": "http://sabre.io/", "keywords": [ - "log", - "psr", - "psr-3" + "CalDAV", + "CardDAV", + "WebDAV", + "framework", + "iCalendar" ], "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" + "forum": "https://groups.google.com/group/sabredav-discuss", + "issues": "https://github.com/sabre-io/dav/issues", + "source": "https://github.com/fruux/sabre-dav" }, - "time": "2021-05-03T11:20:27+00:00" + "time": "2022-06-27T09:07:55+00:00" + }, + { + "name": "sabre/event", + "version": "5.1.4", + "source": { + "type": "git", + "url": "https://github.com/sabre-io/event.git", + "reference": "d7da22897125d34d7eddf7977758191c06a74497" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sabre-io/event/zipball/d7da22897125d34d7eddf7977758191c06a74497", + "reference": "d7da22897125d34d7eddf7977758191c06a74497", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~2.17.1", + "phpstan/phpstan": "^0.12", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.0" + }, + "type": "library", + "autoload": { + "files": [ + "lib/coroutine.php", + "lib/Loop/functions.php", + "lib/Promise/functions.php" + ], + "psr-4": { + "Sabre\\Event\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Evert Pot", + "email": "me@evertpot.com", + "homepage": "http://evertpot.com/", + "role": "Developer" + } + ], + "description": "sabre/event is a library for lightweight event-based programming", + "homepage": "http://sabre.io/event/", + "keywords": [ + "EventEmitter", + "async", + "coroutine", + "eventloop", + "events", + "hooks", + "plugin", + "promise", + "reactor", + "signal" + ], + "support": { + "forum": "https://groups.google.com/group/sabredav-discuss", + "issues": "https://github.com/sabre-io/event/issues", + "source": "https://github.com/fruux/sabre-event" + }, + "time": "2021-11-04T06:51:17+00:00" + }, + { + "name": "sabre/http", + "version": "5.1.6", + "source": { + "type": "git", + "url": "https://github.com/sabre-io/http.git", + "reference": "9976ac34ced206bd6579b7b37b401de9fac98dae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sabre-io/http/zipball/9976ac34ced206bd6579b7b37b401de9fac98dae", + "reference": "9976ac34ced206bd6579b7b37b401de9fac98dae", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-curl": "*", + "ext-mbstring": "*", + "php": "^7.1 || ^8.0", + "sabre/event": ">=4.0 <6.0", + "sabre/uri": "^2.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~2.17.1", + "phpstan/phpstan": "^0.12", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.0" + }, + "suggest": { + "ext-curl": " to make http requests with the Client class" + }, + "type": "library", + "autoload": { + "files": [ + "lib/functions.php" + ], + "psr-4": { + "Sabre\\HTTP\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Evert Pot", + "email": "me@evertpot.com", + "homepage": "http://evertpot.com/", + "role": "Developer" + } + ], + "description": "The sabre/http library provides utilities for dealing with http requests and responses. ", + "homepage": "https://github.com/fruux/sabre-http", + "keywords": [ + "http" + ], + "support": { + "forum": "https://groups.google.com/group/sabredav-discuss", + "issues": "https://github.com/sabre-io/http/issues", + "source": "https://github.com/fruux/sabre-http" + }, + "time": "2022-07-15T14:51:14+00:00" + }, + { + "name": "sabre/uri", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/sabre-io/uri.git", + "reference": "4e84208b86d351e8a439613f318feda7a0152b48" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sabre-io/uri/zipball/4e84208b86d351e8a439613f318feda7a0152b48", + "reference": "4e84208b86d351e8a439613f318feda7a0152b48", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.9", + "phpstan/phpstan": "^1.8", + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "autoload": { + "files": [ + "lib/functions.php" + ], + "psr-4": { + "Sabre\\Uri\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Evert Pot", + "email": "me@evertpot.com", + "homepage": "http://evertpot.com/", + "role": "Developer" + } + ], + "description": "Functions for making sense out of URIs.", + "homepage": "http://sabre.io/uri/", + "keywords": [ + "rfc3986", + "uri", + "url" + ], + "support": { + "forum": "https://groups.google.com/group/sabredav-discuss", + "issues": "https://github.com/sabre-io/uri/issues", + "source": "https://github.com/fruux/sabre-uri" + }, + "time": "2022-08-17T09:51:38+00:00" + }, + { + "name": "sabre/vobject", + "version": "4.5.0", + "source": { + "type": "git", + "url": "https://github.com/sabre-io/vobject.git", + "reference": "d1fdc0c3587a314bdd3aac4a1e1dcacadd91858e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sabre-io/vobject/zipball/d1fdc0c3587a314bdd3aac4a1e1dcacadd91858e", + "reference": "d1fdc0c3587a314bdd3aac4a1e1dcacadd91858e", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^7.1 || ^8.0", + "sabre/xml": "^2.1" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~2.17.1", + "phpstan/phpstan": "^0.12", + "phpunit/php-invoker": "^2.0 || ^3.1", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.0" + }, + "suggest": { + "hoa/bench": "If you would like to run the benchmark scripts" + }, + "bin": [ + "bin/vobject", + "bin/generate_vcards" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Sabre\\VObject\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Evert Pot", + "email": "me@evertpot.com", + "homepage": "http://evertpot.com/", + "role": "Developer" + }, + { + "name": "Dominik Tobschall", + "email": "dominik@fruux.com", + "homepage": "http://tobschall.de/", + "role": "Developer" + }, + { + "name": "Ivan Enderlin", + "email": "ivan.enderlin@hoa-project.net", + "homepage": "http://mnt.io/", + "role": "Developer" + } + ], + "description": "The VObject library for PHP allows you to easily parse and manipulate iCalendar and vCard objects", + "homepage": "http://sabre.io/vobject/", + "keywords": [ + "availability", + "freebusy", + "iCalendar", + "ical", + "ics", + "jCal", + "jCard", + "recurrence", + "rfc2425", + "rfc2426", + "rfc2739", + "rfc4770", + "rfc5545", + "rfc5546", + "rfc6321", + "rfc6350", + "rfc6351", + "rfc6474", + "rfc6638", + "rfc6715", + "rfc6868", + "vCalendar", + "vCard", + "vcf", + "xCal", + "xCard" + ], + "support": { + "forum": "https://groups.google.com/group/sabredav-discuss", + "issues": "https://github.com/sabre-io/vobject/issues", + "source": "https://github.com/fruux/sabre-vobject" + }, + "time": "2022-08-17T16:39:31+00:00" + }, + { + "name": "sabre/xml", + "version": "2.2.5", + "source": { + "type": "git", + "url": "https://github.com/sabre-io/xml.git", + "reference": "a6af111850e7536d200d9637c34885cd3c77a86c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sabre-io/xml/zipball/a6af111850e7536d200d9637c34885cd3c77a86c", + "reference": "a6af111850e7536d200d9637c34885cd3c77a86c", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-xmlreader": "*", + "ext-xmlwriter": "*", + "lib-libxml": ">=2.6.20", + "php": "^7.1 || ^8.0", + "sabre/uri": ">=1.0,<3.0.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~2.17.1", + "phpstan/phpstan": "^0.12", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.0" + }, + "type": "library", + "autoload": { + "files": [ + "lib/Deserializer/functions.php", + "lib/Serializer/functions.php" + ], + "psr-4": { + "Sabre\\Xml\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Evert Pot", + "email": "me@evertpot.com", + "homepage": "http://evertpot.com/", + "role": "Developer" + }, + { + "name": "Markus Staab", + "email": "markus.staab@redaxo.de", + "role": "Developer" + } + ], + "description": "sabre/xml is an XML library that you may not hate.", + "homepage": "https://sabre.io/xml/", + "keywords": [ + "XMLReader", + "XMLWriter", + "dom", + "xml" + ], + "support": { + "forum": "https://groups.google.com/group/sabredav-discuss", + "issues": "https://github.com/sabre-io/xml/issues", + "source": "https://github.com/fruux/sabre-xml" + }, + "time": "2021-11-04T06:37:27+00:00" }, { "name": "sebastian/cli-parser", @@ -3331,16 +4089,16 @@ }, { "name": "symfony/event-dispatcher", - "version": "v5.4.3", + "version": "v5.4.9", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "dec8a9f58d20df252b9cd89f1c6c1530f747685d" + "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/dec8a9f58d20df252b9cd89f1c6c1530f747685d", - "reference": "dec8a9f58d20df252b9cd89f1c6c1530f747685d", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", + "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", "shasum": "" }, "require": { @@ -3396,7 +4154,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.3" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.9" }, "funding": [ { @@ -3412,7 +4170,7 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2022-05-05T16:45:39+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -3495,16 +4253,16 @@ }, { "name": "symfony/filesystem", - "version": "v5.4.7", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "3a4442138d80c9f7b600fb297534ac718b61d37f" + "reference": "6699fb0228d1bc35b12aed6dd5e7455457609ddd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/3a4442138d80c9f7b600fb297534ac718b61d37f", - "reference": "3a4442138d80c9f7b600fb297534ac718b61d37f", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/6699fb0228d1bc35b12aed6dd5e7455457609ddd", + "reference": "6699fb0228d1bc35b12aed6dd5e7455457609ddd", "shasum": "" }, "require": { @@ -3539,7 +4297,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.7" + "source": "https://github.com/symfony/filesystem/tree/v5.4.11" }, "funding": [ { @@ -3555,20 +4313,20 @@ "type": "tidelift" } ], - "time": "2022-04-01T12:33:59+00:00" + "time": "2022-07-20T13:00:38+00:00" }, { "name": "symfony/finder", - "version": "v5.4.8", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9" + "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/9b630f3427f3ebe7cd346c277a1408b00249dad9", - "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9", + "url": "https://api.github.com/repos/symfony/finder/zipball/7872a66f57caffa2916a584db1aa7f12adc76f8c", + "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c", "shasum": "" }, "require": { @@ -3602,7 +4360,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.8" + "source": "https://github.com/symfony/finder/tree/v5.4.11" }, "funding": [ { @@ -3618,20 +4376,20 @@ "type": "tidelift" } ], - "time": "2022-04-15T08:07:45+00:00" + "time": "2022-07-29T07:37:50+00:00" }, { "name": "symfony/options-resolver", - "version": "v5.4.3", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "cc1147cb11af1b43f503ac18f31aa3bec213aba8" + "reference": "54f14e36aa73cb8f7261d7686691fd4d75ea2690" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/cc1147cb11af1b43f503ac18f31aa3bec213aba8", - "reference": "cc1147cb11af1b43f503ac18f31aa3bec213aba8", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/54f14e36aa73cb8f7261d7686691fd4d75ea2690", + "reference": "54f14e36aa73cb8f7261d7686691fd4d75ea2690", "shasum": "" }, "require": { @@ -3671,7 +4429,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v5.4.3" + "source": "https://github.com/symfony/options-resolver/tree/v5.4.11" }, "funding": [ { @@ -3687,7 +4445,7 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2022-07-20T13:00:38+00:00" }, { "name": "symfony/polyfill-ctype", @@ -4089,16 +4847,16 @@ }, { "name": "symfony/polyfill-php72", - "version": "v1.25.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" + "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/bf44a9fd41feaac72b074de600314a93e2ae78e2", + "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2", "shasum": "" }, "require": { @@ -4107,7 +4865,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4145,7 +4903,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.26.0" }, "funding": [ { @@ -4161,7 +4919,7 @@ "type": "tidelift" } ], - "time": "2021-05-27T09:17:38+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-php73", @@ -4327,16 +5085,16 @@ }, { "name": "symfony/process", - "version": "v5.4.8", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "597f3fff8e3e91836bb0bd38f5718b56ddbde2f3" + "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/597f3fff8e3e91836bb0bd38f5718b56ddbde2f3", - "reference": "597f3fff8e3e91836bb0bd38f5718b56ddbde2f3", + "url": "https://api.github.com/repos/symfony/process/zipball/6e75fe6874cbc7e4773d049616ab450eff537bf1", + "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1", "shasum": "" }, "require": { @@ -4369,7 +5127,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.8" + "source": "https://github.com/symfony/process/tree/v5.4.11" }, "funding": [ { @@ -4385,7 +5143,7 @@ "type": "tidelift" } ], - "time": "2022-04-08T05:07:18+00:00" + "time": "2022-06-27T16:58:25+00:00" }, { "name": "symfony/service-contracts", @@ -4887,7 +5645,9 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "christophwurst/nextcloud": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": [], diff --git a/js/photos-main.js b/js/photos-main.js index 94f20fc4..8e09d50f 100644 Binary files a/js/photos-main.js and b/js/photos-main.js differ diff --git a/js/photos-main.js.LICENSE.txt b/js/photos-main.js.LICENSE.txt index b9b06cb0..bee19b54 100644 Binary files a/js/photos-main.js.LICENSE.txt and b/js/photos-main.js.LICENSE.txt differ diff --git a/js/photos-main.js.map b/js/photos-main.js.map index 3312e2ea..51ede0c4 100644 Binary files a/js/photos-main.js.map and b/js/photos-main.js.map differ diff --git a/js/photos-src_assets_Illustrations_empty_svg.js b/js/photos-src_assets_Illustrations_empty_svg.js index 454ae64b..ac7b504d 100644 Binary files a/js/photos-src_assets_Illustrations_empty_svg.js and b/js/photos-src_assets_Illustrations_empty_svg.js differ diff --git a/js/photos-src_assets_Illustrations_folder_svg.js b/js/photos-src_assets_Illustrations_folder_svg.js index ed0fa507..91fbd0e8 100644 Binary files a/js/photos-src_assets_Illustrations_folder_svg.js and b/js/photos-src_assets_Illustrations_folder_svg.js differ diff --git a/js/photos-src_assets_Illustrations_images_svg.js b/js/photos-src_assets_Illustrations_images_svg.js index 6bd0abf9..f2d1088e 100644 Binary files a/js/photos-src_assets_Illustrations_images_svg.js and b/js/photos-src_assets_Illustrations_images_svg.js differ diff --git a/js/photos-src_mixins_FetchAlbumsMixin_js-node_modules_vue-material-design-icons_Plus_vue-src_components-4c933a.js b/js/photos-src_mixins_FetchAlbumsMixin_js-node_modules_vue-material-design-icons_Plus_vue-src_components-4c933a.js new file mode 100644 index 00000000..2c6ac954 Binary files /dev/null and b/js/photos-src_mixins_FetchAlbumsMixin_js-node_modules_vue-material-design-icons_Plus_vue-src_components-4c933a.js differ diff --git a/js/photos-src_mixins_FetchAlbumsMixin_js-node_modules_vue-material-design-icons_Plus_vue-src_components-4c933a.js.LICENSE.txt b/js/photos-src_mixins_FetchAlbumsMixin_js-node_modules_vue-material-design-icons_Plus_vue-src_components-4c933a.js.LICENSE.txt new file mode 100644 index 00000000..6f3657b5 Binary files /dev/null and b/js/photos-src_mixins_FetchAlbumsMixin_js-node_modules_vue-material-design-icons_Plus_vue-src_components-4c933a.js.LICENSE.txt differ diff --git a/js/photos-src_mixins_FetchAlbumsMixin_js-node_modules_vue-material-design-icons_Plus_vue-src_components-4c933a.js.map b/js/photos-src_mixins_FetchAlbumsMixin_js-node_modules_vue-material-design-icons_Plus_vue-src_components-4c933a.js.map new file mode 100644 index 00000000..05cee742 Binary files /dev/null and b/js/photos-src_mixins_FetchAlbumsMixin_js-node_modules_vue-material-design-icons_Plus_vue-src_components-4c933a.js.map differ diff --git a/js/photos-src_mixins_FetchAlbumsMixin_js-src_components_AlbumForm_vue-src_components_Loader_vue.js b/js/photos-src_mixins_FetchAlbumsMixin_js-src_components_AlbumForm_vue-src_components_Loader_vue.js new file mode 100644 index 00000000..ce5cd94a Binary files /dev/null and b/js/photos-src_mixins_FetchAlbumsMixin_js-src_components_AlbumForm_vue-src_components_Loader_vue.js differ diff --git a/js/photos-src_mixins_FetchAlbumsMixin_js-src_components_AlbumForm_vue-src_components_Loader_vue.js.map b/js/photos-src_mixins_FetchAlbumsMixin_js-src_components_AlbumForm_vue-src_components_Loader_vue.js.map new file mode 100644 index 00000000..91fe17e6 Binary files /dev/null and b/js/photos-src_mixins_FetchAlbumsMixin_js-src_components_AlbumForm_vue-src_components_Loader_vue.js.map differ diff --git a/js/photos-src_mixins_FetchAlbumsMixin_js-src_components_AlbumForm_vue.js b/js/photos-src_mixins_FetchAlbumsMixin_js-src_components_AlbumForm_vue.js new file mode 100644 index 00000000..d9e54e21 Binary files /dev/null and b/js/photos-src_mixins_FetchAlbumsMixin_js-src_components_AlbumForm_vue.js differ diff --git a/js/photos-src_mixins_FetchAlbumsMixin_js-src_components_AlbumForm_vue.js.map b/js/photos-src_mixins_FetchAlbumsMixin_js-src_components_AlbumForm_vue.js.map new file mode 100644 index 00000000..47cad199 Binary files /dev/null and b/js/photos-src_mixins_FetchAlbumsMixin_js-src_components_AlbumForm_vue.js.map differ diff --git a/js/photos-src_mixins_FetchAlbumsMixin_js-src_mixins_FetchFilesMixin_js-src_mixins_FilesSelectionMixin_j-1c2b86.js b/js/photos-src_mixins_FetchAlbumsMixin_js-src_mixins_FetchFilesMixin_js-src_mixins_FilesSelectionMixin_j-1c2b86.js index 56eb475d..85598ae1 100644 Binary files a/js/photos-src_mixins_FetchAlbumsMixin_js-src_mixins_FetchFilesMixin_js-src_mixins_FilesSelectionMixin_j-1c2b86.js and b/js/photos-src_mixins_FetchAlbumsMixin_js-src_mixins_FetchFilesMixin_js-src_mixins_FilesSelectionMixin_j-1c2b86.js differ diff --git a/js/photos-src_mixins_FetchAlbumsMixin_js-src_mixins_FetchFilesMixin_js-src_mixins_FilesSelectionMixin_j-1c2b86.js.map b/js/photos-src_mixins_FetchAlbumsMixin_js-src_mixins_FetchFilesMixin_js-src_mixins_FilesSelectionMixin_j-1c2b86.js.map index 075f1454..251e0afb 100644 Binary files a/js/photos-src_mixins_FetchAlbumsMixin_js-src_mixins_FetchFilesMixin_js-src_mixins_FilesSelectionMixin_j-1c2b86.js.map and b/js/photos-src_mixins_FetchAlbumsMixin_js-src_mixins_FetchFilesMixin_js-src_mixins_FilesSelectionMixin_j-1c2b86.js.map differ diff --git a/js/photos-src_mixins_FetchFilesMixin_js-src_mixins_FilesByMonthMixin_js-src_mixins_FilesSelectionMixin_-258105.js b/js/photos-src_mixins_FetchFilesMixin_js-src_mixins_FilesByMonthMixin_js-src_mixins_FilesSelectionMixin_-258105.js new file mode 100644 index 00000000..3c014430 Binary files /dev/null and b/js/photos-src_mixins_FetchFilesMixin_js-src_mixins_FilesByMonthMixin_js-src_mixins_FilesSelectionMixin_-258105.js differ diff --git a/js/photos-src_mixins_FetchFilesMixin_js-src_mixins_FilesByMonthMixin_js-src_mixins_FilesSelectionMixin_-258105.js.map b/js/photos-src_mixins_FetchFilesMixin_js-src_mixins_FilesByMonthMixin_js-src_mixins_FilesSelectionMixin_-258105.js.map new file mode 100644 index 00000000..962b63f7 Binary files /dev/null and b/js/photos-src_mixins_FetchFilesMixin_js-src_mixins_FilesByMonthMixin_js-src_mixins_FilesSelectionMixin_-258105.js.map differ diff --git a/js/photos-src_mixins_FetchFilesMixin_js-src_mixins_FilesByMonthMixin_js-src_mixins_FilesSelectionMixin_-318705.js b/js/photos-src_mixins_FetchFilesMixin_js-src_mixins_FilesByMonthMixin_js-src_mixins_FilesSelectionMixin_-318705.js new file mode 100644 index 00000000..3587481e Binary files /dev/null and b/js/photos-src_mixins_FetchFilesMixin_js-src_mixins_FilesByMonthMixin_js-src_mixins_FilesSelectionMixin_-318705.js differ diff --git a/js/photos-src_mixins_FetchFilesMixin_js-src_mixins_FilesByMonthMixin_js-src_mixins_FilesSelectionMixin_-318705.js.LICENSE.txt b/js/photos-src_mixins_FetchFilesMixin_js-src_mixins_FilesByMonthMixin_js-src_mixins_FilesSelectionMixin_-318705.js.LICENSE.txt new file mode 100644 index 00000000..f624ba2f Binary files /dev/null and b/js/photos-src_mixins_FetchFilesMixin_js-src_mixins_FilesByMonthMixin_js-src_mixins_FilesSelectionMixin_-318705.js.LICENSE.txt differ diff --git a/js/photos-src_mixins_FetchFilesMixin_js-src_mixins_FilesByMonthMixin_js-src_mixins_FilesSelectionMixin_-318705.js.map b/js/photos-src_mixins_FetchFilesMixin_js-src_mixins_FilesByMonthMixin_js-src_mixins_FilesSelectionMixin_-318705.js.map new file mode 100644 index 00000000..e18d9559 Binary files /dev/null and b/js/photos-src_mixins_FetchFilesMixin_js-src_mixins_FilesByMonthMixin_js-src_mixins_FilesSelectionMixin_-318705.js.map differ diff --git a/js/photos-src_mixins_FetchFilesMixin_js-src_mixins_FilesByMonthMixin_js-src_mixins_FilesSelectionMixin_-7b1c7e.js b/js/photos-src_mixins_FetchFilesMixin_js-src_mixins_FilesByMonthMixin_js-src_mixins_FilesSelectionMixin_-7b1c7e.js new file mode 100644 index 00000000..a559ceca Binary files /dev/null and b/js/photos-src_mixins_FetchFilesMixin_js-src_mixins_FilesByMonthMixin_js-src_mixins_FilesSelectionMixin_-7b1c7e.js differ diff --git a/js/photos-src_mixins_FetchFilesMixin_js-src_mixins_FilesByMonthMixin_js-src_mixins_FilesSelectionMixin_-7b1c7e.js.LICENSE.txt b/js/photos-src_mixins_FetchFilesMixin_js-src_mixins_FilesByMonthMixin_js-src_mixins_FilesSelectionMixin_-7b1c7e.js.LICENSE.txt new file mode 100644 index 00000000..f624ba2f Binary files /dev/null and b/js/photos-src_mixins_FetchFilesMixin_js-src_mixins_FilesByMonthMixin_js-src_mixins_FilesSelectionMixin_-7b1c7e.js.LICENSE.txt differ diff --git a/js/photos-src_mixins_FetchFilesMixin_js-src_mixins_FilesByMonthMixin_js-src_mixins_FilesSelectionMixin_-7b1c7e.js.map b/js/photos-src_mixins_FetchFilesMixin_js-src_mixins_FilesByMonthMixin_js-src_mixins_FilesSelectionMixin_-7b1c7e.js.map new file mode 100644 index 00000000..916e2959 Binary files /dev/null and b/js/photos-src_mixins_FetchFilesMixin_js-src_mixins_FilesByMonthMixin_js-src_mixins_FilesSelectionMixin_-7b1c7e.js.map differ diff --git a/js/photos-src_mixins_GridConfig_js-src_components_EmptyContent_vue-src_components_FolderTagPreview_vue--cac48e.js b/js/photos-src_mixins_GridConfig_js-src_components_EmptyContent_vue-src_components_FolderTagPreview_vue--cac48e.js new file mode 100644 index 00000000..c1dab57e Binary files /dev/null and b/js/photos-src_mixins_GridConfig_js-src_components_EmptyContent_vue-src_components_FolderTagPreview_vue--cac48e.js differ diff --git a/js/photos-src_mixins_GridConfig_js-src_components_EmptyContent_vue-src_components_FolderTagPreview_vue--cac48e.js.map b/js/photos-src_mixins_GridConfig_js-src_components_EmptyContent_vue-src_components_FolderTagPreview_vue--cac48e.js.map new file mode 100644 index 00000000..dac02e97 Binary files /dev/null and b/js/photos-src_mixins_GridConfig_js-src_components_EmptyContent_vue-src_components_FolderTagPreview_vue--cac48e.js.map differ diff --git a/js/photos-src_mixins_GridConfig_js-src_utils_CancelableRequest_js-src_components_EmptyContent_vue-src_c-c08051.js b/js/photos-src_mixins_GridConfig_js-src_utils_CancelableRequest_js-src_components_EmptyContent_vue-src_c-c08051.js new file mode 100644 index 00000000..697adfe2 Binary files /dev/null and b/js/photos-src_mixins_GridConfig_js-src_utils_CancelableRequest_js-src_components_EmptyContent_vue-src_c-c08051.js differ diff --git a/js/photos-src_mixins_GridConfig_js-src_utils_CancelableRequest_js-src_components_EmptyContent_vue-src_c-c08051.js.LICENSE.txt b/js/photos-src_mixins_GridConfig_js-src_utils_CancelableRequest_js-src_components_EmptyContent_vue-src_c-c08051.js.LICENSE.txt new file mode 100644 index 00000000..3eafa8b1 Binary files /dev/null and b/js/photos-src_mixins_GridConfig_js-src_utils_CancelableRequest_js-src_components_EmptyContent_vue-src_c-c08051.js.LICENSE.txt differ diff --git a/js/photos-src_mixins_GridConfig_js-src_utils_CancelableRequest_js-src_components_EmptyContent_vue-src_c-c08051.js.map b/js/photos-src_mixins_GridConfig_js-src_utils_CancelableRequest_js-src_components_EmptyContent_vue-src_c-c08051.js.map new file mode 100644 index 00000000..6abbba60 Binary files /dev/null and b/js/photos-src_mixins_GridConfig_js-src_utils_CancelableRequest_js-src_components_EmptyContent_vue-src_c-c08051.js.map differ diff --git a/js/photos-src_services_DavRequest_js-src_components_File_vue.js b/js/photos-src_services_DavRequest_js-src_components_File_vue.js index 7e57f0c4..9f555a86 100644 Binary files a/js/photos-src_services_DavRequest_js-src_components_File_vue.js and b/js/photos-src_services_DavRequest_js-src_components_File_vue.js differ diff --git a/js/photos-src_services_DavRequest_js-src_components_File_vue.js.LICENSE.txt b/js/photos-src_services_DavRequest_js-src_components_File_vue.js.LICENSE.txt new file mode 100644 index 00000000..86416a84 Binary files /dev/null and b/js/photos-src_services_DavRequest_js-src_components_File_vue.js.LICENSE.txt differ diff --git a/js/photos-src_services_DavRequest_js-src_components_File_vue.js.map b/js/photos-src_services_DavRequest_js-src_components_File_vue.js.map index 35215aa1..8d972de7 100644 Binary files a/js/photos-src_services_DavRequest_js-src_components_File_vue.js.map and b/js/photos-src_services_DavRequest_js-src_components_File_vue.js.map differ diff --git a/js/photos-src_services_DavRequest_js-src_utils_CancelableRequest_js-src_components_File_vue.js b/js/photos-src_services_DavRequest_js-src_utils_CancelableRequest_js-src_components_File_vue.js index ce9455ca..e023244c 100644 Binary files a/js/photos-src_services_DavRequest_js-src_utils_CancelableRequest_js-src_components_File_vue.js and b/js/photos-src_services_DavRequest_js-src_utils_CancelableRequest_js-src_components_File_vue.js differ diff --git a/js/photos-src_services_DavRequest_js-src_utils_CancelableRequest_js-src_components_File_vue.js.map b/js/photos-src_services_DavRequest_js-src_utils_CancelableRequest_js-src_components_File_vue.js.map index 444b14cd..5d755e5e 100644 Binary files a/js/photos-src_services_DavRequest_js-src_utils_CancelableRequest_js-src_components_File_vue.js.map and b/js/photos-src_services_DavRequest_js-src_utils_CancelableRequest_js-src_components_File_vue.js.map differ diff --git a/js/photos-src_utils_CancelableRequest_js-src_components_File_vue.js b/js/photos-src_utils_CancelableRequest_js-src_components_File_vue.js new file mode 100644 index 00000000..60004d22 Binary files /dev/null and b/js/photos-src_utils_CancelableRequest_js-src_components_File_vue.js differ diff --git a/js/photos-src_utils_CancelableRequest_js-src_components_File_vue.js.map b/js/photos-src_utils_CancelableRequest_js-src_components_File_vue.js.map new file mode 100644 index 00000000..6671dfbe Binary files /dev/null and b/js/photos-src_utils_CancelableRequest_js-src_components_File_vue.js.map differ diff --git a/js/photos-src_utils_CancelableRequest_js-src_views_Albums_vue.js b/js/photos-src_utils_CancelableRequest_js-src_views_Albums_vue.js index b9d06a39..37143f1e 100644 Binary files a/js/photos-src_utils_CancelableRequest_js-src_views_Albums_vue.js and b/js/photos-src_utils_CancelableRequest_js-src_views_Albums_vue.js differ diff --git a/js/photos-src_utils_CancelableRequest_js-src_views_Albums_vue.js.map b/js/photos-src_utils_CancelableRequest_js-src_views_Albums_vue.js.map index 680b4f89..cc8c1b35 100644 Binary files a/js/photos-src_utils_CancelableRequest_js-src_views_Albums_vue.js.map and b/js/photos-src_utils_CancelableRequest_js-src_views_Albums_vue.js.map differ diff --git a/js/photos-src_views_AlbumContent_vue.js b/js/photos-src_views_AlbumContent_vue.js index 588bb695..7e5b13c4 100644 Binary files a/js/photos-src_views_AlbumContent_vue.js and b/js/photos-src_views_AlbumContent_vue.js differ diff --git a/js/photos-src_views_AlbumContent_vue.js.map b/js/photos-src_views_AlbumContent_vue.js.map index d1b1915f..59eb3713 100644 Binary files a/js/photos-src_views_AlbumContent_vue.js.map and b/js/photos-src_views_AlbumContent_vue.js.map differ diff --git a/js/photos-src_views_Albums_vue.js b/js/photos-src_views_Albums_vue.js index 9e4f9458..b124af22 100644 Binary files a/js/photos-src_views_Albums_vue.js and b/js/photos-src_views_Albums_vue.js differ diff --git a/js/photos-src_views_Albums_vue.js.map b/js/photos-src_views_Albums_vue.js.map index 87c55473..b7923895 100644 Binary files a/js/photos-src_views_Albums_vue.js.map and b/js/photos-src_views_Albums_vue.js.map differ diff --git a/js/photos-src_views_Folders_vue.js b/js/photos-src_views_Folders_vue.js new file mode 100644 index 00000000..af45acdc Binary files /dev/null and b/js/photos-src_views_Folders_vue.js differ diff --git a/js/photos-src_views_Folders_vue.js.LICENSE.txt b/js/photos-src_views_Folders_vue.js.LICENSE.txt new file mode 100644 index 00000000..86416a84 Binary files /dev/null and b/js/photos-src_views_Folders_vue.js.LICENSE.txt differ diff --git a/js/photos-src_views_Folders_vue.js.map b/js/photos-src_views_Folders_vue.js.map new file mode 100644 index 00000000..a93b3870 Binary files /dev/null and b/js/photos-src_views_Folders_vue.js.map differ diff --git a/js/photos-src_views_Tags_vue.js b/js/photos-src_views_Tags_vue.js index 5efac67d..8e51bea2 100644 Binary files a/js/photos-src_views_Tags_vue.js and b/js/photos-src_views_Tags_vue.js differ diff --git a/js/photos-src_views_Tags_vue.js.map b/js/photos-src_views_Tags_vue.js.map index 40257f4f..3052dfdc 100644 Binary files a/js/photos-src_views_Tags_vue.js.map and b/js/photos-src_views_Tags_vue.js.map differ diff --git a/js/photos-src_views_Timeline_vue.js b/js/photos-src_views_Timeline_vue.js index ca60a1c9..15050b2d 100644 Binary files a/js/photos-src_views_Timeline_vue.js and b/js/photos-src_views_Timeline_vue.js differ diff --git a/js/photos-src_views_Timeline_vue.js.map b/js/photos-src_views_Timeline_vue.js.map index f2f51236..5cc27146 100644 Binary files a/js/photos-src_views_Timeline_vue.js.map and b/js/photos-src_views_Timeline_vue.js.map differ diff --git a/js/photos-vendors-node_modules_nextcloud_vue_dist_Components_ActionButton_js-node_modules_nextcloud_vue-208129.js b/js/photos-vendors-node_modules_nextcloud_vue_dist_Components_ActionButton_js-node_modules_nextcloud_vue-208129.js index 40e12313..8a5e3fd6 100644 Binary files a/js/photos-vendors-node_modules_nextcloud_vue_dist_Components_ActionButton_js-node_modules_nextcloud_vue-208129.js and b/js/photos-vendors-node_modules_nextcloud_vue_dist_Components_ActionButton_js-node_modules_nextcloud_vue-208129.js differ diff --git a/js/photos-vendors-node_modules_nextcloud_vue_dist_Components_ActionButton_js-node_modules_nextcloud_vue-208129.js.map b/js/photos-vendors-node_modules_nextcloud_vue_dist_Components_ActionButton_js-node_modules_nextcloud_vue-208129.js.map index 45f3ac2e..a6f0c1d3 100644 Binary files a/js/photos-vendors-node_modules_nextcloud_vue_dist_Components_ActionButton_js-node_modules_nextcloud_vue-208129.js.map and b/js/photos-vendors-node_modules_nextcloud_vue_dist_Components_ActionButton_js-node_modules_nextcloud_vue-208129.js.map differ diff --git a/js/photos-vendors-node_modules_nextcloud_vue_dist_ncvuecomponents_js.js b/js/photos-vendors-node_modules_nextcloud_vue_dist_ncvuecomponents_js.js index a9e47662..5d08679b 100644 Binary files a/js/photos-vendors-node_modules_nextcloud_vue_dist_ncvuecomponents_js.js and b/js/photos-vendors-node_modules_nextcloud_vue_dist_ncvuecomponents_js.js differ diff --git a/js/photos-vendors-node_modules_nextcloud_vue_dist_ncvuecomponents_js.js.LICENSE.txt b/js/photos-vendors-node_modules_nextcloud_vue_dist_ncvuecomponents_js.js.LICENSE.txt new file mode 100644 index 00000000..91bf4df6 Binary files /dev/null and b/js/photos-vendors-node_modules_nextcloud_vue_dist_ncvuecomponents_js.js.LICENSE.txt differ diff --git a/js/photos-vendors-node_modules_nextcloud_vue_dist_ncvuecomponents_js.js.map b/js/photos-vendors-node_modules_nextcloud_vue_dist_ncvuecomponents_js.js.map index 987e0003..4d39507e 100644 Binary files a/js/photos-vendors-node_modules_nextcloud_vue_dist_ncvuecomponents_js.js.map and b/js/photos-vendors-node_modules_nextcloud_vue_dist_ncvuecomponents_js.js.map differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_AccountMultiplePlus_vue-node_modules_vue-mater-22ef34.js b/js/photos-vendors-node_modules_vue-material-design-icons_AccountMultiplePlus_vue-node_modules_vue-mater-22ef34.js new file mode 100644 index 00000000..487c9f42 Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_AccountMultiplePlus_vue-node_modules_vue-mater-22ef34.js differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_AccountMultiplePlus_vue-node_modules_vue-mater-22ef34.js.map b/js/photos-vendors-node_modules_vue-material-design-icons_AccountMultiplePlus_vue-node_modules_vue-mater-22ef34.js.map new file mode 100644 index 00000000..e78cfea4 Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_AccountMultiplePlus_vue-node_modules_vue-mater-22ef34.js.map differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_AccountMultiplePlus_vue-node_modules_vue-mater-311a7c.js b/js/photos-vendors-node_modules_vue-material-design-icons_AccountMultiplePlus_vue-node_modules_vue-mater-311a7c.js new file mode 100644 index 00000000..e22be976 Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_AccountMultiplePlus_vue-node_modules_vue-mater-311a7c.js differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_AccountMultiplePlus_vue-node_modules_vue-mater-311a7c.js.map b/js/photos-vendors-node_modules_vue-material-design-icons_AccountMultiplePlus_vue-node_modules_vue-mater-311a7c.js.map new file mode 100644 index 00000000..5aba443d Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_AccountMultiplePlus_vue-node_modules_vue-mater-311a7c.js.map differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_AccountMultiplePlus_vue-node_modules_vue-mater-7939f5.js b/js/photos-vendors-node_modules_vue-material-design-icons_AccountMultiplePlus_vue-node_modules_vue-mater-7939f5.js new file mode 100644 index 00000000..71124ad5 Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_AccountMultiplePlus_vue-node_modules_vue-mater-7939f5.js differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_AccountMultiplePlus_vue-node_modules_vue-mater-7939f5.js.map b/js/photos-vendors-node_modules_vue-material-design-icons_AccountMultiplePlus_vue-node_modules_vue-mater-7939f5.js.map new file mode 100644 index 00000000..6004d504 Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_AccountMultiplePlus_vue-node_modules_vue-mater-7939f5.js.map differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_AccountMultiple_vue-node_modules_vue-material--6017a6.js.map b/js/photos-vendors-node_modules_vue-material-design-icons_AccountMultiple_vue-node_modules_vue-material--6017a6.js.map index 2e678f83..de2b7cbf 100644 Binary files a/js/photos-vendors-node_modules_vue-material-design-icons_AccountMultiple_vue-node_modules_vue-material--6017a6.js.map and b/js/photos-vendors-node_modules_vue-material-design-icons_AccountMultiple_vue-node_modules_vue-material--6017a6.js.map differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-20f0aa.js b/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-20f0aa.js new file mode 100644 index 00000000..8623cb85 Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-20f0aa.js differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-20f0aa.js.map b/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-20f0aa.js.map new file mode 100644 index 00000000..e656de78 Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-20f0aa.js.map differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-5c3506.js b/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-5c3506.js new file mode 100644 index 00000000..c033c91f Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-5c3506.js differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-5c3506.js.map b/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-5c3506.js.map new file mode 100644 index 00000000..3bcd6f2a Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-5c3506.js.map differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-69917a.js.map b/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-69917a.js.map index 7d395e57..57d1731b 100644 Binary files a/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-69917a.js.map and b/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-69917a.js.map differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-7284b9.js b/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-7284b9.js new file mode 100644 index 00000000..934db02f Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-7284b9.js differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-7284b9.js.map b/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-7284b9.js.map new file mode 100644 index 00000000..0e3a3d8e Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-7284b9.js.map differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-d1bd24.js b/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-d1bd24.js new file mode 100644 index 00000000..8f5f4ad6 Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-d1bd24.js differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-d1bd24.js.map b/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-d1bd24.js.map new file mode 100644 index 00000000..0ad9aea6 Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-d1bd24.js.map differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-e60520.js b/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-e60520.js new file mode 100644 index 00000000..34bd3860 Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-e60520.js differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-e60520.js.map b/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-e60520.js.map new file mode 100644 index 00000000..56dd0efd Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_AlertCircle_vue-node_modules_vue-material-desi-e60520.js.map differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_Delete_vue-node_modules_vue-material-design-ic-1cffb8.js b/js/photos-vendors-node_modules_vue-material-design-icons_Delete_vue-node_modules_vue-material-design-ic-1cffb8.js new file mode 100644 index 00000000..64cadfa8 Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_Delete_vue-node_modules_vue-material-design-ic-1cffb8.js differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_Delete_vue-node_modules_vue-material-design-ic-1cffb8.js.map b/js/photos-vendors-node_modules_vue-material-design-icons_Delete_vue-node_modules_vue-material-design-ic-1cffb8.js.map new file mode 100644 index 00000000..1fe19e62 Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_Delete_vue-node_modules_vue-material-design-ic-1cffb8.js.map differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_Delete_vue-node_modules_vue-material-design-ic-8e4888.js b/js/photos-vendors-node_modules_vue-material-design-icons_Delete_vue-node_modules_vue-material-design-ic-8e4888.js new file mode 100644 index 00000000..50e3e573 Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_Delete_vue-node_modules_vue-material-design-ic-8e4888.js differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_Delete_vue-node_modules_vue-material-design-ic-8e4888.js.map b/js/photos-vendors-node_modules_vue-material-design-icons_Delete_vue-node_modules_vue-material-design-ic-8e4888.js.map new file mode 100644 index 00000000..5e80b832 Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_Delete_vue-node_modules_vue-material-design-ic-8e4888.js.map differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_DownloadOutline_vue-node_modules_vue-material--5d35b6.js b/js/photos-vendors-node_modules_vue-material-design-icons_DownloadOutline_vue-node_modules_vue-material--5d35b6.js new file mode 100644 index 00000000..b20084c6 Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_DownloadOutline_vue-node_modules_vue-material--5d35b6.js differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_DownloadOutline_vue-node_modules_vue-material--5d35b6.js.map b/js/photos-vendors-node_modules_vue-material-design-icons_DownloadOutline_vue-node_modules_vue-material--5d35b6.js.map new file mode 100644 index 00000000..8560062d Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_DownloadOutline_vue-node_modules_vue-material--5d35b6.js.map differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_DownloadOutline_vue-node_modules_vue-material--65919f.js b/js/photos-vendors-node_modules_vue-material-design-icons_DownloadOutline_vue-node_modules_vue-material--65919f.js new file mode 100644 index 00000000..c6c8a0de Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_DownloadOutline_vue-node_modules_vue-material--65919f.js differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_DownloadOutline_vue-node_modules_vue-material--65919f.js.map b/js/photos-vendors-node_modules_vue-material-design-icons_DownloadOutline_vue-node_modules_vue-material--65919f.js.map new file mode 100644 index 00000000..39d32402 Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_DownloadOutline_vue-node_modules_vue-material--65919f.js.map differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_DownloadOutline_vue-node_modules_vue-material--e7b32a.js.map b/js/photos-vendors-node_modules_vue-material-design-icons_DownloadOutline_vue-node_modules_vue-material--e7b32a.js.map index 937c25c0..ade44197 100644 Binary files a/js/photos-vendors-node_modules_vue-material-design-icons_DownloadOutline_vue-node_modules_vue-material--e7b32a.js.map and b/js/photos-vendors-node_modules_vue-material-design-icons_DownloadOutline_vue-node_modules_vue-material--e7b32a.js.map differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_Download_vue-node_modules_vue-material-design--72f9a3.js b/js/photos-vendors-node_modules_vue-material-design-icons_Download_vue-node_modules_vue-material-design--72f9a3.js new file mode 100644 index 00000000..abdc77fa Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_Download_vue-node_modules_vue-material-design--72f9a3.js differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_Download_vue-node_modules_vue-material-design--72f9a3.js.map b/js/photos-vendors-node_modules_vue-material-design-icons_Download_vue-node_modules_vue-material-design--72f9a3.js.map new file mode 100644 index 00000000..08d01de7 Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_Download_vue-node_modules_vue-material-design--72f9a3.js.map differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_Download_vue-node_modules_vue-material-design--7fbfc4.js b/js/photos-vendors-node_modules_vue-material-design-icons_Download_vue-node_modules_vue-material-design--7fbfc4.js new file mode 100644 index 00000000..8f5515e9 Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_Download_vue-node_modules_vue-material-design--7fbfc4.js differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_Download_vue-node_modules_vue-material-design--7fbfc4.js.map b/js/photos-vendors-node_modules_vue-material-design-icons_Download_vue-node_modules_vue-material-design--7fbfc4.js.map new file mode 100644 index 00000000..a5142917 Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_Download_vue-node_modules_vue-material-design--7fbfc4.js.map differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_FileUpload_vue-node_modules_vue-material-desig-e841bf.js b/js/photos-vendors-node_modules_vue-material-design-icons_FileUpload_vue-node_modules_vue-material-desig-e841bf.js new file mode 100644 index 00000000..b8c197a1 Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_FileUpload_vue-node_modules_vue-material-desig-e841bf.js differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_FileUpload_vue-node_modules_vue-material-desig-e841bf.js.map b/js/photos-vendors-node_modules_vue-material-design-icons_FileUpload_vue-node_modules_vue-material-desig-e841bf.js.map new file mode 100644 index 00000000..fd4a91dc Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_FileUpload_vue-node_modules_vue-material-desig-e841bf.js.map differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_ImageMultiple_vue-node_modules_vue-material-de-932c44.js b/js/photos-vendors-node_modules_vue-material-design-icons_ImageMultiple_vue-node_modules_vue-material-de-932c44.js new file mode 100644 index 00000000..10f3889a Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_ImageMultiple_vue-node_modules_vue-material-de-932c44.js differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_ImageMultiple_vue-node_modules_vue-material-de-932c44.js.map b/js/photos-vendors-node_modules_vue-material-design-icons_ImageMultiple_vue-node_modules_vue-material-de-932c44.js.map new file mode 100644 index 00000000..5898e2c9 Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_ImageMultiple_vue-node_modules_vue-material-de-932c44.js.map differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_Plus_vue-node_modules_vue-material-design-icon-c76fdd.js b/js/photos-vendors-node_modules_vue-material-design-icons_Plus_vue-node_modules_vue-material-design-icon-c76fdd.js new file mode 100644 index 00000000..12a512ec Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_Plus_vue-node_modules_vue-material-design-icon-c76fdd.js differ diff --git a/js/photos-vendors-node_modules_vue-material-design-icons_Plus_vue-node_modules_vue-material-design-icon-c76fdd.js.map b/js/photos-vendors-node_modules_vue-material-design-icons_Plus_vue-node_modules_vue-material-design-icon-c76fdd.js.map new file mode 100644 index 00000000..f275e722 Binary files /dev/null and b/js/photos-vendors-node_modules_vue-material-design-icons_Plus_vue-node_modules_vue-material-design-icon-c76fdd.js.map differ diff --git a/lib/Album/AlbumFile.php b/lib/Album/AlbumFile.php index 86863e09..8eb2482f 100644 --- a/lib/Album/AlbumFile.php +++ b/lib/Album/AlbumFile.php @@ -33,7 +33,7 @@ class AlbumFile { private int $mtime; private string $etag; private int $added; - /** @var array */ + /** @var array */ private array $metaData = []; public function __construct( @@ -74,7 +74,7 @@ class AlbumFile { return $this->mtime; } - public function getEtag() { + public function getEtag(): string { return $this->etag; } diff --git a/lib/Album/AlbumWithFiles.php b/lib/Album/AlbumWithFiles.php index cc6d0d1a..0bb630d6 100644 --- a/lib/Album/AlbumWithFiles.php +++ b/lib/Album/AlbumWithFiles.php @@ -48,7 +48,7 @@ class AlbumWithFiles { * @return int[] */ public function getFileIds(): array { - return array_map(function(AlbumFile $file) { + return array_map(function (AlbumFile $file) { return $file->getFileId(); }, $this->files); } diff --git a/lib/Exception/AlreadyInAlbumException.php b/lib/Exception/AlreadyInAlbumException.php index 9c7d7fe3..a8a89b05 100644 --- a/lib/Exception/AlreadyInAlbumException.php +++ b/lib/Exception/AlreadyInAlbumException.php @@ -24,5 +24,4 @@ declare(strict_types=1); namespace OCA\Photos\Exception; class AlreadyInAlbumException extends \Exception { - } diff --git a/lib/Migration/Version20000Date20220727125801.php b/lib/Migration/Version20000Date20220727125801.php index 81284e35..5641a540 100644 --- a/lib/Migration/Version20000Date20220727125801.php +++ b/lib/Migration/Version20000Date20220727125801.php @@ -25,7 +25,6 @@ namespace OCA\Photos\Migration; use Closure; use Doctrine\DBAL\Types\Types; -use OC\DB\SchemaWrapper; use OCP\DB\ISchemaWrapper; use OCP\Migration\IOutput; use OCP\Migration\SimpleMigrationStep; @@ -35,7 +34,7 @@ use OCP\Migration\SimpleMigrationStep; */ class Version20000Date20220727125801 extends SimpleMigrationStep { public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper { - /** @var SchemaWrapper $schema */ + /** @var ISchemaWrapper $schema */ $schema = $schemaClosure(); if (!$schema->hasTable("photos_albums")) { diff --git a/lib/Sabre/Album/AlbumPhoto.php b/lib/Sabre/Album/AlbumPhoto.php index 01532725..0c208574 100644 --- a/lib/Sabre/Album/AlbumPhoto.php +++ b/lib/Sabre/Album/AlbumPhoto.php @@ -39,6 +39,8 @@ class AlbumPhoto implements IFile { private AlbumFile $file; private Folder $userFolder; + public const TAG_FAVORITE = '_$!!$_'; + public function __construct(AlbumMapper $albumMapper, AlbumInfo $album, AlbumFile $file, Folder $userFolder) { $this->albumMapper = $albumMapper; $this->album = $album; @@ -46,6 +48,9 @@ class AlbumPhoto implements IFile { $this->userFolder = $userFolder; } + /** + * @return void + */ public function delete() { $this->albumMapper->removeFile($this->album->getId(), $this->file->getFileId()); } @@ -54,6 +59,9 @@ class AlbumPhoto implements IFile { return $this->file->getFileId() . "-" . $this->file->getName(); } + /** + * @return never + */ public function setName($name) { throw new Forbidden('Can\'t rename photos trough the album api'); } @@ -81,6 +89,20 @@ class AlbumPhoto implements IFile { } } + public function getFileId(): int { + return $this->file->getFileId(); + } + + public function getFileInfo(): Node { + $nodes = $this->userFolder->getById($this->file->getFileId()); + $node = current($nodes); + if ($node) { + return $node; + } else { + throw new NotFoundException("Photo not found for user"); + } + } + public function getContentType() { return $this->file->getMimeType(); } @@ -96,4 +118,16 @@ class AlbumPhoto implements IFile { public function getFile(): AlbumFile { return $this->file; } + + public function isFavorite(): bool { + $tagManager = \OCP\Server::get(\OCP\ITagManager::class); + $tagger = $tagManager->load('files'); + $tags = $tagger->getTagsForObjects([$this->getFileId()]); + + if ($tags === false || empty($tags)) { + return false; + } + + return array_search(self::TAG_FAVORITE, current($tags)) !== false; + } } diff --git a/lib/Sabre/Album/AlbumRoot.php b/lib/Sabre/Album/AlbumRoot.php index 4cb132c0..ffe5d2a2 100644 --- a/lib/Sabre/Album/AlbumRoot.php +++ b/lib/Sabre/Album/AlbumRoot.php @@ -52,6 +52,9 @@ class AlbumRoot implements ICollection, ICopyTarget { $this->user = $user; } + /** + * @return void + */ public function delete() { $this->albumMapper->delete($this->album->getAlbum()->getId()); } @@ -60,6 +63,9 @@ class AlbumRoot implements ICollection, ICopyTarget { return basename($this->album->getAlbum()->getTitle()); } + /** + * @return void + */ public function setName($name) { $this->albumMapper->rename($this->album->getAlbum()->getId(), $name); } @@ -68,6 +74,9 @@ class AlbumRoot implements ICollection, ICopyTarget { throw new Forbidden('Not allowed to create files in this folder, copy files into this folder instead'); } + /** + * @return never + */ public function createDirectory($name) { throw new Forbidden('Not allowed to create directories in this folder'); } @@ -118,4 +127,35 @@ class AlbumRoot implements ICollection, ICopyTarget { public function getAlbum(): AlbumWithFiles { return $this->album; } + + public function getDateRange(): array { + $earliestDate = null; + $latestDate = null; + + foreach ($this->getChildren() as $child) { + $childCreationDate = $child->getFileInfo()->getMtime(); + if ($childCreationDate < $earliestDate || $earliestDate === null) { + $earliestDate = $childCreationDate; + } + + if ($childCreationDate > $earliestDate || $latestDate === null) { + $latestDate = $childCreationDate; + } + } + + return ['start' => $earliestDate, 'end' => $latestDate]; + } + + /** + * @return int|null + */ + public function getCover() { + $children = $this->getChildren(); + + if (count($children) > 0) { + return $children[0]->getFileId(); + } else { + return null; + } + } } diff --git a/lib/Sabre/Album/AlbumsHome.php b/lib/Sabre/Album/AlbumsHome.php index 1c070b59..a2bc2fe7 100644 --- a/lib/Sabre/Album/AlbumsHome.php +++ b/lib/Sabre/Album/AlbumsHome.php @@ -39,6 +39,11 @@ class AlbumsHome implements ICollection { private IRootFolder $rootFolder; private Folder $userFolder; + /** + * @var AlbumRoot[] + */ + private ?array $children = null; + public function __construct( array $principalInfo, AlbumMapper $albumMapper, @@ -52,6 +57,9 @@ class AlbumsHome implements ICollection { $this->userFolder = $rootFolder->getUserFolder($user->getUID()); } + /** + * @return never + */ public function delete() { throw new Forbidden(); } @@ -60,6 +68,9 @@ class AlbumsHome implements ICollection { return 'albums'; } + /** + * @return never + */ public function setName($name) { throw new Forbidden('Permission denied to rename this folder'); } @@ -68,6 +79,9 @@ class AlbumsHome implements ICollection { throw new Forbidden('Not allowed to create files in this folder'); } + /** + * @return void + */ public function createDirectory($name) { $uid = $this->user->getUID(); $this->albumMapper->create($uid, $name); @@ -87,10 +101,14 @@ class AlbumsHome implements ICollection { * @return AlbumRoot[] */ public function getChildren(): array { - $folders = $this->albumMapper->getForUserWithFiles($this->user->getUID()); - return array_map(function (AlbumWithFiles $folder) { - return new AlbumRoot($this->albumMapper, $folder, $this->rootFolder, $this->userFolder, $this->user); - }, $folders); + if ($this->children === null) { + $folders = $this->albumMapper->getForUserWithFiles($this->user->getUID()); + $this->children = array_map(function (AlbumWithFiles $folder) { + return new AlbumRoot($this->albumMapper, $folder, $this->rootFolder, $this->userFolder, $this->user); + }, $folders); + } + + return $this->children; } public function childExists($name): bool { diff --git a/lib/Sabre/Album/PropFindPlugin.php b/lib/Sabre/Album/PropFindPlugin.php index ce7f0eff..040ef5ac 100644 --- a/lib/Sabre/Album/PropFindPlugin.php +++ b/lib/Sabre/Album/PropFindPlugin.php @@ -27,6 +27,7 @@ use OC\Metadata\IMetadataManager; use OCA\DAV\Connector\Sabre\FilesPlugin; use OCA\Photos\Album\AlbumMapper; use OCP\IConfig; +use OCP\IPreview; use Sabre\DAV\INode; use Sabre\DAV\PropFind; use Sabre\DAV\PropPatch; @@ -36,11 +37,18 @@ use Sabre\DAV\Tree; class PropFindPlugin extends ServerPlugin { public const FILE_NAME_PROPERTYNAME = '{http://nextcloud.org/ns}file-name'; + public const REALPATH_PROPERTYNAME = '{http://nextcloud.org/ns}realpath'; + public const FAVORITE_PROPERTYNAME = '{http://owncloud.org/ns}favorite'; + public const DATE_RANGE_PROPERTYNAME = '{http://nextcloud.org/ns}dateRange'; public const LOCATION_PROPERTYNAME = '{http://nextcloud.org/ns}location'; public const LAST_PHOTO_PROPERTYNAME = '{http://nextcloud.org/ns}last-photo'; + public const NBITEMS_PROPERTYNAME = '{http://nextcloud.org/ns}nbItems'; + + public const TAG_FAVORITE = '_$!!$_'; private IConfig $config; private IMetadataManager $metadataManager; + private IPreview $previewManager; private bool $metadataEnabled; private ?Tree $tree; private AlbumMapper $albumMapper; @@ -48,31 +56,35 @@ class PropFindPlugin extends ServerPlugin { public function __construct( IConfig $config, IMetadataManager $metadataManager, + IPreview $previewManager, AlbumMapper $albumMapper ) { $this->config = $config; $this->metadataManager = $metadataManager; + $this->previewManager = $previewManager; $this->albumMapper = $albumMapper; $this->metadataEnabled = $this->config->getSystemValueBool('enable_file_metadata', true); } - + /** + * @return void + */ public function initialize(Server $server) { $this->tree = $server->tree; $server->on('propFind', [$this, 'propFind']); $server->on('propPatch', [$this, 'handleUpdateProperties']); } - public function propFind(PropFind $propFind, INode $node) { + public function propFind(PropFind $propFind, INode $node): void { if ($node instanceof AlbumPhoto) { - $propFind->handle(self::FILE_NAME_PROPERTYNAME, function () use ($node) { - return $node->getFile()->getName(); - }); - $propFind->handle(FilesPlugin::INTERNAL_FILEID_PROPERTYNAME, function () use ($node) { - return $node->getFile()->getFileId(); - }); - $propFind->handle(FilesPlugin::GETETAG_PROPERTYNAME, function () use ($node): string { - return $node->getETag(); + $propFind->handle(FilesPlugin::INTERNAL_FILEID_PROPERTYNAME, fn () => $node->getFile()->getFileId()); + $propFind->handle(FilesPlugin::GETETAG_PROPERTYNAME, fn () => $node->getETag()); + $propFind->handle(self::FILE_NAME_PROPERTYNAME, fn () => $node->getFile()->getName()); + $propFind->handle(self::REALPATH_PROPERTYNAME, fn () => $node->getFileInfo()->getPath()); + $propFind->handle(self::FAVORITE_PROPERTYNAME, fn () => $node->isFavorite() ? 1 : 0); + + $propFind->handle(FilesPlugin::HAS_PREVIEW_PROPERTYNAME, function () use ($node) { + return json_encode($this->previewManager->isAvailable($node->getFileInfo())); }); if ($this->metadataEnabled) { @@ -93,12 +105,10 @@ class PropFindPlugin extends ServerPlugin { } if ($node instanceof AlbumRoot) { - $propFind->handle(self::LOCATION_PROPERTYNAME, function () use ($node) { - return $node->getAlbum()->getAlbum()->getLocation(); - }); - $propFind->handle(self::LAST_PHOTO_PROPERTYNAME, function () use ($node) { - return $node->getAlbum()->getAlbum()->getLastAddedPhoto(); - }); + $propFind->handle(self::LAST_PHOTO_PROPERTYNAME, fn () => $node->getAlbum()->getAlbum()->getLastAddedPhoto()); + $propFind->handle(self::NBITEMS_PROPERTYNAME, fn () => count($node->getChildren())); + $propFind->handle(self::LOCATION_PROPERTYNAME, fn () => $node->getAlbum()->getAlbum()->getLocation()); + $propFind->handle(self::DATE_RANGE_PROPERTYNAME, fn () => json_encode($node->getDateRange())); // TODO detect dynamically which metadata groups are requested and // preload all of them and not just size @@ -115,7 +125,7 @@ class PropFindPlugin extends ServerPlugin { } } - public function handleUpdateProperties($path, PropPatch $propPatch) { + public function handleUpdateProperties($path, PropPatch $propPatch): void { $node = $this->tree->getNodeForPath($path); if ($node instanceof AlbumRoot) { $propPatch->handle(self::LOCATION_PROPERTYNAME, function ($location) use ($node) { diff --git a/lib/Sabre/PhotosHome.php b/lib/Sabre/PhotosHome.php index d37c8a11..d3cd1c94 100644 --- a/lib/Sabre/PhotosHome.php +++ b/lib/Sabre/PhotosHome.php @@ -52,6 +52,9 @@ class PhotosHome implements ICollection { $this->userFolder = $rootFolder->getUserFolder($user->getUID()); } + /** + * @return never + */ public function delete() { throw new Forbidden(); } @@ -61,6 +64,9 @@ class PhotosHome implements ICollection { return $name; } + /** + * @return never + */ public function setName($name) { throw new Forbidden('Permission denied to rename this folder'); } @@ -69,6 +75,9 @@ class PhotosHome implements ICollection { throw new Forbidden('Not allowed to create files in this folder'); } + /** + * @return never + */ public function createDirectory($name) { throw new Forbidden('Permission denied to create folders in this folder'); } diff --git a/lib/Sabre/RootCollection.php b/lib/Sabre/RootCollection.php index d2478991..c5cc1e82 100644 --- a/lib/Sabre/RootCollection.php +++ b/lib/Sabre/RootCollection.php @@ -26,7 +26,6 @@ namespace OCA\Photos\Sabre; use OCA\Photos\Album\AlbumMapper; use OCP\Files\IRootFolder; use OCP\IUserSession; -use Sabre\DAV\INode; use Sabre\DAVACL\AbstractPrincipalCollection; use Sabre\DAVACL\PrincipalBackend; @@ -56,7 +55,6 @@ class RootCollection extends AbstractPrincipalCollection { * supplied by the authentication backend. * * @param array $principalInfo - * @return INode */ public function getChildForPrincipal(array $principalInfo): PhotosHome { [, $name] = \Sabre\Uri\split($principalInfo['uri']); diff --git a/psalm.xml b/psalm.xml index 77f99494..294f7289 100644 --- a/psalm.xml +++ b/psalm.xml @@ -1,22 +1,21 @@ - - - - - - - - + + + + + + + + - + + + + + + @@ -26,7 +25,23 @@ + + + + + + + + + + + + + + + + - + \ No newline at end of file diff --git a/src/Photos.vue b/src/Photos.vue index 7835fbfa..2ec4e0a7 100644 --- a/src/Photos.vue +++ b/src/Photos.vue @@ -28,58 +28,38 @@ class="app-navigation__all_media" :title="t('photos', 'All media')" exact> - + - + - + - + - + - + - + - + - + - + + + diff --git a/src/components/FilesListViewer.vue b/src/components/FilesListViewer.vue new file mode 100644 index 00000000..a9a7dbbe --- /dev/null +++ b/src/components/FilesListViewer.vue @@ -0,0 +1,238 @@ + + + + diff --git a/src/components/FilesPicker.vue b/src/components/FilesPicker.vue new file mode 100644 index 00000000..57cb83ef --- /dev/null +++ b/src/components/FilesPicker.vue @@ -0,0 +1,249 @@ + + + + + + diff --git a/src/components/PhotosHeader.vue b/src/components/PhotosHeader.vue deleted file mode 100644 index eb151851..00000000 --- a/src/components/PhotosHeader.vue +++ /dev/null @@ -1,204 +0,0 @@ - - - - - diff --git a/src/components/ShareAlbumForm.vue b/src/components/ShareAlbumForm.vue new file mode 100644 index 00000000..ea1c92ed --- /dev/null +++ b/src/components/ShareAlbumForm.vue @@ -0,0 +1,9 @@ + + + diff --git a/src/components/TiledLayout.vue b/src/components/TiledLayout.vue index 0bb379c8..895307d4 100644 --- a/src/components/TiledLayout.vue +++ b/src/components/TiledLayout.vue @@ -1,5 +1,5 @@ - + @@ -32,6 +32,7 @@ diff --git a/src/components/VirtualScrolling.vue b/src/components/VirtualScrolling.vue index 60b30a3c..4786e3f7 100644 --- a/src/components/VirtualScrolling.vue +++ b/src/components/VirtualScrolling.vue @@ -25,6 +25,7 @@ class="vs-rows-container" :style="rowsContainerStyle"> +
+
+ diff --git a/src/views/Albums.vue b/src/views/Albums.vue index 6bd7dccd..a37a1fb9 100644 --- a/src/views/Albums.vue +++ b/src/views/Albums.vue @@ -1,8 +1,7 @@ - - diff --git a/src/views/Folders.vue b/src/views/Folders.vue new file mode 100644 index 00000000..e85b7583 --- /dev/null +++ b/src/views/Folders.vue @@ -0,0 +1,257 @@ + + + + + + + diff --git a/src/views/Tags.vue b/src/views/Tags.vue index f451a96d..9737843a 100644 --- a/src/views/Tags.vue +++ b/src/views/Tags.vue @@ -82,10 +82,6 @@ export default { type: String, default: '', }, - loading: { - type: Boolean, - required: true, - }, isRoot: { type: Boolean, default: true, @@ -96,6 +92,7 @@ export default { return { error: null, cancelRequest: null, + loading: false, } }, @@ -215,7 +212,7 @@ export default { // if we don't already have some cached data let's show a loader if (!this.tags[this.tagId]) { - this.$emit('update:loading', true) + this.loading = true } this.error = null @@ -232,7 +229,7 @@ export default { this.error = true } finally { // done loading - this.$emit('update:loading', false) + this.loading = false this.cancelRequest = null } @@ -249,7 +246,7 @@ export default { // if we don't already have some cached data let's show a loader if (!this.tags[this.tagId]) { - this.$emit('update:loading', true) + this.loading = true } this.error = null @@ -267,12 +264,11 @@ export default { this.error = true } finally { // done loading - this.$emit('update:loading', false) + this.loading = false this.cancelRequest = null } }, }, - } diff --git a/src/views/Timeline.vue b/src/views/Timeline.vue index 725d4488..d2813ffc 100644 --- a/src/views/Timeline.vue +++ b/src/views/Timeline.vue @@ -3,6 +3,7 @@ - - @author John Molakvoæ - @author Corentin Mors + - @author Louis Chemineau - - @license AGPL-3.0-or-later - @@ -22,99 +23,162 @@ --> diff --git a/tests/Album/AlbumMapperTest.php b/tests/Album/AlbumMapperTest.php index f0324ef5..56e9e41d 100644 --- a/tests/Album/AlbumMapperTest.php +++ b/tests/Album/AlbumMapperTest.php @@ -56,7 +56,7 @@ class AlbumMapperTest extends TestCase { $this->connection = \OC::$server->get(IDBConnection::class); $this->mimeLoader = \OC::$server->get(IMimeTypeLoader::class); $this->timeFactory = $this->createMock(ITimeFactory::class); - $this->timeFactory->method('getTime')->willReturnCallback(function() { + $this->timeFactory->method('getTime')->willReturnCallback(function () { return $this->time; }); @@ -120,7 +120,7 @@ class AlbumMapperTest extends TestCase { $this->mapper->create("user2", "album3"); $retrievedAlbums = $this->mapper->getForUser('user1'); - usort($retrievedAlbums, function(AlbumInfo $a, AlbumInfo $b) { + usort($retrievedAlbums, function (AlbumInfo $a, AlbumInfo $b) { return $a->getId() <=> $b->getId(); }); $this->assertEquals([$album1, $album2], $retrievedAlbums); @@ -145,7 +145,7 @@ class AlbumMapperTest extends TestCase { $this->mapper->delete($album1->getId()); $retrievedAlbums = $this->mapper->getForUser('user1'); - usort($retrievedAlbums, function(AlbumInfo $a, AlbumInfo $b) { + usort($retrievedAlbums, function (AlbumInfo $a, AlbumInfo $b) { return $a->getId() <=> $b->getId(); }); $this->assertEquals([$album2], $retrievedAlbums); @@ -185,7 +185,7 @@ class AlbumMapperTest extends TestCase { $this->mapper->addFile($album2->getId(), $fileId1); $albumsWithFiles = $this->mapper->getForUserWithFiles("user1"); - usort($albumsWithFiles, function(AlbumWithFiles $a, AlbumWithFiles $b) { + usort($albumsWithFiles, function (AlbumWithFiles $a, AlbumWithFiles $b) { return $a->getAlbum()->getId() <=> $b->getAlbum()->getId(); }); $this->assertCount(2, $albumsWithFiles); @@ -193,7 +193,7 @@ class AlbumMapperTest extends TestCase { $this->assertEquals($album1->getId(), $albumsWithFiles[0]->getAlbum()->getId()); $this->assertEquals($fileId2, $albumsWithFiles[0]->getAlbum()->getLastAddedPhoto()); $files = $albumsWithFiles[0]->getFiles(); - usort($files, function(AlbumFile $a, AlbumFile $b) { + usort($files, function (AlbumFile $a, AlbumFile $b) { return $a->getFileId() <=> $b->getFileId(); }); $this->assertCount(2, $files); @@ -204,7 +204,7 @@ class AlbumMapperTest extends TestCase { $this->assertEquals($fileId1, $albumsWithFiles[1]->getAlbum()->getLastAddedPhoto()); $files = $albumsWithFiles[1]->getFiles(); - usort($files, function(AlbumFile $a, AlbumFile $b) { + usort($files, function (AlbumFile $a, AlbumFile $b) { return $a->getFileId() <=> $b->getFileId(); }); $this->assertCount(1, $files); @@ -226,7 +226,7 @@ class AlbumMapperTest extends TestCase { $this->mapper->addFile($album1->getId(), $fileId3); $albumsWithFiles = $this->mapper->getForUserWithFiles("user1"); - usort($albumsWithFiles, function(AlbumWithFiles $a, AlbumWithFiles $b) { + usort($albumsWithFiles, function (AlbumWithFiles $a, AlbumWithFiles $b) { return $a->getAlbum()->getId() <=> $b->getAlbum()->getId(); }); $this->assertCount(1, $albumsWithFiles); @@ -234,7 +234,7 @@ class AlbumMapperTest extends TestCase { $this->assertEquals($album1->getId(), $albumsWithFiles[0]->getAlbum()->getId()); $this->assertEquals($fileId3, $albumsWithFiles[0]->getAlbum()->getLastAddedPhoto()); $files = $albumsWithFiles[0]->getFiles(); - usort($files, function(AlbumFile $a, AlbumFile $b) { + usort($files, function (AlbumFile $a, AlbumFile $b) { return $a->getFileId() <=> $b->getFileId(); }); $this->assertCount(3, $files); @@ -247,7 +247,7 @@ class AlbumMapperTest extends TestCase { $this->mapper->removeFile($album1->getId(), $fileId2); $albumsWithFiles = $this->mapper->getForUserWithFiles("user1"); - usort($albumsWithFiles, function(AlbumWithFiles $a, AlbumWithFiles $b) { + usort($albumsWithFiles, function (AlbumWithFiles $a, AlbumWithFiles $b) { return $a->getAlbum()->getId() <=> $b->getAlbum()->getId(); }); $this->assertCount(1, $albumsWithFiles); @@ -255,7 +255,7 @@ class AlbumMapperTest extends TestCase { $this->assertEquals($album1->getId(), $albumsWithFiles[0]->getAlbum()->getId()); $this->assertEquals($fileId3, $albumsWithFiles[0]->getAlbum()->getLastAddedPhoto()); $files = $albumsWithFiles[0]->getFiles(); - usort($files, function(AlbumFile $a, AlbumFile $b) { + usort($files, function (AlbumFile $a, AlbumFile $b) { return $a->getFileId() <=> $b->getFileId(); }); $this->assertCount(2, $files); @@ -267,7 +267,7 @@ class AlbumMapperTest extends TestCase { $this->mapper->removeFile($album1->getId(), $fileId3); $albumsWithFiles = $this->mapper->getForUserWithFiles("user1"); - usort($albumsWithFiles, function(AlbumWithFiles $a, AlbumWithFiles $b) { + usort($albumsWithFiles, function (AlbumWithFiles $a, AlbumWithFiles $b) { return $a->getAlbum()->getId() <=> $b->getAlbum()->getId(); }); $this->assertCount(1, $albumsWithFiles); @@ -275,7 +275,7 @@ class AlbumMapperTest extends TestCase { $this->assertEquals($album1->getId(), $albumsWithFiles[0]->getAlbum()->getId()); $this->assertEquals($fileId1, $albumsWithFiles[0]->getAlbum()->getLastAddedPhoto()); $files = $albumsWithFiles[0]->getFiles(); - usort($files, function(AlbumFile $a, AlbumFile $b) { + usort($files, function (AlbumFile $a, AlbumFile $b) { return $a->getFileId() <=> $b->getFileId(); }); $this->assertCount(1, $files); @@ -286,7 +286,7 @@ class AlbumMapperTest extends TestCase { $this->mapper->removeFile($album1->getId(), $fileId1); $albumsWithFiles = $this->mapper->getForUserWithFiles("user1"); - usort($albumsWithFiles, function(AlbumWithFiles $a, AlbumWithFiles $b) { + usort($albumsWithFiles, function (AlbumWithFiles $a, AlbumWithFiles $b) { return $a->getAlbum()->getId() <=> $b->getAlbum()->getId(); }); $this->assertCount(1, $albumsWithFiles); diff --git a/webpack.js b/webpack.js index 846cfb6f..338bfb3c 100644 --- a/webpack.js +++ b/webpack.js @@ -33,7 +33,7 @@ webpackRules.RULE_SCSS.use = [ webpackRules.RULE_ASSETS.test = /\.(png|jpe?g|gif|woff2?|eot|ttf)$/ webpackRules.RULE_RAW_SVGS = { test: /\.svg$/, - loader: 'raw-loader', + type: 'asset/source', } webpackConfig.module.rules = Object.values(webpackRules)