2024-11-21

fonc(db) exporte la BDD de production

corvée(images) ajoute les images téléversées
This commit is contained in:
gcch 2024-11-21 17:03:14 +01:00
commit 5b1b94c0fe
41 changed files with 14028 additions and 218 deletions

50
composer.lock generated
View file

@ -1887,16 +1887,16 @@
}, },
{ {
"name": "roots/wordpress", "name": "roots/wordpress",
"version": "6.7", "version": "6.7.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/roots/wordpress.git", "url": "https://github.com/roots/wordpress.git",
"reference": "1bdabdb9171ac5323edbf4792ce353d475467d27" "reference": "9451af491af7124c12186398c56ab87a6e145123"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/roots/wordpress/zipball/1bdabdb9171ac5323edbf4792ce353d475467d27", "url": "https://api.github.com/repos/roots/wordpress/zipball/9451af491af7124c12186398c56ab87a6e145123",
"reference": "1bdabdb9171ac5323edbf4792ce353d475467d27", "reference": "9451af491af7124c12186398c56ab87a6e145123",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1918,7 +1918,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/roots/wordpress/issues", "issues": "https://github.com/roots/wordpress/issues",
"source": "https://github.com/roots/wordpress/tree/6.7" "source": "https://github.com/roots/wordpress/tree/6.7.1"
}, },
"funding": [ "funding": [
{ {
@ -1926,7 +1926,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-07-16T12:03:00+00:00" "time": "2024-11-13T09:56:09+00:00"
}, },
{ {
"name": "roots/wordpress-core-installer", "name": "roots/wordpress-core-installer",
@ -2001,22 +2001,22 @@
}, },
{ {
"name": "roots/wordpress-no-content", "name": "roots/wordpress-no-content",
"version": "6.7", "version": "6.7.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/WordPress/WordPress.git", "url": "https://github.com/WordPress/WordPress.git",
"reference": "6.7" "reference": "6.7.1"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://downloads.wordpress.org/release/wordpress-6.7-no-content.zip", "url": "https://downloads.wordpress.org/release/wordpress-6.7.1-no-content.zip",
"shasum": "d30558244ed409b6421a5454f9c837d0884317f2" "shasum": "321a5b819369e772ce606fbc12b1e264fb73da5b"
}, },
"require": { "require": {
"php": ">= 7.2.24" "php": ">= 7.2.24"
}, },
"provide": { "provide": {
"wordpress/core-implementation": "6.7" "wordpress/core-implementation": "6.7.1"
}, },
"suggest": { "suggest": {
"ext-curl": "Performs remote request operations.", "ext-curl": "Performs remote request operations.",
@ -2067,7 +2067,7 @@
"type": "other" "type": "other"
} }
], ],
"time": "2024-11-12T20:51:37+00:00" "time": "2024-11-21T14:15:19+00:00"
}, },
{ {
"name": "roots/wp-config", "name": "roots/wp-config",
@ -2192,16 +2192,16 @@
}, },
{ {
"name": "stripe/stripe-php", "name": "stripe/stripe-php",
"version": "v16.2.0", "version": "v16.3.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/stripe/stripe-php.git", "url": "https://github.com/stripe/stripe-php.git",
"reference": "813ae4961755af28a13bda451689f7a6ed6498cb" "reference": "48af6bc64ca8157b3fdce100e856069963bac466"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/stripe/stripe-php/zipball/813ae4961755af28a13bda451689f7a6ed6498cb", "url": "https://api.github.com/repos/stripe/stripe-php/zipball/48af6bc64ca8157b3fdce100e856069963bac466",
"reference": "813ae4961755af28a13bda451689f7a6ed6498cb", "reference": "48af6bc64ca8157b3fdce100e856069963bac466",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2245,9 +2245,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/stripe/stripe-php/issues", "issues": "https://github.com/stripe/stripe-php/issues",
"source": "https://github.com/stripe/stripe-php/tree/v16.2.0" "source": "https://github.com/stripe/stripe-php/tree/v16.3.0"
}, },
"time": "2024-10-29T21:15:53+00:00" "time": "2024-11-20T23:30:16+00:00"
}, },
{ {
"name": "symfony/clock", "name": "symfony/clock",
@ -3373,16 +3373,16 @@
}, },
{ {
"name": "voku/portable-ascii", "name": "voku/portable-ascii",
"version": "2.0.1", "version": "2.0.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/voku/portable-ascii.git", "url": "https://github.com/voku/portable-ascii.git",
"reference": "b56450eed252f6801410d810c8e1727224ae0743" "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d",
"reference": "b56450eed252f6801410d810c8e1727224ae0743", "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3407,7 +3407,7 @@
"authors": [ "authors": [
{ {
"name": "Lars Moelleken", "name": "Lars Moelleken",
"homepage": "http://www.moelleken.org/" "homepage": "https://www.moelleken.org/"
} }
], ],
"description": "Portable ASCII library - performance optimized (ascii) string functions for php.", "description": "Portable ASCII library - performance optimized (ascii) string functions for php.",
@ -3419,7 +3419,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/voku/portable-ascii/issues", "issues": "https://github.com/voku/portable-ascii/issues",
"source": "https://github.com/voku/portable-ascii/tree/2.0.1" "source": "https://github.com/voku/portable-ascii/tree/2.0.3"
}, },
"funding": [ "funding": [
{ {
@ -3443,7 +3443,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-03-08T17:03:00+00:00" "time": "2024-11-21T01:49:47+00:00"
}, },
{ {
"name": "wpackagist-plugin/falcon", "name": "wpackagist-plugin/falcon",

File diff suppressed because one or more lines are too long

View file

@ -5,13 +5,10 @@
"description": "", "description": "",
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"packageManager": "pnpm@9.13.2", "packageManager": "pnpm@9.14.2",
"main": "index.js", "main": "index.js",
"keywords": [], "keywords": [],
"scripts": { "scripts": { "knip": "knip", "test": "echo \"Error: no test specified\" && exit 1" },
"knip": "knip",
"test": "echo \"Error: no test specified\" && exit 1"
},
"dependencies": { "dependencies": {
"@mobily/ts-belt": "4.0.0-rc.5", "@mobily/ts-belt": "4.0.0-rc.5",
"@sentry/browser": "8.39.0", "@sentry/browser": "8.39.0",
@ -38,7 +35,7 @@
"fdir": "^6.4.2", "fdir": "^6.4.2",
"globals": "^15.12.0", "globals": "^15.12.0",
"knip": "^5.37.1", "knip": "^5.37.1",
"oxlint": "^0.12.0", "oxlint": "^0.13.0",
"picomatch": "^4.0.2", "picomatch": "^4.0.2",
"prettier": "^3.3.3", "prettier": "^3.3.3",
"prettier-plugin-pkg": "^0.18.1", "prettier-plugin-pkg": "^0.18.1",
@ -69,15 +66,8 @@
"ios >0 and last 3 years" "ios >0 and last 3 years"
], ],
"knip": { "knip": {
"entry": [ "entry": ["web/app/themes/haiku-atelier-2024/src/scripts/*.ts"],
"web/app/themes/haiku-atelier-2024/src/scripts/*.ts" "project": ["web/app/themes/haiku-atelier-2024/src/scripts/**/*.{js,ts,d.ts}"]
],
"project": [
"web/app/themes/haiku-atelier-2024/src/scripts/**/*.{js,ts,d.ts}"
]
}, },
"trustedDependencies": [ "trustedDependencies": ["@biomejs/biome", "@parcel/watcher"]
"@biomejs/biome",
"@parcel/watcher"
]
} }

106
pnpm-lock.yaml generated
View file

@ -79,8 +79,8 @@ importers:
specifier: ^5.37.1 specifier: ^5.37.1
version: 5.37.1(@types/node@22.9.1)(typescript@5.7.0-dev.20241105) version: 5.37.1(@types/node@22.9.1)(typescript@5.7.0-dev.20241105)
oxlint: oxlint:
specifier: ^0.12.0 specifier: ^0.13.0
version: 0.12.0 version: 0.13.0
picomatch: picomatch:
specifier: ^4.0.2 specifier: ^4.0.2
version: 4.0.2 version: 4.0.2
@ -622,43 +622,43 @@ packages:
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
engines: {node: '>= 8'} engines: {node: '>= 8'}
'@oxlint/darwin-arm64@0.12.0': '@oxlint/darwin-arm64@0.13.0':
resolution: {integrity: sha512-UydkjcAImpmBn8JYaMPg0zJrwgWJMGvJagvCnyPfyiBRWAN83Kq+BDgJZgIq+2Te6kvlnoiHWNJKVJmpy0f0BA==} resolution: {integrity: sha512-TFVi4gWKmn4oUoaS6AUU6cvlA+xLCIHQWA27LdnyfmRDerxHSWaG4yPNq9bvhDAeeEWqid5+TR5ndu4WRhEr5A==}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
'@oxlint/darwin-x64@0.12.0': '@oxlint/darwin-x64@0.13.0':
resolution: {integrity: sha512-bxLyiAiHzXB56w7cf50YNPpZlK+PMxA8GgHutRSoNK/Z/BR/xsibNLs/9YNUnjHB+PF19+EbIRtJxoHjmbRr8g==} resolution: {integrity: sha512-ihbegvRXcED2Bgz9Lt4AGFoNfvh/tUZPrFR5DZ3Hn8muab+PEFfXXXKcelSDpTB4za5bDXz6dZcAUUfQUWPwxg==}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
'@oxlint/linux-arm64-gnu@0.12.0': '@oxlint/linux-arm64-gnu@0.13.0':
resolution: {integrity: sha512-jVkmfoMjPKFDIZySmpykwrCmx5xhpLJdMpUAR8ycEkFRJFp5qKLWZd6cEjiMb7gxmWN6qcCvDVTF/zEs3aRpyQ==} resolution: {integrity: sha512-k4r03/29d+IdcT30B6H5TpWT7bFrkqbRrFQ5VS6GX5ISN0yRdagu4Q08sDimCTTXvg5H9Z/sHmxbw7tbjGGW4w==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@oxlint/linux-arm64-musl@0.12.0': '@oxlint/linux-arm64-musl@0.13.0':
resolution: {integrity: sha512-8VdV1nKYDj7AFaw1a03Ih43/+pUS/hhMZbTFLRMpvlVp1cPtdB77c+bl/OdiJ/BwNTzLIzr/GrospwCoEJkQKg==} resolution: {integrity: sha512-m+LFHCwNydIrGHDz1VPTaQsZewaqYadKhzyjsw4TRf0g5fxeEC4tkv6MI80D2S//QO6DJi8VcnPfVqGWoS5vQQ==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@oxlint/linux-x64-gnu@0.12.0': '@oxlint/linux-x64-gnu@0.13.0':
resolution: {integrity: sha512-MacAt8N4XU5DeoHcseXLom/z+B0seecCz8vGAH4ppF2EH49o7NbN7VvFsw2nZ2QNO/4vw+pdS1BHXLTr9lY6zQ==} resolution: {integrity: sha512-Kixb9MXi5muDKsrNo5k7TANEE3DuUUSKIgoBN68LbX4n2owjCsq/gnzVjQ/rDK0vFn0JQMxMXWjBZvV64ybXMQ==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@oxlint/linux-x64-musl@0.12.0': '@oxlint/linux-x64-musl@0.13.0':
resolution: {integrity: sha512-/ZBDJ9wpUE6bB05nniQl29kD5vJUMg6n75LdHD8F6ThXfsHGI/n7Je3gzggnXokgf9UQpTUPWrWlfEuWVCBMag==} resolution: {integrity: sha512-wCCsesDf05G0bjXMrxAvH36Cl4q0oavR3fo4N5NJyyrRdZ+feAZSsfaHRpvlqkJyUM3vhP6emKrXzIN5fp22dw==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@oxlint/win32-arm64@0.12.0': '@oxlint/win32-arm64@0.13.0':
resolution: {integrity: sha512-hY1ya9dv8VY8113YSSDfMs/989aFmoA2fIZco8uxTxIEVl9nGY6tDtpgKZqUIiGrrMbDO8BBb1G5jsekmfexbA==} resolution: {integrity: sha512-xO6oZ+0yjYuEviKqRUVWMuYvzYqJDHd0IcBss8J2o45OS9SH+mNNk5gZJm9uKbDdmFZcDn2OlZxAiygVMxHt9g==}
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
'@oxlint/win32-x64@0.12.0': '@oxlint/win32-x64@0.13.0':
resolution: {integrity: sha512-NHLJolo4sZk3nu/bPNuaJ+6p5DdHoRuZAjyuSO6CnLgpmZcYqx7LgngA/x2oB/bLgi4Hv9twjHjODc5Ce5o14g==} resolution: {integrity: sha512-NiiaQ/AD1ILQ8cXRxdjE/dRMCRABFbelSYqoFrrklV2Y7hwtF0Law48GvM5ysQbz/NHVpQpnVNQOQ3cevywn3w==}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
@ -1003,8 +1003,8 @@ packages:
'@swc/counter@0.1.3': '@swc/counter@0.1.3':
resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
'@swc/types@0.1.15': '@swc/types@0.1.17':
resolution: {integrity: sha512-XKaZ+dzDIQ9Ot9o89oJQ/aluI17+VvUnIpYJTcZtvv1iYX6MzHh3Ik2CSR7MdPKpPwfZXHBeCingb2b4PoDVdw==} resolution: {integrity: sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==}
'@szmarczak/http-timer@5.0.1': '@szmarczak/http-timer@5.0.1':
resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==}
@ -1297,8 +1297,8 @@ packages:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'} engines: {node: '>=6'}
caniuse-lite@1.0.30001680: caniuse-lite@1.0.30001683:
resolution: {integrity: sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==} resolution: {integrity: sha512-iqmNnThZ0n70mNwvxpEC2nBJ037ZHZUoBI5Gorh1Mw6IlEAZujEoU1tXA628iZfzm7R9FvFzxbfdgml82a3k8Q==}
chalk@4.1.2: chalk@4.1.2:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
@ -1456,8 +1456,8 @@ packages:
resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
engines: {node: '>=8'} engines: {node: '>=8'}
domain-browser@4.23.0: domain-browser@4.22.0:
resolution: {integrity: sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==} resolution: {integrity: sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==}
engines: {node: '>=10'} engines: {node: '>=10'}
easy-table@1.2.0: easy-table@1.2.0:
@ -2069,8 +2069,8 @@ packages:
node-releases@2.0.18: node-releases@2.0.18:
resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==}
node-stdlib-browser@1.2.1: node-stdlib-browser@1.3.0:
resolution: {integrity: sha512-dZezG3D88Lg22DwyjsDuUs7cCT/XGr8WwJgg/S3ZnkcWuPet2Tt/W1d2Eytb1Z73JpZv+XVCDI5TWv6UMRq0Gg==} resolution: {integrity: sha512-g/koYzOr9Fb1Jc+tHUHlFd5gODjGn48tHexUK8q6iqOVriEgSnd3/1T7myBYc+0KBVze/7F7n65ec9rW6OD7xw==}
engines: {node: '>=10'} engines: {node: '>=10'}
normalize-path@3.0.0: normalize-path@3.0.0:
@ -2112,8 +2112,8 @@ packages:
os-browserify@0.3.0: os-browserify@0.3.0:
resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==}
oxlint@0.12.0: oxlint@0.13.0:
resolution: {integrity: sha512-M0vWq8KYtp4vpweRxcdCiVO8QFwzoRyp5bWTMrEL/0Z+GDKCMJltac7H3T3T09FIiktOZLvID733d7OcKk/caw==} resolution: {integrity: sha512-YUwybs9U5siS54Q+vVkxMQXiNF6LHeLRxihj6toUFwrYSxL1wsV6HUiAS8Vig+USDIGoEDdGBgpq29iwWDjYHw==}
engines: {node: '>=14.*'} engines: {node: '>=14.*'}
hasBin: true hasBin: true
@ -3290,28 +3290,28 @@ snapshots:
'@nodelib/fs.scandir': 2.1.5 '@nodelib/fs.scandir': 2.1.5
fastq: 1.17.1 fastq: 1.17.1
'@oxlint/darwin-arm64@0.12.0': '@oxlint/darwin-arm64@0.13.0':
optional: true optional: true
'@oxlint/darwin-x64@0.12.0': '@oxlint/darwin-x64@0.13.0':
optional: true optional: true
'@oxlint/linux-arm64-gnu@0.12.0': '@oxlint/linux-arm64-gnu@0.13.0':
optional: true optional: true
'@oxlint/linux-arm64-musl@0.12.0': '@oxlint/linux-arm64-musl@0.13.0':
optional: true optional: true
'@oxlint/linux-x64-gnu@0.12.0': '@oxlint/linux-x64-gnu@0.13.0':
optional: true optional: true
'@oxlint/linux-x64-musl@0.12.0': '@oxlint/linux-x64-musl@0.13.0':
optional: true optional: true
'@oxlint/win32-arm64@0.12.0': '@oxlint/win32-arm64@0.13.0':
optional: true optional: true
'@oxlint/win32-x64@0.12.0': '@oxlint/win32-x64@0.13.0':
optional: true optional: true
'@parcel/watcher-android-arm64@2.5.0': '@parcel/watcher-android-arm64@2.5.0':
@ -3574,7 +3574,7 @@ snapshots:
'@swc/core@1.9.1': '@swc/core@1.9.1':
dependencies: dependencies:
'@swc/counter': 0.1.3 '@swc/counter': 0.1.3
'@swc/types': 0.1.15 '@swc/types': 0.1.17
optionalDependencies: optionalDependencies:
'@swc/core-darwin-arm64': 1.9.1 '@swc/core-darwin-arm64': 1.9.1
'@swc/core-darwin-x64': 1.9.1 '@swc/core-darwin-x64': 1.9.1
@ -3589,7 +3589,7 @@ snapshots:
'@swc/counter@0.1.3': {} '@swc/counter@0.1.3': {}
'@swc/types@0.1.15': '@swc/types@0.1.17':
dependencies: dependencies:
'@swc/counter': 0.1.3 '@swc/counter': 0.1.3
@ -3945,7 +3945,7 @@ snapshots:
browserslist@4.24.2: browserslist@4.24.2:
dependencies: dependencies:
caniuse-lite: 1.0.30001680 caniuse-lite: 1.0.30001683
electron-to-chromium: 1.5.63 electron-to-chromium: 1.5.63
node-releases: 2.0.18 node-releases: 2.0.18
update-browserslist-db: 1.1.1(browserslist@4.24.2) update-browserslist-db: 1.1.1(browserslist@4.24.2)
@ -3985,7 +3985,7 @@ snapshots:
callsites@3.1.0: {} callsites@3.1.0: {}
caniuse-lite@1.0.30001680: {} caniuse-lite@1.0.30001683: {}
chalk@4.1.2: chalk@4.1.2:
dependencies: dependencies:
@ -4151,7 +4151,7 @@ snapshots:
dependencies: dependencies:
path-type: 4.0.0 path-type: 4.0.0
domain-browser@4.23.0: {} domain-browser@4.22.0: {}
easy-table@1.2.0: easy-table@1.2.0:
dependencies: dependencies:
@ -4768,7 +4768,7 @@ snapshots:
node-releases@2.0.18: {} node-releases@2.0.18: {}
node-stdlib-browser@1.2.1: node-stdlib-browser@1.3.0:
dependencies: dependencies:
assert: 2.1.0 assert: 2.1.0
browser-resolve: 2.0.0 browser-resolve: 2.0.0
@ -4778,7 +4778,7 @@ snapshots:
constants-browserify: 1.0.0 constants-browserify: 1.0.0
create-require: 1.1.1 create-require: 1.1.1
crypto-browserify: 3.12.1 crypto-browserify: 3.12.1
domain-browser: 4.23.0 domain-browser: 4.22.0
events: 3.3.0 events: 3.3.0
https-browserify: 1.0.0 https-browserify: 1.0.0
isomorphic-timers-promises: 1.0.1 isomorphic-timers-promises: 1.0.1
@ -4837,16 +4837,16 @@ snapshots:
os-browserify@0.3.0: {} os-browserify@0.3.0: {}
oxlint@0.12.0: oxlint@0.13.0:
optionalDependencies: optionalDependencies:
'@oxlint/darwin-arm64': 0.12.0 '@oxlint/darwin-arm64': 0.13.0
'@oxlint/darwin-x64': 0.12.0 '@oxlint/darwin-x64': 0.13.0
'@oxlint/linux-arm64-gnu': 0.12.0 '@oxlint/linux-arm64-gnu': 0.13.0
'@oxlint/linux-arm64-musl': 0.12.0 '@oxlint/linux-arm64-musl': 0.13.0
'@oxlint/linux-x64-gnu': 0.12.0 '@oxlint/linux-x64-gnu': 0.13.0
'@oxlint/linux-x64-musl': 0.12.0 '@oxlint/linux-x64-musl': 0.13.0
'@oxlint/win32-arm64': 0.12.0 '@oxlint/win32-arm64': 0.13.0
'@oxlint/win32-x64': 0.12.0 '@oxlint/win32-x64': 0.13.0
p-cancelable@3.0.0: {} p-cancelable@3.0.0: {}
@ -5575,7 +5575,7 @@ snapshots:
vite-plugin-node-polyfills@0.22.0(rollup@4.27.3)(vite@5.4.11(@types/node@22.9.1)(sass-embedded@1.81.0)(sass@1.80.6)): vite-plugin-node-polyfills@0.22.0(rollup@4.27.3)(vite@5.4.11(@types/node@22.9.1)(sass-embedded@1.81.0)(sass@1.80.6)):
dependencies: dependencies:
'@rollup/plugin-inject': 5.0.5(rollup@4.27.3) '@rollup/plugin-inject': 5.0.5(rollup@4.27.3)
node-stdlib-browser: 1.2.1 node-stdlib-browser: 1.3.0
vite: 5.4.11(@types/node@22.9.1)(sass-embedded@1.81.0)(sass@1.80.6) vite: 5.4.11(@types/node@22.9.1)(sass-embedded@1.81.0)(sass@1.80.6)
transitivePeerDependencies: transitivePeerDependencies:
- rollup - rollup

View file

@ -130,9 +130,6 @@
* 1. Longueur minimale pour le Bouton n'ait pas à changer de taille quel que soit son texte * 1. Longueur minimale pour le Bouton n'ait pas à changer de taille quel que soit son texte
*/ */
} }
#panneau-panier .panneau__instructions-code-promo__code-promo input {
width: 20rem;
}
#panneau-panier .panneau__instructions-code-promo__code-promo button { #panneau-panier .panneau__instructions-code-promo__code-promo button {
padding: var(--espace-xs) var(--espace-xl); padding: var(--espace-xs) var(--espace-xl);
text-transform: lowercase; text-transform: lowercase;

