Merge branch '3.x' into laravel-11

This commit is contained in:
Dan Harrin
2024-02-23 22:22:24 +00:00
36 changed files with 591 additions and 333 deletions
Generated
+22 -22
View File
@@ -129,16 +129,16 @@
},
{
"name": "aws/aws-sdk-php",
"version": "3.300.3",
"version": "3.300.4",
"source": {
"type": "git",
"url": "https://github.com/aws/aws-sdk-php.git",
"reference": "a1202d1a82593fc2cdad54d627e54c518a984738"
"reference": "27d59c22c121ce9c0041c563dc9d7270e180925c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/a1202d1a82593fc2cdad54d627e54c518a984738",
"reference": "a1202d1a82593fc2cdad54d627e54c518a984738",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/27d59c22c121ce9c0041c563dc9d7270e180925c",
"reference": "27d59c22c121ce9c0041c563dc9d7270e180925c",
"shasum": ""
},
"require": {
@@ -218,9 +218,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.300.3"
"source": "https://github.com/aws/aws-sdk-php/tree/3.300.4"
},
"time": "2024-02-22T19:20:21+00:00"
"time": "2024-02-23T19:10:30+00:00"
},
{
"name": "blade-ui-kit/blade-heroicons",
@@ -5853,16 +5853,16 @@
},
{
"name": "phpstan/phpdoc-parser",
"version": "1.25.0",
"version": "1.26.0",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpdoc-parser.git",
"reference": "bd84b629c8de41aa2ae82c067c955e06f1b00240"
"reference": "231e3186624c03d7e7c890ec662b81e6b0405227"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/bd84b629c8de41aa2ae82c067c955e06f1b00240",
"reference": "bd84b629c8de41aa2ae82c067c955e06f1b00240",
"url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/231e3186624c03d7e7c890ec662b81e6b0405227",
"reference": "231e3186624c03d7e7c890ec662b81e6b0405227",
"shasum": ""
},
"require": {
@@ -5894,9 +5894,9 @@
"description": "PHPDoc parser with support for nullable, intersection and generic types",
"support": {
"issues": "https://github.com/phpstan/phpdoc-parser/issues",
"source": "https://github.com/phpstan/phpdoc-parser/tree/1.25.0"
"source": "https://github.com/phpstan/phpdoc-parser/tree/1.26.0"
},
"time": "2024-01-04T17:06:16+00:00"
"time": "2024-02-23T16:05:55+00:00"
},
{
"name": "phpstan/phpstan",
@@ -8906,28 +8906,28 @@
},
{
"name": "spatie/laravel-translatable",
"version": "6.5.5",
"version": "6.6.0",
"source": {
"type": "git",
"url": "https://github.com/spatie/laravel-translatable.git",
"reference": "d6dc7c9fe3c678ce50b2d6a4a7434fcbcfc3df4c"
"reference": "11f0b548dd43b846a5bdca1431de173ac77ed349"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/spatie/laravel-translatable/zipball/d6dc7c9fe3c678ce50b2d6a4a7434fcbcfc3df4c",
"reference": "d6dc7c9fe3c678ce50b2d6a4a7434fcbcfc3df4c",
"url": "https://api.github.com/repos/spatie/laravel-translatable/zipball/11f0b548dd43b846a5bdca1431de173ac77ed349",
"reference": "11f0b548dd43b846a5bdca1431de173ac77ed349",
"shasum": ""
},
"require": {
"illuminate/database": "^9.0|^10.0",
"illuminate/support": "^9.0|^10.0",
"illuminate/database": "^9.0|^10.0|^11.0",
"illuminate/support": "^9.0|^10.0|^11.0",
"php": "^8.0",
"spatie/laravel-package-tools": "^1.11"
},
"require-dev": {
"mockery/mockery": "^1.4",
"orchestra/testbench": "^7.0|^8.0",
"pestphp/pest": "^1.20"
"orchestra/testbench": "^7.0|^8.0|^9.0",
"pestphp/pest": "^1.20|^2.0"
},
"type": "library",
"extra": {
@@ -8976,7 +8976,7 @@
],
"support": {
"issues": "https://github.com/spatie/laravel-translatable/issues",
"source": "https://github.com/spatie/laravel-translatable/tree/6.5.5"
"source": "https://github.com/spatie/laravel-translatable/tree/6.6.0"
},
"funding": [
{
@@ -8984,7 +8984,7 @@
"type": "github"
}
],
"time": "2023-12-06T10:56:22+00:00"
"time": "2024-02-23T13:52:34+00:00"
},
{
"name": "spatie/macroable",
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+203 -157
View File
@@ -44,7 +44,7 @@
"postcss": "^8.4.4",
"postcss-nesting": "^12.0.1",
"prettier": "^3.1.1",
"prettier-plugin-blade": "^2.0.0",
"prettier-plugin-blade": "v2.0.0",
"prettier-plugin-tailwindcss": "^0.5.10",
"pusher-js": "^7.4.0",
"sortablejs": "^1.15.0",
@@ -2446,9 +2446,9 @@
}
},
"node_modules/@jridgewell/resolve-uri": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
"integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
"dev": true,
"engines": {
"node": ">=6.0.0"
@@ -2694,9 +2694,9 @@
}
},
"node_modules/@types/eslint": {
"version": "8.56.2",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz",
"integrity": "sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==",
"version": "8.56.3",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.3.tgz",
"integrity": "sha512-PvSf1wfv2wJpVIFUMSb+i4PvqNYkB9Rkp9ZDO3oaWzq4SKhsQk4mrMBr3ZH06I0hKrVGLBacmgl8JM4WVjb9dg==",
"dev": true,
"dependencies": {
"@types/estree": "*",
@@ -2850,9 +2850,9 @@
"dev": true
},
"node_modules/@types/node": {
"version": "20.11.16",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.16.tgz",
"integrity": "sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ==",
"version": "20.11.20",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.20.tgz",
"integrity": "sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==",
"dev": true,
"dependencies": {
"undici-types": "~5.26.4"
@@ -3440,9 +3440,9 @@
}
},
"node_modules/async-alpine": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/async-alpine/-/async-alpine-1.2.1.tgz",
"integrity": "sha512-vbkzihcqAGashRagpms6oG8MT32JkFI2yDYPPfnXImGvxxP2nVMJjHfABKgTaBpSeK+Hp2KFmJCPHtQbIfYqoA==",
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/async-alpine/-/async-alpine-1.2.2.tgz",
"integrity": "sha512-WWX/CGYFVt8BztCNygoxMGxW60RBpxXl7pXf88rmed46eJ0znAONcmnYV+8XVl4K9n4bUfMRzODcenTskkB2vQ==",
"dev": true
},
"node_modules/autoprefixer": {
@@ -3483,10 +3483,13 @@
}
},
"node_modules/available-typed-arrays": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz",
"integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==",
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
"integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
"dev": true,
"dependencies": {
"possible-typed-array-names": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
},
@@ -3821,9 +3824,9 @@
}
},
"node_modules/browserslist": {
"version": "4.22.3",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz",
"integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==",
"version": "4.23.0",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
"integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
"dev": true,
"funding": [
{
@@ -3840,8 +3843,8 @@
}
],
"dependencies": {
"caniuse-lite": "^1.0.30001580",
"electron-to-chromium": "^1.4.648",
"caniuse-lite": "^1.0.30001587",
"electron-to-chromium": "^1.4.668",
"node-releases": "^2.0.14",
"update-browserslist-db": "^1.0.13"
},
@@ -3891,15 +3894,16 @@
}
},
"node_modules/call-bind": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.6.tgz",
"integrity": "sha512-Mj50FLHtlsoVfRfnHaZvyrooHcrlceNZdL/QBvJJVd9Ta55qCQK0gs4ss2oZDeV9zFCs6ewzYgVE5yfVmfFpVg==",
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
"integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
"dev": true,
"dependencies": {
"es-define-property": "^1.0.0",
"es-errors": "^1.3.0",
"function-bind": "^1.1.2",
"get-intrinsic": "^1.2.3",
"set-function-length": "^1.2.0"
"get-intrinsic": "^1.2.4",
"set-function-length": "^1.2.1"
},
"engines": {
"node": ">= 0.4"
@@ -3949,9 +3953,9 @@
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001585",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001585.tgz",
"integrity": "sha512-yr2BWR1yLXQ8fMpdS/4ZZXpseBgE7o4g41x3a6AJOqZuOi+iE/WdJYAuZ6Y95i4Ohd2Y+9MzIWRR+uGABH4s3Q==",
"version": "1.0.30001589",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001589.tgz",
"integrity": "sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg==",
"dev": true,
"funding": [
{
@@ -4332,12 +4336,12 @@
"dev": true
},
"node_modules/core-js-compat": {
"version": "3.35.1",
"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.1.tgz",
"integrity": "sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==",
"version": "3.36.0",
"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.0.tgz",
"integrity": "sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==",
"dev": true,
"dependencies": {
"browserslist": "^4.22.2"
"browserslist": "^4.22.3"
},
"funding": {
"type": "opencollective",
@@ -4730,18 +4734,20 @@
}
},
"node_modules/define-data-property": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.2.tgz",
"integrity": "sha512-SRtsSqsDbgpJBbW3pABMCOt6rQyeM8s8RiyeSN8jYG8sYmt/kGJejbydttUsnDs1tadr19tvhT4ShwMyoqAm4g==",
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
"integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
"dev": true,
"dependencies": {
"es-define-property": "^1.0.0",
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.2",
"gopd": "^1.0.1",
"has-property-descriptors": "^1.0.1"
"gopd": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/define-lazy-prop": {
@@ -5004,9 +5010,9 @@
"dev": true
},
"node_modules/electron-to-chromium": {
"version": "1.4.659",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.659.tgz",
"integrity": "sha512-sRJ3nV3HowrYpBtPF9bASQV7OW49IgZC01Xiq43WfSE3RTCkK0/JidoCmR73Hyc1mN+l/H4Yqx0eNiomvExFZg==",
"version": "1.4.681",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.681.tgz",
"integrity": "sha512-1PpuqJUFWoXZ1E54m8bsLPVYwIVCRzvaL+n5cjigGga4z854abDnFRc+cTa2th4S79kyGqya/1xoR7h+Y5G5lg==",
"dev": true
},
"node_modules/elliptic": {
@@ -5098,50 +5104,52 @@
}
},
"node_modules/es-abstract": {
"version": "1.22.3",
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz",
"integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==",
"version": "1.22.4",
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.4.tgz",
"integrity": "sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==",
"dev": true,
"dependencies": {
"array-buffer-byte-length": "^1.0.0",
"arraybuffer.prototype.slice": "^1.0.2",
"available-typed-arrays": "^1.0.5",
"call-bind": "^1.0.5",
"es-set-tostringtag": "^2.0.1",
"array-buffer-byte-length": "^1.0.1",
"arraybuffer.prototype.slice": "^1.0.3",
"available-typed-arrays": "^1.0.6",
"call-bind": "^1.0.7",
"es-define-property": "^1.0.0",
"es-errors": "^1.3.0",
"es-set-tostringtag": "^2.0.2",
"es-to-primitive": "^1.2.1",
"function.prototype.name": "^1.1.6",
"get-intrinsic": "^1.2.2",
"get-symbol-description": "^1.0.0",
"get-intrinsic": "^1.2.4",
"get-symbol-description": "^1.0.2",
"globalthis": "^1.0.3",
"gopd": "^1.0.1",
"has-property-descriptors": "^1.0.0",
"has-property-descriptors": "^1.0.2",
"has-proto": "^1.0.1",
"has-symbols": "^1.0.3",
"hasown": "^2.0.0",
"internal-slot": "^1.0.5",
"is-array-buffer": "^3.0.2",
"hasown": "^2.0.1",
"internal-slot": "^1.0.7",
"is-array-buffer": "^3.0.4",
"is-callable": "^1.2.7",
"is-negative-zero": "^2.0.2",
"is-regex": "^1.1.4",
"is-shared-array-buffer": "^1.0.2",
"is-string": "^1.0.7",
"is-typed-array": "^1.1.12",
"is-typed-array": "^1.1.13",
"is-weakref": "^1.0.2",
"object-inspect": "^1.13.1",
"object-keys": "^1.1.1",
"object.assign": "^4.1.4",
"regexp.prototype.flags": "^1.5.1",
"safe-array-concat": "^1.0.1",
"safe-regex-test": "^1.0.0",
"object.assign": "^4.1.5",
"regexp.prototype.flags": "^1.5.2",
"safe-array-concat": "^1.1.0",
"safe-regex-test": "^1.0.3",
"string.prototype.trim": "^1.2.8",
"string.prototype.trimend": "^1.0.7",
"string.prototype.trimstart": "^1.0.7",
"typed-array-buffer": "^1.0.0",
"typed-array-buffer": "^1.0.1",
"typed-array-byte-length": "^1.0.0",
"typed-array-byte-offset": "^1.0.0",
"typed-array-length": "^1.0.4",
"unbox-primitive": "^1.0.2",
"which-typed-array": "^1.1.13"
"which-typed-array": "^1.1.14"
},
"engines": {
"node": ">= 0.4"
@@ -5150,6 +5158,18 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/es-define-property": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
"integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
"dev": true,
"dependencies": {
"get-intrinsic": "^1.2.4"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-errors": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
@@ -5166,14 +5186,14 @@
"dev": true
},
"node_modules/es-set-tostringtag": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz",
"integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==",
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
"integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
"dev": true,
"dependencies": {
"get-intrinsic": "^1.2.2",
"has-tostringtag": "^1.0.0",
"hasown": "^2.0.0"
"get-intrinsic": "^1.2.4",
"has-tostringtag": "^1.0.2",
"hasown": "^2.0.1"
},
"engines": {
"node": ">= 0.4"
@@ -5631,9 +5651,9 @@
}
},
"node_modules/filepond-plugin-file-validate-type": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/filepond-plugin-file-validate-type/-/filepond-plugin-file-validate-type-1.2.8.tgz",
"integrity": "sha512-UBTqIWbk5+5R0GBELI8svu01MHWjFSLfc9DfCMvFtHKXLdJMxY1p37ChC4YKQjhfODaTuvLnNVRsukMGMFZBBg==",
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/filepond-plugin-file-validate-type/-/filepond-plugin-file-validate-type-1.2.9.tgz",
"integrity": "sha512-Tzv07aNdZvjUXDRA3XL16QMEvh6llDrXlcZ6W0eTHQ+taHaVg/JKJTFs/AViO+6ZcpPCcQStbhYEL2HoS+vldw==",
"dev": true,
"peerDependencies": {
"filepond": ">=1.x <5.x"
@@ -6068,13 +6088,14 @@
}
},
"node_modules/get-symbol-description": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.1.tgz",
"integrity": "sha512-KmuibvwbWaM4BHcBRYwJfZ1JxyJeBwB8ct9YYu67SvYdbEIlcQ2e56dHxfbobqW38GXo8/zDFqJeGtHiVbWyQw==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
"integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.5",
"es-errors": "^1.3.0"
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.4"
},
"engines": {
"node": ">= 0.4"
@@ -6213,21 +6234,21 @@
}
},
"node_modules/has-property-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
"integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
"integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
"dev": true,
"dependencies": {
"get-intrinsic": "^1.2.2"
"es-define-property": "^1.0.0"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
"integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
"integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
"dev": true,
"engines": {
"node": ">= 0.4"
@@ -6308,9 +6329,9 @@
}
},
"node_modules/hasown": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
"integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz",
"integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==",
"dev": true,
"dependencies": {
"function-bind": "^1.1.2"
@@ -6919,9 +6940,9 @@
}
},
"node_modules/is-negative-zero": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
"integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
"integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
"dev": true,
"engines": {
"node": ">= 0.4"
@@ -6995,12 +7016,15 @@
}
},
"node_modules/is-shared-array-buffer": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
"integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
"integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.2"
"call-bind": "^1.0.7"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -7258,9 +7282,9 @@
}
},
"node_modules/laravel-echo": {
"version": "1.15.3",
"resolved": "https://registry.npmjs.org/laravel-echo/-/laravel-echo-1.15.3.tgz",
"integrity": "sha512-SRXzccaat6w4qKgZ4/rjFKr3nJfVxB+ly4V0MEJNIF1/TpERNXepo3uk7NnOjBGsiV/np1fl2XitAzW4Sa1s/w==",
"version": "1.16.0",
"resolved": "https://registry.npmjs.org/laravel-echo/-/laravel-echo-1.16.0.tgz",
"integrity": "sha512-BJGUa4tcKvYmTkzTmcBGMHiO2tq+k7Do5wPmLbRswWfzKwyfZEUR+J5iwBTPEfLLwNPZlA9Kjo6R/NV6pmyIpg==",
"dev": true,
"engines": {
"node": ">=10"
@@ -8533,10 +8557,19 @@
"node": ">=8"
}
},
"node_modules/possible-typed-array-names": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
"integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
"dev": true,
"engines": {
"node": ">= 0.4"
}
},
"node_modules/postcss": {
"version": "8.4.34",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.34.tgz",
"integrity": "sha512-4eLTO36woPSocqZ1zIrFD2K1v6wH7pY1uBh0JIM2KKfrVtGvPFiAku6aNOP0W1Wr9qwnaCsF0Z+CrVnryB2A8Q==",
"version": "8.4.35",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz",
"integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==",
"dev": true,
"funding": [
{
@@ -8933,9 +8966,9 @@
}
},
"node_modules/postcss-nesting": {
"version": "12.0.2",
"resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-12.0.2.tgz",
"integrity": "sha512-63PpJHSeNs93S3ZUIyi+7kKx4JqOIEJ6QYtG3x+0qA4J03+4n0iwsyA1GAHyWxsHYljQS4/4ZK1o2sMi70b5wQ==",
"version": "12.0.3",
"resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-12.0.3.tgz",
"integrity": "sha512-yrtMRPFNkfZMv9ikBvZ/Eh3RxhpMBKQ3KzD7LCY8+jYVlgju/Mdcxi4JY8bW2Y7ISXw8GTLuF/o+kFtp+yaVfQ==",
"dev": true,
"funding": [
{
@@ -8948,7 +8981,7 @@
}
],
"dependencies": {
"@csstools/selector-specificity": "^3.0.1",
"@csstools/selector-specificity": "^3.0.2",
"postcss-selector-parser": "^6.0.13"
},
"engines": {
@@ -8959,9 +8992,9 @@
}
},
"node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.1.tgz",
"integrity": "sha512-NPljRHkq4a14YzZ3YD406uaxh7s0g6eAq3L9aLOWywoqe8PkYamAvtsh7KNX6c++ihDrJ0RiU+/z7rGnhlZ5ww==",
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.2.tgz",
"integrity": "sha512-RpHaZ1h9LE7aALeQXmXrJkRG84ZxIsctEN2biEUmFyKpzFM3zZ35eUMcIzZFsw/2olQE6v69+esEqU2f1MKycg==",
"dev": true,
"funding": [
{
@@ -9646,14 +9679,15 @@
}
},
"node_modules/regexp.prototype.flags": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz",
"integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==",
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz",
"integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.2.0",
"set-function-name": "^2.0.0"
"call-bind": "^1.0.6",
"define-properties": "^1.2.1",
"es-errors": "^1.3.0",
"set-function-name": "^2.0.1"
},
"engines": {
"node": ">= 0.4"
@@ -10158,14 +10192,15 @@
}
},
"node_modules/set-function-name": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz",
"integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==",
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
"integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
"dev": true,
"dependencies": {
"define-data-property": "^1.0.1",
"define-data-property": "^1.1.4",
"es-errors": "^1.3.0",
"functions-have-names": "^1.2.3",
"has-property-descriptors": "^1.0.0"
"has-property-descriptors": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -10339,9 +10374,9 @@
}
},
"node_modules/spdx-exceptions": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.4.0.tgz",
"integrity": "sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw==",
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
"integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
"dev": true
},
"node_modules/spdx-expression-parse": {
@@ -10355,9 +10390,9 @@
}
},
"node_modules/spdx-license-ids": {
"version": "3.0.16",
"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz",
"integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==",
"version": "3.0.17",
"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz",
"integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==",
"dev": true
},
"node_modules/spdy": {
@@ -10853,12 +10888,15 @@
}
},
"node_modules/tailwindcss/node_modules/postcss-load-config/node_modules/lilconfig": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz",
"integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==",
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz",
"integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==",
"dev": true,
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/antonk52"
}
},
"node_modules/tailwindcss/node_modules/postcss-selector-parser": {
@@ -10893,9 +10931,9 @@
}
},
"node_modules/terser": {
"version": "5.27.0",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz",
"integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==",
"version": "5.28.1",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.28.1.tgz",
"integrity": "sha512-wM+bZp54v/E9eRRGXb5ZFDvinrJIOaTapx3WUokyVGZu5ucVCK55zEgGd5Dl2fSr3jUo5sDiERErUWLY6QPFyA==",
"dev": true,
"dependencies": {
"@jridgewell/source-map": "^0.3.3",
@@ -11096,12 +11134,12 @@
}
},
"node_modules/typed-array-buffer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.1.tgz",
"integrity": "sha512-RSqu1UEuSlrBhHTWC8O9FnPjOduNs4M7rJ4pRKoEjtx1zUNOPN2sSXHLDX+Y2WPbHIxbvg4JFo2DNAEfPIKWoQ==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz",
"integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.6",
"call-bind": "^1.0.7",
"es-errors": "^1.3.0",
"is-typed-array": "^1.1.13"
},
@@ -11110,15 +11148,16 @@
}
},
"node_modules/typed-array-byte-length": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz",
"integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz",
"integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"call-bind": "^1.0.7",
"for-each": "^0.3.3",
"has-proto": "^1.0.1",
"is-typed-array": "^1.1.10"
"gopd": "^1.0.1",
"has-proto": "^1.0.3",
"is-typed-array": "^1.1.13"
},
"engines": {
"node": ">= 0.4"
@@ -11128,16 +11167,17 @@
}
},
"node_modules/typed-array-byte-offset": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz",
"integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz",
"integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==",
"dev": true,
"dependencies": {
"available-typed-arrays": "^1.0.5",
"call-bind": "^1.0.2",
"available-typed-arrays": "^1.0.7",
"call-bind": "^1.0.7",
"for-each": "^0.3.3",
"has-proto": "^1.0.1",
"is-typed-array": "^1.1.10"
"gopd": "^1.0.1",
"has-proto": "^1.0.3",
"is-typed-array": "^1.1.13"
},
"engines": {
"node": ">= 0.4"
@@ -11147,23 +11187,29 @@
}
},
"node_modules/typed-array-length": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
"integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz",
"integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"call-bind": "^1.0.7",
"for-each": "^0.3.3",
"is-typed-array": "^1.1.9"
"gopd": "^1.0.1",
"has-proto": "^1.0.3",
"is-typed-array": "^1.1.13",
"possible-typed-array-names": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/typo-js": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/typo-js/-/typo-js-1.2.3.tgz",
"integrity": "sha512-67Hyl94beZX8gmTap7IDPrG5hy2cHftgsCAcGvE1tzuxGT+kRB+zSBin0wIMwysYw8RUCBCvv9UfQl8TNM75dA==",
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/typo-js/-/typo-js-1.2.4.tgz",
"integrity": "sha512-Oy/k+tFle5NAA3J/yrrYGfvEnPVrDZ8s8/WCwjUE75k331QyKIsFss7byQ/PzBmXLY6h1moRnZbnaxWBe3I3CA==",
"dev": true
},
"node_modules/unbox-primitive": {
@@ -11439,9 +11485,9 @@
}
},
"node_modules/webpack": {
"version": "5.90.1",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.1.tgz",
"integrity": "sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==",
"version": "5.90.3",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz",
"integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==",
"dev": true,
"dependencies": {
"@types/eslint-scope": "^3.7.3",
+1 -1
View File
@@ -54,7 +54,7 @@
"postcss": "^8.4.4",
"postcss-nesting": "^12.0.1",
"prettier": "^3.1.1",
"prettier-plugin-blade": "^2.0.0",
"prettier-plugin-blade": "v2.0.0",
"prettier-plugin-tailwindcss": "^0.5.10",
"pusher-js": "^7.4.0",
"sortablejs": "^1.15.0",
@@ -318,6 +318,18 @@ ImportColumn::make('sku')
})
```
### Adding helper text below the import column
Sometimes, you may wish to provide extra information for the user before validation. You can do this by adding `helperText()` to a column, which gets displayed below the mapping select:
```php
use Filament\Forms\Components\TextInput;
ImportColumn::make('skus')
->array(',')
->helperText('A comma-separated list of SKUs.')
```
## Updating existing records when importing
When generating an importer class, you will see this `resolveRecord()` method:
@@ -505,6 +505,43 @@ public static function getCsvDelimiter(): string
You can only specify a single character, otherwise an exception will be thrown.
## Styling XLSX cells
If you want to style the cells of the XLSX file, you may override the `getXlsxCellStyle()` method on the exporter class, returning an [OpenSpout `Style` object](https://github.com/openspout/openspout/blob/4.x/docs/documentation.md#styling):
```php
use OpenSpout\Common\Entity\Style\Style;
public function getXlsxCellStyle(): ?Style
{
return (new Style())
->setFontSize(12)
->setFontName('Consolas');
}
```
If you want to use a different style for the header cells of the XLSX file only, you may override the `getXlsxHeaderCellStyle()` method on the exporter class, returning an [OpenSpout `Style` object](https://github.com/openspout/openspout/blob/4.x/docs/documentation.md#styling):
```php
use OpenSpout\Common\Entity\Style\CellAlignment;
use OpenSpout\Common\Entity\Style\CellVerticalAlignment;
use OpenSpout\Common\Entity\Style\Color;
use OpenSpout\Common\Entity\Style\Style;
public function getXlsxHeaderCellStyle(): ?Style
{
return (new Style())
->setFontBold()
->setFontItalic()
->setFontSize(14)
->setFontName('Consolas')
->setFontColor(Color::rgb(255, 255, 77))
->setBackgroundColor(Color::rgb(0, 0, 0))
->setCellAlignment(CellAlignment::CENTER)
->setCellVerticalAlignment(CellVerticalAlignment::CENTER);
}
```
## Customizing the export job
The default job for processing exports is `Filament\Actions\Exports\Jobs\PrepareCsvExport`. If you want to extend this class and override any of its methods, you may replace the original class in the `register()` method of a service provider:
+2 -2
View File
@@ -6,8 +6,8 @@ use Illuminate\Support\Facades\Route;
Route::get('/filament/exports/{export}/download', DownloadExport::class)
->name('filament.exports.download')
->middleware(['web', 'auth']);
->middleware('filament.actions');
Route::get('/filament/imports/{import}/failed-rows/download', DownloadImportFailureCsv::class)
->name('filament.imports.failed-rows.download')
->middleware(['web', 'auth']);
->middleware('filament.actions');
@@ -4,6 +4,7 @@ namespace Filament\Actions;
use Filament\Actions\Testing\TestsActions;
use Illuminate\Filesystem\Filesystem;
use Illuminate\Routing\Router;
use Livewire\Features\SupportTesting\Testable;
use Spatie\LaravelPackageTools\Package;
use Spatie\LaravelPackageTools\PackageServiceProvider;
@@ -25,6 +26,11 @@ class ActionsServiceProvider extends PackageServiceProvider
->hasViews();
}
public function packageRegistered(): void
{
app(Router::class)->middlewareGroup('filament.actions', ['web', 'auth']);
}
public function packageBooted(): void
{
if ($this->app->runningInConsole()) {
+11
View File
@@ -8,6 +8,7 @@ use Filament\Actions\Exports\Models\Export;
use Filament\Forms\Components\Component;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use OpenSpout\Common\Entity\Style\Style;
abstract class Exporter
{
@@ -166,4 +167,14 @@ abstract class Exporter
{
return [ExportFormat::Csv, ExportFormat::Xlsx];
}
public function getXlsxCellStyle(): ?Style
{
return null;
}
public function getXlsxHeaderCellStyle(): ?Style
{
return null;
}
}
@@ -14,6 +14,7 @@ use Illuminate\Queue\SerializesModels;
use League\Csv\Reader as CsvReader;
use League\Csv\Statement;
use OpenSpout\Common\Entity\Row;
use OpenSpout\Common\Entity\Style\Style;
use OpenSpout\Writer\XLSX\Writer;
class CreateXlsxFile implements ShouldQueue
@@ -51,17 +52,22 @@ class CreateXlsxFile implements ShouldQueue
$csvDelimiter = $this->exporter::getCsvDelimiter();
$writeRowsFromFile = function (string $file) use ($csvDelimiter, $disk, $writer) {
$writeRowsFromFile = function (string $file, ?Style $style = null) use ($csvDelimiter, $disk, $writer) {
$csvReader = CsvReader::createFromStream($disk->readStream($file));
$csvReader->setDelimiter($csvDelimiter);
$csvResults = Statement::create()->process($csvReader);
foreach ($csvResults->getRecords() as $row) {
$writer->addRow(Row::fromValues($row));
$writer->addRow(Row::fromValues($row, $style));
}
};
$writeRowsFromFile($this->export->getFileDirectory() . DIRECTORY_SEPARATOR . 'headers.csv');
$cellStyle = $this->exporter->getXlsxCellStyle();
$writeRowsFromFile(
$this->export->getFileDirectory() . DIRECTORY_SEPARATOR . 'headers.csv',
$this->exporter->getXlsxHeaderCellStyle() ?? $cellStyle,
);
foreach ($disk->files($this->export->getFileDirectory()) as $file) {
if (str($file)->endsWith('headers.csv')) {
@@ -72,7 +78,7 @@ class CreateXlsxFile implements ShouldQueue
continue;
}
$writeRowsFromFile($file);
$writeRowsFromFile($file, $cellStyle);
}
$writer->close();
+12 -1
View File
@@ -5,6 +5,7 @@ namespace Filament\Actions\Imports;
use Closure;
use Filament\Forms\Components\Select;
use Filament\Support\Components\Component;
use Illuminate\Contracts\Support\Htmlable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\Relation;
@@ -70,6 +71,8 @@ class ImportColumn extends Component
protected string $evaluationIdentifier = 'column';
protected string | Htmlable | Closure | null $helperText = null;
final public function __construct(string $name)
{
$this->name($name);
@@ -88,7 +91,8 @@ class ImportColumn extends Component
return Select::make($this->getName())
->label($this->getLabel())
->placeholder(__('filament-actions::import.modal.form.columns.placeholder'))
->required($this->isMappingRequired());
->required($this->isMappingRequired())
->helperText($this->helperText);
}
public function name(string $name): static
@@ -134,6 +138,13 @@ class ImportColumn extends Component
return $this;
}
public function helperText(string | Htmlable | Closure | null $text): static
{
$this->helperText = $text;
return $this;
}
public function integer(bool | Closure $condition = true): static
{
$this->numeric($condition, decimalPlaces: 0);
File diff suppressed because one or more lines are too long
+17 -2
View File
@@ -285,7 +285,6 @@ You may define a custom form that can be used to create a new record and attach
```php
use Filament\Forms\Components\Select;
use Illuminate\Database\Eloquent\Model;
Select::make('author_id')
->relationship(name: 'author', titleAttribute: 'name')
@@ -304,13 +303,29 @@ The form opens in a modal, where the user can fill it with data. Upon form submi
<AutoScreenshot name="forms/fields/select/create-option-modal" alt="Select with create option modal" version="3.x" />
#### Customizing new option creation
You can customize the creation process of the new option defined in the form using the `createOptionUsing()` method, which should return the primary key of the newly created record:
```php
use Filament\Forms\Components\Select;
Select::make('author_id')
->relationship(name: 'author', titleAttribute: 'name')
->createOptionForm([
// ...
])
->createOptionUsing(function (array $data): int {
return auth()->user()->team->members()->create($data)->getKey();
}),
```
### Editing the selected option in a modal
You may define a custom form that can be used to edit the selected record and save it back to the `BelongsTo` relationship:
```php
use Filament\Forms\Components\Select;
use Illuminate\Database\Eloquent\Model;
Select::make('author_id')
->relationship(name: 'author', titleAttribute: 'name')
+9 -5
View File
@@ -18,8 +18,8 @@ use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasManyThrough;
use Illuminate\Database\Eloquent\Relations\HasOneOrMany;
use Illuminate\Database\Eloquent\Relations\HasOneThrough;
use Illuminate\Database\Eloquent\Relations\Relation;
use Illuminate\Support\Arr;
use Illuminate\Support\Str;
@@ -830,7 +830,7 @@ class Select extends Field implements Contracts\CanDisableOptions, Contracts\Has
}
if (
($relationship instanceof HasOneThrough) ||
($relationship instanceof HasManyThrough) ||
($relationship instanceof \Znck\Eloquent\Relations\BelongsToThrough)
) {
$relatedModel = $relationship->getResults();
@@ -953,7 +953,11 @@ class Select extends Field implements Contracts\CanDisableOptions, Contracts\Has
$this->saveRelationshipsUsing(static function (Select $component, Model $record, $state) {
$relationship = $component->getRelationship();
if ($relationship instanceof \Znck\Eloquent\Relations\BelongsToThrough) {
if (
($relationship instanceof HasOneOrMany) ||
($relationship instanceof HasManyThrough) ||
($relationship instanceof \Znck\Eloquent\Relations\BelongsToThrough)
) {
return;
}
@@ -1072,7 +1076,7 @@ class Select extends Field implements Contracts\CanDisableOptions, Contracts\Has
return parent::getLabel();
}
public function getRelationship(): BelongsTo | BelongsToMany | HasOneOrMany | HasOneThrough | \Znck\Eloquent\Relations\BelongsToThrough | null
public function getRelationship(): BelongsTo | BelongsToMany | HasOneOrMany | HasManyThrough | \Znck\Eloquent\Relations\BelongsToThrough | null
{
if (blank($this->getRelationshipName())) {
return null;
@@ -1197,7 +1201,7 @@ class Select extends Field implements Contracts\CanDisableOptions, Contracts\Has
return $relationship->getQualifiedRelatedKeyName();
}
if ($relationship instanceof HasOneThrough) {
if ($relationship instanceof HasManyThrough) {
return $relationship->getQualifiedForeignKeyName();
}
+2 -2
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
@@ -14,7 +14,7 @@ return [
],
'request_password_reset' => [
'label' => 'Forgotten your password?',
'label' => 'Forgot password?',
],
],
@@ -4,7 +4,7 @@ return [
'title' => 'Reset your password',
'heading' => 'Forgotten your password?',
'heading' => 'Forgot password?',
'actions' => [
@@ -3,6 +3,7 @@
namespace Filament\Infolists\Components;
use Closure;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Arr;
use Spatie\MediaLibrary\MediaCollections\Models\Media;
use Throwable;
@@ -46,34 +47,38 @@ class SpatieMediaLibraryImageEntry extends ImageEntry
}
if ($this->hasRelationship($record)) {
$record = $record->getRelationValue($this->getRelationshipName());
$record = $this->getRelationshipResults($record);
}
if (! $record) {
return null;
}
$records = Arr::wrap($record);
/** @var ?Media $media */
$media = $record->media->first(fn (Media $media): bool => $media->uuid === $state);
foreach ($records as $record) {
/** @var Model $record */
if (! $media) {
return null;
}
/** @var ?Media $media */
$media = $record->getRelationValue('media')->first(fn (Media $media): bool => $media->uuid === $state);
$conversion = $this->getConversion();
if ($this->getVisibility() === 'private') {
try {
return $media->getTemporaryUrl(
now()->addMinutes(5),
$conversion ?? '',
);
} catch (Throwable $exception) {
// This driver does not support creating temporary URLs.
if (! $media) {
continue;
}
$conversion = $this->getConversion();
if ($this->getVisibility() === 'private') {
try {
return $media->getTemporaryUrl(
now()->addMinutes(5),
$conversion ?? '',
);
} catch (Throwable $exception) {
// This driver does not support creating temporary URLs.
}
}
return $media->getAvailableUrl(Arr::wrap($conversion));
}
return $media->getAvailableUrl(Arr::wrap($conversion));
return null;
}
/**
@@ -86,13 +91,25 @@ class SpatieMediaLibraryImageEntry extends ImageEntry
$record = $this->getRecord();
if ($this->hasRelationship($record)) {
$record = $record->getRelationValue($this->getRelationshipName());
$record = $this->getRelationshipResults($record);
}
return $record?->getRelationValue('media')
->filter(fn (Media $media): bool => blank($collection) || ($media->getAttributeValue('collection_name') === $collection))
->sortBy('order_column')
->map(fn (Media $media): string => $media->uuid)
->all() ?? [];
$records = Arr::wrap($record);
$state = [];
foreach ($records as $record) {
/** @var Model $record */
$state = [
...$state,
...$record->getRelationValue('media')
->filter(fn (Media $media): bool => blank($collection) || ($media->getAttributeValue('collection_name') === $collection))
->sortBy('order_column')
->pluck('uuid')
->all(),
];
}
return array_unique($state);
}
}
@@ -4,6 +4,7 @@ namespace Filament\Tables\Columns;
use Closure;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\Relation;
use Illuminate\Support\Arr;
use Spatie\MediaLibrary\MediaCollections\Models\Media;
@@ -44,34 +45,38 @@ class SpatieMediaLibraryImageColumn extends ImageColumn
$record = $this->getRecord();
if ($this->hasRelationship($record)) {
$record = $record->getRelationValue($this->getRelationshipName());
$record = $this->getRelationshipResults($record);
}
if (! $record) {
return null;
}
$records = Arr::wrap($record);
/** @var ?Media $media */
$media = $record->media->first(fn (Media $media): bool => $media->uuid === $state);
foreach ($records as $record) {
/** @var Model $record */
if (! $media) {
return null;
}
/** @var ?Media $media */
$media = $record->getRelationValue('media')->first(fn (Media $media): bool => $media->uuid === $state);
$conversion = $this->getConversion();
if ($this->getVisibility() === 'private') {
try {
return $media->getTemporaryUrl(
now()->addMinutes(5),
$conversion ?? '',
);
} catch (Throwable $exception) {
// This driver does not support creating temporary URLs.
if (! $media) {
continue;
}
$conversion = $this->getConversion();
if ($this->getVisibility() === 'private') {
try {
return $media->getTemporaryUrl(
now()->addMinutes(5),
$conversion ?? '',
);
} catch (Throwable $exception) {
// This driver does not support creating temporary URLs.
}
}
return $media->getAvailableUrl(Arr::wrap($conversion));
}
return $media->getAvailableUrl(Arr::wrap($conversion));
return null;
}
/**
@@ -79,19 +84,28 @@ class SpatieMediaLibraryImageColumn extends ImageColumn
*/
public function getState(): array
{
$collection = $this->getCollection();
$record = $this->getRecord();
if ($this->hasRelationship($record)) {
$record = $record->getRelationValue($this->getRelationshipName());
$record = $this->getRelationshipResults($record);
}
return $record?->getRelationValue('media')
->filter(fn (Media $media): bool => blank($collection) || ($media->getAttributeValue('collection_name') === $collection))
->sortBy('order_column')
->map(fn (Media $media): string => $media->uuid)
->all() ?? [];
$records = Arr::wrap($record);
$state = [];
foreach ($records as $record) {
/** @var Model $record */
$state = [
...$state,
...$record->getRelationValue('media')
->sortBy('order_column')
->pluck('uuid')
->all(),
];
}
return array_unique($state);
}
public function applyEagerLoading(Builder | Relation $query): Builder | Relation
@@ -100,18 +114,23 @@ class SpatieMediaLibraryImageColumn extends ImageColumn
return $query;
}
/** @phpstan-ignore-next-line */
$modifyMediaQuery = fn (Builder | Relation $query) => $query
->ordered()
->when(
$this->getCollection(),
fn (Builder | Relation $query, string $collection) => $query->where(
'collection_name',
$collection,
),
);
if ($this->hasRelationship($query->getModel())) {
return $query->with([
"{$this->getRelationshipName()}.media" => fn (Builder | Relation $query) => $query->when(
$this->getCollection(),
fn (Builder | Relation $query, string $collection) => $query->where(
'collection_name',
$collection,
),
),
"{$this->getRelationshipName()}.media" => $modifyMediaQuery,
]);
}
return $query->with(['media']);
return $query->with(['media' => $modifyMediaQuery]);
}
}
@@ -5,6 +5,8 @@ namespace Filament\Infolists\Components;
use Closure;
use Filament\SpatieLaravelTagsPlugin\Types\AllTagTypes;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Arr;
class SpatieTagsEntry extends TextEntry
{
@@ -37,27 +39,34 @@ class SpatieTagsEntry extends TextEntry
}
if ($this->hasRelationship($record)) {
$record = $record->getRelationValue($this->getRelationshipName());
$record = $this->getRelationshipResults($record);
}
if (! $record) {
return [];
$records = Arr::wrap($record);
$state = [];
foreach ($records as $record) {
/** @var Model $record */
if (! (method_exists($record, 'tags') && method_exists($record, 'tagsWithType'))) {
continue;
}
$type = $this->getType();
if ($this->isAnyTagTypeAllowed()) {
$tags = $record->getRelationValue('tags');
} else {
$tags = $record->tagsWithType($type);
}
$state = [
...$state,
...$tags->pluck('name')->all(),
];
}
if (! (method_exists($record, 'tags') && method_exists($record, 'tagsWithType'))) {
return [];
}
$type = $this->getType();
if ($this->isAnyTagTypeAllowed()) {
/** @phpstan-ignore-next-line */
$tags = $record->tags;
} else {
$tags = $record->tagsWithType($type);
}
return $tags->pluck('name')->all();
return array_unique($state);
}
public function type(string | Closure | AllTagTypes | null $type): static
@@ -5,10 +5,12 @@ namespace Filament\Tables\Columns;
use Closure;
use Filament\SpatieLaravelTagsPlugin\Types\AllTagTypes;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\Relation;
use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
class SpatieTagsColumn extends TagsColumn
class SpatieTagsColumn extends TextColumn
{
protected string | Closure | AllTagTypes | null $type;
@@ -17,6 +19,8 @@ class SpatieTagsColumn extends TagsColumn
parent::setUp();
$this->type(new AllTagTypes());
$this->badge();
}
/**
@@ -33,27 +37,34 @@ class SpatieTagsColumn extends TagsColumn
$record = $this->getRecord();
if ($this->hasRelationship($record)) {
$record = $record->getRelationValue($this->getRelationshipName());
$record = $this->getRelationshipResults($record);
}
if (! $record) {
return [];
$records = Arr::wrap($record);
$state = [];
foreach ($records as $record) {
/** @var Model $record */
if (! (method_exists($record, 'tags') && method_exists($record, 'tagsWithType'))) {
continue;
}
$type = $this->getType();
if ($this->isAnyTagTypeAllowed()) {
$tags = $record->getRelationValue('tags');
} else {
$tags = $record->tagsWithType($type);
}
$state = [
...$state,
...$tags->pluck('name')->all(),
];
}
if (! (method_exists($record, 'tags') && method_exists($record, 'tagsWithType'))) {
return [];
}
$type = $this->getType();
if ($this->isAnyTagTypeAllowed()) {
/** @phpstan-ignore-next-line */
$tags = $record->tags;
} else {
$tags = $record->tagsWithType($type);
}
return $tags->pluck('name')->all();
return array_unique($state);
}
public function type(string | Closure | AllTagTypes | null $type): static
File diff suppressed because one or more lines are too long
@@ -96,7 +96,8 @@ trait CanReadModelSchemas
return 'title';
}
return collect($schema->getIndexes($table))->firstWhere('primary')['columns'][0] ?? 'id';
return collect($schema->getIndexes($table))
->firstWhere('primary')['columns'][0] ?? 'id';
}
/**
+13 -12
View File
@@ -12,6 +12,7 @@ use Illuminate\Support\Number;
use Illuminate\Support\Str;
use Illuminate\Translation\MessageSelector;
use Illuminate\View\ComponentAttributeBag;
use Illuminate\View\ComponentSlot;
if (! function_exists('Filament\Support\format_money')) {
/**
@@ -120,18 +121,11 @@ if (! function_exists('Filament\Support\is_slot_empty')) {
return true;
}
return trim(
str_replace(
[
'<!-- __BLOCK__ -->',
'<!-- __ENDBLOCK__ -->',
'<!--[if BLOCK]><![endif]-->',
'<!--[if ENDBLOCK]><![endif]-->',
],
'',
$slot->toHtml()
),
) === '';
if (! $slot instanceof ComponentSlot) {
$slot = new ComponentSlot($slot->toHtml());
}
return ! $slot->hasActualContent();
}
}
@@ -169,6 +163,13 @@ if (! function_exists('Filament\Support\generate_search_column_expression')) {
{
$driverName = $databaseConnection->getDriverName();
if (Str::lower($column) !== $column) {
$column = match ($driverName) {
'pgsql' => (string) str($column)->wrap('"'),
default => $column,
};
}
$column = match ($driverName) {
'pgsql' => "{$column}::text",
default => $column,
@@ -40,6 +40,13 @@ class Average extends Summarizer
return $this->selectedState[$this->getSelectAlias()];
}
public function selectAlias(?string $alias): static
{
$this->selectAlias = $alias;
return $this;
}
public function getSelectAlias(): string
{
return $this->selectAlias ??= Str::random();
@@ -75,6 +75,13 @@ class Count extends Summarizer
return $this->selectedState[$this->getSelectAlias()];
}
public function selectAlias(?string $alias): static
{
$this->selectAlias = $alias;
return $this;
}
public function getSelectAlias(): string
{
return $this->selectAlias ??= Str::random();
@@ -40,6 +40,13 @@ class Sum extends Summarizer
return $this->selectedState[$this->getSelectAlias()];
}
public function selectAlias(?string $alias): static
{
$this->selectAlias = $alias;
return $this;
}
public function getSelectAlias(): string
{
return $this->selectAlias ??= Str::random();
@@ -5,6 +5,7 @@ namespace Filament\Tables\Filters\QueryBuilder\Constraints\Operators;
use Illuminate\Database\Connection;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Query\Expression;
use Illuminate\Support\Str;
class IsFilledOperator extends Operator
{
@@ -39,7 +40,13 @@ class IsFilledOperator extends Operator
/** @var Connection $databaseConnection */
$databaseConnection = $query->getConnection();
if ($databaseConnection->getDriverName() === 'pgsql') {
$isPostgres = $databaseConnection->getDriverName() === 'pgsql';
if ((Str::lower($qualifiedColumn) !== $qualifiedColumn) && $isPostgres) {
$qualifiedColumn = (string) str($qualifiedColumn)->wrap('"');
}
if ($isPostgres) {
$qualifiedStringColumn = new Expression("{$qualifiedColumn}::text");
}
@@ -59,7 +59,13 @@ class ContainsOperator extends Operator
/** @var Connection $databaseConnection */
$databaseConnection = $query->getConnection();
if ($databaseConnection->getDriverName() === 'pgsql') {
$isPostgres = $databaseConnection->getDriverName() === 'pgsql';
if ((Str::lower($qualifiedColumn) !== $qualifiedColumn) && $isPostgres) {
$qualifiedColumn = (string) str($qualifiedColumn)->wrap('"');
}
if ($isPostgres) {
$qualifiedColumn = new Expression("lower({$qualifiedColumn}::text)");
$text = Str::lower($text);
}
@@ -59,7 +59,13 @@ class EndsWithOperator extends Operator
/** @var Connection $databaseConnection */
$databaseConnection = $query->getConnection();
if ($databaseConnection->getDriverName() === 'pgsql') {
$isPostgres = $databaseConnection->getDriverName() === 'pgsql';
if ((Str::lower($qualifiedColumn) !== $qualifiedColumn) && $isPostgres) {
$qualifiedColumn = (string) str($qualifiedColumn)->wrap('"');
}
if ($isPostgres) {
$qualifiedColumn = new Expression("lower({$qualifiedColumn}::text)");
$text = Str::lower($text);
}
@@ -59,7 +59,13 @@ class EqualsOperator extends Operator
/** @var Connection $databaseConnection */
$databaseConnection = $query->getConnection();
if ($databaseConnection->getDriverName() === 'pgsql') {
$isPostgres = $databaseConnection->getDriverName() === 'pgsql';
if ((Str::lower($qualifiedColumn) !== $qualifiedColumn) && $isPostgres) {
$qualifiedColumn = (string) str($qualifiedColumn)->wrap('"');
}
if ($isPostgres) {
$qualifiedColumn = new Expression("lower({$qualifiedColumn}::text)");
$text = Str::lower($text);
}
@@ -59,7 +59,13 @@ class StartsWithOperator extends Operator
/** @var Connection $databaseConnection */
$databaseConnection = $query->getConnection();
if ($databaseConnection->getDriverName() === 'pgsql') {
$isPostgres = $databaseConnection->getDriverName() === 'pgsql';
if ((Str::lower($qualifiedColumn) !== $qualifiedColumn) && $isPostgres) {
$qualifiedColumn = (string) str($qualifiedColumn)->wrap('"');
}
if ($isPostgres) {
$qualifiedColumn = new Expression("lower({$qualifiedColumn}::text)");
$text = Str::lower($text);
}