backend notifications implementation

This commit is contained in:
Čarodej
2022-03-10 11:49:02 +01:00
parent 70d7f2f5bd
commit 64e80d387b
20 changed files with 617 additions and 280 deletions

338
composer.lock generated
View File

@@ -280,16 +280,16 @@
},
{
"name": "aws/aws-sdk-php",
"version": "3.211.1",
"version": "3.212.5",
"source": {
"type": "git",
"url": "https://github.com/aws/aws-sdk-php.git",
"reference": "fa6b2cc2df7563b775b346d60da4d36c06062ce1"
"reference": "ed69594b385233bb895342e18008cd811e8225e7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/fa6b2cc2df7563b775b346d60da4d36c06062ce1",
"reference": "fa6b2cc2df7563b775b346d60da4d36c06062ce1",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/ed69594b385233bb895342e18008cd811e8225e7",
"reference": "ed69594b385233bb895342e18008cd811e8225e7",
"shasum": ""
},
"require": {
@@ -365,9 +365,9 @@
"support": {
"forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
"issues": "https://github.com/aws/aws-sdk-php/issues",
"source": "https://github.com/aws/aws-sdk-php/tree/3.211.1"
"source": "https://github.com/aws/aws-sdk-php/tree/3.212.5"
},
"time": "2022-03-01T19:17:13+00:00"
"time": "2022-03-09T19:19:58+00:00"
},
{
"name": "bacon/bacon-qr-code",
@@ -1413,16 +1413,16 @@
},
{
"name": "doctrine/dbal",
"version": "2.13.7",
"version": "2.13.8",
"source": {
"type": "git",
"url": "https://github.com/doctrine/dbal.git",
"reference": "6e22f6012b42d7932674857989fcf184e9e9b1c3"
"reference": "dc9b3c3c8592c935a6e590441f9abc0f9eba335b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/dbal/zipball/6e22f6012b42d7932674857989fcf184e9e9b1c3",
"reference": "6e22f6012b42d7932674857989fcf184e9e9b1c3",
"url": "https://api.github.com/repos/doctrine/dbal/zipball/dc9b3c3c8592c935a6e590441f9abc0f9eba335b",
"reference": "dc9b3c3c8592c935a6e590441f9abc0f9eba335b",
"shasum": ""
},
"require": {
@@ -1435,13 +1435,13 @@
"require-dev": {
"doctrine/coding-standard": "9.0.0",
"jetbrains/phpstorm-stubs": "2021.1",
"phpstan/phpstan": "1.3.0",
"phpunit/phpunit": "^7.5.20|^8.5|9.5.11",
"phpstan/phpstan": "1.4.6",
"phpunit/phpunit": "^7.5.20|^8.5|9.5.16",
"psalm/plugin-phpunit": "0.16.1",
"squizlabs/php_codesniffer": "3.6.2",
"symfony/cache": "^4.4",
"symfony/console": "^2.0.5|^3.0|^4.0|^5.0",
"vimeo/psalm": "4.16.1"
"vimeo/psalm": "4.22.0"
},
"suggest": {
"symfony/console": "For helpful console commands such as SQL execution and import of files."
@@ -1502,7 +1502,7 @@
],
"support": {
"issues": "https://github.com/doctrine/dbal/issues",
"source": "https://github.com/doctrine/dbal/tree/2.13.7"
"source": "https://github.com/doctrine/dbal/tree/2.13.8"
},
"funding": [
{
@@ -1518,7 +1518,7 @@
"type": "tidelift"
}
],
"time": "2022-01-06T09:08:04+00:00"
"time": "2022-03-09T15:25:46+00:00"
},
{
"name": "doctrine/deprecations",
@@ -1750,29 +1750,30 @@
},
{
"name": "doctrine/instantiator",
"version": "1.4.0",
"version": "1.4.1",
"source": {
"type": "git",
"url": "https://github.com/doctrine/instantiator.git",
"reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b"
"reference": "10dcfce151b967d20fde1b34ae6640712c3891bc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b",
"reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b",
"url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc",
"reference": "10dcfce151b967d20fde1b34ae6640712c3891bc",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"require-dev": {
"doctrine/coding-standard": "^8.0",
"doctrine/coding-standard": "^9",
"ext-pdo": "*",
"ext-phar": "*",
"phpbench/phpbench": "^0.13 || 1.0.0-alpha2",
"phpstan/phpstan": "^0.12",
"phpstan/phpstan-phpunit": "^0.12",
"phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
"phpbench/phpbench": "^0.16 || ^1",
"phpstan/phpstan": "^1.4",
"phpstan/phpstan-phpunit": "^1",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
"vimeo/psalm": "^4.22"
},
"type": "library",
"autoload": {
@@ -1799,7 +1800,7 @@
],
"support": {
"issues": "https://github.com/doctrine/instantiator/issues",
"source": "https://github.com/doctrine/instantiator/tree/1.4.0"
"source": "https://github.com/doctrine/instantiator/tree/1.4.1"
},
"funding": [
{
@@ -1815,7 +1816,7 @@
"type": "tidelift"
}
],
"time": "2020-11-10T18:47:58+00:00"
"time": "2022-03-03T08:28:38+00:00"
},
{
"name": "doctrine/lexer",
@@ -2281,21 +2282,21 @@
},
{
"name": "friendsofphp/php-cs-fixer",
"version": "v3.6.0",
"version": "v3.7.0",
"source": {
"type": "git",
"url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git",
"reference": "1975e4453eb2726d1f50da0ce7fa91295029a4fa"
"reference": "7705d5a985132a40282d18a176eb9a4a0497747c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/1975e4453eb2726d1f50da0ce7fa91295029a4fa",
"reference": "1975e4453eb2726d1f50da0ce7fa91295029a4fa",
"url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/7705d5a985132a40282d18a176eb9a4a0497747c",
"reference": "7705d5a985132a40282d18a176eb9a4a0497747c",
"shasum": ""
},
"require": {
"composer/semver": "^3.2",
"composer/xdebug-handler": "^3.0",
"composer/xdebug-handler": "^3.0.3",
"doctrine/annotations": "^1.13",
"ext-json": "*",
"ext-tokenizer": "*",
@@ -2307,8 +2308,8 @@
"symfony/finder": "^5.4 || ^6.0",
"symfony/options-resolver": "^5.4 || ^6.0",
"symfony/polyfill-mbstring": "^1.23",
"symfony/polyfill-php80": "^1.23",
"symfony/polyfill-php81": "^1.23",
"symfony/polyfill-php80": "^1.25",
"symfony/polyfill-php81": "^1.25",
"symfony/process": "^5.4 || ^6.0",
"symfony/stopwatch": "^5.4 || ^6.0"
},
@@ -2358,7 +2359,7 @@
"description": "A tool to automatically fix PHP code style",
"support": {
"issues": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues",
"source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v3.6.0"
"source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v3.7.0"
},
"funding": [
{
@@ -2366,7 +2367,7 @@
"type": "github"
}
],
"time": "2022-02-07T18:02:40+00:00"
"time": "2022-03-07T16:59:59+00:00"
},
{
"name": "fruitcake/laravel-cors",
@@ -3226,16 +3227,16 @@
},
{
"name": "laravel/fortify",
"version": "v1.11.1",
"version": "v1.11.2",
"source": {
"type": "git",
"url": "https://github.com/laravel/fortify.git",
"reference": "eb1d07c849fee750e4cacba969490a72e88211ae"
"reference": "35c44f36f2a93fb7d3d8b38d6b7794913c69d414"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/fortify/zipball/eb1d07c849fee750e4cacba969490a72e88211ae",
"reference": "eb1d07c849fee750e4cacba969490a72e88211ae",
"url": "https://api.github.com/repos/laravel/fortify/zipball/35c44f36f2a93fb7d3d8b38d6b7794913c69d414",
"reference": "35c44f36f2a93fb7d3d8b38d6b7794913c69d414",
"shasum": ""
},
"require": {
@@ -3285,20 +3286,20 @@
"issues": "https://github.com/laravel/fortify/issues",
"source": "https://github.com/laravel/fortify"
},
"time": "2022-02-23T15:04:40+00:00"
"time": "2022-03-04T20:27:28+00:00"
},
{
"name": "laravel/framework",
"version": "v9.2.0",
"version": "v9.4.1",
"source": {
"type": "git",
"url": "https://github.com/laravel/framework.git",
"reference": "13372872bed31ae75df8709b9de5cde01d50646e"
"reference": "29f0aaade82eadd20ef881b4efb88b0dad4e9a5b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/framework/zipball/13372872bed31ae75df8709b9de5cde01d50646e",
"reference": "13372872bed31ae75df8709b9de5cde01d50646e",
"url": "https://api.github.com/repos/laravel/framework/zipball/29f0aaade82eadd20ef881b4efb88b0dad4e9a5b",
"reference": "29f0aaade82eadd20ef881b4efb88b0dad4e9a5b",
"shasum": ""
},
"require": {
@@ -3384,7 +3385,7 @@
"mockery/mockery": "^1.4.4",
"orchestra/testbench-core": "^7.1",
"pda/pheanstalk": "^4.0",
"phpstan/phpstan": "^1.0",
"phpstan/phpstan": "^1.4.7",
"phpunit/phpunit": "^9.5.8",
"predis/predis": "^1.1.9",
"symfony/cache": "^6.0"
@@ -3464,7 +3465,7 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
"time": "2022-02-22T15:30:23+00:00"
"time": "2022-03-08T16:17:00+00:00"
},
{
"name": "laravel/sanctum",
@@ -4047,16 +4048,16 @@
},
{
"name": "league/flysystem",
"version": "3.0.10",
"version": "3.0.11",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem.git",
"reference": "bbc5026adb5a423dfcdcecec74c7e15943ff6115"
"reference": "1ca148713c23cadeb9d7526973f81fb4a04090a3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/bbc5026adb5a423dfcdcecec74c7e15943ff6115",
"reference": "bbc5026adb5a423dfcdcecec74c7e15943ff6115",
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/1ca148713c23cadeb9d7526973f81fb4a04090a3",
"reference": "1ca148713c23cadeb9d7526973f81fb4a04090a3",
"shasum": ""
},
"require": {
@@ -4117,7 +4118,7 @@
],
"support": {
"issues": "https://github.com/thephpleague/flysystem/issues",
"source": "https://github.com/thephpleague/flysystem/tree/3.0.10"
"source": "https://github.com/thephpleague/flysystem/tree/3.0.11"
},
"funding": [
{
@@ -4133,20 +4134,20 @@
"type": "tidelift"
}
],
"time": "2022-02-26T11:09:13+00:00"
"time": "2022-03-04T16:40:17+00:00"
},
{
"name": "league/flysystem-aws-s3-v3",
"version": "3.0.10",
"version": "3.0.11",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git",
"reference": "79c63dc761b6a389a38bd409c2bf8ced73c29261"
"reference": "6f78e668ee70c69dd43830ebb21b41ec11f648fc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/79c63dc761b6a389a38bd409c2bf8ced73c29261",
"reference": "79c63dc761b6a389a38bd409c2bf8ced73c29261",
"url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/6f78e668ee70c69dd43830ebb21b41ec11f648fc",
"reference": "6f78e668ee70c69dd43830ebb21b41ec11f648fc",
"shasum": ""
},
"require": {
@@ -4187,9 +4188,9 @@
],
"support": {
"issues": "https://github.com/thephpleague/flysystem-aws-s3-v3/issues",
"source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.0.10"
"source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.0.11"
},
"time": "2022-02-26T10:59:05+00:00"
"time": "2022-03-04T16:39:25+00:00"
},
{
"name": "league/mime-type-detection",
@@ -4739,28 +4740,29 @@
},
{
"name": "myclabs/deep-copy",
"version": "1.10.2",
"version": "1.11.0",
"source": {
"type": "git",
"url": "https://github.com/myclabs/DeepCopy.git",
"reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220"
"reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220",
"reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220",
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614",
"reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"replace": {
"myclabs/deep-copy": "self.version"
"conflict": {
"doctrine/collections": "<1.6.8",
"doctrine/common": "<2.13.3 || >=3,<3.2.2"
},
"require-dev": {
"doctrine/collections": "^1.0",
"doctrine/common": "^2.6",
"phpunit/phpunit": "^7.1"
"doctrine/collections": "^1.6.8",
"doctrine/common": "^2.13.3 || ^3.2.2",
"phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
},
"type": "library",
"autoload": {
@@ -4785,7 +4787,7 @@
],
"support": {
"issues": "https://github.com/myclabs/DeepCopy/issues",
"source": "https://github.com/myclabs/DeepCopy/tree/1.10.2"
"source": "https://github.com/myclabs/DeepCopy/tree/1.11.0"
},
"funding": [
{
@@ -4793,7 +4795,7 @@
"type": "tidelift"
}
],
"time": "2020-11-13T09:40:50+00:00"
"time": "2022-03-03T13:19:32+00:00"
},
{
"name": "myclabs/php-enum",
@@ -5924,16 +5926,16 @@
},
{
"name": "phpunit/php-code-coverage",
"version": "9.2.14",
"version": "9.2.15",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
"reference": "9f4d60b6afe5546421462b76cd4e633ebc364ab4"
"reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/9f4d60b6afe5546421462b76cd4e633ebc364ab4",
"reference": "9f4d60b6afe5546421462b76cd4e633ebc364ab4",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2e9da11878c4202f97915c1cb4bb1ca318a63f5f",
"reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f",
"shasum": ""
},
"require": {
@@ -5989,7 +5991,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.14"
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.15"
},
"funding": [
{
@@ -5997,7 +5999,7 @@
"type": "github"
}
],
"time": "2022-02-28T12:38:02+00:00"
"time": "2022-03-07T09:28:20+00:00"
},
{
"name": "phpunit/php-file-iterator",
@@ -6242,16 +6244,16 @@
},
{
"name": "phpunit/phpunit",
"version": "9.5.16",
"version": "9.5.18",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "5ff8c545a50226c569310a35f4fa89d79f1ddfdc"
"reference": "1b5856028273bfd855e60a887278857d872ec67a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5ff8c545a50226c569310a35f4fa89d79f1ddfdc",
"reference": "5ff8c545a50226c569310a35f4fa89d79f1ddfdc",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1b5856028273bfd855e60a887278857d872ec67a",
"reference": "1b5856028273bfd855e60a887278857d872ec67a",
"shasum": ""
},
"require": {
@@ -6329,7 +6331,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.16"
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.18"
},
"funding": [
{
@@ -6341,7 +6343,7 @@
"type": "github"
}
],
"time": "2022-02-23T17:10:58+00:00"
"time": "2022-03-08T06:52:28+00:00"
},
{
"name": "pragmarx/google2fa",
@@ -9119,16 +9121,16 @@
},
{
"name": "spatie/laravel-backup",
"version": "8.0.8",
"version": "8.1.1",
"source": {
"type": "git",
"url": "https://github.com/spatie/laravel-backup.git",
"reference": "1e6e06cf75f6df21311a96fa99d767ff2c50078c"
"reference": "1a546127205b9afcb8e0dee6de7f2ff93f927ea4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/spatie/laravel-backup/zipball/1e6e06cf75f6df21311a96fa99d767ff2c50078c",
"reference": "1e6e06cf75f6df21311a96fa99d767ff2c50078c",
"url": "https://api.github.com/repos/spatie/laravel-backup/zipball/1a546127205b9afcb8e0dee6de7f2ff93f927ea4",
"reference": "1a546127205b9afcb8e0dee6de7f2ff93f927ea4",
"shasum": ""
},
"require": {
@@ -9155,7 +9157,7 @@
"league/flysystem-aws-s3-v3": "^2.0|^3.0",
"mockery/mockery": "^1.4",
"orchestra/testbench": "^7.0",
"phpunit/phpunit": "^9.5.4"
"pestphp/pest": "^1.20"
},
"suggest": {
"laravel/slack-notification-channel": "Required for sending notifications via Slack"
@@ -9198,7 +9200,7 @@
],
"support": {
"issues": "https://github.com/spatie/laravel-backup/issues",
"source": "https://github.com/spatie/laravel-backup/tree/8.0.8"
"source": "https://github.com/spatie/laravel-backup/tree/8.1.1"
},
"funding": [
{
@@ -9210,7 +9212,7 @@
"type": "other"
}
],
"time": "2022-02-23T18:35:41+00:00"
"time": "2022-03-08T10:23:50+00:00"
},
{
"name": "spatie/laravel-package-tools",
@@ -9756,16 +9758,16 @@
},
{
"name": "stripe/stripe-php",
"version": "v7.115.0",
"version": "v7.116.0",
"source": {
"type": "git",
"url": "https://github.com/stripe/stripe-php.git",
"reference": "a1c528a5076b80dc156601505994870d23313a73"
"reference": "7a39f594f213ed3f443a95adf769d1ecbc8393e7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/stripe/stripe-php/zipball/a1c528a5076b80dc156601505994870d23313a73",
"reference": "a1c528a5076b80dc156601505994870d23313a73",
"url": "https://api.github.com/repos/stripe/stripe-php/zipball/7a39f594f213ed3f443a95adf769d1ecbc8393e7",
"reference": "7a39f594f213ed3f443a95adf769d1ecbc8393e7",
"shasum": ""
},
"require": {
@@ -9810,9 +9812,9 @@
],
"support": {
"issues": "https://github.com/stripe/stripe-php/issues",
"source": "https://github.com/stripe/stripe-php/tree/v7.115.0"
"source": "https://github.com/stripe/stripe-php/tree/v7.116.0"
},
"time": "2022-03-01T22:45:01+00:00"
"time": "2022-03-02T15:51:15+00:00"
},
{
"name": "symfony/console",
@@ -10276,16 +10278,16 @@
},
{
"name": "symfony/filesystem",
"version": "v6.0.5",
"version": "v6.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
"reference": "6646c13f787057d64701a3a0235cf9567c6ccbbd"
"reference": "52b888523545b0b4049ab9ce48766802484d7046"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/6646c13f787057d64701a3a0235cf9567c6ccbbd",
"reference": "6646c13f787057d64701a3a0235cf9567c6ccbbd",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/52b888523545b0b4049ab9ce48766802484d7046",
"reference": "52b888523545b0b4049ab9ce48766802484d7046",
"shasum": ""
},
"require": {
@@ -10319,7 +10321,7 @@
"description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/filesystem/tree/v6.0.5"
"source": "https://github.com/symfony/filesystem/tree/v6.0.6"
},
"funding": [
{
@@ -10335,7 +10337,7 @@
"type": "tidelift"
}
],
"time": "2022-02-28T07:42:30+00:00"
"time": "2022-03-02T12:58:14+00:00"
},
{
"name": "symfony/finder",
@@ -10562,16 +10564,16 @@
},
{
"name": "symfony/http-foundation",
"version": "v6.0.5",
"version": "v6.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
"reference": "b460fb15905eef449c4c43a4f0c113eccee103b9"
"reference": "a000fcf2298a1bc79a1dcff22608792506534719"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/b460fb15905eef449c4c43a4f0c113eccee103b9",
"reference": "b460fb15905eef449c4c43a4f0c113eccee103b9",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/a000fcf2298a1bc79a1dcff22608792506534719",
"reference": "a000fcf2298a1bc79a1dcff22608792506534719",
"shasum": ""
},
"require": {
@@ -10614,7 +10616,7 @@
"description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/http-foundation/tree/v6.0.5"
"source": "https://github.com/symfony/http-foundation/tree/v6.0.6"
},
"funding": [
{
@@ -10630,20 +10632,20 @@
"type": "tidelift"
}
],
"time": "2022-02-21T17:15:17+00:00"
"time": "2022-03-05T21:04:00+00:00"
},
{
"name": "symfony/http-kernel",
"version": "v6.0.5",
"version": "v6.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
"reference": "5ad3f5e5fa772a8b5c6bb217f8379b533afac2ba"
"reference": "f9e49ad9fe16895b24cd7a09dc28d3364282e21a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/5ad3f5e5fa772a8b5c6bb217f8379b533afac2ba",
"reference": "5ad3f5e5fa772a8b5c6bb217f8379b533afac2ba",
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/f9e49ad9fe16895b24cd7a09dc28d3364282e21a",
"reference": "f9e49ad9fe16895b24cd7a09dc28d3364282e21a",
"shasum": ""
},
"require": {
@@ -10723,7 +10725,7 @@
"description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/http-kernel/tree/v6.0.5"
"source": "https://github.com/symfony/http-kernel/tree/v6.0.6"
},
"funding": [
{
@@ -10739,7 +10741,7 @@
"type": "tidelift"
}
],
"time": "2022-02-28T08:05:03+00:00"
"time": "2022-03-05T21:19:20+00:00"
},
{
"name": "symfony/mailer",
@@ -11030,7 +11032,7 @@
},
{
"name": "symfony/polyfill-ctype",
"version": "v1.24.0",
"version": "v1.25.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
@@ -11092,7 +11094,7 @@
"portable"
],
"support": {
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.24.0"
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.25.0"
},
"funding": [
{
@@ -11112,7 +11114,7 @@
},
{
"name": "symfony/polyfill-intl-grapheme",
"version": "v1.24.0",
"version": "v1.25.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
@@ -11173,7 +11175,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.24.0"
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.25.0"
},
"funding": [
{
@@ -11193,7 +11195,7 @@
},
{
"name": "symfony/polyfill-intl-idn",
"version": "v1.24.0",
"version": "v1.25.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-idn.git",
@@ -11260,7 +11262,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.24.0"
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.25.0"
},
"funding": [
{
@@ -11280,7 +11282,7 @@
},
{
"name": "symfony/polyfill-intl-normalizer",
"version": "v1.24.0",
"version": "v1.25.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
@@ -11344,7 +11346,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.24.0"
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.25.0"
},
"funding": [
{
@@ -11364,7 +11366,7 @@
},
{
"name": "symfony/polyfill-mbstring",
"version": "v1.24.0",
"version": "v1.25.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
@@ -11427,7 +11429,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.24.0"
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.25.0"
},
"funding": [
{
@@ -11447,7 +11449,7 @@
},
{
"name": "symfony/polyfill-php72",
"version": "v1.24.0",
"version": "v1.25.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php72.git",
@@ -11503,7 +11505,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php72/tree/v1.24.0"
"source": "https://github.com/symfony/polyfill-php72/tree/v1.25.0"
},
"funding": [
{
@@ -11523,16 +11525,16 @@
},
{
"name": "symfony/polyfill-php80",
"version": "v1.24.0",
"version": "v1.25.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php80.git",
"reference": "57b712b08eddb97c762a8caa32c84e037892d2e9"
"reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/57b712b08eddb97c762a8caa32c84e037892d2e9",
"reference": "57b712b08eddb97c762a8caa32c84e037892d2e9",
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/4407588e0d3f1f52efb65fbe92babe41f37fe50c",
"reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c",
"shasum": ""
},
"require": {
@@ -11586,7 +11588,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php80/tree/v1.24.0"
"source": "https://github.com/symfony/polyfill-php80/tree/v1.25.0"
},
"funding": [
{
@@ -11602,11 +11604,11 @@
"type": "tidelift"
}
],
"time": "2021-09-13T13:58:33+00:00"
"time": "2022-03-04T08:16:47+00:00"
},
{
"name": "symfony/polyfill-php81",
"version": "v1.24.0",
"version": "v1.25.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php81.git",
@@ -11665,7 +11667,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php81/tree/v1.24.0"
"source": "https://github.com/symfony/polyfill-php81/tree/v1.25.0"
},
"funding": [
{
@@ -12216,16 +12218,16 @@
},
{
"name": "symfony/translation",
"version": "v6.0.5",
"version": "v6.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation.git",
"reference": "e69501c71107cc3146b32aaa45f4edd0c3427875"
"reference": "f6639cb9b5e0c57fe31e3263b900a77eedb0c908"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/translation/zipball/e69501c71107cc3146b32aaa45f4edd0c3427875",
"reference": "e69501c71107cc3146b32aaa45f4edd0c3427875",
"url": "https://api.github.com/repos/symfony/translation/zipball/f6639cb9b5e0c57fe31e3263b900a77eedb0c908",
"reference": "f6639cb9b5e0c57fe31e3263b900a77eedb0c908",
"shasum": ""
},
"require": {
@@ -12291,7 +12293,7 @@
"description": "Provides tools to internationalize your application",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/translation/tree/v6.0.5"
"source": "https://github.com/symfony/translation/tree/v6.0.6"
},
"funding": [
{
@@ -12307,7 +12309,7 @@
"type": "tidelift"
}
],
"time": "2022-02-09T15:52:48+00:00"
"time": "2022-03-02T12:58:14+00:00"
},
{
"name": "symfony/translation-contracts",
@@ -12389,16 +12391,16 @@
},
{
"name": "symfony/var-dumper",
"version": "v6.0.5",
"version": "v6.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
"reference": "60d6a756d5f485df5e6e40b337334848f79f61ce"
"reference": "38358405ae948963c50a3aae3dfea598223ba15e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/60d6a756d5f485df5e6e40b337334848f79f61ce",
"reference": "60d6a756d5f485df5e6e40b337334848f79f61ce",
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/38358405ae948963c50a3aae3dfea598223ba15e",
"reference": "38358405ae948963c50a3aae3dfea598223ba15e",
"shasum": ""
},
"require": {
@@ -12457,7 +12459,7 @@
"dump"
],
"support": {
"source": "https://github.com/symfony/var-dumper/tree/v6.0.5"
"source": "https://github.com/symfony/var-dumper/tree/v6.0.6"
},
"funding": [
{
@@ -12473,7 +12475,7 @@
"type": "tidelift"
}
],
"time": "2022-02-21T17:15:17+00:00"
"time": "2022-03-02T12:58:14+00:00"
},
{
"name": "teamtnt/tntsearch",
@@ -12844,16 +12846,16 @@
},
{
"name": "voku/portable-ascii",
"version": "2.0.0",
"version": "2.0.1",
"source": {
"type": "git",
"url": "https://github.com/voku/portable-ascii.git",
"reference": "9bd89e83cecdf8c37b64909454249eaed98b2c89"
"reference": "b56450eed252f6801410d810c8e1727224ae0743"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/voku/portable-ascii/zipball/9bd89e83cecdf8c37b64909454249eaed98b2c89",
"reference": "9bd89e83cecdf8c37b64909454249eaed98b2c89",
"url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743",
"reference": "b56450eed252f6801410d810c8e1727224ae0743",
"shasum": ""
},
"require": {
@@ -12890,7 +12892,7 @@
],
"support": {
"issues": "https://github.com/voku/portable-ascii/issues",
"source": "https://github.com/voku/portable-ascii/tree/2.0.0"
"source": "https://github.com/voku/portable-ascii/tree/2.0.1"
},
"funding": [
{
@@ -12914,7 +12916,7 @@
"type": "tidelift"
}
],
"time": "2022-01-24T18:59:03+00:00"
"time": "2022-03-08T17:03:00+00:00"
},
{
"name": "webmozart/assert",
@@ -13029,21 +13031,21 @@
"packages-dev": [
{
"name": "barryvdh/laravel-ide-helper",
"version": "v2.12.1",
"version": "v2.12.3",
"source": {
"type": "git",
"url": "https://github.com/barryvdh/laravel-ide-helper.git",
"reference": "999167d4c21e2ae748847f7c0e4565ae45f5c9f9"
"reference": "3ba1e2573b38f72107b8aacc4ee177fcab30a550"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/999167d4c21e2ae748847f7c0e4565ae45f5c9f9",
"reference": "999167d4c21e2ae748847f7c0e4565ae45f5c9f9",
"url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/3ba1e2573b38f72107b8aacc4ee177fcab30a550",
"reference": "3ba1e2573b38f72107b8aacc4ee177fcab30a550",
"shasum": ""
},
"require": {
"barryvdh/reflection-docblock": "^2.0.6",
"composer/composer": "^1.10.23 || ^2.1.9",
"composer/pcre": "^1 || ^2 || ^3",
"doctrine/dbal": "^2.6 || ^3",
"ext-json": "*",
"illuminate/console": "^8 || ^9",
@@ -13107,7 +13109,7 @@
],
"support": {
"issues": "https://github.com/barryvdh/laravel-ide-helper/issues",
"source": "https://github.com/barryvdh/laravel-ide-helper/tree/v2.12.1"
"source": "https://github.com/barryvdh/laravel-ide-helper/tree/v2.12.3"
},
"funding": [
{
@@ -13119,7 +13121,7 @@
"type": "github"
}
],
"time": "2022-01-24T21:36:43+00:00"
"time": "2022-03-06T14:33:42+00:00"
},
{
"name": "barryvdh/reflection-docblock",
@@ -13255,12 +13257,12 @@
"source": {
"type": "git",
"url": "https://github.com/composer/composer.git",
"reference": "575fbfb53fcc2388916d554271c99c8281fea782"
"reference": "ae23647f07932754dc9d7fd1d15657273301a009"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/composer/composer/zipball/575fbfb53fcc2388916d554271c99c8281fea782",
"reference": "575fbfb53fcc2388916d554271c99c8281fea782",
"url": "https://api.github.com/repos/composer/composer/zipball/ae23647f07932754dc9d7fd1d15657273301a009",
"reference": "ae23647f07932754dc9d7fd1d15657273301a009",
"shasum": ""
},
"require": {
@@ -13353,7 +13355,7 @@
"type": "tidelift"
}
],
"time": "2022-02-26T13:12:30+00:00"
"time": "2022-03-09T19:45:19+00:00"
},
{
"name": "composer/metadata-minifier",
@@ -14323,16 +14325,16 @@
},
{
"name": "spatie/ignition",
"version": "1.1.0",
"version": "1.2.3",
"source": {
"type": "git",
"url": "https://github.com/spatie/ignition.git",
"reference": "8ecde033600064e3ffdbf804deec0dcb05004387"
"reference": "ab8d1f938d3ffd20af25ad788a9d019e1123068c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/spatie/ignition/zipball/8ecde033600064e3ffdbf804deec0dcb05004387",
"reference": "8ecde033600064e3ffdbf804deec0dcb05004387",
"url": "https://api.github.com/repos/spatie/ignition/zipball/ab8d1f938d3ffd20af25ad788a9d019e1123068c",
"reference": "ab8d1f938d3ffd20af25ad788a9d019e1123068c",
"shasum": ""
},
"require": {
@@ -14390,7 +14392,7 @@
"type": "github"
}
],
"time": "2022-03-01T17:01:33+00:00"
"time": "2022-03-08T15:12:58+00:00"
},
{
"name": "spatie/laravel-ignition",
@@ -14481,7 +14483,7 @@
},
{
"name": "symfony/polyfill-php73",
"version": "v1.24.0",
"version": "v1.25.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php73.git",
@@ -14540,7 +14542,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php73/tree/v1.24.0"
"source": "https://github.com/symfony/polyfill-php73/tree/v1.25.0"
},
"funding": [
{

6
package-lock.json generated
View File

@@ -6657,9 +6657,9 @@
}
},
"postcss": {
"version": "8.4.7",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.7.tgz",
"integrity": "sha512-L9Ye3r6hkkCeOETQX6iOaWZgjp3LL6Lpqm6EtgbKrgqGGteRMNb9vzBfRL96YOSu8o7x3MfIH9Mo5cPJFGrW6A==",
"version": "8.4.8",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.8.tgz",
"integrity": "sha512-2tXEqGxrjvAO6U+CJzDL2Fk2kPHTv1jQsYkSoMeOis2SsYaXRO2COxTdQp99cYvif9JTXaAk9lYGc3VhJt7JPQ==",
"dev": true,
"requires": {
"nanoid": "^3.3.1",

View File

@@ -15,7 +15,7 @@
"cross-env": "^5.1",
"laravel-echo": "^1.11.3",
"laravel-mix": "^6.0.43",
"postcss": "^8.4.7",
"postcss": "^8.4.8",
"prettier": "^2.5.1",
"prettier-plugin-import-sort": "0.0.7",
"prettier-plugin-tailwindcss": "^0.1.8",

View File

@@ -1,7 +1,7 @@
{
"/js/main.js": "/js/main.js",
"/chunks/request.js": "/chunks/request.js?id=3c8d8ec8f0f51d19",
"/chunks/request-upload.js": "/chunks/request-upload.js?id=12dcae76203db76f",
"/chunks/request.js": "/chunks/request.js?id=001f737452e0d25a",
"/chunks/request-upload.js": "/chunks/request-upload.js?id=f50a50d2aa741c81",
"/chunks/setup-wizard.js": "/chunks/setup-wizard.js?id=19a0784e59d768ec",
"/chunks/status-check.js": "/chunks/status-check.js?id=6bae83a7e38d3b1c",
"/chunks/purchase-code.js": "/chunks/purchase-code.js?id=0d001d4505d2f5e9",
@@ -9,13 +9,13 @@
"/chunks/environment-setup.js": "/chunks/environment-setup.js?id=c58071cb9d14e595",
"/chunks/app-setup.js": "/chunks/app-setup.js?id=ad92e971daa0f86d",
"/chunks/admin-account.js": "/chunks/admin-account.js?id=286b9872565b5e96",
"/chunks/shared.js": "/chunks/shared.js?id=e777e8e40fdc11a0",
"/chunks/shared/browser.js": "/chunks/shared/browser.js?id=ca4620238e883070",
"/chunks/shared/single-file.js": "/chunks/shared/single-file.js?id=3af02b5d9d4da341",
"/chunks/shared.js": "/chunks/shared.js?id=584d7de11142b545",
"/chunks/shared/browser.js": "/chunks/shared/browser.js?id=4722af71c3c7bba6",
"/chunks/shared/single-file.js": "/chunks/shared/single-file.js?id=f60d6a95bc180df2",
"/chunks/shared/authenticate.js": "/chunks/shared/authenticate.js?id=92c75a6c77689046",
"/chunks/not-found.js": "/chunks/not-found.js?id=36763aa314e00327",
"/chunks/temporary-unavailable.js": "/chunks/temporary-unavailable.js?id=a3906226272982b1",
"/chunks/admin.js": "/chunks/admin.js?id=dfda0fb3e01450de",
"/chunks/admin.js": "/chunks/admin.js?id=920613c2b7236639",
"/chunks/dashboard.js": "/chunks/dashboard.js?id=e7c6001687e641eb",
"/chunks/invoices.js": "/chunks/invoices.js?id=85fd4514d3d85a71",
"/chunks/subscriptions.js": "/chunks/subscriptions.js?id=9f970bdfc7583080",
@@ -57,18 +57,18 @@
"/chunks/sign-up.js": "/chunks/sign-up.js?id=098d7f41b85066bf",
"/chunks/forgotten-password.js": "/chunks/forgotten-password.js?id=d6193ed0b07e7957",
"/chunks/create-new-password.js": "/chunks/create-new-password.js?id=d00212636148a14b",
"/chunks/settings.js": "/chunks/settings.js?id=fa7076424e651555",
"/chunks/settings.js": "/chunks/settings.js?id=f4a7bce3ff4c61a9",
"/chunks/profile.js": "/chunks/profile.js?id=1217f457145491ec",
"/chunks/settings-password.js": "/chunks/settings-password.js?id=b6704f4cbf14c67d",
"/chunks/settings-storage.js": "/chunks/settings-storage.js?id=90ba712f3728443b",
"/chunks/billing.js": "/chunks/billing.js?id=27957f2477fdd121",
"/chunks/platform.js": "/chunks/platform.js?id=863924b804b662c2",
"/chunks/files.js": "/chunks/files.js?id=823d196884eda435",
"/chunks/recent-uploads.js": "/chunks/recent-uploads.js?id=72d3b7d6c875f671",
"/chunks/my-shared-items.js": "/chunks/my-shared-items.js?id=19b49de44403b4be",
"/chunks/trash.js": "/chunks/trash.js?id=2a7999f7c6ba14cd",
"/chunks/team-folders.js": "/chunks/team-folders.js?id=b8c53410effac0d0",
"/chunks/shared-with-me.js": "/chunks/shared-with-me.js?id=47b3d9874299d8cb",
"/chunks/platform.js": "/chunks/platform.js?id=85ee6709fe4e3b7e",
"/chunks/files.js": "/chunks/files.js?id=0d4e7a1330328eae",
"/chunks/recent-uploads.js": "/chunks/recent-uploads.js?id=2362f8fa4e3392e9",
"/chunks/my-shared-items.js": "/chunks/my-shared-items.js?id=25e9d29dd3c29338",
"/chunks/trash.js": "/chunks/trash.js?id=5bc0e04ada660232",
"/chunks/team-folders.js": "/chunks/team-folders.js?id=cf60b121819ca1a5",
"/chunks/shared-with-me.js": "/chunks/shared-with-me.js?id=bdbbd7e2225a6db9",
"/chunks/invitation.js": "/chunks/invitation.js?id=e3f3c2e3501c5a63",
"/css/tailwind.css": "/css/tailwind.css",
"/css/app.css": "/css/app.css"

View File

@@ -1,69 +1,106 @@
<template>
<article class="z-20 relative flex items-start p-2.5 mb-1.5 space-x-4 rounded-xl dark:hover:bg-4x-dark-foreground hover:bg-light-background bg-opacity-80">
<article
class="delay-[3000ms] duration-700 transition-all relative z-20 mb-1.5 flex items-start space-x-4 rounded-xl p-2.5 dark:hover:bg-4x-dark-foreground"
:class="{'bg-light-background/80': isUnread}"
>
<user-plus-icon
v-if="notification.data.attributes.type === 'team-invitation'"
size="20"
class="vue-feather text-theme shrink-0"
/>
<upload-cloud-icon
v-if="['file-request', 'remote-upload-done'].includes(notification.data.attributes.type)"
size="20"
class="vue-feather text-theme shrink-0"
/>
<user-plus-icon v-if="notification.type === 'team-invitation'" size="20" class="vue-feather text-theme shrink-0" />
<upload-cloud-icon v-if="['file-request', 'remote-upload-done'].includes(notification.type)" size="20" class="vue-feather text-theme shrink-0" />
<div>
<b class="mb-1.5 block text-sm font-extrabold">
{{ notification.data.attributes.title }}
</b>
<div>
<b class="font-extrabold text-sm mb-1.5 block">
{{ notification.title }}
</b>
<p class="mb-1.5 text-sm dark:text-gray-500">
{{ notification.data.attributes.description }}
</p>
<p class="text-sm mb-1.5 dark:text-gray-500">
{{ notification.description }}
</p>
<div class="mb-4 flex items-center">
<!--<MemberAvatar class="mr-2" :size="22" :is-border="false" :member="user" />-->
<time class="block text-xs text-gray-400 dark:text-gray-400">
{{ notification.data.attributes.created_at }}
</time>
</div>
<div class="flex items-center mb-4">
<!--<MemberAvatar class="mr-2" :size="22" :is-border="false" :member="user" />-->
<time class=" block text-xs dark:text-gray-400 text-gray-400">
09. Mar. 2022, 08:27
</time>
</div>
<!--Accept or decline team invitation-->
<div v-if="notification.data.attributes.type === 'team-invitation'" class="flex items-center space-x-3">
<div
class="flex cursor-pointer items-center rounded-xl py-1.5 px-2 transition-colors hover:bg-green-100 dark:hover:bg-green-900"
>
<check-icon size="16" class="vue-feather mr-2 text-green-600 dark:text-green-600" />
<span class="text-sm font-bold text-green-600 dark:text-green-600">
{{ $t('Accept') }}
</span>
</div>
<!--Accept or decline team invitation-->
<div v-if="notification.type === 'team-invitation'" class="flex items-center space-x-3">
<div class="flex items-center cursor-pointer py-1.5 px-2 rounded-xl transition-colors dark:hover:bg-green-900 hover:bg-green-100">
<check-icon size="16" class="vue-feather dark:text-green-600 text-green-600 mr-2" />
<span class="text-sm font-bold dark:text-green-600 text-green-600">
{{ $t('Accept') }}
</span>
</div>
<div
class="flex cursor-pointer items-center rounded-xl py-1.5 px-2 transition-colors hover:bg-rose-100 dark:hover:bg-rose-900"
>
<x-icon size="16" class="vue-feather mr-2 text-rose-600 dark:text-rose-600" />
<span class="text-sm font-bold text-rose-600 dark:text-rose-600">
{{ $t('Decline') }}
</span>
</div>
</div>
<div class="flex items-center cursor-pointer py-1.5 px-2 rounded-xl transition-colors dark:hover:bg-rose-900 hover:bg-rose-100">
<x-icon size="16" class="vue-feather dark:text-rose-600 text-rose-600 mr-2" />
<span class="text-sm font-bold dark:text-rose-600 text-rose-600">
{{ $t('Decline') }}
</span>
</div>
</div>
<!--Go to route-->
<router-link v-if="['file-request', 'remote-upload-done'].includes(notification.type)" :to="{ name: 'Users' }" class="mt-4 flex items-center">
<span class="mr-2 whitespace-nowrap text-xs font-bold">
{{ $t('Show Files') }}
</span>
<chevron-right-icon size="16" class="text-theme vue-feather" />
</router-link>
</div>
</article>
<!--Go to route-->
<router-link
@click.native="closeCenter"
v-if="action && action.type === 'route'"
:to="{ name: action.params.route, params: { id: action.params.id } }"
class="mt-4 flex items-center"
>
<span class="mr-2 whitespace-nowrap text-xs font-bold">
{{ action.params.button }}
</span>
<chevron-right-icon size="16" class="text-theme vue-feather" />
</router-link>
</div>
</article>
</template>
<script>
import {CheckIcon, XIcon, MailIcon, UserPlusIcon, UploadCloudIcon, ChevronRightIcon} from 'vue-feather-icons'
import { CheckIcon, XIcon, MailIcon, UserPlusIcon, UploadCloudIcon, ChevronRightIcon } from 'vue-feather-icons'
import MemberAvatar from '../FilesView/MemberAvatar'
export default {
name: 'Notification',
props: [
'notification',
],
components: {
MemberAvatar,
ChevronRightIcon,
UploadCloudIcon,
UserPlusIcon,
CheckIcon,
MailIcon,
XIcon,
name: 'Notification',
props: ['notification'],
components: {
MemberAvatar,
ChevronRightIcon,
UploadCloudIcon,
UserPlusIcon,
CheckIcon,
MailIcon,
XIcon,
},
computed: {
action() {
return this.notification.data.attributes.action
},
},
data() {
return {
isUnread: false
}
},
methods: {
closeCenter() {
this.$store.commit('TOGGLE_NOTIFICATION_CENTER')
},
},
created() {
this.isUnread = this.notification.data.attributes.read_at === null
setTimeout(() => this.isUnread = false, 1000)
}
}
</script>

View File

@@ -3,7 +3,7 @@
<div class="fixed popup z-20 top-[27px] bottom-[27px] left-20 w-[360px]">
<!--Triangle-->
<div class="z-20 absolute left-0 top-[102px] w-4 translate-x-[-15px] overflow-hidden inline-block">
<div class="z-20 absolute left-0 top-[64px] w-4 translate-x-[-15px] overflow-hidden inline-block" :class="{'!top-[102px]': config.subscriptionType === 'metered'}">
<div class="h-12 -rotate-45 transform origin-top-right dark:bg-2x-dark-foreground bg-white bg-opacity-80 backdrop-blur-2xl"></div>
</div>
@@ -15,22 +15,26 @@
</b>
<div class="px-2.5">
<MobileActionButton icon="check-square" class="mb-2 dark:!bg-4x-dark-foreground">
<MobileActionButton v-if="readNotifications.length || unreadNotifications.length" @click.native="deleteAllNotifications" icon="check-square" class="mb-2 dark:!bg-4x-dark-foreground">
{{ $t('Clear all') }}
</MobileActionButton>
<p v-if="!readNotifications.length && !unreadNotifications.length" class="text-sm mt-8">
{{ $t("There aren't any notifications.") }}
</p>
</div>
<b class="dark-text-theme mt-1.5 block px-2.5 mb-2.5 text-xs text-gray-400">
Today
<b v-if="unreadNotifications.length" class="dark-text-theme mt-1.5 block px-2.5 mb-2.5 text-xs text-gray-400">
{{ $t('Unread') }}
</b>
<Notification :notification="notification" v-for="notification in todayNotifications" :key="notification.id" />
<Notification :notification="notification" v-for="notification in unreadNotifications" :key="notification.id" />
<b class="dark-text-theme mt-2.5 block px-2.5 mb-2.5 text-xs text-gray-400">
Later
<b v-if="readNotifications.length" class="dark-text-theme mt-2.5 block px-2.5 mb-2.5 text-xs text-gray-400">
{{ $t('Read') }}
</b>
<Notification :notification="notification" v-for="notification in laterNotifications" :key="notification.id" />
<Notification :notification="notification" v-for="notification in readNotifications" :key="notification.id" />
</div>
</div>
</transition>
@@ -39,6 +43,7 @@
<script>
import Notification from "./Notification";
import MobileActionButton from "../FilesView/MobileActionButton";
import {mapGetters} from "vuex";
export default {
name: 'NotificationCenter',
@@ -46,6 +51,27 @@ export default {
MobileActionButton,
Notification
},
watch: {
isVisibleNotificationCenter: function (visibility) {
if (visibility) {
axios.post('/api/user/notifications/read')
.then(() => {
this.$store.commit('UPDATE_NOTIFICATION_COUNT', 0)
})
}
}
},
computed: {
...mapGetters([
'user', 'config', 'isVisibleNotificationCenter',
]),
readNotifications() {
return this.user.data.relationships.readNotifications.data
},
unreadNotifications() {
return this.user.data.relationships.unreadNotifications.data
}
},
data() {
return {
laterNotifications: [
@@ -86,6 +112,14 @@ export default {
},
]
}
},
methods: {
deleteAllNotifications() {
axios.delete('/api/user/notifications')
.then(() => {
this.$store.commit('FLUSH_NOTIFICATIONS')
})
}
}
}
</script>

View File

@@ -22,7 +22,7 @@
<!--Navigation-->
<div class="mt-2 relative">
<div @click="toggleNotificationCenter" class="relative button-icon inline-block cursor-pointer rounded-xl p-3 hover:bg-light-300 dark:hover:bg-4x-dark-foreground">
<div @click="$store.commit('TOGGLE_NOTIFICATION_CENTER')" class="relative button-icon inline-block cursor-pointer rounded-xl p-3 hover:bg-light-300 dark:hover:bg-4x-dark-foreground">
<bell-icon size="18" class="transition" :class="{'rotate-[30deg]': notificationCount}" />
<span v-if="notificationCount" class="absolute z-[9] right-1.5 bottom-1.5 flex items-center justify-center w-4 h-4 bg-theme text-white rounded-full text-xs font-bold">
{{ notificationCount }}
@@ -31,7 +31,7 @@
</div>
</div>
<NotificationCenter v-show="isNotificationCenter" />
<NotificationCenter v-show="isVisibleNotificationCenter" />
<!--Navigation-->
<div class="mt-6">
@@ -97,7 +97,7 @@ export default {
SunIcon,
},
computed: {
...mapGetters(['isVisibleNavigationBars', 'isDarkMode', 'config', 'user']),
...mapGetters(['isVisibleNavigationBars', 'isDarkMode', 'config', 'user', 'isVisibleNotificationCenter', 'notificationCount']),
navigation() {
if (this.user.data.attributes.role === 'admin') {
return [
@@ -140,15 +140,10 @@ export default {
},
data() {
return {
notificationCount: 2,
isNotificationCenter: false,
}
},
methods: {
toggleNotificationCenter() {
this.notificationCount = 0
this.isNotificationCenter = ! this.isNotificationCenter
},
isSection(section) {
return this.$route.matched[0].name === section
},

View File

@@ -5,6 +5,8 @@ import router from '../../router'
const defaultState = {
isVisibleNavigationBars: localStorage.getItem('is_navigation_bars') !== 'false',
isVisibleNotificationCenter: false,
notificationCount: 0,
isDarkMode: false,
isVisibleSidebar: localStorage.getItem('file_info_visibility') === 'true' || false,
itemViewType: localStorage.getItem('preview_type') || 'list',
@@ -167,10 +169,18 @@ const mutations = {
UPDATE_DARK_MODE_STATUS(state, val) {
state.isDarkMode = val
},
UPDATE_NOTIFICATION_COUNT(state, val) {
state.notificationCount = val
},
TOGGLE_NOTIFICATION_CENTER(state) {
state.isVisibleNotificationCenter = !state.isVisibleNotificationCenter
},
}
const getters = {
isVisibleNotificationCenter: (state) => state.isVisibleNotificationCenter,
isVisibleNavigationBars: (state) => state.isVisibleNavigationBars,
notificationCount: (state) => state.notificationCount,
isVisibleSidebar: (state) => state.isVisibleSidebar,
itemViewType: (state) => state.itemViewType,
requestedPlan: (state) => state.requestedPlan,

View File

@@ -3,14 +3,15 @@ const defaultState = {
}
const actions = {
runConnection: ({ commit, getters }) => {
runConnection: ({ commit, getters, dispatch }) => {
commit('SET_RUNNING_COMMUNICATION')
Echo.private(`test.${getters.user.data.id}`)
.listen('.Domain\\Notifications\\Events\\TestUpdate', (e) => {
console.log(e);
});
Echo.private(`App.Users.Models.User.${getters.user.data.id}`)
.notification(() => {
// TODO: call sound
dispatch('getAppData')
});
},
}

View File

@@ -18,6 +18,7 @@ const actions = {
resolve(response)
commit('RETRIEVE_USER', response.data)
commit('UPDATE_NOTIFICATION_COUNT', response.data.data.relationships.unreadNotifications.data.length)
if (! getters.isRunningConnection) {
dispatch('runConnection')
@@ -172,6 +173,13 @@ const mutations = {
}
})
},
PUSH_NEW_NOTIFICATION(state, notification) {
state.user.data.relationships.unreadNotifications.data.push(notification)
},
FLUSH_NOTIFICATIONS(state) {
state.user.data.relationships.readNotifications.data = []
state.user.data.relationships.unreadNotifications.data = []
},
}
const getters = {

View File

@@ -11,8 +11,4 @@
|
*/
//Broadcast::channel('App.User.{id}', fn ($user, $id) => (int) $user->id === (int) $id);
Broadcast::channel('test.{id}', function ($user, $id) {
return true;
});
Broadcast::channel('App.Users.Models.User.{id}', fn ($user, $id) => $user->id === $id);

View File

@@ -4,6 +4,9 @@ use App\Users\Controllers\Account\AccountDetailsController;
use App\Users\Controllers\Account\UpdatePasswordController;
use App\Users\Controllers\Account\StorageCapacityController;
use App\Users\Controllers\Verification\VerifyEmailController;
use Domain\Notifications\Controllers\FlushUserNotificationsController;
use Domain\Notifications\Controllers\GetUserNotificationsController;
use Domain\Notifications\Controllers\MarkUserNotificationsAsReadController;
use Domain\Transactions\Controllers\GetTransactionsController;
use App\Users\Controllers\Verification\ResendVerificationEmail;
use App\Users\Controllers\Authentication\CheckAccountController;
@@ -23,6 +26,11 @@ Route::group(['middleware' => ['auth:sanctum']], function () {
// User Access Token
Route::apiResource('/tokens', AccountAccessTokenController::class);
// Notifications
Route::post('/notifications/read', MarkUserNotificationsAsReadController::class);
Route::delete('/notifications', FlushUserNotificationsController::class);
Route::get('/notifications', GetUserNotificationsController::class);
// Account
Route::patch('/settings', UpdateProfileSettingsController::class);
Route::get('/transactions', GetTransactionsController::class);

View File

@@ -2,6 +2,7 @@
namespace App\Users\Resources;
use Domain\Notifications\Resources\NotificationCollection;
use Domain\Folders\Resources\FolderCollection;
use Illuminate\Http\Resources\Json\JsonResource;
use App\Users\Actions\FormatUsageEstimatesAction;
@@ -43,9 +44,11 @@ class UserResource extends JsonResource
'updated_at' => format_date($this->updated_at, 'd. M. Y'),
],
'relationships' => [
'settings' => new SettingsResource($this->settings),
'favourites' => new FolderCollection($this->favouriteFolders),
'creditCards' => new CreditCardCollection($this->creditCards),
'readNotifications' => new NotificationCollection($this->readNotifications),
'unreadNotifications' => new NotificationCollection($this->unreadNotifications),
'settings' => new SettingsResource($this->settings),
'favourites' => new FolderCollection($this->favouriteFolders),
'creditCards' => new CreditCardCollection($this->creditCards),
$this->mergeWhen($this->hasSubscription(), fn() => [
'subscription' => new SubscriptionResource($this->subscription),
]),

View File

@@ -0,0 +1,23 @@
<?php
namespace Domain\Notifications\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Http\Response;
class FlushUserNotificationsController extends Controller
{
public function __invoke(): Response|Application|ResponseFactory
{
if (is_demo_account()) {
return response('Done', 204);
}
// Delete all notifications
auth()->user()->notifications()->delete();
return response('Done', 204);
}
}

View File

@@ -0,0 +1,16 @@
<?php
namespace Domain\Notifications\Controllers;
use App\Http\Controllers\Controller;
use Domain\Notifications\Resources\NotificationCollection;
class GetUserNotificationsController extends Controller
{
public function __invoke(): NotificationCollection
{
return new NotificationCollection(
auth()->user()->notifications
);
}
}

View File

@@ -0,0 +1,23 @@
<?php
namespace Domain\Notifications\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Http\Response;
class MarkUserNotificationsAsReadController extends Controller
{
public function __invoke(): Response|Application|ResponseFactory
{
if (is_demo_account()) {
return response('Done', 204);
}
// Mark all notifications as read
auth()->user()->unreadNotifications()->update(['read_at' => now()]);
return response('Done', 204);
}
}

View File

@@ -0,0 +1,16 @@
<?php
namespace Domain\Notifications\Resources;
use Illuminate\Http\Resources\Json\ResourceCollection;
class NotificationCollection extends ResourceCollection
{
public $collects = NotificationResource::class;
public function toArray($request): array
{
return [
'data' => $this->collection,
];
}
}

View File

@@ -0,0 +1,32 @@
<?php
namespace Domain\Notifications\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class NotificationResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'data' => [
'id' => $this->id,
'type' => $this->type,
'attributes' => [
'type' => $this->data['type'],
'title' => $this->data['title'],
'description' => $this->data['description'],
'action' => $this->data['action'] ?? null,
'created_at' => format_date($this->created_at, 'd. M. Y h:i'),
'read_at' => $this->read_at ? format_date($this->read_at, 'd. M. Y h:i') : null,
],
],
];
}
}

View File

@@ -23,22 +23,16 @@ class UploadRequestFulfilledNotification extends Notification implements ShouldQ
/**
* Get the notification's delivery channels.
*
* @param mixed $notifiable
* @return array
*/
public function via($notifiable)
public function via(mixed $notifiable): array
{
return ['mail', 'database'];
return ['mail', 'database', 'broadcast'];
}
/**
* Get the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/
public function toMail($notifiable)
public function toMail(mixed $notifiable): MailMessage
{
// TODO: add to language strings
return (new MailMessage)
@@ -59,7 +53,12 @@ class UploadRequestFulfilledNotification extends Notification implements ShouldQ
'title' => 'File Request Filled',
'description' => "Your file request for '{$this->uploadRequest->parent->name}' folder was filled successfully.",
'action' => [
'id' => $this->uploadRequest->id,
'type' => 'route',
'params' => [
'route' => 'Files',
'button' => 'Show Files',
'id' => $this->uploadRequest->id,
],
],
];
}

View File

@@ -0,0 +1,134 @@
<?php
namespace Tests\Domain\Notifications;
use App\Users\Models\User;
use Tests\TestCase;
use Str;
use DB;
class NotificationsTest extends TestCase
{
/**
* @test
*/
public function it_get_all_notifications()
{
$user = User::factory()
->hasSettings()
->create();
DB::table('notifications')
->insert([
'id' => Str::uuid(),
'type' => 'Domain\UploadRequest\Notifications\UploadRequestFulfilledNotification',
'notifiable_type' => 'App\Users\Models\User',
'notifiable_id' => $user->id,
'data' => json_encode([
'type' => 'file-request',
'title' => 'File Request Filled',
'description' => "Your file request for 'Documents' folder was filled successfully.",
'action' => [
'type' => 'route',
'params' => [
'route' => 'Files',
'button' => 'Show Files',
'id' => Str::uuid(),
],
],
]),
'created_at' => now(),
'updated_at' => now(),
]);
$this
->actingAs($user)
->getJson('/api/user/notifications')
->assertJsonFragment([
'type' => 'file-request',
])
->assertStatus(200);
}
/**
* @test
*/
public function it_mark_as_read_notifications()
{
$user = User::factory()
->hasSettings()
->create();
DB::table('notifications')
->insert([
'id' => Str::uuid(),
'type' => 'Domain\UploadRequest\Notifications\UploadRequestFulfilledNotification',
'notifiable_type' => 'App\Users\Models\User',
'notifiable_id' => $user->id,
'data' => json_encode([
'type' => 'file-request',
'title' => 'File Request Filled',
'description' => "Your file request for 'Documents' folder was filled successfully.",
'action' => [
'type' => 'route',
'params' => [
'route' => 'Files',
'button' => 'Show Files',
'id' => Str::uuid(),
],
],
]),
'created_at' => now(),
'updated_at' => now(),
]);
$this
->actingAs($user)
->postJson('/api/user/notifications/read')
->assertStatus(204);
$this->assertDatabaseHas('notifications', [
'read_at' => now(),
]);
}
/**
* @test
*/
public function it_delete_all_notifications()
{
$user = User::factory()
->hasSettings()
->create();
DB::table('notifications')
->insert([
'id' => Str::uuid(),
'type' => 'Domain\UploadRequest\Notifications\UploadRequestFulfilledNotification',
'notifiable_type' => 'App\Users\Models\User',
'notifiable_id' => $user->id,
'data' => json_encode([
'type' => 'file-request',
'title' => 'File Request Filled',
'description' => "Your file request for 'Documents' folder was filled successfully.",
'action' => [
'type' => 'route',
'params' => [
'route' => 'Files',
'button' => 'Show Files',
'id' => Str::uuid(),
],
],
]),
'created_at' => now(),
'updated_at' => now(),
]);
$this
->actingAs($user)
->deleteJson('/api/user/notifications')
->assertStatus(204);
$this->assertDatabaseCount('notifications', 0);
}
}