View file

@ -1 +1 @@
{"version":3,"sourceRoot":"","sources":["../../../src/sass/layouts/_panneau-panier.scss","../../../src/sass/layouts/_panneau-informations-client.scss","../../../src/sass/pages/page-panier.scss"],"names":[],"mappings":";AAEA;EACE;;AAEA;EACE;;AAIF;EACE;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAGA;EACE;;AAEA;EACE;;AAGF;EACE;EACA;;AAMN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAIJ;EACE;EACA;;AAIF;EACE;EACA;EACA;EACA;EACA;AAEA;AASA;AAAA;AAAA;AAAA;AAmBA;AASA;;AApCA;EACE;EACA;EACA;EACA;EACA;;AAOF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EAEE;EACA;;AAKJ;EACE;EACA;EACA;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;EACA;;AAOR;EACE;EACA;EACA;EACA;AAEA;AAAA;AAAA;AAAA;;AAIA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;AAMA;AAAA;AAAA;;AAJA;EACE;;AAMF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAKN;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAKA;EACE;;AAEA;EACE;;AAMR;EACE;EACA;EACA;EACA;EACA;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;;ACjON;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAIF;EAEE;EACA;EACA;EAGA;EAEA;EACA;;AAEA;EACE;EACA;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;;AAMN;EACE;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGE;EACE;;AAOV;EACE;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAIA;EACE;;AAKN;EACE;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;;AC1JN;AAAA;AAAA;AAAA;AAIA;AACE;EACA;AAEA;EACA;EAEA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAGA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;;AAKN;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;;AAKF;EACE;;AAGF;EACE","file":"page-panier.css"} {"version":3,"sourceRoot":"","sources":["../../../src/sass/layouts/_panneau-panier.scss","../../../src/sass/layouts/_panneau-informations-client.scss","../../../src/sass/pages/page-panier.scss"],"names":[],"mappings":";AAEA;EACE;;AAEA;EACE;;AAIF;EACE;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAGA;EACE;;AAEA;EACE;;AAGF;EACE;EACA;;AAMN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAIJ;EACE;EACA;;AAIF;EACE;EACA;EACA;EACA;EACA;AAEA;AASA;AAAA;AAAA;AAAA;AAmBA;AASA;;AApCA;EACE;EACA;EACA;EACA;EACA;;AAOF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EAEE;EACA;;AAKJ;EACE;EACA;EACA;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;EACA;;AAOR;EACE;EACA;EACA;EACA;AAEA;AAAA;AAAA;AAAA;;AAIA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;AAEA;AAAA;AAAA;;AAGA;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAKN;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAKA;EACE;;AAEA;EACE;;AAMR;EACE;EACA;EACA;EACA;EACA;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;;AC7NN;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAIF;EAEE;EACA;EACA;EAGA;EAEA;EACA;;AAEA;EACE;EACA;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;;AAMN;EACE;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGE;EACE;;AAOV;EACE;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAIA;EACE;;AAKN;EACE;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;;AC1JN;AAAA;AAAA;AAAA;AAIA;AACE;EACA;AAEA;EACA;EAEA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAGA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;;AAKN;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;;AAKF;EACE;;AAGF;EACE","file":"page-panier.css"}

File diff suppressed because one or more lines are too long

View file

@ -68,7 +68,7 @@
"name": "dom", "name": "dom",
"src": "web/app/themes/haiku-atelier-2024/src/scripts/constantes/dom.ts", "src": "web/app/themes/haiku-atelier-2024/src/scripts/constantes/dom.ts",
"isEntry": true, "isEntry": true,
"integrity": "sha512-ldPkBLWjE77dp7raA0LauVQS11/w/N0RpOCtgmJu3PQfwEezQS4iVPnp10lZGduIClmliT7WPpbqrZchRTpITw==" "integrity": "sha512-I1Z5v7vScYFe97juQAHfl5K/N6OR+BQCiVvxTIBbgPv8Y0NQMIBebWYj1/xhKB7AUSlIUYOaFvus/zOeU5TJOQ=="
}, },
"web/app/themes/haiku-atelier-2024/src/scripts/constantes/erreurs.ts": { "web/app/themes/haiku-atelier-2024/src/scripts/constantes/erreurs.ts": {
"file": "erreurs.js", "file": "erreurs.js",
@ -110,6 +110,13 @@
], ],
"integrity": "sha512-mskLArAQPBWERMQR6U4/xLPd+NfjZ59hrptjz2G/7KUnC8cVe33bzBkQzUHZDNxy2/YlDFXTWO6NwQjgKKzgxQ==" "integrity": "sha512-mskLArAQPBWERMQR6U4/xLPd+NfjZ59hrptjz2G/7KUnC8cVe33bzBkQzUHZDNxy2/YlDFXTWO6NwQjgKKzgxQ=="
}, },
"web/app/themes/haiku-atelier-2024/src/scripts/lib/animations.ts": {
"file": "animations.js",
"name": "animations",
"src": "web/app/themes/haiku-atelier-2024/src/scripts/lib/animations.ts",
"isEntry": true,
"integrity": "sha512-SD+1/duJm9OdEuU10TyTp/l4GTZulyECskFYLi5TBLOf5GLkbtiI7wgYto28fXhXRPVcoWuD1Coul4mXCiyAng=="
},
"web/app/themes/haiku-atelier-2024/src/scripts/lib/dom.ts": { "web/app/themes/haiku-atelier-2024/src/scripts/lib/dom.ts": {
"file": "dom2.js", "file": "dom2.js",
"name": "dom", "name": "dom",
@ -121,7 +128,7 @@
"_Either.wHNxn7Os.js", "_Either.wHNxn7Os.js",
"_exports.3IcOsN8u.js" "_exports.3IcOsN8u.js"
], ],
"integrity": "sha512-nNoNk0nD88HRS8LqyIx5kV9MOZBIbcHO4IaumhTh6T3p34OdBIJtM8QQVngu6X/jPdCbMFDj9uajXKAgMkE8bQ==" "integrity": "sha512-I/u87SjbDtW7SK4O2yinDf8MAhDVpWyRBxa4gWSoLB2tXtqjqkg5YfhJXWIf3az36oSjHunCsSRzdZjrgXUqug=="
}, },
"web/app/themes/haiku-atelier-2024/src/scripts/lib/erreurs.ts": { "web/app/themes/haiku-atelier-2024/src/scripts/lib/erreurs.ts": {
"file": "erreurs2.js", "file": "erreurs2.js",
@ -179,7 +186,7 @@
"web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/api/cart-coupons.ts", "web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/api/cart-coupons.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/api/couts-livraison.ts" "web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/api/couts-livraison.ts"
], ],
"integrity": "sha512-eNfGzO+xLfiHFnNdNdE+zBcnvpPz/wE6vXX1rKbYVlFuf2gPC9kxCEwQnH+BijivLi/JkqkrtXv+m/92RShOrA==" "integrity": "sha512-1kRDhi1+KGja3JCleYjLnsjVDpCrRXQqB8ZGAjpuTEAMiKpSQqj3x8vPCySRvkv8wreUc2UzTOa1xCljoZ8bPA=="
}, },
"web/app/themes/haiku-atelier-2024/src/scripts/lib/nombres.ts": { "web/app/themes/haiku-atelier-2024/src/scripts/lib/nombres.ts": {
"file": "nombres.js", "file": "nombres.js",
@ -368,7 +375,7 @@
"web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/api/cart-coupons.ts", "web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/api/cart-coupons.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/api/couts-livraison.ts" "web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/api/couts-livraison.ts"
], ],
"integrity": "sha512-DRQfMEltCFFPp1xUw26z4CbypxMn//NWQEsKGc98p9UTSaoSNUy7rDWR7JJYM5mnZvglEu+jEzzrKXCrZvQB2w==" "integrity": "sha512-e0iafVBzxA+LOMbD4VlzjtXW1GU/LmETBKAQ5cV7glJdsaY5/ZWVGcSOOPdwT6kvQkMBohKCgn9K5Bqwoi38zA=="
}, },
"web/app/themes/haiku-atelier-2024/src/scripts/lib/types/api/v3/orders.ts": { "web/app/themes/haiku-atelier-2024/src/scripts/lib/types/api/v3/orders.ts": {
"file": "orders.js", "file": "orders.js",
@ -541,6 +548,7 @@
"web/app/themes/haiku-atelier-2024/src/scripts/constantes/api.ts", "web/app/themes/haiku-atelier-2024/src/scripts/constantes/api.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/constantes/dom.ts", "web/app/themes/haiku-atelier-2024/src/scripts/constantes/dom.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/constantes/erreurs.ts", "web/app/themes/haiku-atelier-2024/src/scripts/constantes/erreurs.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/animations.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/dom.ts", "web/app/themes/haiku-atelier-2024/src/scripts/lib/dom.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/erreurs.ts", "web/app/themes/haiku-atelier-2024/src/scripts/lib/erreurs.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/erreurs/codes-promo.ts", "web/app/themes/haiku-atelier-2024/src/scripts/lib/erreurs/codes-promo.ts",
@ -564,7 +572,7 @@
"web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/api/cart-coupons.ts", "web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/api/cart-coupons.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/api/couts-livraison.ts" "web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/api/couts-livraison.ts"
], ],
"integrity": "sha512-Dcq5CmQJWGUY0FPDHu4fI5COKoVMxA0I0zUpOpPIS6IQ8HXCvzQjH+18wNzCpbqNB/L0mrILXsSVmLmpeLGEWw==" "integrity": "sha512-YYKaBtgzKquj63eMhqcijL6/wgAFl1WCKSED+/q4B2h7+YibZkgBMyWOkKRZcUVWQZYHhx2PHMgWIAdRbnld/A=="
}, },
"web/app/themes/haiku-atelier-2024/src/scripts/scripts-page-panier.ts": { "web/app/themes/haiku-atelier-2024/src/scripts/scripts-page-panier.ts": {
"file": "scripts-page-panier.js", "file": "scripts-page-panier.js",
@ -602,13 +610,14 @@
"web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/api/cart-coupons.ts", "web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/api/cart-coupons.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/constantes/orders.ts", "web/app/themes/haiku-atelier-2024/src/scripts/constantes/orders.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/constantes/erreurs.ts", "web/app/themes/haiku-atelier-2024/src/scripts/constantes/erreurs.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/animations.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/erreurs/codes-promo.ts", "web/app/themes/haiku-atelier-2024/src/scripts/lib/erreurs/codes-promo.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/api/cart-apply-coupon.ts", "web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/api/cart-apply-coupon.ts",
"web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/api/cart-remove-coupon.ts", "web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/api/cart-remove-coupon.ts",
"_MaybeAsync.AE1jnxuc.js", "_MaybeAsync.AE1jnxuc.js",
"_belt_Option-91f3b350.cBye8bLJ.js" "_belt_Option-91f3b350.cBye8bLJ.js"
], ],
"integrity": "sha512-nv6WicLF3qhp2tyjzl7Ns5Yyfon9onWi/u5nxsvBRT6oEpdb9h5rXxDx3ydC6OsMR9n/B1wdXsuxxHTmECqX/w==" "integrity": "sha512-LrETkMtNpCGK3ohj7yLHF5vz4lIdAgQaqSzq/6Ij7TGl67V0nu+E4TOATuT56B0djGTtJJXc24fflEYEf/rW/A=="
}, },
"web/app/themes/haiku-atelier-2024/src/scripts/scripts-page-produit.ts": { "web/app/themes/haiku-atelier-2024/src/scripts/scripts-page-produit.ts": {
"file": "scripts-page-produit.js", "file": "scripts-page-produit.js",
@ -642,6 +651,6 @@
"web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/api/couts-livraison.ts", "web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/api/couts-livraison.ts",
"_belt_Option-91f3b350.cBye8bLJ.js" "_belt_Option-91f3b350.cBye8bLJ.js"
], ],
"integrity": "sha512-lUQ7gg9r4XVBz+5ivZvD+nP+ncAJ4I78VpiJJE3NSWecpGYoyN/2/LvWzQr8maRyf7Ox4+aJRrbHIaQZVul/fQ==" "integrity": "sha512-4HoksAZ1TvIRrylHgveTV7HHpYiDQSxAhFCCJ7kUj8iGrwC46k9oFevH3wyFOWdxK+fsUoTjyEZ9BK7R5q64ig=="
} }
} }

View file

@ -0,0 +1,21 @@
const lanceAnimationCycleTexte = (args) => {
const animation = {
callback: () => {
if (!args.element.hasAttribute(args.attribut)) {
clearInterval(animation.interval);
return;
}
args.element.textContent = animation.etapes.at(animation.index) ?? "Loading...";
animation.index = animation.index + 1 > animation.etapes.length - 1 ? 0 : animation.index + 1;
},
etapes: args.etapes,
index: 0,
interval: setInterval(() => {
}, 2147483647)
};
return animation;
};
export {
lanceAnimationCycleTexte as l
};
//# sourceMappingURL=animations.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"animations.js","sources":["../../src/scripts/lib/animations.ts"],"sourcesContent":["/** Fonctions pour la création de simples animations JavaScript. */\n\n// Types\ninterface AnimationCycleTexte {\n callback: () => void;\n etapes: Array<string>;\n index: number;\n interval: NodeJS.Timeout;\n}\n\ninterface ParametresAnimationCycleTexte {\n attribut: string;\n element: HTMLElement;\n etapes: Array<string>;\n}\n\n/**\n * Créer le nécessaire pour une animation s'exécutant jusqu'à ce que un interval soit manuellement arrêté. L'animation\n * consiste en la mise à jour d'un texte avec l'utilisation de toutes les valeurs d'un tableau, une par une.\n *\n * @param args Les paramètres nécessaires pour la création de l'animation.\n * @returns Un objet contenant les informations de l'animation, notamment l'interval utilisable pour son arrêt.\n */\nexport const lanceAnimationCycleTexte = (args: ParametresAnimationCycleTexte): AnimationCycleTexte => {\n const animation: AnimationCycleTexte = {\n callback: (): void => {\n // Arrête le cycle quand l'Attribut de chargement n'est plus présent\n if (!args.element.hasAttribute(args.attribut)) {\n clearInterval(animation.interval);\n return;\n }\n\n // Change le texte\n args.element.textContent = animation.etapes.at(animation.index) ?? \"Loading...\";\n // Incrémente ou réinitialise l'index\n animation.index = animation.index + 1 > animation.etapes.length - 1 ? 0 : animation.index + 1;\n },\n etapes: args.etapes,\n index: 0,\n interval: setInterval(() => {}, 2147483647),\n };\n\n return animation;\n};\n"],"names":[],"mappings":"AAuBa,MAAA,2BAA2B,CAAC,SAA6D;AACpG,QAAM,YAAiC;AAAA,IACrC,UAAU,MAAY;AAEpB,UAAI,CAAC,KAAK,QAAQ,aAAa,KAAK,QAAQ,GAAG;AAC7C,sBAAc,UAAU,QAAQ;AAChC;AAAA,MAAA;AAIF,WAAK,QAAQ,cAAc,UAAU,OAAO,GAAG,UAAU,KAAK,KAAK;AAEzD,gBAAA,QAAQ,UAAU,QAAQ,IAAI,UAAU,OAAO,SAAS,IAAI,IAAI,UAAU,QAAQ;AAAA,IAC9F;AAAA,IACA,QAAQ,KAAK;AAAA,IACb,OAAO;AAAA,IACP,UAAU,YAAY,MAAM;AAAA,IAAA,GAAI,UAAU;AAAA,EAC5C;AAEO,SAAA;AACT;"}

View file

@ -65,15 +65,15 @@ const SELECTEUR_PRIX_PRODUIT = ".selecteur-produit__prix";
export { export {
SELECTEUR_BOUTON_MENU_MOBILE as $, SELECTEUR_BOUTON_MENU_MOBILE as $,
ATTRIBUT_CONTIENT_ARTICLES as A, ATTRIBUT_CONTIENT_ARTICLES as A,
SELECTEUR_BOUTON_SUPPRESSION_PANIER as B, SELECTEUR_BOUTON_ADDITION_QUANTITE as B,
SELECTEUR_PRIX_LIGNE_PANIER as C, SELECTEUR_BOUTON_SUPPRESSION_PANIER as C,
ATTRIBUT_DESACTIVE as D, SELECTEUR_PRIX_LIGNE_PANIER as D,
SELECTEUR_BOUTON_CODE_PROMO as E, ATTRIBUT_DESACTIVE as E,
SELECTEUR_CHAMP_CODE_PROMO as F, SELECTEUR_BOUTON_CODE_PROMO as F,
SELECTEUR_ENSEMBLE_CODE_PROMO as G, SELECTEUR_CHAMP_CODE_PROMO as G,
SELECTEUR_MESSAGE_CODE_PROMO as H, SELECTEUR_ENSEMBLE_CODE_PROMO as H,
SELECTEUR_TOTAL_REDUCTION as I, SELECTEUR_MESSAGE_CODE_PROMO as I,
SELECTEUR_TOTAL_REDUCTION_VALEUR as J, SELECTEUR_TOTAL_REDUCTION as J,
ATTRIBUT_CHARGEMENT as K, ATTRIBUT_CHARGEMENT as K,
ATTRIBUT_CODE_PROMO_PRESENT as L, ATTRIBUT_CODE_PROMO_PRESENT as L,
SELECTEUR_BOUTON_AJOUT_PANIER as M, SELECTEUR_BOUTON_AJOUT_PANIER as M,
@ -121,10 +121,10 @@ export {
SELECTEUR_FORMULAIRE_PANIER as s, SELECTEUR_FORMULAIRE_PANIER as s,
SELECTEUR_FORMULAIRE_FACTURATION as t, SELECTEUR_FORMULAIRE_FACTURATION as t,
SELECTEUR_BOUTON_ACTIONS_FORMULAIRE as u, SELECTEUR_BOUTON_ACTIONS_FORMULAIRE as u,
SELECTEUR_INSTRUCTIONS_CLIENT as v, SELECTEUR_TOTAL_REDUCTION_VALEUR as v,
ATTRIBUT_CLE_PANIER as w, SELECTEUR_INSTRUCTIONS_CLIENT as w,
SELECTEUR_BOUTON_SOUSTRACTION_QUANTITE as x, ATTRIBUT_CLE_PANIER as x,
SELECTEUR_CHAMP_QUANTITE_LIGNE_PANIER as y, SELECTEUR_BOUTON_SOUSTRACTION_QUANTITE as y,
SELECTEUR_BOUTON_ADDITION_QUANTITE as z SELECTEUR_CHAMP_QUANTITE_LIGNE_PANIER as z
}; };
//# sourceMappingURL=dom.js.map //# sourceMappingURL=dom.js.map

View file

@ -2035,13 +2035,13 @@ const html = (strings, ...args) => pipe(
); );
const eitherSessionStorageGet = (cle) => Maybe.fromNullable(sessionStorage.getItem(cle)).toEither(ErreurEntreeInexistante(`Clé ${cle} absente dans le stockage de session.`)); const eitherSessionStorageGet = (cle) => Maybe.fromNullable(sessionStorage.getItem(cle)).toEither(ErreurEntreeInexistante(`Clé ${cle} absente dans le stockage de session.`));
const eitherJsonParse = (chaine) => Either.encase(() => JSON.parse(chaine)); const eitherJsonParse = (chaine) => Either.encase(() => JSON.parse(chaine));
const correspondCibleSelecteur = (cible, selecteur) => cible !== null && cible.matches(selecteur); const accorderCibleASelecteur = (cible, selecteur) => cible !== null && cible.matches(selecteur);
export { export {
Ra as R, Ra as R,
recupereElementsAvecSelecteur as a, recupereElementsAvecSelecteur as a,
eitherJsonParse as b, eitherJsonParse as b,
recupereElementAvecSelecteur as c, recupereElementAvecSelecteur as c,
correspondCibleSelecteur as d, accorderCibleASelecteur as d,
eitherSessionStorageGet as e, eitherSessionStorageGet as e,
recupereElementsOuLeve as f, recupereElementsOuLeve as f,
equal as g, equal as g,

File diff suppressed because one or more lines are too long

View file

@ -26,7 +26,8 @@ const emetMessageMajContenuPanier = (args) => {
canal.postMessage({ canal.postMessage({
donnees: { donnees: {
produits: args.produits, produits: args.produits,
sousTotalPanier: args.sousTotalPanier, sousTotalProduits: args.sousTotalProduits,
sousTotalReduction: args.sousTotalReduction,
totalPanier: args.totalPanier totalPanier: args.totalPanier
}, },
type: TYPES_MESSAGES.MajContenuPanier type: TYPES_MESSAGES.MajContenuPanier

View file

@ -1 +1 @@
{"version":3,"file":"messages.js","sources":["../../src/scripts/lib/messages.ts"],"sourcesContent":["import { pipe } from \"@mobily/ts-belt\";\nimport { Either } from \"purify-ts\";\nimport { parse, type ValiError } from \"valibot\";\n\nimport type {\n MessageMajBoutonPanier,\n MessageMajBoutonPanierDonnees,\n MessageMajContenuPanier,\n MessageMajContenuPanierDonnees,\n} from \"./types/messages\";\n\nimport { NOM_CANAL_BOUTON_PANIER, NOM_CANAL_CONTENU_PANIER, TYPES_MESSAGES } from \"../constantes/messages.ts\";\nimport { reporteErreur } from \"./erreurs.ts\";\nimport { WCErrorSchema } from \"./schemas/api/erreurs.ts\";\nimport { MessageMajBoutonPanierSchema, MessageMajContenuPanierSchema } from \"./schemas/messages.ts\";\nimport { ReponseSimplifiee } from \"./types/reseau\";\nimport { eitherParse } from \"./validation.ts\";\n\nexport const canalPostMessage = (canal: BroadcastChannel, message: any): BroadcastChannel => {\n canal.postMessage(message);\n return canal;\n};\n\n// Émissions\nexport const emetMessageMajBoutonPanier = (args: MessageMajBoutonPanierDonnees): void => {\n const canal = new BroadcastChannel(NOM_CANAL_BOUTON_PANIER);\n canal.postMessage({\n donnees: {\n quantiteProduits: args.quantiteProduits,\n },\n type: TYPES_MESSAGES.MajBoutonPanier,\n } as MessageMajBoutonPanier);\n canal.close();\n};\n\nexport const emetMessageMajContenuPanier = (args: MessageMajContenuPanierDonnees): void => {\n const canal = new BroadcastChannel(NOM_CANAL_CONTENU_PANIER);\n canal.postMessage({\n donnees: {\n produits: args.produits,\n sousTotalPanier: args.sousTotalPanier,\n totalPanier: args.totalPanier,\n },\n type: TYPES_MESSAGES.MajContenuPanier,\n } as MessageMajContenuPanier);\n canal.close();\n};\n\n/**\n * Émet un unique message vers un BroadcastChannel (canal) généré sur le moment puis le ferme.\n *\n * @param nomCanal Le nom du BroadcastChannel pour lequel le message est émis.\n * @param message Le message émis.\n * @return void\n */\nexport const emetUniqueMessageCanal = <M>(nomCanal: string, message: M): void =>\n pipe(new BroadcastChannel(nomCanal), canal => canalPostMessage(canal, message), canal => canal.close());\n\n// Validations\nexport const valideMessageMajBoutonPanier = (\n evenementMessage: MessageEvent<unknown>,\n): Either<ValiError<typeof MessageMajBoutonPanierSchema>, MessageMajBoutonPanier> =>\n Either\n .of<ValiError<typeof MessageMajBoutonPanierSchema>, MessageMajBoutonPanier>(\n parse(MessageMajBoutonPanierSchema, evenementMessage.data),\n )\n .ifLeft(erreur => reporteErreur(erreur));\n\nexport const valideMessageMajContenuPanier = (\n evenementMessage: MessageEvent<unknown>,\n): Either<ValiError<typeof MessageMajContenuPanierSchema>, MessageMajContenuPanier> =>\n Either\n .of<ValiError<typeof MessageMajContenuPanierSchema>, MessageMajContenuPanier>(\n parse(MessageMajContenuPanierSchema, evenementMessage.data),\n )\n .ifLeft(erreur => reporteErreur(erreur));\n\n// Correspondances\nexport const reponseEstCodeErreurWC = (reponse: ReponseSimplifiee, codeErreurWC: string): boolean =>\n eitherParse(reponse, WCErrorSchema)\n .map(v => v.body.code === codeErreurWC)\n .orDefault(false);\n"],"names":[],"mappings":";;;;;;;;;;;;;AAwBa,MAAA,6BAA6B,CAAC,SAA8C;AACjF,QAAA,QAAQ,IAAI,iBAAiB,uBAAuB;AAC1D,QAAM,YAAY;AAAA,IAChB,SAAS;AAAA,MACP,kBAAkB,KAAK;AAAA,IACzB;AAAA,IACA,MAAM,eAAe;AAAA,EAAA,CACI;AAC3B,QAAM,MAAM;AACd;AAEa,MAAA,8BAA8B,CAAC,SAA+C;AACnF,QAAA,QAAQ,IAAI,iBAAiB,wBAAwB;AAC3D,QAAM,YAAY;AAAA,IAChB,SAAS;AAAA,MACP,UAAU,KAAK;AAAA,MACf,iBAAiB,KAAK;AAAA,MACtB,aAAa,KAAK;AAAA,IACpB;AAAA,IACA,MAAM,eAAe;AAAA,EAAA,CACK;AAC5B,QAAM,MAAM;AACd;AAaa,MAAA,+BAA+B,CAC1C,qBAEA,OACG;AAAA,EACC,MAAM,8BAA8B,iBAAiB,IAAI;AAC3D,EACC,OAAO,CAAA,WAAU,cAAc,MAAM,CAAC;AAE9B,MAAA,gCAAgC,CAC3C,qBAEA,OACG;AAAA,EACC,MAAM,+BAA+B,iBAAiB,IAAI;AAC5D,EACC,OAAO,CAAA,WAAU,cAAc,MAAM,CAAC;AAGpC,MAAM,yBAAyB,CAAC,SAA4B,iBACjE,YAAY,SAAS,aAAa,EAC/B,IAAI,CAAA,MAAK,EAAE,KAAK,SAAS,YAAY,EACrC,UAAU,KAAK;"} {"version":3,"file":"messages.js","sources":["../../src/scripts/lib/messages.ts"],"sourcesContent":["import { pipe } from \"@mobily/ts-belt\";\nimport { Either } from \"purify-ts\";\nimport { parse, type ValiError } from \"valibot\";\n\nimport type {\n MessageMajBoutonPanier,\n MessageMajBoutonPanierDonnees,\n MessageMajContenuPanier,\n MessageMajContenuPanierDonnees,\n} from \"./types/messages\";\nimport type { ReponseSimplifiee } from \"./types/reseau\";\n\nimport { NOM_CANAL_BOUTON_PANIER, NOM_CANAL_CONTENU_PANIER, TYPES_MESSAGES } from \"../constantes/messages.ts\";\nimport { reporteErreur } from \"./erreurs.ts\";\nimport { WCErrorSchema } from \"./schemas/api/erreurs.ts\";\nimport { MessageMajBoutonPanierSchema, MessageMajContenuPanierSchema } from \"./schemas/messages.ts\";\nimport { eitherParse } from \"./validation.ts\";\n\nexport const canalPostMessage = (canal: BroadcastChannel, message: any): BroadcastChannel => {\n canal.postMessage(message);\n return canal;\n};\n\n// Émissions\nexport const emetMessageMajBoutonPanier = (args: MessageMajBoutonPanierDonnees): void => {\n const canal = new BroadcastChannel(NOM_CANAL_BOUTON_PANIER);\n canal.postMessage({\n donnees: {\n quantiteProduits: args.quantiteProduits,\n },\n type: TYPES_MESSAGES.MajBoutonPanier,\n } as MessageMajBoutonPanier);\n canal.close();\n};\n\nexport const emetMessageMajContenuPanier = (args: MessageMajContenuPanierDonnees): void => {\n const canal = new BroadcastChannel(NOM_CANAL_CONTENU_PANIER);\n canal.postMessage({\n donnees: {\n produits: args.produits,\n sousTotalProduits: args.sousTotalProduits,\n sousTotalReduction: args.sousTotalReduction,\n totalPanier: args.totalPanier,\n },\n type: TYPES_MESSAGES.MajContenuPanier,\n } as MessageMajContenuPanier);\n canal.close();\n};\n\n/**\n * Émet un unique message vers un BroadcastChannel (canal) généré sur le moment puis le ferme.\n *\n * @param nomCanal Le nom du BroadcastChannel pour lequel le message est émis.\n * @param message Le message émis.\n * @return void\n */\nexport const emetUniqueMessageCanal = <M>(nomCanal: string, message: M): void =>\n pipe(new BroadcastChannel(nomCanal), canal => canalPostMessage(canal, message), canal => canal.close());\n\n// Validations\nexport const valideMessageMajBoutonPanier = (\n evenementMessage: MessageEvent<unknown>,\n): Either<ValiError<typeof MessageMajBoutonPanierSchema>, MessageMajBoutonPanier> =>\n Either\n .of<ValiError<typeof MessageMajBoutonPanierSchema>, MessageMajBoutonPanier>(\n parse(MessageMajBoutonPanierSchema, evenementMessage.data),\n )\n .ifLeft(erreur => reporteErreur(erreur));\n\nexport const valideMessageMajContenuPanier = (\n evenementMessage: MessageEvent<unknown>,\n): Either<ValiError<typeof MessageMajContenuPanierSchema>, MessageMajContenuPanier> =>\n Either\n .of<ValiError<typeof MessageMajContenuPanierSchema>, MessageMajContenuPanier>(\n parse(MessageMajContenuPanierSchema, evenementMessage.data),\n )\n .ifLeft(erreur => reporteErreur(erreur));\n\n// Correspondances\nexport const reponseEstCodeErreurWC = (reponse: ReponseSimplifiee, codeErreurWC: string): boolean =>\n eitherParse(reponse, WCErrorSchema)\n .map(v => v.body.code === codeErreurWC)\n .orDefault(false);\n"],"names":[],"mappings":";;;;;;;;;;;;;AAwBa,MAAA,6BAA6B,CAAC,SAA8C;AACjF,QAAA,QAAQ,IAAI,iBAAiB,uBAAuB;AAC1D,QAAM,YAAY;AAAA,IAChB,SAAS;AAAA,MACP,kBAAkB,KAAK;AAAA,IACzB;AAAA,IACA,MAAM,eAAe;AAAA,EAAA,CACI;AAC3B,QAAM,MAAM;AACd;AAEa,MAAA,8BAA8B,CAAC,SAA+C;AACnF,QAAA,QAAQ,IAAI,iBAAiB,wBAAwB;AAC3D,QAAM,YAAY;AAAA,IAChB,SAAS;AAAA,MACP,UAAU,KAAK;AAAA,MACf,mBAAmB,KAAK;AAAA,MACxB,oBAAoB,KAAK;AAAA,MACzB,aAAa,KAAK;AAAA,IACpB;AAAA,IACA,MAAM,eAAe;AAAA,EAAA,CACK;AAC5B,QAAM,MAAM;AACd;AAaa,MAAA,+BAA+B,CAC1C,qBAEA,OACG;AAAA,EACC,MAAM,8BAA8B,iBAAiB,IAAI;AAC3D,EACC,OAAO,CAAA,WAAU,cAAc,MAAM,CAAC;AAE9B,MAAA,gCAAgC,CAC3C,qBAEA,OACG;AAAA,EACC,MAAM,+BAA+B,iBAAiB,IAAI;AAC5D,EACC,OAAO,CAAA,WAAU,cAAc,MAAM,CAAC;AAGpC,MAAM,yBAAyB,CAAC,SAA4B,iBACjE,YAAY,SAAS,aAAa,EAC/B,IAAI,CAAA,MAAK,EAAE,KAAK,SAAS,YAAY,EACrC,UAAU,KAAK;"}

View file

@ -15,7 +15,8 @@ const MessageMajBoutonPanierSchema = object({
}); });
const MessageMajContenuPanierDonneesSchema = object({ const MessageMajContenuPanierDonneesSchema = object({
produits: array(WCStoreCartItemSchema), produits: array(WCStoreCartItemSchema),
sousTotalPanier: number(), sousTotalProduits: number(),
sousTotalReduction: number(),
totalPanier: number() totalPanier: number()
}); });
const MessageMajContenuPanierSchema = object({ const MessageMajContenuPanierSchema = object({

View file

@ -1 +1 @@
{"version":3,"file":"messages2.js","sources":["../../src/scripts/lib/schemas/messages.ts"],"sourcesContent":["/**\n * Schémas des Messages passés avec BroadcastChannel.\n */\n\nimport * as v from \"valibot\";\n\nimport { TYPES_MESSAGES } from \"../../constantes/messages.ts\";\nimport { WCStoreCartItemSchema } from \"./api/cart.ts\";\n\nexport const TypesMessagesSchema = v.enum(TYPES_MESSAGES);\n\nexport const MessageMajBoutonPanierDonneesSchema = v.object({\n quantiteProduits: v.number(),\n});\n\nexport const MessageMajBoutonPanierSchema = v.object({\n donnees: MessageMajBoutonPanierDonneesSchema,\n type: v.pipe(v.string(), v.value(TYPES_MESSAGES.MajBoutonPanier)),\n});\n\nexport const MessageMajContenuPanierDonneesSchema = v.object({\n produits: v.array(WCStoreCartItemSchema),\n sousTotalPanier: v.number(),\n totalPanier: v.number(),\n});\n\nexport const MessageMajContenuPanierSchema = v.object({\n donnees: MessageMajContenuPanierDonneesSchema,\n type: v.pipe(v.string(), v.value(TYPES_MESSAGES.MajContenuPanier)),\n});\n"],"names":["v.enum","v.object","v.number","v.pipe","v.string","v.value","v.array"],"mappings":";;;;;;;AASmCA,MAAO,cAAc;AAE3C,MAAA,sCAAsCC,OAAS;AAAA,EAC1D,kBAAkBC,OAAS;AAC7B,CAAC;AAEY,MAAA,+BAA+BD,OAAS;AAAA,EACnD,SAAS;AAAA,EACT,MAAME,KAAOC,OAAE,GAAUC,MAAQ,eAAe,eAAe,CAAC;AAClE,CAAC;AAEY,MAAA,uCAAuCJ,OAAS;AAAA,EAC3D,UAAUK,MAAQ,qBAAqB;AAAA,EACvC,iBAAiBJ,OAAS;AAAA,EAC1B,aAAaA,OAAS;AACxB,CAAC;AAEY,MAAA,gCAAgCD,OAAS;AAAA,EACpD,SAAS;AAAA,EACT,MAAME,KAAOC,OAAE,GAAUC,MAAQ,eAAe,gBAAgB,CAAC;AACnE,CAAC;"} {"version":3,"file":"messages2.js","sources":["../../src/scripts/lib/schemas/messages.ts"],"sourcesContent":["/**\n * Schémas des Messages passés avec BroadcastChannel.\n */\n\nimport * as v from \"valibot\";\n\nimport { TYPES_MESSAGES } from \"../../constantes/messages.ts\";\nimport { WCStoreCartItemSchema } from \"./api/cart.ts\";\n\nexport const TypesMessagesSchema = v.enum(TYPES_MESSAGES);\n\nexport const MessageMajBoutonPanierDonneesSchema = v.object({\n quantiteProduits: v.number(),\n});\n\nexport const MessageMajBoutonPanierSchema = v.object({\n donnees: MessageMajBoutonPanierDonneesSchema,\n type: v.pipe(v.string(), v.value(TYPES_MESSAGES.MajBoutonPanier)),\n});\n\nexport const MessageMajContenuPanierDonneesSchema = v.object({\n produits: v.array(WCStoreCartItemSchema),\n sousTotalProduits: v.number(),\n sousTotalReduction: v.number(),\n totalPanier: v.number(),\n});\n\nexport const MessageMajContenuPanierSchema = v.object({\n donnees: MessageMajContenuPanierDonneesSchema,\n type: v.pipe(v.string(), v.value(TYPES_MESSAGES.MajContenuPanier)),\n});\n"],"names":["v.enum","v.object","v.number","v.pipe","v.string","v.value","v.array"],"mappings":";;;;;;;AASmCA,MAAO,cAAc;AAE3C,MAAA,sCAAsCC,OAAS;AAAA,EAC1D,kBAAkBC,OAAS;AAC7B,CAAC;AAEY,MAAA,+BAA+BD,OAAS;AAAA,EACnD,SAAS;AAAA,EACT,MAAME,KAAOC,OAAE,GAAUC,MAAQ,eAAe,eAAe,CAAC;AAClE,CAAC;AAEY,MAAA,uCAAuCJ,OAAS;AAAA,EAC3D,UAAUK,MAAQ,qBAAqB;AAAA,EACvC,mBAAmBJ,OAAS;AAAA,EAC5B,oBAAoBA,OAAS;AAAA,EAC7B,aAAaA,OAAS;AACxB,CAAC;AAEY,MAAA,gCAAgCD,OAAS;AAAA,EACpD,SAAS;AAAA,EACT,MAAME,KAAOC,OAAE,GAAUC,MAAQ,eAAe,gBAAgB,CAAC;AACnE,CAAC;"}

View file

@ -1,9 +1,10 @@
import { z, N } from "./index.CeK6pfoJ.js"; import { z, N } from "./index.CeK6pfoJ.js";
import { V as ValiError } from "./index.DxUTT09Y.js"; import { V as ValiError } from "./index.DxUTT09Y.js";
import { e as ROUTE_API_APPLIQUE_COUPON, f as ROUTE_API_RETIRE_COUPON } from "./api.js"; import { e as ROUTE_API_APPLIQUE_COUPON, f as ROUTE_API_RETIRE_COUPON } from "./api.js";
import { E as SELECTEUR_BOUTON_CODE_PROMO, F as SELECTEUR_CHAMP_CODE_PROMO, G as SELECTEUR_ENSEMBLE_CODE_PROMO, H as SELECTEUR_MESSAGE_CODE_PROMO, q as SELECTEUR_TOTAL_PANIER, I as SELECTEUR_TOTAL_REDUCTION, J as SELECTEUR_TOTAL_REDUCTION_VALEUR, D as ATTRIBUT_DESACTIVE, K as ATTRIBUT_CHARGEMENT, L as ATTRIBUT_CODE_PROMO_PRESENT, k as ATTRIBUT_HIDDEN } from "./dom.js"; import { F as SELECTEUR_BOUTON_CODE_PROMO, G as SELECTEUR_CHAMP_CODE_PROMO, H as SELECTEUR_ENSEMBLE_CODE_PROMO, I as SELECTEUR_MESSAGE_CODE_PROMO, q as SELECTEUR_TOTAL_PANIER, J as SELECTEUR_TOTAL_REDUCTION, v as SELECTEUR_TOTAL_REDUCTION_VALEUR, E as ATTRIBUT_DESACTIVE, K as ATTRIBUT_CHARGEMENT, L as ATTRIBUT_CODE_PROMO_PRESENT, k as ATTRIBUT_HIDDEN } from "./dom.js";
import { E as ERREUR_CODE_PROMO_INVALIDE } from "./erreurs.js"; import { E as ERREUR_CODE_PROMO_INVALIDE } from "./erreurs.js";
import { d as correspondCibleSelecteur, i as identity } from "./dom2.js"; import { l as lanceAnimationCycleTexte } from "./animations.js";
import { d as accorderCibleASelecteur, i as identity } from "./dom2.js";
import { S as ServerError } from "./erreurs2.js"; import { S as ServerError } from "./erreurs2.js";
import { E as ErreurCodePromoInvalide } from "./codes-promo.js"; import { E as ErreurCodePromoInvalide } from "./codes-promo.js";
import { e as estReponse500 } from "./gardes.js"; import { e as estReponse500 } from "./gardes.js";
@ -45,7 +46,7 @@ const initialiseElementsCodePromo = () => {
}).with( }).with(
{ {
cible: N.when( cible: N.when(
(cible) => correspondCibleSelecteur(cible, SELECTEUR_BOUTON_CODE_PROMO) (cible) => accorderCibleASelecteur(cible, SELECTEUR_BOUTON_CODE_PROMO)
), ),
codePromoPresent: false, codePromoPresent: false,
valeurCodePromo: N.string valeurCodePromo: N.string
@ -54,24 +55,16 @@ const initialiseElementsCodePromo = () => {
ELEMENTS.BOUTON_CODE_PROMO.setAttribute(ATTRIBUT_DESACTIVE, ""); ELEMENTS.BOUTON_CODE_PROMO.setAttribute(ATTRIBUT_DESACTIVE, "");
ELEMENTS.BOUTON_CODE_PROMO.setAttribute(ATTRIBUT_CHARGEMENT, ""); ELEMENTS.BOUTON_CODE_PROMO.setAttribute(ATTRIBUT_CHARGEMENT, "");
ELEMENTS.MESSAGE_CODE_PROMO.textContent = ""; ELEMENTS.MESSAGE_CODE_PROMO.textContent = "";
const animation = { const animation = lanceAnimationCycleTexte({
callback: () => { attribut: ATTRIBUT_CHARGEMENT,
if (!ELEMENTS.BOUTON_CODE_PROMO.hasAttribute(ATTRIBUT_CHARGEMENT)) { element: ELEMENTS.BOUTON_CODE_PROMO,
clearInterval(animation.interval);
return;
}
ELEMENTS.BOUTON_CODE_PROMO.textContent = animation.etapes.at(animation.index) ?? "Loading...";
animation.index = animation.index + 1 > animation.etapes.length - 1 ? 0 : animation.index + 1;
},
etapes: [ etapes: [
"Loading", "Loading",
"Loading.", "Loading.",
"Loading..", "Loading..",
"Loading..." "Loading..."
], ]
index: 0, });
interval: 0
};
animation.callback(); animation.callback();
animation.interval = setInterval(animation.callback, 500); animation.interval = setInterval(animation.callback, 500);
}).map( }).map(
@ -82,12 +75,11 @@ const initialiseElementsCodePromo = () => {
}) })
).chain( ).chain(
(reponse) => EitherAsync(async ({ throwE }) => { (reponse) => EitherAsync(async ({ throwE }) => {
if (estReponse500(reponse)) throwE(new ServerError("500 Server Error"));
const reponseSimplifiee = { const reponseSimplifiee = {
body: await reponse.json(), body: await reponse.json(),
status: reponse.status status: reponse.status
}; };
return z(reponseSimplifiee).with({ return z(reponseSimplifiee).with({ status: 500 }, () => throwE(new ServerError("500 Server Error"))).with({
body: N.when(() => reponseEstCodeErreurWC(reponseSimplifiee, ERREUR_CODE_PROMO_INVALIDE)), body: N.when(() => reponseEstCodeErreurWC(reponseSimplifiee, ERREUR_CODE_PROMO_INVALIDE)),
status: 400 status: 400
}, () => throwE(new ErreurCodePromoInvalide(recupereValeurCodePromo() ?? ""))).with({ status: 200 }, () => reponseSimplifiee.body).run(); }, () => throwE(new ErreurCodePromoInvalide(recupereValeurCodePromo() ?? ""))).with({ status: 200 }, () => reponseSimplifiee.body).run();
@ -107,14 +99,20 @@ const initialiseElementsCodePromo = () => {
z(erreur).with(N.instanceOf(ValiError), (e) => console.error("ValiError", e.issues)).with(N.instanceOf(ErreurCodePromoInvalide), (e) => { z(erreur).with(N.instanceOf(ValiError), (e) => console.error("ValiError", e.issues)).with(N.instanceOf(ErreurCodePromoInvalide), (e) => {
ELEMENTS.MESSAGE_CODE_PROMO.textContent = "This promo code does not exist."; ELEMENTS.MESSAGE_CODE_PROMO.textContent = "This promo code does not exist.";
console.error(e); console.error(e);
}).with(N.instanceOf(ServerError), (e) => console.error(e)).with(N.instanceOf(TypeError), (e) => console.error(e)).exhaustive(); }).with(N.instanceOf(ServerError), (e) => {
ELEMENTS.MESSAGE_CODE_PROMO.textContent = "Sorry, something went wrong! Please refresh the page and try again.";
console.error(e);
}).with(N.instanceOf(TypeError), (e) => {
ELEMENTS.MESSAGE_CODE_PROMO.textContent = "Sorry, something went wrong! Please refresh the page and try again.";
console.error(e);
}).exhaustive();
}).finally(() => { }).finally(() => {
ELEMENTS.BOUTON_CODE_PROMO.removeAttribute(ATTRIBUT_CHARGEMENT); ELEMENTS.BOUTON_CODE_PROMO.removeAttribute(ATTRIBUT_CHARGEMENT);
ELEMENTS.BOUTON_CODE_PROMO.removeAttribute(ATTRIBUT_DESACTIVE); ELEMENTS.BOUTON_CODE_PROMO.removeAttribute(ATTRIBUT_DESACTIVE);
}).run() }).run()
).with( ).with(
{ {
cible: N.when((cible) => correspondCibleSelecteur(cible, SELECTEUR_BOUTON_CODE_PROMO)), cible: N.when((cible) => accorderCibleASelecteur(cible, SELECTEUR_BOUTON_CODE_PROMO)),
codePromoPresent: true, codePromoPresent: true,
valeurCodePromo: N.string valeurCodePromo: N.string
}, },

File diff suppressed because one or more lines are too long

View file

@ -1,7 +1,7 @@
import { z } from "./index.CeK6pfoJ.js"; import { z } from "./index.CeK6pfoJ.js";
import { p as parse, V as ValiError } from "./index.DxUTT09Y.js"; import { p as parse, V as ValiError } from "./index.DxUTT09Y.js";
import { a as ROUTE_API_RETIRE_ARTICLE_PANIER, b as ROUTE_API_MAJ_ARTICLE_PANIER, c as ROUTE_API_MAJ_CLIENT, d as ROUTE_API_NOUVELLE_COMMANDES } from "./api.js"; import { a as ROUTE_API_RETIRE_ARTICLE_PANIER, b as ROUTE_API_MAJ_ARTICLE_PANIER, c as ROUTE_API_MAJ_CLIENT, d as ROUTE_API_NOUVELLE_COMMANDES } from "./api.js";
import { l as SELECTEUR_ENTREES_PANIER, m as SELECTEUR_CONTENEUR_PANIER, n as SELECTEUR_SOUS_TOTAL_PRODUITS, o as SELECTEUR_SOUS_TOTAL_LIVRAISON_COUT, p as SELECTEUR_SOUS_TOTAL_LIVRAISON_PRESTATAIRE, q as SELECTEUR_TOTAL_PANIER, r as SELECTEUR_BOUTON_SEPARATION_ADRESSES, s as SELECTEUR_FORMULAIRE_PANIER, t as SELECTEUR_FORMULAIRE_FACTURATION, u as SELECTEUR_BOUTON_ACTIONS_FORMULAIRE, v as SELECTEUR_INSTRUCTIONS_CLIENT, w as ATTRIBUT_CLE_PANIER, x as SELECTEUR_BOUTON_SOUSTRACTION_QUANTITE, y as SELECTEUR_CHAMP_QUANTITE_LIGNE_PANIER, z as SELECTEUR_BOUTON_ADDITION_QUANTITE, B as SELECTEUR_BOUTON_SUPPRESSION_PANIER, A as ATTRIBUT_CONTIENT_ARTICLES, C as SELECTEUR_PRIX_LIGNE_PANIER, k as ATTRIBUT_HIDDEN, D as ATTRIBUT_DESACTIVE } from "./dom.js"; import { l as SELECTEUR_ENTREES_PANIER, m as SELECTEUR_CONTENEUR_PANIER, n as SELECTEUR_SOUS_TOTAL_PRODUITS, o as SELECTEUR_SOUS_TOTAL_LIVRAISON_COUT, p as SELECTEUR_SOUS_TOTAL_LIVRAISON_PRESTATAIRE, q as SELECTEUR_TOTAL_PANIER, r as SELECTEUR_BOUTON_SEPARATION_ADRESSES, s as SELECTEUR_FORMULAIRE_PANIER, t as SELECTEUR_FORMULAIRE_FACTURATION, u as SELECTEUR_BOUTON_ACTIONS_FORMULAIRE, v as SELECTEUR_TOTAL_REDUCTION_VALEUR, w as SELECTEUR_INSTRUCTIONS_CLIENT, x as ATTRIBUT_CLE_PANIER, y as SELECTEUR_BOUTON_SOUSTRACTION_QUANTITE, z as SELECTEUR_CHAMP_QUANTITE_LIGNE_PANIER, B as SELECTEUR_BOUTON_ADDITION_QUANTITE, C as SELECTEUR_BOUTON_SUPPRESSION_PANIER, A as ATTRIBUT_CONTIENT_ARTICLES, D as SELECTEUR_PRIX_LIGNE_PANIER, k as ATTRIBUT_HIDDEN, E as ATTRIBUT_DESACTIVE } from "./dom.js";
import { N as NOM_CANAL_BOUTON_PANIER, a as NOM_CANAL_CONTENU_PANIER } from "./messages3.js"; import { N as NOM_CANAL_BOUTON_PANIER, a as NOM_CANAL_CONTENU_PANIER } from "./messages3.js";
import { r as recupereElementOuLeve, a as recupereElementsAvecSelecteur, e as eitherSessionStorageGet, b as eitherJsonParse, c as recupereElementAvecSelecteur } from "./dom2.js"; import { r as recupereElementOuLeve, a as recupereElementsAvecSelecteur, e as eitherSessionStorageGet, b as eitherJsonParse, c as recupereElementAvecSelecteur } from "./dom2.js";
import { l as leveServerError, r as reporteErreur, a as leveErreur } from "./erreurs2.js"; import { l as leveServerError, r as reporteErreur, a as leveErreur } from "./erreurs2.js";
@ -28,6 +28,7 @@ import "./cart2.js";
import "./cart-coupons.js"; import "./cart-coupons.js";
import "./orders3.js"; import "./orders3.js";
import "./erreurs.js"; import "./erreurs.js";
import "./animations.js";
import "./codes-promo.js"; import "./codes-promo.js";
import "./cart-apply-coupon.js"; import "./cart-apply-coupon.js";
import "./cart-remove-coupon.js"; import "./cart-remove-coupon.js";
@ -53,6 +54,9 @@ const SOUS_TOTAL_LIVRAISON_PRESTATAIRE = pipe(
recupereElementDocumentEither(SELECTEUR_SOUS_TOTAL_LIVRAISON_PRESTATAIRE), recupereElementDocumentEither(SELECTEUR_SOUS_TOTAL_LIVRAISON_PRESTATAIRE),
recupereElementOuLeve recupereElementOuLeve
); );
const SOUS_TOTAL_REDUCTION = recupereElementDansDocumentOuLeve(
SELECTEUR_TOTAL_REDUCTION_VALEUR
);
const INSTRUCTIONS_CLIENT = recupereElementDansDocumentOuLeve( const INSTRUCTIONS_CLIENT = recupereElementDansDocumentOuLeve(
SELECTEUR_INSTRUCTIONS_CLIENT SELECTEUR_INSTRUCTIONS_CLIENT
); );
@ -138,7 +142,8 @@ const initialiseMajEntreesPanier = () => {
emetMessageMajBoutonPanier({ quantiteProduits: panier.items_count }); emetMessageMajBoutonPanier({ quantiteProduits: panier.items_count });
emetMessageMajContenuPanier({ emetMessageMajContenuPanier({
produits: panier.items, produits: panier.items,
sousTotalPanier: Number(panier.totals.total_items) / 100, sousTotalProduits: Number(panier.totals.total_items) / 100,
sousTotalReduction: Number(panier.totals.total_discount) / 100,
totalPanier: Number(panier.totals.total_price) / 100 totalPanier: Number(panier.totals.total_price) / 100
}); });
entree.remove(); entree.remove();
@ -178,7 +183,8 @@ const initialiseMajEntreesPanier = () => {
emetMessageMajBoutonPanier({ quantiteProduits: panier.items_count }); emetMessageMajBoutonPanier({ quantiteProduits: panier.items_count });
emetMessageMajContenuPanier({ emetMessageMajContenuPanier({
produits: panier.items, produits: panier.items,
sousTotalPanier: Number(panier.totals.total_items) / 100, sousTotalProduits: Number(panier.totals.total_items) / 100,
sousTotalReduction: Number(panier.totals.total_discount) / 100,
totalPanier: Number(panier.totals.total_price) / 100 totalPanier: Number(panier.totals.total_price) / 100
}); });
}) })
@ -218,7 +224,8 @@ const initialiseMajEntreesPanier = () => {
emetMessageMajBoutonPanier({ quantiteProduits: panier.items_count }); emetMessageMajBoutonPanier({ quantiteProduits: panier.items_count });
emetMessageMajContenuPanier({ emetMessageMajContenuPanier({
produits: panier.items, produits: panier.items,
sousTotalPanier: Number(panier.totals.total_items) / 100, sousTotalProduits: Number(panier.totals.total_items) / 100,
sousTotalReduction: Number(panier.totals.total_discount) / 100,
totalPanier: Number(panier.totals.total_price) / 100 totalPanier: Number(panier.totals.total_price) / 100
}); });
}) })
@ -260,7 +267,8 @@ const initialiseMajContenuPanier = () => {
champQuantite.setAttribute("value", String(ligne.quantity)); champQuantite.setAttribute("value", String(ligne.quantity));
majEtatsActivationBoutons(entrees); majEtatsActivationBoutons(entrees);
}); });
SOUS_TOTAL_PRODUITS.textContent = `${String(donnees.sousTotalPanier)}`; SOUS_TOTAL_REDUCTION.textContent = `-${String(donnees.sousTotalReduction)}`;
SOUS_TOTAL_PRODUITS.textContent = `${String(donnees.sousTotalProduits)}`;
TOTAL_PANIER.textContent = `${String(donnees.totalPanier)}`; TOTAL_PANIER.textContent = `${String(donnees.totalPanier)}`;
}); });
}); });

File diff suppressed because one or more lines are too long

View file

@ -1,6 +1,6 @@
import { z } from "./index.CeK6pfoJ.js"; import { z } from "./index.CeK6pfoJ.js";
import { g as ROUTE_API_AJOUTE_ARTICLE_PANIER, E as ENTETE_WC_NONCE } from "./api.js"; import { g as ROUTE_API_AJOUTE_ARTICLE_PANIER, E as ENTETE_WC_NONCE } from "./api.js";
import { M as SELECTEUR_BOUTON_AJOUT_PANIER, N as SELECTEUR_SELECTEUR_QUANTITE, O as SELECTEUR_LIENS_ONGLETS, P as SELECTEUR_SECTIONS_CONTENUS, Q as SELECTEUR_PRIX_PRODUIT, R as SELECTEUR_CONTENEUR_FLECHES_DEFILEMENT, T as SELECTEUR_FLECHE_DEFILEMENT_GAUCHE, U as SELECTEUR_FLECHE_DEFILEMENT_DROITE, V as SELECTEUR_PHOTOS_PRODUIT, W as SELECTEUR_IMAGE_COLONNE_GAUCHE, X as SELECTEUR_IMAGES_COLONNE_DROITE, Y as ATTRIBUT_INDEX_IMAGE_ACTIVE, Z as ATTRIBUT_ARIA_SELECTED, k as ATTRIBUT_HIDDEN, D as ATTRIBUT_DESACTIVE, _ as ATTRIBUT_PRIX } from "./dom.js"; import { M as SELECTEUR_BOUTON_AJOUT_PANIER, N as SELECTEUR_SELECTEUR_QUANTITE, O as SELECTEUR_LIENS_ONGLETS, P as SELECTEUR_SECTIONS_CONTENUS, Q as SELECTEUR_PRIX_PRODUIT, R as SELECTEUR_CONTENEUR_FLECHES_DEFILEMENT, T as SELECTEUR_FLECHE_DEFILEMENT_GAUCHE, U as SELECTEUR_FLECHE_DEFILEMENT_DROITE, V as SELECTEUR_PHOTOS_PRODUIT, W as SELECTEUR_IMAGE_COLONNE_GAUCHE, X as SELECTEUR_IMAGES_COLONNE_DROITE, Y as ATTRIBUT_INDEX_IMAGE_ACTIVE, Z as ATTRIBUT_ARIA_SELECTED, k as ATTRIBUT_HIDDEN, E as ATTRIBUT_DESACTIVE, _ as ATTRIBUT_PRIX } from "./dom.js";
import { r as recupereElementOuLeve, f as recupereElementsOuLeve, R as Ra } from "./dom2.js"; import { r as recupereElementOuLeve, f as recupereElementsOuLeve, R as Ra } from "./dom2.js";
import { l as leveServerError, r as reporteErreur } from "./erreurs2.js"; import { l as leveServerError, r as reporteErreur } from "./erreurs2.js";
import { b as estHTMLSelectElement, e as estReponse500, a as estError } from "./gardes.js"; import { b as estHTMLSelectElement, e as estReponse500, a as estError } from "./gardes.js";

View file

@ -31,15 +31,30 @@ if (!$possede_session_wc) {
return; return;
} }
/** @var bool $est_panier__vide */
$est_panier_vide = WC()->cart->is_empty();
// Redirige à la page d'accueil si le Panier est vide // Redirige à la page d'accueil si le Panier est vide
if ($est_panier_vide) { if (WC()->cart->is_empty()) {
header("Location: $url_accueil"); header("Location: $url_accueil");
return; return;
} }
// Vérifie que les paramètres d'URLs nécessaires soient présents
/** @var string $order_id */
$order_id = $_GET["order_id"];
if (!$order_id) {
$reponse = ["succes" => false, "status" => "order_key is missing"];
echo json_encode($reponse);
http_response_code(400);
return;
}
/** @var string $order_key */
$order_key = $_GET["order_key"];
if (!$order_key) {
$reponse = ["succes" => false, "status" => "order_key is missing"];
echo json_encode($reponse);
http_response_code(400);
return;
}
// Récupère le Panier et l'Email du Client // Récupère le Panier et l'Email du Client
/** @var WC_Cart $panier */ /** @var WC_Cart $panier */
$panier = WC()->cart; $panier = WC()->cart;
@ -49,7 +64,6 @@ $email_client = WC()->session->get("customer")["email"];
$articles = []; $articles = [];
// TODO: Cas des Produits Simples : Pas de Attribute Summary ! // TODO: Cas des Produits Simples : Pas de Attribute Summary !
foreach ($panier->get_cart() as $cle_panier => $article_panier) { foreach ($panier->get_cart() as $cle_panier => $article_panier) {
$titre_produit = $article_panier["data"]?->get_title(); $titre_produit = $article_panier["data"]?->get_title();
$est_variation = $article_panier["variation_id"] !== null; $est_variation = $article_panier["variation_id"] !== null;
@ -69,40 +83,47 @@ foreach ($panier->get_cart() as $cle_panier => $article_panier) {
]); ]);
} }
/** @var string $order_id */ // Récupère la Commande et la Méthode de Livraison
$order_id = $_GET["order_id"]; /** @var WC_Order $commande */
if (!$order_id) { $commande = wc_get_order($order_id);
$reponse = ["succes" => false, "status" => "order_key is missing"];
echo json_encode($reponse);
http_response_code(400);
return;
}
/** @var string $order_key */
$order_key = $_GET["order_key"];
if (!$order_key) {
$reponse = ["succes" => false, "status" => "order_key is missing"];
echo json_encode($reponse);
http_response_code(400);
return;
}
/** @var WC_Order $order */
$order = wc_get_order($order_id);
/** @var mixed $methode_livraison */ /** @var mixed $methode_livraison */
$methode_livraison = [ $methode_livraison = [
"nom" => $order->get_shipping_method(), "nom" => $commande->get_shipping_method(),
"cout" => $order->get_shipping_total(), "cout" => $commande->get_shipping_total(),
]; ];
// Sélectionne la clé API Stripe // Sélectionne la clé API Stripe
\Stripe\Stripe::setApiKey(Config::get("STRIPE_API_SECRET")); \Stripe\Stripe::setApiKey(Config::get("STRIPE_API_SECRET"));
// Met à jour les Codes promos
$coupons_stripe = collect(\Stripe\Coupon::all()->data);
$coupons_wc = collect(WC()->cart->get_coupons())
->map(function (WC_Coupon $coupon) {
return [
"duration" => "forever",
"id" => $coupon->get_code(),
"name" => $coupon->get_code(),
$coupon->get_discount_type() == "fixed_cart" ? "amount_off" : "percent_off" => $coupon->get_amount(),
];
})
->each(function (array $item) use ($coupons_stripe) {
// Si le code promo n'existe, le créé
if (!$coupons_stripe->contains("name", $item["name"])) {
\Stripe\Coupon::create($item);
}
});
$reductions_stripe = $coupons_wc
->map(function (array $coupon) {
return ["coupon" => $coupon["name"]];
})
->values()
->toArray();
/** @var Session $session_checkout_stripe */ /** @var Session $session_checkout_stripe */
$session_checkout_stripe = \Stripe\Checkout\Session::create( $session_checkout_stripe = \Stripe\Checkout\Session::create(
[ [
"cancel_url" => "$url_accueil", "cancel_url" => "$url_accueil",
"customer_email" => $email_client, "customer_email" => $email_client,
"discounts" => $reductions_stripe,
"line_items" => $articles, "line_items" => $articles,
"mode" => "payment", "mode" => "payment",
"success_url" => "$url_succes_commande?session_id={CHECKOUT_SESSION_ID}", "success_url" => "$url_succes_commande?session_id={CHECKOUT_SESSION_ID}",
@ -131,5 +152,6 @@ $session_checkout_stripe = \Stripe\Checkout\Session::create(
// echo json_encode($session_checkout_stripe); // echo json_encode($session_checkout_stripe);
header("HTTP/1.1 303 See Other"); header("HTTP/1.1 303 See Other");
header("Location: " . $session_checkout_stripe->url); header("Location: " . $session_checkout_stripe->url);
// contact@gcch.fr
exit(); exit();

View file

@ -92,7 +92,8 @@
border: initial; border: initial;
border-top: 1px solid var(--couleur-noir); border-top: 1px solid var(--couleur-noir);
&::-webkit-outer-spin-button, &::-webkit-inner-spin-button { &::-webkit-outer-spin-button,
&::-webkit-inner-spin-button {
margin: 0; /* 2 */ margin: 0; /* 2 */
appearance: none; /* 2 */ appearance: none; /* 2 */
} }
@ -150,10 +151,6 @@
place-content: center; place-content: center;
margin: auto; margin: auto;
input {
width: 20rem;
}
/* /*
* 1. Longueur minimale pour le Bouton n'ait pas à changer de taille quel que soit son texte * 1. Longueur minimale pour le Bouton n'ait pas à changer de taille quel que soit son texte
*/ */

View file

@ -0,0 +1,44 @@
/** Fonctions pour la création de simples animations JavaScript. */
// Types
interface AnimationCycleTexte {
callback: () => void;
etapes: Array<string>;
index: number;
interval: NodeJS.Timeout;
}
interface ParametresAnimationCycleTexte {
attribut: string;
element: HTMLElement;
etapes: Array<string>;
}
/**
* Créer le nécessaire pour une animation s'exécutant jusqu'à ce que un interval soit manuellement arrêté. L'animation
* consiste en la mise à jour d'un texte avec l'utilisation de toutes les valeurs d'un tableau, une par une.
*
* @param args Les paramètres nécessaires pour la création de l'animation.
* @returns Un objet contenant les informations de l'animation, notamment l'interval utilisable pour son arrêt.
*/
export const lanceAnimationCycleTexte = (args: ParametresAnimationCycleTexte): AnimationCycleTexte => {
const animation: AnimationCycleTexte = {
callback: (): void => {
// Arrête le cycle quand l'Attribut de chargement n'est plus présent
if (!args.element.hasAttribute(args.attribut)) {
clearInterval(animation.interval);
return;
}
// Change le texte
args.element.textContent = animation.etapes.at(animation.index) ?? "Loading...";
// Incrémente ou réinitialise l'index
animation.index = animation.index + 1 > animation.etapes.length - 1 ? 0 : animation.index + 1;
},
etapes: args.etapes,
index: 0,
interval: setInterval(() => {}, 2147483647),
};
return animation;
};

View file

@ -129,7 +129,7 @@ export const eitherJsonParse = (chaine: string): Either<SyntaxError, JSONValue>
Either.encase(() => JSON.parse(chaine)); Either.encase(() => JSON.parse(chaine));
/** TODO */ /** TODO */
export const correspondCibleSelecteur = <E extends HTMLElement = HTMLElement>( export const accorderCibleASelecteur = <E extends HTMLElement = HTMLElement>(
cible: EventTarget | null, cible: EventTarget | null,
selecteur: string, selecteur: string,
): cible is E => cible !== null && (cible as HTMLElement).matches(selecteur); ): cible is E => cible !== null && (cible as HTMLElement).matches(selecteur);

View file

@ -8,12 +8,12 @@ import type {
MessageMajContenuPanier, MessageMajContenuPanier,
MessageMajContenuPanierDonnees, MessageMajContenuPanierDonnees,
} from "./types/messages"; } from "./types/messages";
import type { ReponseSimplifiee } from "./types/reseau";
import { NOM_CANAL_BOUTON_PANIER, NOM_CANAL_CONTENU_PANIER, TYPES_MESSAGES } from "../constantes/messages.ts"; import { NOM_CANAL_BOUTON_PANIER, NOM_CANAL_CONTENU_PANIER, TYPES_MESSAGES } from "../constantes/messages.ts";
import { reporteErreur } from "./erreurs.ts"; import { reporteErreur } from "./erreurs.ts";
import { WCErrorSchema } from "./schemas/api/erreurs.ts"; import { WCErrorSchema } from "./schemas/api/erreurs.ts";
import { MessageMajBoutonPanierSchema, MessageMajContenuPanierSchema } from "./schemas/messages.ts"; import { MessageMajBoutonPanierSchema, MessageMajContenuPanierSchema } from "./schemas/messages.ts";
import { ReponseSimplifiee } from "./types/reseau";
import { eitherParse } from "./validation.ts"; import { eitherParse } from "./validation.ts";
export const canalPostMessage = (canal: BroadcastChannel, message: any): BroadcastChannel => { export const canalPostMessage = (canal: BroadcastChannel, message: any): BroadcastChannel => {
@ -38,7 +38,8 @@ export const emetMessageMajContenuPanier = (args: MessageMajContenuPanierDonnees
canal.postMessage({ canal.postMessage({
donnees: { donnees: {
produits: args.produits, produits: args.produits,
sousTotalPanier: args.sousTotalPanier, sousTotalProduits: args.sousTotalProduits,
sousTotalReduction: args.sousTotalReduction,
totalPanier: args.totalPanier, totalPanier: args.totalPanier,
}, },
type: TYPES_MESSAGES.MajContenuPanier, type: TYPES_MESSAGES.MajContenuPanier,

View file

@ -20,7 +20,8 @@ export const MessageMajBoutonPanierSchema = v.object({
export const MessageMajContenuPanierDonneesSchema = v.object({ export const MessageMajContenuPanierDonneesSchema = v.object({
produits: v.array(WCStoreCartItemSchema), produits: v.array(WCStoreCartItemSchema),
sousTotalPanier: v.number(), sousTotalProduits: v.number(),
sousTotalReduction: v.number(),
totalPanier: v.number(), totalPanier: v.number(),
}); });

View file

@ -27,7 +27,8 @@ import {
SELECTEUR_TOTAL_REDUCTION_VALEUR, SELECTEUR_TOTAL_REDUCTION_VALEUR,
} from "./constantes/dom"; } from "./constantes/dom";
import { ERREUR_CODE_PROMO_INVALIDE } from "./constantes/erreurs"; import { ERREUR_CODE_PROMO_INVALIDE } from "./constantes/erreurs";
import { correspondCibleSelecteur } from "./lib/dom"; import { lanceAnimationCycleTexte } from "./lib/animations";
import { accorderCibleASelecteur } from "./lib/dom";
import { ServerError } from "./lib/erreurs"; import { ServerError } from "./lib/erreurs";
import { ErreurCodePromoInvalide } from "./lib/erreurs/codes-promo"; import { ErreurCodePromoInvalide } from "./lib/erreurs/codes-promo";
import { estReponse500 } from "./lib/gardes"; import { estReponse500 } from "./lib/gardes";
@ -45,7 +46,6 @@ type EtatsPage = {
/** Un nonce pour l'authentification de requêtes API vers le backend WooCommerce. */ /** Un nonce pour l'authentification de requêtes API vers le backend WooCommerce. */
nonce: string; nonce: string;
}; };
// @ts-expect-error -- États injectés par le modèle PHP // @ts-expect-error -- États injectés par le modèle PHP
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- États injectés par le modèle PHP // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- États injectés par le modèle PHP
const ETATS_PAGE: EtatsPage = _etats; const ETATS_PAGE: EtatsPage = _etats;
@ -61,7 +61,6 @@ const ELEMENTS = {
}; };
export const initialiseElementsCodePromo = (): void => { export const initialiseElementsCodePromo = (): void => {
// Récupère le code promo s'il existe
const recupereValeurCodePromo = (): null | string => const recupereValeurCodePromo = (): null | string =>
Maybe.fromFalsy(ELEMENTS.CHAMP_CODE_PROMO.value.trim()).extractNullable(); Maybe.fromFalsy(ELEMENTS.CHAMP_CODE_PROMO.value.trim()).extractNullable();
const recuperePresenceCodePromo = (): boolean => const recuperePresenceCodePromo = (): boolean =>
@ -75,44 +74,37 @@ export const initialiseElementsCodePromo = (): void => {
valeurCodePromo: recupereValeurCodePromo(), valeurCodePromo: recupereValeurCodePromo(),
}) })
// Un code promo doit être ajouté // Un code promo doit être ajouté
// Aucun code promo n'est déjà présent et une valeur acceptable existe
.with( .with(
{ {
cible: P.when((cible: EventTarget | null) => cible: P.when((cible: EventTarget | null) =>
correspondCibleSelecteur<HTMLButtonElement>(cible, SELECTEUR_BOUTON_CODE_PROMO) accorderCibleASelecteur<HTMLButtonElement>(cible, SELECTEUR_BOUTON_CODE_PROMO)
), ),
codePromoPresent: false, codePromoPresent: false,
valeurCodePromo: P.string, valeurCodePromo: P.string,
}, },
({ valeurCodePromo }) => ({ valeurCodePromo }) =>
void EitherAsync void EitherAsync
// Vérifie le Schéma des arguments
.liftEither(eitherParse({ code: valeurCodePromo }, WCStoreCartApplyCouponArgsSchema)) .liftEither(eitherParse({ code: valeurCodePromo }, WCStoreCartApplyCouponArgsSchema))
.ifRight(() => { .ifRight(() => {
// Désactive le Bouton pour empêcher des requêtes concurrentes // Désactive le Bouton pour empêcher des requêtes concurrentes
ELEMENTS.BOUTON_CODE_PROMO.setAttribute(ATTRIBUT_DESACTIVE, ""); ELEMENTS.BOUTON_CODE_PROMO.setAttribute(ATTRIBUT_DESACTIVE, "");
ELEMENTS.BOUTON_CODE_PROMO.setAttribute(ATTRIBUT_CHARGEMENT, ""); ELEMENTS.BOUTON_CODE_PROMO.setAttribute(ATTRIBUT_CHARGEMENT, "");
// Réinitialise le Message à l'Utilisateur
ELEMENTS.MESSAGE_CODE_PROMO.textContent = ""; ELEMENTS.MESSAGE_CODE_PROMO.textContent = "";
// Lance un cycle d'animation sur le texte de chargement // Lance un cycle d'animation sur le texte de chargement
const animation = { const animation = lanceAnimationCycleTexte({
callback: () => { attribut: ATTRIBUT_CHARGEMENT,
if (!ELEMENTS.BOUTON_CODE_PROMO.hasAttribute(ATTRIBUT_CHARGEMENT)) { element: ELEMENTS.BOUTON_CODE_PROMO,
clearInterval(animation.interval);
return;
}
ELEMENTS.BOUTON_CODE_PROMO.textContent = animation.etapes.at(animation.index)
?? "Loading...";
animation.index = animation.index + 1 > animation.etapes.length - 1 ? 0 : animation.index + 1;
},
etapes: [ etapes: [
"Loading", "Loading",
"Loading.", "Loading.",
"Loading..", "Loading..",
"Loading...", "Loading...",
], ],
index: 0, });
interval: 0,
};
animation.callback(); animation.callback();
animation.interval = setInterval(animation.callback, 500); animation.interval = setInterval(animation.callback, 500);
}) })
@ -127,14 +119,13 @@ export const initialiseElementsCodePromo = (): void => {
// Traite les cas d'Erreur // Traite les cas d'Erreur
.chain((reponse: Response) => .chain((reponse: Response) =>
EitherAsync<ErreurCodePromoInvalide | ServerError, unknown>(async ({ throwE }) => { EitherAsync<ErreurCodePromoInvalide | ServerError, unknown>(async ({ throwE }) => {
if (estReponse500(reponse)) throwE(new ServerError("500 Server Error"));
const reponseSimplifiee: ReponseSimplifiee = { const reponseSimplifiee: ReponseSimplifiee = {
body: await reponse.json(), body: await reponse.json(),
status: reponse.status, status: reponse.status,
}; };
return match(reponseSimplifiee) return match(reponseSimplifiee)
.with({ status: 500 }, () => throwE(new ServerError("500 Server Error")))
.with({ .with({
body: P.when(() => reponseEstCodeErreurWC(reponseSimplifiee, ERREUR_CODE_PROMO_INVALIDE)), body: P.when(() => reponseEstCodeErreurWC(reponseSimplifiee, ERREUR_CODE_PROMO_INVALIDE)),
status: 400, status: 400,
@ -162,14 +153,24 @@ export const initialiseElementsCodePromo = (): void => {
.ifLeft(erreur => { .ifLeft(erreur => {
// Rétablis le texte d'origine // Rétablis le texte d'origine
ELEMENTS.BOUTON_CODE_PROMO.textContent = "Apply"; ELEMENTS.BOUTON_CODE_PROMO.textContent = "Apply";
// Traite les Erreurs et affiche un Message à l'Utilisateur
match(erreur) match(erreur)
.with(P.instanceOf(ValiError), e => console.error("ValiError", e.issues)) .with(P.instanceOf(ValiError), e => console.error("ValiError", e.issues))
.with(P.instanceOf(ErreurCodePromoInvalide), e => { .with(P.instanceOf(ErreurCodePromoInvalide), e => {
ELEMENTS.MESSAGE_CODE_PROMO.textContent = "This promo code does not exist."; ELEMENTS.MESSAGE_CODE_PROMO.textContent = "This promo code does not exist.";
console.error(e); console.error(e);
}) })
.with(P.instanceOf(ServerError), e => console.error(e)) .with(P.instanceOf(ServerError), e => {
.with(P.instanceOf(TypeError), e => console.error(e)) ELEMENTS.MESSAGE_CODE_PROMO.textContent =
"Sorry, something went wrong! Please refresh the page and try again.";
console.error(e);
})
.with(P.instanceOf(TypeError), e => {
ELEMENTS.MESSAGE_CODE_PROMO.textContent =
"Sorry, something went wrong! Please refresh the page and try again.";
console.error(e);
})
.exhaustive(); .exhaustive();
}) })
.finally(() => { .finally(() => {
@ -180,9 +181,10 @@ export const initialiseElementsCodePromo = (): void => {
.run(), .run(),
) )
// Un code promo doit être retiré // Un code promo doit être retiré
// Un code promo est présent sous forme de chaîne
.with( .with(
{ {
cible: P.when(cible => correspondCibleSelecteur<HTMLButtonElement>(cible, SELECTEUR_BOUTON_CODE_PROMO)), cible: P.when(cible => accorderCibleASelecteur<HTMLButtonElement>(cible, SELECTEUR_BOUTON_CODE_PROMO)),
codePromoPresent: true, codePromoPresent: true,
valeurCodePromo: P.string, valeurCodePromo: P.string,
}, },

View file

@ -38,6 +38,7 @@ import {
SELECTEUR_SOUS_TOTAL_LIVRAISON_PRESTATAIRE, SELECTEUR_SOUS_TOTAL_LIVRAISON_PRESTATAIRE,
SELECTEUR_SOUS_TOTAL_PRODUITS, SELECTEUR_SOUS_TOTAL_PRODUITS,
SELECTEUR_TOTAL_PANIER, SELECTEUR_TOTAL_PANIER,
SELECTEUR_TOTAL_REDUCTION_VALEUR,
} from "./constantes/dom.ts"; } from "./constantes/dom.ts";
import { NOM_CANAL_BOUTON_PANIER, NOM_CANAL_CONTENU_PANIER } from "./constantes/messages.ts"; import { NOM_CANAL_BOUTON_PANIER, NOM_CANAL_CONTENU_PANIER } from "./constantes/messages.ts";
import { import {
@ -109,6 +110,9 @@ const SOUS_TOTAL_LIVRAISON_PRESTATAIRE: HTMLSpanElement = pipe(
recupereElementDocumentEither<HTMLSpanElement>(SELECTEUR_SOUS_TOTAL_LIVRAISON_PRESTATAIRE), recupereElementDocumentEither<HTMLSpanElement>(SELECTEUR_SOUS_TOTAL_LIVRAISON_PRESTATAIRE),
recupereElementOuLeve, recupereElementOuLeve,
); );
const SOUS_TOTAL_REDUCTION: HTMLSpanElement = recupereElementDansDocumentOuLeve<HTMLSpanElement>(
SELECTEUR_TOTAL_REDUCTION_VALEUR,
);
const INSTRUCTIONS_CLIENT: HTMLTextAreaElement = recupereElementDansDocumentOuLeve( const INSTRUCTIONS_CLIENT: HTMLTextAreaElement = recupereElementDansDocumentOuLeve(
SELECTEUR_INSTRUCTIONS_CLIENT, SELECTEUR_INSTRUCTIONS_CLIENT,
); );
@ -238,7 +242,8 @@ const initialiseMajEntreesPanier = (): void => {
// Émet un Message avec le nouveau contenu du Panier // Émet un Message avec le nouveau contenu du Panier
emetMessageMajContenuPanier({ emetMessageMajContenuPanier({
produits: panier.items, produits: panier.items,
sousTotalPanier: Number(panier.totals.total_items) / 100, sousTotalProduits: Number(panier.totals.total_items) / 100,
sousTotalReduction: Number(panier.totals.total_discount) / 100,
totalPanier: Number(panier.totals.total_price) / 100, totalPanier: Number(panier.totals.total_price) / 100,
}); });
// Retire l'entrée du Panier du DOM // Retire l'entrée du Panier du DOM
@ -297,7 +302,8 @@ const initialiseMajEntreesPanier = (): void => {
// Émet un Message avec le nouveau contenu du Panier // Émet un Message avec le nouveau contenu du Panier
emetMessageMajContenuPanier({ emetMessageMajContenuPanier({
produits: panier.items, produits: panier.items,
sousTotalPanier: Number(panier.totals.total_items) / 100, sousTotalProduits: Number(panier.totals.total_items) / 100,
sousTotalReduction: Number(panier.totals.total_discount) / 100,
totalPanier: Number(panier.totals.total_price) / 100, totalPanier: Number(panier.totals.total_price) / 100,
}); });
}), }),
@ -353,7 +359,8 @@ const initialiseMajEntreesPanier = (): void => {
// Émet un Message avec le nouveau contenu du Panier // Émet un Message avec le nouveau contenu du Panier
emetMessageMajContenuPanier({ emetMessageMajContenuPanier({
produits: panier.items, produits: panier.items,
sousTotalPanier: Number(panier.totals.total_items) / 100, sousTotalProduits: Number(panier.totals.total_items) / 100,
sousTotalReduction: Number(panier.totals.total_discount) / 100,
totalPanier: Number(panier.totals.total_price) / 100, totalPanier: Number(panier.totals.total_price) / 100,
}); });
}), }),
@ -418,7 +425,8 @@ const initialiseMajContenuPanier = (): void => {
}); });
// Met à jour les totaux du Panier // Met à jour les totaux du Panier
SOUS_TOTAL_PRODUITS.textContent = `${String(donnees.sousTotalPanier)}`; SOUS_TOTAL_REDUCTION.textContent = `-${String(donnees.sousTotalReduction)}`;
SOUS_TOTAL_PRODUITS.textContent = `${String(donnees.sousTotalProduits)}`;
TOTAL_PANIER.textContent = `${String(donnees.totalPanier)}`; TOTAL_PANIER.textContent = `${String(donnees.totalPanier)}`;
}); });
}); });

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 716 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 659 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 545 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 600 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 452 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Before After
Before After